bus: mvebu-mbus: Add new API for the PCIe memory and IO aperture
authorEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Fri, 26 Jul 2013 13:17:47 +0000 (10:17 -0300)
committerJason Cooper <jason@lakedaemon.net>
Tue, 6 Aug 2013 14:10:34 +0000 (14:10 +0000)
We add two optional properties to the MBus DT binding, to encode
the PCIe memory and IO aperture. This allows such information to
be retrieved by -for instance- the pci driver to allocate the
MBus decoding windows.

Correspondingly, and in order to retrieve this information,
we add two new APIs.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Tested-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
drivers/bus/mvebu-mbus.c
include/linux/mbus.h

index 78b8c0436f0b51731bae2f1b6643e2c380d2fc76..929fed1f6eb9a33ce75deee748fa0eee30a03575 100644 (file)
@@ -142,6 +142,8 @@ struct mvebu_mbus_state {
        struct dentry *debugfs_root;
        struct dentry *debugfs_sdram;
        struct dentry *debugfs_devs;
+       struct resource pcie_mem_aperture;
+       struct resource pcie_io_aperture;
        const struct mvebu_mbus_soc_data *soc;
        int hw_io_coherency;
 };
@@ -821,6 +823,20 @@ int mvebu_mbus_del_window(phys_addr_t base, size_t size)
        return 0;
 }
 
+void mvebu_mbus_get_pcie_mem_aperture(struct resource *res)
+{
+       if (!res)
+               return;
+       *res = mbus_state.pcie_mem_aperture;
+}
+
+void mvebu_mbus_get_pcie_io_aperture(struct resource *res)
+{
+       if (!res)
+               return;
+       *res = mbus_state.pcie_io_aperture;
+}
+
 static __init int mvebu_mbus_debugfs_init(void)
 {
        struct mvebu_mbus_state *s = &mbus_state;
@@ -1023,6 +1039,35 @@ static int __init mbus_dt_setup(struct mvebu_mbus_state *mbus,
        return 0;
 }
 
+static void __init mvebu_mbus_get_pcie_resources(struct device_node *np,
+                                                struct resource *mem,
+                                                struct resource *io)
+{
+       u32 reg[2];
+       int ret;
+
+       /*
+        * These are optional, so we clear them and they'll
+        * be zero if they are missing from the DT.
+        */
+       memset(mem, 0, sizeof(struct resource));
+       memset(io, 0, sizeof(struct resource));
+
+       ret = of_property_read_u32_array(np, "pcie-mem-aperture", reg, ARRAY_SIZE(reg));
+       if (!ret) {
+               mem->start = reg[0];
+               mem->end = mem->start + reg[1];
+               mem->flags = IORESOURCE_MEM;
+       }
+
+       ret = of_property_read_u32_array(np, "pcie-io-aperture", reg, ARRAY_SIZE(reg));
+       if (!ret) {
+               io->start = reg[0];
+               io->end = io->start + reg[1];
+               io->flags = IORESOURCE_IO;
+       }
+}
+
 int __init mvebu_mbus_dt_init(void)
 {
        struct resource mbuswins_res, sdramwins_res;
@@ -1062,6 +1107,10 @@ int __init mvebu_mbus_dt_init(void)
                return -EINVAL;
        }
 
+       /* Get optional pcie-{mem,io}-aperture properties */
+       mvebu_mbus_get_pcie_resources(np, &mbus_state.pcie_mem_aperture,
+                                         &mbus_state.pcie_io_aperture);
+
        ret = mvebu_mbus_common_init(&mbus_state,
                                     mbuswins_res.start,
                                     resource_size(&mbuswins_res),
index eadefd687a0bb3a7466b09e44fe5e1fd07b1c040..650bc154a86eba33c949244e217cc166eecdac0e 100644 (file)
@@ -11,6 +11,8 @@
 #ifndef __LINUX_MBUS_H
 #define __LINUX_MBUS_H
 
+struct resource;
+
 struct mbus_dram_target_info
 {
        /*
@@ -59,6 +61,8 @@ static inline const struct mbus_dram_target_info *mv_mbus_dram_info(void)
 }
 #endif
 
+void mvebu_mbus_get_pcie_mem_aperture(struct resource *res);
+void mvebu_mbus_get_pcie_io_aperture(struct resource *res);
 int mvebu_mbus_add_window_remap_flags(const char *devname, phys_addr_t base,
                                      size_t size, phys_addr_t remap,
                                      unsigned int flags);