Re: [PATCH V5] powerpc/85xx: Add machine check handler to fix PCIe erratum on mpc85xx

2013-04-11 Thread Scott Wood

On 04/11/2013 04:14:51 AM, Jia Hongtao-B38951 wrote:



> -Original Message-
> From: Wood Scott-B07421
> Sent: Thursday, April 11, 2013 5:52 AM
> To: Jia Hongtao-B38951
> Cc: linuxppc-dev@lists.ozlabs.org; ga...@kernel.crashing.org; Wood  
Scott-

> B07421; Li Yang-R58472; Jia Hongtao-B38951
> Subject: Re: [PATCH V5] powerpc/85xx: Add machine check handler to  
fix

> PCIe erratum on mpc85xx
>
> The X and (especially for PCI) BRX versions are important --  
probably

> more so than the U versions.  I doubt we need the A variant.

Then I will add X and BRX variant and remove A variant.

>
> If you do support the A variant, why are you not sign-extending the
> value?

Just curious, sign-extending the value means fill rd with 0x?


Or 0x on 64-bit (even if you're not going to implement  
64-bit instructions, the ones you do implement shouldn't misbehave  
there).  You could write it as "regs->gpr[rd] = ~0UL".


-Scott
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


RE: [PATCH V5] powerpc/85xx: Add machine check handler to fix PCIe erratum on mpc85xx

2013-04-11 Thread Jia Hongtao-B38951


> -Original Message-
> From: Wood Scott-B07421
> Sent: Thursday, April 11, 2013 5:52 AM
> To: Jia Hongtao-B38951
> Cc: linuxppc-dev@lists.ozlabs.org; ga...@kernel.crashing.org; Wood Scott-
> B07421; Li Yang-R58472; Jia Hongtao-B38951
> Subject: Re: [PATCH V5] powerpc/85xx: Add machine check handler to fix
> PCIe erratum on mpc85xx
> 
> On 04/08/2013 03:26:54 AM, Jia Hongtao wrote:
> > @@ -826,6 +829,124 @@ u64 fsl_pci_immrbar_base(struct pci_controller
> > *hose)
> > return 0;
> >  }
> >
> > +#ifdef CONFIG_E500
> > +
> > +#define OP_LWZ  32
> > +#define OP_LWZU 33
> > +#define OP_LBZ  34
> > +#define OP_LBZU 35
> > +#define OP_LHZ  40
> > +#define OP_LHZU 41
> > +#define OP_LHA  42
> > +#define OP_LHAU 43
> 
> Can you move these to asm/ppc-opcode.h (or possibly
> asm/ppc-disassemble.h if we don't want to mix the two methods of
> describing instructions)?

Yes, mix the two methods is not appropriate.
asm/ppc-disassemble.h is a nice choice.

> 
> > +static int mcheck_handle_load(struct pt_regs *regs, u32 inst)
> > +{
> > +   unsigned int rd, ra, d;
> > +
> > +   rd = get_rt(inst);
> > +   ra = get_ra(inst);
> > +   d = get_d(inst);
> > +
> > +   switch (get_op(inst)) {
> > +   case OP_LWZ:
> > +   regs->gpr[rd] = 0x;
> > +   break;
> > +
> > +   case OP_LWZU:
> > +   regs->gpr[rd] = 0x;
> > +   regs->gpr[ra] += (s16)d;
> > +   break;
> > +
> > +   case OP_LBZ:
> > +   regs->gpr[rd] = 0xff;
> > +   break;
> > +
> > +   case OP_LBZU:
> > +   regs->gpr[rd] = 0xff;
> > +   regs->gpr[ra] += (s16)d;
> > +   break;
> > +
> > +   case OP_LHZ:
> > +   regs->gpr[rd] = 0x;
> > +   break;
> > +
> > +   case OP_LHZU:
> > +   regs->gpr[rd] = 0x;
> > +   regs->gpr[ra] += (s16)d;
> > +   break;
> > +
> > +   case OP_LHA:
> > +   regs->gpr[rd] = 0x;
> > +   break;
> > +
> > +   case OP_LHAU:
> > +   regs->gpr[rd] = 0x;
> > +   regs->gpr[ra] += (s16)d;
> > +   break;
> 
> The X and (especially for PCI) BRX versions are important -- probably
> more so than the U versions.  I doubt we need the A variant.

Then I will add X and BRX variant and remove A variant.

> 
> If you do support the A variant, why are you not sign-extending the
> value?

Just curious, sign-extending the value means fill rd with 0x?

> 
> Is this erratum present on any 64-bit chips?

No. This erratum only happened in e500 core chips.

> 
> -Scott

Thanks.
-Hongtao

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH V5] powerpc/85xx: Add machine check handler to fix PCIe erratum on mpc85xx

2013-04-10 Thread Scott Wood

On 04/08/2013 03:26:54 AM, Jia Hongtao wrote:
@@ -826,6 +829,124 @@ u64 fsl_pci_immrbar_base(struct pci_controller  
*hose)

return 0;
 }

