summaryrefslogtreecommitdiffstats
path: root/drivers/bus
diff options
context:
space:
mode:
authorEzequiel Garcia <ezequiel.garcia@free-electrons.com>2014-08-02 02:12:52 -0300
committerSascha Hauer <s.hauer@pengutronix.de>2014-08-04 20:48:44 +0200
commit11b34ab22f4072db0cdbf605d6ffbd472618175b (patch)
tree450775b69a93ec8bb3bc92eacfaa0aa7d9a9737a /drivers/bus
parent5a9ba98f2175fc81ff7cb1961eedee7ec4106386 (diff)
downloadbarebox-11b34ab22f4072db0cdbf605d6ffbd472618175b.tar.gz
barebox-11b34ab22f4072db0cdbf605d6ffbd472618175b.tar.xz
bus: mvebu: fix ranges fixup
The current fixup code is slightly wrong, and only works when the root address cell number is one. However, Armada XP has a root address cell number of two. In this case we are currently applying the fixup on the child high base address, while it should be applied on the child low base address. Fix it and add some detailed explanation to avoid having to figure this out each time. Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com> Acked-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/bus')
-rw-r--r--drivers/bus/mvebu-mbus.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/bus/mvebu-mbus.c b/drivers/bus/mvebu-mbus.c
index b1e407a7f2..b7f78367d4 100644
--- a/drivers/bus/mvebu-mbus.c
+++ b/drivers/bus/mvebu-mbus.c
@@ -788,6 +788,21 @@ static int mvebu_mbus_of_fixup(struct device_node *root, void *context)
ranges = xzalloc(lenp);
of_property_read_u32_array(np, "ranges", ranges, lenp/4);
+ /*
+ * Iterate through each ranges tuple and fixup the custom
+ * window ranges low base address. Because Armada XP supports
+ * LPAE, it has 2 cells for the parent address:
+ * <windowid child_base high_base low_base size>
+ *
+ * whereas for Armada 370, there's just one:
+ * <windowid child_base base size>
+ *
+ * For instance, the following tuple:
+ * <MBUS_ID(0xf0, 0x01) child_base {0} base 0x100000>
+ *
+ * would be fixed-up like:
+ * <MBUS_ID(0xf0, 0x01) child_base {0} remap 0x100000>
+ */
for (n = 0; n < lenp/4; n += size) {
struct mbus_range *r;
u32 mbusid = ranges[n];
@@ -797,7 +812,7 @@ static int mvebu_mbus_of_fixup(struct device_node *root, void *context)
list_for_each_entry(r, &mbus_ranges, list) {
if (r->mbusid == mbusid)
- ranges[n + na] = r->remap;
+ ranges[n + na + pa - 1] = r->remap;
}
}