All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2] dm: core: Add option to configure an offset for the address translation
@ 2015-12-14  9:20 Stefan Roese
  2015-12-14 14:59 ` Simon Glass
  0 siblings, 1 reply; 2+ messages in thread
From: Stefan Roese @ 2015-12-14  9:20 UTC (permalink / raw)
  To: u-boot

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@denx.de>
Cc: Simon Glass <sjg@chromium.org>
---
v2:
- Change translation_offset type from u32 to fdt_addr_t
- Add comments to function declarations

 drivers/core/device.c | 33 +++++++++++++++++++++------------
 drivers/core/root.c   | 32 ++++++++++++++++++++++++++++++++
 include/dm/device.h   | 21 +++++++++++++++++++++
 3 files changed, 74 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..bbf0d72 100644
--- a/drivers/core/root.c
+++ b/drivers/core/root.c
@@ -23,6 +23,10 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+struct root_priv {
+	fdt_addr_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;
 }
 
+fdt_addr_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(fdt_addr_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..d9fc7fb 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -776,4 +776,25 @@ static inline void devm_kfree(struct udevice *dev, void *ptr)
 
 #endif /* ! CONFIG_DEVRES */
 
+/**
+ * dm_set_translation_offset() - Set translation offset
+ * @offs: Translation offset
+ *
+ * Some platforms need a special address translation. Those
+ * platforms (e.g. mvebu in SPL) can configure a translation
+ * offset in the DM by calling this function. It will be
+ * added to all addresses returned in dev_get_addr().
+ */
+void dm_set_translation_offset(fdt_addr_t offs);
+
+/**
+ * dm_get_translation_offset() - Get translation offset
+ *
+ * This function returns the translation offset that can
+ * be configured by calling dm_set_translation_offset().
+ *
+ * @return translation offset for the device address (0 as default).
+ */
+fdt_addr_t dm_get_translation_offset(void);
+
 #endif
-- 
2.6.4

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [U-Boot] [PATCH v2] dm: core: Add option to configure an offset for the address translation
  2015-12-14  9:20 [U-Boot] [PATCH v2] dm: core: Add option to configure an offset for the address translation Stefan Roese
@ 2015-12-14 14:59 ` Simon Glass
  0 siblings, 0 replies; 2+ messages in thread
From: Simon Glass @ 2015-12-14 14:59 UTC (permalink / raw)
  To: u-boot

Hi Stefan,

On 14 December 2015 at 02:20, Stefan Roese <sr@denx.de> wrote:
> 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@denx.de>
> Cc: Simon Glass <sjg@chromium.org>
> ---
> v2:
> - Change translation_offset type from u32 to fdt_addr_t
> - Add comments to function declarations
>
>  drivers/core/device.c | 33 +++++++++++++++++++++------------
>  drivers/core/root.c   | 32 ++++++++++++++++++++++++++++++++
>  include/dm/device.h   | 21 +++++++++++++++++++++
>  3 files changed, 74 insertions(+), 12 deletions(-)

Acked-by: Simon Glass <sjg@chromium.org>

Please see a few nits below.

>
> 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..bbf0d72 100644
> --- a/drivers/core/root.c
> +++ b/drivers/core/root.c
> @@ -23,6 +23,10 @@
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> +struct root_priv {
> +       fdt_addr_t translation_offset;

Comment for this.

> +};
> +
>  static const struct driver_info root_info = {
>         .name           = "root_driver",
>  };
> @@ -37,6 +41,33 @@ struct udevice *dm_root(void)
>         return gd->dm_root;
>  }
>
> +fdt_addr_t dm_get_translation_offset(void)
> +{
> +       struct udevice *root;
> +
> +       root = dm_root();
> +       if (root) {

This will always be non-NULL since it is not valid to call this before
driver model is running.

> +               struct root_priv *priv = dev_get_priv(root);
> +
> +               return priv->translation_offset;
> +       }
> +
> +       /* No offset as default */
> +       return 0;
> +}
> +
> +void dm_set_translation_offset(fdt_addr_t offs)
> +{
> +       struct udevice *root;
> +
> +       root = dm_root();
> +       if (root) {

Same here.

> +               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..d9fc7fb 100644
> --- a/include/dm/device.h
> +++ b/include/dm/device.h
> @@ -776,4 +776,25 @@ static inline void devm_kfree(struct udevice *dev, void *ptr)
>
>  #endif /* ! CONFIG_DEVRES */
>
> +/**
> + * dm_set_translation_offset() - Set translation offset
> + * @offs: Translation offset
> + *
> + * Some platforms need a special address translation. Those
> + * platforms (e.g. mvebu in SPL) can configure a translation
> + * offset in the DM by calling this function. It will be
> + * added to all addresses returned in dev_get_addr().
> + */
> +void dm_set_translation_offset(fdt_addr_t offs);
> +
> +/**
> + * dm_get_translation_offset() - Get translation offset
> + *
> + * This function returns the translation offset that can
> + * be configured by calling dm_set_translation_offset().
> + *
> + * @return translation offset for the device address (0 as default).
> + */
> +fdt_addr_t dm_get_translation_offset(void);
> +
>  #endif
> --
> 2.6.4
>

Regards,
Simon

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-12-14 14:59 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-14  9:20 [U-Boot] [PATCH v2] dm: core: Add option to configure an offset for the address translation Stefan Roese
2015-12-14 14:59 ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.