Commit 26f6e9dc authored by Simon Glass's avatar Simon Glass
Browse files

sf: Provide a command to access memory-mapped SPI



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.

Cover-letter:
sf: Add documentation and an 'sf mmap' command
This little series adds documentation and a few other tidy-ups to the
'sf' command.

It also provides a way to access memory-mapped SPI via the command line.
END
Series-changes: 3
- Add configuration and return value also

Series-links: 256158 2:256134 1:237539
Series-version: 4
Series-to: u-boot
Series-cc: heinrich
Series-cc: Jagan Teki <jagan@amarulasolutions.com>
Signed-off-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
parent 3195d722
Pipeline #9173 passed with stages
in 45 minutes and 17 seconds
......@@ -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
......@@ -200,6 +201,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
......
......@@ -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
......
......@@ -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
......
......@@ -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
~~~~
......@@ -240,6 +251,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.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment