[U-Boot] [PATCH v4 5/6] fdt: ARM: Add fdtcontroladdr to set device tree address in environment
Simon Glass
sjg at chromium.org
Sat Oct 15 17:48:24 CEST 2011
This adds support for a new environment variable called 'fdtcontroladdr'. If
defined, the hex address is used as the address of the control fdt for U-Boot.
Note: I have not changed CONFIG_PRAM section as I already have an
outstanding patch on that.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
Changes in v3:
- Add fdtcontroladdr environment variable
README | 4 ++++
arch/arm/lib/board.c | 30 +++++++++++++++++++++++-------
doc/README.fdt-control | 12 ++++++++++++
3 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/README b/README
index fc1cd00..3b1faf9 100644
--- a/README
+++ b/README
@@ -3493,6 +3493,10 @@ List of environment variables (most likely not complete):
add the information it needs into it, and the memory
must be accessible by the kernel.
+ fdtcontroladdr- if set this is the address of the control flattened
+ device tree used by U-Boot when CONFIG_OF_CONTROL is
+ defined.
+
i2cfast - (PPC405GP|PPC405EP only)
if set to 'y' configures Linux I2C driver for fast
mode (400kHZ). This environment variable is used in
diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
index b0f3162..f26d77a 100644
--- a/arch/arm/lib/board.c
+++ b/arch/arm/lib/board.c
@@ -116,18 +116,31 @@ void blue_led_off(void) __attribute__((weak, alias("__blue_led_off")));
* but let's get it working (again) first...
*/
+/**
+ * Decode the value of an environment variable and return it.
+ *
+ * @param name Name of environemnt variable
+ * @param base Number base to use (normally 10, or 16 for hex)
+ * @param default_val Default value to return if the variable is not
+ * found
+ * @return the decoded value, or default_val if not found
+ */
+static int getenv_int(const char *name, int base, int default_val)
+{
+ char tmp[64]; /* long enough for environment variables */
+ int i = getenv_f(name, tmp, sizeof(tmp));
+
+ return (i > 0)
+ ? (int) simple_strtoul(tmp, NULL, base)
+ : default_val;
+}
+
#if defined(CONFIG_ARM_DCC) && !defined(CONFIG_BAUDRATE)
#define CONFIG_BAUDRATE 115200
#endif
static int init_baudrate(void)
{
- char tmp[64]; /* long enough for environment variables */
- int i = getenv_f("baudrate", tmp, sizeof(tmp));
-
- gd->baudrate = (i > 0)
- ? (int) simple_strtoul(tmp, NULL, 10)
- : CONFIG_BAUDRATE;
-
+ gd->baudrate = getenv_int("baudrate", 10, CONFIG_BAUDRATE);
return (0);
}
@@ -298,6 +311,9 @@ void board_init_f(ulong bootflag)
/* FDT is at end of image */
gd->fdt_blob = (void *)(_end_ofs + _TEXT_BASE);
#endif
+ /* Allow the early environment to override the fdt address */
+ gd->fdt_blob = (void *)getenv_int("fdtcontroladdr", 16,
+ (uintptr_t)gd->fdt_blob);
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
diff --git a/doc/README.fdt-control b/doc/README.fdt-control
index 3f8bb5a..85bda03 100644
--- a/doc/README.fdt-control
+++ b/doc/README.fdt-control
@@ -144,6 +144,18 @@ and then flash image.bin onto your board.
You cannot use both of these options at the same time.
+If you wish to put the fdt at a different address in memory, you can
+define the "fdtcontroladdr" environment variable. This is the hex
+address of the fdt binary blob, and will override either of the options.
+Be aware that this environment variable is checked prior to relocation,
+when only the compiled-in environment is available. Therefore it is not
+possible to define this variable in the saved SPI/NAND flash
+environment, for example (it will be ignored).
+
+To use this, put something like this in your board header file:
+
+#define CONFIG_EXTRA_ENV_SETTINGS "fdtcontroladdr=10000\0"
+
Limitations
-----------
--
1.7.3.1
More information about the U-Boot
mailing list