Patchwork [U-Boot,v3,5/6] fdt: ARM: Add fdtcontroladdr to set device tree address in environment

login
register
mail settings
Submitter Simon Glass
Date Oct. 11, 2011, 10:26 p.m.
Message ID <1318371971-4457-6-git-send-email-sjg@chromium.org>
Download mbox | patch
Permalink /patch/119080/
State New, archived
Headers show

Comments

Simon Glass - Oct. 11, 2011, 10:26 p.m.
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@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(-)
Mike Frysinger - Oct. 13, 2011, 8:27 p.m.
On Tuesday 11 October 2011 18:26:10 Simon Glass wrote:
> --- a/arch/arm/lib/board.c
> +++ b/arch/arm/lib/board.c
> 
> +/**
> + * 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;
> +}

pretty much everyone does this with gd->baudrate.  would make sense to put 
this into common/cmd_nvedit.c and convert all arches.
-mike
Simon Glass - Oct. 13, 2011, 9:08 p.m.
Hi Mike,

On Thu, Oct 13, 2011 at 1:27 PM, Mike Frysinger <vapier@gentoo.org> wrote:
> On Tuesday 11 October 2011 18:26:10 Simon Glass wrote:
>> --- a/arch/arm/lib/board.c
>> +++ b/arch/arm/lib/board.c
>>
>> +/**
>> + * 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;
>> +}
>
> pretty much everyone does this with gd->baudrate.  would make sense to put
> this into common/cmd_nvedit.c and convert all arches.
> -mike
>

I was worried someone might say that. I will take a look.

Regards,
Simon
Simon Glass - Oct. 15, 2011, 3:18 p.m.
Hi Mike,

On Thu, Oct 13, 2011 at 2:08 PM, Simon Glass <sjg@chromium.org> wrote:
> Hi Mike,
>
> On Thu, Oct 13, 2011 at 1:27 PM, Mike Frysinger <vapier@gentoo.org> wrote:
>> On Tuesday 11 October 2011 18:26:10 Simon Glass wrote:
>>> --- a/arch/arm/lib/board.c
>>> +++ b/arch/arm/lib/board.c
>>>
>>> +/**
>>> + * 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;
>>> +}
>>
>> pretty much everyone does this with gd->baudrate.  would make sense to put
>> this into common/cmd_nvedit.c and convert all arches.
>> -mike
>>
>
> I was worried someone might say that. I will take a look.

That patch series has been posted, so if it is accepted then we can
remove the definition of this function from the patch series. I am
going to send the fdt series against upstream/master but will happily
adjust this particular patch if getenv_ulong() is accepted.

Regards,
Simon

Patch

diff --git a/README b/README
index 8ab2b0c..f121d4d 100644
--- a/README
+++ b/README
@@ -3489,6 +3489,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
 -----------