+#ifdef CONFIG_E500
+
+#define OP_LWZ  32
+#define OP_LWZU 33
+#define OP_LBZ  34
+#define OP_LBZU 35
+#define OP_LHZ  40
+#define OP_LHZU 41
+#define OP_LHA  42
+#define OP_LHAU 43


Can you move these to asm/ppc-opcode.h (or possibly  
asm/ppc-disassemble.h if we don't want to mix the two methods of  
describing instructions)?



+static int mcheck_handle_load(struct pt_regs *regs, u32 inst)
+{
+   unsigned int rd, ra, d;
+
+   rd = get_rt(inst);
+   ra = get_ra(inst);
+   d = get_d(inst);
+
+   switch (get_op(inst)) {
+   case OP_LWZ:
+   regs->gpr[rd] = 0x;
+   break;
+
+   case OP_LWZU:
+   regs->gpr[rd] = 0x;
+   regs->gpr[ra] += (s16)d;
+   break;
+
+   case OP_LBZ:
+   regs->gpr[rd] = 0xff;
+   break;
+
+   case OP_LBZU:
+   regs->gpr[rd] = 0xff;
+   regs->gpr[ra] += (s16)d;
+   break;
+
+   case OP_LHZ:
+   regs->gpr[rd] = 0x;
+   break;
+
+   case OP_LHZU:
+   regs->gpr[rd] = 0x;
+   regs->gpr[ra] += (s16)d;
+   break;
+
+   case OP_LHA:
+   regs->gpr[rd] = 0x;
+   break;
+
+   case OP_LHAU:
+   regs->gpr[rd] = 0x;
+   regs->gpr[ra] += (s16)d;
+   break;


The X and (especially for PCI) BRX versions are important -- probably  
more so than the U versions.  I doubt we need the A variant.


If you do support the A variant, why are you not sign-extending the  
value?


Is this erratum present on any 64-bit chips?

-Scott
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


RE: [PATCH V5] powerpc/85xx: Add machine check handler to fix PCIe erratum on mpc85xx

2013-04-09 Thread Jia Hongtao-B38951
Hi Scott,

I added load instruction handler for the skipped instruction.
For now most common load instructions are handled in this patch.

Any advice for this?

Thanks.
-Hongtao.

> -Original Message-
> From: Jia Hongtao-B38951
> Sent: Monday, April 08, 2013 4:27 PM
> To: linuxppc-dev@lists.ozlabs.org; ga...@kernel.crashing.org
> Cc: Wood Scott-B07421; Li Yang-R58472; Jia Hongtao-B38951
> Subject: [PATCH V5] powerpc/85xx: Add machine check handler to fix PCIe
> erratum on mpc85xx
> 
> A PCIe erratum of mpc85xx may causes a core hang when a link of PCIe goes
> down. when the link goes down, Non-posted transactions issued via the
> ATMU requiring completion result in an instruction stall.
> At the same time a machine-check exception is generated to the core to
> allow further processing by the handler. We implements the handler which
> skips the instruction caused the stall.
> 
> This patch depends on patch:
> powerpc/85xx: Add platform_device declaration to fsl_pci.h
> 
> Signed-off-by: Zhao Chenhui 
> Signed-off-by: Li Yang 
> Signed-off-by: Liu Shuo 
> Signed-off-by: Jia Hongtao 
> ---
> Changes for V4:
> * Fill rd with all-Fs if the skipped instruction is load and emulate the
>   instruction.
> * Let KVM/QEMU deal with the exception if the machine check comes from
> KVM.
> 
>  arch/powerpc/kernel/cpu_setup_fsl_booke.S |   2 +-
>  arch/powerpc/kernel/traps.c   |   3 +
>  arch/powerpc/sysdev/fsl_pci.c | 121
> ++
>  arch/powerpc/sysdev/fsl_pci.h |   6 ++
>  4 files changed, 131 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/powerpc/kernel/cpu_setup_fsl_booke.S
> b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
> index dcd8819..f1bde90 100644
> --- a/arch/powerpc/kernel/cpu_setup_fsl_booke.S
> +++ b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
> @@ -66,7 +66,7 @@ _GLOBAL(__setup_cpu_e500v2)
>   bl  __e500_icache_setup
>   bl  __e500_dcache_setup
>   bl  __setup_e500_ivors
> -#ifdef CONFIG_FSL_RIO
> +#if defined(CONFIG_FSL_RIO) || defined(CONFIG_FSL_PCI)
>   /* Ensure that RFXE is set */
>   mfspr   r3,SPRN_HID1
>   orisr3,r3,HID1_RFXE@h
> diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
> index a008cf5..dd275a4 100644
> --- a/arch/powerpc/kernel/traps.c
> +++ b/arch/powerpc/kernel/traps.c
> @@ -59,6 +59,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
> 
>  #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)  int
> (*__debugger)(struct pt_regs *regs) __read_mostly; @@ -556,6 +557,8 @@
> int machine_check_e500(struct pt_regs *regs)
>   if (reason & MCSR_BUS_RBERR) {
>   if (fsl_rio_mcheck_exception(regs))
>   return 1;
> + if (fsl_pci_mcheck_exception(regs))
> + return 1;
>   }
> 
>   printk("Machine check in kernel mode.\n"); diff --git
> a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index
> 682084d..48326cd 100644
> --- a/arch/powerpc/sysdev/fsl_pci.c
> +++ b/arch/powerpc/sysdev/fsl_pci.c
> @@ -26,11 +26,14 @@
>  #include 
>  #include 
>  #include 
> +#include 
> 
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
> +#include 
>  #include 
>  #include 
> 
> @@ -826,6 +829,124 @@ u64 fsl_pci_immrbar_base(struct pci_controller
> *hose)
>   return 0;
>  }
> 
> +#ifdef CONFIG_E500
> +
> +#define OP_LWZ  32
> +#define OP_LWZU 33
> +#define OP_LBZ  34
> +#define OP_LBZU 35
> +#define OP_LHZ  40
> +#define OP_LHZU 41
> +#define OP_LHA  42
> +#define OP_LHAU 43
> +
> +static int mcheck_handle_load(struct pt_regs *regs, u32 inst) {
> + unsigned int rd, ra, d;
> +
> + rd = get_rt(inst);
> + ra = get_ra(inst);
> + d = get_d(inst);
> +
> + switch (get_op(inst)) {
> + case OP_LWZ:
> + regs->gpr[rd] = 0x;
> + break;
> +
> + case OP_LWZU:
> + regs->gpr[rd] = 0x;
> + regs->gpr[ra] += (s16)d;
> + break;
> +
> + case OP_LBZ:
> + regs->gpr[rd] = 0xff;
> + break;
> +
> + case OP_LBZU:
> + regs->gpr[rd] = 0xff;
> + regs->gpr[ra] += (s16)d;
> + break;
> +
> + case OP_LHZ:
> + regs->gpr[rd] = 0x;
> + break;
> +
> + case OP_LHZU:
> + regs->gpr[rd] = 0x;
> + regs->gpr[ra] += (s16)d;
> + break;
> +
> + case OP_LHA:
> + regs->gpr[rd] = 0x;
> + break;
> +
> + case OP_LHAU:
> + regs->gpr[rd] = 0x;
> + regs->gpr[ra] += (s16)d;
> + break;
> +
> + default:
> + return 0;
> + }
> +
> + return 1;
> +}
> +
> +static int is_in_pci_mem_space(phys_addr_t addr) {
> + struct pci_controller *hose;
> + struct resource *res;
> + int i;
> +
> + list_for_each_entry(hose, &hose_list, list_node) {
> + if (!early_find_capability(hose, 0,