From: Mattijs Korpershoek <mkorpershoek@baylibre.com>
To: Caleb Connolly <caleb.connolly@linaro.org>,
AKASHI Takahiro <akashi.tkhro@gmail.com>,
Caleb Connolly <caleb.connolly@linaro.org>,
Dmitry Rokosov <ddrokosov@salutedevices.com>,
Francis Laniel <francis.laniel@amarulasolutions.com>,
Heinrich Schuchardt <xypron.glpk@gmx.de>,
Ilias Apalodimas <ilias.apalodimas@linaro.org>,
Jerome Forissier <jerome.forissier@linaro.org>,
Neil Armstrong <neil.armstrong@linaro.org>,
Oliver Gaskell <Oliver.Gaskell@analog.com>,
Robert Marko <robert.marko@sartura.hr>,
Sam Protsenko <semen.protsenko@linaro.org>,
Simon Glass <sjg@chromium.org>,
Sumit Garg <sumit.garg@linaro.org>, Tom Rini <trini@konsulko.com>
Cc: Tony Dinh <mibodhi@gmail.com>, u-boot@lists.denx.de
Subject: Re: [PATCH v2] cmd: add a fetch utility
Date: Thu, 14 Nov 2024 14:44:10 +0100 [thread overview]
Message-ID: <87ed3eaq1h.fsf@baylibre.com> (raw)
In-Reply-To: <20241113042536.1792150-2-caleb.connolly@linaro.org>
Hi Caleb,
Thank you for the patch.
On mer., nov. 13, 2024 at 05:22, Caleb Connolly <caleb.connolly@linaro.org> wrote:
> Add a small utility for displaying some information about U-Boot and the
> hardware it's running on in a similar fashion to the popular neofetch
> tool for Linux [1].
>
> While the output is meant to be useful, it should also be pleasing to
> look at and perhaps entertaining. The ufetch command aims to bring this
> to U-Boot, featuring a colorful ASCII art version of the U-Boot logo.
>
> [1]: https://en.wikipedia.org/wiki/Neofetch
>
> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
Tested-by: Mattijs Korpershoek <mkorpershoek@baylibre.com> # vim3
> ---
> Ephemeral screenshot: https://0x0.st/XkQU.png
>
> Changes since v1:
> * Rework storage info to be more dynamic
> * use print_size() helper everywhere
> * manually walk RAM banks to report memory size correctly
> * minor formatting changes and fixes
> * MAINTAINERS entry
> * V1: https://lore.kernel.org/u-boot/20240808163153.2069650-1-caleb.connolly@linaro.org
> ---
> MAINTAINERS | 5 ++
> cmd/Kconfig | 7 ++
> cmd/Makefile | 1 +
> cmd/ufetch.c | 224 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 237 insertions(+)
> create mode 100644 cmd/ufetch.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 38c714cf46a6..d1eb164ad590 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1724,8 +1724,13 @@ M: Heiko Schocher <hs@denx.de>
> S: Maintained
> T: git https://source.denx.de/u-boot/custodians/u-boot-ubi.git
> F: drivers/mtd/ubi/
>
> +UFETCH
> +M: Caleb Connolly <caleb.connolly@linaro.org>
> +S: Maintained
> +F: cmd/ufetch.c
> +
> UFS
> M: Neil Armstrong <neil.armstrong@linaro.org>
> M: Bhupesh Sharma <bhupesh.linux@gmail.com>
> M: Neha Malcom Francis <n-francis@ti.com>
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index 4fba9fe67034..da736249a3cf 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -175,8 +175,15 @@ config CMD_CPU
> 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_UFETCH
> + bool "U-Boot fetch"
> + depends on BLK
> + help
> + Fetch utility for U-Boot (akin to neofetch). Prints information
> + about U-Boot and the board it is running on in a pleasing format.
> +
> config CMD_FWU_METADATA
> bool "fwu metadata read"
> depends on FWU_MULTI_BANK_UPDATE
> help
> diff --git a/cmd/Makefile b/cmd/Makefile
> index d1f369deec0a..1e6d3128c8ca 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -52,8 +52,9 @@ obj-$(CONFIG_CMD_CONSOLE) += console.o
> obj-$(CONFIG_CMD_CPU) += cpu.o
> obj-$(CONFIG_CMD_DATE) += date.o
> obj-$(CONFIG_CMD_DEMO) += demo.o
> obj-$(CONFIG_CMD_DM) += dm.o
> +obj-$(CONFIG_CMD_UFETCH) += ufetch.o
> obj-$(CONFIG_CMD_SOUND) += sound.o
> ifdef CONFIG_POST
> obj-$(CONFIG_CMD_DIAG) += diag.o
> endif
> diff --git a/cmd/ufetch.c b/cmd/ufetch.c
> new file mode 100644
> index 000000000000..1bd0565b9f08
> --- /dev/null
> +++ b/cmd/ufetch.c
> @@ -0,0 +1,224 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +/* Small "fetch" utility for U-Boot */
> +
> +#ifdef CONFIG_ARM
> +#include <asm/system.h>
> +#endif
> +#include <dm/device.h>
> +#include <dm/uclass-internal.h>
> +#include <display_options.h>
> +#include <mmc.h>
> +#include <time.h>
> +#include <asm/global_data.h>
> +#include <cli.h>
> +#include <command.h>
> +#include <dm/ofnode.h>
> +#include <env.h>
> +#include <rand.h>
> +#include <vsprintf.h>
> +#include <linux/delay.h>
> +#include <linux/kernel.h>
> +#include <version.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define LINE_WIDTH 40
> +#define BLUE "\033[38;5;4m"
> +#define YELLOW "\033[38;5;11m"
> +#define BOLD "\033[1m"
> +#define RESET "\033[0m"
> +static const char * const logo_lines[] = {
> + BLUE BOLD " ......::...... ",
> + BLUE BOLD " ...::::::::::::::::::... ",
> + BLUE BOLD " ..::::::::::::::::::::::::::.. ",
> + BLUE BOLD " .::::.:::::::::::::::...::::.::::. ",
> + BLUE BOLD " .::::::::::::::::::::..::::::::::::::. ",
> + BLUE BOLD " .::.:::::::::::::::::::" YELLOW "=*%#*" BLUE "::::::::::.::. ",
> + BLUE BOLD " .:::::::::::::::::....." YELLOW "*%%*-" BLUE ":....::::::::::. ",
> + BLUE BOLD " .:.:::...:::::::::.:-" YELLOW "===##*---==-" BLUE "::::::::::.:. ",
> + BLUE BOLD " .::::..::::........" YELLOW "-***#****###****-" BLUE "...::::::.:. ",
> + BLUE BOLD " ::.:.-" YELLOW "+***+=" BLUE "::-" YELLOW "=+**#%%%%%%%%%%%%###*= " BLUE "-::...::::. ",
> + BLUE BOLD ".:.::-" YELLOW "*****###%%%%%%%%%%%%%%%%%%%%%%%%%%#*=" BLUE ":..:::: ",
> + BLUE BOLD ".::" YELLOW "##" BLUE ":" YELLOW "***#%%%%%%#####%%%%%%%####%%%%%####%%%*" BLUE "-.::. ",
> + BLUE BOLD ":.:" YELLOW "#%" BLUE "::" YELLOW "*%%%%%%%#*****##%%%#*****##%%##*****#%%+" BLUE ".::.",
> + BLUE BOLD ".::" YELLOW "**==#%%%%%%%##****#%%%%##****#%%%%#****###%%" BLUE ":.. ",
> + BLUE BOLD "..:" YELLOW "#%" BLUE "::" YELLOW "*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%+ " BLUE ".:.",
> + BLUE BOLD " ::" YELLOW "##" BLUE ":" YELLOW "+**#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%* " BLUE "-.:: ",
> + BLUE BOLD " ..::-" YELLOW "#****#%#%%%%%%%%%%%%%%%%%%%%%%%%%%#*=" BLUE "-..::. ",
> + BLUE BOLD " ...:=" YELLOW "*****=" BLUE "::-" YELLOW "=+**###%%%%%%%%###**+= " BLUE "--:...::: ",
> + BLUE BOLD " .::.::--:........::::::--::::::......::::::. ",
> + BLUE BOLD " .::.....::::::::::...........:::::::::.::. ",
> + BLUE BOLD " .::::::::::::::::::::::::::::::::::::. ",
> + BLUE BOLD " .::::.::::::::::::::::::::::.::::. ",
> + BLUE BOLD " ..::::::::::::::::::::::::::.. ",
> + BLUE BOLD " ...::::::::::::::::::... ",
> + BLUE BOLD " ......::...... ",
> +};
> +
> +enum output_lines {
> + FIRST,
> + SECOND,
> + KERNEL,
> + SYSINFO,
> + HOST,
> + UPTIME,
> + IP,
> + CMDS,
> + CONSOLES,
> + DEVICES,
> + FEATURES,
> + RELOCATION,
> + CORES,
> + MEMORY,
> + STORAGE,
> +
> + /* Up to 10 storage devices... Should be enough for anyone right? */
> + _LAST_LINE = (STORAGE + 10),
> +#define LAST_LINE (_LAST_LINE - 1UL)
> +};
> +
> +static int do_ufetch(struct cmd_tbl *cmdtp, int flag, int argc,
> + char *const argv[])
> +{
> + int num_lines = max(LAST_LINE + 1, ARRAY_SIZE(logo_lines));
> + const char *model, *compatible;
> + char *ipaddr;
> + int n_cmds, n_cpus = 0, ret, compatlen;
> + size_t size;
> + ofnode np;
> + struct udevice *dev;
> + struct blk_desc *desc;
> + bool skip_ascii = false;
> +
> + if (argc > 1 && strcmp(argv[1], "-n") == 0) {
> + skip_ascii = true;
> + num_lines = LAST_LINE;
> + }
> +
> + for (int line = 0; line < num_lines; line++) {
> + if (!skip_ascii) {
> + if (line < ARRAY_SIZE(logo_lines))
> + printf("%s ", logo_lines[line]);
> + else
> + printf("%*c ", LINE_WIDTH, ' ');
> + }
> + switch (line) {
> + case FIRST:
> + compatible = ofnode_read_string(ofnode_root(), "compatible");
> + if (!compatible)
> + compatible = "unknown";
> + printf(RESET "%s\n", compatible);
> + compatlen = strlen(compatible);
> + break;
> + case SECOND:
> + for (int j = 0; j < compatlen; j++)
> + putc('-');
> + putc('\n');
> + break;
> + case KERNEL:
> + printf("Kernel:" RESET " %s\n", U_BOOT_VERSION);
> + break;
> + case SYSINFO:
> + printf("Config:" RESET " %s_defconfig\n", CONFIG_SYS_CONFIG_NAME);
> + break;
> + case HOST:
> + model = ofnode_read_string(ofnode_root(), "model");
> + if (model)
> + printf("Host:" RESET " %s\n", model);
> + break;
> + case UPTIME:
> + printf("Uptime:" RESET " %ld seconds\n", get_timer(0) / 1000);
> + break;
> + case IP:
> + ipaddr = env_get("ipvaddr");
> + if (!ipaddr)
> + ipaddr = "none";
> + printf("IP Address:" RESET " %s", ipaddr);
> + ipaddr = env_get("ipv6addr");
> + if (ipaddr)
> + printf(", %s\n", ipaddr);
> + else
> + putc('\n');
> + break;
> + case CMDS:
> + n_cmds = ll_entry_count(struct cmd_tbl, cmd);
> + printf("Commands:" RESET " %d (help)\n", n_cmds);
> + break;
> + case CONSOLES:
> + printf("Consoles:" RESET " %s (%d baud)\n", env_get("stdout"),
> + gd->baudrate);
> + break;
> + case DEVICES:
> + printf("Devices:" RESET " ");
> + /* TODO: walk the DM tree */
> + printf("Uncountable!\n");
> + break;
> + case FEATURES:
> + printf("Features:" RESET " ");
> + if (IS_ENABLED(CONFIG_NET))
> + printf("Net");
> + if (IS_ENABLED(CONFIG_EFI_LOADER))
> + printf(", EFI");
> + if (IS_ENABLED(CONFIG_CMD_CAT))
> + printf(", cat :3");
> +#ifdef CONFIG_ARM
> + switch (current_el()) {
> + case 2:
> + printf(", VMs");
> + break;
> + case 3:
> + printf(", full control!");
> + break;
> + }
> +#endif
> + printf("\n");
> + break;
> + case RELOCATION:
> + if (gd->flags & GD_FLG_SKIP_RELOC)
> + printf("Relocated:" RESET " no\n");
> + else
> + printf("Relocated:" RESET " to %#011lx\n", gd->relocaddr);
> + break;
> + case CORES:
> + ofnode_for_each_subnode(np, ofnode_path("/cpus")) {
> + if (ofnode_name_eq(np, "cpu"))
> + n_cpus++;
> + }
> + printf("CPU:" RESET " %d (1 in use)\n", n_cpus);
> + break;
> + case MEMORY:
> + for (int j = 0; j < CONFIG_NR_DRAM_BANKS && gd->bd->bi_dram[j].size; j++)
> + size += gd->bd->bi_dram[j].size;
> + printf("Memory:" RESET " ");
> + print_size(size, "\n");
> + break;
> + case STORAGE:
> + default:
> + ret = uclass_find_device_by_seq(UCLASS_BLK, line - STORAGE, &dev);
> + if (!ret && dev) {
> + desc = dev_get_uclass_plat(dev);
> + size = desc->lba * desc->blksz;
> + printf("%s %d: " RESET, desc->uclass_id == UCLASS_SCSI ? "SCSI" :
> + desc->uclass_id == UCLASS_MMC
> + ? "MMC" : "Storage",
> + desc->lun);
> + if (size)
> + print_size(size, "");
> + else
> + printf("No media");
> + }
> + printf("\n");
> + }
> + }
> +
> + printf(RESET "\n\n");
> +
> + return 0;
> +}
> +
> +U_BOOT_CMD(ufetch, 2, 1, do_ufetch,
> + "U-Boot fetch utility",
> + "Print information about your device.\n"
> + " -n Don't print the ASCII logo"
> +);
> --
> 2.47.0
prev parent reply other threads:[~2024-11-14 13:44 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-13 4:22 [PATCH v2] cmd: add a fetch utility Caleb Connolly
2024-11-13 7:44 ` Ilias Apalodimas
2024-11-13 13:32 ` Neil Armstrong
2024-11-13 14:40 ` Heinrich Schuchardt
2024-11-13 15:01 ` Neil Armstrong
2024-11-13 15:22 ` Tom Rini
2024-11-13 22:37 ` Tony Dinh
2024-11-13 13:39 ` Simon Glass
2024-11-14 13:44 ` Mattijs Korpershoek [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ed3eaq1h.fsf@baylibre.com \
--to=mkorpershoek@baylibre.com \
--cc=Oliver.Gaskell@analog.com \
--cc=akashi.tkhro@gmail.com \
--cc=caleb.connolly@linaro.org \
--cc=ddrokosov@salutedevices.com \
--cc=francis.laniel@amarulasolutions.com \
--cc=ilias.apalodimas@linaro.org \
--cc=jerome.forissier@linaro.org \
--cc=mibodhi@gmail.com \
--cc=neil.armstrong@linaro.org \
--cc=robert.marko@sartura.hr \
--cc=semen.protsenko@linaro.org \
--cc=sjg@chromium.org \
--cc=sumit.garg@linaro.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
--cc=xypron.glpk@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox