Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 174819
b: refs/heads/master
c: f6e1d8c
h: refs/heads/master
i:
  174817: bf6bb1c
  174815: b4c7581
v: v3
  • Loading branch information
Bjorn Helgaas authored and Jesse Barnes committed Nov 24, 2009
1 parent 40a123f commit e08a311
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8c57786ad3d921713c7ad8e44132aa537a1d0fec
refs/heads/master: f6e1d8cc38b3776038fb15d3acc82ed8bb552f82
1 change: 1 addition & 0 deletions trunk/arch/x86/include/asm/pci_x86.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
12 changes: 12 additions & 0 deletions trunk/arch/x86/pci/mmconfig-shared.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
11 changes: 3 additions & 8 deletions trunk/arch/x86/pci/mmconfig_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
23 changes: 4 additions & 19 deletions trunk/arch/x86/pci/mmconfig_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit e08a311

Please sign in to comment.