x86/PCI: MMCONFIG: add lookup function

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>
tirimbino
Bjorn Helgaas 15 years ago committed by Jesse Barnes
parent 8c57786ad3
commit f6e1d8cc38
  1. 1
      arch/x86/include/asm/pci_x86.h
  2. 12
      arch/x86/pci/mmconfig-shared.c
  3. 11
      arch/x86/pci/mmconfig_32.c
  4. 23
      arch/x86/pci/mmconfig_64.c

@ -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;

@ -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;

@ -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;
}

@ -14,28 +14,13 @@
#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,

Loading…
Cancel
Save