@@ -210,6 +210,12 @@ config CMD_SBI
help
Display information about the SBI implementation.
+config CMD_SYSINFO
+ bool "sysinfo"
+ depends on SYSINFO
+ help
+ Display information about the system.
+
endmenu
menu "Boot commands"
@@ -165,6 +165,7 @@ obj-$(CONFIG_CMD_SPI) += spi.o
obj-$(CONFIG_CMD_STRINGS) += strings.o
obj-$(CONFIG_CMD_SMC) += smccc.o
obj-$(CONFIG_CMD_SYSBOOT) += sysboot.o
+obj-$(CONFIG_CMD_SYSINFO) += sysinfo.o
obj-$(CONFIG_CMD_STACKPROTECTOR_TEST) += stackprot_test.o
obj-$(CONFIG_CMD_TEMPERATURE) += temperature.o
obj-$(CONFIG_CMD_TERMINAL) += terminal.o
new file mode 100644
@@ -0,0 +1,124 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2023
+ * Detlev Casanova <detlev.casanova@collabora.com>
+ */
+
+#include <command.h>
+#include <env.h>
+#include <sysinfo.h>
+#include <vsprintf.h>
+
+static int get_sysinfo(struct udevice **dev)
+{
+ int ret = sysinfo_get(dev);
+
+ if (ret) {
+ debug("Cannot get sysinfo: %d\n", ret);
+ return ret;
+ }
+
+ ret = sysinfo_detect(*dev);
+ if (ret) {
+ debug("Cannot detect sysinfo: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int do_sysinfo_model(struct cmd_tbl *cmdtp, int flag, int argc,
+ char *const argv[])
+{
+ struct udevice *dev;
+ char model[64];
+ int ret = get_sysinfo(&dev);
+
+ if (ret)
+ return ret;
+
+ ret = sysinfo_get_str(dev,
+ SYSINFO_ID_BOARD_MODEL,
+ 64,
+ model);
+
+ if (ret) {
+ debug("Cannot get sysinfo str: %d\n", ret);
+ return ret;
+ }
+
+ if (argc == 2)
+ env_set(argv[1], model);
+ else
+ printf("%s\n", model);
+
+ return 0;
+}
+
+static int do_sysinfo_id(struct cmd_tbl *cmdtp, int flag, int argc,
+ char *const argv[])
+{
+ struct udevice *dev;
+ u32 board_id;
+ char board_id_str[5] = { '\0' };
+ int ret = get_sysinfo(&dev);
+
+ if (ret)
+ return ret;
+
+ ret = sysinfo_get_int(dev,
+ SYSINFO_ID_BOARD_ID,
+ &board_id);
+
+ if (ret) {
+ debug("Cannot get sysinfo int: %d\n", ret);
+ return ret;
+ }
+
+ sprintf(board_id_str, "0x%02x", board_id);
+ if (argc == 2)
+ env_set(argv[1], board_id_str);
+ else
+ printf("%s\n", board_id_str);
+
+ return 0;
+}
+
+static int do_sysinfo_revision(struct cmd_tbl *cmdtp, int flag, int argc,
+ char *const argv[])
+{
+ struct udevice *dev;
+ char rev[4];
+ int ret = get_sysinfo(&dev);
+
+ if (ret)
+ return ret;
+
+ ret = sysinfo_get_str(dev,
+ SYSINFO_ID_BOARD_REVISION,
+ 4,
+ rev);
+
+ if (ret) {
+ debug("Cannot get sysinfo str: %d\n", ret);
+ return ret;
+ }
+
+ if (argc == 2)
+ env_set(argv[1], rev);
+ else
+ printf("%s\n", rev);
+
+ return 0;
+}
+
+static char sysinfo_help_text[] =
+ "model <varname> - Show or set the board model in varname\n"
+ "sysinfo id <varname> - Show or set the board id in varname (in format 0xHH)\n"
+ "sysinfo revision <varname> - Show or set the board revision in varname";
+
+U_BOOT_CMD_WITH_SUBCMDS(sysinfo, "System information", sysinfo_help_text,
+ U_BOOT_SUBCMD_MKENT(model, 2, 1, do_sysinfo_model),
+ U_BOOT_SUBCMD_MKENT(id, 2, 1, do_sysinfo_id),
+ U_BOOT_SUBCMD_MKENT(revision, 2, 1, do_sysinfo_revision),
+);
The command is able to show different information for the running system: * Model name * Board ID * Revision This command can be used by boot shell scripts to select configurations depending on the specific running system. Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com> --- cmd/Kconfig | 6 +++ cmd/Makefile | 1 + cmd/sysinfo.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 cmd/sysinfo.c