[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