Message ID | 1318371971-4457-6-git-send-email-sjg@chromium.org |
---|---|
State | New, archived |
Headers | show |
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
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
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
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 -----------
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(-)