[U-Boot] [PATCH] dm: core: Add option to configure an offset for the address translation
Stefan Roese
sr at denx.de
Fri Dec 11 15:57:24 CET 2015
Some platforms need to ability to configure an offset to the standard
addresses extracted from the device-tree. This patch allows this by
adding a function to DM to configure this offset (if needed).
Signed-off-by: Stefan Roese <sr at denx.de>
Cc: Simon Glass <sjg at chromium.org>
---
drivers/core/device.c | 33 +++++++++++++++++++++------------
drivers/core/root.c | 32 ++++++++++++++++++++++++++++++++
include/dm/device.h | 3 +++
3 files changed, 56 insertions(+), 12 deletions(-)
diff --git a/drivers/core/device.c b/drivers/core/device.c
index 758f390..41fbbc6 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -597,22 +597,31 @@ fdt_addr_t dev_get_addr(struct udevice *dev)
* Use the full-fledged translate function for complex
* bus setups.
*/
- return fdt_translate_address((void *)gd->fdt_blob,
+ addr = fdt_translate_address((void *)gd->fdt_blob,
dev->of_offset, reg);
+ } else {
+ /*
+ * Use the "simple" translate function for less complex
+ * bus setups.
+ */
+ addr = fdtdec_get_addr_size_auto_parent(gd->fdt_blob,
+ dev->parent->of_offset,
+ dev->of_offset, "reg",
+ 0, NULL);
+ if (CONFIG_IS_ENABLED(SIMPLE_BUS) && addr != FDT_ADDR_T_NONE) {
+ if (device_get_uclass_id(dev->parent) ==
+ UCLASS_SIMPLE_BUS)
+ addr = simple_bus_translate(dev->parent, addr);
+ }
}
/*
- * Use the "simple" translate function for less complex
- * bus setups.
- */
- addr = fdtdec_get_addr_size_auto_parent(gd->fdt_blob,
- dev->parent->of_offset,
- dev->of_offset, "reg",
- 0, NULL);
- if (CONFIG_IS_ENABLED(SIMPLE_BUS) && addr != FDT_ADDR_T_NONE) {
- if (device_get_uclass_id(dev->parent) == UCLASS_SIMPLE_BUS)
- addr = simple_bus_translate(dev->parent, addr);
- }
+ * Some platforms need a special address translation. Those
+ * platforms (e.g. mvebu in SPL) can configure a translation
+ * offset in the DM by calling dm_set_translation_offset() that
+ * will get added to all addresses returned by dev_get_addr().
+ */
+ addr += dm_get_translation_offset();
return addr;
#else
diff --git a/drivers/core/root.c b/drivers/core/root.c
index e7b1f24..ef22c97 100644
--- a/drivers/core/root.c
+++ b/drivers/core/root.c
@@ -23,6 +23,10 @@
DECLARE_GLOBAL_DATA_PTR;
+struct root_priv {
+ uint32_t translation_offset;
+};
+
static const struct driver_info root_info = {
.name = "root_driver",
};
@@ -37,6 +41,33 @@ struct udevice *dm_root(void)
return gd->dm_root;
}
+uint32_t dm_get_translation_offset(void)
+{
+ struct udevice *root;
+
+ root = dm_root();
+ if (root) {
+ struct root_priv *priv = dev_get_priv(root);
+
+ return priv->translation_offset;
+ }
+
+ /* No offset as default */
+ return 0;
+}
+
+void dm_set_translation_offset(uint32_t offs)
+{
+ struct udevice *root;
+
+ root = dm_root();
+ if (root) {
+ struct root_priv *priv = dev_get_priv(root);
+
+ priv->translation_offset = offs;
+ }
+}
+
#if defined(CONFIG_NEEDS_MANUAL_RELOC)
void fix_drivers(void)
{
@@ -228,6 +259,7 @@ int dm_init_and_scan(bool pre_reloc_only)
U_BOOT_DRIVER(root_driver) = {
.name = "root_driver",
.id = UCLASS_ROOT,
+ .priv_auto_alloc_size = sizeof(struct root_priv),
};
/* This is the root uclass */
diff --git a/include/dm/device.h b/include/dm/device.h
index 7fb9935..a0fb4f6 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -776,4 +776,7 @@ static inline void devm_kfree(struct udevice *dev, void *ptr)
#endif /* ! CONFIG_DEVRES */
+uint32_t dm_get_translation_offset(void);
+void dm_set_translation_offset(uint32_t offs);
+
#endif
--
2.6.4
More information about the U-Boot
mailing list