feat(mmu): support mmu and flash mmap driver on p4
This commit is contained in:
@@ -317,9 +317,9 @@ esp_err_t esp_mmu_map_reserve_block_with_caps(size_t size, mmu_mem_caps_t caps,
|
||||
|
||||
uint32_t vaddr = 0;
|
||||
if (caps & MMU_MEM_CAP_EXEC) {
|
||||
vaddr = mmu_ll_laddr_to_vaddr(laddr, MMU_VADDR_INSTRUCTION);
|
||||
vaddr = mmu_ll_laddr_to_vaddr(laddr, MMU_VADDR_INSTRUCTION, target);
|
||||
} else {
|
||||
vaddr = mmu_ll_laddr_to_vaddr(laddr, MMU_VADDR_DATA);
|
||||
vaddr = mmu_ll_laddr_to_vaddr(laddr, MMU_VADDR_DATA, target);
|
||||
}
|
||||
*out_ptr = (void *)vaddr;
|
||||
|
||||
@@ -336,7 +336,6 @@ IRAM_ATTR esp_err_t esp_mmu_paddr_find_caps(const esp_paddr_t paddr, mmu_mem_cap
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < s_mmu_ctx.num_regions; i++) {
|
||||
region = &s_mmu_ctx.mem_regions[i];
|
||||
|
||||
@@ -378,6 +377,38 @@ static void IRAM_ATTR NOINLINE_ATTR s_do_cache_invalidate(uint32_t vaddr_start,
|
||||
#endif // CONFIG_IDF_TARGET_ESP32
|
||||
}
|
||||
|
||||
|
||||
#if MMU_LL_MMU_PER_TARGET
|
||||
FORCE_INLINE_ATTR uint32_t s_mapping_operation(mmu_target_t target, uint32_t vaddr_start, esp_paddr_t paddr_start, uint32_t size)
|
||||
{
|
||||
uint32_t actual_mapped_len = 0;
|
||||
uint32_t mmu_id = 0;
|
||||
if (target == MMU_TARGET_FLASH0) {
|
||||
mmu_id = MMU_LL_FLASH_MMU_ID;
|
||||
} else {
|
||||
mmu_id = MMU_LL_PSRAM_MMU_ID;
|
||||
}
|
||||
mmu_hal_map_region(mmu_id, target, vaddr_start, paddr_start, size, &actual_mapped_len);
|
||||
|
||||
return actual_mapped_len;
|
||||
}
|
||||
#else
|
||||
FORCE_INLINE_ATTR uint32_t s_mapping_operation(mmu_target_t target, uint32_t vaddr_start, esp_paddr_t paddr_start, uint32_t size)
|
||||
{
|
||||
uint32_t actual_mapped_len = 0;
|
||||
|
||||
mmu_hal_map_region(0, target, vaddr_start, paddr_start, size, &actual_mapped_len);
|
||||
#if (SOC_MMU_PERIPH_NUM == 2)
|
||||
#if !CONFIG_FREERTOS_UNICORE
|
||||
mmu_hal_map_region(1, target, vaddr_start, paddr_start, size, &actual_mapped_len);
|
||||
#endif // #if !CONFIG_FREERTOS_UNICORE
|
||||
#endif // #if (SOC_MMU_PERIPH_NUM == 2)
|
||||
|
||||
return actual_mapped_len;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void IRAM_ATTR NOINLINE_ATTR s_do_mapping(mmu_target_t target, uint32_t vaddr_start, esp_paddr_t paddr_start, uint32_t size)
|
||||
{
|
||||
/**
|
||||
@@ -387,16 +418,7 @@ static void IRAM_ATTR NOINLINE_ATTR s_do_mapping(mmu_target_t target, uint32_t v
|
||||
*/
|
||||
spi_flash_disable_interrupts_caches_and_other_cpu();
|
||||
|
||||
uint32_t actual_mapped_len = 0;
|
||||
mmu_hal_map_region(0, target, vaddr_start, paddr_start, size, &actual_mapped_len);
|
||||
#if (SOC_MMU_PERIPH_NUM == 2)
|
||||
#if !CONFIG_FREERTOS_UNICORE
|
||||
#ifndef CONFIG_IDF_TARGET_ESP32P4 // for spi flash mmap, we always use flash mmu
|
||||
//TODO: IDF-7509
|
||||
mmu_hal_map_region(1, target, vaddr_start, paddr_start, size, &actual_mapped_len);
|
||||
#endif
|
||||
#endif // #if !CONFIG_FREERTOS_UNICORE
|
||||
#endif // #if (SOC_MMU_PERIPH_NUM == 2)
|
||||
uint32_t actual_mapped_len = s_mapping_operation(target, vaddr_start, paddr_start, size);
|
||||
|
||||
cache_bus_mask_t bus_mask = cache_ll_l1_get_bus(0, vaddr_start, size);
|
||||
cache_ll_l1_enable_bus(0, bus_mask);
|
||||
@@ -532,22 +554,16 @@ esp_err_t esp_mmu_map(esp_paddr_t paddr_start, size_t size, mmu_target_t target,
|
||||
new_block->laddr_end = new_block->laddr_start + aligned_size;
|
||||
new_block->size = aligned_size;
|
||||
new_block->caps = caps;
|
||||
#if CONFIG_IDF_TARGET_ESP32P4
|
||||
//TODO: IDF-7509
|
||||
new_block->vaddr_start = mmu_ll_laddr_to_vaddr(new_block->laddr_start, MMU_VADDR_FLASH);
|
||||
new_block->vaddr_end = mmu_ll_laddr_to_vaddr(new_block->laddr_end, MMU_VADDR_FLASH);
|
||||
#else
|
||||
if (caps & MMU_MEM_CAP_EXEC) {
|
||||
new_block->vaddr_start = mmu_ll_laddr_to_vaddr(new_block->laddr_start, MMU_VADDR_INSTRUCTION);
|
||||
new_block->vaddr_end = mmu_ll_laddr_to_vaddr(new_block->laddr_end, MMU_VADDR_INSTRUCTION);
|
||||
} else {
|
||||
new_block->vaddr_start = mmu_ll_laddr_to_vaddr(new_block->laddr_start, MMU_VADDR_DATA);
|
||||
new_block->vaddr_end = mmu_ll_laddr_to_vaddr(new_block->laddr_end, MMU_VADDR_DATA);
|
||||
}
|
||||
#endif
|
||||
new_block->paddr_start = paddr_start;
|
||||
new_block->paddr_end = paddr_start + aligned_size;
|
||||
new_block->target = target;
|
||||
if (caps & MMU_MEM_CAP_EXEC) {
|
||||
new_block->vaddr_start = mmu_ll_laddr_to_vaddr(new_block->laddr_start, MMU_VADDR_INSTRUCTION, target);
|
||||
new_block->vaddr_end = mmu_ll_laddr_to_vaddr(new_block->laddr_end, MMU_VADDR_INSTRUCTION, target);
|
||||
} else {
|
||||
new_block->vaddr_start = mmu_ll_laddr_to_vaddr(new_block->laddr_start, MMU_VADDR_DATA, target);
|
||||
new_block->vaddr_end = mmu_ll_laddr_to_vaddr(new_block->laddr_end, MMU_VADDR_DATA, target);
|
||||
}
|
||||
|
||||
//do mapping
|
||||
s_do_mapping(target, new_block->vaddr_start, paddr_start, aligned_size);
|
||||
@@ -567,6 +583,32 @@ err:
|
||||
}
|
||||
|
||||
|
||||
#if MMU_LL_MMU_PER_TARGET
|
||||
FORCE_INLINE_ATTR void s_unmapping_operation(uint32_t vaddr_start, uint32_t size)
|
||||
{
|
||||
uint32_t mmu_id = 0;
|
||||
mmu_target_t target = mmu_ll_vaddr_to_target(vaddr_start);
|
||||
|
||||
if (target == MMU_TARGET_FLASH0) {
|
||||
mmu_id = MMU_LL_FLASH_MMU_ID;
|
||||
} else {
|
||||
mmu_id = MMU_LL_PSRAM_MMU_ID;
|
||||
}
|
||||
mmu_hal_unmap_region(mmu_id, vaddr_start, size);
|
||||
}
|
||||
#else
|
||||
FORCE_INLINE_ATTR void s_unmapping_operation(uint32_t vaddr_start, uint32_t size)
|
||||
{
|
||||
mmu_hal_unmap_region(0, vaddr_start, size);
|
||||
#if (SOC_MMU_PERIPH_NUM == 2)
|
||||
#if !CONFIG_FREERTOS_UNICORE
|
||||
mmu_hal_unmap_region(1, vaddr_start, size);
|
||||
#endif // #if !CONFIG_FREERTOS_UNICORE
|
||||
#endif // #if (SOC_MMU_PERIPH_NUM == 2)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void IRAM_ATTR NOINLINE_ATTR s_do_unmapping(uint32_t vaddr_start, uint32_t size)
|
||||
{
|
||||
/**
|
||||
@@ -576,15 +618,7 @@ static void IRAM_ATTR NOINLINE_ATTR s_do_unmapping(uint32_t vaddr_start, uint32_
|
||||
*/
|
||||
spi_flash_disable_interrupts_caches_and_other_cpu();
|
||||
|
||||
mmu_hal_unmap_region(0, vaddr_start, size);
|
||||
#if (SOC_MMU_PERIPH_NUM == 2)
|
||||
#if !CONFIG_FREERTOS_UNICORE
|
||||
#ifndef CONFIG_IDF_TARGET_ESP32P4 // for flash mmap, we always use flash mmu
|
||||
//TODO: IDF-7509
|
||||
mmu_hal_unmap_region(1, vaddr_start, size);
|
||||
#endif
|
||||
#endif // #if !CONFIG_FREERTOS_UNICORE
|
||||
#endif // #if (SOC_MMU_PERIPH_NUM == 2)
|
||||
s_unmapping_operation(vaddr_start, size);
|
||||
|
||||
//enable Cache, after this function, internal RAM access is no longer mandatory
|
||||
spi_flash_enable_interrupts_caches_and_other_cpu();
|
||||
|
||||
@@ -18,17 +18,17 @@ const mmu_mem_region_t g_mmu_mem_regions[SOC_MMU_LINEAR_ADDRESS_REGION_NUM] = {
|
||||
[0] = {
|
||||
.start = SOC_MMU_FLASH_LINEAR_ADDRESS_LOW,
|
||||
.end = SOC_MMU_FLASH_LINEAR_ADDRESS_HIGH,
|
||||
.size = SOC_MMU_FLASH_LINEAR_ADDRESS_SIZE,
|
||||
.size = BUS_SIZE(SOC_MMU_FLASH_LINEAR),
|
||||
.bus_id = CACHE_BUS_IBUS0 | CACHE_BUS_DBUS0,
|
||||
.targets = MMU_TARGET_FLASH0,
|
||||
.caps = MMU_MEM_CAP_FLASH | MMU_MEM_CAP_EXEC | MMU_MEM_CAP_READ | MMU_MEM_CAP_32BIT | MMU_MEM_CAP_8BIT,
|
||||
.caps = MMU_MEM_CAP_EXEC | MMU_MEM_CAP_READ | MMU_MEM_CAP_WRITE | MMU_MEM_CAP_32BIT | MMU_MEM_CAP_8BIT,
|
||||
},
|
||||
[1] = {
|
||||
.start = SOC_MMU_PSRAM_LINEAR_ADDRESS_LOW,
|
||||
.end = SOC_MMU_PSRAM_LINEAR_ADDRESS_HIGH,
|
||||
.size = SOC_MMU_PSRAM_LINEAR_ADDRESS_SIZE,
|
||||
.size = BUS_SIZE(SOC_MMU_PSRAM_LINEAR),
|
||||
.bus_id = CACHE_BUS_IBUS1 | CACHE_BUS_DBUS1,
|
||||
.targets = MMU_TARGET_PSRAM0,
|
||||
.caps = MMU_MEM_CAP_PSRAM | MMU_MEM_CAP_EXEC | MMU_MEM_CAP_READ | MMU_MEM_CAP_32BIT | MMU_MEM_CAP_8BIT,
|
||||
.caps = MMU_MEM_CAP_EXEC | MMU_MEM_CAP_READ | MMU_MEM_CAP_WRITE | MMU_MEM_CAP_32BIT | MMU_MEM_CAP_8BIT,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -55,7 +55,6 @@ typedef struct test_block_info_ {
|
||||
} test_block_info_t;
|
||||
|
||||
static LIST_HEAD(test_block_list_head_, test_block_info_) test_block_head;
|
||||
static DRAM_ATTR uint8_t sector_buf[TEST_BLOCK_SIZE];
|
||||
|
||||
|
||||
static void s_fill_random_data(uint8_t *buffer, size_t size, int random_seed)
|
||||
@@ -66,7 +65,7 @@ static void s_fill_random_data(uint8_t *buffer, size_t size, int random_seed)
|
||||
}
|
||||
}
|
||||
|
||||
static bool s_test_mmap_data_by_random(uint8_t *mblock_ptr, size_t size, int random_seed)
|
||||
static bool s_test_mmap_data_by_random(uint8_t *mblock_ptr, size_t size, int random_seed, uint8_t *flash_ref_buf)
|
||||
{
|
||||
srand(random_seed);
|
||||
uint8_t *test_ptr = mblock_ptr;
|
||||
@@ -77,7 +76,7 @@ static bool s_test_mmap_data_by_random(uint8_t *mblock_ptr, size_t size, int ran
|
||||
printf("i: %d\n", i);
|
||||
printf("test_data: %d\n", test_data);
|
||||
printf("test_ptr[%d]: %d\n", i, test_ptr[i]);
|
||||
printf("sector_buf[%d]: %d\n", i, sector_buf[i]);
|
||||
printf("flash_ref_buf[%d]: %d\n", i, flash_ref_buf[i]);
|
||||
ESP_EARLY_LOGE(TAG, "FAIL!!!!!!");
|
||||
return false;
|
||||
}
|
||||
@@ -87,6 +86,9 @@ static bool s_test_mmap_data_by_random(uint8_t *mblock_ptr, size_t size, int ran
|
||||
|
||||
TEST_CASE("test all readable vaddr can map to flash", "[mmu]")
|
||||
{
|
||||
uint8_t *sector_buf = heap_caps_calloc(1, TEST_BLOCK_SIZE, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
|
||||
TEST_ASSERT(sector_buf);
|
||||
|
||||
//Get the partition used for SPI1 erase operation
|
||||
const esp_partition_t *part = s_get_partition();
|
||||
ESP_LOGI(TAG, "found partition '%s' at offset 0x%"PRIx32" with size 0x%"PRIx32, part->label, part->address, part->size);
|
||||
@@ -113,7 +115,7 @@ TEST_CASE("test all readable vaddr can map to flash", "[mmu]")
|
||||
ret = esp_mmu_map(part->address, TEST_BLOCK_SIZE, MMU_TARGET_FLASH0, MMU_MEM_CAP_READ, 0, &ptr);
|
||||
if (ret == ESP_OK) {
|
||||
ESP_LOGI(TAG, "ptr is %p", ptr);
|
||||
bool success = s_test_mmap_data_by_random((uint8_t *)ptr, sizeof(sector_buf), test_seed);
|
||||
bool success = s_test_mmap_data_by_random((uint8_t *)ptr, sizeof(sector_buf), test_seed, sector_buf);
|
||||
TEST_ASSERT(success);
|
||||
} else if (ret == ESP_ERR_NOT_FOUND) {
|
||||
free(block_info);
|
||||
@@ -138,6 +140,8 @@ TEST_CASE("test all readable vaddr can map to flash", "[mmu]")
|
||||
block_to_free = LIST_NEXT(block_to_free, entries);
|
||||
free(temp);
|
||||
}
|
||||
|
||||
free(sector_buf);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -5,3 +5,4 @@ CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
|
||||
CONFIG_PARTITION_TABLE_FILENAME="partitions.csv"
|
||||
|
||||
CONFIG_COMPILER_DUMP_RTL_FILES=y
|
||||
CONFIG_HAL_ASSERTION_SILENT=y
|
||||
|
||||
Reference in New Issue
Block a user