Hi On Mon, Aug 4, 2025 at 11:21 AM Miquel Raynal <miquel.ray...@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 > > Signed-off-by: Miquel Raynal <miquel.ray...@bootlin.com> > --- > Changes in v2: > * Use an unsigned long as advised by Michael for accounting time. > --- > cmd/mtd.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/cmd/mtd.c b/cmd/mtd.c > index c25997cfb246..2520b89eed2c 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,8 +467,9 @@ 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; > + unsigned long bench_start, bench_end; > struct mtd_oob_ops io_op = {}; > uint user_addr = 0, npages; > const char *cmd = argv[0]; > @@ -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); > + } > + > Reviewed-by: Michael Trimarchi <mich...@amarulasolutions.com> > led_activity_off(); > > if (!ret && dump) > -- > 2.50.1 > > -- Michael Nazzareno Trimarchi Co-Founder & Chief Executive Officer M. +39 347 913 2170 mich...@amarulasolutions.com __________________________________ Amarula Solutions BV Joop Geesinkweg 125, 1114 AB, Amsterdam, NL T. +31 (0)85 111 9172 i...@amarulasolutions.com www.amarulasolutions.com