Hi Miquel On Thu, Jul 3, 2025 at 6:58 PM Miquel Raynal <[email protected]> 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 <[email protected]> > --- > 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 [email protected] __________________________________ Amarula Solutions BV Joop Geesinkweg 125, 1114 AB, Amsterdam, NL T. +31 (0)85 111 9172 [email protected] www.amarulasolutions.com

