Skip to content

Commit 7bbfe91

Browse files
committed
fix(mmu): fixed esp_mmu_vaddr_to_paddr cannot figure out psram vaddr issue on esp32p4
1 parent e37d33c commit 7bbfe91

File tree

4 files changed

+69
-15
lines changed

4 files changed

+69
-15
lines changed

components/esp_mm/esp_mmu_map.c

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -186,13 +186,6 @@ static void s_reserve_drom_region(mem_region_t *hw_mem_regions, int region_nums)
186186
}
187187
#endif //#if CONFIG_APP_BUILD_USE_FLASH_SECTIONS
188188

189-
#if SOC_MMU_PER_EXT_MEM_TARGET
190-
FORCE_INLINE_ATTR uint32_t s_get_mmu_id_from_target(mmu_target_t target)
191-
{
192-
return (target == MMU_TARGET_FLASH0) ? MMU_LL_FLASH_MMU_ID : MMU_LL_PSRAM_MMU_ID;
193-
}
194-
#endif
195-
196189
void esp_mmu_map_init(void)
197190
{
198191
mem_region_t hw_mem_regions[SOC_MMU_LINEAR_ADDRESS_REGION_NUM] = {};
@@ -393,7 +386,7 @@ static void IRAM_ATTR NOINLINE_ATTR s_do_cache_invalidate(uint32_t vaddr_start,
393386
FORCE_INLINE_ATTR uint32_t s_mapping_operation(mmu_target_t target, uint32_t vaddr_start, esp_paddr_t paddr_start, uint32_t size)
394387
{
395388
uint32_t actual_mapped_len = 0;
396-
uint32_t mmu_id = s_get_mmu_id_from_target(target);
389+
uint32_t mmu_id = mmu_hal_get_id_from_target(target);
397390
mmu_hal_map_region(mmu_id, target, vaddr_start, paddr_start, size, &actual_mapped_len);
398391

399392
return actual_mapped_len;
@@ -599,7 +592,7 @@ esp_err_t esp_mmu_map(esp_paddr_t paddr_start, size_t size, mmu_target_t target,
599592
FORCE_INLINE_ATTR void s_unmapping_operation(uint32_t vaddr_start, uint32_t size)
600593
{
601594
mmu_target_t target = mmu_ll_vaddr_to_target(vaddr_start);
602-
uint32_t mmu_id = s_get_mmu_id_from_target(target);
595+
uint32_t mmu_id = mmu_hal_get_id_from_target(target);
603596
mmu_hal_unmap_region(mmu_id, vaddr_start, size);
604597
}
605598
#else
@@ -753,10 +746,14 @@ esp_err_t IRAM_ATTR esp_mmu_map_dump_mapped_blocks_private(void)
753746
---------------------------------------------------------------*/
754747
static bool NOINLINE_ATTR IRAM_ATTR s_vaddr_to_paddr(uint32_t vaddr, esp_paddr_t *out_paddr, mmu_target_t *out_target)
755748
{
749+
uint32_t mmu_id = 0;
756750
//we call this for now, but this will be refactored to move out of `spi_flash`
757751
spi_flash_disable_interrupts_caches_and_other_cpu();
758-
bool is_mapped = mmu_hal_vaddr_to_paddr(0, vaddr, out_paddr, out_target);
759752
#if SOC_MMU_PER_EXT_MEM_TARGET
753+
mmu_id = mmu_hal_get_id_from_vaddr(vaddr);
754+
#endif
755+
bool is_mapped = mmu_hal_vaddr_to_paddr(mmu_id, vaddr, out_paddr, out_target);
756+
#if SPIRAM_FLASH_LOAD_TO_PSRAM
760757
if (!is_mapped) {
761758
is_mapped = mmu_hal_vaddr_to_paddr(1, vaddr, out_paddr, out_target);
762759
}
@@ -789,7 +786,7 @@ static bool NOINLINE_ATTR IRAM_ATTR s_paddr_to_vaddr(esp_paddr_t paddr, mmu_targ
789786
spi_flash_disable_interrupts_caches_and_other_cpu();
790787
uint32_t mmu_id = 0;
791788
#if SOC_MMU_PER_EXT_MEM_TARGET
792-
mmu_id = s_get_mmu_id_from_target(target);
789+
mmu_id = mmu_hal_get_id_from_target(target);
793790
#endif
794791
bool found = mmu_hal_paddr_to_vaddr(mmu_id, paddr, target, type, out_vaddr);
795792
spi_flash_enable_interrupts_caches_and_other_cpu();

components/hal/esp32p4/include/hal/mmu_ll.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -84,6 +84,28 @@ static inline mmu_target_t mmu_ll_vaddr_to_target(uint32_t vaddr)
8484
return target;
8585
}
8686

87+
/**
88+
* Convert MMU virtual address to MMU ID
89+
*
90+
* @param vaddr virtual address
91+
*
92+
* @return MMU ID
93+
*/
94+
__attribute__((always_inline))
95+
static inline uint32_t mmu_ll_vaddr_to_id(uint32_t vaddr)
96+
{
97+
uint32_t id = 0;
98+
if (vaddr >= SOC_DRAM_FLASH_ADDRESS_LOW && vaddr < SOC_DRAM_FLASH_ADDRESS_HIGH) {
99+
id = MMU_LL_FLASH_MMU_ID;
100+
} else if (vaddr >= SOC_DRAM_PSRAM_ADDRESS_LOW && vaddr < SOC_DRAM_PSRAM_ADDRESS_HIGH) {
101+
id = MMU_LL_PSRAM_MMU_ID;
102+
} else {
103+
HAL_ASSERT(0);
104+
}
105+
106+
return id;
107+
}
108+
87109
__attribute__((always_inline)) static inline bool mmu_ll_cache_encryption_enabled(void)
88110
{
89111
unsigned cnt = efuse_ll_get_flash_crypt_cnt();

components/hal/include/hal/mmu_hal.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
/*
2-
* SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2010-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

77
#pragma once
88

99
#include <esp_types.h>
10+
#include "soc/soc_caps.h"
1011
#include "hal/mmu_types.h"
1112

1213
#ifdef __cplusplus
@@ -118,6 +119,28 @@ bool mmu_hal_paddr_to_vaddr(uint32_t mmu_id, uint32_t paddr, mmu_target_t target
118119
*/
119120
bool mmu_hal_check_valid_ext_vaddr_region(uint32_t mmu_id, uint32_t vaddr_start, uint32_t len, mmu_vaddr_t type);
120121

122+
#if SOC_MMU_PER_EXT_MEM_TARGET
123+
/**
124+
* Get MMU ID from MMU target
125+
*
126+
* @param target MMU target
127+
*
128+
* @return
129+
* MMU ID
130+
*/
131+
uint32_t mmu_hal_get_id_from_target(mmu_target_t target);
132+
133+
/**
134+
* Get MMU ID from vaddr
135+
*
136+
* @param vaddr Virtual address
137+
*
138+
* @return
139+
* MMU ID
140+
*/
141+
uint32_t mmu_hal_get_id_from_vaddr(uint32_t vaddr);
142+
#endif
143+
121144
#ifdef __cplusplus
122145
}
123146
#endif

components/hal/mmu_hal.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -161,3 +161,15 @@ bool mmu_hal_check_valid_ext_vaddr_region(uint32_t mmu_id, uint32_t vaddr_start,
161161
{
162162
return mmu_ll_check_valid_ext_vaddr_region(mmu_id, vaddr_start, len, type);
163163
}
164+
165+
#if SOC_MMU_PER_EXT_MEM_TARGET
166+
uint32_t mmu_hal_get_id_from_target(mmu_target_t target)
167+
{
168+
return (target == MMU_TARGET_FLASH0) ? MMU_LL_FLASH_MMU_ID : MMU_LL_PSRAM_MMU_ID;
169+
}
170+
171+
uint32_t mmu_hal_get_id_from_vaddr(uint32_t vaddr)
172+
{
173+
return mmu_ll_vaddr_to_id(vaddr);
174+
}
175+
#endif

0 commit comments

Comments
 (0)