From 64e0ee573df81a2fc71dd4cd73a9c37296c28380 Mon Sep 17 00:00:00 2001 From: Armando Date: Fri, 19 Aug 2022 17:31:32 +0800 Subject: [PATCH] esp_psram: rename esp_private/mmu.h to mmu_psram_flash.h Prior to this commit, esp_psram/include/esp_private/mmu.h contains some APIs that is used for: - copy flash content to psram - necessary sync APIs used by flash_mmap.c, due to above feature This commit rename it to mmu_psram_flash.h, therefore mmu.h can be used for real mmu related APIs. This commit also moves above mention funcitons in `mmu.c` and `mmu_psram.c` to `mmu_psram_flash.c`, leaving `mmu.c` to be used for real mmu driver. --- components/esp_psram/CMakeLists.txt | 2 +- components/esp_psram/esp_psram.c | 2 +- .../esp_private/{mmu.h => mmu_psram_flash.h} | 46 +++--- components/esp_psram/linker.lf | 2 +- components/esp_psram/mmu.c | 107 +------------- .../{mmu_psram.c => mmu_psram_flash.c} | 136 ++++++++++++++++-- components/spi_flash/flash_mmap.c | 2 +- 7 files changed, 161 insertions(+), 136 deletions(-) rename components/esp_psram/include/esp_private/{mmu.h => mmu_psram_flash.h} (75%) rename components/esp_psram/{mmu_psram.c => mmu_psram_flash.c} (50%) diff --git a/components/esp_psram/CMakeLists.txt b/components/esp_psram/CMakeLists.txt index bbff893900..f589f3dfc5 100644 --- a/components/esp_psram/CMakeLists.txt +++ b/components/esp_psram/CMakeLists.txt @@ -14,7 +14,7 @@ set(srcs) if(CONFIG_SPIRAM) list(APPEND srcs "esp_psram.c" "mmu.c" - "mmu_psram.c") + "mmu_psram_flash.c") if(${target} STREQUAL "esp32") list(APPEND srcs "esp32/esp_psram_extram_cache.c" diff --git a/components/esp_psram/esp_psram.c b/components/esp_psram/esp_psram.c index e068edf58d..cd972a6967 100644 --- a/components/esp_psram/esp_psram.c +++ b/components/esp_psram/esp_psram.c @@ -23,7 +23,7 @@ #include "hal/cache_ll.h" #include "esp_private/esp_psram_io.h" #include "esp_private/esp_psram_extram.h" -#include "esp_private/mmu.h" +#include "esp_private/mmu_psram_flash.h" #include "esp_psram_impl.h" #include "esp_psram.h" diff --git a/components/esp_psram/include/esp_private/mmu.h b/components/esp_psram/include/esp_private/mmu_psram_flash.h similarity index 75% rename from components/esp_psram/include/esp_private/mmu.h rename to components/esp_psram/include/esp_private/mmu_psram_flash.h index 1925f388ed..58bb188610 100644 --- a/components/esp_psram/include/esp_private/mmu.h +++ b/components/esp_psram/include/esp_private/mmu_psram_flash.h @@ -5,13 +5,16 @@ */ /** - * This file will be redesigned into MMU driver, to maintain all the external - * memory contexts including: - * - Flash - * - PSRAM - * - DDR + * @Backgrounds * - * Now only MMU-PSRAM related private APIs + * This file contains 2 parts: + * 1. Feature: Copy Flash content to PSRAM. Related APIs are private: + * - mmu_config_psram_text_segment() + * - mmu_config_psram_rodata_segment() + * + * 2. Private APIs used by `flash_mmap.c` and `cache_utils.c` + * APIs in 2 are due to lack of MMU driver. There will be an MMU driver to maintain vaddr range. + * APIs in 2 will be refactored when MMU driver is ready */ #pragma once @@ -46,7 +49,9 @@ intptr_t mmu_get_psram_vaddr_start(void); */ intptr_t mmu_get_psram_vaddr_end(void); - +/*---------------------------------------------------------------------------- + Part 1 APIs (See @Backgrounds on top of this file) +-------------------------------------------------------------------------------*/ #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS /** * @brief Copy Flash texts to PSRAM @@ -56,7 +61,24 @@ intptr_t mmu_get_psram_vaddr_end(void); * @param[out] out_page Used pages */ esp_err_t mmu_config_psram_text_segment(uint32_t start_page, uint32_t psram_size, uint32_t *out_page); +#endif //#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS +#if CONFIG_SPIRAM_RODATA +/** + * @brief Copy Flash rodata to PSRAM + * + * @param[in] start_page PSRAM physical start page + * @param[in] psram_size PSRAM available size + * @param[out] out_page Used pages + */ +esp_err_t mmu_config_psram_rodata_segment(uint32_t start_page, uint32_t psram_size, uint32_t *out_page); +#endif //#if CONFIG_SPIRAM_RODATA + + +/*---------------------------------------------------------------------------- + Part 2 APIs (See @Backgrounds on top of this file) +-------------------------------------------------------------------------------*/ +#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS /** * @brief Init other file requested MMU variables * @@ -90,17 +112,7 @@ uint32_t instruction_flash_end_page_get(void); int instruction_flash2spiram_offset(void); #endif // #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS - #if CONFIG_SPIRAM_RODATA -/** - * @brief Copy Flash rodata to PSRAM - * - * @param[in] start_page PSRAM physical start page - * @param[in] psram_size PSRAM available size - * @param[out] out_page Used pages - */ -esp_err_t mmu_config_psram_rodata_segment(uint32_t start_page, uint32_t psram_size, uint32_t *out_page); - /** * @brief Init other file requested MMU variables * diff --git a/components/esp_psram/linker.lf b/components/esp_psram/linker.lf index eee8cda0f5..f290b41bea 100644 --- a/components/esp_psram/linker.lf +++ b/components/esp_psram/linker.lf @@ -14,4 +14,4 @@ entries: esp_psram_impl_octal (noflash) if IDF_TARGET_ESP32S2 = y || IDF_TARGET_ESP32S3 = y: - mmu_psram (noflash) + mmu_psram_flash (noflash) diff --git a/components/esp_psram/mmu.c b/components/esp_psram/mmu.c index 3953c6bc91..54509b44ae 100644 --- a/components/esp_psram/mmu.c +++ b/components/esp_psram/mmu.c @@ -20,7 +20,7 @@ #include "esp_attr.h" #include "esp_log.h" #include "soc/ext_mem_defs.h" -#include "esp_private/mmu.h" +#include "esp_private/mmu_psram_flash.h" #if CONFIG_IDF_TARGET_ESP32S2 #include "soc/extmem_reg.h" @@ -64,108 +64,3 @@ intptr_t mmu_get_psram_vaddr_end(void) return DRAM1_CACHE_ADDRESS_HIGH; #endif } - -//------------------------------------Copy Flash .text to PSRAM-------------------------------------// -#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS -static uint32_t instruction_in_spiram; -static uint32_t instr_start_page; -static uint32_t instr_end_page; -static int instr_flash2spiram_offs; - -/** - * - These logics are abstracted from the PSRAM driver - * - These functions are only required by `flash_mmap.c` for converting paddr to vaddr, and vice versa - * - The `flash_mmpa.c` will be rewritten into MMU driver - * - * Therefore, keep the APIs here for now - */ -void instruction_flash_page_info_init(uint32_t psram_start_physical_page) -{ -#if CONFIG_IDF_TARGET_ESP32S2 - uint32_t instr_page_cnt = ((uint32_t)&_instruction_reserved_end - (uint32_t)&_instruction_reserved_start + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE; - uint32_t instr_mmu_offset = ((uint32_t)&_instruction_reserved_start & MMU_VADDR_MASK) / MMU_PAGE_SIZE; - instr_start_page = ((volatile uint32_t *)(DR_REG_MMU_TABLE + PRO_CACHE_IBUS0_MMU_START))[instr_mmu_offset]; -#elif CONFIG_IDF_TARGET_ESP32S3 - uint32_t instr_page_cnt = ((uint32_t)&_instruction_reserved_end - SOC_IROM_LOW + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE; - instr_start_page = *((volatile uint32_t *)(DR_REG_MMU_TABLE + CACHE_IROM_MMU_START)); -#endif - instr_start_page &= MMU_VALID_VAL_MASK; - instr_end_page = instr_start_page + instr_page_cnt - 1; - instr_flash2spiram_offs = instr_start_page - psram_start_physical_page; - instruction_in_spiram = 1; - ESP_DRAM_LOGV("mmu_psram", "Instructions from flash page%d copy to SPIRAM page%d, Offset: %d", instr_start_page, psram_start_physical_page, instr_flash2spiram_offs); -} - -uint32_t esp_spiram_instruction_access_enabled(void) -{ - return instruction_in_spiram; -} - -int instruction_flash2spiram_offset(void) -{ - return instr_flash2spiram_offs; -} - -uint32_t instruction_flash_start_page_get(void) -{ - return instr_start_page; -} - -uint32_t instruction_flash_end_page_get(void) -{ - return instr_end_page; -} -#endif //CONFIG_SPIRAM_FETCH_INSTRUCTIONS - - -#if CONFIG_SPIRAM_RODATA -//------------------------------------Copy Flash .rodata to PSRAM-------------------------------------// -static uint32_t rodata_in_spiram; -static int rodata_flash2spiram_offs; -static uint32_t rodata_start_page; -static uint32_t rodata_end_page; - -/** - * - These logics are abstracted from the PSRAM driver - * - These functions are only required by `flash_mmap.c` for converting paddr to vaddr, and vice versa - * - The `flash_mmpa.c` will be rewritten into MMU driver - * - * Therefore, keep the APIs here for now - */ -void rodata_flash_page_info_init(uint32_t psram_start_physical_page) -{ -#if CONFIG_IDF_TARGET_ESP32S2 - uint32_t rodata_page_cnt = ((uint32_t)&_rodata_reserved_end - (uint32_t)&_rodata_reserved_start + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE; - uint32_t rodata_mmu_offset = ((uint32_t)&_rodata_reserved_start & MMU_VADDR_MASK) / MMU_PAGE_SIZE; - rodata_start_page = ((volatile uint32_t *)(DR_REG_MMU_TABLE + PRO_CACHE_IBUS2_MMU_START))[rodata_mmu_offset]; -#elif CONFIG_IDF_TARGET_ESP32S3 - uint32_t rodata_page_cnt = ((uint32_t)&_rodata_reserved_end - ((uint32_t)&_rodata_reserved_start & ~ (MMU_PAGE_SIZE - 1)) + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE; - rodata_start_page = *(volatile uint32_t *)(DR_REG_MMU_TABLE + CACHE_DROM_MMU_START); -#endif - rodata_start_page &= MMU_VALID_VAL_MASK; - rodata_end_page = rodata_start_page + rodata_page_cnt - 1; - rodata_flash2spiram_offs = rodata_start_page - psram_start_physical_page; - rodata_in_spiram = 1; - ESP_DRAM_LOGV("mmu_psram", "Rodata from flash page%d copy to SPIRAM page%d, Offset: %d", rodata_start_page, psram_start_physical_page, rodata_flash2spiram_offs); -} - -uint32_t esp_spiram_rodata_access_enabled(void) -{ - return rodata_in_spiram; -} - -int rodata_flash2spiram_offset(void) -{ - return rodata_flash2spiram_offs; -} - -uint32_t rodata_flash_start_page_get(void) -{ - return rodata_start_page; -} - -uint32_t rodata_flash_end_page_get(void) -{ - return rodata_end_page; -} -#endif //#if CONFIG_SPIRAM_RODATA diff --git a/components/esp_psram/mmu_psram.c b/components/esp_psram/mmu_psram_flash.c similarity index 50% rename from components/esp_psram/mmu_psram.c rename to components/esp_psram/mmu_psram_flash.c index 3f690bf68c..beff0fa0ac 100644 --- a/components/esp_psram/mmu_psram.c +++ b/components/esp_psram/mmu_psram_flash.c @@ -3,15 +3,17 @@ * * SPDX-License-Identifier: Apache-2.0 */ - /** - * This file will be redesigned into MMU driver, to maintain all the external - * memory contexts including: - * - Flash - * - PSRAM - * - DDR + * @Backgrounds * - * Now only MMU-PSRAM related private APIs + * This file contains 2 parts: + * 1. Feature: Copy Flash content to PSRAM. Related APIs are private: + * - mmu_config_psram_text_segment() + * - mmu_config_psram_rodata_segment() + * + * 2. Private APIs used by `flash_mmap.c` and `cache_utils.c` + * APIs in 2 are due to lack of MMU driver. There will be an MMU driver to maintain vaddr range. + * APIs in 2 will be refactored when MMU driver is ready */ #include @@ -21,7 +23,7 @@ #include "soc/ext_mem_defs.h" #include "hal/cache_types.h" #include "hal/cache_ll.h" -#include "esp_private/mmu.h" +#include "esp_private/mmu_psram_flash.h" #if CONFIG_IDF_TARGET_ESP32S2 #include "esp32s2/rom/cache.h" @@ -29,7 +31,9 @@ #include "esp32s3/rom/cache.h" #endif - +/*---------------------------------------------------------------------------- + Part 1 APIs (See @Backgrounds on top of this file) +-------------------------------------------------------------------------------*/ #if CONFIG_SPIRAM_FETCH_INSTRUCTIONS || CONFIG_SPIRAM_RODATA //page_size - 1, where page_size on s2 and s3 is always 0x10000. To be refactored by MMU driver #define INVALID_PHY_PAGE 0xffff @@ -144,3 +148,117 @@ esp_err_t mmu_config_psram_rodata_segment(uint32_t start_page, uint32_t psram_si return ESP_OK; } #endif //#if CONFIG_SPIRAM_RODATA + + +/*---------------------------------------------------------------------------- + Part 2 APIs (See @Backgrounds on top of this file) +-------------------------------------------------------------------------------*/ +extern int _instruction_reserved_start; +extern int _instruction_reserved_end; +extern int _rodata_reserved_start; +extern int _rodata_reserved_end; + +//------------------------------------Copy Flash .text to PSRAM-------------------------------------// +#if CONFIG_SPIRAM_FETCH_INSTRUCTIONS +static uint32_t instruction_in_spiram; +static uint32_t instr_start_page; +static uint32_t instr_end_page; +static int instr_flash2spiram_offs; + +/** + * - These logics are abstracted from the PSRAM driver + * - These functions are only required by `flash_mmap.c` for converting paddr to vaddr, and vice versa + * - The `flash_mmpa.c` will be rewritten into MMU driver + * + * Therefore, keep the APIs here for now + */ +void instruction_flash_page_info_init(uint32_t psram_start_physical_page) +{ +#if CONFIG_IDF_TARGET_ESP32S2 + uint32_t instr_page_cnt = ((uint32_t)&_instruction_reserved_end - (uint32_t)&_instruction_reserved_start + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE; + uint32_t instr_mmu_offset = ((uint32_t)&_instruction_reserved_start & MMU_VADDR_MASK) / MMU_PAGE_SIZE; + instr_start_page = ((volatile uint32_t *)(DR_REG_MMU_TABLE + PRO_CACHE_IBUS0_MMU_START))[instr_mmu_offset]; +#elif CONFIG_IDF_TARGET_ESP32S3 + uint32_t instr_page_cnt = ((uint32_t)&_instruction_reserved_end - SOC_IROM_LOW + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE; + instr_start_page = *((volatile uint32_t *)(DR_REG_MMU_TABLE + CACHE_IROM_MMU_START)); +#endif + instr_start_page &= MMU_VALID_VAL_MASK; + instr_end_page = instr_start_page + instr_page_cnt - 1; + instr_flash2spiram_offs = instr_start_page - psram_start_physical_page; + instruction_in_spiram = 1; + ESP_DRAM_LOGV("mmu_psram", "Instructions from flash page%d copy to SPIRAM page%d, Offset: %d", instr_start_page, psram_start_physical_page, instr_flash2spiram_offs); +} + +uint32_t esp_spiram_instruction_access_enabled(void) +{ + return instruction_in_spiram; +} + +int instruction_flash2spiram_offset(void) +{ + return instr_flash2spiram_offs; +} + +uint32_t instruction_flash_start_page_get(void) +{ + return instr_start_page; +} + +uint32_t instruction_flash_end_page_get(void) +{ + return instr_end_page; +} +#endif //CONFIG_SPIRAM_FETCH_INSTRUCTIONS + + +#if CONFIG_SPIRAM_RODATA +//------------------------------------Copy Flash .rodata to PSRAM-------------------------------------// +static uint32_t rodata_in_spiram; +static int rodata_flash2spiram_offs; +static uint32_t rodata_start_page; +static uint32_t rodata_end_page; + +/** + * - These logics are abstracted from the PSRAM driver + * - These functions are only required by `flash_mmap.c` for converting paddr to vaddr, and vice versa + * - The `flash_mmpa.c` will be rewritten into MMU driver + * + * Therefore, keep the APIs here for now + */ +void rodata_flash_page_info_init(uint32_t psram_start_physical_page) +{ +#if CONFIG_IDF_TARGET_ESP32S2 + uint32_t rodata_page_cnt = ((uint32_t)&_rodata_reserved_end - (uint32_t)&_rodata_reserved_start + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE; + uint32_t rodata_mmu_offset = ((uint32_t)&_rodata_reserved_start & MMU_VADDR_MASK) / MMU_PAGE_SIZE; + rodata_start_page = ((volatile uint32_t *)(DR_REG_MMU_TABLE + PRO_CACHE_IBUS2_MMU_START))[rodata_mmu_offset]; +#elif CONFIG_IDF_TARGET_ESP32S3 + uint32_t rodata_page_cnt = ((uint32_t)&_rodata_reserved_end - ((uint32_t)&_rodata_reserved_start & ~ (MMU_PAGE_SIZE - 1)) + MMU_PAGE_SIZE - 1) / MMU_PAGE_SIZE; + rodata_start_page = *(volatile uint32_t *)(DR_REG_MMU_TABLE + CACHE_DROM_MMU_START); +#endif + rodata_start_page &= MMU_VALID_VAL_MASK; + rodata_end_page = rodata_start_page + rodata_page_cnt - 1; + rodata_flash2spiram_offs = rodata_start_page - psram_start_physical_page; + rodata_in_spiram = 1; + ESP_DRAM_LOGV("mmu_psram", "Rodata from flash page%d copy to SPIRAM page%d, Offset: %d", rodata_start_page, psram_start_physical_page, rodata_flash2spiram_offs); +} + +uint32_t esp_spiram_rodata_access_enabled(void) +{ + return rodata_in_spiram; +} + +int rodata_flash2spiram_offset(void) +{ + return rodata_flash2spiram_offs; +} + +uint32_t rodata_flash_start_page_get(void) +{ + return rodata_start_page; +} + +uint32_t rodata_flash_end_page_get(void) +{ + return rodata_end_page; +} +#endif //#if CONFIG_SPIRAM_RODATA diff --git a/components/spi_flash/flash_mmap.c b/components/spi_flash/flash_mmap.c index fd4a5e17e5..e5ee1250bc 100644 --- a/components/spi_flash/flash_mmap.c +++ b/components/spi_flash/flash_mmap.c @@ -42,7 +42,7 @@ #if CONFIG_SPIRAM #include "esp_private/esp_psram_extram.h" -#include "esp_private/mmu.h" +#include "esp_private/mmu_psram_flash.h" #endif #ifndef NDEBUG