[kernel/f19] Add patches to fix PowerPC MSI handling (rhbz 962496)

Josh Boyer jwboyer at fedoraproject.org
Mon Jun 3 13:58:40 UTC 2013


commit d51efdbb5bbb27bb4f0e5565d15a57e767c83303
Author: Josh Boyer <jwboyer at redhat.com>
Date:   Mon Jun 3 09:58:23 2013 -0400

    Add patches to fix PowerPC MSI handling (rhbz 962496)

 kernel.spec                                        |   11 +++
 ...ries-Force-32-bit-MSIs-for-devices-that-r.patch |   86 ++++++++++++++++++
 ...ries-Make-32-bit-MSI-quirk-work-on-system.patch |   95 ++++++++++++++++++++
 3 files changed, 192 insertions(+), 0 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 6d51973..db6f028 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -756,6 +756,10 @@ Patch25019: powerpc-Set-default-VGA-device.patch
 Patch25020: powerpc-pseries-Perform-proper-max_bus_speed-detecti.patch
 Patch25021: radeon-use-max_bus-speed-to-activate-gen2-speeds.patch
 
+#rhbz 962496
+Patch25027: powerpc-pseries-Force-32-bit-MSIs-for-devices-that-r.patch
+Patch25029: powerpc-pseries-Make-32-bit-MSI-quirk-work-on-system.patch
+
 Patch25022: iwlwifi-dvm-fix-memset.patch
 
 #rhbz 964367
@@ -1469,6 +1473,10 @@ ApplyPatch powerpc-Set-default-VGA-device.patch
 ApplyPatch powerpc-pseries-Perform-proper-max_bus_speed-detecti.patch
 ApplyPatch radeon-use-max_bus-speed-to-activate-gen2-speeds.patch
 
+#rhbz 962496
+ApplyPatch powerpc-pseries-Force-32-bit-MSIs-for-devices-that-r.patch
+ApplyPatch powerpc-pseries-Make-32-bit-MSI-quirk-work-on-system.patch
+
 ApplyPatch iwlwifi-dvm-fix-memset.patch
 
 #rhbz 964367
@@ -2307,6 +2315,9 @@ fi
 # and build.
 
 %changelog
+* Mon Jun 03 2013 Josh Boyer <jwboyer at redhat.com>
+- Add patches to fix PowerPC MSI handling (rhbz 962496)
+
 * Sat Jun  1 2013 Peter Robinson <pbrobinson at fedoraproject.org>
 - Add patch to fix DRM/X on omap (panda)
 - Enable Cortex-A8 errata on multiplatform kernels (omap3)
