Refactoring of env_get_char() etc.

Update buildman to use gcc-11.1.0
 Use in-container toolchain for nokia_rx51 CI test
 -----BEGIN PGP SIGNATURE-----
 
 iQFFBAABCgAvFiEEslwAIq+Gp8wWVbYnfxc6PpAIreYFAmFyFQ8RHHNqZ0BjaHJv
 bWl1bS5vcmcACgkQfxc6PpAIreZCYAf/VelWe8DxrRHWuXk7fIBgOqJHHGxr+Qwg
 eEUDE6Yr0LQ4RY2SA5qGcomkQHFf/BLt1r3UX0Gw2UIHJuniBR7wgZbBoWF8UT94
 0wqgGNoZ8X2H//5P8QFouPJ3BOxtWuQ2s1l8xm9n+4rZJrBZbK7CQWBXBtHprLfJ
 PDzeGVbseWypUByTxZdUsbd/qq8Evksy4is/A2UxPPsg/pUq/9pvIcpKC8YZCa0k
 jdrBkMeIuEY8RRUtwPJii45dtqsjbbizi+GVZFWfLjGfkaA1IaFkk47aWQZXrGOM
 76oFb+/D58dUTK/44e12upP8z12ZXgGl6uevDIh8P243J1m/YgZv5A==
 =Yve6
 -----END PGP SIGNATURE-----

Merge tag 'dm-pull-21oct21' of https://source.denx.de/u-boot/custodians/u-boot-dm

Refactoring of env_get_char() etc.
Update buildman to use gcc-11.1.0
Use in-container toolchain for nokia_rx51 CI test

# gpg: Signature made Thu 21 Oct 2021 09:34:07 PM EDT
# gpg:                using RSA key B25C0022AF86A7CC1655B6277F173A3E9008ADE6
# gpg:                issuer "sjg@chromium.org"
# gpg: Good signature from "Simon Glass <sjg@chromium.org>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: B25C 0022 AF86 A7CC 1655  B627 7F17 3A3E 9008 ADE6
This commit is contained in:
Tom Rini 2021-10-21 21:41:47 -04:00
commit 06685f9de2
14 changed files with 215 additions and 271 deletions

View file

@ -169,8 +169,7 @@ jobs:
options: $(container_option)
steps:
- script: |
./tools/buildman/buildman --fetch-arch arm
export PATH=~/.buildman-toolchains/gcc-9.2.0-nolibc/arm-linux-gnueabi/bin/:$PATH
export PATH=/opt/gcc-11.1.0-nolibc/arm-linux-gnueabi/bin:$PATH
test/nokia_rx51_test.sh
- job: test_py

View file

@ -177,8 +177,7 @@ Run binman, buildman, dtoc, Kconfig and patman testsuites:
Run tests for Nokia RX-51 (aka N900):
stage: testsuites
script:
- ./tools/buildman/buildman --fetch-arch arm;
export PATH=~/.buildman-toolchains/gcc-9.2.0-nolibc/arm-linux-gnueabi/bin/:$PATH;
- export PATH=/opt/gcc-11.1.0-nolibc/arm-linux-gnueabi/bin:$PATH;
test/nokia_rx51_test.sh
# Test sandbox with test.py

View file

@ -5,7 +5,7 @@
# (C) Copyright 2002-2006
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
obj-y += interrupts.o sections.o
obj-y += fdt_fixup.o interrupts.o sections.o
obj-$(CONFIG_PCI) += pci_io.o
obj-$(CONFIG_CMD_BOOTM) += bootm.o
obj-$(CONFIG_CMD_BOOTZ) += bootm.o

View file

@ -0,0 +1,25 @@
// SPDX-License-Identifier: GPL-2.0+
#define LOG_CATEGORY LOGC_ARCH
#include <common.h>
#include <fdt_support.h>
#include <log.h>
#if defined(__riscv)
int arch_fixup_fdt(void *blob)
{
int ret;
ret = fdt_find_or_add_subnode(blob, 0, "chosen");;
if (ret < 0)
goto err;
ret = fdt_setprop_u32(blob, ret, "boot-hartid", 1);
if (ret < 0)
goto err;
return 0;
err:
log_err("Setting /chosen/boot-hartid failed: %s\n", fdt_strerror(ret));
return ret;
}
#endif

View file

