Lines Matching +full:flash +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0+
3 * Command for accessing SPI flash.
19 #include <dm/device-internal.h>
21 static struct spi_flash *flash; variable
26 * 1. <cmd> offset len - operate on <'offset', 'len')
27 * 2. <cmd> offset +len - operate on <'offset', 'round_up(len)')
30 * If it isn't in the flash, the function will fail (return -1).
37 * -1: failure (bad format, bad address).
53 return -1; in sf_parse_len_arg()
55 if (round_up_len && flash->sector_size > 0) in sf_parse_len_arg()
56 *len = ROUND(len_arg, flash->sector_size); in sf_parse_len_arg()
74 if (len >= ((unsigned int) -1) / 1024) in bytes_per_second()
85 unsigned int mode = CONFIG_SF_DEFAULT_MODE; in do_spi_flash_probe() local
90 /* In DM mode defaults will be taken from DT */ in do_spi_flash_probe()
91 speed = 0, mode = 0; in do_spi_flash_probe()
99 return -1; in do_spi_flash_probe()
102 return -1; in do_spi_flash_probe()
107 return -1; in do_spi_flash_probe()
114 return -1; in do_spi_flash_probe()
117 mode = simple_strtoul(argv[3], &endp, 16); in do_spi_flash_probe()
119 return -1; in do_spi_flash_probe()
128 flash = NULL; in do_spi_flash_probe()
129 ret = spi_flash_probe_bus_cs(bus, cs, speed, mode, &new); in do_spi_flash_probe()
131 printf("Failed to initialize SPI flash at %u:%u (error %d)\n", in do_spi_flash_probe()
136 flash = dev_get_uclass_priv(new); in do_spi_flash_probe()
138 if (flash) in do_spi_flash_probe()
139 spi_flash_free(flash); in do_spi_flash_probe()
141 new = spi_flash_probe(bus, cs, speed, mode); in do_spi_flash_probe()
142 flash = new; in do_spi_flash_probe()
145 printf("Failed to initialize SPI flash at %u:%u\n", bus, cs); in do_spi_flash_probe()
149 flash = new; in do_spi_flash_probe()
156 * Write a block of data to SPI flash, first checking if it is different from
161 * @param flash flash context pointer
162 * @param offset flash offset to write
169 static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset, in spi_flash_update_block() argument
175 offset, flash->sector_size, len); in spi_flash_update_block()
177 if (spi_flash_read(flash, offset, flash->sector_size, cmp_buf)) in spi_flash_update_block()
187 if (spi_flash_erase(flash, offset, flash->sector_size)) in spi_flash_update_block()
189 /* If it's a partial sector, copy the data into the temp-buffer */ in spi_flash_update_block()
190 if (len != flash->sector_size) { in spi_flash_update_block()
195 if (spi_flash_write(flash, offset, flash->sector_size, ptr)) in spi_flash_update_block()
202 * Update an area of SPI flash by erasing and writing any blocks which need
205 * @param flash flash context pointer
206 * @param offset flash offset to write
211 static int spi_flash_update(struct spi_flash *flash, u32 offset, in spi_flash_update() argument
224 if (end - buf >= 200) in spi_flash_update()
225 scale = (end - buf) / 100; in spi_flash_update()
226 cmp_buf = memalign(ARCH_DMA_MINALIGN, flash->sector_size); in spi_flash_update()
231 todo = min_t(size_t, end - buf, flash->sector_size); in spi_flash_update()
234 100 - (end - buf) / scale, in spi_flash_update()
235 bytes_per_second(buf - start_buf, in spi_flash_update()
239 err_oper = spi_flash_update_block(flash, offset, todo, in spi_flash_update()
248 printf("SPI flash failed in %s step\n", err_oper); in spi_flash_update()
253 printf("%zu bytes written, %zu bytes skipped", len - skipped, in spi_flash_update()
271 return -1; in do_spi_flash_read_write()
275 return -1; in do_spi_flash_read_write()
277 if (mtd_arg_off_size(argc - 2, &argv[2], &dev, &offset, &len, in do_spi_flash_read_write()
278 &maxsize, MTD_DEV_TYPE_NOR, flash->size)) in do_spi_flash_read_write()
279 return -1; in do_spi_flash_read_write()
282 if (offset + len > flash->size) { in do_spi_flash_read_write()
283 printf("ERROR: attempting %s past flash size (%#x)\n", in do_spi_flash_read_write()
284 argv[0], flash->size); in do_spi_flash_read_write()
295 ret = spi_flash_update(flash, offset, len, buf); in do_spi_flash_read_write()
302 ret = spi_flash_read(flash, offset, len, buf); in do_spi_flash_read_write()
304 ret = spi_flash_write(flash, offset, len, buf); in do_spi_flash_read_write()
327 return -1; in do_spi_flash_erase()
330 MTD_DEV_TYPE_NOR, flash->size)) in do_spi_flash_erase()
331 return -1; in do_spi_flash_erase()
335 return -1; in do_spi_flash_erase()
338 if (offset + size > flash->size) { in do_spi_flash_erase()
339 printf("ERROR: attempting %s past flash size (%#x)\n", in do_spi_flash_erase()
340 argv[0], flash->size); in do_spi_flash_erase()
344 ret = spi_flash_erase(flash, offset, size); in do_spi_flash_erase()
358 return -1; in do_spi_protect()
375 return -1; /* Unknown parameter */ in do_spi_protect()
377 ret = spi_flash_protect(flash, start, len, prot); in do_spi_protect()
411 speed = (long long)test->bytes * 1000; in show_time()
412 if (test->time_ms[stage]) in show_time()
413 do_div(speed, test->time_ms[stage] * 1024); in show_time()
417 stage_name[stage], test->time_ms[stage], in show_time()
423 test->time_ms[test->stage] = get_timer(test->base_ms); in spi_test_next_stage()
424 show_time(test, test->stage); in spi_test_next_stage()
425 test->base_ms = get_timer(0); in spi_test_next_stage()
426 test->stage++; in spi_test_next_stage()
430 * Run a test on the SPI flash
432 * @param flash SPI flash to use
435 * @param offset Offset within flash to check
437 * @return 0 if ok, -1 on error
439 static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len, in spi_flash_test() argument
445 printf("SPI flash test:\n"); in spi_flash_test()
449 if (spi_flash_erase(flash, offset, len)) { in spi_flash_test()
451 return -1; in spi_flash_test()
455 if (spi_flash_read(flash, offset, len, vbuf)) { in spi_flash_test()
457 return -1; in spi_flash_test()
463 min_t(uint, len - i, 0x40), 0); in spi_flash_test()
464 return -1; in spi_flash_test()
469 if (spi_flash_write(flash, offset, len, buf)) { in spi_flash_test()
471 return -1; in spi_flash_test()
476 if (spi_flash_read(flash, offset, len, vbuf)) { in spi_flash_test()
478 return -1; in spi_flash_test()
486 min_t(uint, len - i, 0x40), 0); in spi_flash_test()
489 min_t(uint, len - i, 0x40), 0); in spi_flash_test()
490 return -1; in spi_flash_test()
510 return -1; in do_spi_flash_test()
513 return -1; in do_spi_flash_test()
516 return -1; in do_spi_flash_test()
532 ret = spi_flash_test(flash, buf, len, offset, vbuf); in do_spi_flash_test()
554 return -1; in do_spi_flash_ctrl_wlock()
558 return -1; in do_spi_flash_ctrl_wlock()
562 return -1; in do_spi_flash_ctrl_wlock()
569 return -1; /* Unknown parameter */ in do_spi_flash_ctrl_wlock()
572 ret = spi_flash_ctrl_wlock(flash, (u32)offset, (size_t)len); in do_spi_flash_ctrl_wlock()
574 ret = spi_flash_ctrl_wunlock(flash, (u32)offset, (size_t)len); in do_spi_flash_ctrl_wlock()
591 --argc; in do_spi_flash()
600 if (!flash) { in do_spi_flash()
601 puts("No SPI flash selected. Please run `sf probe'\n"); in do_spi_flash()
621 ret = -1; in do_spi_flash()
624 if (ret != -1) in do_spi_flash()
633 "- run a very basic destructive test"
640 "SPI flash sub-system",
641 "probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus\n"
643 "sf read addr offset|partition len - read `len' bytes starting at\n"
646 "sf write addr offset|partition len - write `len' bytes from memory\n"
647 " at `addr' to flash at `offset'\n"
649 "sf erase offset|partition [+]len - erase `len' bytes from `offset'\n"
652 "sf update addr offset|partition len - erase and write `len' bytes from memory\n"
653 " at `addr' to flash at `offset'\n"
655 "sf protect lock/unlock sector len - protect/unprotect 'len' bytes starting\n"