diff --git a/components/esp32/spiram.c b/components/esp32/spiram.c index 20f9921ad2..004953741a 100644 --- a/components/esp32/spiram.c +++ b/components/esp32/spiram.c @@ -189,10 +189,11 @@ esp_err_t esp_spiram_add_to_heapalloc(void) #endif } - -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) { @@ -200,7 +201,8 @@ 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/esp32s2/spiram.c b/components/esp32s2/spiram.c index 895bda470f..1c453234b5 100644 --- a/components/esp32s2/spiram.c +++ b/components/esp32s2/spiram.c @@ -332,16 +332,32 @@ esp_err_t esp_spiram_add_to_heapalloc(void) return heap_caps_add_region(vaddr + size_for_flash, vaddr + 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)