Add patches to fix PowerPC MSI handling (rhbz 962496)
This commit is contained in:
parent
cb1fe2850d
commit
d51efdbb5b
11
kernel.spec
11
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@redhat.com>
|
||||
- Add patches to fix PowerPC MSI handling (rhbz 962496)
|
||||
|
||||
* Sat Jun 1 2013 Peter Robinson <pbrobinson@fedoraproject.org>
|
||||
- Add patch to fix DRM/X on omap (panda)
|
||||
- Enable Cortex-A8 errata on multiplatform kernels (omap3)
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
From e61133dda480062d221f09e4fc18f66763f8ecd0 Mon Sep 17 00:00:00 2001
|
||||
From: Brian King <brking@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@linux.vnet.ibm.com>
|
||||
Signed-off-by: Benjamin Herrenschmidt <benh@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
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
From ad735c038a1c3273b605c398a765fdd525527ef7 Mon Sep 17 00:00:00 2001
|
||||
From: Brian King <brking@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@linux.vnet.ibm.com>
|
||||
Signed-off-by: Benjamin Herrenschmidt <benh@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
|
||||
|
Loading…
Reference in New Issue