44//
55// SPDX-License-Identifier: MIT
66
7+ #include <stddef.h>
78#include <string.h>
89#include <stdlib.h>
910
@@ -89,8 +90,7 @@ extern uint32_t _ld_itcm_size;
8990extern uint32_t _ld_itcm_flash_copy ;
9091
9192static tlsf_t _heap = NULL ;
92- static pool_t _ram_pool = NULL ;
93- static pool_t _psram_pool = NULL ;
93+ static tlsf_t _psram_heap = NULL ;
9494static size_t _psram_size = 0 ;
9595
9696#ifdef CIRCUITPY_PSRAM_CHIP_SELECT
@@ -245,10 +245,9 @@ static void _port_heap_init(void) {
245245 uint32_t * heap_bottom = port_heap_get_bottom ();
246246 uint32_t * heap_top = port_heap_get_top ();
247247 size_t size = (heap_top - heap_bottom ) * sizeof (uint32_t );
248- _heap = tlsf_create_with_pool (heap_bottom , size , 64 * 1024 * 1024 );
249- _ram_pool = tlsf_get_pool (_heap );
248+ _heap = tlsf_create_with_pool (heap_bottom , size , size );
250249 if (_psram_size > 0 ) {
251- _psram_pool = tlsf_add_pool ( _heap , (void * )0x11000000 , _psram_size );
250+ _psram_heap = tlsf_create_with_pool ( (void * )0x11000000 , _psram_size , _psram_size );
252251 }
253252}
254253
@@ -257,15 +256,31 @@ void port_heap_init(void) {
257256}
258257
259258void * port_malloc (size_t size , bool dma_capable ) {
259+ if (!dma_capable && _psram_size > 0 ) {
260+ void * block = tlsf_malloc (_psram_heap , size );
261+ if (block ) {
262+ return block ;
263+ }
264+ }
260265 void * block = tlsf_malloc (_heap , size );
261266 return block ;
262267}
263268
264269void port_free (void * ptr ) {
265- tlsf_free (_heap , ptr );
270+ if (((size_t )ptr ) < SRAM_BASE ) {
271+ tlsf_free (_psram_heap , ptr );
272+ } else {
273+ tlsf_free (_heap , ptr );
274+ }
266275}
267276
268- void * port_realloc (void * ptr , size_t size ) {
277+ void * port_realloc (void * ptr , size_t size , bool dma_capable ) {
278+ if (_psram_size > 0 && ((ptr != NULL && ((size_t )ptr ) < SRAM_BASE ) || (ptr == NULL && !dma_capable ))) {
279+ void * block = tlsf_realloc (_psram_heap , ptr , size );
280+ if (block ) {
281+ return block ;
282+ }
283+ }
269284 return tlsf_realloc (_heap , ptr , size );
270285}
271286
@@ -279,12 +294,13 @@ static bool max_size_walker(void *ptr, size_t size, int used, void *user) {
279294
280295size_t port_heap_get_largest_free_size (void ) {
281296 size_t max_size = 0 ;
282- tlsf_walk_pool (_ram_pool , max_size_walker , & max_size );
283- if (_psram_pool != NULL ) {
284- tlsf_walk_pool (_psram_pool , max_size_walker , & max_size );
297+ tlsf_walk_pool (tlsf_get_pool (_heap ), max_size_walker , & max_size );
298+ max_size = tlsf_fit_size (_heap , max_size );
299+ if (_psram_heap != NULL ) {
300+ tlsf_walk_pool (tlsf_get_pool (_psram_heap ), max_size_walker , & max_size );
301+ max_size = tlsf_fit_size (_psram_heap , max_size );
285302 }
286- // IDF does this. Not sure why.
287- return tlsf_fit_size (_heap , max_size );
303+ return max_size ;
288304}
289305
290306safe_mode_t port_init (void ) {
0 commit comments