Fix build issue with PowerPC MSI patches (rhbz 962496)

This commit is contained in:
Josh Boyer 2013-06-04 13:37:01 -04:00
parent 65373eab64
commit f9b60448ad
2 changed files with 16 additions and 11 deletions

View File

@ -2321,7 +2321,10 @@ fi
# and build.
%changelog
* Mon Jun 03 2013 Josh Boyer <jwboyer@redhat.com>
* Tue Jun 04 2013 Josh Boyer <jwboyer@redhat.com>
- Fix build issue with PowerPC MSI patches (rhbz 962496)
* Mon Jun 03 2013 Josh Boyer <jwboyer@redhat.com> - 3.9.4-301
- Fix UEFI anti-bricking code (rhbz 964335)
- Add patches to fix PowerPC MSI handling (rhbz 962496)

View File

@ -1,4 +1,4 @@
From ad735c038a1c3273b605c398a765fdd525527ef7 Mon Sep 17 00:00:00 2001
From ffbc2a5d4bb9c758867332d2f4d521a02375e43a 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
@ -16,19 +16,20 @@ this to configurations where this hack is needed and tested to work.
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(-)
arch/powerpc/platforms/pseries/msi.c | 42 +++++++++++++++++++++++++++++++++---
1 file changed, 39 insertions(+), 3 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c
index 420524e..cd7d23d 100644
index 420524e..5a75b02 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)
@@ -394,6 +394,25 @@ static int check_msix_entries(struct pci_dev *pdev)
return 0;
}
+static void rtas_hack_32bit_msi_gen2(struct pci_dev *pdev)
+{
+ int pos;
+ u32 addr_hi, addr_lo;
+
+ /*
@ -38,16 +39,17 @@ index 420524e..cd7d23d 100644
+ */
+ 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);
+ pos = pci_find_capability(pdev, PCI_CAP_ID_MSI);
+ pci_read_config_dword(pdev, pos + 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);
+ pci_write_config_dword(pdev, pos + PCI_MSI_ADDRESS_LO, addr_lo);
+ pci_write_config_dword(pdev, pos + 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)
@@ -401,6 +420,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;
@ -55,7 +57,7 @@ index 420524e..cd7d23d 100644
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)
@@ -428,15 +448,31 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
*/
again:
if (type == PCI_CAP_ID_MSI) {