diff options
author | Wei Yang <weiyang@linux.vnet.ibm.com> | 2015-03-25 04:23:53 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2015-03-30 22:02:37 -0400 |
commit | c3b80fb0f22f464f35a970d65e76d2fe904d4923 (patch) | |
tree | 594d31853072f0180d89bf1f1166f25b3e13d6f1 | |
parent | a8b2f8288a3fdef8d93efef2b1ead7563004275e (diff) |
powerpc/pci: Don't unset PCI resources for VFs
Flag PCI_REASSIGN_ALL_RSRC is used to ignore resources information setup by
firmware, so that kernel would re-assign all resources of pci devices.
On powerpc arch, this happens in a header fixup function
pcibios_fixup_resources(), which will clean up the resources if this flag
is set. This works fine for PFs, since after clean up, kernel will
re-assign the resources in pcibios_resource_survey().
Below is a simple call flow on how it works:
pcibios_init
pcibios_scan_phb
pci_scan_child_bus
...
pci_device_add
pci_fixup_device(pci_fixup_header)
pcibios_fixup_resources # header fixup
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++)
dev->resource[i].start = 0
pcibios_resource_survey # re-assign
pcibios_allocate_resources
However, the VF resources won't be re-assigned, since the VF resources are
completely determined by the PF resources, and the PF resources have
already been reassigned. This means we need to leave VF's resources
un-cleared in pcibios_fixup_resources().
In this patch, we skip the resource unset process in
pcibios_fixup_resources(), if the pci_dev is a VF.
Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/kernel/pci-common.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 2a525c938158..82031011522f 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -788,6 +788,10 @@ static void pcibios_fixup_resources(struct pci_dev *dev) | |||
788 | pci_name(dev)); | 788 | pci_name(dev)); |
789 | return; | 789 | return; |
790 | } | 790 | } |
791 | |||
792 | if (dev->is_virtfn) | ||
793 | return; | ||
794 | |||
791 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { | 795 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { |
792 | struct resource *res = dev->resource + i; | 796 | struct resource *res = dev->resource + i; |
793 | struct pci_bus_region reg; | 797 | struct pci_bus_region reg; |