提交 8e2fac05 编写于 作者: S Simon Glass

Add a 'cpu' command to print CPU information

Add a simple command which provides access to a list of available CPUs along
with descriptions and basic information.
Signed-off-by: NSimon Glass <sjg@chromium.org>
Reviewed-by: NBin Meng <bmeng.cn@gmail.com>
上级 6388e357
......@@ -31,6 +31,14 @@ config CMD_CONSOLE
help
Print console devices and information.
config CMD_CPU
bool "cpu"
help
Print information about available CPUs. This normally shows the
number of CPUs, type (e.g. manufacturer, architecture, product or
internal name) and clock frequency. Other information may be
available depending on the CPU driver.
config CMD_LICENSE
bool "license"
help
......
......@@ -74,6 +74,7 @@ obj-$(CONFIG_CMD_CBFS) += cmd_cbfs.o
obj-$(CONFIG_CMD_CLK) += cmd_clk.o
obj-$(CONFIG_CMD_CONSOLE) += cmd_console.o
obj-$(CONFIG_CMD_CPLBINFO) += cmd_cplbinfo.o
obj-$(CONFIG_CMD_CPU) += cmd_cpu.o
obj-$(CONFIG_DATAFLASH_MMC_SELECT) += cmd_dataflash_mmc_mux.o
obj-$(CONFIG_CMD_DATE) += cmd_date.o
obj-$(CONFIG_CMD_DEMO) += cmd_demo.o
......
/*
* Copyright (c) 2015 Google, Inc
* Written by Simon Glass <sjg@chromium.org>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <command.h>
#include <cpu.h>
#include <dm.h>
static const char *cpu_feature_name[CPU_FEAT_COUNT] = {
"L1 cache",
"MMU",
};
static int print_cpu_list(bool detail)
{
struct udevice *dev;
struct uclass *uc;
char buf[100];
int ret;
ret = uclass_get(UCLASS_CPU, &uc);
if (ret) {
printf("Cannot find CPU uclass\n");
return ret;
}
uclass_foreach_dev(dev, uc) {
struct cpu_platdata *plat = dev_get_parent_platdata(dev);
struct cpu_info info;
bool first;
int i;
ret = cpu_get_desc(dev, buf, sizeof(buf));
printf("%3d: %-10s %s\n", dev->seq, dev->name,
ret ? "<no description>" : buf);
if (!detail)
continue;
ret = cpu_get_info(dev, &info);
if (ret) {
printf("\t(no detail available");
if (ret != -ENOSYS)
printf(": err=%d\n", ret);
printf(")\n");
continue;
}
printf("\tID = %d, freq = ", plat->cpu_id);
print_freq(info.cpu_freq, "");
first = true;
for (i = 0; i < CPU_FEAT_COUNT; i++) {
if (info.features & (1 << i)) {
printf("%s%s", first ? ": " : ", ",
cpu_feature_name[i]);
first = false;
}
}
printf("\n");
}
return 0;
}
static int do_cpu_list(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
if (print_cpu_list(false))
return CMD_RET_FAILURE;
return 0;
}
static int do_cpu_detail(cmd_tbl_t *cmdtp, int flag, int argc,
char *const argv[])
{
if (print_cpu_list(true))
return CMD_RET_FAILURE;
return 0;
}
static cmd_tbl_t cmd_cpu_sub[] = {
U_BOOT_CMD_MKENT(list, 2, 1, do_cpu_list, "", ""),
U_BOOT_CMD_MKENT(detail, 4, 0, do_cpu_detail, "", ""),
};
/*
* Process a cpu sub-command
*/
static int do_cpu(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[])
{
cmd_tbl_t *c = NULL;
/* Strip off leading 'cpu' command argument */
argc--;
argv++;
if (argc)
c = find_cmd_tbl(argv[0], cmd_cpu_sub, ARRAY_SIZE(cmd_cpu_sub));
if (c)
return c->cmd(cmdtp, flag, argc, argv);
else
return CMD_RET_USAGE;
}
U_BOOT_CMD(
cpu, 2, 1, do_cpu,
"display information about CPUs",
"list - list available CPUs\n"
"cpu detail - show CPU detail"
);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册