mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-11 07:24:46 +00:00
cmd: cpu: add release subcommand
Add a new subcommand 'release' to bring up a core to run baremetal and RTOS applications. For example on i.MX8M Plus EVK, release the LAST core to run a RTOS application, passing the sequence number of the CPU core to release, here it is 3: u-boot=> cpu list 0: cpu@0 NXP i.MX8MP Rev1.1 A53 at 1200 MHz at 31C 1: cpu@1 NXP i.MX8MP Rev1.1 A53 at 1200 MHz at 30C 2: cpu@2 NXP i.MX8MP Rev1.1 A53 at 1200 MHz at 31C 3: cpu@3 NXP i.MX8MP Rev1.1 A53 at 1200 MHz at 31C u-boot=> load mmc 1:2 c0000000 /hello_world.bin 66008 bytes read in 5 ms (12.6 MiB/s) u-boot=> dcache flush; icache flush u-boot=> cpu release 3 c0000000 Released CPU core (mpidr: 0x3) to address 0xc0000000 Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
8a73b5b680
commit
476fb4d8ea
1 changed files with 42 additions and 2 deletions
44
cmd/cpu.c
44
cmd/cpu.c
|
@ -3,6 +3,7 @@
|
|||
* Copyright (c) 2015 Google, Inc
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
* Copyright (c) 2017 Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
* Copyright 2024 NXP
|
||||
*/
|
||||
|
||||
#include <command.h>
|
||||
|
@ -18,6 +19,19 @@ static const char *cpu_feature_name[CPU_FEAT_COUNT] = {
|
|||
"Device ID",
|
||||
};
|
||||
|
||||
static struct udevice *cpu_find_device(unsigned long cpu_id)
|
||||
{
|
||||
struct udevice *dev;
|
||||
|
||||
for (uclass_first_device(UCLASS_CPU, &dev); dev;
|
||||
uclass_next_device(&dev)) {
|
||||
if (cpu_id == dev_seq(dev))
|
||||
return dev;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int print_cpu_list(bool detail)
|
||||
{
|
||||
struct udevice *dev;
|
||||
|
@ -82,10 +96,36 @@ static int do_cpu_detail(struct cmd_tbl *cmdtp, int flag, int argc,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int do_cpu_release(struct cmd_tbl *cmdtp, int flag, int argc,
|
||||
char *const argv[])
|
||||
{
|
||||
struct udevice *dev;
|
||||
unsigned long cpu_id;
|
||||
unsigned long long boot_addr;
|
||||
|
||||
if (argc != 3)
|
||||
return CMD_RET_USAGE;
|
||||
|
||||
cpu_id = dectoul(argv[1], NULL);
|
||||
dev = cpu_find_device(cpu_id);
|
||||
if (!dev)
|
||||
return CMD_RET_FAILURE;
|
||||
|
||||
boot_addr = simple_strtoull(argv[2], NULL, 16);
|
||||
|
||||
if (cpu_release_core(dev, boot_addr))
|
||||
return CMD_RET_FAILURE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U_BOOT_LONGHELP(cpu,
|
||||
"list - list available CPUs\n"
|
||||
"cpu detail - show CPU detail");
|
||||
"cpu detail - show CPU detail\n"
|
||||
"cpu release <core ID> <addr> - Release CPU <core ID> at <addr>\n"
|
||||
" <core ID>: the sequence number in list subcommand outputs");
|
||||
|
||||
U_BOOT_CMD_WITH_SUBCMDS(cpu, "display information about CPUs", cpu_help_text,
|
||||
U_BOOT_SUBCMD_MKENT(list, 1, 1, do_cpu_list),
|
||||
U_BOOT_SUBCMD_MKENT(detail, 1, 0, do_cpu_detail));
|
||||
U_BOOT_SUBCMD_MKENT(detail, 1, 0, do_cpu_detail),
|
||||
U_BOOT_SUBCMD_MKENT(release, 3, 0, do_cpu_release));
|
||||
|
|
Loading…
Add table
Reference in a new issue