Re: [PATCH V3] powerpc/85xx: workaround for chips with MSI hardware errata

2015-03-04 Thread Scott Wood
On Wed, 2015-03-04 at 00:44 -0600, Jia Hongtao-B38951 wrote:
 Hi Scott,
 
 I sent V3 of this patch a few days ago.
 Comments are welcome.

Patience is welcome. :-)

-Scott


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

RE: [PATCH V3] powerpc/85xx: workaround for chips with MSI hardware errata

2015-03-03 Thread Hongtao Jia
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   0x0002
  #define FSL_PIC_IP_VMPIC  0x0003
 
 +#define MSI_HW_ERRATA_ENDIAN 0x0010
 +
  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

[PATCH V3] powerpc/85xx: workaround for chips with MSI hardware errata

2015-02-25 Thread Jia Hongtao
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   0x0002
 #define FSL_PIC_IP_VMPIC  0x0003
 
+#define MSI_HW_ERRATA_ENDIAN 0x0010
+
 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