projects
/
platform
/
kernel
/
u-boot.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch '2022-08-04-Kconfig-migrations'
[platform/kernel/u-boot.git]
/
cmd
/
sf.c
diff --git
a/cmd/sf.c
b/cmd/sf.c
index
f971eec
..
058635c
100644
(file)
--- a/
cmd/sf.c
+++ b/
cmd/sf.c
@@
-1,24
+1,28
@@
+// SPDX-License-Identifier: GPL-2.0+
/*
* Command for accessing SPI flash.
*
* Copyright (C) 2008 Atmel Corporation
/*
* Command for accessing SPI flash.
*
* Copyright (C) 2008 Atmel Corporation
- *
- * SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
*/
#include <common.h>
+#include <command.h>
#include <div64.h>
#include <dm.h>
#include <div64.h>
#include <dm.h>
+#include <log.h>
#include <malloc.h>
#include <mapmem.h>
#include <spi.h>
#include <spi_flash.h>
#include <malloc.h>
#include <mapmem.h>
#include <spi.h>
#include <spi_flash.h>
+#include <asm/cache.h>
#include <jffs2/jffs2.h>
#include <linux/mtd/mtd.h>
#include <asm/io.h>
#include <dm/device-internal.h>
#include <jffs2/jffs2.h>
#include <linux/mtd/mtd.h>
#include <asm/io.h>
#include <dm/device-internal.h>
+#include "legacy-mtd-utils.h"
+
static struct spi_flash *flash;
/*
static struct spi_flash *flash;
/*
@@
-49,7
+53,7
@@
static int sf_parse_len_arg(char *arg, ulong *len)
++arg;
}
++arg;
}
- len_arg =
simple_strtoul(arg, &ep, 16
);
+ len_arg =
hextoul(arg, &ep
);
if (ep == arg || *ep != '\0')
return -1;
if (ep == arg || *ep != '\0')
return -1;
@@
-67,7
+71,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
*
* @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)
{
*/
static ulong bytes_per_second(unsigned int len, ulong start_ms)
{
@@
-78,18
+82,18
@@
static ulong bytes_per_second(unsigned int len, ulong start_ms)
return 1024 * len / max(get_timer(start_ms), 1UL);
}
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;
{
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;
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;
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
#else
struct spi_flash *new;
#endif
@@
-113,41
+117,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;
speed = simple_strtoul(argv[2], &endp, 0);
if (*argv[2] == 0 || *endp != 0)
return -1;
+ use_dt = false;
}
if (argc >= 4) {
}
if (argc >= 4) {
- mode =
simple_strtoul(argv[3], &endp, 16
);
+ mode =
hextoul(argv[3], &endp
);
if (*argv[3] == 0 || *endp != 0)
return -1;
if (*argv[3] == 0 || *endp != 0)
return -1;
+ use_dt = false;
}
}
-#if
def 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, DM_REMOVE_NORMAL);
}
flash = NULL;
/* 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, 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;
}
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;
#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;
}
if (!new) {
printf("Failed to initialize SPI flash at %u:%u\n", bus, cs);
return 1;
}
-
- flash = new;
#endif
return 0;
#endif
return 0;
@@
-165,7
+172,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)
* @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)
*/
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)
@@
-207,7
+214,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
* @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)
*/
static int spi_flash_update(struct spi_flash *flash, u32 offset,
size_t len, const char *buf)
@@
-259,7
+266,7
@@
static int spi_flash_update(struct spi_flash *flash, u32 offset,
return 0;
}
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;
{
unsigned long addr;
void *buf;
@@
-271,7
+278,7
@@
static int do_spi_flash_read_write(int argc, char * const argv[])
if (argc < 3)
return -1;
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;
if (*argv[1] == 0 || *endp != 0)
return -1;
@@
-286,8
+293,14
@@
static int do_spi_flash_read_write(int argc, char * const argv[])
return 1;
}
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);
buf = map_physmem(addr, len, MAP_WRBACK);
- if (!buf) {
+ if (!buf
&& addr
) {
puts("Failed to map physical memory\n");
return 1;
}
puts("Failed to map physical memory\n");
return 1;
}
@@
-317,7
+330,7
@@
static int do_spi_flash_read_write(int argc, char * const argv[])
return ret == 0 ? 0 : 1;
}
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;
{
int ret;
int dev = 0;
@@
-342,14
+355,23
@@
static int do_spi_flash_erase(int argc, char * const argv[])
return 1;
}
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);
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;
}
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;
{
int ret = 0;
loff_t start, len;
@@
-380,7
+402,6
@@
static int do_spi_protect(int argc, char * const argv[])
return ret == 0 ? 0 : 1;
}
return ret == 0 ? 0 : 1;
}
-#ifdef CONFIG_CMD_SF_TEST
enum {
STAGE_ERASE,
STAGE_CHECK,
enum {
STAGE_ERASE,
STAGE_CHECK,
@@
-390,7
+411,7
@@
enum {
STAGE_COUNT,
};
STAGE_COUNT,
};
-static char *stage_name[STAGE_COUNT] = {
+static c
onst c
har *stage_name[STAGE_COUNT] = {
"erase",
"check",
"write",
"erase",
"check",
"write",
@@
-414,7
+435,7
@@
static void show_time(struct test_info *test, int stage)
do_div(speed, test->time_ms[stage] * 1024);
bps = speed * 8;
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);
}
stage_name[stage], test->time_ms[stage],
(int)speed, bps / 1000, bps % 1000);
}
@@
-435,26
+456,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
* @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;
*/
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;
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);
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++) {
return -1;
}
for (i = 0; i < len; i++) {
@@
-467,15
+490,17
@@
static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len,
}
spi_test_next_stage(&test);
}
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);
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);
return -1;
}
spi_test_next_stage(&test);
@@
-498,7
+523,7
@@
static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len,
return 0;
}
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;
{
unsigned long offset;
unsigned long len;
@@
-509,10
+534,10
@@
static int do_spi_flash_test(int argc, char * const argv[])
if (argc < 3)
return -1;
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;
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;
if (*argv[2] == 0 || *endp != 0)
return -1;
@@
-540,10
+565,9
@@
static int do_spi_flash_test(int argc, char * const argv[])
return 0;
}
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;
{
const char *cmd;
int ret;
@@
-574,10
+598,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);
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);
ret = do_spi_flash_test(argc, argv);
-#endif
else
ret = -1;
else
ret = -1;
@@
-589,16
+611,8
@@
usage:
return CMD_RET_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"
"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"
@@
-614,6
+628,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 `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
);
);