x86/PCI: MMCONFIG: add lookup function
authorBjorn Helgaas <bjorn.helgaas@hp.com>
Sat, 14 Nov 2009 00:35:04 +0000 (17:35 -0700)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Tue, 24 Nov 2009 23:30:36 +0000 (15:30 -0800)
This patch factors out the search for an MMCONFIG region, which was
previously implemented in both mmconfig_32 and mmconfig_64.  No functional
change.

Reviewed-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
arch/x86/include/asm/pci_x86.h
arch/x86/pci/mmconfig-shared.c
arch/x86/pci/mmconfig_32.c
arch/x86/pci/mmconfig_64.c

index 0b7c316..b4bf9a9 100644 (file)
@@ -134,6 +134,7 @@ struct pci_mmcfg_region {
 
 extern int __init pci_mmcfg_arch_init(void);
 extern void __init pci_mmcfg_arch_free(void);
+extern struct pci_mmcfg_region *pci_mmconfig_lookup(int segment, int bus);
 
 extern struct list_head pci_mmcfg_list;
 
index 71d69b8..b19d1e5 100644 (file)
@@ -97,6 +97,18 @@ static __init struct pci_mmcfg_region *pci_mmconfig_add(int segment, int start,
        return new;
 }
 
+struct pci_mmcfg_region *pci_mmconfig_lookup(int segment, int bus)
+{
+       struct pci_mmcfg_region *cfg;
+
+       list_for_each_entry(cfg, &pci_mmcfg_list, list)
+               if (cfg->segment == segment &&
+                   cfg->start_bus <= bus && bus <= cfg->end_bus)
+                       return cfg;
+
+       return NULL;
+}
+
 static const char __init *pci_mmcfg_e7520(void)
 {
        u32 win;
index c04523e..90d5fd4 100644 (file)
@@ -27,15 +27,10 @@ static int mmcfg_last_accessed_cpu;
  */
 static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn)
 {
-       struct pci_mmcfg_region *cfg;
+       struct pci_mmcfg_region *cfg = pci_mmconfig_lookup(seg, bus);
 
-       list_for_each_entry(cfg, &pci_mmcfg_list, list)
-               if (cfg->segment == seg &&
-                   (cfg->start_bus <= bus) &&
-                   (cfg->end_bus >= bus))
-                       return cfg->address;
-
-       /* Fall back to type 0 */
+       if (cfg)
+               return cfg->address;
        return 0;
 }
 
index cfa6cdb..e783841 100644 (file)
 
 #define PREFIX "PCI: "
 
-static char __iomem *get_virt(unsigned int seg, unsigned bus)
-{
-       struct pci_mmcfg_region *cfg;
-
-       list_for_each_entry(cfg, &pci_mmcfg_list, list)
-               if (cfg->segment == seg &&
-                   (cfg->start_bus <= bus) &&
-                   (cfg->end_bus >= bus))
-                       return cfg->virt;
-
-       /* Fall back to type 0 */
-       return NULL;
-}
-
 static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn)
 {
-       char __iomem *addr;
+       struct pci_mmcfg_region *cfg = pci_mmconfig_lookup(seg, bus);
 
-       addr = get_virt(seg, bus);
-       if (!addr)
-               return NULL;
-       return addr + (PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12));
+       if (cfg && cfg->virt)
+               return cfg->virt + (PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12));
+       return NULL;
 }
 
 static int pci_mmcfg_read(unsigned int seg, unsigned int bus,