I forgot to rename pci_mmcfg_for_each_region() content. Will send fixed patch.
Tomasz
On 10.03.2015 12:35, Tomasz Nowicki wrote:
This commit is consequence of making x86 MMCONFIG code available for all architectures. Current code has old name fashion so for the sake of making it more understandable and express where it comes from, we are changing functions/variables/macros etc. name *mmconfig* -> *ecam*
Signed-off-by: Tomasz Nowicki tomasz.nowicki@linaro.org
arch/x86/pci/acpi.c | 2 +- arch/x86/pci/mmconfig-shared.c | 64 ++++++++-------- arch/x86/pci/mmconfig_32.c | 16 ++-- arch/x86/pci/numachip.c | 2 +- drivers/acpi/mcfg.c | 22 +++--- drivers/pci/ecam.c | 162 ++++++++++++++++++++--------------------- drivers/xen/pci.c | 6 +- include/linux/ecam.h | 42 +++++------ 8 files changed, 158 insertions(+), 158 deletions(-)
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 5dfccef..fa3ef35 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -199,7 +199,7 @@ static int setup_mcfg_map(struct pci_root_info *info, u16 seg, u8 start, static void teardown_mcfg_map(struct pci_root_info *info) { if (info->mcfg_added) {
pci_mmconfig_delete(info->segment, info->start_bus,
info->mcfg_added = false; }pci_ecam_delete(info->segment, info->start_bus, info->end_bus);
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c index 6dfe614..719dccf 100644 --- a/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c @@ -30,8 +30,8 @@ static bool pci_mmcfg_running_state; static bool pci_mmcfg_arch_init_failed;
const struct pci_raw_ops pci_mmcfg = {
- .read = pci_mmcfg_read,
- .write = pci_mmcfg_write,
.read = pci_ecam_read,
.write = pci_ecam_write, };
static u32
@@ -70,7 +70,7 @@ pci_mmconfig_amd_write(int len, void __iomem *addr, u32 value) } }
-static struct pci_mmcfg_mmio_ops pci_mmcfg_mmio_amd_fam10h = { +static struct pci_ecam_mmio_ops pci_mmcfg_mmio_amd_fam10h = { .read = pci_mmconfig_amd_read, .write = pci_mmconfig_amd_write, }; @@ -84,7 +84,7 @@ static const char *__init pci_mmcfg_e7520(void) if (win == 0x0000 || win == 0xf000) return NULL;
- if (pci_mmconfig_add(0, 0, 255, win << 16) == NULL)
if (pci_ecam_add(0, 0, 255, win << 16) == NULL) return NULL;
return "Intel Corporation E7520 Memory Controller Hub";
@@ -128,7 +128,7 @@ static const char *__init pci_mmcfg_intel_945(void) if ((pciexbar & mask) >= 0xf0000000U) return NULL;
- if (pci_mmconfig_add(0, 0, (len >> 20) - 1, pciexbar & mask) == NULL)
if (pci_ecam_add(0, 0, (len >> 20) - 1, pciexbar & mask) == NULL) return NULL;
return "Intel Corporation 945G/GZ/P/PL Express Memory Controller Hub";
@@ -175,13 +175,13 @@ static const char *__init pci_mmcfg_amd_fam10h(void)
end_bus = (1 << busnbits) - 1; for (i = 0; i < (1 << segnbits); i++)
if (pci_mmconfig_add(i, 0, end_bus,
if (pci_ecam_add(i, 0, end_bus, base + (1<<28) * i) == NULL) {
free_all_mmcfg();
}pci_ecam_free_all(); return NULL;
- pci_mmconfig_register_mmio(&pci_mmcfg_mmio_amd_fam10h);
pci_ecam_register_mmio(&pci_mmcfg_mmio_amd_fam10h);
return "AMD Family 10h NB"; }
@@ -210,7 +210,7 @@ static const char *__init pci_mmcfg_nvidia_mcp55(void) /* * do check if amd fam10h already took over */
- if (!acpi_disabled || !list_empty(&pci_mmcfg_list) || mcp55_checked)
if (!acpi_disabled || !list_empty(&pci_ecam_list) || mcp55_checked) return NULL;
mcp55_checked = true;
@@ -239,7 +239,7 @@ static const char *__init pci_mmcfg_nvidia_mcp55(void) base <<= extcfg_base_lshift; start = (extcfg & extcfg_start_mask) >> extcfg_start_shift; end = start + extcfg_sizebus[size_index] - 1;
if (pci_mmconfig_add(0, start, end, base) == NULL)
mcp55_mmconf_found++; }if (pci_ecam_add(0, start, end, base) == NULL) continue;
@@ -273,15 +273,15 @@ static const struct pci_mmcfg_hostbridge_probe pci_mmcfg_probes[] __initconst =
static void __init pci_mmcfg_check_end_bus_number(void) {
- struct pci_mmcfg_region *cfg, *cfgx;
struct pci_ecam_region *cfg, *cfgx;
/* Fixup overlaps */
- list_for_each_entry(cfg, &pci_mmcfg_list, list) {
list_for_each_entry(cfg, &pci_ecam_list, list) { if (cfg->end_bus < cfg->start_bus) cfg->end_bus = 255;
/* Don't access the list head ! */
if (cfg->list.next == &pci_mmcfg_list)
if (cfg->list.next == &pci_ecam_list) break;
cfgx = list_entry(cfg->list.next, typeof(*cfg), list);
@@ -301,7 +301,7 @@ static int __init pci_mmcfg_check_hostbridge(void) if (!raw_pci_ops) return 0;
- free_all_mmcfg();
pci_ecam_free_all();
for (i = 0; i < ARRAY_SIZE(pci_mmcfg_probes); i++) { bus = pci_mmcfg_probes[i].bus;
@@ -322,7 +322,7 @@ static int __init pci_mmcfg_check_hostbridge(void) /* some end_bus_number is crazy, fix it */ pci_mmcfg_check_end_bus_number();
- return !list_empty(&pci_mmcfg_list);
return !list_empty(&pci_ecam_list); }
static acpi_status check_mcfg_resource(struct acpi_resource *res, void *data)
@@ -395,7 +395,7 @@ static int is_acpi_reserved(u64 start, u64 end, unsigned not_used) typedef int (*check_reserved_t)(u64 start, u64 end, unsigned type);
static int __ref is_mmconf_reserved(check_reserved_t is_reserved,
struct pci_mmcfg_region *cfg,
{ u64 addr = cfg->res.start;struct pci_ecam_region *cfg, struct device *dev, int with_e820)
@@ -425,8 +425,8 @@ static int __ref is_mmconf_reserved(check_reserved_t is_reserved, cfg->end_bus = cfg->start_bus + ((size>>20) - 1); num_buses = cfg->end_bus - cfg->start_bus + 1; cfg->res.end = cfg->res.start +
PCI_MMCFG_BUS_OFFSET(num_buses) - 1;
snprintf(cfg->name, PCI_MMCFG_RESOURCE_NAME_LEN,
PCI_ECAM_BUS_OFFSET(num_buses) - 1;
snprintf(cfg->name, PCI_ECAM_RESOURCE_NAME_LEN, "PCI MMCONFIG %04x [bus %02x-%02x]", cfg->segment, cfg->start_bus, cfg->end_bus);
@@ -447,7 +447,7 @@ static int __ref is_mmconf_reserved(check_reserved_t is_reserved, }
static int __ref pci_mmcfg_check_reserved(struct device *dev,
struct pci_mmcfg_region *cfg, int early)
{ if (!early && !acpi_disabled) { if (is_mmconf_reserved(is_acpi_reserved, cfg, dev, 0))struct pci_ecam_region *cfg, int early)
@@ -484,12 +484,12 @@ static int __ref pci_mmcfg_check_reserved(struct device *dev,
static void __init pci_mmcfg_reject_broken(int early) {
- struct pci_mmcfg_region *cfg;
- struct pci_ecam_region *cfg;
- list_for_each_entry(cfg, &pci_mmcfg_list, list) {
- list_for_each_entry(cfg, &pci_ecam_list, list) { if (pci_mmcfg_check_reserved(NULL, cfg, early) == 0) { pr_info(PREFIX "not using MMCONFIG\n");
free_all_mmcfg();
} }pci_ecam_free_all(); return;
@@ -524,24 +524,24 @@ static int pci_mmcfg_for_each_region(int (*func)(__u64 start, __u64 size, static void __init __pci_mmcfg_init(int early) { pci_mmcfg_reject_broken(early);
- if (list_empty(&pci_mmcfg_list))
if (list_empty(&pci_ecam_list)) return;
if (pcibios_last_bus < 0) {
const struct pci_mmcfg_region *cfg;
const struct pci_ecam_region *cfg;
list_for_each_entry(cfg, &pci_mmcfg_list, list) {
} }list_for_each_entry(cfg, &pci_ecam_list, list) { if (cfg->segment) break; pcibios_last_bus = cfg->end_bus;
- if (pci_mmcfg_arch_init()) {
- if (pci_ecam_arch_init()) { raw_pci_ext_ops = &pci_mmcfg; pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; } else {
free_all_mmcfg();
pci_mmcfg_arch_init_failed = true; } }pci_ecam_free_all();
@@ -579,7 +579,7 @@ void __init pci_mmcfg_late_init(void)
static int __init pci_mmcfg_late_insert_resources(void) {
- struct pci_mmcfg_region *cfg;
struct pci_ecam_region *cfg;
pci_mmcfg_running_state = true;
@@ -592,7 +592,7 @@ static int __init pci_mmcfg_late_insert_resources(void) * marked so it won't cause request errors when __request_region is * called. */
- list_for_each_entry(cfg, &pci_mmcfg_list, list)
- list_for_each_entry(cfg, &pci_ecam_list, list) if (!cfg->res.parent) insert_resource(&iomem_resource, &cfg->res);
@@ -612,7 +612,7 @@ int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end, { int rc; struct resource *tmp = NULL;
- struct pci_mmcfg_region *cfg;
struct pci_ecam_region *cfg;
if (!(pci_probe & PCI_PROBE_MMCONF) || pci_mmcfg_arch_init_failed) return -ENODEV;
@@ -621,7 +621,7 @@ int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end, return -EINVAL;
rc = -EBUSY;
- cfg = pci_mmconfig_alloc(seg, start, end, addr);
- cfg = pci_ecam_alloc(seg, start, end, addr); if (cfg == NULL) { dev_warn(dev, "fail to add MMCONFIG (out of memory)\n"); return -ENOMEM;
@@ -642,7 +642,7 @@ int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end, goto error; }
- rc = pci_mmconfig_inject(cfg);
- rc = pci_ecam_inject(cfg); if (rc) goto error;
diff --git a/arch/x86/pci/mmconfig_32.c b/arch/x86/pci/mmconfig_32.c index 7a050cb..27e707d 100644 --- a/arch/x86/pci/mmconfig_32.c +++ b/arch/x86/pci/mmconfig_32.c @@ -28,7 +28,7 @@ static int mmcfg_last_accessed_cpu; */ static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn) {
- struct pci_mmcfg_region *cfg = pci_mmconfig_lookup(seg, bus);
struct pci_ecam_region *cfg = pci_ecam_lookup(seg, bus);
if (cfg) return cfg->address;
@@ -40,7 +40,7 @@ static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn) */ static void pci_exp_set_dev_base(unsigned int base, int bus, int devfn) {
- u32 dev_base = base | PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12);
- u32 dev_base = base | PCI_ECAM_BUS_OFFSET(bus) | (devfn << 12); int cpu = smp_processor_id(); if (dev_base != mmcfg_last_accessed_device || cpu != mmcfg_last_accessed_cpu) {
@@ -50,7 +50,7 @@ static void pci_exp_set_dev_base(unsigned int base, int bus, int devfn) } }
-int pci_mmcfg_read(unsigned int seg, unsigned int bus, +int pci_ecam_read(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 *value) { unsigned long flags; @@ -79,7 +79,7 @@ err: *value = -1; return 0; }
-int pci_mmcfg_write(unsigned int seg, unsigned int bus, +int pci_ecam_write(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 value) { unsigned long flags; @@ -106,22 +106,22 @@ int pci_mmcfg_write(unsigned int seg, unsigned int bus, return 0; }
-int __init pci_mmcfg_arch_init(void) +int __init pci_ecam_arch_init(void) { printk(KERN_INFO "PCI: Using MMCONFIG for extended config space\n"); return 1; }
-void __init pci_mmcfg_arch_free(void) +void __init pci_ecam_arch_free(void) { }
-int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg) +int pci_ecam_arch_map(struct pci_ecam_region *cfg) { return 0; }
-void pci_mmcfg_arch_unmap(struct pci_mmcfg_region *cfg) +void pci_ecam_arch_unmap(struct pci_ecam_region *cfg) { unsigned long flags;
diff --git a/arch/x86/pci/numachip.c b/arch/x86/pci/numachip.c index 01868b6..f60d403 100644 --- a/arch/x86/pci/numachip.c +++ b/arch/x86/pci/numachip.c @@ -21,7 +21,7 @@ static u8 limit __read_mostly;
static inline char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn) {
- struct pci_mmcfg_region *cfg = pci_mmconfig_lookup(seg, bus);
struct pci_ecam_region *cfg = pci_ecam_lookup(seg, bus);
if (cfg && cfg->virt) return cfg->virt + (PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12));
diff --git a/drivers/acpi/mcfg.c b/drivers/acpi/mcfg.c index e285f62..40926a3 100644 --- a/drivers/acpi/mcfg.c +++ b/drivers/acpi/mcfg.c @@ -24,13 +24,13 @@ int __weak raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, int reg, int len, u32 *val) {
- return pci_mmcfg_read(domain, bus, devfn, reg, len, val);
return pci_ecam_read(domain, bus, devfn, reg, len, val); }
int __weak raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn, int reg, int len, u32 val) {
- return pci_mmcfg_write(domain, bus, devfn, reg, len, val);
return pci_ecam_write(domain, bus, devfn, reg, len, val); }
static int __init acpi_mcfg_check_entry(struct acpi_table_mcfg *mcfg,
@@ -69,7 +69,7 @@ int __init acpi_parse_mcfg(struct acpi_table_header *header) mcfg = (struct acpi_table_mcfg *)header;
/* how many config structures do we have */
- free_all_mmcfg();
- pci_ecam_free_all(); entries = 0; i = header->length - sizeof(struct acpi_table_mcfg); while (i >= sizeof(struct acpi_mcfg_allocation)) {
@@ -85,14 +85,14 @@ int __init acpi_parse_mcfg(struct acpi_table_header *header) for (i = 0; i < entries; i++) { cfg = &cfg_table[i]; if (acpi_mcfg_check_entry(mcfg, cfg)) {
free_all_mmcfg();
}pci_ecam_free_all(); return -ENODEV;
if (pci_mmconfig_add(cfg->pci_segment, cfg->start_bus_number,
if (pci_ecam_add(cfg->pci_segment, cfg->start_bus_number, cfg->end_bus_number, cfg->address) == NULL) { pr_warn(PREFIX "no memory for MCFG entries\n");
free_all_mmcfg();
} }pci_ecam_free_all(); return -ENOMEM;
@@ -107,15 +107,15 @@ void __init __weak pci_mmcfg_early_init(void)
void __init __weak pci_mmcfg_late_init(void) {
- struct pci_mmcfg_region *cfg;
struct pci_ecam_region *cfg;
acpi_table_parse(ACPI_SIG_MCFG, acpi_parse_mcfg);
- if (list_empty(&pci_mmcfg_list))
- if (list_empty(&pci_ecam_list)) return;
- if (!pci_mmcfg_arch_init())
free_all_mmcfg();
- if (!pci_ecam_arch_init())
pci_ecam_free_all();
- list_for_each_entry(cfg, &pci_mmcfg_list, list)
- list_for_each_entry(cfg, &pci_ecam_list, list) insert_resource(&iomem_resource, &cfg->res); }
diff --git a/drivers/pci/ecam.c b/drivers/pci/ecam.c index f886796..6396944 100644 --- a/drivers/pci/ecam.c +++ b/drivers/pci/ecam.c @@ -15,24 +15,24 @@ #include <linux/rculist.h> #include <linux/ecam.h>
-#define PREFIX "PCI: " +#define PREFIX "PCI ECAM: "
-static DEFINE_MUTEX(pci_mmcfg_lock); +static DEFINE_MUTEX(pci_ecam_lock);
-LIST_HEAD(pci_mmcfg_list); +LIST_HEAD(pci_ecam_list);
#ifdef CONFIG_PCI_ECAM_GENERIC static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn) {
- struct pci_mmcfg_region *cfg = pci_mmconfig_lookup(seg, bus);
struct pci_ecam_region *cfg = pci_ecam_lookup(seg, bus);
if (cfg && cfg->virt)
return cfg->virt + (PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12));
return NULL; }return cfg->virt + (PCI_ECAM_BUS_OFFSET(bus) | (devfn << 12));
-int pci_mmcfg_read(unsigned int seg, unsigned int bus, +int pci_ecam_read(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 *value) { char __iomem *addr; @@ -56,7 +56,7 @@ err: *value = -1; return 0; }
-int pci_mmcfg_write(unsigned int seg, unsigned int bus, +int pci_ecam_write(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 value) { char __iomem *addr; @@ -78,64 +78,64 @@ int pci_mmcfg_write(unsigned int seg, unsigned int bus, return 0; }
-static void __iomem *mcfg_ioremap(struct pci_mmcfg_region *cfg) +static void __iomem *pci_ecam_ioremap(struct pci_ecam_region *cfg) { void __iomem *addr; u64 start, size; int num_buses;
- start = cfg->address + PCI_MMCFG_BUS_OFFSET(cfg->start_bus);
- start = cfg->address + PCI_ECAM_BUS_OFFSET(cfg->start_bus); num_buses = cfg->end_bus - cfg->start_bus + 1;
- size = PCI_MMCFG_BUS_OFFSET(num_buses);
- size = PCI_ECAM_BUS_OFFSET(num_buses); addr = ioremap_nocache(start, size); if (addr)
addr -= PCI_MMCFG_BUS_OFFSET(cfg->start_bus);
return addr; }addr -= PCI_ECAM_BUS_OFFSET(cfg->start_bus);
-int __init pci_mmcfg_arch_init(void) +int __init pci_ecam_arch_init(void) {
- struct pci_mmcfg_region *cfg;
- struct pci_ecam_region *cfg;
- list_for_each_entry(cfg, &pci_mmcfg_list, list)
if (pci_mmcfg_arch_map(cfg)) {
pci_mmcfg_arch_free();
list_for_each_entry(cfg, &pci_ecam_list, list)
if (pci_ecam_arch_map(cfg)) {
pci_ecam_arch_free(); return 0;
}
return 1; }
-void __init pci_mmcfg_arch_free(void) +void __init pci_ecam_arch_free(void) {
- struct pci_mmcfg_region *cfg;
- struct pci_ecam_region *cfg;
- list_for_each_entry(cfg, &pci_mmcfg_list, list)
pci_mmcfg_arch_unmap(cfg);
- list_for_each_entry(cfg, &pci_ecam_list, list)
}pci_ecam_arch_unmap(cfg);
-int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg) +int pci_ecam_arch_map(struct pci_ecam_region *cfg) {
- cfg->virt = mcfg_ioremap(cfg);
- cfg->virt = pci_ecam_ioremap(cfg); if (!cfg->virt) {
pr_err(PREFIX "can't map MMCONFIG at %pR\n", &cfg->res);
pr_err(PREFIX "can't map ECAM at %pR\n", &cfg->res);
return -ENOMEM; }
return 0; }
-void pci_mmcfg_arch_unmap(struct pci_mmcfg_region *cfg) +void pci_ecam_arch_unmap(struct pci_ecam_region *cfg) { if (cfg && cfg->virt) {
iounmap(cfg->virt + PCI_MMCFG_BUS_OFFSET(cfg->start_bus));
iounmap(cfg->virt + PCI_ECAM_BUS_OFFSET(cfg->start_bus));
cfg->virt = NULL; } } #endif
static u32
-pci_mmconfig_generic_read(int len, void __iomem *addr) +pci_ecam_generic_read(int len, void __iomem *addr) { u32 data = 0;
@@ -155,7 +155,7 @@ pci_mmconfig_generic_read(int len, void __iomem *addr) }
static void -pci_mmconfig_generic_write(int len, void __iomem *addr, u32 value) +pci_ecam_generic_write(int len, void __iomem *addr, u32 value) { switch (len) { case 1: @@ -170,42 +170,42 @@ pci_mmconfig_generic_write(int len, void __iomem *addr, u32 value) } }
-static struct pci_mmcfg_mmio_ops pci_mmcfg_mmio_default = {
- .read = pci_mmconfig_generic_read,
- .write = pci_mmconfig_generic_write,
+static struct pci_ecam_mmio_ops pci_ecam_mmio_default = {
- .read = pci_ecam_generic_read,
- .write = pci_ecam_generic_write, };
-static struct pci_mmcfg_mmio_ops *pci_mmcfg_mmio = &pci_mmcfg_mmio_default; +static struct pci_ecam_mmio_ops *pci_ecam_mmio = &pci_ecam_mmio_default;
void -pci_mmconfig_register_mmio(struct pci_mmcfg_mmio_ops *ops) +pci_ecam_register_mmio(struct pci_ecam_mmio_ops *ops) {
- pci_mmcfg_mmio = ops;
pci_ecam_mmio = ops; }
u32 pci_mmio_read(int len, void __iomem *addr) {
- if (!pci_mmcfg_mmio) {
- if (!pci_ecam_mmio) { pr_err("PCI config space has no accessors !"); return 0; }
- return pci_mmcfg_mmio->read(len, addr);
return pci_ecam_mmio->read(len, addr); }
void pci_mmio_write(int len, void __iomem *addr, u32 value) {
- if (!pci_mmcfg_mmio) {
- if (!pci_ecam_mmio) { pr_err("PCI config space has no accessors !"); return; }
- pci_mmcfg_mmio->write(len, addr, value);
- pci_ecam_mmio->write(len, addr, value); }
-static void __init pci_mmconfig_remove(struct pci_mmcfg_region *cfg) +static void __init pci_ecam_remove(struct pci_ecam_region *cfg) { if (cfg->res.parent) release_resource(&cfg->res); @@ -213,21 +213,21 @@ static void __init pci_mmconfig_remove(struct pci_mmcfg_region *cfg) kfree(cfg); }
-void __init free_all_mmcfg(void) +void __init pci_ecam_free_all(void) {
- struct pci_mmcfg_region *cfg, *tmp;
- struct pci_ecam_region *cfg, *tmp;
- pci_mmcfg_arch_free();
- list_for_each_entry_safe(cfg, tmp, &pci_mmcfg_list, list)
pci_mmconfig_remove(cfg);
- pci_ecam_arch_free();
- list_for_each_entry_safe(cfg, tmp, &pci_ecam_list, list)
}pci_ecam_remove(cfg);
-void list_add_sorted(struct pci_mmcfg_region *new) +void pci_ecam_list_add_sorted(struct pci_ecam_region *new) {
- struct pci_mmcfg_region *cfg;
struct pci_ecam_region *cfg;
/* keep list sorted by segment and starting bus number */
- list_for_each_entry_rcu(cfg, &pci_mmcfg_list, list) {
- list_for_each_entry_rcu(cfg, &pci_ecam_list, list) { if (cfg->segment > new->segment || (cfg->segment == new->segment && cfg->start_bus >= new->start_bus)) {
@@ -235,13 +235,13 @@ void list_add_sorted(struct pci_mmcfg_region *new) return; } }
- list_add_tail_rcu(&new->list, &pci_mmcfg_list);
- list_add_tail_rcu(&new->list, &pci_ecam_list); }
-struct pci_mmcfg_region *pci_mmconfig_alloc(int segment, int start, +struct pci_ecam_region *pci_ecam_alloc(int segment, int start, int end, u64 addr) {
- struct pci_mmcfg_region *new;
struct pci_ecam_region *new; struct resource *res;
if (addr == 0)
@@ -257,29 +257,29 @@ struct pci_mmcfg_region *pci_mmconfig_alloc(int segment, int start, new->end_bus = end;
res = &new->res;
- res->start = addr + PCI_MMCFG_BUS_OFFSET(start);
- res->end = addr + PCI_MMCFG_BUS_OFFSET(end + 1) - 1;
- res->start = addr + PCI_ECAM_BUS_OFFSET(start);
- res->end = addr + PCI_ECAM_BUS_OFFSET(end + 1) - 1; res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
- snprintf(new->name, PCI_MMCFG_RESOURCE_NAME_LEN,
"PCI MMCONFIG %04x [bus %02x-%02x]", segment, start, end);
snprintf(new->name, PCI_ECAM_RESOURCE_NAME_LEN,
"PCI ECAM %04x [bus %02x-%02x]", segment, start, end);
res->name = new->name;
return new; }
-struct pci_mmcfg_region *pci_mmconfig_add(int segment, int start, +struct pci_ecam_region *pci_ecam_add(int segment, int start, int end, u64 addr) {
- struct pci_mmcfg_region *new;
- struct pci_ecam_region *new;
- new = pci_mmconfig_alloc(segment, start, end, addr);
- new = pci_ecam_alloc(segment, start, end, addr); if (new) {
mutex_lock(&pci_mmcfg_lock);
list_add_sorted(new);
mutex_unlock(&pci_mmcfg_lock);
mutex_lock(&pci_ecam_lock);
pci_ecam_list_add_sorted(new);
mutex_unlock(&pci_ecam_lock);
pr_info(PREFIX
"MMCONFIG for domain %04x [bus %02x-%02x] at %pR "
}"ECAM for domain %04x [bus %02x-%02x] at %pR " "(base %#lx)\n", segment, start, end, &new->res, (unsigned long)addr);
@@ -287,11 +287,11 @@ 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_ecam_region *pci_ecam_lookup(int segment, int bus) {
- struct pci_mmcfg_region *cfg;
- struct pci_ecam_region *cfg;
- list_for_each_entry_rcu(cfg, &pci_mmcfg_list, list)
- list_for_each_entry_rcu(cfg, &pci_ecam_list, list) if (cfg->segment == segment && cfg->start_bus <= bus && bus <= cfg->end_bus) return cfg;
@@ -299,39 +299,39 @@ struct pci_mmcfg_region *pci_mmconfig_lookup(int segment, int bus) return NULL; }
-/* Delete MMCFG information for host bridges */ -int pci_mmconfig_delete(u16 seg, u8 start, u8 end) +/* Delete ECAM information for host bridges */ +int pci_ecam_delete(u16 seg, u8 start, u8 end) {
- struct pci_mmcfg_region *cfg;
- struct pci_ecam_region *cfg;
- mutex_lock(&pci_mmcfg_lock);
- list_for_each_entry_rcu(cfg, &pci_mmcfg_list, list)
- mutex_lock(&pci_ecam_lock);
- list_for_each_entry_rcu(cfg, &pci_ecam_list, list) if (cfg->segment == seg && cfg->start_bus == start && cfg->end_bus == end) { list_del_rcu(&cfg->list); synchronize_rcu();
pci_mmcfg_arch_unmap(cfg);
pci_ecam_arch_unmap(cfg); if (cfg->res.parent) release_resource(&cfg->res);
mutex_unlock(&pci_mmcfg_lock);
}mutex_unlock(&pci_ecam_lock); kfree(cfg); return 0;
- mutex_unlock(&pci_mmcfg_lock);
mutex_unlock(&pci_ecam_lock);
return -ENOENT; }
-int pci_mmconfig_inject(struct pci_mmcfg_region *cfg) +int pci_ecam_inject(struct pci_ecam_region *cfg) {
- struct pci_mmcfg_region *cfg_conflict;
- struct pci_ecam_region *cfg_conflict; int err = 0;
- mutex_lock(&pci_mmcfg_lock);
- cfg_conflict = pci_mmconfig_lookup(cfg->segment, cfg->start_bus);
- mutex_lock(&pci_ecam_lock);
- cfg_conflict = pci_ecam_lookup(cfg->segment, cfg->start_bus); if (cfg_conflict) { if (cfg_conflict->end_bus < cfg->end_bus)
pr_info(FW_INFO "MMCONFIG for "
pr_info(FW_INFO "ECAM for " "domain %04x [bus %02x-%02x] " "only partially covers this bridge\n", cfg_conflict->segment, cfg_conflict->start_bus,
@@ -340,17 +340,17 @@ int pci_mmconfig_inject(struct pci_mmcfg_region *cfg) goto out; }
- if (pci_mmcfg_arch_map(cfg)) {
pr_warn("fail to map MMCONFIG %pR.\n", &cfg->res);
- if (pci_ecam_arch_map(cfg)) {
err = -ENOMEM; goto out; } else {pr_warn("fail to map ECAM %pR.\n", &cfg->res);
list_add_sorted(cfg);
pr_info("MMCONFIG at %pR (base %#lx)\n",
pci_ecam_list_add_sorted(cfg);
pr_info("ECAM at %pR (base %#lx)\n", &cfg->res, (unsigned long)cfg->address);
} out:
- mutex_unlock(&pci_mmcfg_lock);
- mutex_unlock(&pci_ecam_lock); return err; }
diff --git a/drivers/xen/pci.c b/drivers/xen/pci.c index 95ee430..eff4035 100644 --- a/drivers/xen/pci.c +++ b/drivers/xen/pci.c @@ -204,7 +204,7 @@ arch_initcall(register_xen_pci_notifier); #ifdef CONFIG_PCI_MMCONFIG static int __init xen_mcfg_late(void) {
- struct pci_mmcfg_region *cfg;
struct pci_ecam_region *cfg; int rc;
if (!xen_initial_domain())
@@ -213,11 +213,11 @@ static int __init xen_mcfg_late(void) if ((pci_probe & PCI_PROBE_MMCONF) == 0) return 0;
- if (list_empty(&pci_mmcfg_list))
if (list_empty(&pci_ecam_list)) return 0;
/* Check whether they are in the right area. */
- list_for_each_entry(cfg, &pci_mmcfg_list, list) {
list_for_each_entry(cfg, &pci_ecam_list, list) { struct physdev_pci_mmcfg_reserved r;
r.address = cfg->address;
diff --git a/include/linux/ecam.h b/include/linux/ecam.h index fba5d6b..363691b 100644 --- a/include/linux/ecam.h +++ b/include/linux/ecam.h @@ -5,10 +5,10 @@ #include <linux/types.h> #include <linux/acpi.h>
-/* "PCI MMCONFIG %04x [bus %02x-%02x]" */ -#define PCI_MMCFG_RESOURCE_NAME_LEN (22 + 4 + 2 + 2) +/* "PCI ECAM %04x [bus %02x-%02x]" */ +#define PCI_ECAM_RESOURCE_NAME_LEN (22 + 4 + 2 + 2)
-struct pci_mmcfg_region { +struct pci_ecam_region { struct list_head list; struct resource res; u64 address; @@ -16,40 +16,40 @@ struct pci_mmcfg_region { u16 segment; u8 start_bus; u8 end_bus;
- char name[PCI_MMCFG_RESOURCE_NAME_LEN];
- char name[PCI_ECAM_RESOURCE_NAME_LEN]; };
-struct pci_mmcfg_mmio_ops { +struct pci_ecam_mmio_ops { u32 (*read)(int len, void __iomem *addr); void (*write)(int len, void __iomem *addr, u32 value); };
-struct pci_mmcfg_region *pci_mmconfig_lookup(int segment, int bus); -struct pci_mmcfg_region *pci_mmconfig_alloc(int segment, int start, +struct pci_ecam_region *pci_ecam_lookup(int segment, int bus); +struct pci_ecam_region *pci_ecam_alloc(int segment, int start, int end, u64 addr); -int pci_mmconfig_inject(struct pci_mmcfg_region *cfg); -struct pci_mmcfg_region *pci_mmconfig_add(int segment, int start, +int pci_ecam_inject(struct pci_ecam_region *cfg); +struct pci_ecam_region *pci_ecam_add(int segment, int start, int end, u64 addr); -void list_add_sorted(struct pci_mmcfg_region *new); -void free_all_mmcfg(void); -int pci_mmconfig_delete(u16 seg, u8 start, u8 end); +void pci_ecam_list_add_sorted(struct pci_ecam_region *new); +void pci_ecam_free_all(void); +int pci_ecam_delete(u16 seg, u8 start, u8 end);
/* Arch specific calls */ -int pci_mmcfg_arch_init(void); -void pci_mmcfg_arch_free(void); -int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg); -void pci_mmcfg_arch_unmap(struct pci_mmcfg_region *cfg); +int pci_ecam_arch_init(void); +void pci_ecam_arch_free(void); +int pci_ecam_arch_map(struct pci_ecam_region *cfg); +void pci_ecam_arch_unmap(struct pci_ecam_region *cfg); extern u32 pci_mmio_read(int len, void __iomem *addr); extern void pci_mmio_write(int len, void __iomem *addr, u32 value); -extern void pci_mmconfig_register_mmio(struct pci_mmcfg_mmio_ops *ops); +extern void pci_ecam_register_mmio(struct pci_ecam_mmio_ops *ops);
-extern struct list_head pci_mmcfg_list; +extern struct list_head pci_ecam_list;
-#define PCI_MMCFG_BUS_OFFSET(bus) ((bus) << 20) +#define PCI_ECAM_BUS_OFFSET(bus) ((bus) << 20)
-int pci_mmcfg_read(unsigned int seg, unsigned int bus, +int pci_ecam_read(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 *value); -int pci_mmcfg_write(unsigned int seg, unsigned int bus, +int pci_ecam_write(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 value);
#endif /* __KERNEL__ */