mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-04-02 12:31:31 +00:00
Merge branch '2021-01-16-assorted-improvements'
- Assorted testing improvements and fixes - Assorted code cleanups
This commit is contained in:
commit
19c5fdffdc
43 changed files with 490 additions and 110 deletions
|
@ -9,14 +9,16 @@ obj-y += cpu.o
|
||||||
ifndef CONFIG_$(SPL_TPL_)TIMER
|
ifndef CONFIG_$(SPL_TPL_)TIMER
|
||||||
obj-$(CONFIG_SYS_ARCH_TIMER) += generic_timer.o
|
obj-$(CONFIG_SYS_ARCH_TIMER) += generic_timer.o
|
||||||
endif
|
endif
|
||||||
|
ifndef CONFIG_$(SPL_)SYS_DCACHE_OFF
|
||||||
obj-y += cache_v8.o
|
obj-y += cache_v8.o
|
||||||
|
obj-y += cache.o
|
||||||
|
endif
|
||||||
ifdef CONFIG_SPL_BUILD
|
ifdef CONFIG_SPL_BUILD
|
||||||
obj-$(CONFIG_ARMV8_SPL_EXCEPTION_VECTORS) += exceptions.o
|
obj-$(CONFIG_ARMV8_SPL_EXCEPTION_VECTORS) += exceptions.o
|
||||||
else
|
else
|
||||||
obj-y += exceptions.o
|
obj-y += exceptions.o
|
||||||
obj-y += exception_level.o
|
obj-y += exception_level.o
|
||||||
endif
|
endif
|
||||||
obj-y += cache.o
|
|
||||||
obj-y += tlb.o
|
obj-y += tlb.o
|
||||||
obj-y += transition.o
|
obj-y += transition.o
|
||||||
ifndef CONFIG_ARMV8_PSCI
|
ifndef CONFIG_ARMV8_PSCI
|
||||||
|
|
|
@ -122,6 +122,7 @@ config CMD_CONSOLE
|
||||||
|
|
||||||
config CMD_CPU
|
config CMD_CPU
|
||||||
bool "cpu"
|
bool "cpu"
|
||||||
|
depends on CPU
|
||||||
help
|
help
|
||||||
Print information about available CPUs. This normally shows the
|
Print information about available CPUs. This normally shows the
|
||||||
number of CPUs, type (e.g. manufacturer, architecture, product or
|
number of CPUs, type (e.g. manufacturer, architecture, product or
|
||||||
|
|
|
@ -45,6 +45,7 @@ enum bootmenu_key {
|
||||||
KEY_UP,
|
KEY_UP,
|
||||||
KEY_DOWN,
|
KEY_DOWN,
|
||||||
KEY_SELECT,
|
KEY_SELECT,
|
||||||
|
KEY_QUIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *bootmenu_getoption(unsigned short int n)
|
static char *bootmenu_getoption(unsigned short int n)
|
||||||
|
@ -109,6 +110,9 @@ static void bootmenu_autoboot_loop(struct bootmenu_data *menu,
|
||||||
case '\r':
|
case '\r':
|
||||||
*key = KEY_SELECT;
|
*key = KEY_SELECT;
|
||||||
break;
|
break;
|
||||||
|
case 0x3: /* ^C */
|
||||||
|
*key = KEY_QUIT;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
*key = KEY_NONE;
|
*key = KEY_NONE;
|
||||||
break;
|
break;
|
||||||
|
@ -136,12 +140,24 @@ static void bootmenu_loop(struct bootmenu_data *menu,
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
|
if (*esc == 1) {
|
||||||
|
if (tstc()) {
|
||||||
|
c = getchar();
|
||||||
|
} else {
|
||||||
|
WATCHDOG_RESET();
|
||||||
|
mdelay(10);
|
||||||
|
if (tstc())
|
||||||
|
c = getchar();
|
||||||
|
else
|
||||||
|
c = '\e';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
while (!tstc()) {
|
while (!tstc()) {
|
||||||
WATCHDOG_RESET();
|
WATCHDOG_RESET();
|
||||||
mdelay(10);
|
mdelay(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
c = getchar();
|
c = getchar();
|
||||||
|
}
|
||||||
|
|
||||||
switch (*esc) {
|
switch (*esc) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -157,7 +173,9 @@ static void bootmenu_loop(struct bootmenu_data *menu,
|
||||||
*esc = 2;
|
*esc = 2;
|
||||||
*key = KEY_NONE;
|
*key = KEY_NONE;
|
||||||
} else {
|
} else {
|
||||||
*esc = 0;
|
/* Alone ESC key was pressed */
|
||||||
|
*key = KEY_QUIT;
|
||||||
|
*esc = (c == '\e') ? 1 : 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -187,6 +205,10 @@ static void bootmenu_loop(struct bootmenu_data *menu,
|
||||||
/* enter key was pressed */
|
/* enter key was pressed */
|
||||||
if (c == '\r')
|
if (c == '\r')
|
||||||
*key = KEY_SELECT;
|
*key = KEY_SELECT;
|
||||||
|
|
||||||
|
/* ^C was pressed */
|
||||||
|
if (c == 0x3)
|
||||||
|
*key = KEY_QUIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *bootmenu_choice_entry(void *data)
|
static char *bootmenu_choice_entry(void *data)
|
||||||
|
@ -222,6 +244,12 @@ static char *bootmenu_choice_entry(void *data)
|
||||||
for (i = 0; i < menu->active; ++i)
|
for (i = 0; i < menu->active; ++i)
|
||||||
iter = iter->next;
|
iter = iter->next;
|
||||||
return iter->key;
|
return iter->key;
|
||||||
|
case KEY_QUIT:
|
||||||
|
/* Quit by choosing the last entry - U-Boot console */
|
||||||
|
iter = menu->first;
|
||||||
|
while (iter->next)
|
||||||
|
iter = iter->next;
|
||||||
|
return iter->key;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -389,7 +417,7 @@ static void menu_display_statusline(struct menu *m)
|
||||||
printf(ANSI_CURSOR_POSITION, menu->count + 5, 1);
|
printf(ANSI_CURSOR_POSITION, menu->count + 5, 1);
|
||||||
puts(ANSI_CLEAR_LINE);
|
puts(ANSI_CLEAR_LINE);
|
||||||
printf(ANSI_CURSOR_POSITION, menu->count + 6, 1);
|
printf(ANSI_CURSOR_POSITION, menu->count + 6, 1);
|
||||||
puts(" Press UP/DOWN to move, ENTER to select");
|
puts(" Press UP/DOWN to move, ENTER to select, ESC/CTRL+C to quit");
|
||||||
puts(ANSI_CLEAR_LINE_TO_END);
|
puts(ANSI_CLEAR_LINE_TO_END);
|
||||||
printf(ANSI_CURSOR_POSITION, menu->count + 7, 1);
|
printf(ANSI_CURSOR_POSITION, menu->count + 7, 1);
|
||||||
puts(ANSI_CLEAR_LINE);
|
puts(ANSI_CLEAR_LINE);
|
||||||
|
|
|
@ -120,7 +120,6 @@ int common_diskboot(struct cmd_tbl *cmdtp, const char *intf, int argc,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
bootstage_mark(BOOTSTAGE_ID_IDE_FIT_READ_OK);
|
bootstage_mark(BOOTSTAGE_ID_IDE_FIT_READ_OK);
|
||||||
fit_print_contents(fit_hdr);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
161
cmd/gpt.c
161
cmd/gpt.c
|
@ -18,6 +18,7 @@
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
#include <part.h>
|
#include <part.h>
|
||||||
#include <part_efi.h>
|
#include <part_efi.h>
|
||||||
|
#include <part.h>
|
||||||
#include <exports.h>
|
#include <exports.h>
|
||||||
#include <uuid.h>
|
#include <uuid.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
|
@ -621,6 +622,152 @@ static int gpt_verify(struct blk_desc *blk_dev_desc, const char *str_part)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gpt_enumerate() - Enumerate partition names into environment variable.
|
||||||
|
*
|
||||||
|
* Enumerate partition names. Partition names are stored in gpt_partition_list
|
||||||
|
* environment variable. Each partition name is delimited by space.
|
||||||
|
*
|
||||||
|
* @desc: block device descriptor
|
||||||
|
*
|
||||||
|
* @Return: '0' on success and -ve error on failure
|
||||||
|
*/
|
||||||
|
static int gpt_enumerate(struct blk_desc *desc)
|
||||||
|
{
|
||||||
|
struct part_driver *first_drv, *part_drv;
|
||||||
|
int str_len = 0, tmp_len;
|
||||||
|
char part_list[2048];
|
||||||
|
int n_drvs;
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
part_list[0] = 0;
|
||||||
|
n_drvs = part_driver_get_count();
|
||||||
|
if (!n_drvs) {
|
||||||
|
printf("Failed to get partition driver count\n");
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
first_drv = part_driver_get_first();
|
||||||
|
for (part_drv = first_drv; part_drv != first_drv + n_drvs; part_drv++) {
|
||||||
|
struct disk_partition pinfo;
|
||||||
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; i < part_drv->max_entries; i++) {
|
||||||
|
ret = part_drv->get_info(desc, i, &pinfo);
|
||||||
|
if (ret) {
|
||||||
|
/* no more entries in table */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = &part_list[str_len];
|
||||||
|
tmp_len = strlen((const char *)pinfo.name);
|
||||||
|
str_len += tmp_len;
|
||||||
|
/* +1 for space */
|
||||||
|
str_len++;
|
||||||
|
if (str_len > sizeof(part_list)) {
|
||||||
|
printf("Error insufficient memory\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
strcpy(ptr, (const char *)pinfo.name);
|
||||||
|
/* One byte for space(" ") delimiter */
|
||||||
|
ptr[tmp_len] = ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*part_list)
|
||||||
|
part_list[strlen(part_list) - 1] = 0;
|
||||||
|
debug("setenv gpt_partition_list %s\n", part_list);
|
||||||
|
|
||||||
|
return env_set("gpt_partition_list", part_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gpt_setenv_part_variables() - setup partition environmental variables
|
||||||
|
*
|
||||||
|
* Setup the gpt_partition_name, gpt_partition_entry, gpt_partition_addr
|
||||||
|
* and gpt_partition_size environment variables.
|
||||||
|
*
|
||||||
|
* @pinfo: pointer to disk partition
|
||||||
|
* @i: partition entry
|
||||||
|
*
|
||||||
|
* @Return: '0' on success and -ENOENT on failure
|
||||||
|
*/
|
||||||
|
static int gpt_setenv_part_variables(struct disk_partition *pinfo, int i)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = env_set_hex("gpt_partition_addr", pinfo->start);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
ret = env_set_hex("gpt_partition_size", pinfo->size);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
ret = env_set_ulong("gpt_partition_entry", i);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
ret = env_set("gpt_partition_name", (const char *)pinfo->name);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gpt_setenv() - Dynamically setup environment variables.
|
||||||
|
*
|
||||||
|
* Dynamically setup environment variables for name, index, offset and size
|
||||||
|
* for partition in GPT table after running "gpt setenv" for a partition name.
|
||||||
|
*
|
||||||
|
* @desc: block device descriptor
|
||||||
|
* @name: partition name
|
||||||
|
*
|
||||||
|
* @Return: '0' on success and -ve err on failure
|
||||||
|
*/
|
||||||
|
static int gpt_setenv(struct blk_desc *desc, const char *name)
|
||||||
|
{
|
||||||
|
struct part_driver *first_drv, *part_drv;
|
||||||
|
int n_drvs;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
n_drvs = part_driver_get_count();
|
||||||
|
if (!n_drvs) {
|
||||||
|
printf("Failed to get partition driver count\n");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
first_drv = part_driver_get_first();
|
||||||
|
for (part_drv = first_drv; part_drv != first_drv + n_drvs; part_drv++) {
|
||||||
|
struct disk_partition pinfo;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; i < part_drv->max_entries; i++) {
|
||||||
|
ret = part_drv->get_info(desc, i, &pinfo);
|
||||||
|
if (ret) {
|
||||||
|
/* no more entries in table */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(name, (const char *)pinfo.name)) {
|
||||||
|
/* match found, setup environment variables */
|
||||||
|
ret = gpt_setenv_part_variables(&pinfo, i);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fail:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int do_disk_guid(struct blk_desc *dev_desc, char * const namestr)
|
static int do_disk_guid(struct blk_desc *dev_desc, char * const namestr)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -827,6 +974,10 @@ static int do_gpt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
||||||
} else if ((strcmp(argv[1], "verify") == 0)) {
|
} else if ((strcmp(argv[1], "verify") == 0)) {
|
||||||
ret = gpt_verify(blk_dev_desc, argv[4]);
|
ret = gpt_verify(blk_dev_desc, argv[4]);
|
||||||
printf("Verify GPT: ");
|
printf("Verify GPT: ");
|
||||||
|
} else if ((strcmp(argv[1], "setenv") == 0)) {
|
||||||
|
ret = gpt_setenv(blk_dev_desc, argv[4]);
|
||||||
|
} else if ((strcmp(argv[1], "enumerate") == 0)) {
|
||||||
|
ret = gpt_enumerate(blk_dev_desc);
|
||||||
} else if (strcmp(argv[1], "guid") == 0) {
|
} else if (strcmp(argv[1], "guid") == 0) {
|
||||||
ret = do_disk_guid(blk_dev_desc, argv[4]);
|
ret = do_disk_guid(blk_dev_desc, argv[4]);
|
||||||
#ifdef CONFIG_CMD_GPT_RENAME
|
#ifdef CONFIG_CMD_GPT_RENAME
|
||||||
|
@ -857,7 +1008,17 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
|
||||||
" to interface\n"
|
" to interface\n"
|
||||||
" Example usage:\n"
|
" Example usage:\n"
|
||||||
" gpt write mmc 0 $partitions\n"
|
" gpt write mmc 0 $partitions\n"
|
||||||
|
" - write the GPT to device\n"
|
||||||
" gpt verify mmc 0 $partitions\n"
|
" gpt verify mmc 0 $partitions\n"
|
||||||
|
" - verify the GPT on device against $partitions\n"
|
||||||
|
" gpt setenv mmc 0 $name\n"
|
||||||
|
" - setup environment variables for partition $name:\n"
|
||||||
|
" gpt_partition_addr, gpt_partition_size,\n"
|
||||||
|
" gpt_partition_name, gpt_partition_entry\n"
|
||||||
|
" gpt enumerate mmc 0\n"
|
||||||
|
" - store list of partitions to gpt_partition_list environment variable\n"
|
||||||
|
" read <interface> <dev>\n"
|
||||||
|
" - read GPT into a data structure for manipulation\n"
|
||||||
" gpt guid <interface> <dev>\n"
|
" gpt guid <interface> <dev>\n"
|
||||||
" - print disk GUID\n"
|
" - print disk GUID\n"
|
||||||
" gpt guid <interface> <dev> <varname>\n"
|
" gpt guid <interface> <dev> <varname>\n"
|
||||||
|
|
|
@ -819,7 +819,10 @@ config AUTOBOOT_STOP_STR_SHA256
|
||||||
This option adds the feature to only stop the autobooting,
|
This option adds the feature to only stop the autobooting,
|
||||||
and therefore boot into the U-Boot prompt, when the input
|
and therefore boot into the U-Boot prompt, when the input
|
||||||
string / password matches a values that is encypted via
|
string / password matches a values that is encypted via
|
||||||
a SHA256 hash and saved in the environment.
|
a SHA256 hash and saved in the environment variable
|
||||||
|
"bootstopkeysha256". If the value in that variable
|
||||||
|
includes a ":", the portion prior to the ":" will be treated
|
||||||
|
as a salt value.
|
||||||
|
|
||||||
config AUTOBOOT_USE_MENUKEY
|
config AUTOBOOT_USE_MENUKEY
|
||||||
bool "Allow a specify key to run a menu from the environment"
|
bool "Allow a specify key to run a menu from the environment"
|
||||||
|
|
|
@ -68,7 +68,6 @@ obj-$(CONFIG_DFU_OVER_USB) += dfu.o
|
||||||
endif
|
endif
|
||||||
obj-$(CONFIG_SPL_HASH_SUPPORT) += hash.o
|
obj-$(CONFIG_SPL_HASH_SUPPORT) += hash.o
|
||||||
obj-$(CONFIG_TPL_HASH_SUPPORT) += hash.o
|
obj-$(CONFIG_TPL_HASH_SUPPORT) += hash.o
|
||||||
obj-$(CONFIG_SPL_YMODEM_SUPPORT) += xyzModem.o
|
|
||||||
obj-$(CONFIG_SPL_LOAD_FIT) += common_fit.o
|
obj-$(CONFIG_SPL_LOAD_FIT) += common_fit.o
|
||||||
obj-$(CONFIG_SPL_NET_SUPPORT) += miiphyutil.o
|
obj-$(CONFIG_SPL_NET_SUPPORT) += miiphyutil.o
|
||||||
obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += fdt_support.o
|
obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += fdt_support.o
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
#define MAX_DELAY_STOP_STR 32
|
#define MAX_DELAY_STOP_STR 64
|
||||||
|
|
||||||
#ifndef DEBUG_BOOTKEYS
|
#ifndef DEBUG_BOOTKEYS
|
||||||
#define DEBUG_BOOTKEYS 0
|
#define DEBUG_BOOTKEYS 0
|
||||||
|
@ -80,6 +80,7 @@ static int passwd_abort_sha256(uint64_t etime)
|
||||||
u8 sha_env[SHA256_SUM_LEN];
|
u8 sha_env[SHA256_SUM_LEN];
|
||||||
u8 *sha;
|
u8 *sha;
|
||||||
char *presskey;
|
char *presskey;
|
||||||
|
char *c;
|
||||||
const char *algo_name = "sha256";
|
const char *algo_name = "sha256";
|
||||||
u_int presskey_len = 0;
|
u_int presskey_len = 0;
|
||||||
int abort = 0;
|
int abort = 0;
|
||||||
|
@ -89,6 +90,14 @@ static int passwd_abort_sha256(uint64_t etime)
|
||||||
if (sha_env_str == NULL)
|
if (sha_env_str == NULL)
|
||||||
sha_env_str = AUTOBOOT_STOP_STR_SHA256;
|
sha_env_str = AUTOBOOT_STOP_STR_SHA256;
|
||||||
|
|
||||||
|
presskey = malloc_cache_aligned(MAX_DELAY_STOP_STR);
|
||||||
|
c = strstr(sha_env_str, ":");
|
||||||
|
if (c && (c - sha_env_str < MAX_DELAY_STOP_STR)) {
|
||||||
|
/* preload presskey with salt */
|
||||||
|
memcpy(presskey, sha_env_str, c - sha_env_str);
|
||||||
|
presskey_len = c - sha_env_str;
|
||||||
|
sha_env_str = c + 1;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Generate the binary value from the environment hash value
|
* Generate the binary value from the environment hash value
|
||||||
* so that we can compare this value with the computed hash
|
* so that we can compare this value with the computed hash
|
||||||
|
@ -100,7 +109,6 @@ static int passwd_abort_sha256(uint64_t etime)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
presskey = malloc_cache_aligned(MAX_DELAY_STOP_STR);
|
|
||||||
sha = malloc_cache_aligned(SHA256_SUM_LEN);
|
sha = malloc_cache_aligned(SHA256_SUM_LEN);
|
||||||
size = SHA256_SUM_LEN;
|
size = SHA256_SUM_LEN;
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -493,8 +493,10 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
cread_add_char(ichar, insert, &num, &eol_num, buf,
|
if (ichar >= ' ' && ichar <= '~') {
|
||||||
*len);
|
cread_add_char(ichar, insert, &num, &eol_num,
|
||||||
|
buf, *len);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use puts() instead of printf() to avoid printf buffer overflow
|
* Use puts() instead of printf() to avoid printf buffer overflow
|
||||||
* for long help messages
|
* for long help messages
|
||||||
|
@ -488,9 +490,6 @@ int cmd_get_data_size(char* arg, int default_size)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_NEEDS_MANUAL_RELOC)
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
|
||||||
|
|
||||||
void fixup_cmdtable(struct cmd_tbl *cmdtp, int size)
|
void fixup_cmdtable(struct cmd_tbl *cmdtp, int size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -535,7 +534,6 @@ void fixup_cmdtable(struct cmd_tbl *cmdtp, int size)
|
||||||
cmdtp++;
|
cmdtp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
int cmd_always_repeatable(struct cmd_tbl *cmdtp, int flag, int argc,
|
int cmd_always_repeatable(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||||
char *const argv[], int *repeatable)
|
char *const argv[], int *repeatable)
|
||||||
|
|
|
@ -1029,11 +1029,6 @@ done:
|
||||||
|
|
||||||
gd->flags |= GD_FLG_DEVINIT; /* device initialization completed */
|
gd->flags |= GD_FLG_DEVINIT; /* device initialization completed */
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* If nothing usable installed, use only the initial console */
|
|
||||||
if ((stdio_devices[stdin] == NULL) && (stdio_devices[stdout] == NULL))
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
print_pre_console_buffer(flushpoint);
|
print_pre_console_buffer(flushpoint);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1105,11 +1100,6 @@ int console_init_r(void)
|
||||||
|
|
||||||
gd->flags |= GD_FLG_DEVINIT; /* device initialization completed */
|
gd->flags |= GD_FLG_DEVINIT; /* device initialization completed */
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* If nothing usable installed, use only the initial console */
|
|
||||||
if ((stdio_devices[stdin] == NULL) && (stdio_devices[stdout] == NULL))
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
print_pre_console_buffer(flushpoint);
|
print_pre_console_buffer(flushpoint);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -684,8 +684,11 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
|
||||||
|
|
||||||
ret = spl_load_fit_image(info, sector, fit, base_offset, node,
|
ret = spl_load_fit_image(info, sector, fit, base_offset, node,
|
||||||
&image_info);
|
&image_info);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
continue;
|
printf("%s: can't load image loadables index %d (ret = %d)\n",
|
||||||
|
__func__, index, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (!spl_fit_image_get_os(fit, node, &os_type))
|
if (!spl_fit_image_get_os(fit, node, &os_type))
|
||||||
debug("Loadable is %s\n", genimg_get_os_name(os_type));
|
debug("Loadable is %s\n", genimg_get_os_name(os_type));
|
||||||
|
|
|
@ -247,10 +247,11 @@ void part_print_efi(struct blk_desc *dev_desc)
|
||||||
uuid_bin = (unsigned char *)gpt_pte[i].partition_type_guid.b;
|
uuid_bin = (unsigned char *)gpt_pte[i].partition_type_guid.b;
|
||||||
uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
|
uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
|
||||||
printf("\ttype:\t%s\n", uuid);
|
printf("\ttype:\t%s\n", uuid);
|
||||||
#ifdef CONFIG_PARTITION_TYPE_GUID
|
if (CONFIG_IS_ENABLED(PARTITION_TYPE_GUID)) {
|
||||||
if (!uuid_guid_get_str(uuid_bin, uuid))
|
const char *type = uuid_guid_get_str(uuid_bin);
|
||||||
printf("\ttype:\t%s\n", uuid);
|
if (type)
|
||||||
#endif
|
printf("\ttype:\t%s\n", type);
|
||||||
|
}
|
||||||
uuid_bin = (unsigned char *)gpt_pte[i].unique_partition_guid.b;
|
uuid_bin = (unsigned char *)gpt_pte[i].unique_partition_guid.b;
|
||||||
uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
|
uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
|
||||||
printf("\tguid:\t%s\n", uuid);
|
printf("\tguid:\t%s\n", uuid);
|
||||||
|
|
|
@ -267,6 +267,8 @@ Some strings can be also used at the place of known GUID :
|
||||||
(0657FD6D-A4AB-43C4-84E5-0933C84B4F4F)
|
(0657FD6D-A4AB-43C4-84E5-0933C84B4F4F)
|
||||||
"lvm" = PARTITION_LINUX_LVM_GUID
|
"lvm" = PARTITION_LINUX_LVM_GUID
|
||||||
(E6D6D379-F507-44C2-A23C-238F2A3DF928)
|
(E6D6D379-F507-44C2-A23C-238F2A3DF928)
|
||||||
|
"u-boot-env" = PARTITION_U_BOOT_ENVIRONMENT
|
||||||
|
(3DE21764-95BD-54BD-A5C3-4ABE786F38A8)
|
||||||
|
|
||||||
"uuid_disk=...;name=u-boot,size=60MiB,uuid=...;
|
"uuid_disk=...;name=u-boot,size=60MiB,uuid=...;
|
||||||
name=kernel,size=60MiB,uuid=...,type=linux;"
|
name=kernel,size=60MiB,uuid=...,type=linux;"
|
||||||
|
|
|
@ -757,6 +757,25 @@ int uclass_pre_remove_device(struct udevice *dev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int uclass_probe_all(enum uclass_id id)
|
||||||
|
{
|
||||||
|
struct udevice *dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = uclass_first_device(id, &dev);
|
||||||
|
if (ret || !dev)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Scanning uclass to probe all devices */
|
||||||
|
while (dev) {
|
||||||
|
ret = uclass_next_device(&dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
UCLASS_DRIVER(nop) = {
|
UCLASS_DRIVER(nop) = {
|
||||||
.id = UCLASS_NOP,
|
.id = UCLASS_NOP,
|
||||||
.name = "nop",
|
.name = "nop",
|
||||||
|
|
|
@ -9,8 +9,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __UBOOT__
|
#ifndef __UBOOT__
|
||||||
#include <log.h>
|
|
||||||
#include <dm/devres.h>
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
|
|
@ -18,7 +18,7 @@ config DM_REGULATOR
|
||||||
|
|
||||||
config SPL_DM_REGULATOR
|
config SPL_DM_REGULATOR
|
||||||
bool "Enable regulators for SPL"
|
bool "Enable regulators for SPL"
|
||||||
depends on DM_REGULATOR
|
depends on DM_REGULATOR && SPL_POWER_SUPPORT
|
||||||
---help---
|
---help---
|
||||||
Regulators are seldom needed in SPL. Even if they are accessed, some
|
Regulators are seldom needed in SPL. Even if they are accessed, some
|
||||||
code space can be saved by accessing the PMIC registers directly.
|
code space can be saved by accessing the PMIC registers directly.
|
||||||
|
|
|
@ -719,7 +719,7 @@ uint32_t lpddr4_checkctlinterrupt(const lpddr4_privatedata * pd,
|
||||||
|
|
||||||
/* MISRA compliance (Shifting operation) check */
|
/* MISRA compliance (Shifting operation) check */
|
||||||
if (fieldshift < WORD_SHIFT) {
|
if (fieldshift < WORD_SHIFT) {
|
||||||
if (((ctlirqstatus >> fieldshift) & BIT_MASK) > 0U) {
|
if ((ctlirqstatus >> fieldshift) & LPDDR4_BIT_MASK) {
|
||||||
*irqstatus = true;
|
*irqstatus = true;
|
||||||
} else {
|
} else {
|
||||||
*irqstatus = false;
|
*irqstatus = false;
|
||||||
|
@ -746,11 +746,11 @@ uint32_t lpddr4_ackctlinterrupt(const lpddr4_privatedata * pd,
|
||||||
if (localinterrupt > WORD_SHIFT) {
|
if (localinterrupt > WORD_SHIFT) {
|
||||||
localinterrupt =
|
localinterrupt =
|
||||||
(localinterrupt - (uint32_t) WORD_SHIFT);
|
(localinterrupt - (uint32_t) WORD_SHIFT);
|
||||||
regval = ((uint32_t) BIT_MASK << localinterrupt);
|
regval = (uint32_t)LPDDR4_BIT_MASK << localinterrupt;
|
||||||
CPS_REG_WRITE(&(ctlregbase->LPDDR4__INT_ACK_1__REG),
|
CPS_REG_WRITE(&(ctlregbase->LPDDR4__INT_ACK_1__REG),
|
||||||
regval);
|
regval);
|
||||||
} else {
|
} else {
|
||||||
regval = ((uint32_t) BIT_MASK << localinterrupt);
|
regval = (uint32_t)LPDDR4_BIT_MASK << localinterrupt;
|
||||||
CPS_REG_WRITE(&(ctlregbase->LPDDR4__INT_ACK_0__REG),
|
CPS_REG_WRITE(&(ctlregbase->LPDDR4__INT_ACK_0__REG),
|
||||||
regval);
|
regval);
|
||||||
}
|
}
|
||||||
|
@ -823,7 +823,7 @@ uint32_t lpddr4_checkphyindepinterrupt(const lpddr4_privatedata * pd,
|
||||||
phyindepirqstatus =
|
phyindepirqstatus =
|
||||||
CPS_REG_READ(&(ctlregbase->LPDDR4__PI_INT_STATUS__REG));
|
CPS_REG_READ(&(ctlregbase->LPDDR4__PI_INT_STATUS__REG));
|
||||||
*irqstatus =
|
*irqstatus =
|
||||||
(((phyindepirqstatus >> (uint32_t) intr) & BIT_MASK) > 0U);
|
!!((phyindepirqstatus >> (uint32_t)intr) & LPDDR4_BIT_MASK);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -841,7 +841,7 @@ uint32_t lpddr4_ackphyindepinterrupt(const lpddr4_privatedata * pd,
|
||||||
lpddr4_ctlregs *ctlregbase = (lpddr4_ctlregs *) pd->ctlbase;
|
lpddr4_ctlregs *ctlregbase = (lpddr4_ctlregs *) pd->ctlbase;
|
||||||
|
|
||||||
/* Write 1 to the requested bit to ACk the interrupt */
|
/* Write 1 to the requested bit to ACk the interrupt */
|
||||||
regval = ((uint32_t) BIT_MASK << ui32shiftinterrupt);
|
regval = (uint32_t)LPDDR4_BIT_MASK << ui32shiftinterrupt;
|
||||||
CPS_REG_WRITE(&(ctlregbase->LPDDR4__PI_INT_ACK__REG), regval);
|
CPS_REG_WRITE(&(ctlregbase->LPDDR4__PI_INT_ACK__REG), regval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -894,7 +894,7 @@ static void lpddr4_checkwrlvlerror(lpddr4_ctlregs * ctlregbase,
|
||||||
(volatile uint32_t
|
(volatile uint32_t
|
||||||
*)(&(ctlregbase->LPDDR4__PHY_WRLVL_ERROR_OBS_0__REG));
|
*)(&(ctlregbase->LPDDR4__PHY_WRLVL_ERROR_OBS_0__REG));
|
||||||
/* PHY_WRLVL_ERROR_OBS_X[1:0] should be zero */
|
/* PHY_WRLVL_ERROR_OBS_X[1:0] should be zero */
|
||||||
errbitmask = (BIT_MASK << 1) | (BIT_MASK);
|
errbitmask = (LPDDR4_BIT_MASK << 1) | LPDDR4_BIT_MASK;
|
||||||
for (snum = 0U; snum < DSLICE_NUM; snum++) {
|
for (snum = 0U; snum < DSLICE_NUM; snum++) {
|
||||||
regval = CPS_REG_READ(regaddress);
|
regval = CPS_REG_READ(regaddress);
|
||||||
if ((regval & errbitmask) != 0U) {
|
if ((regval & errbitmask) != 0U) {
|
||||||
|
@ -1054,7 +1054,7 @@ static void lpddr4_seterrors(lpddr4_ctlregs * ctlregbase,
|
||||||
lpddr4_debuginfo * debuginfo, bool * errfoundptr)
|
lpddr4_debuginfo * debuginfo, bool * errfoundptr)
|
||||||
{
|
{
|
||||||
|
|
||||||
uint32_t errbitmask = (BIT_MASK << 0x1U) | (BIT_MASK);
|
uint32_t errbitmask = (LPDDR4_BIT_MASK << 0x1U) | LPDDR4_BIT_MASK;
|
||||||
/* Check PLL observation registers for PLL lock errors */
|
/* Check PLL observation registers for PLL lock errors */
|
||||||
|
|
||||||
debuginfo->pllerror =
|
debuginfo->pllerror =
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#define VERSION_0 (0x54d5da40U)
|
#define VERSION_0 (0x54d5da40U)
|
||||||
#define VERSION_1 (0xc1865a1U)
|
#define VERSION_1 (0xc1865a1U)
|
||||||
|
|
||||||
#define BIT_MASK (0x1U)
|
#define LPDDR4_BIT_MASK (0x1U)
|
||||||
#define BYTE_MASK (0xffU)
|
#define BYTE_MASK (0xffU)
|
||||||
#define NIBBLE_MASK (0xfU)
|
#define NIBBLE_MASK (0xfU)
|
||||||
|
|
||||||
|
@ -46,11 +46,15 @@
|
||||||
#define IO_CALIB_DONE ((uint32_t)0x1U << 23U)
|
#define IO_CALIB_DONE ((uint32_t)0x1U << 23U)
|
||||||
#define IO_CALIB_FIELD ((uint32_t)NIBBLE_MASK << 28U)
|
#define IO_CALIB_FIELD ((uint32_t)NIBBLE_MASK << 28U)
|
||||||
#define IO_CALIB_STATE ((uint32_t)0xBU << 28U)
|
#define IO_CALIB_STATE ((uint32_t)0xBU << 28U)
|
||||||
#define RX_CAL_DONE ((uint32_t)BIT_MASK << 4U)
|
#define RX_CAL_DONE ((uint32_t)LPDDR4_BIT_MASK << 4U)
|
||||||
#define CA_TRAIN_RL (((uint32_t)BIT_MASK << 5U) | ((uint32_t)BIT_MASK << 4U))
|
#define CA_TRAIN_RL (((uint32_t)LPDDR4_BIT_MASK << 5U) | \
|
||||||
|
((uint32_t)LPDDR4_BIT_MASK << 4U))
|
||||||
#define WR_LVL_STATE (((uint32_t)NIBBLE_MASK) << 13U)
|
#define WR_LVL_STATE (((uint32_t)NIBBLE_MASK) << 13U)
|
||||||
#define GATE_LVL_ERROR_FIELDS (((uint32_t)BIT_MASK << 7U) | ((uint32_t)BIT_MASK << 6U))
|
#define GATE_LVL_ERROR_FIELDS (((uint32_t)LPDDR4_BIT_MASK << 7U) | \
|
||||||
#define READ_LVL_ERROR_FIELDS ((((uint32_t)NIBBLE_MASK) << 28U) | (((uint32_t)BYTE_MASK) << 16U))
|
((uint32_t)LPDDR4_BIT_MASK << 6U))
|
||||||
#define DQ_LVL_STATUS (((uint32_t)BIT_MASK << 26U) | (((uint32_t)BYTE_MASK) << 18U))
|
#define READ_LVL_ERROR_FIELDS ((((uint32_t)NIBBLE_MASK) << 28U) | \
|
||||||
|
(((uint32_t)BYTE_MASK) << 16U))
|
||||||
|
#define DQ_LVL_STATUS (((uint32_t)LPDDR4_BIT_MASK << 26U) | \
|
||||||
|
(((uint32_t)BYTE_MASK) << 18U))
|
||||||
|
|
||||||
#endif /* LPDDR4_PRIV_H */
|
#endif /* LPDDR4_PRIV_H */
|
||||||
|
|
|
@ -134,6 +134,22 @@ config SERIAL_SEARCH_ALL
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
|
config SERIAL_PROBE_ALL
|
||||||
|
bool "Probe all available serial devices"
|
||||||
|
depends on DM_SERIAL
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
The serial subsystem only probes for a single serial device,
|
||||||
|
but does not probe for other remaining serial devices.
|
||||||
|
With this option set, we make probing and searching for
|
||||||
|
all available devices optional.
|
||||||
|
Normally, U-Boot talks to one serial port at a time, but SBSA
|
||||||
|
compliant UART devices like PL011 require initialization
|
||||||
|
by firmware and to let the kernel use serial port for sending
|
||||||
|
and receiving the characters.
|
||||||
|
|
||||||
|
If unsure, say N.
|
||||||
|
|
||||||
config SPL_DM_SERIAL
|
config SPL_DM_SERIAL
|
||||||
bool "Enable Driver Model for serial drivers in SPL"
|
bool "Enable Driver Model for serial drivers in SPL"
|
||||||
depends on DM_SERIAL && SPL_DM
|
depends on DM_SERIAL && SPL_DM
|
||||||
|
|
|
@ -172,6 +172,15 @@ int serial_init(void)
|
||||||
/* Called after relocation */
|
/* Called after relocation */
|
||||||
int serial_initialize(void)
|
int serial_initialize(void)
|
||||||
{
|
{
|
||||||
|
/* Scanning uclass to probe devices */
|
||||||
|
if (IS_ENABLED(CONFIG_SERIAL_PROBE_ALL)) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = uclass_probe_all(UCLASS_SERIAL);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return serial_init();
|
return serial_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -199,7 +199,7 @@ config PANEL
|
||||||
|
|
||||||
config SIMPLE_PANEL
|
config SIMPLE_PANEL
|
||||||
bool "Enable simple panel support"
|
bool "Enable simple panel support"
|
||||||
depends on PANEL
|
depends on PANEL && BACKLIGHT
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
This turns on a simple panel driver that enables a compatible
|
This turns on a simple panel driver that enables a compatible
|
||||||
|
|
|
@ -33,7 +33,7 @@ targets += dt.dtb
|
||||||
$(DTB): arch-dtbs
|
$(DTB): arch-dtbs
|
||||||
$(Q)test -e $@ || ( \
|
$(Q)test -e $@ || ( \
|
||||||
echo >&2; \
|
echo >&2; \
|
||||||
echo >&2 "Device Tree Source is not correctly specified."; \
|
echo >&2 "Device Tree Source ($@) is not correctly specified."; \
|
||||||
echo >&2 "Please define 'CONFIG_DEFAULT_DEVICE_TREE'"; \
|
echo >&2 "Please define 'CONFIG_DEFAULT_DEVICE_TREE'"; \
|
||||||
echo >&2 "or build with 'DEVICE_TREE=<device_tree>' argument"; \
|
echo >&2 "or build with 'DEVICE_TREE=<device_tree>' argument"; \
|
||||||
echo >&2; \
|
echo >&2; \
|
||||||
|
|
|
@ -376,6 +376,17 @@ int uclass_next_device_check(struct udevice **devp);
|
||||||
int uclass_first_device_drvdata(enum uclass_id id, ulong driver_data,
|
int uclass_first_device_drvdata(enum uclass_id id, ulong driver_data,
|
||||||
struct udevice **devp);
|
struct udevice **devp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* uclass_probe_all() - Probe all devices based on an uclass ID
|
||||||
|
*
|
||||||
|
* This function probes all devices associated with a uclass by
|
||||||
|
* looking for its ID.
|
||||||
|
*
|
||||||
|
* @id: uclass ID to look up
|
||||||
|
* @return 0 if OK, other -ve on error
|
||||||
|
*/
|
||||||
|
int uclass_probe_all(enum uclass_id id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* uclass_id_foreach_dev() - Helper function to iteration through devices
|
* uclass_id_foreach_dev() - Helper function to iteration through devices
|
||||||
*
|
*
|
||||||
|
|
|
@ -156,6 +156,9 @@ static inline int _log_nop(enum log_category_t cat, enum log_level_t level,
|
||||||
*/
|
*/
|
||||||
#if CONFIG_IS_ENABLED(LOG)
|
#if CONFIG_IS_ENABLED(LOG)
|
||||||
#define _LOG_MAX_LEVEL CONFIG_VAL(LOG_MAX_LEVEL)
|
#define _LOG_MAX_LEVEL CONFIG_VAL(LOG_MAX_LEVEL)
|
||||||
|
#define log_emer(_fmt...) log(LOG_CATEGORY, LOGL_EMERG, ##_fmt)
|
||||||
|
#define log_alert(_fmt...) log(LOG_CATEGORY, LOGL_ALERT, ##_fmt)
|
||||||
|
#define log_crit(_fmt...) log(LOG_CATEGORY, LOGL_CRIT, ##_fmt)
|
||||||
#define log_err(_fmt...) log(LOG_CATEGORY, LOGL_ERR, ##_fmt)
|
#define log_err(_fmt...) log(LOG_CATEGORY, LOGL_ERR, ##_fmt)
|
||||||
#define log_warning(_fmt...) log(LOG_CATEGORY, LOGL_WARNING, ##_fmt)
|
#define log_warning(_fmt...) log(LOG_CATEGORY, LOGL_WARNING, ##_fmt)
|
||||||
#define log_notice(_fmt...) log(LOG_CATEGORY, LOGL_NOTICE, ##_fmt)
|
#define log_notice(_fmt...) log(LOG_CATEGORY, LOGL_NOTICE, ##_fmt)
|
||||||
|
@ -163,12 +166,17 @@ static inline int _log_nop(enum log_category_t cat, enum log_level_t level,
|
||||||
#define log_debug(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG, ##_fmt)
|
#define log_debug(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG, ##_fmt)
|
||||||
#define log_content(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG_CONTENT, ##_fmt)
|
#define log_content(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG_CONTENT, ##_fmt)
|
||||||
#define log_io(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG_IO, ##_fmt)
|
#define log_io(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG_IO, ##_fmt)
|
||||||
|
#define log_cont(_fmt...) log(LOGC_CONT, LOGL_CONT, ##_fmt)
|
||||||
#else
|
#else
|
||||||
#define _LOG_MAX_LEVEL LOGL_INFO
|
#define _LOG_MAX_LEVEL LOGL_INFO
|
||||||
|
#define log_emerg(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
||||||
|
#define log_alert(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
||||||
|
#define log_crit(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
||||||
#define log_err(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
#define log_err(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
||||||
#define log_warning(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
#define log_warning(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
||||||
#define log_notice(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
#define log_notice(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
||||||
#define log_info(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
#define log_info(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
||||||
|
#define log_cont(_fmt, ...) printf(_fmt, ##__VA_ARGS__)
|
||||||
#define log_debug(_fmt, ...) debug(_fmt, ##__VA_ARGS__)
|
#define log_debug(_fmt, ...) debug(_fmt, ##__VA_ARGS__)
|
||||||
#define log_content(_fmt...) log_nop(LOG_CATEGORY, \
|
#define log_content(_fmt...) log_nop(LOG_CATEGORY, \
|
||||||
LOGL_DEBUG_CONTENT, ##_fmt)
|
LOGL_DEBUG_CONTENT, ##_fmt)
|
||||||
|
@ -217,10 +225,9 @@ static inline int _log_nop(enum log_category_t cat, enum log_level_t level,
|
||||||
#if !_DEBUG && CONFIG_IS_ENABLED(LOG)
|
#if !_DEBUG && CONFIG_IS_ENABLED(LOG)
|
||||||
|
|
||||||
#define debug_cond(cond, fmt, args...) \
|
#define debug_cond(cond, fmt, args...) \
|
||||||
do { \
|
({ \
|
||||||
if (1) \
|
|
||||||
log(LOG_CATEGORY, LOGL_DEBUG, fmt, ##args); \
|
log(LOG_CATEGORY, LOGL_DEBUG, fmt, ##args); \
|
||||||
} while (0)
|
})
|
||||||
|
|
||||||
#else /* _DEBUG */
|
#else /* _DEBUG */
|
||||||
|
|
||||||
|
@ -230,10 +237,10 @@ static inline int _log_nop(enum log_category_t cat, enum log_level_t level,
|
||||||
* optimization.
|
* optimization.
|
||||||
*/
|
*/
|
||||||
#define debug_cond(cond, fmt, args...) \
|
#define debug_cond(cond, fmt, args...) \
|
||||||
do { \
|
({ \
|
||||||
if (cond) \
|
if (cond) \
|
||||||
printf(pr_fmt(fmt), ##args); \
|
printf(pr_fmt(fmt), ##args); \
|
||||||
} while (0)
|
})
|
||||||
|
|
||||||
#endif /* _DEBUG */
|
#endif /* _DEBUG */
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <blk.h>
|
#include <blk.h>
|
||||||
#include <ide.h>
|
#include <ide.h>
|
||||||
#include <uuid.h>
|
#include <uuid.h>
|
||||||
|
#include <linker_lists.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
|
||||||
struct block_drvr {
|
struct block_drvr {
|
||||||
|
@ -481,5 +482,33 @@ int layout_mbr_partitions(struct disk_partition *p, int count,
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_PARTITIONS
|
||||||
|
/**
|
||||||
|
* part_driver_get_count() - get partition driver count
|
||||||
|
*
|
||||||
|
* @return - number of partition drivers
|
||||||
|
*/
|
||||||
|
static inline int part_driver_get_count(void)
|
||||||
|
{
|
||||||
|
return ll_entry_count(struct part_driver, part_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* part_driver_get_first() - get first partition driver
|
||||||
|
*
|
||||||
|
* @return - pointer to first partition driver on success, otherwise NULL
|
||||||
|
*/
|
||||||
|
static inline struct part_driver *part_driver_get_first(void)
|
||||||
|
{
|
||||||
|
return ll_entry_start(struct part_driver, part_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
static inline int part_driver_get_count(void)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
|
static inline struct part_driver *part_driver_get_first(void)
|
||||||
|
{ return NULL; }
|
||||||
|
#endif /* CONFIG_PARTITIONS */
|
||||||
|
|
||||||
#endif /* _PART_H */
|
#endif /* _PART_H */
|
||||||
|
|
|
@ -56,6 +56,9 @@
|
||||||
#define PARTITION_LINUX_LVM_GUID \
|
#define PARTITION_LINUX_LVM_GUID \
|
||||||
EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \
|
EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \
|
||||||
0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28)
|
0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28)
|
||||||
|
#define PARTITION_U_BOOT_ENVIRONMENT \
|
||||||
|
EFI_GUID( 0x3de21764, 0x95bd, 0x54bd, \
|
||||||
|
0xa5, 0xc3, 0x4a, 0xbe, 0x78, 0x6f, 0x38, 0xa8)
|
||||||
|
|
||||||
/* linux/include/efi.h */
|
/* linux/include/efi.h */
|
||||||
typedef u16 efi_char16_t;
|
typedef u16 efi_char16_t;
|
||||||
|
|
|
@ -338,4 +338,22 @@ ulong ut_check_free(void);
|
||||||
*/
|
*/
|
||||||
long ut_check_delta(ulong last);
|
long ut_check_delta(ulong last);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ut_silence_console() - Silence the console if requested by the user
|
||||||
|
*
|
||||||
|
* This stops test output from appear on the console. It is the default on
|
||||||
|
* sandbox, unless the -v flag is given. For other boards, this does nothing.
|
||||||
|
*
|
||||||
|
* @uts: Test state (in case in future we want to keep state here)
|
||||||
|
*/
|
||||||
|
void ut_silence_console(struct unit_test_state *uts);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ut_unsilence_console() - Unsilence the console after a test
|
||||||
|
*
|
||||||
|
* This restarts console output again and turns off console recording. This
|
||||||
|
* happens on all boards, including sandbox.
|
||||||
|
*/
|
||||||
|
void ut_unsilence_console(struct unit_test_state *uts);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -39,10 +39,8 @@ int uuid_str_to_bin(const char *uuid_str, unsigned char *uuid_bin,
|
||||||
int str_format);
|
int str_format);
|
||||||
void uuid_bin_to_str(const unsigned char *uuid_bin, char *uuid_str,
|
void uuid_bin_to_str(const unsigned char *uuid_bin, char *uuid_str,
|
||||||
int str_format);
|
int str_format);
|
||||||
#ifdef CONFIG_PARTITION_TYPE_GUID
|
|
||||||
int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin);
|
int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin);
|
||||||
int uuid_guid_get_str(const unsigned char *guid_bin, char *guid_str);
|
const char *uuid_guid_get_str(const unsigned char *guid_bin);
|
||||||
#endif
|
|
||||||
void gen_rand_uuid(unsigned char *uuid_bin);
|
void gen_rand_uuid(unsigned char *uuid_bin);
|
||||||
void gen_rand_uuid_str(char *uuid_str, int str_format);
|
void gen_rand_uuid_str(char *uuid_str, int str_format);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -695,8 +695,8 @@ config LIB_DATE
|
||||||
config LIB_ELF
|
config LIB_ELF
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
Supoort basic elf loading/validating functions.
|
Support basic elf loading/validating functions.
|
||||||
This supports fir 32 bit and 64 bit versions.
|
This supports for 32 bit and 64 bit versions.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
|
|
|
@ -619,7 +619,7 @@ void aes_decrypt(u32 key_len, u8 *in, u8 *expkey, u8 *out)
|
||||||
static void debug_print_vector(char *name, u32 num_bytes, u8 *data)
|
static void debug_print_vector(char *name, u32 num_bytes, u8 *data)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("%s [%d] @0x%08x", name, num_bytes, (u32)data);
|
printf("%s [%d] @0x%p", name, num_bytes, data);
|
||||||
print_buffer(0, data, 1, num_bytes, 16);
|
print_buffer(0, data, 1, num_bytes, 16);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
14
lib/string.c
14
lib/string.c
|
@ -567,7 +567,19 @@ void * memmove(void * dest,const void *src,size_t count)
|
||||||
{
|
{
|
||||||
char *tmp, *s;
|
char *tmp, *s;
|
||||||
|
|
||||||
if (dest <= src) {
|
if (dest <= src || (src + count) <= dest) {
|
||||||
|
/*
|
||||||
|
* Use the fast memcpy implementation (ARCH optimized or lib/string.c) when it is possible:
|
||||||
|
* - when dest is before src (assuming that memcpy is doing forward-copying)
|
||||||
|
* - when destination don't overlap the source buffer (src + count <= dest)
|
||||||
|
*
|
||||||
|
* WARNING: the first optimisation cause an issue, when __HAVE_ARCH_MEMCPY is defined,
|
||||||
|
* __HAVE_ARCH_MEMMOVE is not defined and if the memcpy ARCH-specific
|
||||||
|
* implementation is not doing a forward-copying.
|
||||||
|
*
|
||||||
|
* No issue today because memcpy is doing a forward-copying in lib/string.c and for ARM32
|
||||||
|
* architecture; no other arches use __HAVE_ARCH_MEMCPY without __HAVE_ARCH_MEMMOVE.
|
||||||
|
*/
|
||||||
memcpy(dest, src, count);
|
memcpy(dest, src, count);
|
||||||
} else {
|
} else {
|
||||||
tmp = (char *) dest + count;
|
tmp = (char *) dest + count;
|
||||||
|
|
14
lib/uuid.c
14
lib/uuid.c
|
@ -96,7 +96,8 @@ static const struct {
|
||||||
{"linux", PARTITION_LINUX_FILE_SYSTEM_DATA_GUID},
|
{"linux", PARTITION_LINUX_FILE_SYSTEM_DATA_GUID},
|
||||||
{"raid", PARTITION_LINUX_RAID_GUID},
|
{"raid", PARTITION_LINUX_RAID_GUID},
|
||||||
{"swap", PARTITION_LINUX_SWAP_GUID},
|
{"swap", PARTITION_LINUX_SWAP_GUID},
|
||||||
{"lvm", PARTITION_LINUX_LVM_GUID}
|
{"lvm", PARTITION_LINUX_LVM_GUID},
|
||||||
|
{"u-boot-env", PARTITION_U_BOOT_ENVIRONMENT},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -122,20 +123,19 @@ int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin)
|
||||||
* uuid_guid_get_str() - this function get string for GUID.
|
* uuid_guid_get_str() - this function get string for GUID.
|
||||||
*
|
*
|
||||||
* @param guid_bin - pointer to string with partition type guid [16B]
|
* @param guid_bin - pointer to string with partition type guid [16B]
|
||||||
* @param guid_str - pointer to allocated partition type string [7B]
|
*
|
||||||
|
* Returns NULL if the type GUID is not known.
|
||||||
*/
|
*/
|
||||||
int uuid_guid_get_str(const unsigned char *guid_bin, char *guid_str)
|
const char *uuid_guid_get_str(const unsigned char *guid_bin)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
*guid_str = 0;
|
|
||||||
for (i = 0; i < ARRAY_SIZE(list_guid); i++) {
|
for (i = 0; i < ARRAY_SIZE(list_guid); i++) {
|
||||||
if (!memcmp(list_guid[i].guid.b, guid_bin, 16)) {
|
if (!memcmp(list_guid[i].guid.b, guid_bin, 16)) {
|
||||||
strcpy(guid_str, list_guid[i].string);
|
return list_guid[i].string;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -ENODEV;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1284,7 +1284,7 @@ local void check_match(s, start, match, length)
|
||||||
}
|
}
|
||||||
if (z_verbose > 1) {
|
if (z_verbose > 1) {
|
||||||
fprintf(stderr,"\\[%d,%d]", start-match, length);
|
fprintf(stderr,"\\[%d,%d]", start-match, length);
|
||||||
do { putc(s->window[start++], stderr); } while (--length != 0);
|
do { putc(s->window[start++]); } while (--length != 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
#include "deflate.h"
|
#include "deflate.h"
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
# include <ctype.h>
|
# include <linux/ctype.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# (C) Copyright 2012 The Chromium Authors
|
# (C) Copyright 2012 The Chromium Authors
|
||||||
|
|
||||||
ifneq ($(CONFIG_SANDBOX),)
|
ifneq ($(CONFIG_$(SPL_)BLOBLIST),)
|
||||||
obj-$(CONFIG_$(SPL_)CMDLINE) += bloblist.o
|
obj-$(CONFIG_$(SPL_)CMDLINE) += bloblist.o
|
||||||
endif
|
endif
|
||||||
obj-$(CONFIG_$(SPL_)CMDLINE) += bootm.o
|
obj-$(CONFIG_$(SPL_)CMDLINE) += bootm.o
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
#include <bloblist.h>
|
#include <bloblist.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <mapmem.h>
|
#include <mapmem.h>
|
||||||
#include <asm/state.h>
|
|
||||||
#include <test/suites.h>
|
#include <test/suites.h>
|
||||||
#include <test/test.h>
|
#include <test/test.h>
|
||||||
#include <test/ut.h>
|
#include <test/ut.h>
|
||||||
|
@ -240,7 +239,6 @@ BLOBLIST_TEST(bloblist_test_checksum, 0);
|
||||||
/* Test the 'bloblist info' command */
|
/* Test the 'bloblist info' command */
|
||||||
static int bloblist_test_cmd_info(struct unit_test_state *uts)
|
static int bloblist_test_cmd_info(struct unit_test_state *uts)
|
||||||
{
|
{
|
||||||
struct sandbox_state *state = state_get_current();
|
|
||||||
struct bloblist_hdr *hdr;
|
struct bloblist_hdr *hdr;
|
||||||
char *data, *data2;
|
char *data, *data2;
|
||||||
|
|
||||||
|
@ -250,8 +248,7 @@ static int bloblist_test_cmd_info(struct unit_test_state *uts)
|
||||||
data2 = bloblist_ensure(TEST_TAG2, TEST_SIZE2);
|
data2 = bloblist_ensure(TEST_TAG2, TEST_SIZE2);
|
||||||
|
|
||||||
console_record_reset_enable();
|
console_record_reset_enable();
|
||||||
if (!state->show_test_output)
|
ut_silence_console(uts);
|
||||||
gd->flags |= GD_FLG_SILENT;
|
|
||||||
console_record_reset();
|
console_record_reset();
|
||||||
run_command("bloblist info", 0);
|
run_command("bloblist info", 0);
|
||||||
ut_assert_nextline("base: %lx", (ulong)map_to_sysmem(hdr));
|
ut_assert_nextline("base: %lx", (ulong)map_to_sysmem(hdr));
|
||||||
|
@ -259,7 +256,7 @@ static int bloblist_test_cmd_info(struct unit_test_state *uts)
|
||||||
ut_assert_nextline("alloced: 70 112 Bytes");
|
ut_assert_nextline("alloced: 70 112 Bytes");
|
||||||
ut_assert_nextline("free: 390 912 Bytes");
|
ut_assert_nextline("free: 390 912 Bytes");
|
||||||
ut_assert_console_end();
|
ut_assert_console_end();
|
||||||
gd->flags &= ~(GD_FLG_SILENT | GD_FLG_RECORD);
|
ut_unsilence_console(uts);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -268,7 +265,6 @@ BLOBLIST_TEST(bloblist_test_cmd_info, 0);
|
||||||
/* Test the 'bloblist list' command */
|
/* Test the 'bloblist list' command */
|
||||||
static int bloblist_test_cmd_list(struct unit_test_state *uts)
|
static int bloblist_test_cmd_list(struct unit_test_state *uts)
|
||||||
{
|
{
|
||||||
struct sandbox_state *state = state_get_current();
|
|
||||||
struct bloblist_hdr *hdr;
|
struct bloblist_hdr *hdr;
|
||||||
char *data, *data2;
|
char *data, *data2;
|
||||||
|
|
||||||
|
@ -278,8 +274,7 @@ static int bloblist_test_cmd_list(struct unit_test_state *uts)
|
||||||
data2 = bloblist_ensure(TEST_TAG2, TEST_SIZE2);
|
data2 = bloblist_ensure(TEST_TAG2, TEST_SIZE2);
|
||||||
|
|
||||||
console_record_reset_enable();
|
console_record_reset_enable();
|
||||||
if (!state->show_test_output)
|
ut_silence_console(uts);
|
||||||
gd->flags |= GD_FLG_SILENT;
|
|
||||||
console_record_reset();
|
console_record_reset();
|
||||||
run_command("bloblist list", 0);
|
run_command("bloblist list", 0);
|
||||||
ut_assert_nextline("Address Size Tag Name");
|
ut_assert_nextline("Address Size Tag Name");
|
||||||
|
@ -288,7 +283,7 @@ static int bloblist_test_cmd_list(struct unit_test_state *uts)
|
||||||
ut_assert_nextline("%08lx %8x 2 SPL hand-off",
|
ut_assert_nextline("%08lx %8x 2 SPL hand-off",
|
||||||
(ulong)map_to_sysmem(data2), TEST_SIZE2);
|
(ulong)map_to_sysmem(data2), TEST_SIZE2);
|
||||||
ut_assert_console_end();
|
ut_assert_console_end();
|
||||||
gd->flags &= ~(GD_FLG_SILENT | GD_FLG_RECORD);
|
ut_unsilence_console(uts);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,6 @@ int do_ut_mem(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
||||||
struct unit_test *tests = ll_entry_start(struct unit_test, mem_test);
|
struct unit_test *tests = ll_entry_start(struct unit_test, mem_test);
|
||||||
const int n_ents = ll_entry_count(struct unit_test, mem_test);
|
const int n_ents = ll_entry_count(struct unit_test, mem_test);
|
||||||
|
|
||||||
return cmd_ut_category("cmd_mem", "cmd_mem_", tests, n_ents, argc,
|
return cmd_ut_category("cmd_mem", "mem_test_", tests, n_ents, argc,
|
||||||
argv);
|
argv);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ obj-$(CONFIG_EFI_LOADER) += efi_device_path.o
|
||||||
obj-$(CONFIG_EFI_SECURE_BOOT) += efi_image_region.o
|
obj-$(CONFIG_EFI_SECURE_BOOT) += efi_image_region.o
|
||||||
obj-y += hexdump.o
|
obj-y += hexdump.o
|
||||||
obj-y += lmb.o
|
obj-y += lmb.o
|
||||||
obj-y += test_print.o
|
obj-$(CONFIG_CONSOLE_RECORD) += test_print.o
|
||||||
obj-$(CONFIG_SSCANF) += sscanf.o
|
obj-$(CONFIG_SSCANF) += sscanf.o
|
||||||
obj-y += string.o
|
obj-y += string.o
|
||||||
obj-$(CONFIG_ERRNO_STR) += test_errno_str.o
|
obj-$(CONFIG_ERRNO_STR) += test_errno_str.o
|
||||||
|
|
|
@ -8,6 +8,7 @@ obj-$(CONFIG_CMD_LOG) += log_filter.o
|
||||||
ifdef CONFIG_UT_LOG
|
ifdef CONFIG_UT_LOG
|
||||||
|
|
||||||
obj-y += test-main.o
|
obj-y += test-main.o
|
||||||
|
obj-y += pr_cont_test.o
|
||||||
|
|
||||||
ifdef CONFIG_SANDBOX
|
ifdef CONFIG_SANDBOX
|
||||||
obj-$(CONFIG_LOG_SYSLOG) += syslog_test.o
|
obj-$(CONFIG_LOG_SYSLOG) += syslog_test.o
|
||||||
|
|
45
test/log/pr_cont_test.c
Normal file
45
test/log/pr_cont_test.c
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Heinrich Schuchardt <xypron.glpk@gmx.de>
|
||||||
|
*
|
||||||
|
* Test continuation of log messages using pr_cont().
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <console.h>
|
||||||
|
#include <test/log.h>
|
||||||
|
#include <test/test.h>
|
||||||
|
#include <test/suites.h>
|
||||||
|
#include <test/ut.h>
|
||||||
|
#include <linux/printk.h>
|
||||||
|
|
||||||
|
#define BUFFSIZE 64
|
||||||
|
|
||||||
|
#undef CONFIG_LOGLEVEL
|
||||||
|
#define CONFIG_LOGLEVEL 4
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
static int log_test_pr_cont(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
int log_fmt;
|
||||||
|
int log_level;
|
||||||
|
|
||||||
|
log_fmt = gd->log_fmt;
|
||||||
|
log_level = gd->default_log_level;
|
||||||
|
|
||||||
|
/* Write two messages, the second continuing the first */
|
||||||
|
gd->log_fmt = BIT(LOGF_MSG);
|
||||||
|
gd->default_log_level = LOGL_INFO;
|
||||||
|
console_record_reset_enable();
|
||||||
|
pr_err("ea%d ", 1);
|
||||||
|
pr_cont("cc%d\n", 2);
|
||||||
|
gd->default_log_level = log_level;
|
||||||
|
gd->log_fmt = log_fmt;
|
||||||
|
gd->flags &= ~GD_FLG_RECORD;
|
||||||
|
ut_assertok(ut_check_console_line(uts, "ea1 cc2"));
|
||||||
|
ut_assertok(ut_check_console_end(uts));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
LOG_TEST(log_test_pr_cont);
|
|
@ -19,7 +19,7 @@ static const char str3[] = "0xbI'm sorry you're alive.";
|
||||||
/* Declare a new str test */
|
/* Declare a new str test */
|
||||||
#define STR_TEST(_name, _flags) UNIT_TEST(_name, _flags, str_test)
|
#define STR_TEST(_name, _flags) UNIT_TEST(_name, _flags, str_test)
|
||||||
|
|
||||||
static int str_test_upper(struct unit_test_state *uts)
|
static int str_upper(struct unit_test_state *uts)
|
||||||
{
|
{
|
||||||
char out[TEST_STR_SIZE];
|
char out[TEST_STR_SIZE];
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ static int str_test_upper(struct unit_test_state *uts)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
STR_TEST(str_test_upper, 0);
|
STR_TEST(str_upper, 0);
|
||||||
|
|
||||||
static int run_strtoul(struct unit_test_state *uts, const char *str, int base,
|
static int run_strtoul(struct unit_test_state *uts, const char *str, int base,
|
||||||
ulong expect_val, int expect_endp_offset, bool upper)
|
ulong expect_val, int expect_endp_offset, bool upper)
|
||||||
|
|
18
test/ut.c
18
test/ut.c
|
@ -8,6 +8,9 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <console.h>
|
#include <console.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#ifdef CONFIG_SANDBOX
|
||||||
|
#include <asm/state.h>
|
||||||
|
#endif
|
||||||
#include <test/test.h>
|
#include <test/test.h>
|
||||||
#include <test/ut.h>
|
#include <test/ut.h>
|
||||||
|
|
||||||
|
@ -114,3 +117,18 @@ int ut_check_console_dump(struct unit_test_state *uts, int total_bytes)
|
||||||
|
|
||||||
return upto == total_bytes ? 0 : 1;
|
return upto == total_bytes ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ut_silence_console(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_SANDBOX
|
||||||
|
struct sandbox_state *state = state_get_current();
|
||||||
|
|
||||||
|
if (!state->show_test_output)
|
||||||
|
gd->flags |= GD_FLG_SILENT;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ut_unsilence_console(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
gd->flags &= ~(GD_FLG_SILENT | GD_FLG_RECORD);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue