bus: mvebu-mbus: provide api for obtaining IO and DRAM window information
This commit enables finding appropriate mbus window and obtaining its target id and attribute for given physical address in two separate routines, both for IO and DRAM windows. This functionality is needed for Armada XP/38x Network Controller's Buffer Manager and PnC configuration. [gregory.clement@free-electrons.com: Fix size test for mvebu_mbus_get_dram_win_info] Signed-off-by: Marcin Wojtas <mw@semihalf.com> [DRAM window information reference in LKv3.10] Signed-off-by: Evan Wang <xswang@marvell.com> Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
293fdc24fc
commit
f2900acea8
@@ -948,6 +948,58 @@ void mvebu_mbus_get_pcie_io_aperture(struct resource *res)
|
||||
*res = mbus_state.pcie_io_aperture;
|
||||
}
|
||||
|
||||
int mvebu_mbus_get_dram_win_info(phys_addr_t phyaddr, u8 *target, u8 *attr)
|
||||
{
|
||||
const struct mbus_dram_target_info *dram;
|
||||
int i;
|
||||
|
||||
/* Get dram info */
|
||||
dram = mv_mbus_dram_info();
|
||||
if (!dram) {
|
||||
pr_err("missing DRAM information\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Try to find matching DRAM window for phyaddr */
|
||||
for (i = 0; i < dram->num_cs; i++) {
|
||||
const struct mbus_dram_window *cs = dram->cs + i;
|
||||
|
||||
if (cs->base <= phyaddr &&
|
||||
phyaddr <= (cs->base + cs->size - 1)) {
|
||||
*target = dram->mbus_dram_target_id;
|
||||
*attr = cs->mbus_attr;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
pr_err("invalid dram address 0x%x\n", phyaddr);
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mvebu_mbus_get_dram_win_info);
|
||||
|
||||
int mvebu_mbus_get_io_win_info(phys_addr_t phyaddr, u32 *size, u8 *target,
|
||||
u8 *attr)
|
||||
{
|
||||
int win;
|
||||
|
||||
for (win = 0; win < mbus_state.soc->num_wins; win++) {
|
||||
u64 wbase;
|
||||
int enabled;
|
||||
|
||||
mvebu_mbus_read_window(&mbus_state, win, &enabled, &wbase,
|
||||
size, target, attr, NULL);
|
||||
|
||||
if (!enabled)
|
||||
continue;
|
||||
|
||||
if (wbase <= phyaddr && phyaddr <= wbase + *size)
|
||||
return win;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mvebu_mbus_get_io_win_info);
|
||||
|
||||
static __init int mvebu_mbus_debugfs_init(void)
|
||||
{
|
||||
struct mvebu_mbus_state *s = &mbus_state;
|
||||
|
||||
Reference in New Issue
Block a user