| From 8a934efe94347eee843aeea65bdec8077a79e259 Mon Sep 17 00:00:00 2001 |
| From: Gavin Shan <gwshan@linux.vnet.ibm.com> |
| Date: Thu, 26 May 2016 09:56:07 +1000 |
| Subject: powerpc/pseries: Fix PCI config address for DDW |
| |
| From: Gavin Shan <gwshan@linux.vnet.ibm.com> |
| |
| commit 8a934efe94347eee843aeea65bdec8077a79e259 upstream. |
| |
| In commit 8445a87f7092 "powerpc/iommu: Remove the dependency on EEH |
| struct in DDW mechanism", the PE address was replaced with the PCI |
| config address in order to remove dependency on EEH. According to PAPR |
| spec, firmware (pHyp or QEMU) should accept "xxBBSSxx" format PCI config |
| address, not "xxxxBBSS" provided by the patch. Note that "BB" is PCI bus |
| number and "SS" is the combination of slot and function number. |
| |
| This fixes the PCI address passed to DDW RTAS calls. |
| |
| Fixes: 8445a87f7092 ("powerpc/iommu: Remove the dependency on EEH struct in DDW mechanism") |
| Reported-by: Guilherme G. Piccoli <gpiccoli@linux.vnet.ibm.com> |
| Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> |
| Tested-by: Guilherme G. Piccoli <gpiccoli@linux.vnet.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/platforms/pseries/iommu.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/powerpc/platforms/pseries/iommu.c |
| +++ b/arch/powerpc/platforms/pseries/iommu.c |
| @@ -927,7 +927,7 @@ static int query_ddw(struct pci_dev *dev |
| dn = pci_device_to_OF_node(dev); |
| pdn = PCI_DN(dn); |
| buid = pdn->phb->buid; |
| - cfg_addr = (pdn->busno << 8) | pdn->devfn; |
| + cfg_addr = ((pdn->busno << 16) | (pdn->devfn << 8)); |
| |
| ret = rtas_call(ddw_avail[0], 3, 5, (u32 *)query, |
| cfg_addr, BUID_HI(buid), BUID_LO(buid)); |
| @@ -956,7 +956,7 @@ static int create_ddw(struct pci_dev *de |
| dn = pci_device_to_OF_node(dev); |
| pdn = PCI_DN(dn); |
| buid = pdn->phb->buid; |
| - cfg_addr = (pdn->busno << 8) | pdn->devfn; |
| + cfg_addr = ((pdn->busno << 16) | (pdn->devfn << 8)); |
| |
| do { |
| /* extra outputs are LIOBN and dma-addr (hi, lo) */ |