diff options
Diffstat (limited to 'cmd/cpu.c')
| -rw-r--r-- | cmd/cpu.c | 44 | 
1 files changed, 42 insertions, 2 deletions
| diff --git a/cmd/cpu.c b/cmd/cpu.c index 9e323069b9e..27552507564 100644 --- a/cmd/cpu.c +++ b/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)); | 
