Re: [PATCH 1/21] [POWERPC] Reworking machine check handling and Fix 440/440A
On Sun, 23 Dec 2007 19:32:10 -0600 Josh Boyer <[EMAIL PROTECTED]> wrote: > On Fri, 21 Dec 2007 15:39:21 +1100 > Benjamin Herrenschmidt <[EMAIL PROTECTED]> wrote: > > > Index: linux-merge/arch/powerpc/kernel/traps.c > > === > > --- linux-merge.orig/arch/powerpc/kernel/traps.c2007-12-20 > > 11:34:43.0 +1100 > > +++ linux-merge/arch/powerpc/kernel/traps.c 2007-12-20 11:35:40.0 > > +1100 > > [snip] > > > -#elif defined (CONFIG_E500) > > + return 0; > > +} > > +#elif defined(CONFIG_E500) > > +int machine_check_e500(struct pt_regs *regs) > > This... > > > +{ > > + unsigned long reason = get_mc_reason(regs); > > + > > printk("Machine check in kernel mode.\n"); > > printk("Caused by (from MCSR=%lx): ", reason); > > > > @@ -403,7 +416,14 @@ static int generic_machine_check_excepti > > printk("Bus - Instruction Parity Error\n"); > > if (reason & MCSR_BUS_RPERR) > > printk("Bus - Read Parity Error\n"); > > -#elif defined (CONFIG_E200) > > + > > + return 0; > > +} > > +#elif defined(CONFIG_E200) > > +int machine_check_e200(struct pt_regs *regs) > > ... and this cause build failures for most of the mpc8xxx defconfigs. > The reason is that e200 and e500 are both lumped under CONFIG_FSL_BOOKE > in cputable.c, but you have them segregated more here. I've added a > fix that just does CONFIG_FSL_BOOKE here to match cputable.c. Actually, reverse that. There are other places where e200 and e500 are separated by ifdefs, so I made cputable.c match the rest. josh ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [PATCH 1/21] [POWERPC] Reworking machine check handling and Fix 440/440A
On Fri, 21 Dec 2007 15:39:21 +1100 Benjamin Herrenschmidt <[EMAIL PROTECTED]> wrote: > Index: linux-merge/arch/powerpc/kernel/traps.c > === > --- linux-merge.orig/arch/powerpc/kernel/traps.c 2007-12-20 > 11:34:43.0 +1100 > +++ linux-merge/arch/powerpc/kernel/traps.c 2007-12-20 11:35:40.0 > +1100 [snip] > -#elif defined (CONFIG_E500) > + return 0; > +} > +#elif defined(CONFIG_E500) > +int machine_check_e500(struct pt_regs *regs) This... > +{ > + unsigned long reason = get_mc_reason(regs); > + > printk("Machine check in kernel mode.\n"); > printk("Caused by (from MCSR=%lx): ", reason); > > @@ -403,7 +416,14 @@ static int generic_machine_check_excepti > printk("Bus - Instruction Parity Error\n"); > if (reason & MCSR_BUS_RPERR) > printk("Bus - Read Parity Error\n"); > -#elif defined (CONFIG_E200) > + > + return 0; > +} > +#elif defined(CONFIG_E200) > +int machine_check_e200(struct pt_regs *regs) ... and this cause build failures for most of the mpc8xxx defconfigs. The reason is that e200 and e500 are both lumped under CONFIG_FSL_BOOKE in cputable.c, but you have them segregated more here. I've added a fix that just does CONFIG_FSL_BOOKE here to match cputable.c. josh ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [PATCH 1/21] [POWERPC] Reworking machine check handling and Fix 440/440A
On Fri, 2007-12-21 at 06:01 -0600, Josh Boyer wrote: > On Fri, 21 Dec 2007 15:39:21 +1100 > Benjamin Herrenschmidt <[EMAIL PROTECTED]> wrote: > > > > Index: linux-merge/include/asm-ppc/reg_booke.h > > === > > --- linux-merge.orig/include/asm-ppc/reg_booke.h2007-09-28 > > 11:42:10.0 +1000 > > +++ linux-merge/include/asm-ppc/reg_booke.h 2007-12-20 11:35:40.0 > > +1100 > > @@ -207,7 +207,7 @@ > > #defineCCR1_TCS0x0080 /* Timer Clock Select */ > > > > /* Bit definitions for the MCSR. */ > > -#ifdef CONFIG_440A > > +#ifdef CONFIG_44x > > Should be #ifdef CONFIG_4xx as I pointed out last time. I'll fix it > when I commit. Ah weird, I though I fixed it... I must have fixed powerpc and not ppc. Ben. ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [PATCH 1/21] [POWERPC] Reworking machine check handling and Fix 440/440A
On Fri, 21 Dec 2007 15:39:21 +1100 Benjamin Herrenschmidt <[EMAIL PROTECTED]> wrote: > Index: linux-merge/include/asm-ppc/reg_booke.h > === > --- linux-merge.orig/include/asm-ppc/reg_booke.h 2007-09-28 > 11:42:10.0 +1000 > +++ linux-merge/include/asm-ppc/reg_booke.h 2007-12-20 11:35:40.0 > +1100 > @@ -207,7 +207,7 @@ > #define CCR1_TCS0x0080 /* Timer Clock Select */ > > /* Bit definitions for the MCSR. */ > -#ifdef CONFIG_440A > +#ifdef CONFIG_44x Should be #ifdef CONFIG_4xx as I pointed out last time. I'll fix it when I commit. josh ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[PATCH 1/21] [POWERPC] Reworking machine check handling and Fix 440/440A
This adds a cputable function pointer for the CPU-side machine check handling. The semantic is still the same as the old one, the one in ppc_md. overrides the one in cputable, though ultimately we'll want to change that so the CPU gets first. This removes CONFIG_440A which was a problem for multiplatform kernels and instead fixes up the IVOR at runtime from a setup_cpu function. The "A" version of the machine check also tweaks the regs->trap value to differenciate the 2 versions at the C level. Signed-off-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]> --- arch/powerpc/kernel/cpu_setup_44x.S |9 +++ arch/powerpc/kernel/cputable.c | 105 arch/powerpc/kernel/head_44x.S | 14 +++- arch/powerpc/kernel/head_booke.h|2 arch/powerpc/kernel/traps.c | 62 - arch/powerpc/platforms/44x/Kconfig |5 - arch/ppc/kernel/traps.c | 98 ++--- include/asm-powerpc/cputable.h | 13 include/asm-powerpc/ptrace.h|3 - include/asm-powerpc/reg_booke.h |3 - include/asm-ppc/reg_booke.h |2 11 files changed, 258 insertions(+), 58 deletions(-) --- linux-merge.orig/arch/powerpc/kernel/cpu_setup_44x.S2007-10-15 11:19:35.0 +1000 +++ linux-merge/arch/powerpc/kernel/cpu_setup_44x.S 2007-12-20 11:35:40.0 +1100 @@ -23,11 +23,20 @@ _GLOBAL(__setup_cpu_440epx) mflrr4 bl __init_fpu_44x bl __plb_disable_wrp + bl __fixup_440A_mcheck mtlrr4 blr _GLOBAL(__setup_cpu_440grx) b __plb_disable_wrp +_GLOBAL(__setup_cpu_440gx) +_GLOBAL(__setup_cpu_440spe) + b __fixup_440A_mcheck + /* Temporary fixup for arch/ppc until we kill the whole thing */ +#ifndef CONFIG_PPC_MERGE +_GLOBAL(__fixup_440A_mcheck) + blr +#endif /* enable APU between CPU and FPU */ _GLOBAL(__init_fpu_44x) Index: linux-merge/arch/powerpc/kernel/cputable.c === --- linux-merge.orig/arch/powerpc/kernel/cputable.c 2007-12-20 11:34:43.0 +1100 +++ linux-merge/arch/powerpc/kernel/cputable.c 2007-12-20 11:35:40.0 +1100 @@ -33,7 +33,9 @@ EXPORT_SYMBOL(cur_cpu_spec); #ifdef CONFIG_PPC32 extern void __setup_cpu_440ep(unsigned long offset, struct cpu_spec* spec); extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec); +extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec); extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec); +extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec); extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec); extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec); extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec); @@ -85,6 +87,7 @@ static struct cpu_spec __initdata cpu_sp .pmc_type = PPC_PMC_IBM, .oprofile_cpu_type = "ppc64/power3", .oprofile_type = PPC_OPROFILE_RS64, + .machine_check = machine_check_generic, .platform = "power3", }, { /* Power3+ */ @@ -99,6 +102,7 @@ static struct cpu_spec __initdata cpu_sp .pmc_type = PPC_PMC_IBM, .oprofile_cpu_type = "ppc64/power3", .oprofile_type = PPC_OPROFILE_RS64, + .machine_check = machine_check_generic, .platform = "power3", }, { /* Northstar */ @@ -113,6 +117,7 @@ static struct cpu_spec __initdata cpu_sp .pmc_type = PPC_PMC_IBM, .oprofile_cpu_type = "ppc64/rs64", .oprofile_type = PPC_OPROFILE_RS64, + .machine_check = machine_check_generic, .platform = "rs64", }, { /* Pulsar */ @@ -127,6 +132,7 @@ static struct cpu_spec __initdata cpu_sp .pmc_type = PPC_PMC_IBM, .oprofile_cpu_type = "ppc64/rs64", .oprofile_type = PPC_OPROFILE_RS64, + .machine_check = machine_check_generic, .platform = "rs64", }, { /* I-star */ @@ -141,6 +147,7 @@ static struct cpu_spec __initdata cpu_sp .pmc_type = PPC_PMC_IBM, .oprofile_cpu_type = "ppc64/rs64", .oprofile_type = PPC_OPROFILE_RS64, + .machine_check = machine_check_generic, .platform = "rs64", }, { /* S-star */ @@ -155,6 +162,7 @@ static struct cpu_spec __initdata cpu_sp .pmc_type