]> xenbits.xensource.com Git - people/julieng/linux-arm.git/commitdiff
x86, acpi, pci: mmconfig_64.c becomes default implementation for arch agnostic low...
authorTomasz Nowicki <tomasz.nowicki@linaro.org>
Fri, 14 Nov 2014 09:05:36 +0000 (10:05 +0100)
committerJulien Grall <julien.grall@citrix.com>
Mon, 28 Sep 2015 11:05:20 +0000 (12:05 +0100)
Note that x86 32bits machines still have its own low-level direct
PCI config space accessors.

Signed-off-by: Tomasz Nowicki <tomasz.nowicki@linaro.org>
Signed-off-by: Vadim Lomovtsev <Vadim.Lomovtsev@caviumnetworks.com>
arch/x86/pci/Makefile
arch/x86/pci/mmconfig_64.c [deleted file]
drivers/acpi/mmconfig.c

index 5c6fc3577a49f80a75c86cd3815a6c5758ba1288..35c765b01aab1067aef89899ab5f3ba40df037aa 100644 (file)
@@ -1,7 +1,10 @@
 obj-y                          := i386.o init.o
 
 obj-$(CONFIG_PCI_BIOS)         += pcbios.o
-obj-$(CONFIG_PCI_MMCONFIG)     += mmconfig_$(BITS).o direct.o mmconfig-shared.o
+obj-$(CONFIG_PCI_MMCONFIG)     += direct.o mmconfig-shared.o
+ifeq ($(BITS),32)
+obj-$(CONFIG_PCI_MMCONFIG)     += mmconfig_32.o
+endif
 obj-$(CONFIG_PCI_DIRECT)       += direct.o
 obj-$(CONFIG_PCI_OLPC)         += olpc.o
 obj-$(CONFIG_PCI_XEN)          += xen.o
diff --git a/arch/x86/pci/mmconfig_64.c b/arch/x86/pci/mmconfig_64.c
deleted file mode 100644 (file)
index ff2c50c..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * mmconfig.c - Low-level direct PCI config space access via MMCONFIG
- *
- * This is an 64bit optimized version that always keeps the full mmconfig
- * space mapped. This allows lockless config space operation.
- */
-
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/acpi.h>
-#include <linux/bitmap.h>
-#include <linux/rcupdate.h>
-#include <linux/mmconfig.h>
-#include <asm/e820.h>
-#include <asm/pci_x86.h>
-
-#define PREFIX "PCI: "
-
-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);
-
-       if (cfg && cfg->virt)
-               return cfg->virt + (PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12));
-       return NULL;
-}
-
-int pci_mmcfg_read(unsigned int seg, unsigned int bus,
-                         unsigned int devfn, int reg, int len, u32 *value)
-{
-       char __iomem *addr;
-
-       /* Why do we have this when nobody checks it. How about a BUG()!? -AK */
-       if (unlikely((bus > 255) || (devfn > 255) || (reg > 4095))) {
-err:           *value = -1;
-               return -EINVAL;
-       }
-
-       rcu_read_lock();
-       addr = pci_dev_base(seg, bus, devfn);
-       if (!addr) {
-               rcu_read_unlock();
-               goto err;
-       }
-
-       switch (len) {
-       case 1:
-               *value = mmio_config_readb(addr + reg);
-               break;
-       case 2:
-               *value = mmio_config_readw(addr + reg);
-               break;
-       case 4:
-               *value = mmio_config_readl(addr + reg);
-               break;
-       }
-       rcu_read_unlock();
-
-       return 0;
-}
-
-int pci_mmcfg_write(unsigned int seg, unsigned int bus,
-                          unsigned int devfn, int reg, int len, u32 value)
-{
-       char __iomem *addr;
-
-       /* Why do we have this when nobody checks it. How about a BUG()!? -AK */
-       if (unlikely((bus > 255) || (devfn > 255) || (reg > 4095)))
-               return -EINVAL;
-
-       rcu_read_lock();
-       addr = pci_dev_base(seg, bus, devfn);
-       if (!addr) {
-               rcu_read_unlock();
-               return -EINVAL;
-       }
-
-       switch (len) {
-       case 1:
-               mmio_config_writeb(addr + reg, value);
-               break;
-       case 2:
-               mmio_config_writew(addr + reg, value);
-               break;
-       case 4:
-               mmio_config_writel(addr + reg, value);
-               break;
-       }
-       rcu_read_unlock();
-
-       return 0;
-}
-
-const struct pci_raw_ops pci_mmcfg = {
-       .read =         pci_mmcfg_read,
-       .write =        pci_mmcfg_write,
-};
-
-static void __iomem *mcfg_ioremap(struct pci_mmcfg_region *cfg)
-{
-       void __iomem *addr;
-       u64 start, size;
-       int num_buses;
-
-       start = cfg->address + PCI_MMCFG_BUS_OFFSET(cfg->start_bus);
-       num_buses = cfg->end_bus - cfg->start_bus + 1;
-       size = PCI_MMCFG_BUS_OFFSET(num_buses);
-       addr = ioremap_nocache(start, size);
-       if (addr)
-               addr -= PCI_MMCFG_BUS_OFFSET(cfg->start_bus);
-       return addr;
-}
-
-int __init pci_mmcfg_arch_init(void)
-{
-       struct pci_mmcfg_region *cfg;
-
-       list_for_each_entry(cfg, &pci_mmcfg_list, list)
-               if (pci_mmcfg_arch_map(cfg)) {
-                       pci_mmcfg_arch_free();
-                       return 0;
-               }
-
-       return 1;
-}
-
-void __init pci_mmcfg_arch_free(void)
-{
-       struct pci_mmcfg_region *cfg;
-
-       list_for_each_entry(cfg, &pci_mmcfg_list, list)
-               pci_mmcfg_arch_unmap(cfg);
-}
-
-int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg)
-{
-       cfg->virt = mcfg_ioremap(cfg);
-       if (!cfg->virt) {
-               pr_err(PREFIX "can't map MMCONFIG at %pR\n", &cfg->res);
-               return -ENOMEM;
-       }
-
-       return 0;
-}
-
-void pci_mmcfg_arch_unmap(struct pci_mmcfg_region *cfg)
-{
-       if (cfg && cfg->virt) {
-               iounmap(cfg->virt + PCI_MMCFG_BUS_OFFSET(cfg->start_bus));
-               cfg->virt = NULL;
-       }
-}
index d62dccdaac905abc547148b483ef4a78af0421e8..c0ad05f3ad981100c9c214ba229ac3ccdaf8ffb2 100644 (file)
 
 #include <linux/mutex.h>
 #include <linux/rculist.h>
