[PATCH] cmd: mtd: Enable speed benchmarking
Michael Nazzareno Trimarchi
michael at amarulasolutions.com
Thu Jul 3 19:19:45 CEST 2025
Hi Miquel
On Thu, Jul 3, 2025 at 6:58 PM Miquel Raynal <miquel.raynal at bootlin.com> wrote:
>
> Linux features a flash_speed speed test from the mtd-utils suite, U-Boot
> does not. Benchmarks are useful for speed improvement developments as
> well as troubleshooting or regression testing sometimes.
>
> Enable a benchmark option to enable this feature.
>
> Example of output on a Nuvoton platform:
>
> MA35D1> mtd read nor0 0x81000000 0 0x10000
> Reading 65536 byte(s) at offset 0x00000000
> MA35D1> mtd read.benchmark nor0 0x81000000 0 0x10000
> Reading 65536 byte(s) at offset 0x00000000
> Read speed: 3752kiB/s
>
I was using time and reading but this looked much nicer. I will give it a try
and review.
> Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
> ---
> cmd/mtd.c | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/cmd/mtd.c b/cmd/mtd.c
> index c25997cfb246..d5843db663d7 100644
> --- a/cmd/mtd.c
> +++ b/cmd/mtd.c
> @@ -17,6 +17,7 @@
> #include <malloc.h>
> #include <mapmem.h>
> #include <mtd.h>
> +#include <time.h>
> #include <dm/devres.h>
> #include <linux/err.h>
>
> @@ -466,10 +467,11 @@ static int mtd_special_write_oob(struct mtd_info *mtd, u64 off,
> static int do_mtd_io(struct cmd_tbl *cmdtp, int flag, int argc,
> char *const argv[])
> {
> - bool dump, read, raw, woob, write_empty_pages, has_pages = false;
> + bool dump, read, raw, woob, benchmark, write_empty_pages, has_pages = false;
> u64 start_off, off, len, remaining, default_len;
> struct mtd_oob_ops io_op = {};
> uint user_addr = 0, npages;
> + u32 bench_start, bench_end;
unsigned long
> const char *cmd = argv[0];
> struct mtd_info *mtd;
> u32 oob_len;
> @@ -490,6 +492,7 @@ static int do_mtd_io(struct cmd_tbl *cmdtp, int flag, int argc,
> read = dump || !strncmp(cmd, "read", 4);
> raw = strstr(cmd, ".raw");
> woob = strstr(cmd, ".oob");
> + benchmark = strstr(cmd, ".benchmark");
> write_empty_pages = !has_pages || strstr(cmd, ".dontskipff");
>
> argc -= 2;
> @@ -559,6 +562,9 @@ static int do_mtd_io(struct cmd_tbl *cmdtp, int flag, int argc,
>
> led_activity_blink();
>
> + if (benchmark)
> + bench_start = timer_get_us();
> +
> /* Loop over the pages to do the actual read/write */
> while (remaining) {
> /* Skip the block if it is bad */
> @@ -586,6 +592,13 @@ static int do_mtd_io(struct cmd_tbl *cmdtp, int flag, int argc,
> io_op.oobbuf += io_op.oobretlen;
> }
>
> + if (benchmark && bench_start) {
> + bench_end = timer_get_us();
> + printf("%s speed: %lukiB/s\n",
> + read ? "Read" : "Write",
> + ((io_op.len * 1000000) / (bench_end - bench_start)) / 1024);
Did you check if it can not wrap?
Michael
> + }
> +
> led_activity_off();
>
> if (!ret && dump)
> --
> 2.49.0
>
--
Michael Nazzareno Trimarchi
Co-Founder & Chief Executive Officer
M. +39 347 913 2170
michael at amarulasolutions.com
__________________________________
Amarula Solutions BV
Joop Geesinkweg 125, 1114 AB, Amsterdam, NL
T. +31 (0)85 111 9172
info at amarulasolutions.com
www.amarulasolutions.com
More information about the U-Boot
mailing list