diff options
Diffstat (limited to 'arch/x86/pci/mmconfig_64.c')
-rw-r--r-- | arch/x86/pci/mmconfig_64.c | 23 |
1 files changed, 4 insertions, 19 deletions
diff --git a/arch/x86/pci/mmconfig_64.c b/arch/x86/pci/mmconfig_64.c index cfa6cdb6d262..e783841bd1d7 100644 --- a/arch/x86/pci/mmconfig_64.c +++ b/arch/x86/pci/mmconfig_64.c | |||
@@ -14,28 +14,13 @@ | |||
14 | 14 | ||
15 | #define PREFIX "PCI: " | 15 | #define PREFIX "PCI: " |
16 | 16 | ||
17 | static char __iomem *get_virt(unsigned int seg, unsigned bus) | ||
18 | { | ||
19 | struct pci_mmcfg_region *cfg; | ||
20 | |||
21 | list_for_each_entry(cfg, &pci_mmcfg_list, list) | ||
22 | if (cfg->segment == seg && | ||
23 | (cfg->start_bus <= bus) && | ||
24 | (cfg->end_bus >= bus)) | ||
25 | return cfg->virt; | ||
26 | |||
27 | /* Fall back to type 0 */ | ||
28 | return NULL; | ||
29 | } | ||
30 | |||
31 | static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn) | 17 | static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn) |
32 | { | 18 | { |
33 | char __iomem *addr; | 19 | struct pci_mmcfg_region *cfg = pci_mmconfig_lookup(seg, bus); |
34 | 20 | ||
35 | addr = get_virt(seg, bus); | 21 | if (cfg && cfg->virt) |
36 | if (!addr) | 22 | return cfg->virt + (PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12)); |
37 | return NULL; | 23 | return NULL; |
38 | return addr + (PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12)); | ||
39 | } | 24 | } |
40 | 25 | ||
41 | static int pci_mmcfg_read(unsigned int seg, unsigned int bus, | 26 | static int pci_mmcfg_read(unsigned int seg, unsigned int bus, |