diff --git a/powerpc-pseries-Force-32-bit-MSIs-for-devices-that-r.patch b/powerpc-pseries-Force-32-bit-MSIs-for-devices-that-r.patch
new file mode 100644
index 0000000..eeb3995
--- /dev/null
+++ b/powerpc-pseries-Force-32-bit-MSIs-for-devices-that-r.patch
@@ -0,0 +1,86 @@
+From e61133dda480062d221f09e4fc18f66763f8ecd0 Mon Sep 17 00:00:00 2001
+From: Brian King <brking at linux.vnet.ibm.com>
+Date: Fri, 3 May 2013 11:30:59 +0000
+Subject: [PATCH] powerpc/pseries: Force 32 bit MSIs for devices that require
+ it
+
+The following patch implements a new PAPR change which allows
+the OS to force the use of 32 bit MSIs, regardless of what
+the PCI capabilities indicate. This is required for some
+devices that advertise support for 64 bit MSIs but don't
+actually support them.
+
+Signed-off-by: Brian King <brking at linux.vnet.ibm.com>
+Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
+---
+ arch/powerpc/include/asm/pci-bridge.h |  2 ++
+ arch/powerpc/platforms/pseries/msi.c  | 21 ++++++++++++++++++---
+ 2 files changed, 20 insertions(+), 3 deletions(-)
+
+diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h
+index ffbc5fd..0694f73 100644
+--- a/arch/powerpc/include/asm/pci-bridge.h
++++ b/arch/powerpc/include/asm/pci-bridge.h
+@@ -163,6 +163,8 @@ struct pci_dn {
+ 
+ 	int	pci_ext_config_space;	/* for pci devices */
+ 
++	int	force_32bit_msi:1;
++
+ 	struct	pci_dev *pcidev;	/* back-pointer to the pci device */
+ #ifdef CONFIG_EEH
+ 	struct eeh_dev *edev;		/* eeh device */
+diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c
+index e5b0847..420524e 100644
+--- a/arch/powerpc/platforms/pseries/msi.c
++++ b/arch/powerpc/platforms/pseries/msi.c
+@@ -24,6 +24,7 @@ static int query_token, change_token;
+ #define RTAS_RESET_FN		2
+ #define RTAS_CHANGE_MSI_FN	3
+ #define RTAS_CHANGE_MSIX_FN	4
++#define RTAS_CHANGE_32MSI_FN	5
+ 
+ static struct pci_dn *get_pdn(struct pci_dev *pdev)
+ {
+@@ -58,7 +59,8 @@ static int rtas_change_msi(struct pci_dn *pdn, u32 func, u32 num_irqs)
+ 
+ 	seq_num = 1;
+ 	do {
+-		if (func == RTAS_CHANGE_MSI_FN || func == RTAS_CHANGE_MSIX_FN)
++		if (func == RTAS_CHANGE_MSI_FN || func == RTAS_CHANGE_MSIX_FN ||
++		    func == RTAS_CHANGE_32MSI_FN)
+ 			rc = rtas_call(change_token, 6, 4, rtas_ret, addr,
+ 					BUID_HI(buid), BUID_LO(buid),
+ 					func, num_irqs, seq_num);
+@@ -426,9 +428,12 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
+ 	 */
+ again:
+ 	if (type == PCI_CAP_ID_MSI) {
+-		rc = rtas_change_msi(pdn, RTAS_CHANGE_MSI_FN, nvec);
++		if (pdn->force_32bit_msi)
++			rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSI_FN, nvec);
++		else
++			rc = rtas_change_msi(pdn, RTAS_CHANGE_MSI_FN, nvec);
+ 
+-		if (rc < 0) {
++		if (rc < 0 && !pdn->force_32bit_msi) {
+ 			pr_debug("rtas_msi: trying the old firmware call.\n");
+ 			rc = rtas_change_msi(pdn, RTAS_CHANGE_FN, nvec);
+ 		}
+@@ -512,3 +517,13 @@ static int rtas_msi_init(void)
+ 	return 0;
+ }
+ arch_initcall(rtas_msi_init);
++
++static void quirk_radeon(struct pci_dev *dev)
++{
++	struct pci_dn *pdn = get_pdn(dev);
++
++	if (pdn)
++		pdn->force_32bit_msi = 1;
++}
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x68f2, quirk_radeon);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0xaa68, quirk_radeon);
+-- 
+1.8.1.4
+
diff --git a/powerpc-pseries-Make-32-bit-MSI-quirk-work-on-system.patch b/powerpc-pseries-Make-32-bit-MSI-quirk-work-on-system.patch
new file mode 100644
index 0000000..6edd14b
--- /dev/null
+++ b/powerpc-pseries-Make-32-bit-MSI-quirk-work-on-system.patch
@@ -0,0 +1,95 @@
+From ad735c038a1c3273b605c398a765fdd525527ef7 Mon Sep 17 00:00:00 2001
+From: Brian King <brking at linux.vnet.ibm.com>
+Date: Wed, 22 May 2013 11:07:46 +0000
+Subject: [PATCH] powerpc/pseries: Make 32-bit MSI quirk work on systems
+ lacking firmware support
+
+Recent commit e61133dda480062d221f09e4fc18f66763f8ecd0 added support
+for a new firmware feature to force an adapter to use 32 bit MSIs.
+However, this firmware is not available for all systems. The hack below
+allows devices needing 32 bit MSIs to work on these systems as well.
+It is careful to only enable this on Gen2 slots, which should limit
+this to configurations where this hack is needed and tested to work.
+
+[Small change to factor out the hack into a separate function -- BenH]
+
+Signed-off-by: Brian King <brking at linux.vnet.ibm.com>
+Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
+---
+ arch/powerpc/platforms/pseries/msi.c | 40 +++++++++++++++++++++++++++++++++---
+ 1 file changed, 37 insertions(+), 3 deletions(-)
+
+diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c
+index 420524e..cd7d23d 100644
+--- a/arch/powerpc/platforms/pseries/msi.c
++++ b/arch/powerpc/platforms/pseries/msi.c
+@@ -394,6 +394,23 @@ static int check_msix_entries(struct pci_dev *pdev)
+ 	return 0;
+ }
+ 
++static void rtas_hack_32bit_msi_gen2(struct pci_dev *pdev)
++{
++	u32 addr_hi, addr_lo;
++
++	/*
++	 * We should only get in here for IODA1 configs. This is based on the
++	 * fact that we using RTAS for MSIs, we don't have the 32 bit MSI RTAS
++	 * support, and we are in a PCIe Gen2 slot.
++	 */
++	dev_info(&pdev->dev,
++		 "rtas_msi: No 32 bit MSI firmware support, forcing 32 bit MSI\n");
++	pci_read_config_dword(pdev, pdev->msi_cap + PCI_MSI_ADDRESS_HI, &addr_hi);
++	addr_lo = 0xffff0000 | ((addr_hi >> (48 - 32)) << 4);
++	pci_write_config_dword(pdev, pdev->msi_cap + PCI_MSI_ADDRESS_LO, addr_lo);
++	pci_write_config_dword(pdev, pdev->msi_cap + PCI_MSI_ADDRESS_HI, 0);
++}
++
+ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
+ {
+ 	struct pci_dn *pdn;
+@@ -401,6 +418,7 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
+ 	struct msi_desc *entry;
+ 	struct msi_msg msg;
+ 	int nvec = nvec_in;
++	int use_32bit_msi_hack = 0;
+ 
+ 	pdn = get_pdn(pdev);
+ 	if (!pdn)
+@@ -428,15 +446,31 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
+ 	 */
+ again:
+ 	if (type == PCI_CAP_ID_MSI) {
+-		if (pdn->force_32bit_msi)
++		if (pdn->force_32bit_msi) {
+ 			rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSI_FN, nvec);
+-		else
++			if (rc < 0) {
++				/*
++				 * We only want to run the 32 bit MSI hack below if
++				 * the max bus speed is Gen2 speed
++				 */
++				if (pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT)
++					return rc;
++
++				use_32bit_msi_hack = 1;
++			}
++		} else
++			rc = -1;
++
++		if (rc < 0)
+ 			rc = rtas_change_msi(pdn, RTAS_CHANGE_MSI_FN, nvec);
+ 
+-		if (rc < 0 && !pdn->force_32bit_msi) {
++		if (rc < 0) {
+ 			pr_debug("rtas_msi: trying the old firmware call.\n");
+ 			rc = rtas_change_msi(pdn, RTAS_CHANGE_FN, nvec);
+ 		}
++
++		if (use_32bit_msi_hack && rc > 0)
++			rtas_hack_32bit_msi_gen2(pdev);
+ 	} else
+ 		rc = rtas_change_msi(pdn, RTAS_CHANGE_MSIX_FN, nvec);
+ 
+-- 
+1.8.1.4
+


More information about the scm-commits mailing list