From: Simon Glass <sjg@chromium.org>
To: U-Boot Mailing List <u-boot@lists.denx.de>
Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>,
Jagan Teki <jagan@amarulasolutions.com>,
Simon Glass <sjg@chromium.org>,
Mike Frysinger <vapier@gentoo.org>
Subject: [PATCH v3 4/4] sf: Provide a command to access memory-mapped SPI
Date: Sun, 1 Aug 2021 15:12:45 -0600 [thread overview]
Message-ID: <20210801211245.2208037-5-sjg@chromium.org> (raw)
In-Reply-To: <20210801211245.2208037-1-sjg@chromium.org>
Add a new 'sf mmap' function to show the address of a SPI offset, if the
hardware supports it. This is useful on x86 systems.
Signed-off-by: Simon Glass <sjg@chromium.org>
---
Changes in v3:
- Add configuration and return value also
arch/Kconfig | 2 ++
cmd/Kconfig | 8 ++++++
cmd/sf.c | 35 +++++++++++++++++++++++++++
doc/usage/sf.rst | 63 ++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 108 insertions(+)
diff --git a/arch/Kconfig b/arch/Kconfig
index b6f9e177b64..0c718535279 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -136,6 +136,7 @@ config SANDBOX
imply CMD_LZMADEC
imply CMD_SATA
imply CMD_SF
+ imply CMD_SF_MMAP
imply CMD_SF_TEST
imply CRC32_VERIFY
imply FAT_WRITE
@@ -201,6 +202,7 @@ config X86
imply CMD_IRQ
imply CMD_PCI
imply CMD_SF
+ imply CMD_SF_MMAP
imply CMD_SF_TEST
imply CMD_ZBOOT
imply DM_ETH
diff --git a/cmd/Kconfig b/cmd/Kconfig
index ffef3cc76ca..e96b6e798bb 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1273,6 +1273,14 @@ config CMD_SF
help
SPI Flash support
+config CMD_SF_MMAP
+ bool "sf mmap - Access memory-mapped SPI flash"
+ depends on CMD_SF
+ help
+ On some systems part of the SPI flash is mapped into mmemory. This
+ command provides a way to map a SPI-flash offset to a memory address,
+ so that the contents can be browsed using 'md', for example.
+
config CMD_SF_TEST
bool "sf test - Allow testing of SPI flash"
depends on CMD_SF
diff --git a/cmd/sf.c b/cmd/sf.c
index d4f5ecee38c..28b480acc58 100644
--- a/cmd/sf.c
+++ b/cmd/sf.c
@@ -384,6 +384,36 @@ static int do_spi_protect(int argc, char *const argv[])
return ret == 0 ? 0 : 1;
}
+static int do_spi_flash_mmap(int argc, char *const argv[])
+{
+ loff_t offset, len, maxsize;
+ uint map_offset, map_size;
+ ulong map_base;
+ int dev = 0;
+ int ret;
+
+ if (argc < 2)
+ return CMD_RET_USAGE;
+
+ ret = mtd_arg_off_size(argc - 1, &argv[1], &dev, &offset, &len,
+ &maxsize, MTD_DEV_TYPE_NOR, flash->size);
+ if (ret)
+ return ret;
+
+ ret = dm_spi_get_mmap(flash->dev, &map_base, &map_size, &map_offset);
+ if (ret) {
+ printf("Mapping not available (err=%d)\n", ret);
+ return CMD_RET_FAILURE;
+ }
+ if (offset < 0 || offset + len > map_size) {
+ printf("Offset out of range (map size %x)\n", map_size);
+ return CMD_RET_FAILURE;
+ }
+ printf("%lx\n", map_base + (ulong)offset);
+
+ return 0;
+}
+
enum {
STAGE_ERASE,
STAGE_CHECK,
@@ -580,6 +610,8 @@ static int do_spi_flash(struct cmd_tbl *cmdtp, int flag, int argc,
ret = do_spi_flash_erase(argc, argv);
else if (strcmp(cmd, "protect") == 0)
ret = do_spi_protect(argc, argv);
+ else if (IS_ENABLED(CONFIG_CMD_SF_MMAP) && !strcmp(cmd, "mmap"))
+ ret = do_spi_flash_mmap(argc, argv);
else if (IS_ENABLED(CONFIG_CMD_SF_TEST) && !strcmp(cmd, "test"))
ret = do_spi_flash_test(argc, argv);
else
@@ -611,6 +643,9 @@ static const char long_help[] =
" or to start of mtd `partition'\n"
"sf protect lock/unlock sector len - protect/unprotect 'len' bytes starting\n"
" at address 'sector'"
+#ifdef CONFIG_CMD_SF_MMAP
+ "\nsf mmap offset len - get memory address of SPI-flash offset\n"
+#endif
#ifdef CONFIG_CMD_SF_TEST
"\nsf test offset len - run a very basic destructive test"
#endif
diff --git a/doc/usage/sf.rst b/doc/usage/sf.rst
index 6ace1b428d9..b89c0fd5b01 100644
--- a/doc/usage/sf.rst
+++ b/doc/usage/sf.rst
@@ -14,6 +14,7 @@ Synopis
sf erase <offset>|<partition> <len>
sf update <addr> <offset>|<partition> <len>
sf protect lock|unlock <sector> <len>
+ sf mmap <offset>|<partition> <len>
sf test <offset>|<partition> <len>
Description
@@ -143,6 +144,16 @@ lock|unlock
Number of bytes to lock/unlock
+Memory-mapped flash
+-------------------
+
+On some systems part of the SPI flash is mapped into mmemory. With *sf mmap*
+you can map a SPI-flash offset to a memory address, so that the contents can be
+browsed using 'md', for example.
+
+The command will fail if this is not supported by the hardware or driver.
+
+
Test
~~~~
@@ -236,6 +247,58 @@ This second example is running on coral, an x86 Chromebook::
2 write: 227 ticks, 2255 KiB/s 18.040 Mbps
3 read: 189 ticks, 2708 KiB/s 21.664 Mbps
+ # On coral, SPI flash offset 0 corresponds to address ff081000 in memory
+ => sf mmap 0 1000
+ device 0 offset 0x0, size 0x1000
+ ff081000
+
+ # See below for how this address was obtained
+ => sf mmap e80000 11e18
+ device 0 offset 0xe80000, size 0x11e18
+ fff01000
+ => md fff01000
+ fff01000: b2e8e089 89000030 30b4e8c4 c0310000 ....0......0..1.
+ fff01010: 002c95e8 2ce8e800 feeb0000 dfe8c489 ..,....,........
+ fff01020: f400002c 83f4fdeb d4e80cec 3100001e ,..............1
+ fff01030: 0cc483c0 f883c3c3 8b0b770a df408504 .........w....@.
+ fff01040: c085fef1 c8b80575 c3fef1e5 53565755 ....u.......UWVS
+ fff01050: 89c38951 2404c7c5 80000002 8924048b Q......$......$.
+ fff01060: 89a20fdf 89fb89de 75890045 084d8904 ........E..u..M.
+ fff01070: ff0c5589 c5832404 243c8110 80000005 .U...$....<$....
+ fff01080: 43c6da75 3b800030 43037520 d889f8eb u..C0..; u.C....
+ fff01090: 5f5e5b5a 80e6c35d 535657c3 e7e8c689 Z[^_]....WVS....
+ fff010a0: 89000069 00a164c3 8b000000 408b4c56 i....d......VL.@
+ fff010b0: 0cec837c ddb9ff6a e8fef1e5 00004e01 |...j........N..
+ fff010c0: a1640389 00000000 1c80b60f 66000001 ..d............f
+ fff010d0: b80c4389 00000001 a20fdf89 fb89de89 .C..............
+ fff010e0: 89104389 c4831453 5bc03110 56c35f5e .C..S....1.[^_.V
+ fff010f0: 14ec8353 ce89d389 0000a164 b60f0000 S.......d.......
+
+
+The offset e80000 was obtained using the following binman command, to find the
+location of U-Boot SPL::
+
+ $ binman ls -i /tmp/b/chromebook_coral/u-boot.rom
+ Name Image-pos Size Entry-type Offset Uncomp-size
+ ------------------------------------------------------------------------------------------------------
+ main-section 0 1000000 section 0
+ spl e80000 11e18 u-boot-spl ffe80000
+ u-boot d00000 9106e u-boot ffd00000
+ ...
+
.. _SPI documentation:
https://en.wikipedia.org/wiki/Serial_Peripheral_Interface
+
+
+Configuration
+-------------
+
+The *sf* command is only available if `CONFIG_CMD_SF=y`. Note that it depends on
+`CONFIG_DM_SPI_FLASH`.
+
+Return value
+------------
+
+The return value $? is set to 0 (true) if the command succeded and to 1 (false)
+otherwise.
--
2.32.0.554.ge1b32706d8-goog
prev parent reply other threads:[~2021-08-01 21:13 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-01 21:12 [PATCH v3 0/4] sf: Add documentation and an 'sf mmap' command Simon Glass
2021-08-01 21:12 ` [PATCH v3 1/4] command: Use a constant pointer for the help Simon Glass
2021-08-01 21:12 ` [PATCH v3 2/4] sf: Tidy up code to avoid #ifdef Simon Glass
2021-08-02 16:28 ` Pratyush Yadav
2021-08-01 21:12 ` [PATCH v3 3/4] sf: doc: Add documentation for the 'sf' command Simon Glass
2021-08-02 16:38 ` Pratyush Yadav
2021-08-01 21:12 ` Simon Glass [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=20210801211245.2208037-5-sjg@chromium.org \
--to=sjg@chromium.org \
--cc=jagan@amarulasolutions.com \
--cc=u-boot@lists.denx.de \
--cc=vapier@gentoo.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.