X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cmd%2Fsf.c;h=cd50b38081c2e5959dad9fae5d7caeaf73ff3830;hb=fc97ff2695d6d7fbea7d5fda7b080f405d6ee744;hp=286906c3a151c916d549df6938ad73a0273aec94;hpb=926fbcc08327bd0ffb9964765e6573c432957998;p=platform%2Fkernel%2Fu-boot.git diff --git a/cmd/sf.c b/cmd/sf.c index 286906c..cd50b38 100644 --- a/cmd/sf.c +++ b/cmd/sf.c @@ -1,24 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Command for accessing SPI flash. * * Copyright (C) 2008 Atmel Corporation - * - * SPDX-License-Identifier: GPL-2.0+ */ #include +#include #include #include +#include +#include #include #include #include #include +#include #include #include #include #include +#include "legacy-mtd-utils.h" + static struct spi_flash *flash; /* @@ -49,7 +54,7 @@ static int sf_parse_len_arg(char *arg, ulong *len) ++arg; } - len_arg = simple_strtoul(arg, &ep, 16); + len_arg = hextoul(arg, &ep); if (ep == arg || *ep != '\0') return -1; @@ -67,7 +72,7 @@ static int sf_parse_len_arg(char *arg, ulong *len) * * @param len amount of bytes currently processed * @param start_ms start time of processing in ms - * @return bytes per second if OK, 0 on error + * Return: bytes per second if OK, 0 on error */ static ulong bytes_per_second(unsigned int len, ulong start_ms) { @@ -78,18 +83,18 @@ static ulong bytes_per_second(unsigned int len, ulong start_ms) return 1024 * len / max(get_timer(start_ms), 1UL); } -static int do_spi_flash_probe(int argc, char * const argv[]) +static int do_spi_flash_probe(int argc, char *const argv[]) { unsigned int bus = CONFIG_SF_DEFAULT_BUS; unsigned int cs = CONFIG_SF_DEFAULT_CS; + /* In DM mode, defaults speed and mode will be taken from DT */ unsigned int speed = CONFIG_SF_DEFAULT_SPEED; unsigned int mode = CONFIG_SF_DEFAULT_MODE; char *endp; -#ifdef CONFIG_DM_SPI_FLASH + bool use_dt = true; +#if CONFIG_IS_ENABLED(DM_SPI_FLASH) struct udevice *new, *bus_dev; int ret; - /* In DM mode defaults will be taken from DT */ - speed = 0, mode = 0; #else struct spi_flash *new; #endif @@ -113,42 +118,44 @@ static int do_spi_flash_probe(int argc, char * const argv[]) speed = simple_strtoul(argv[2], &endp, 0); if (*argv[2] == 0 || *endp != 0) return -1; + use_dt = false; } if (argc >= 4) { - mode = simple_strtoul(argv[3], &endp, 16); + mode = hextoul(argv[3], &endp); if (*argv[3] == 0 || *endp != 0) return -1; + use_dt = false; } -#ifdef CONFIG_DM_SPI_FLASH +#if CONFIG_IS_ENABLED(DM_SPI_FLASH) /* Remove the old device, otherwise probe will just be a nop */ ret = spi_find_bus_and_cs(bus, cs, &bus_dev, &new); if (!ret) { - device_remove(new); - device_unbind(new); + device_remove(new, DM_REMOVE_NORMAL); } flash = NULL; - ret = spi_flash_probe_bus_cs(bus, cs, speed, mode, &new); - if (ret) { + if (use_dt) { + spi_flash_probe_bus_cs(bus, cs, &new); + flash = dev_get_uclass_priv(new); + } else { + flash = spi_flash_probe(bus, cs, speed, mode); + } + + if (!flash) { printf("Failed to initialize SPI flash at %u:%u (error %d)\n", bus, cs, ret); return 1; } - - flash = dev_get_uclass_priv(new); #else if (flash) spi_flash_free(flash); new = spi_flash_probe(bus, cs, speed, mode); flash = new; - if (!new) { printf("Failed to initialize SPI flash at %u:%u\n", bus, cs); return 1; } - - flash = new; #endif return 0; @@ -166,7 +173,7 @@ static int do_spi_flash_probe(int argc, char * const argv[]) * @param buf buffer to write from * @param cmp_buf read buffer to use to compare data * @param skipped Count of skipped data (incremented by this function) - * @return NULL if OK, else a string containing the stage which failed + * Return: NULL if OK, else a string containing the stage which failed */ static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset, size_t len, const char *buf, char *cmp_buf, size_t *skipped) @@ -208,7 +215,7 @@ static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset, * @param offset flash offset to write * @param len number of bytes to write * @param buf buffer to write from - * @return 0 if ok, 1 on error + * Return: 0 if ok, 1 on error */ static int spi_flash_update(struct spi_flash *flash, u32 offset, size_t len, const char *buf) @@ -260,7 +267,7 @@ static int spi_flash_update(struct spi_flash *flash, u32 offset, return 0; } -static int do_spi_flash_read_write(int argc, char * const argv[]) +static int do_spi_flash_read_write(int argc, char *const argv[]) { unsigned long addr; void *buf; @@ -272,7 +279,7 @@ static int do_spi_flash_read_write(int argc, char * const argv[]) if (argc < 3) return -1; - addr = simple_strtoul(argv[1], &endp, 16); + addr = hextoul(argv[1], &endp); if (*argv[1] == 0 || *endp != 0) return -1; @@ -287,8 +294,14 @@ static int do_spi_flash_read_write(int argc, char * const argv[]) return 1; } + if (strncmp(argv[0], "read", 4) != 0 && flash->flash_is_unlocked && + !flash->flash_is_unlocked(flash, offset, len)) { + printf("ERROR: flash area is locked\n"); + return 1; + } + buf = map_physmem(addr, len, MAP_WRBACK); - if (!buf) { + if (!buf && addr) { puts("Failed to map physical memory\n"); return 1; } @@ -318,7 +331,7 @@ static int do_spi_flash_read_write(int argc, char * const argv[]) return ret == 0 ? 0 : 1; } -static int do_spi_flash_erase(int argc, char * const argv[]) +static int do_spi_flash_erase(int argc, char *const argv[]) { int ret; int dev = 0; @@ -343,14 +356,23 @@ static int do_spi_flash_erase(int argc, char * const argv[]) return 1; } + if (flash->flash_is_unlocked && + !flash->flash_is_unlocked(flash, offset, len)) { + printf("ERROR: flash area is locked\n"); + return 1; + } + ret = spi_flash_erase(flash, offset, size); - printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)size, (u32)offset, - ret ? "ERROR" : "OK"); + printf("SF: %zu bytes @ %#x Erased: ", (size_t)size, (u32)offset); + if (ret) + printf("ERROR %d\n", ret); + else + printf("OK\n"); return ret == 0 ? 0 : 1; } -static int do_spi_protect(int argc, char * const argv[]) +static int do_spi_protect(int argc, char *const argv[]) { int ret = 0; loff_t start, len; @@ -381,7 +403,6 @@ static int do_spi_protect(int argc, char * const argv[]) return ret == 0 ? 0 : 1; } -#ifdef CONFIG_CMD_SF_TEST enum { STAGE_ERASE, STAGE_CHECK, @@ -391,7 +412,7 @@ enum { STAGE_COUNT, }; -static char *stage_name[STAGE_COUNT] = { +static const char *stage_name[STAGE_COUNT] = { "erase", "check", "write", @@ -415,7 +436,7 @@ static void show_time(struct test_info *test, int stage) do_div(speed, test->time_ms[stage] * 1024); bps = speed * 8; - printf("%d %s: %d ticks, %d KiB/s %d.%03d Mbps\n", stage, + printf("%d %s: %u ticks, %d KiB/s %d.%03d Mbps\n", stage, stage_name[stage], test->time_ms[stage], (int)speed, bps / 1000, bps % 1000); } @@ -436,26 +457,28 @@ static void spi_test_next_stage(struct test_info *test) * @param len Size of data to read/write * @param offset Offset within flash to check * @param vbuf Verification buffer - * @return 0 if ok, -1 on error + * Return: 0 if ok, -1 on error */ static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len, ulong offset, uint8_t *vbuf) { struct test_info test; - int i; + int err, i; printf("SPI flash test:\n"); memset(&test, '\0', sizeof(test)); test.base_ms = get_timer(0); test.bytes = len; - if (spi_flash_erase(flash, offset, len)) { - printf("Erase failed\n"); + err = spi_flash_erase(flash, offset, len); + if (err) { + printf("Erase failed (err = %d)\n", err); return -1; } spi_test_next_stage(&test); - if (spi_flash_read(flash, offset, len, vbuf)) { - printf("Check read failed\n"); + err = spi_flash_read(flash, offset, len, vbuf); + if (err) { + printf("Check read failed (err = %d)\n", err); return -1; } for (i = 0; i < len; i++) { @@ -468,15 +491,17 @@ static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len, } spi_test_next_stage(&test); - if (spi_flash_write(flash, offset, len, buf)) { - printf("Write failed\n"); + err = spi_flash_write(flash, offset, len, buf); + if (err) { + printf("Write failed (err = %d)\n", err); return -1; } memset(vbuf, '\0', len); spi_test_next_stage(&test); - if (spi_flash_read(flash, offset, len, vbuf)) { - printf("Read failed\n"); + err = spi_flash_read(flash, offset, len, vbuf); + if (err) { + printf("Read failed (ret = %d)\n", err); return -1; } spi_test_next_stage(&test); @@ -499,7 +524,7 @@ static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len, return 0; } -static int do_spi_flash_test(int argc, char * const argv[]) +static int do_spi_flash_test(int argc, char *const argv[]) { unsigned long offset; unsigned long len; @@ -510,10 +535,10 @@ static int do_spi_flash_test(int argc, char * const argv[]) if (argc < 3) return -1; - offset = simple_strtoul(argv[1], &endp, 16); + offset = hextoul(argv[1], &endp); if (*argv[1] == 0 || *endp != 0) return -1; - len = simple_strtoul(argv[2], &endp, 16); + len = hextoul(argv[2], &endp); if (*argv[2] == 0 || *endp != 0) return -1; @@ -541,10 +566,9 @@ static int do_spi_flash_test(int argc, char * const argv[]) return 0; } -#endif /* CONFIG_CMD_SF_TEST */ -static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int argc, - char * const argv[]) +static int do_spi_flash(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) { const char *cmd; int ret; @@ -575,10 +599,8 @@ static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int argc, ret = do_spi_flash_erase(argc, argv); else if (strcmp(cmd, "protect") == 0) ret = do_spi_protect(argc, argv); -#ifdef CONFIG_CMD_SF_TEST - else if (!strcmp(cmd, "test")) + else if (IS_ENABLED(CONFIG_CMD_SF_TEST) && !strcmp(cmd, "test")) ret = do_spi_flash_test(argc, argv); -#endif else ret = -1; @@ -590,16 +612,8 @@ usage: return CMD_RET_USAGE; } -#ifdef CONFIG_CMD_SF_TEST -#define SF_TEST_HELP "\nsf test offset len " \ - "- run a very basic destructive test" -#else -#define SF_TEST_HELP -#endif - -U_BOOT_CMD( - sf, 5, 1, do_spi_flash, - "SPI flash sub-system", +#ifdef CONFIG_SYS_LONGHELP +static const char long_help[] = "probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus\n" " and chip select\n" "sf read addr offset|partition len - read `len' bytes starting at\n" @@ -615,6 +629,14 @@ U_BOOT_CMD( " at `addr' to flash at `offset'\n" " or to start of mtd `partition'\n" "sf protect lock/unlock sector len - protect/unprotect 'len' bytes starting\n" - " at address 'sector'\n" - SF_TEST_HELP + " at address 'sector'" +#ifdef CONFIG_CMD_SF_TEST + "\nsf test offset len - run a very basic destructive test" +#endif +#endif /* CONFIG_SYS_LONGHELP */ + ; + +U_BOOT_CMD( + sf, 5, 1, do_spi_flash, + "SPI flash sub-system", long_help );