Hi Scott,

I sent V3 of this patch a few days ago.
Comments are welcome.

Thanks.
-Hongtao

> -----Original Message-----
> From: Jia Hongtao [mailto:hongtao....@freescale.com]
> Sent: Thursday, February 26, 2015 3:23 PM
> To: linuxppc-dev@lists.ozlabs.org; Wood Scott-B07421; asolo...@kb.kras.ru
> Cc: ga...@kernel.crashing.org; Li Yang-Leo-R58472; Jia Hongtao-B38951
> Subject: [PATCH V3] powerpc/85xx: workaround for chips with MSI hardware
> errata
> 
> From: Hongtao Jia <hongtao....@freescale.com>
> 
> The MPIC version 2.0 has a MSI errata (errata PIC1 of mpc8544), It causes
> that neither MSI nor MSI-X can work fine. This is a workaround to allow
> MSI-X to function properly.
> 
> Signed-off-by: Liu Shuo <soniccat....@gmail.com>
> Signed-off-by: Li Yang <le...@freescale.com>
> Signed-off-by: Jia Hongtao <hongtao....@freescale.com>
> ---
> Changes for V3:
> * remove mpic_has_erratum_pic1() function. Test erratum directly.
> * rebase on latest kernel update.
> 
> Changes for V2:
> * change the name of function mpic_has_errata() to
> mpic_has_erratum_pic1().
> * move MSI_HW_ERRATA_ENDIAN define to fsl_msi.h with all other defines.
> 
>  arch/powerpc/sysdev/fsl_msi.c | 29 ++++++++++++++++++++++++++---
>  arch/powerpc/sysdev/fsl_msi.h |  2 ++
>  2 files changed, 28 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/powerpc/sysdev/fsl_msi.c
> b/arch/powerpc/sysdev/fsl_msi.c
> index 4bbb4b8..f086c6f 100644
> --- a/arch/powerpc/sysdev/fsl_msi.c
> +++ b/arch/powerpc/sysdev/fsl_msi.c
> @@ -162,7 +162,17 @@ static void fsl_compose_msi_msg(struct pci_dev *pdev,
> int hwirq,
>       msg->address_lo = lower_32_bits(address);
>       msg->address_hi = upper_32_bits(address);
> 
> -     msg->data = hwirq;
> +     /*
> +      * MPIC version 2.0 has erratum PIC1. It causes
> +      * that neither MSI nor MSI-X can work fine.
> +      * This is a workaround to allow MSI-X to function
> +      * properly. It only works for MSI-X, we prevent
> +      * MSI on buggy chips in fsl_setup_msi_irqs().
> +      */
> +     if (msi_data->feature & MSI_HW_ERRATA_ENDIAN)
> +             msg->data = __swab32(hwirq);
> +     else
> +             msg->data = hwirq;
> 
>       pr_debug("%s: allocated srs: %d, ibs: %d\n", __func__,
>                (hwirq >> msi_data->srs_shift) & MSI_SRS_MASK,
> @@ -180,8 +190,16 @@ static int fsl_setup_msi_irqs(struct pci_dev *pdev,
> int nvec, int type)
>       struct msi_msg msg;
>       struct fsl_msi *msi_data;
> 
> -     if (type == PCI_CAP_ID_MSIX)
> -             pr_debug("fslmsi: MSI-X untested, trying anyway.\n");
> +     if (type == PCI_CAP_ID_MSI) {
> +             /*
> +              * MPIC version 2.0 has erratum PIC1. For now MSI
> +              * could not work. So check to prevent MSI from
> +              * being used on the board with this erratum.
> +              */
> +             list_for_each_entry(msi_data, &msi_head, list)
> +                     if (msi_data->feature & MSI_HW_ERRATA_ENDIAN)
> +                             return -EINVAL;
> +     }
> 
>       /*
>        * If the PCI node has an fsl,msi property, then we need to use it
> @@ -446,6 +464,11 @@ static int fsl_of_msi_probe(struct platform_device
> *dev)
> 
>       msi->feature = features->fsl_pic_ip;
> 
> +     /* For erratum PIC1 on MPIC version 2.0*/
> +     if ((features->fsl_pic_ip & FSL_PIC_IP_MASK) == FSL_PIC_IP_MPIC
> +                     && (fsl_mpic_primary_get_version() == 0x0200))
> +             msi->feature |= MSI_HW_ERRATA_ENDIAN;
> +
>       /*
>        * Remember the phandle, so that we can match with any PCI nodes
>        * that have an "fsl,msi" property.
> diff --git a/arch/powerpc/sysdev/fsl_msi.h
> b/arch/powerpc/sysdev/fsl_msi.h
> index 420cfcb..a67359d 100644
> --- a/arch/powerpc/sysdev/fsl_msi.h
> +++ b/arch/powerpc/sysdev/fsl_msi.h
> @@ -27,6 +27,8 @@
>  #define FSL_PIC_IP_IPIC   0x00000002
>  #define FSL_PIC_IP_VMPIC  0x00000003
> 
> +#define MSI_HW_ERRATA_ENDIAN 0x00000010
> +
>  struct fsl_msi_cascade_data;
> 
>  struct fsl_msi {
> --
> 2.1.0.27.g96db324

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

Reply via email to