mirror of https://gitee.com/openkylin/linux.git
bus: mvebu-mbus: Add new API for the PCIe memory and IO aperture
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>
This commit is contained in:
parent
bb24cab39c
commit
79d946837c
|
@ -142,6 +142,8 @@ struct mvebu_mbus_state {
|
||||||
struct dentry *debugfs_root;
|
struct dentry *debugfs_root;
|
||||||
struct dentry *debugfs_sdram;
|
struct dentry *debugfs_sdram;
|
||||||
struct dentry *debugfs_devs;
|
struct dentry *debugfs_devs;
|
||||||
|
struct resource pcie_mem_aperture;
|
||||||
|
struct resource pcie_io_aperture;
|
||||||
const struct mvebu_mbus_soc_data *soc;
|
const struct mvebu_mbus_soc_data *soc;
|
||||||
int hw_io_coherency;
|
int hw_io_coherency;
|
||||||
};
|
};
|
||||||
|
@ -821,6 +823,20 @@ int mvebu_mbus_del_window(phys_addr_t base, size_t size)
|
||||||
return 0;
|
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)
|
static __init int mvebu_mbus_debugfs_init(void)
|
||||||
{
|
{
|
||||||
struct mvebu_mbus_state *s = &mbus_state;
|
struct mvebu_mbus_state *s = &mbus_state;
|
||||||
|
@ -1023,6 +1039,35 @@ static int __init mbus_dt_setup(struct mvebu_mbus_state *mbus,
|
||||||
return 0;
|
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)
|
int __init mvebu_mbus_dt_init(void)
|
||||||
{
|
{
|
||||||
struct resource mbuswins_res, sdramwins_res;
|
struct resource mbuswins_res, sdramwins_res;
|
||||||
|
@ -1062,6 +1107,10 @@ int __init mvebu_mbus_dt_init(void)
|
||||||
return -EINVAL;
|
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,
|
ret = mvebu_mbus_common_init(&mbus_state,
|
||||||
mbuswins_res.start,
|
mbuswins_res.start,
|
||||||
resource_size(&mbuswins_res),
|
resource_size(&mbuswins_res),
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
#ifndef __LINUX_MBUS_H
|
#ifndef __LINUX_MBUS_H
|
||||||
#define __LINUX_MBUS_H
|
#define __LINUX_MBUS_H
|
||||||
|
|
||||||
|
struct resource;
|
||||||
|
|
||||||
struct mbus_dram_target_info
|
struct mbus_dram_target_info
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -59,6 +61,8 @@ static inline const struct mbus_dram_target_info *mv_mbus_dram_info(void)
|
||||||
}
|
}
|
||||||
#endif
|
#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,
|
int mvebu_mbus_add_window_remap_flags(const char *devname, phys_addr_t base,
|
||||||
size_t size, phys_addr_t remap,
|
size_t size, phys_addr_t remap,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
|
Loading…
Reference in New Issue