Merge branch 'fix/rtc_pmp_alignment_c5' into 'master'

fix(pmp): fixed alignment of PMP addr for RTC mem on C5

Closes IDF-10336

See merge request espressif/esp-idf!31900
This commit is contained in:
Marius Vikhammer 2024-07-05 07:59:46 +08:00
commit 609b44dc5d
14 changed files with 62 additions and 29 deletions

View File

@ -182,6 +182,7 @@ void esp_cpu_configure_region_protection(void)
// 5. LP memory // 5. LP memory
#if CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT && !BOOTLOADER_BUILD #if CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT && !BOOTLOADER_BUILD
extern int _rtc_text_start;
extern int _rtc_text_end; extern int _rtc_text_end;
/* Reset the corresponding PMP config because PMP_ENTRY_SET only sets the given bits /* Reset the corresponding PMP config because PMP_ENTRY_SET only sets the given bits
* Bootloader might have given extra permissions and those won't be cleared * Bootloader might have given extra permissions and those won't be cleared
@ -191,13 +192,10 @@ void esp_cpu_configure_region_protection(void)
PMP_ENTRY_CFG_RESET(13); PMP_ENTRY_CFG_RESET(13);
PMP_ENTRY_CFG_RESET(14); PMP_ENTRY_CFG_RESET(14);
PMP_ENTRY_SET(11, SOC_RTC_IRAM_LOW, NONE); PMP_ENTRY_SET(11, SOC_RTC_IRAM_LOW, NONE);
#if CONFIG_ULP_COPROC_RESERVE_MEM
// First part of LP mem is reserved for coprocessor // First part of LP mem is reserved for ULP coprocessor
PMP_ENTRY_SET(12, SOC_RTC_IRAM_LOW + CONFIG_ULP_COPROC_RESERVE_MEM, PMP_TOR | RW); PMP_ENTRY_SET(12, (int)&_rtc_text_start, PMP_TOR | RW);
#else // CONFIG_ULP_COPROC_RESERVE_MEM
// Repeat same previous entry, to ensure next entry has correct base address (TOR)
PMP_ENTRY_SET(12, SOC_RTC_IRAM_LOW, NONE);
#endif // !CONFIG_ULP_COPROC_RESERVE_MEM
PMP_ENTRY_SET(13, (int)&_rtc_text_end, PMP_TOR | RX); PMP_ENTRY_SET(13, (int)&_rtc_text_end, PMP_TOR | RX);
PMP_ENTRY_SET(14, SOC_RTC_IRAM_HIGH, PMP_TOR | RW); PMP_ENTRY_SET(14, SOC_RTC_IRAM_HIGH, PMP_TOR | RW);
#else #else

View File

@ -178,6 +178,7 @@ void esp_cpu_configure_region_protection(void)
// 6. LP memory // 6. LP memory
#if CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT && !BOOTLOADER_BUILD #if CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT && !BOOTLOADER_BUILD
extern int _rtc_text_start;
extern int _rtc_text_end; extern int _rtc_text_end;
/* Reset the corresponding PMP config because PMP_ENTRY_SET only sets the given bits /* Reset the corresponding PMP config because PMP_ENTRY_SET only sets the given bits
* Bootloader might have given extra permissions and those won't be cleared * Bootloader might have given extra permissions and those won't be cleared
@ -187,13 +188,10 @@ void esp_cpu_configure_region_protection(void)
PMP_ENTRY_CFG_RESET(13); PMP_ENTRY_CFG_RESET(13);
PMP_ENTRY_CFG_RESET(14); PMP_ENTRY_CFG_RESET(14);
PMP_ENTRY_SET(11, SOC_RTC_IRAM_LOW, NONE); PMP_ENTRY_SET(11, SOC_RTC_IRAM_LOW, NONE);
#if CONFIG_ULP_COPROC_RESERVE_MEM
// First part of LP mem is reserved for coprocessor // First part of LP mem is reserved for ULP coprocessor
PMP_ENTRY_SET(12, SOC_RTC_IRAM_LOW + CONFIG_ULP_COPROC_RESERVE_MEM, PMP_TOR | RW); PMP_ENTRY_SET(12, (int)&_rtc_text_start, PMP_TOR | RW);
#else // CONFIG_ULP_COPROC_RESERVE_MEM
// Repeat same previous entry, to ensure next entry has correct base address (TOR)
PMP_ENTRY_SET(12, SOC_RTC_IRAM_LOW, NONE);
#endif // !CONFIG_ULP_COPROC_RESERVE_MEM
PMP_ENTRY_SET(13, (int)&_rtc_text_end, PMP_TOR | RX); PMP_ENTRY_SET(13, (int)&_rtc_text_end, PMP_TOR | RX);
PMP_ENTRY_SET(14, SOC_RTC_IRAM_HIGH, PMP_TOR | RW); PMP_ENTRY_SET(14, SOC_RTC_IRAM_HIGH, PMP_TOR | RW);
#else #else

View File

@ -17,8 +17,12 @@ SECTIONS
*/ */
.rtc.text : .rtc.text :
{ {
ALIGNED_SYMBOL(4, _rtc_fast_start) /* Align the start of RTC code region as per PMP granularity
ALIGNED_SYMBOL(4, _rtc_text_start) * this ensures we do not overwrite the permissions for the previous
* region (ULP mem) regardless of its end alignment
*/
ALIGNED_SYMBOL(_esp_pmp_align_size, _rtc_fast_start)
ALIGNED_SYMBOL(_esp_pmp_align_size, _rtc_text_start)
*(.rtc.entry.text) *(.rtc.entry.text)

View File

@ -17,8 +17,12 @@ SECTIONS
*/ */
.rtc.text : .rtc.text :
{ {
ALIGNED_SYMBOL(4, _rtc_fast_start) /* Align the start of RTC code region as per PMP granularity
ALIGNED_SYMBOL(4, _rtc_text_start) * this ensures we do not overwrite the permissions for the previous
* region (ULP mem) regardless of its end alignment
*/
ALIGNED_SYMBOL(_esp_pmp_align_size, _rtc_fast_start)
ALIGNED_SYMBOL(_esp_pmp_align_size, _rtc_text_start)
*(.rtc.entry.text) *(.rtc.entry.text)
@ -27,7 +31,10 @@ SECTIONS
*rtc_wake_stub*.*(.text .text.*) *rtc_wake_stub*.*(.text .text.*)
*(.rtc_text_end_test) *(.rtc_text_end_test)
ALIGNED_SYMBOL(4, _rtc_text_end) /* Align the end of RTC code region as per PMP granularity */
. = ALIGN(_esp_pmp_align_size);
_rtc_text_end = ABSOLUTE(.);
} > lp_ram_seg } > lp_ram_seg
/** /**

View File

@ -17,8 +17,12 @@ SECTIONS
*/ */
.rtc.text : .rtc.text :
{ {
ALIGNED_SYMBOL(4, _rtc_fast_start) /* Align the start of RTC code region as per PMP granularity
ALIGNED_SYMBOL(4, _rtc_text_start) * this ensures we do not overwrite the permissions for any potential previous
* region regardless of its end alignment
*/
ALIGNED_SYMBOL(_esp_pmp_align_size, _rtc_fast_start)
ALIGNED_SYMBOL(_esp_pmp_align_size, _rtc_text_start)
*(.rtc.entry.text) *(.rtc.entry.text)
@ -27,6 +31,9 @@ SECTIONS
*rtc_wake_stub*.*(.text .text.*) *rtc_wake_stub*.*(.text .text.*)
*(.rtc_text_end_test) *(.rtc_text_end_test)
/* Align the end of RTC code region as per PMP granularity */
. = ALIGN(_esp_pmp_align_size);
_rtc_text_end = ABSOLUTE(.); _rtc_text_end = ABSOLUTE(.);
} > lp_ram_seg } > lp_ram_seg

View File

@ -17,8 +17,12 @@ SECTIONS
*/ */
.rtc.text : .rtc.text :
{ {
ALIGNED_SYMBOL(4, _rtc_fast_start) /* Align the start of RTC code region as per PMP granularity
ALIGNED_SYMBOL(4, _rtc_text_start) * this ensures we do not overwrite the permissions for any potential previous
* region regardless of its end alignment
*/
ALIGNED_SYMBOL(_esp_pmp_align_size, _rtc_fast_start)
ALIGNED_SYMBOL(_esp_pmp_align_size, _rtc_text_start)
*(.rtc.entry.text) *(.rtc.entry.text)
@ -27,7 +31,10 @@ SECTIONS
*rtc_wake_stub*.*(.text .text.*) *rtc_wake_stub*.*(.text .text.*)
*(.rtc_text_end_test) *(.rtc_text_end_test)
ALIGNED_SYMBOL(4, _rtc_text_end) /* Align the end of RTC code region as per PMP granularity */
. = ALIGN(_esp_pmp_align_size);
_rtc_text_end = ABSOLUTE(.);
} > lp_ram_seg } > lp_ram_seg
/** /**

View File

@ -419,6 +419,10 @@ config SOC_CPU_IDRAM_SPLIT_USING_PMP
bool bool
default y default y
config SOC_CPU_PMP_REGION_GRANULARITY
int
default 4
config SOC_DS_SIGNATURE_MAX_BIT_LEN config SOC_DS_SIGNATURE_MAX_BIT_LEN
int int
default 3072 default 3072

View File

@ -155,6 +155,7 @@
#define SOC_CPU_HAS_PMA 1 #define SOC_CPU_HAS_PMA 1
#define SOC_CPU_IDRAM_SPLIT_USING_PMP 1 #define SOC_CPU_IDRAM_SPLIT_USING_PMP 1
#define SOC_CPU_PMP_REGION_GRANULARITY 4
// TODO: IDF-5360 (Copy from esp32c3, need check) // TODO: IDF-5360 (Copy from esp32c3, need check)
/*-------------------------- DIGITAL SIGNATURE CAPS ----------------------------------------*/ /*-------------------------- DIGITAL SIGNATURE CAPS ----------------------------------------*/

View File

@ -135,6 +135,10 @@ config SOC_CPU_IDRAM_SPLIT_USING_PMP
bool bool
default y default y
config SOC_CPU_PMP_REGION_GRANULARITY
int
default 128
config SOC_DS_SIGNATURE_MAX_BIT_LEN config SOC_DS_SIGNATURE_MAX_BIT_LEN
int int
default 3072 default 3072

View File

@ -153,6 +153,8 @@
#define SOC_CPU_HAS_PMA 1 #define SOC_CPU_HAS_PMA 1
#define SOC_CPU_IDRAM_SPLIT_USING_PMP 1 #define SOC_CPU_IDRAM_SPLIT_USING_PMP 1
#define SOC_CPU_PMP_REGION_GRANULARITY 128 // TODO IDF-9580 check when doing PMP bringup
/*-------------------------- DIGITAL SIGNATURE CAPS ----------------------------------------*/ /*-------------------------- DIGITAL SIGNATURE CAPS ----------------------------------------*/
//TODO: [ESP32C61] IDF-9325 (Copy from esp32c6, need check) //TODO: [ESP32C61] IDF-9325 (Copy from esp32c6, need check)

View File

@ -407,6 +407,10 @@ config SOC_CPU_IDRAM_SPLIT_USING_PMP
bool bool
default y default y
config SOC_CPU_PMP_REGION_GRANULARITY
int
default 4
config SOC_MMU_PAGE_SIZE_CONFIGURABLE config SOC_MMU_PAGE_SIZE_CONFIGURABLE
bool bool
default y default y

View File

@ -152,6 +152,7 @@
#define SOC_CPU_HAS_PMA 1 #define SOC_CPU_HAS_PMA 1
#define SOC_CPU_IDRAM_SPLIT_USING_PMP 1 #define SOC_CPU_IDRAM_SPLIT_USING_PMP 1
#define SOC_CPU_PMP_REGION_GRANULARITY 4
/*-------------------------- MMU CAPS ----------------------------------------*/ /*-------------------------- MMU CAPS ----------------------------------------*/
#define SOC_MMU_PAGE_SIZE_CONFIGURABLE (1) #define SOC_MMU_PAGE_SIZE_CONFIGURABLE (1)

View File

@ -3,10 +3,6 @@
components/ulp/test_apps/lp_core: components/ulp/test_apps/lp_core:
disable: disable:
- if: SOC_LP_CORE_SUPPORTED != 1 - if: SOC_LP_CORE_SUPPORTED != 1
disable_test:
- if: IDF_TARGET == "esp32c5"
temporary: true
reason: test not pass, should be re-enable # TODO: [ESP32C5] IDF-10336
depends_components: depends_components:
- ulp - ulp

View File

@ -4,7 +4,7 @@ import pytest
from pytest_embedded import Dut from pytest_embedded import Dut
# @pytest.mark.esp32c5 # TODO: [ESP32C5] IDF-10336 @pytest.mark.esp32c5
@pytest.mark.esp32c6 @pytest.mark.esp32c6
@pytest.mark.esp32p4 @pytest.mark.esp32p4
@pytest.mark.generic @pytest.mark.generic