diff --git a/components/esp_hw_support/port/esp32/spiram.c b/components/esp_hw_support/port/esp32/spiram.c index 651aff4e12..bd4bcb0473 100644 --- a/components/esp_hw_support/port/esp32/spiram.c +++ b/components/esp_hw_support/port/esp32/spiram.c @@ -209,10 +209,11 @@ esp_err_t esp_spiram_add_to_heapalloc(void) return heap_caps_add_region(mallocable_ram_start, mallocable_ram_end); } - -static uint8_t *dma_heap; - esp_err_t esp_spiram_reserve_dma_pool(size_t size) { + if (size == 0) { + return ESP_OK; + } + ESP_EARLY_LOGI(TAG, "Reserving pool of %dK of internal memory for DMA/internal allocations", size/1024); /* Pool may be allocated in multiple non-contiguous chunks, depending on available RAM */ while (size > 0) { @@ -220,7 +221,7 @@ esp_err_t esp_spiram_reserve_dma_pool(size_t size) { next_size = MIN(next_size, size); ESP_EARLY_LOGD(TAG, "Allocating block of size %d bytes", next_size); - dma_heap = heap_caps_malloc(next_size, MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); + uint8_t *dma_heap = heap_caps_malloc(next_size, MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); if (!dma_heap || next_size == 0) { return ESP_ERR_NO_MEM; } diff --git a/components/esp_hw_support/port/esp32s2/spiram.c b/components/esp_hw_support/port/esp32s2/spiram.c index ebb2be078b..0397e9fe9e 100644 --- a/components/esp_hw_support/port/esp32s2/spiram.c +++ b/components/esp_hw_support/port/esp32s2/spiram.c @@ -331,15 +331,32 @@ esp_err_t esp_spiram_add_to_heapalloc(void) return heap_caps_add_region(map_vaddr, map_vaddr + FREE_DRAM0_DRAM1_DPORT_CACHE_SIZE -1); } -static uint8_t *dma_heap; - esp_err_t esp_spiram_reserve_dma_pool(size_t size) { - if (size==0) return ESP_OK; //no-op + if (size == 0) { + return ESP_OK; + } + ESP_EARLY_LOGI(TAG, "Reserving pool of %dK of internal memory for DMA/internal allocations", size/1024); - dma_heap=heap_caps_malloc(size, MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); - if (!dma_heap) return ESP_ERR_NO_MEM; - uint32_t caps[]={MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL, 0, MALLOC_CAP_8BIT|MALLOC_CAP_32BIT}; - return heap_caps_add_region_with_caps(caps, (intptr_t) dma_heap, (intptr_t) dma_heap+size-1); + /* Pool may be allocated in multiple non-contiguous chunks, depending on available RAM */ + while (size > 0) { + size_t next_size = heap_caps_get_largest_free_block(MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); + next_size = MIN(next_size, size); + + ESP_EARLY_LOGD(TAG, "Allocating block of size %d bytes", next_size); + + uint8_t *dma_heap = heap_caps_malloc(next_size, MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); + if (!dma_heap || next_size == 0) { + return ESP_ERR_NO_MEM; + } + + uint32_t caps[] = { 0, MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL, MALLOC_CAP_8BIT|MALLOC_CAP_32BIT }; + esp_err_t e = heap_caps_add_region_with_caps(caps, (intptr_t) dma_heap, (intptr_t) dma_heap+next_size-1); + if (e != ESP_OK) { + return e; + } + size -= next_size; + } + return ESP_OK; } size_t esp_spiram_get_size(void) diff --git a/components/esp_hw_support/port/esp32s3/spiram.c b/components/esp_hw_support/port/esp32s3/spiram.c index d0fa5f09af..0b508e9a18 100644 --- a/components/esp_hw_support/port/esp32s3/spiram.c +++ b/components/esp_hw_support/port/esp32s3/spiram.c @@ -265,21 +265,31 @@ esp_err_t esp_spiram_add_to_heapalloc(void) return heap_caps_add_region((intptr_t)SOC_EXTRAM_DATA_HIGH - spiram_size + size_for_flash, (intptr_t)SOC_EXTRAM_DATA_HIGH - 1); } - -static uint8_t *dma_heap; - -esp_err_t esp_spiram_reserve_dma_pool(size_t size) -{ +esp_err_t esp_spiram_reserve_dma_pool(size_t size) { if (size == 0) { - return ESP_OK; //no-op + return ESP_OK; } - ESP_EARLY_LOGI(TAG, "Reserving pool of %dK of internal memory for DMA/internal allocations", size / 1024); - dma_heap = heap_caps_malloc(size, MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL); - if (!dma_heap) { - return ESP_ERR_NO_MEM; + + ESP_EARLY_LOGI(TAG, "Reserving pool of %dK of internal memory for DMA/internal allocations", size/1024); + /* Pool may be allocated in multiple non-contiguous chunks, depending on available RAM */ + while (size > 0) { + size_t next_size = heap_caps_get_largest_free_block(MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); + next_size = MIN(next_size, size); + + ESP_EARLY_LOGD(TAG, "Allocating block of size %d bytes", next_size); + uint8_t *dma_heap = heap_caps_malloc(next_size, MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL); + if (!dma_heap || next_size == 0) { + return ESP_ERR_NO_MEM; + } + + uint32_t caps[] = { 0, MALLOC_CAP_DMA|MALLOC_CAP_INTERNAL, MALLOC_CAP_8BIT|MALLOC_CAP_32BIT }; + esp_err_t e = heap_caps_add_region_with_caps(caps, (intptr_t) dma_heap, (intptr_t) dma_heap+next_size-1); + if (e != ESP_OK) { + return e; + } + size -= next_size; } - uint32_t caps[] = {MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL, 0, MALLOC_CAP_8BIT | MALLOC_CAP_32BIT}; - return heap_caps_add_region_with_caps(caps, (intptr_t) dma_heap, (intptr_t) dma_heap + size - 1); + return ESP_OK; } size_t esp_spiram_get_size(void)