@ -30,7 +30,6 @@
#include <env.h>
#include <env_internal.h>
#include <log.h>
#include <net.h>
#include <search.h>
#include <errno.h>
#include <malloc.h>
@ -38,7 +37,6 @@
#include <asm/global_data.h>
#include <linux/bitops.h>
#include <u-boot/crc.h>
#include <watchdog.h>
#include <linux/stddef.h>
#include <asm/byteorder.h>
#include <asm/io.h>
@ -320,69 +318,6 @@ int env_set(const char *varname, const char *varvalue)
return _do_env_set(0, 3, (char * const *)argv, H_PROGRAMMATIC);
}
/**
* Set an environment variable to an integer value
*
* @param varname Environment variable to set
* @param value Value to set it to
* @return 0 if ok, 1 on error
*/
int env_set_ulong(const char *varname, ulong value)
{
/* TODO: this should be unsigned */
char *str = simple_itoa(value);
return env_set(varname, str);
}
/**
* Set an environment variable to an value in hex
*
* @param varname Environment variable to set
* @param value Value to set it to
* @return 0 if ok, 1 on error
*/
int env_set_hex(const char *varname, ulong value)
{
char str[17];
sprintf(str, "%lx", value);
return env_set(varname, str);
}
ulong env_get_hex(const char *varname, ulong default_val)
{
const char *s;
ulong value;
char *endp;
s = env_get(varname);
if (s)
value = hextoul(s, &endp);
if (!s || endp == s)
return default_val;
return value;
}
int eth_env_get_enetaddr(const char *name, uint8_t *enetaddr)
{
string_to_enetaddr(env_get(name), enetaddr);
return is_valid_ethaddr(enetaddr);
}
int eth_env_set_enetaddr(const char *name, const uint8_t *enetaddr)
{
char buf[ARP_HLEN_ASCII + 1];
if (eth_env_get_enetaddr(name, (uint8_t *)buf))
return -EEXIST;
sprintf(buf, "%pM", enetaddr);
return env_set(name, buf);
}
#ifndef CONFIG_SPL_BUILD
static int do_env_set(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
@ -661,115 +596,7 @@ static int do_env_edit(struct cmd_tbl *cmdtp, int flag, int argc,
}
}
#endif /* CONFIG_CMD_EDITENV */
#endif /* CONFIG_SPL_BUILD */
/*
* Look up variable from environment,
* return address of storage for that variable,
* or NULL if not found
*/
char *env_get(const char *name)
{
if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */
struct env_entry e, *ep;
WATCHDOG_RESET();
e.key = name;
e.data = NULL;
hsearch_r(e, ENV_FIND, &ep, &env_htab, 0);
return ep ? ep->data : NULL;
}
/* restricted capabilities before import */
if (env_get_f(name, (char *)(gd->env_buf), sizeof(gd->env_buf)) > 0)
return (char *)(gd->env_buf);
return NULL;
}
/*
* Like env_get, but prints an error if envvar isn't defined in the
* environment. It always returns what env_get does, so it can be used in
* place of env_get without changing error handling otherwise.
*/
char *from_env(const char *envvar)
{
char *ret;
ret = env_get(envvar);
if (!ret)
printf("missing environment variable: %s\n", envvar);
return ret;
}
/*
* Look up variable from environment for restricted C runtime env.
*/
int env_get_f(const char *name, char *buf, unsigned len)
{
int i, nxt, c;
for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {
int val, n;
for (nxt = i; (c = env_get_char(nxt)) != '\0'; ++nxt) {
if (c < 0)
return c;
if (nxt >= CONFIG_ENV_SIZE)
return -1;
}
val = env_match((uchar *)name, i);
if (val < 0)
continue;
/* found; copy out */
for (n = 0; n < len; ++n, ++buf) {
c = env_get_char(val++);
if (c < 0)
return c;
*buf = c;
if (*buf == '\0')
return n;
}
if (n)
*--buf = '\0';
printf("env_buf [%u bytes] too small for value of \"%s\"\n",
len, name);
return n;
}
return -1;
}
/**
* Decode the integer value of an environment variable and return it.
*
* @param name Name of environment 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
*/
ulong env_get_ulong(const char *name, int base, ulong default_val)
{
/*
* We can use env_get() here, even before relocation, since the
* environment variable value is an integer and thus short.
*/
const char *str = env_get(name);
return str ? simple_strtoul(str, NULL, base) : default_val;
}
#ifndef CONFIG_SPL_BUILD
#if defined(CONFIG_CMD_SAVEENV) && defined(ENV_IS_IN_DEVICE)
static int do_env_save(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
@ -816,21 +643,6 @@ static int do_env_select(struct cmd_tbl *cmdtp, int flag, int argc,
#endif /* CONFIG_SPL_BUILD */
int env_match(uchar *s1, int i2)
{
if (s1 == NULL)
return -1;
while (*s1 == env_get_char(i2++))
if (*s1++ == '=')
return i2;
if (*s1 == '\0' && env_get_char(i2-1) == '=')
return i2;
return -1;
}
#ifndef CONFIG_SPL_BUILD
static int do_env_default(struct cmd_tbl *cmdtp, int flag,
int argc, char *const argv[])

180
env/common.c vendored
View file

@ -21,6 +21,8 @@
#include <malloc.h>
#include <u-boot/crc.h>
#include <dm/ofnode.h>
#include <net.h>
#include <watchdog.h>
DECLARE_GLOBAL_DATA_PTR;
@ -33,6 +35,184 @@ struct hsearch_data env_htab = {
.change_ok = env_flags_validate,
};
/*
* This env_set() function is defined in cmd/nvedit.c, since it calls
* _do_env_set(), whis is a static function in that file.
*
* int env_set(const char *varname, const char *varvalue);
*/
/**
* Set an environment variable to an integer value
*
* @param varname Environment variable to set
* @param value Value to set it to
* @return 0 if ok, 1 on error
*/
int env_set_ulong(const char *varname, ulong value)
{
/* TODO: this should be unsigned */
char *str = simple_itoa(value);
return env_set(varname, str);
}
/**
* Set an environment variable to an value in hex
*
* @param varname Environment variable to set
* @param value Value to set it to
* @return 0 if ok, 1 on error
*/
int env_set_hex(const char *varname, ulong value)
{
char str[17];
sprintf(str, "%lx", value);
return env_set(varname, str);
}
ulong env_get_hex(const char *varname, ulong default_val)
{
const char *s;
ulong value;
char *endp;
s = env_get(varname);
if (s)
value = hextoul(s, &endp);
if (!s || endp == s)
return default_val;
return value;
}
int eth_env_get_enetaddr(const char *name, uint8_t *enetaddr)
{
string_to_enetaddr(env_get(name), enetaddr);
return is_valid_ethaddr(enetaddr);
}
int eth_env_set_enetaddr(const char *name, const uint8_t *enetaddr)
{
char buf[ARP_HLEN_ASCII + 1];
if (eth_env_get_enetaddr(name, (uint8_t *)buf))
return -EEXIST;
sprintf(buf, "%pM", enetaddr);
return env_set(name, buf);
}
/*
* Look up variable from environment,
* return address of storage for that variable,
* or NULL if not found
*/
char *env_get(const char *name)
{
if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */
struct env_entry e, *ep;
WATCHDOG_RESET();
e.key = name;
e.data = NULL;
hsearch_r(e, ENV_FIND, &ep, &env_htab, 0);
return ep ? ep->data : NULL;
}
/* restricted capabilities before import */
if (env_get_f(name, (char *)(gd->env_buf), sizeof(gd->env_buf)) > 0)
return (char *)(gd->env_buf);
return NULL;
}
/*
* Like env_get, but prints an error if envvar isn't defined in the
* environment. It always returns what env_get does, so it can be used in
* place of env_get without changing error handling otherwise.
*/
char *from_env(const char *envvar)
{
char *ret;
ret = env_get(envvar);
if (!ret)
printf("missing environment variable: %s\n", envvar);
return ret;
}
/*
* Look up variable from environment for restricted C runtime env.
*/
int env_get_f(const char *name, char *buf, unsigned len)
{
const char *env, *p, *end;
size_t name_len;
if (name == NULL || *name == '\0')
return -1;
name_len = strlen(name);
if (gd->env_valid == ENV_INVALID)
env = (const char *)default_environment;
else
env = (const char *)gd->env_addr;
for (p = env; *p != '\0'; p = end + 1) {
const char *value;
unsigned res;
for (end = p; *end != '\0'; ++end)
if (end - env >= CONFIG_ENV_SIZE)
return -1;
if (strncmp(name, p, name_len) || p[name_len] != '=')
continue;
value = &p[name_len + 1];
res = end - value;
memcpy(buf, value, min(len, res + 1));
if (len <= res) {
buf[len - 1] = '\0';
printf("env_buf [%u bytes] too small for value of \"%s\"\n",
len, name);
}
return res;
}
return -1;
}
/**
* Decode the integer value of an environment variable and return it.
*
* @param name Name of environment 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
*/
ulong env_get_ulong(const char *name, int base, ulong default_val)
{
/*
* We can use env_get() here, even before relocation, since the
* environment variable value is an integer and thus short.
*/
const char *str = env_get(name);
return str ? simple_strtoul(str, NULL, base) : default_val;
}
/*
* Read an environment variable as a boolean
* Return -1 if variable does not exist (default to true)

18
env/eeprom.c vendored
View file

@ -64,24 +64,6 @@ static int eeprom_bus_write(unsigned dev_addr, unsigned offset,
return rcode;
}
/** Call this function from overridden env_get_char_spec() if you need
* this functionality.
*/
int env_eeprom_get_char(int index)
{
uchar c;
unsigned int off = CONFIG_ENV_OFFSET;
#ifdef CONFIG_ENV_OFFSET_REDUND
if (gd->env_valid == ENV_REDUND)
off = CONFIG_ENV_OFFSET_REDUND;
#endif
eeprom_bus_read(CONFIG_SYS_I2C_EEPROM_ADDR,
off + index + offsetof(env_t, data), &c, 1);
return c;
}
static int env_eeprom_load(void)
{
char buf_env[CONFIG_ENV_SIZE];

13
env/env.c vendored
View file

@ -166,19 +166,6 @@ static struct env_driver *env_driver_lookup(enum env_operation op, int prio)
return drv;
}
__weak int env_get_char_spec(int index)
{
return *(uchar *)(gd->env_addr + index);
}
int env_get_char(int index)
{
if (gd->env_valid == ENV_INVALID)
return default_environment[index];
else
return env_get_char_spec(index);
}
int env_load(void)
{
struct env_driver *drv;

5
env/nowhere.c vendored
View file

@ -31,9 +31,8 @@ static int env_nowhere_init(void)
static int env_nowhere_load(void)
{
/*
* for SPL, set env_valid = ENV_INVALID is enough as env_get_char()
* return the default env if env_get is used
* and SPL don't used env_import to reduce its size
* For SPL, setting env_valid = ENV_INVALID is enough, as env_get()
* searches default_environment array in that case.
* For U-Boot proper, import the default environment to allow reload.
*/
if (!IS_ENABLED(CONFIG_SPL_BUILD))

14
env/nvram.c vendored
View file

@ -42,20 +42,6 @@ extern void nvram_write(long dest, const void *src, size_t count);
static env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR;
#endif
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
/** Call this function from overridden env_get_char_spec() if you need
* this functionality.
*/
int env_nvram_get_char(int index)
{
uchar c;
nvram_read(&c, CONFIG_ENV_ADDR + index, 1);
return c;
}
#endif
static int env_nvram_load(void)
{
char buf[CONFIG_ENV_SIZE];

View file

@ -365,11 +365,6 @@ const char * ub_env_enum(const char *last)
env = NULL;
/*
* It's OK to pass only the name piece as last (and not the whole
* 'name=val' string), since the API_ENUM_ENV call uses env_match()
* internally, which handles such case
*/
if (!syscall(API_ENV_ENUM, NULL, last, &env))
return NULL;

View file

@ -48,8 +48,6 @@ void dm_dump_driver_compat(void);
/* Dump out a list of drivers with static platform data */
void dm_dump_static_driver_info(void);
#endif
#if CONFIG_IS_ENABLED(OF_PLATDATA_INST) && CONFIG_IS_ENABLED(READ_ONLY)
void *dm_priv_to_rw(void *priv);
#else
@ -58,3 +56,5 @@ static inline void *dm_priv_to_rw(void *priv)
return priv;
}
#endif
#endif

View file

@ -90,17 +90,6 @@ int env_init(void);
*/
void env_relocate(void);
/**
* env_match() - Match a name / name=value pair
*
* This is used prior to relocation for finding envrionment variables
*
* @name: A simple 'name', or a 'name=value' pair.
* @index: The environment index for a 'name2=value2' pair.
* @return index for the value if the names match, else -1.
*/
int env_match(unsigned char *name, int index);
/**
* env_get() - Look up the value of an environment variable
*
@ -131,7 +120,8 @@ char *from_env(const char *envvar);
* support reading the value (slowly) and some will not.
*
* @varname: Variable to look up
* @return value of variable, or NULL if not found
* @return actual length of the variable value excluding the terminating
* NULL-byte, or -1 if the variable is not found
*/
int env_get_f(const char *name, char *buf, unsigned int len);
@ -359,16 +349,6 @@ char *env_get_default(const char *name);
/* [re]set to the default environment */
void env_set_default(const char *s, int flags);
/**
* env_get_char() - Get a character from the early environment
*
* This reads from the pre-relocation environment
*
* @index: Index of character to read (0 = first)
* @return character read, or -ve on error
*/
int env_get_char(int index);
/**
* env_reloc() - Relocate the 'env' sub-commands
*

View file

@ -498,7 +498,7 @@ class Toolchains:
if arch == 'aarch64':
arch = 'arm64'
base = 'https://www.kernel.org/pub/tools/crosstool/files/bin'
versions = ['9.2.0', '7.3.0', '6.4.0', '4.9.4']
versions = ['11.1.0', '9.2.0', '7.3.0', '6.4.0', '4.9.4']
links = []
for version in versions:
url = '%s/%s/%s/' % (base, arch, version)