diff options
author | Wei Yang <weiyang@linux.vnet.ibm.com> | 2016-03-03 18:53:06 -0500 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-03-08 17:58:17 -0500 |
commit | 51c0e87e9a48d081d7ccb40d7454a0fa2935a424 (patch) | |
tree | 857e9d84f428131604138d391ebf9b492be41747 | |
parent | 971427f5827d5a013965878e196d6930a977e8a7 (diff) |
powerpc/eeh: Cache normal BARs, not windows or IOV BARs
This restricts the EEH address cache to use only the first 7 BARs. This
makes __eeh_addr_cache_insert_dev() ignore PCI bridge window and IOV BARs.
As the result of this change, eeh_addr_cache_get_dev() will return VFs from
VF's resource addresses instead of parent PFs.
This also removes PCI bridge check as we limit __eeh_addr_cache_insert_dev()
to 7 BARs and this effectively excludes PCI bridges from being cached.
Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com>
Acked-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r-- | arch/powerpc/kernel/eeh_cache.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/eeh_cache.c b/arch/powerpc/kernel/eeh_cache.c index a1e86e172e3c..ddbcfab7efdf 100644 --- a/arch/powerpc/kernel/eeh_cache.c +++ b/arch/powerpc/kernel/eeh_cache.c | |||
@@ -195,8 +195,11 @@ static void __eeh_addr_cache_insert_dev(struct pci_dev *dev) | |||
195 | return; | 195 | return; |
196 | } | 196 | } |
197 | 197 | ||
198 | /* Walk resources on this device, poke them into the tree */ | 198 | /* |
199 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { | 199 | * Walk resources on this device, poke the first 7 (6 normal BAR and 1 |
200 | * ROM BAR) into the tree. | ||
201 | */ | ||
202 | for (i = 0; i <= PCI_ROM_RESOURCE; i++) { | ||
200 | resource_size_t start = pci_resource_start(dev,i); | 203 | resource_size_t start = pci_resource_start(dev,i); |
201 | resource_size_t end = pci_resource_end(dev,i); | 204 | resource_size_t end = pci_resource_end(dev,i); |
202 | unsigned long flags = pci_resource_flags(dev,i); | 205 | unsigned long flags = pci_resource_flags(dev,i); |
@@ -222,10 +225,6 @@ void eeh_addr_cache_insert_dev(struct pci_dev *dev) | |||
222 | { | 225 | { |
223 | unsigned long flags; | 226 | unsigned long flags; |
224 | 227 | ||
225 | /* Ignore PCI bridges */ | ||
226 | if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE) | ||
227 | return; | ||
228 | |||
229 | spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags); | 228 | spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags); |
230 | __eeh_addr_cache_insert_dev(dev); | 229 | __eeh_addr_cache_insert_dev(dev); |
231 | spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags); | 230 | spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags); |