aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/pci/mmconfig_64.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/pci/mmconfig_64.c')
-rw-r--r--arch/x86/pci/mmconfig_64.c23
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
17static 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
31static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn) 17static 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
41static int pci_mmcfg_read(unsigned int seg, unsigned int bus, 26static int pci_mmcfg_read(unsigned int seg, unsigned int bus,