
On Tue, Apr 28, 2015 at 6:48 AM, Simon Glass sjg@chromium.org wrote:
Add a simple command which provides access to a list of available CPUs along with descriptions and basic information.
Signed-off-by: Simon Glass sjg@chromium.org
common/Kconfig | 8 ++++ common/Makefile | 1 + common/cmd_cpu.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 common/cmd_cpu.c
diff --git a/common/Kconfig b/common/Kconfig index 5d7e48a..15759f7 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -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 diff --git a/common/Makefile b/common/Makefile index fba3830..9084c73 100644 --- a/common/Makefile +++ b/common/Makefile @@ -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 diff --git a/common/cmd_cpu.c b/common/cmd_cpu.c new file mode 100644 index 0000000..c3e229f --- /dev/null +++ b/common/cmd_cpu.c @@ -0,0 +1,113 @@ +/*
- 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"
+);
Reviewed-by: Bin Meng bmeng.cn@gmail.com