+#include <linux/pci.h>
 #include <linux/mmconfig.h>
 
+#include <asm/pci.h>
+
 #define PREFIX "PCI: "
 
 static DEFINE_MUTEX(pci_mmcfg_lock);
 
 LIST_HEAD(pci_mmcfg_list);
 
+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);
+
+       if (cfg && cfg->virt)
+               return cfg->virt + (PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12));
+       return NULL;
+}
+
+int __weak pci_mmcfg_read(unsigned int seg, unsigned int bus,
+                         unsigned int devfn, int reg, int len, u32 *value)
+{
+       char __iomem *addr;
+
+       /* Why do we have this when nobody checks it. How about a BUG()!? -AK */
+       if (unlikely((bus > 255) || (devfn > 255) || (reg > 4095))) {
+err:           *value = -1;
+               return -EINVAL;
+       }
+
+       rcu_read_lock();
+       addr = pci_dev_base(seg, bus, devfn);
+       if (!addr) {
+               rcu_read_unlock();
+               goto err;
+       }
+
+       switch (len) {
+       case 1:
+               *value = mmio_config_readb(addr + reg);
+               break;
+       case 2:
+               *value = mmio_config_readw(addr + reg);
+               break;
+       case 4:
+               *value = mmio_config_readl(addr + reg);
+               break;
+       }
+       rcu_read_unlock();
+
+       return 0;
+}
+
+int __weak pci_mmcfg_write(unsigned int seg, unsigned int bus,
+                          unsigned int devfn, int reg, int len, u32 value)
+{
+       char __iomem *addr;
+
+       /* Why do we have this when nobody checks it. How about a BUG()!? -AK */
+       if (unlikely((bus > 255) || (devfn > 255) || (reg > 4095)))
+               return -EINVAL;
+
+       rcu_read_lock();
+       addr = pci_dev_base(seg, bus, devfn);
+       if (!addr) {
+               rcu_read_unlock();
+               return -EINVAL;
+       }
+
+       switch (len) {
+       case 1:
+               mmio_config_writeb(addr + reg, value);
+               break;
+       case 2:
+               mmio_config_writew(addr + reg, value);
+               break;
+       case 4:
+               mmio_config_writel(addr + reg, value);
+               break;
+       }
+       rcu_read_unlock();
+
+       return 0;
+}
+
+static void __iomem *mcfg_ioremap(struct pci_mmcfg_region *cfg)
+{
+       void __iomem *addr;
+       u64 start, size;
+       int num_buses;
+
+       start = cfg->address + PCI_MMCFG_BUS_OFFSET(cfg->start_bus);
+       num_buses = cfg->end_bus - cfg->start_bus + 1;
+       size = PCI_MMCFG_BUS_OFFSET(num_buses);
+       addr = ioremap_nocache(start, size);
+       if (addr)
+               addr -= PCI_MMCFG_BUS_OFFSET(cfg->start_bus);
+       return addr;
+}
+
+int __init __weak pci_mmcfg_arch_init(void)
+{
+       struct pci_mmcfg_region *cfg;
+
+       list_for_each_entry(cfg, &pci_mmcfg_list, list)
+               if (pci_mmcfg_arch_map(cfg)) {
+                       pci_mmcfg_arch_free();
+                       return 0;
+               }
+
+       return 1;
+}
+
+void __init __weak pci_mmcfg_arch_free(void)
+{
+       struct pci_mmcfg_region *cfg;
+
+       list_for_each_entry(cfg, &pci_mmcfg_list, list)
+               pci_mmcfg_arch_unmap(cfg);
+}
+
+int __weak pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg)
+{
+       cfg->virt = mcfg_ioremap(cfg);
+       if (!cfg->virt) {
+               pr_err(PREFIX "can't map MMCONFIG at %pR\n", &cfg->res);
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
+void __weak pci_mmcfg_arch_unmap(struct pci_mmcfg_region *cfg)
+{
+       if (cfg && cfg->virt) {
+               iounmap(cfg->virt + PCI_MMCFG_BUS_OFFSET(cfg->start_bus));
+               cfg->virt = NULL;
+       }
+}
+
 static void __init pci_mmconfig_remove(struct pci_mmcfg_region *cfg)
 {
        if (cfg->res.parent)