diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2020-09-25 08:06:20 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2020-09-25 08:06:20 +0200 |
commit | 39bdcdfb814a22c8143c04938268378e9994b7dd (patch) | |
tree | 4eeea3247892cab65f10a25d2910fad021cbe7f0 /common | |
parent | e083790340aa4cf1b8edaa50f6b9fbb1edfe56d0 (diff) | |
parent | 8fb0a2bf6efb67084a5d7a7f3822b4d480fca685 (diff) | |
download | barebox-39bdcdfb814a22c8143c04938268378e9994b7dd.tar.gz barebox-39bdcdfb814a22c8143c04938268378e9994b7dd.tar.xz |
Merge branch 'for-next/misc' into master
Diffstat (limited to 'common')
-rw-r--r-- | common/Kconfig | 2 | ||||
-rw-r--r-- | common/blspec.c | 5 | ||||
-rw-r--r-- | common/bootm.c | 31 | ||||
-rw-r--r-- | common/complete.c | 6 | ||||
-rw-r--r-- | common/efi/efi.c | 2 | ||||
-rw-r--r-- | common/globalvar.c | 8 | ||||
-rw-r--r-- | common/restart.c | 37 |
7 files changed, 78 insertions, 13 deletions
diff --git a/common/Kconfig b/common/Kconfig index 3626eb2f29..9e6918189b 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -411,6 +411,7 @@ choice select COMMAND_SUPPORT select PARAMETER select STDDEV + select CMD_SETENV help simple shell. No if/then, no return values from commands, no loops @@ -699,7 +700,6 @@ config IMD config IMD_TARGET bool "build bareboximd target tool" depends on IMD - depends on !SANDBOX config KERNEL_INSTALL_TARGET bool diff --git a/common/blspec.c b/common/blspec.c index 9e1036c834..ed66352d11 100644 --- a/common/blspec.c +++ b/common/blspec.c @@ -109,8 +109,11 @@ static void blspec_apply_oftree_overlays(const char *overlays, sep = freep = xstrdup(overlays); - while ((overlay = strsep(&sep, " "))) + while ((overlay = strsep(&sep, " "))) { + if (!*overlay) + continue; blspec_apply_oftree_overlay(overlay, abspath, dryrun); + } free(freep); } diff --git a/common/bootm.c b/common/bootm.c index 7f22ca5ced..60b8bf10a8 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -65,6 +65,7 @@ void bootm_data_init_defaults(struct bootm_data *data) getenv_ul("global.bootm.image.loadaddr", &data->os_address); getenv_ul("global.bootm.initrd.loadaddr", &data->initrd_address); data->initrd_file = getenv_nonempty("global.bootm.initrd"); + data->root_dev = getenv_nonempty("global.bootm.root_dev"); data->verify = bootm_get_verify_mode(); data->appendroot = bootm_appendroot; data->provide_machine_id = bootm_provide_machine_id; @@ -232,7 +233,11 @@ int bootm_load_initrd(struct image_data *data, unsigned long load_address) ret = fit_open_image(data->os_fit, data->fit_config, "ramdisk", &initrd, &initrd_size); - + if (ret) { + pr_err("Cannot open ramdisk image in FIT image: %s\n", + strerror(-ret)); + return ret; + } data->initrd_res = request_sdram_region("initrd", load_address, initrd_size); @@ -711,7 +716,25 @@ int bootm_boot(struct bootm_data *bootm_data) if (bootm_data->appendroot) { char *rootarg; - rootarg = path_get_linux_rootarg(data->os_file); + if (bootm_data->root_dev) { + const char *root_dev_name = devpath_to_name(bootm_data->root_dev); + const struct cdev *root_cdev = cdev_by_name(root_dev_name); + + if (root_cdev && root_cdev->partuuid[0] != 0) { + rootarg = basprintf("root=PARTUUID=%s", root_cdev->partuuid); + } else { + rootarg = ERR_PTR(-EINVAL); + + if (!root_cdev) + pr_err("no cdev found for %s, cannot set root= option\n", + root_dev_name); + else if (!root_cdev->partuuid[0]) + pr_err("%s doesn't have a PARTUUID, cannot set root= option\n", + root_dev_name); + } + } else { + rootarg = path_get_linux_rootarg(data->os_file); + } if (!IS_ERR(rootarg)) { printf("Adding \"%s\" to Kernel commandline\n", rootarg); globalvar_add_simple("linux.bootargs.bootm.appendroot", @@ -802,6 +825,7 @@ static int bootm_init(void) globalvar_add_simple("bootm.image", NULL); globalvar_add_simple("bootm.image.loadaddr", NULL); globalvar_add_simple("bootm.oftree", NULL); + globalvar_add_simple("bootm.root_dev", NULL); globalvar_add_simple("bootm.tee", NULL); globalvar_add_simple_bool("bootm.appendroot", &bootm_appendroot); globalvar_add_simple_bool("bootm.provide_machine_id", &bootm_provide_machine_id); @@ -831,5 +855,6 @@ BAREBOX_MAGICVAR_NAMED(global_bootm_oftree, global.bootm.oftree, "bootm default BAREBOX_MAGICVAR_NAMED(global_bootm_tee, global.bootm.tee, "bootm default tee image"); BAREBOX_MAGICVAR_NAMED(global_bootm_verify, global.bootm.verify, "bootm default verify level"); BAREBOX_MAGICVAR_NAMED(global_bootm_verbose, global.bootm.verbose, "bootm default verbosity level (0=quiet)"); -BAREBOX_MAGICVAR_NAMED(global_bootm_appendroot, global.bootm.appendroot, "Add root= option to Kernel to mount rootfs from the device the Kernel comes from"); +BAREBOX_MAGICVAR_NAMED(global_bootm_appendroot, global.bootm.appendroot, "Add root= option to Kernel to mount rootfs from the device the Kernel comes from (default, device can be overridden via global.bootm.root_dev)"); +BAREBOX_MAGICVAR_NAMED(global_bootm_root_dev, global.bootm.root_dev, "bootm default root device (overrides default device in global.bootm.appendroot)"); BAREBOX_MAGICVAR_NAMED(global_bootm_provide_machine_id, global.bootm.provide_machine_id, "If true, add systemd.machine_id= with value of global.machine_id to Kernel"); diff --git a/common/complete.c b/common/complete.c index 919e5abc6a..36e10405c8 100644 --- a/common/complete.c +++ b/common/complete.c @@ -336,6 +336,12 @@ static int env_param_complete(struct string_list *sl, char *instr, int eval) return 0; } +int env_param_noeval_complete(struct string_list *sl, char *instr) +{ + return env_param_complete(sl, instr, 0); +} +EXPORT_SYMBOL(env_param_noeval_complete); + static int tab_pressed = 0; void complete_reset(void) diff --git a/common/efi/efi.c b/common/efi/efi.c index 6f55e3970e..01003dc00f 100644 --- a/common/efi/efi.c +++ b/common/efi/efi.c @@ -292,7 +292,7 @@ static void __noreturn efi_poweroff_system(struct poweroff_handler *handler) static int restart_register_feature(void) { - restart_handler_register_fn(efi_restart_system); + restart_handler_register_fn("efi", efi_restart_system); poweroff_handler_register_fn(efi_poweroff_system); return 0; diff --git a/common/globalvar.c b/common/globalvar.c index 98a028a68a..6ab4c1f68e 100644 --- a/common/globalvar.c +++ b/common/globalvar.c @@ -514,7 +514,9 @@ int globalvar_add_simple_int(const char *name, int *value, return 0; } -int globalvar_add_simple_bool(const char *name, int *value) +int globalvar_add_bool(const char *name, + int (*set)(struct param_d *, void *), + int *value, void *priv) { struct param_d *p; int ret; @@ -523,8 +525,8 @@ int globalvar_add_simple_bool(const char *name, int *value) if (ret) return ret; - p = dev_add_param_bool(&global_device, name, NULL, NULL, - value, NULL); + p = dev_add_param_bool(&global_device, name, set, NULL, + value, priv); if (IS_ERR(p)) return PTR_ERR(p); diff --git a/common/restart.c b/common/restart.c index b19ae54657..2bf7b166b0 100644 --- a/common/restart.c +++ b/common/restart.c @@ -19,6 +19,7 @@ #include <of.h> static LIST_HEAD(restart_handler_list); +static unsigned resetidx; /** * restart_handler_register() - register a handler for restarting the system @@ -31,7 +32,7 @@ static LIST_HEAD(restart_handler_list); int restart_handler_register(struct restart_handler *rst) { if (!rst->name) - rst->name = RESTART_DEFAULT_NAME; + rst->name = basprintf("reset%u", resetidx); if (!rst->priority) rst->priority = RESTART_DEFAULT_PRIORITY; @@ -40,11 +41,13 @@ int restart_handler_register(struct restart_handler *rst) pr_debug("registering restart handler \"%s\" with priority %d\n", rst->name, rst->priority); + resetidx++; return 0; } /** * restart_handler_register_fn() - register a handler function + * @name: restart method name or NULL if name should be auto-generated * @restart_fn: The restart function * * convenience wrapper for restart_handler_register() to register a handler @@ -52,13 +55,15 @@ int restart_handler_register(struct restart_handler *rst) * * return: 0 for success or negative error code */ -int restart_handler_register_fn(void (*restart_fn)(struct restart_handler *)) +int restart_handler_register_fn(const char *name, + void (*restart_fn)(struct restart_handler *)) { struct restart_handler *rst; int ret; rst = xzalloc(sizeof(*rst)); + rst->name = xstrdup(name); rst->restart = restart_fn; ret = restart_handler_register(rst); @@ -70,20 +75,33 @@ int restart_handler_register_fn(void (*restart_fn)(struct restart_handler *)) } /** - * restart_machine() - reset the whole system + * restart_handler_get_by_name() - reset the whole system */ -void __noreturn restart_machine(void) +struct restart_handler *restart_handler_get_by_name(const char *name) { struct restart_handler *rst = NULL, *tmp; unsigned int priority = 0; list_for_each_entry(tmp, &restart_handler_list, list) { + if (name && tmp->name && strcmp(name, tmp->name)) + continue; if (tmp->priority > priority) { priority = tmp->priority; rst = tmp; } } + return rst; +} + +/** + * restart_machine() - reset the whole system + */ +void __noreturn restart_machine(void) +{ + struct restart_handler *rst; + + rst = restart_handler_get_by_name(NULL); if (rst) { pr_debug("%s: using restart handler %s\n", __func__, rst->name); console_flush(); @@ -107,3 +125,14 @@ unsigned int of_get_restart_priority(struct device_node *node) return priority; } + +/* + * restart_handlers_print - print informations about all restart handlers + */ +void restart_handlers_print(void) +{ + struct restart_handler *tmp; + + list_for_each_entry(tmp, &restart_handler_list, list) + printf("%-20s %6d\n", tmp->name, tmp->priority); +} |