@@ -97,6 +97,38 @@ extern int cache_dbus_mmu_set(uint32_t ext_ram, uint32_t vaddr,
97
97
uint32_t paddr , uint32_t psize ,
98
98
uint32_t num , uint32_t fixed );
99
99
100
+ /****************************************************************************
101
+ * Private Functions
102
+ ****************************************************************************/
103
+
104
+ /****************************************************************************
105
+ * Name: mmu_valid_space
106
+ *
107
+ * Description:
108
+ * Calculate MMU valid space.
109
+ *
110
+ * Input Parameters:
111
+ * start_address - Pointer to store MMU mapped start address
112
+ *
113
+ * Returned Value:
114
+ * MMU valid space size by bytes.
115
+ *
116
+ ****************************************************************************/
117
+
118
+ static inline uint32_t mmu_valid_space (uint32_t * start_address )
119
+ {
120
+ for (int i = 0 ; i < FLASH_MMU_TABLE_SIZE ; i ++ )
121
+ {
122
+ if (FLASH_MMU_TABLE [i ] & MMU_INVALID )
123
+ {
124
+ * start_address = DRAM0_CACHE_ADDRESS_LOW + i * MMU_PAGE_SIZE ;
125
+ return (FLASH_MMU_TABLE_SIZE - i ) * MMU_PAGE_SIZE ;
126
+ }
127
+ }
128
+
129
+ return 0 ;
130
+ }
131
+
100
132
/****************************************************************************
101
133
* Public Functions
102
134
****************************************************************************/
@@ -109,24 +141,32 @@ extern int cache_dbus_mmu_set(uint32_t ext_ram, uint32_t vaddr,
109
141
void IRAM_ATTR esp_spiram_init_cache (void )
110
142
{
111
143
uint32_t regval ;
112
- int ret = psram_get_available_size (& g_mapped_size );
144
+ uint32_t psram_size ;
145
+ uint32_t mapped_vaddr_size ;
113
146
147
+ int ret = psram_get_available_size (& psram_size );
114
148
if (ret != OK )
115
149
{
116
150
abort ();
117
151
}
118
152
119
- merr ( "Mapped size = %d\n" , g_mapped_size );
153
+ minfo ( "PSRAM available size = %d\n" , psram_size );
120
154
121
- if ((SOC_EXTRAM_DATA_HIGH - SOC_EXTRAM_DATA_LOW ) < g_mapped_size )
155
+ mapped_vaddr_size = mmu_valid_space (& g_mapped_vaddr_start );
156
+ minfo ("Virtual address size = %d\n" , mapped_vaddr_size );
157
+
158
+ if (mapped_vaddr_size < psram_size )
122
159
{
123
160
/* Decide these logics when there's a real PSRAM with larger size */
124
161
125
- merr ("Virtual address not enough for PSRAM!" );
126
- abort ();
162
+ g_mapped_size = mapped_vaddr_size ;
163
+ mwarn ("Virtual address not enough for PSRAM, only %d size is mapped!" ,
164
+ g_mapped_size );
165
+ }
166
+ else
167
+ {
168
+ g_mapped_size = psram_size ;
127
169
}
128
-
129
- g_mapped_vaddr_start = SOC_EXTRAM_DATA_HIGH - g_mapped_size ;
130
170
131
171
/* Suspend DRAM Case during configuration */
132
172
@@ -150,7 +190,7 @@ void IRAM_ATTR esp_spiram_init_cache(void)
150
190
/* Currently no non-heap stuff on ESP32S3 */
151
191
152
192
g_allocable_vaddr_start = g_mapped_vaddr_start ;
153
- g_allocable_vaddr_end = SOC_EXTRAM_DATA_HIGH ;
193
+ g_allocable_vaddr_end = g_mapped_vaddr_start + g_mapped_size ;
154
194
}
155
195
156
196
/* Simple RAM test. Writes a word every 32 bytes. Takes about a second
0 commit comments