[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