]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dm: core: Allow storing priv/plat data separately
authorSimon Glass <sjg@chromium.org>
Mon, 15 Mar 2021 04:25:38 +0000 (17:25 +1300)
committerSimon Glass <sjg@chromium.org>
Fri, 26 Mar 2021 04:03:09 +0000 (17:03 +1300)
At present the device priv/data data allocated by dtoc is stored in the
data section along with other variables. On some platforms it is better
to allocate space for it separately, e.g. if SPL is running from read-only
memory.

Create a new space with the same size as that allocated by dtoc, ready for
use.

Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/core/root.c
include/asm-generic/global_data.h
include/asm-generic/sections.h

index 446ac2ff774c48b1a7c9446c32036ec737f3c859..82b3c7de715edd509fff9738939883f6235610d1 100644 (file)
@@ -11,6 +11,7 @@
 #include <fdtdec.h>
 #include <log.h>
 #include <malloc.h>
+#include <asm-generic/sections.h>
 #include <asm/global_data.h>
 #include <linux/libfdt.h>
 #include <dm/acpi.h>
@@ -135,7 +136,9 @@ static int dm_setup_inst(void)
 
        if (CONFIG_IS_ENABLED(OF_PLATDATA_RT)) {
                struct udevice_rt *urt;
+               void *base;
                int n_ents;
+               uint size;
 
                /* Allocate the udevice_rt table */
                n_ents = ll_entry_count(struct udevice, udevice);
@@ -143,6 +146,15 @@ static int dm_setup_inst(void)
                if (!urt)
                        return log_msg_ret("urt", -ENOMEM);
                gd_set_dm_udevice_rt(urt);
+
+               /* Now allocate space for the priv/plat data, and copy it in */
+               size = __priv_data_end - __priv_data_start;
+
+               base = calloc(1, size);
+               if (!base)
+                       return log_msg_ret("priv", -ENOMEM);
+               memcpy(base, __priv_data_start, size);
+               gd_set_dm_priv_base(base);
        }
 
        return 0;
index f6189eff4eb3c64e0b4f850e6fffeae45154a3cb..e1a5f4b1d18d4528ac0e58ff6d1841afed10a521 100644 (file)
@@ -222,6 +222,12 @@ struct global_data {
 #if CONFIG_IS_ENABLED(OF_PLATDATA_RT)
        /** @dm_udevice_rt: Dynamic info about the udevice */
        struct udevice_rt *dm_udevice_rt;
+       /**
+        * @dm_priv_base: Base address of the priv/plat region used when
+        * udevices and uclasses are in read-only memory. This is NULL if not
+        * used
+        */
+       void *dm_priv_base;
 # endif
 #endif
 #ifdef CONFIG_TIMER
@@ -498,9 +504,13 @@ struct global_data {
 #if CONFIG_IS_ENABLED(OF_PLATDATA_RT)
 #define gd_set_dm_udevice_rt(dyn)      gd->dm_udevice_rt = dyn
 #define gd_dm_udevice_rt()             gd->dm_udevice_rt
+#define gd_set_dm_priv_base(dyn)       gd->dm_priv_base = dyn
+#define gd_dm_priv_base()              gd->dm_priv_base
 #else
 #define gd_set_dm_udevice_rt(dyn)
 #define gd_dm_udevice_rt()             NULL
+#define gd_set_dm_priv_base(dyn)
+#define gd_dm_priv_base()              NULL
 #endif
 
 #ifdef CONFIG_GENERATE_ACPI_TABLE
index 0577238d60b7194aa988bf34e8c04874756116c4..267f1db73f238e18e5acb5a01890733e656a4221 100644 (file)
@@ -28,6 +28,9 @@ extern char __efi_helloworld_end[];
 extern char __efi_var_file_begin[];
 extern char __efi_var_file_end[];
 
+/* Private data used by of-platdata devices/uclasses */
+extern char __priv_data_start[], __priv_data_end[];
+
 /* Start and end of .ctors section - used for constructor calls. */
 extern char __ctors_start[], __ctors_end[];