mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
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.
This commit is contained in:
parent
b87bf29537
commit
dc5cab7730
@ -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"
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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
|
||||
*
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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 <sys/param.h>
|
||||
@ -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
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user