From 56f73d7720a8ff174cc2c9becd9708fea377aa63 Mon Sep 17 00:00:00 2001 From: Ajita Chavan Date: Sat, 19 Oct 2019 14:56:43 +0800 Subject: [PATCH] flash_ops: fix spi_flash_read with source buffer not from internal memory and size < 16 Closes https://github.com/espressif/esp-idf/issues/4010 --- components/spi_flash/flash_ops.c | 10 ++++++ components/spi_flash/test/CMakeLists.txt | 6 +++- components/spi_flash/test/component.mk | 4 +++ components/spi_flash/test/test_read_write.c | 33 ++++++++++++++++++++ tools/ci/config/target-test.yml | 4 +-- tools/unit-test-app/configs/spi_flash_legacy | 3 ++ 6 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 tools/unit-test-app/configs/spi_flash_legacy diff --git a/components/spi_flash/flash_ops.c b/components/spi_flash/flash_ops.c index 1c5406a1c3..6e61da87de 100644 --- a/components/spi_flash/flash_ops.c +++ b/components/spi_flash/flash_ops.c @@ -513,7 +513,17 @@ esp_err_t IRAM_ATTR spi_flash_read(size_t src, void *dstv, size_t size) goto out; } COUNTER_ADD_BYTES(read, read_size); +#ifdef ESP_PLATFORM + if (esp_ptr_external_ram(dstv)) { + spi_flash_guard_end(); + memcpy(dstv, ((uint8_t *) t) + left_off, size); + spi_flash_guard_start(); + } else { + memcpy(dstv, ((uint8_t *) t) + left_off, size); + } +#else memcpy(dstv, ((uint8_t *) t) + left_off, size); +#endif goto out; } uint8_t *dstc = (uint8_t *) dstv; diff --git a/components/spi_flash/test/CMakeLists.txt b/components/spi_flash/test/CMakeLists.txt index ae23154f2f..831e142120 100644 --- a/components/spi_flash/test/CMakeLists.txt +++ b/components/spi_flash/test/CMakeLists.txt @@ -1,3 +1,7 @@ idf_component_register(SRC_DIRS "." INCLUDE_DIRS "." - REQUIRES unity test_utils spi_flash bootloader_support app_update) \ No newline at end of file + REQUIRES unity test_utils spi_flash bootloader_support app_update) + +if(CONFIG_SPI_FLASH_USE_LEGACY_IMPL) + set(COMPONENT_SRCEXCLUDE "test_esp_flash.c" "test_partition_ext.c") +endif() diff --git a/components/spi_flash/test/component.mk b/components/spi_flash/test/component.mk index 5dd172bdb7..2a236e9d03 100644 --- a/components/spi_flash/test/component.mk +++ b/components/spi_flash/test/component.mk @@ -3,3 +3,7 @@ # COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive + +ifdef CONFIG_SPI_FLASH_USE_LEGACY_IMPL + COMPONENT_OBJEXCLUDE += test_esp_flash.o test_partition_ext.o +endif diff --git a/components/spi_flash/test/test_read_write.c b/components/spi_flash/test/test_read_write.c index e780b6e2fe..f357695ebb 100644 --- a/components/spi_flash/test/test_read_write.c +++ b/components/spi_flash/test/test_read_write.c @@ -28,6 +28,7 @@ #include "soc/timer_periph.h" #include "esp_heap_caps.h" +#define MIN_BLOCK_SIZE 12 /* Base offset in flash for tests. */ static size_t start; @@ -266,4 +267,36 @@ TEST_CASE("spi_flash_write can write from external RAM buffer", "[spi_flash]") free(buf_int); } +TEST_CASE("spi_flash_read less than 16 bytes into buffer in external RAM", "[spi_flash]") +{ + uint8_t *buf_ext_8 = (uint8_t *) heap_caps_malloc(MIN_BLOCK_SIZE, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + TEST_ASSERT_NOT_NULL(buf_ext_8); + + uint8_t *buf_int_8 = (uint8_t *) heap_caps_malloc(MIN_BLOCK_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); + TEST_ASSERT_NOT_NULL(buf_int_8); + + uint8_t data_8[MIN_BLOCK_SIZE]; + for (int i = 0; i < MIN_BLOCK_SIZE; i++) { + data_8[i] = i; + } + + const esp_partition_t *part = get_test_data_partition(); + TEST_ESP_OK(spi_flash_erase_range(part->address, SPI_FLASH_SEC_SIZE)); + TEST_ESP_OK(spi_flash_write(part->address, data_8, MIN_BLOCK_SIZE)); + TEST_ESP_OK(spi_flash_read(part->address, buf_ext_8, MIN_BLOCK_SIZE)); + TEST_ESP_OK(spi_flash_read(part->address, buf_int_8, MIN_BLOCK_SIZE)); + + TEST_ASSERT_EQUAL(0, memcmp(buf_ext_8, data_8, MIN_BLOCK_SIZE)); + TEST_ASSERT_EQUAL(0, memcmp(buf_int_8, data_8, MIN_BLOCK_SIZE)); + + if (buf_ext_8) { + free(buf_ext_8); + buf_ext_8 = NULL; + } + if (buf_int_8) { + free(buf_int_8); + buf_int_8 = NULL; + } +} + #endif // CONFIG_ESP32_SPIRAM_SUPPORT diff --git a/tools/ci/config/target-test.yml b/tools/ci/config/target-test.yml index c2845ac964..35e80e0ebf 100644 --- a/tools/ci/config/target-test.yml +++ b/tools/ci/config/target-test.yml @@ -233,7 +233,7 @@ UT_001: UT_002: extends: .unit_test_template - parallel: 18 + parallel: 30 tags: - ESP32_IDF - UT_T1_1 @@ -432,7 +432,7 @@ UT_029: # Gitlab parallel max value is 50. We need to create another UT job if parallel is larger than 50. UT_030: extends: .unit_test_template - parallel: 6 + parallel: 10 tags: - ESP32_IDF - UT_T1_1 diff --git a/tools/unit-test-app/configs/spi_flash_legacy b/tools/unit-test-app/configs/spi_flash_legacy new file mode 100644 index 0000000000..3d5b1d9d2d --- /dev/null +++ b/tools/unit-test-app/configs/spi_flash_legacy @@ -0,0 +1,3 @@ +TEST_COMPONENTS=spi_flash +CONFIG_ESP32_SPIRAM_SUPPORT=y +CONFIG_SPI_FLASH_USE_LEGACY_IMPL=y