From a257b3f20ec6e8f6292beab5e10f5c4292d671b8 Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Thu, 9 Sep 2021 17:59:54 +0800 Subject: [PATCH 1/3] cavs: memory: make full use of HPSRAM Make size of the buffer zone calculated at the linking stage, to make full use of all HPSRAM memories. Signed-off-by: Keyon Jie --- src/platform/apollolake/apollolake.x.in | 33 ++++++++++-------- .../apollolake/include/platform/lib/memory.h | 7 ++-- src/platform/cannonlake/cannonlake.x.in | 34 +++++++++++-------- .../cannonlake/include/platform/lib/memory.h | 5 +-- src/platform/icelake/icelake.x.in | 34 +++++++++++-------- .../icelake/include/platform/lib/memory.h | 5 +-- src/platform/intel/cavs/lib/memory.c | 25 +++++++++++--- .../suecreek/include/platform/lib/memory.h | 5 +-- src/platform/suecreek/suecreek.x.in | 34 +++++++++++-------- .../tigerlake/include/platform/lib/memory.h | 5 +-- src/platform/tigerlake/tigerlake.x.in | 34 +++++++++++-------- 11 files changed, 130 insertions(+), 91 deletions(-) diff --git a/src/platform/apollolake/apollolake.x.in b/src/platform/apollolake/apollolake.x.in index df0996a57780..31b09a70392f 100644 --- a/src/platform/apollolake/apollolake.x.in +++ b/src/platform/apollolake/apollolake.x.in @@ -486,16 +486,6 @@ SECTIONS *(.gnu.linkonce.b.*) *(COMMON) - . = ALIGN (HEAP_BUF_ALIGNMENT); - _runtime_heap_start = ABSOLUTE(.); - . = . + HEAP_RUNTIME_SIZE; - _runtime_heap_end = ABSOLUTE(.); - - . = ALIGN (HEAP_BUF_ALIGNMENT); - _buffer_heap_start = ABSOLUTE(.); - . = . + HEAP_BUFFER_SIZE; - _buffer_heap_end = ABSOLUTE(.); - . = ALIGN (HEAP_BUF_ALIGNMENT); _system_heap_start = ABSOLUTE(.); . = . + HEAP_SYSTEM_M_SIZE; @@ -506,6 +496,12 @@ SECTIONS . = . + HEAP_SYS_RUNTIME_M_SIZE; _system_runtime_heap_end = ABSOLUTE(.); + . = ALIGN (4096); + _sof_stack_start = ABSOLUTE(.); + . = . + SOF_STACK_SIZE; + _sof_stack_end = ABSOLUTE(.); + +#if CONFIG_CORE_COUNT > 1 . = ALIGN (PLATFORM_DCACHE_ALIGN); _runtime_shared_heap_start = ABSOLUTE(.); . = . + HEAP_RUNTIME_SHARED_SIZE; @@ -518,15 +514,20 @@ SECTIONS . = ALIGN (PLATFORM_DCACHE_ALIGN); _system_shared_heap_end = ABSOLUTE(.); - . = ALIGN (4096); - _sof_stack_start = ABSOLUTE(.); - . = . + SOF_STACK_SIZE; - _sof_stack_end = ABSOLUTE(.); - . = ALIGN (HEAP_BUF_ALIGNMENT); _sof_core_s_start = ABSOLUTE(.); . = . + SOF_CORE_S_T_SIZE; _sof_core_s_end = ABSOLUTE(.); +#endif + + _runtime_heap_start = ABSOLUTE(.); + . = . + HEAP_RUNTIME_SIZE; + _runtime_heap_end = ABSOLUTE(.); + + . = ALIGN (PLATFORM_DCACHE_ALIGN); + _buffer_heap_start = ABSOLUTE(.); + . = . + SOF_FW_END - _buffer_heap_start; + _buffer_heap_end = ABSOLUTE(.); _bss_end = ABSOLUTE(.); } >sof_fw :sof_fw_phdr @@ -546,9 +547,11 @@ SECTIONS /* system runtime heap */ _system_runtime_heap = _system_runtime_heap_start; +#if CONFIG_CORE_COUNT > 1 /* Shared Heap */ _runtime_shared_heap = _runtime_shared_heap_start; _system_shared_heap = _system_shared_heap_start; +#endif /* module heap */ _module_heap = _runtime_heap_start; diff --git a/src/platform/apollolake/include/platform/lib/memory.h b/src/platform/apollolake/include/platform/lib/memory.h index 2d3b38483388..953049b7c98c 100644 --- a/src/platform/apollolake/include/platform/lib/memory.h +++ b/src/platform/apollolake/include/platform/lib/memory.h @@ -249,6 +249,9 @@ /* max size for all var-size sections (text/rodata/bss) */ #define SOF_FW_MAX_SIZE (HP_SRAM_BASE + HP_SRAM_SIZE - SOF_FW_BASE) +/* TODO: the last 4KB is not usable with QEMU, need to debug it. */ +#define SOF_FW_END (HP_SRAM_BASE + HP_SRAM_SIZE - 0x1000) + #define SOF_TEXT_START (SOF_FW_START) #define SOF_TEXT_BASE (SOF_FW_START) @@ -305,10 +308,8 @@ /* Heap section sizes for system shared heap */ #define HEAP_SYSTEM_SHARED_SIZE 0x1500 -#define HEAP_BUFFER_SIZE 0x10000 - #define HEAP_BUFFER_BLOCK_SIZE 0x100 -#define HEAP_BUFFER_COUNT (HEAP_BUFFER_SIZE / HEAP_BUFFER_BLOCK_SIZE) +#define HEAP_BUFFER_COUNT_MAX (HP_SRAM_SIZE / HEAP_BUFFER_BLOCK_SIZE) #define HEAP_SYSTEM_M_SIZE 0x4000 /* heap primary core size */ #define HEAP_SYSTEM_S_SIZE 0x3000 /* heap secondary core size */ diff --git a/src/platform/cannonlake/cannonlake.x.in b/src/platform/cannonlake/cannonlake.x.in index c8e60388ec15..176c03f3cb11 100644 --- a/src/platform/cannonlake/cannonlake.x.in +++ b/src/platform/cannonlake/cannonlake.x.in @@ -451,16 +451,6 @@ SECTIONS *(.gnu.linkonce.b.*) *(COMMON) - . = ALIGN (SRAM_BANK_SIZE); - _runtime_heap_start = ABSOLUTE(.); - . = . + HEAP_RUNTIME_SIZE; - _runtime_heap_end = ABSOLUTE(.); - - . = ALIGN (HEAP_BUF_ALIGNMENT); - _buffer_heap_start = ABSOLUTE(.); - . = . + HEAP_BUFFER_SIZE; - _buffer_heap_end = ABSOLUTE(.); - . = ALIGN (SRAM_BANK_SIZE); _system_heap_start = ABSOLUTE(.); . = . + HEAP_SYSTEM_M_SIZE; @@ -471,6 +461,12 @@ SECTIONS . = . + HEAP_SYS_RUNTIME_M_SIZE; _system_runtime_heap_end = ABSOLUTE(.); + . = ALIGN (4096); + _sof_stack_start = ABSOLUTE(.); + . = . + SOF_STACK_SIZE; + _sof_stack_end = ABSOLUTE(.); + +#if CONFIG_CORE_COUNT > 1 . = ALIGN (PLATFORM_DCACHE_ALIGN); _runtime_shared_heap_start = ABSOLUTE(.); . = . + HEAP_RUNTIME_SHARED_SIZE; @@ -483,15 +479,21 @@ SECTIONS . = ALIGN (PLATFORM_DCACHE_ALIGN); _system_shared_heap_end = ABSOLUTE(.); - . = ALIGN (4096); - _sof_stack_start = ABSOLUTE(.); - . = . + SOF_STACK_SIZE; - _sof_stack_end = ABSOLUTE(.); - . = ALIGN (SRAM_BANK_SIZE); _sof_core_s_start = ABSOLUTE(.); . = . + SOF_CORE_S_T_SIZE; _sof_core_s_end = ABSOLUTE(.); +#endif + + . = ALIGN (SRAM_BANK_SIZE); + _runtime_heap_start = ABSOLUTE(.); + . = . + HEAP_RUNTIME_SIZE; + _runtime_heap_end = ABSOLUTE(.); + + . = ALIGN (HEAP_BUF_ALIGNMENT); + _buffer_heap_start = ABSOLUTE(.); + . = . + SOF_FW_END - _buffer_heap_start; + _buffer_heap_end = ABSOLUTE(.); _bss_end = ABSOLUTE(.); } >sof_fw :sof_fw_phdr @@ -511,9 +513,11 @@ SECTIONS /* system runtime heap */ _system_runtime_heap = _system_runtime_heap_start; +#if CONFIG_CORE_COUNT > 1 /* Shared Heap */ _runtime_shared_heap = _runtime_shared_heap_start; _system_shared_heap = _system_shared_heap_start; +#endif /* module heap */ _module_heap = _runtime_heap_start; diff --git a/src/platform/cannonlake/include/platform/lib/memory.h b/src/platform/cannonlake/include/platform/lib/memory.h index 346857017bb2..a20e1e3dd9e0 100644 --- a/src/platform/cannonlake/include/platform/lib/memory.h +++ b/src/platform/cannonlake/include/platform/lib/memory.h @@ -230,6 +230,8 @@ /* max size for all var-size sections (text/rodata/bss) */ #define SOF_FW_MAX_SIZE (HP_SRAM_BASE + HP_SRAM_SIZE - SOF_FW_BASE) +#define SOF_FW_END (HP_SRAM_BASE + HP_SRAM_SIZE) + #define SOF_TEXT_START (SOF_FW_START) #define SOF_TEXT_BASE (SOF_FW_START) @@ -291,9 +293,8 @@ /* Heap section sizes for system shared heap */ #define HEAP_SYSTEM_SHARED_SIZE 0x1500 -#define HEAP_BUFFER_SIZE 0x50000 #define HEAP_BUFFER_BLOCK_SIZE 0x100 -#define HEAP_BUFFER_COUNT (HEAP_BUFFER_SIZE / HEAP_BUFFER_BLOCK_SIZE) +#define HEAP_BUFFER_COUNT_MAX (HP_SRAM_SIZE / HEAP_BUFFER_BLOCK_SIZE) #define HEAP_SYSTEM_M_SIZE 0x8000 /* heap primary core size */ #define HEAP_SYSTEM_S_SIZE 0x6000 /* heap secondary core size */ diff --git a/src/platform/icelake/icelake.x.in b/src/platform/icelake/icelake.x.in index 96874660b360..d1711941a2d6 100644 --- a/src/platform/icelake/icelake.x.in +++ b/src/platform/icelake/icelake.x.in @@ -455,16 +455,6 @@ SECTIONS *(.gnu.linkonce.b.*) *(COMMON) - . = ALIGN (SRAM_BANK_SIZE); - _runtime_heap_start = ABSOLUTE(.); - . = . + HEAP_RUNTIME_SIZE; - _runtime_heap_end = ABSOLUTE(.); - - . = ALIGN (HEAP_BUF_ALIGNMENT); - _buffer_heap_start = ABSOLUTE(.); - . = . + HEAP_BUFFER_SIZE; - _buffer_heap_end = ABSOLUTE(.); - . = ALIGN (SRAM_BANK_SIZE); _system_heap_start = ABSOLUTE(.); . = . + HEAP_SYSTEM_M_SIZE; @@ -475,6 +465,12 @@ SECTIONS . = . + HEAP_SYS_RUNTIME_M_SIZE; _system_runtime_heap_end = ABSOLUTE(.); + . = ALIGN (4096); + _sof_stack_start = ABSOLUTE(.); + . = . + SOF_STACK_SIZE; + _sof_stack_end = ABSOLUTE(.); + +#if CONFIG_CORE_COUNT > 1 . = ALIGN (PLATFORM_DCACHE_ALIGN); _runtime_shared_heap_start = ABSOLUTE(.); . = . + HEAP_RUNTIME_SHARED_SIZE; @@ -487,15 +483,21 @@ SECTIONS . = ALIGN (PLATFORM_DCACHE_ALIGN); _system_shared_heap_end = ABSOLUTE(.); - . = ALIGN (4096); - _sof_stack_start = ABSOLUTE(.); - . = . + SOF_STACK_SIZE; - _sof_stack_end = ABSOLUTE(.); - . = ALIGN (SRAM_BANK_SIZE); _sof_core_s_start = ABSOLUTE(.); . = . + SOF_CORE_S_T_SIZE; _sof_core_s_end = ABSOLUTE(.); +#endif + + . = ALIGN (SRAM_BANK_SIZE); + _runtime_heap_start = ABSOLUTE(.); + . = . + HEAP_RUNTIME_SIZE; + _runtime_heap_end = ABSOLUTE(.); + + . = ALIGN (HEAP_BUF_ALIGNMENT); + _buffer_heap_start = ABSOLUTE(.); + . = . + SOF_FW_END - _buffer_heap_start; + _buffer_heap_end = ABSOLUTE(.); _bss_end = ABSOLUTE(.); } >sof_fw :sof_fw_phdr @@ -515,9 +517,11 @@ SECTIONS /* system runtime heap */ _system_runtime_heap = _system_runtime_heap_start; +#if CONFIG_CORE_COUNT > 1 /* Shared Heap */ _runtime_shared_heap = _runtime_shared_heap_start; _system_shared_heap = _system_shared_heap_start; +#endif /* module heap */ _module_heap = _runtime_heap_start; diff --git a/src/platform/icelake/include/platform/lib/memory.h b/src/platform/icelake/include/platform/lib/memory.h index 86135b2cdda2..bbcb49643a7b 100644 --- a/src/platform/icelake/include/platform/lib/memory.h +++ b/src/platform/icelake/include/platform/lib/memory.h @@ -227,6 +227,8 @@ /* max size for all var-size sections (text/rodata/bss) */ #define SOF_FW_MAX_SIZE (HP_SRAM_BASE + HP_SRAM_SIZE - SOF_FW_BASE) +#define SOF_FW_END (HP_SRAM_BASE + HP_SRAM_SIZE) + #define SOF_TEXT_START (SOF_FW_START) #define SOF_TEXT_BASE (SOF_FW_START) @@ -288,9 +290,8 @@ /* Heap section sizes for system shared heap */ #define HEAP_SYSTEM_SHARED_SIZE 0x1500 -#define HEAP_BUFFER_SIZE 0x50000 #define HEAP_BUFFER_BLOCK_SIZE 0x100 -#define HEAP_BUFFER_COUNT (HEAP_BUFFER_SIZE / HEAP_BUFFER_BLOCK_SIZE) +#define HEAP_BUFFER_COUNT_MAX (HP_SRAM_SIZE / HEAP_BUFFER_BLOCK_SIZE) #define HEAP_SYSTEM_M_SIZE 0x8000 /* heap primary core size */ #define HEAP_SYSTEM_S_SIZE 0x6000 /* heap secondary core size */ diff --git a/src/platform/intel/cavs/lib/memory.c b/src/platform/intel/cavs/lib/memory.c index aa2a5c60ffc9..7ebcb3684299 100644 --- a/src/platform/intel/cavs/lib/memory.c +++ b/src/platform/intel/cavs/lib/memory.c @@ -112,12 +112,12 @@ static SHARED_DATA struct block_map rt_shared_heap_map[] = { #endif /* Heap blocks for buffers */ -static SHARED_DATA struct block_hdr buf_block[HEAP_BUFFER_COUNT]; +static SHARED_DATA struct block_hdr buf_block[HEAP_BUFFER_COUNT_MAX]; static SHARED_DATA struct block_hdr lp_buf_block[HEAP_LP_BUFFER_COUNT]; /* Heap memory map for buffers */ static SHARED_DATA struct block_map buf_heap_map[] = { - BLOCK_DEF(HEAP_BUFFER_BLOCK_SIZE, HEAP_BUFFER_COUNT, + BLOCK_DEF(HEAP_BUFFER_BLOCK_SIZE, HEAP_BUFFER_COUNT_MAX, uncached_block_hdr(buf_block)), }; @@ -130,8 +130,21 @@ static SHARED_DATA struct mm memmap; void platform_init_memmap(struct sof *sof) { + uint32_t heap_buffer_size = SOF_FW_END - (uint32_t)&_buffer_heap; + uint32_t buffer_count; int i; + /* calculate the buffer heap size */ + buffer_count = heap_buffer_size / HEAP_BUFFER_BLOCK_SIZE; + heap_buffer_size = buffer_count * HEAP_BUFFER_BLOCK_SIZE; + + for (i = 0; i < ARRAY_SIZE(buf_heap_map); i++) { + buf_heap_map[i].count = buffer_count; + buf_heap_map[i].free_count = buffer_count; + } + dcache_writeback_region(buf_heap_map, + sizeof(struct block_map) * ARRAY_SIZE(buf_heap_map)); + /* access memory map through uncached region */ sof->memory_map = cache_to_uncache(&memmap); @@ -216,11 +229,12 @@ void platform_init_memmap(struct sof *sof) sof->memory_map->buffer[0].blocks = ARRAY_SIZE(buf_heap_map); sof->memory_map->buffer[0].map = uncached_block_map(buf_heap_map); sof->memory_map->buffer[0].heap = (uintptr_t)&_buffer_heap; - sof->memory_map->buffer[0].size = HEAP_BUFFER_SIZE; - sof->memory_map->buffer[0].info.free = HEAP_BUFFER_SIZE; + sof->memory_map->buffer[0].size = heap_buffer_size; + sof->memory_map->buffer[0].info.free = heap_buffer_size; sof->memory_map->buffer[0].caps = SOF_MEM_CAPS_RAM | SOF_MEM_CAPS_HP | SOF_MEM_CAPS_CACHE | SOF_MEM_CAPS_DMA; +#if PLATFORM_HEAP_BUFFER >= 2 /* heap lp buffer init */ sof->memory_map->buffer[1].blocks = ARRAY_SIZE(lp_buf_heap_map); sof->memory_map->buffer[1].map = uncached_block_map(lp_buf_heap_map); @@ -229,10 +243,11 @@ void platform_init_memmap(struct sof *sof) sof->memory_map->buffer[1].info.free = HEAP_LP_BUFFER_SIZE; sof->memory_map->buffer[1].caps = SOF_MEM_CAPS_RAM | SOF_MEM_CAPS_LP | SOF_MEM_CAPS_CACHE | SOF_MEM_CAPS_DMA; +#endif /* .total init */ sof->memory_map->total.free = HEAP_SYSTEM_T_SIZE + - HEAP_SYS_RUNTIME_T_SIZE + HEAP_RUNTIME_SIZE + HEAP_BUFFER_SIZE + + HEAP_SYS_RUNTIME_T_SIZE + HEAP_RUNTIME_SIZE + heap_buffer_size + HEAP_LP_BUFFER_SIZE; } diff --git a/src/platform/suecreek/include/platform/lib/memory.h b/src/platform/suecreek/include/platform/lib/memory.h index c056e8a22851..8999057b587b 100644 --- a/src/platform/suecreek/include/platform/lib/memory.h +++ b/src/platform/suecreek/include/platform/lib/memory.h @@ -236,6 +236,8 @@ /* max size for all var-size sections (text/rodata/bss) */ #define SOF_FW_MAX_SIZE (HP_SRAM_BASE + HP_SRAM_SIZE - SOF_FW_BASE) +#define SOF_FW_END (HP_SRAM_BASE + HP_SRAM_SIZE) + /* Heap section sizes for system runtime heap for core */ #define HEAP_SYS_RT_0_COUNT64 64 #define HEAP_SYS_RT_0_COUNT512 16 @@ -277,9 +279,8 @@ /* Heap section sizes for system shared heap */ #define HEAP_SYSTEM_SHARED_SIZE 0x1500 -#define HEAP_BUFFER_SIZE 0x10000 #define HEAP_BUFFER_BLOCK_SIZE 0x100 -#define HEAP_BUFFER_COUNT (HEAP_BUFFER_SIZE / HEAP_BUFFER_BLOCK_SIZE) +#define HEAP_BUFFER_COUNT_MAX (HP_SRAM_SIZE / HEAP_BUFFER_BLOCK_SIZE) #define HEAP_SYSTEM_M_SIZE 0x8000 /* heap core size */ #define HEAP_SYSTEM_S_SIZE 0x6000 /* heap secondary core size */ diff --git a/src/platform/suecreek/suecreek.x.in b/src/platform/suecreek/suecreek.x.in index 8ce69243549c..858fab86f79e 100644 --- a/src/platform/suecreek/suecreek.x.in +++ b/src/platform/suecreek/suecreek.x.in @@ -453,16 +453,6 @@ SECTIONS *(.gnu.linkonce.b.*) *(COMMON) - . = ALIGN (SRAM_BANK_SIZE); - _runtime_heap_start = ABSOLUTE(.); - . = . + HEAP_RUNTIME_SIZE; - _runtime_heap_end = ABSOLUTE(.); - - . = ALIGN (HEAP_BUF_ALIGNMENT); - _buffer_heap_start = ABSOLUTE(.); - . = . + HEAP_BUFFER_SIZE; - _buffer_heap_end = ABSOLUTE(.); - . = ALIGN (SRAM_BANK_SIZE); _system_heap_start = ABSOLUTE(.); . = . + HEAP_SYSTEM_M_SIZE; @@ -473,6 +463,12 @@ SECTIONS . = . + HEAP_SYS_RUNTIME_M_SIZE; _system_runtime_heap_end = ABSOLUTE(.); + . = ALIGN (4096); + _sof_stack_start = ABSOLUTE(.); + . = . + SOF_STACK_SIZE; + _sof_stack_end = ABSOLUTE(.); + +#if CONFIG_CORE_COUNT > 1 . = ALIGN (PLATFORM_DCACHE_ALIGN); _runtime_shared_heap_start = ABSOLUTE(.); . = . + HEAP_RUNTIME_SHARED_SIZE; @@ -485,15 +481,21 @@ SECTIONS . = ALIGN (PLATFORM_DCACHE_ALIGN); _system_shared_heap_end = ABSOLUTE(.); - . = ALIGN (4096); - _sof_stack_start = ABSOLUTE(.); - . = . + SOF_STACK_SIZE; - _sof_stack_end = ABSOLUTE(.); - . = ALIGN (SRAM_BANK_SIZE); _sof_core_s_start = ABSOLUTE(.); . = . + SOF_CORE_S_T_SIZE; _sof_core_s_end = ABSOLUTE(.); +#endif + + . = ALIGN (SRAM_BANK_SIZE); + _runtime_heap_start = ABSOLUTE(.); + . = . + HEAP_RUNTIME_SIZE; + _runtime_heap_end = ABSOLUTE(.); + + . = ALIGN (HEAP_BUF_ALIGNMENT); + _buffer_heap_start = ABSOLUTE(.); + . = . + SOF_FW_END - _buffer_heap_start; + _buffer_heap_end = ABSOLUTE(.); _bss_end = ABSOLUTE(.); } >sof_fw :sof_fw_phdr @@ -513,9 +515,11 @@ SECTIONS /* system runtime heap */ _system_runtime_heap = _system_runtime_heap_start; +#if CONFIG_CORE_COUNT > 1 /* Shared Heap */ _runtime_shared_heap = _runtime_shared_heap_start; _system_shared_heap = _system_shared_heap_start; +#endif /* module heap */ _module_heap = _runtime_heap_start; diff --git a/src/platform/tigerlake/include/platform/lib/memory.h b/src/platform/tigerlake/include/platform/lib/memory.h index a64f0cf63f2e..80206d2d2264 100644 --- a/src/platform/tigerlake/include/platform/lib/memory.h +++ b/src/platform/tigerlake/include/platform/lib/memory.h @@ -236,6 +236,8 @@ /* max size for all var-size sections (text/rodata/bss) */ #define SOF_FW_MAX_SIZE (HP_SRAM_BASE + HP_SRAM_SIZE - SOF_FW_BASE) +#define SOF_FW_END (HP_SRAM_BASE + HP_SRAM_SIZE) + #define SOF_TEXT_START (SOF_FW_START) #define SOF_TEXT_BASE (SOF_FW_START) @@ -302,9 +304,8 @@ /* Heap section sizes for system shared heap */ #define HEAP_SYSTEM_SHARED_SIZE 0x1500 -#define HEAP_BUFFER_SIZE 0x80000 #define HEAP_BUFFER_BLOCK_SIZE 0x100 -#define HEAP_BUFFER_COUNT (HEAP_BUFFER_SIZE / HEAP_BUFFER_BLOCK_SIZE) +#define HEAP_BUFFER_COUNT_MAX (HP_SRAM_SIZE / HEAP_BUFFER_BLOCK_SIZE) #define HEAP_SYSTEM_M_SIZE 0x8000 /* heap primary core size */ #define HEAP_SYSTEM_S_SIZE 0x6000 /* heap secondary core size */ diff --git a/src/platform/tigerlake/tigerlake.x.in b/src/platform/tigerlake/tigerlake.x.in index 0317b5d51132..1df42426d40f 100644 --- a/src/platform/tigerlake/tigerlake.x.in +++ b/src/platform/tigerlake/tigerlake.x.in @@ -529,16 +529,6 @@ SECTIONS *(.gnu.linkonce.b.*) *(COMMON) - . = ALIGN (SRAM_BANK_SIZE); - _runtime_heap_start = ABSOLUTE(.); - . = . + HEAP_RUNTIME_SIZE; - _runtime_heap_end = ABSOLUTE(.); - - . = ALIGN (HEAP_BUF_ALIGNMENT); - _buffer_heap_start = ABSOLUTE(.); - . = . + HEAP_BUFFER_SIZE; - _buffer_heap_end = ABSOLUTE(.); - . = ALIGN (SRAM_BANK_SIZE); _system_heap_start = ABSOLUTE(.); . = . + HEAP_SYSTEM_M_SIZE; @@ -549,6 +539,12 @@ SECTIONS . = . + HEAP_SYS_RUNTIME_M_SIZE; _system_runtime_heap_end = ABSOLUTE(.); + . = ALIGN (4096); + _sof_stack_start = ABSOLUTE(.); + . = . + SOF_STACK_SIZE; + _sof_stack_end = ABSOLUTE(.); + +#if CONFIG_CORE_COUNT > 1 . = ALIGN (PLATFORM_DCACHE_ALIGN); _runtime_shared_heap_start = ABSOLUTE(.); . = . + HEAP_RUNTIME_SHARED_SIZE; @@ -561,15 +557,21 @@ SECTIONS . = ALIGN (PLATFORM_DCACHE_ALIGN); _system_shared_heap_end = ABSOLUTE(.); - . = ALIGN (4096); - _sof_stack_start = ABSOLUTE(.); - . = . + SOF_STACK_SIZE; - _sof_stack_end = ABSOLUTE(.); - . = ALIGN (SRAM_BANK_SIZE); _sof_core_s_start = ABSOLUTE(.); . = . + SOF_CORE_S_T_SIZE; _sof_core_s_end = ABSOLUTE(.); +#endif + + . = ALIGN (SRAM_BANK_SIZE); + _runtime_heap_start = ABSOLUTE(.); + . = . + HEAP_RUNTIME_SIZE; + _runtime_heap_end = ABSOLUTE(.); + + . = ALIGN (HEAP_BUF_ALIGNMENT); + _buffer_heap_start = ABSOLUTE(.); + . = . + SOF_FW_END - _buffer_heap_start; + _buffer_heap_end = ABSOLUTE(.); _bss_end = ABSOLUTE(.); } >sof_fw :sof_fw_phdr @@ -589,9 +591,11 @@ SECTIONS /* system runtime heap */ _system_runtime_heap = _system_runtime_heap_start; +#if CONFIG_CORE_COUNT > 1 /* Shared Heap */ _runtime_shared_heap = _runtime_shared_heap_start; _system_shared_heap = _system_shared_heap_start; +#endif /* module heap */ _module_heap = _runtime_heap_start; From e7ff8a708062f614951dbd9fcb2ee3778578f803 Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Fri, 3 Sep 2021 12:35:34 +0800 Subject: [PATCH 2/3] cmocka: align to the new heap management Align to the new heap memory map and allocator, smaller SYSTEM and RUNTIME zones are used on apollolake now. Signed-off-by: Keyon Jie --- .../library/include/platform/lib/memory.h | 37 ++++++++++--------- test/cmocka/include/mock_memory.h | 14 +++---- test/cmocka/memory_mock.x.in | 4 +- test/cmocka/src/common_mocks.c | 2 +- test/cmocka/src/lib/alloc/alloc.c | 8 ---- 5 files changed, 29 insertions(+), 36 deletions(-) diff --git a/src/platform/library/include/platform/lib/memory.h b/src/platform/library/include/platform/lib/memory.h index 60963682604d..c81d44d99e26 100644 --- a/src/platform/library/include/platform/lib/memory.h +++ b/src/platform/library/include/platform/lib/memory.h @@ -17,7 +17,6 @@ struct sof; #define PLATFORM_DCACHE_ALIGN sizeof(void *) -#define HEAP_BUFFER_SIZE (1024 * 128) #define SOF_STACK_SIZE 0x1000 uint8_t *get_library_mailbox(void); @@ -66,10 +65,12 @@ static inline uint32_t arch_get_stack_size(void) #define SRAM_BANK_SIZE 0x10000 #define LP_SRAM_SIZE SRAM_BANK_SIZE -#define HP_SRAM_SIZE SRAM_BANK_SIZE +#define HP_SRAM_SIZE (SRAM_BANK_SIZE * 47) -#define HP_SRAM_BASE 0 -#define LP_SRAM_BASE 0 +#define HP_SRAM_BASE 0xBE000000 +#define LP_SRAM_BASE 0xBE800000 + +#define SOF_FW_END (HP_SRAM_BASE + HP_SRAM_SIZE) /* Heap section sizes for system runtime heap for primary core */ #define HEAP_SYS_RT_0_COUNT64 128 @@ -82,20 +83,20 @@ static inline uint32_t arch_get_stack_size(void) #define HEAP_SYS_RT_X_COUNT1024 4 /* Heap section sizes for module pool */ -#define HEAP_RT_COUNT64 128 -#define HEAP_RT_COUNT128 64 -#define HEAP_RT_COUNT256 128 -#define HEAP_RT_COUNT512 8 -#define HEAP_RT_COUNT1024 4 -#define HEAP_RT_COUNT2048 1 -#define HEAP_RT_COUNT4096 1 +#define HEAP_COUNT64 128 +#define HEAP_COUNT128 64 +#define HEAP_COUNT256 128 +#define HEAP_COUNT512 8 +#define HEAP_COUNT1024 4 +#define HEAP_COUNT2048 1 +#define HEAP_COUNT4096 1 /* Heap configuration */ #define HEAP_RUNTIME_SIZE \ - (HEAP_RT_COUNT64 * 64 + HEAP_RT_COUNT128 * 128 + \ - HEAP_RT_COUNT256 * 256 + HEAP_RT_COUNT512 * 512 + \ - HEAP_RT_COUNT1024 * 1024 + HEAP_RT_COUNT2048 * 2048 + \ - HEAP_RT_COUNT4096 * 4096) + (HEAP_COUNT64 * 64 + HEAP_COUNT128 * 128 + \ + HEAP_COUNT256 * 256 + HEAP_COUNT512 * 512 + \ + HEAP_COUNT1024 * 1024 + HEAP_COUNT2048 * 2048 + \ + HEAP_COUNT4096 * 4096) /* Heap section sizes for runtime shared heap */ #define HEAP_RUNTIME_SHARED_COUNT64 (64 + 32 * CONFIG_CORE_COUNT) @@ -113,10 +114,10 @@ static inline uint32_t arch_get_stack_size(void) #define HEAP_SYSTEM_SHARED_SIZE 0x1500 #define HEAP_BUFFER_BLOCK_SIZE 0x100 -#define HEAP_BUFFER_COUNT (HEAP_BUFFER_SIZE / HEAP_BUFFER_BLOCK_SIZE) +#define HEAP_BUFFER_COUNT_MAX (HP_SRAM_SIZE / HEAP_BUFFER_BLOCK_SIZE) -#define HEAP_SYSTEM_M_SIZE 0x8000 /* heap primary core size */ -#define HEAP_SYSTEM_S_SIZE 0x6000 /* heap secondary core size */ +#define HEAP_SYSTEM_M_SIZE 0x4000 /* heap primary core size */ +#define HEAP_SYSTEM_S_SIZE 0x3000 /* heap secondary core size */ #define HEAP_SYSTEM_T_SIZE \ (HEAP_SYSTEM_M_SIZE + ((CONFIG_CORE_COUNT - 1) * HEAP_SYSTEM_S_SIZE)) diff --git a/test/cmocka/include/mock_memory.h b/test/cmocka/include/mock_memory.h index 54db9ba06990..f06e4a71d4bf 100644 --- a/test/cmocka/include/mock_memory.h +++ b/test/cmocka/include/mock_memory.h @@ -6,10 +6,10 @@ */ /* Memory mock for memmap */ -#define HEAP_RUNTIME_BASE 0xBE200000 -#define HEAP_BUFFER_BASE 0xBE2F0000 -#define HEAP_SYSTEM_0_BASE 0xBE30F000 -#define HEAP_SYS_RUNTIME_0_BASE 0xBE32F000 -#define SOF_CORE_S_START 0xBE390000 -#define HEAP_RUNTIME_SHARED_BASE 0xBE3A0000 -#define HEAP_SYSTEM_SHARED_BASE 0xBE3B0000 +#define HEAP_SYSTEM_0_BASE 0xBE200000 +#define HEAP_SYS_RUNTIME_0_BASE 0xBE220000 +#define SOF_CORE_S_START 0xBE280000 +#define HEAP_RUNTIME_SHARED_BASE 0xBE290000 +#define HEAP_SYSTEM_SHARED_BASE 0xBE2B0000 +#define HEAP_RUNTIME_BASE 0xBE2C0000 +#define HEAP_BUFFER_BASE 0xBE3B0000 diff --git a/test/cmocka/memory_mock.x.in b/test/cmocka/memory_mock.x.in index e9f774ede825..add0b217b077 100644 --- a/test/cmocka/memory_mock.x.in +++ b/test/cmocka/memory_mock.x.in @@ -14,13 +14,13 @@ SECTIONS _comp_init_start = .; _comp_init_end = .; - _module_heap = HEAP_RUNTIME_BASE; - _buffer_heap = HEAP_BUFFER_BASE; _system_heap = HEAP_SYSTEM_0_BASE; _system_heap_start = HEAP_SYSTEM_0_BASE; _system_runtime_heap = HEAP_SYS_RUNTIME_0_BASE; _sof_core_s_start = SOF_CORE_S_START; _runtime_shared_heap = HEAP_RUNTIME_SHARED_BASE; _system_shared_heap = HEAP_SYSTEM_SHARED_BASE; + _module_heap = HEAP_RUNTIME_BASE; + _buffer_heap = HEAP_BUFFER_BASE; } INSERT AFTER .text; diff --git a/test/cmocka/src/common_mocks.c b/test/cmocka/src/common_mocks.c index 45a7190b4148..e2a98f47a6ab 100644 --- a/test/cmocka/src/common_mocks.c +++ b/test/cmocka/src/common_mocks.c @@ -44,7 +44,7 @@ void WEAK *rballoc_align(uint32_t flags, uint32_t caps, size_t bytes, (void)flags; (void)caps; - return malloc(bytes); + return calloc(bytes, 1); } void WEAK *rzalloc(enum mem_zone zone, uint32_t flags, uint32_t caps, diff --git a/test/cmocka/src/lib/alloc/alloc.c b/test/cmocka/src/lib/alloc/alloc.c index 3553ab8b9199..16a472c7f32e 100644 --- a/test/cmocka/src/lib/alloc/alloc.c +++ b/test/cmocka/src/lib/alloc/alloc.c @@ -65,8 +65,6 @@ static struct test_case test_cases[] = { TEST_CASE(16, SOF_MEM_ZONE_SYS, SOF_MEM_CAPS_RAM, 128, TEST_BULK, "rmalloc"), - TEST_CASE(4, SOF_MEM_ZONE_SYS, SOF_MEM_CAPS_RAM, 256, TEST_BULK, - "rmalloc"), /* * TODO: Due to recent changes in relation to multicore support @@ -96,8 +94,6 @@ static struct test_case test_cases[] = { TEST_CASE(16, SOF_MEM_ZONE_RUNTIME, SOF_MEM_CAPS_RAM, 128, TEST_BULK, "rmalloc"), - TEST_CASE(4, SOF_MEM_ZONE_RUNTIME, SOF_MEM_CAPS_RAM, 256, TEST_BULK, - "rmalloc"), TEST_CASE(1, SOF_MEM_ZONE_RUNTIME, SOF_MEM_CAPS_RAM | SOF_MEM_CAPS_DMA, 2, TEST_BULK, "rmalloc_dma"), @@ -133,8 +129,6 @@ static struct test_case test_cases[] = { TEST_CASE(16, SOF_MEM_ZONE_SYS, SOF_MEM_CAPS_RAM, 128, TEST_ZERO, "rzalloc"), - TEST_CASE(4, SOF_MEM_ZONE_SYS, SOF_MEM_CAPS_RAM, 256, TEST_ZERO, - "rzalloc"), TEST_CASE(1, SOF_MEM_ZONE_RUNTIME, SOF_MEM_CAPS_RAM, 2, TEST_ZERO, "rzalloc"), @@ -159,8 +153,6 @@ static struct test_case test_cases[] = { TEST_CASE(16, SOF_MEM_ZONE_RUNTIME, SOF_MEM_CAPS_RAM, 128, TEST_ZERO, "rzalloc"), - TEST_CASE(4, SOF_MEM_ZONE_RUNTIME, SOF_MEM_CAPS_RAM, 256, TEST_ZERO, - "rzalloc"), TEST_CASE(1, SOF_MEM_ZONE_RUNTIME, SOF_MEM_CAPS_RAM | SOF_MEM_CAPS_DMA, 2, TEST_ZERO, "rzalloc_dma"), From a1396ded66723d96b88edeb004367346de36ac4d Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Thu, 9 Sep 2021 18:17:03 +0800 Subject: [PATCH 3/3] library: memory: align it to the latest cavs version Make the size of buffer zone calculated at linking stage, to align to the latest cavs version. Signed-off-by: Keyon Jie --- src/platform/library/lib/memory.c | 60 ++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/platform/library/lib/memory.c b/src/platform/library/lib/memory.c index e3c518d33463..6efaea1f4be6 100644 --- a/src/platform/library/lib/memory.c +++ b/src/platform/library/lib/memory.c @@ -19,6 +19,13 @@ #define uncached_block_hdr(hdr) cache_to_uncache_init((struct block_hdr *)(hdr)) #define uncached_block_map(map) cache_to_uncache((struct block_map *)(map)) +/* Memory mock for memmap */ +#define HEAP_SYSTEM_0_BASE 0xBE100000 +#define HEAP_SYS_RUNTIME_0_BASE 0xBE120000 +#define SOF_CORE_S_START 0xBE140000 +#define HEAP_RUNTIME_BASE 0xBE180000 +#define HEAP_BUFFER_BASE 0xBE1C0000 + /* Heap blocks for system runtime for primary core */ static SHARED_DATA struct block_hdr sys_rt_0_block64[HEAP_SYS_RT_0_COUNT64]; static SHARED_DATA struct block_hdr sys_rt_0_block512[HEAP_SYS_RT_0_COUNT512]; @@ -69,23 +76,23 @@ static SHARED_DATA struct block_map sys_rt_heap_map[CONFIG_CORE_COUNT][3] = { }; /* Heap blocks for modules */ -static SHARED_DATA struct block_hdr mod_block64[HEAP_RT_COUNT64]; -static SHARED_DATA struct block_hdr mod_block128[HEAP_RT_COUNT128]; -static SHARED_DATA struct block_hdr mod_block256[HEAP_RT_COUNT256]; -static SHARED_DATA struct block_hdr mod_block512[HEAP_RT_COUNT512]; -static SHARED_DATA struct block_hdr mod_block1024[HEAP_RT_COUNT1024]; -static SHARED_DATA struct block_hdr mod_block2048[HEAP_RT_COUNT2048]; -static SHARED_DATA struct block_hdr mod_block4096[HEAP_RT_COUNT4096]; +static SHARED_DATA struct block_hdr mod_block64[HEAP_COUNT64]; +static SHARED_DATA struct block_hdr mod_block128[HEAP_COUNT128]; +static SHARED_DATA struct block_hdr mod_block256[HEAP_COUNT256]; +static SHARED_DATA struct block_hdr mod_block512[HEAP_COUNT512]; +static SHARED_DATA struct block_hdr mod_block1024[HEAP_COUNT1024]; +static SHARED_DATA struct block_hdr mod_block2048[HEAP_COUNT2048]; +static SHARED_DATA struct block_hdr mod_block4096[HEAP_COUNT4096]; /* Heap memory map for modules */ static SHARED_DATA struct block_map rt_heap_map[] = { - BLOCK_DEF(64, HEAP_RT_COUNT64, uncached_block_hdr(mod_block64)), - BLOCK_DEF(128, HEAP_RT_COUNT128, uncached_block_hdr(mod_block128)), - BLOCK_DEF(256, HEAP_RT_COUNT256, uncached_block_hdr(mod_block256)), - BLOCK_DEF(512, HEAP_RT_COUNT512, uncached_block_hdr(mod_block512)), - BLOCK_DEF(1024, HEAP_RT_COUNT1024, uncached_block_hdr(mod_block1024)), - BLOCK_DEF(2048, HEAP_RT_COUNT2048, uncached_block_hdr(mod_block2048)), - BLOCK_DEF(4096, HEAP_RT_COUNT4096, uncached_block_hdr(mod_block4096)), + BLOCK_DEF(64, HEAP_COUNT64, uncached_block_hdr(mod_block64)), + BLOCK_DEF(128, HEAP_COUNT128, uncached_block_hdr(mod_block128)), + BLOCK_DEF(256, HEAP_COUNT256, uncached_block_hdr(mod_block256)), + BLOCK_DEF(512, HEAP_COUNT512, uncached_block_hdr(mod_block512)), + BLOCK_DEF(1024, HEAP_COUNT1024, uncached_block_hdr(mod_block1024)), + BLOCK_DEF(2048, HEAP_COUNT2048, uncached_block_hdr(mod_block2048)), + BLOCK_DEF(4096, HEAP_COUNT4096, uncached_block_hdr(mod_block4096)), }; #if CONFIG_CORE_COUNT > 1 @@ -107,12 +114,12 @@ static SHARED_DATA struct block_map rt_shared_heap_map[] = { #endif /* Heap blocks for buffers */ -static SHARED_DATA struct block_hdr buf_block[HEAP_BUFFER_COUNT]; +static SHARED_DATA struct block_hdr buf_block[HEAP_BUFFER_COUNT_MAX]; static SHARED_DATA struct block_hdr lp_buf_block[HEAP_LP_BUFFER_COUNT]; /* Heap memory map for buffers */ static SHARED_DATA struct block_map buf_heap_map[] = { - BLOCK_DEF(HEAP_BUFFER_BLOCK_SIZE, HEAP_BUFFER_COUNT, + BLOCK_DEF(HEAP_BUFFER_BLOCK_SIZE, HEAP_BUFFER_COUNT_MAX, uncached_block_hdr(buf_block)), }; @@ -125,8 +132,21 @@ static SHARED_DATA struct mm memmap; void platform_init_memmap(struct sof *sof) { + uint32_t heap_buffer_size = SOF_FW_END - HEAP_BUFFER_BASE; + uint32_t buffer_count; int i; + /* calculate the buffer heap size */ + buffer_count = heap_buffer_size / HEAP_BUFFER_BLOCK_SIZE; + heap_buffer_size = buffer_count * HEAP_BUFFER_BLOCK_SIZE; + + for (i = 0; i < ARRAY_SIZE(buf_heap_map); i++) { + buf_heap_map[i].count = buffer_count; + buf_heap_map[i].free_count = buffer_count; + } + dcache_writeback_region(buf_heap_map, + sizeof(struct block_map) * ARRAY_SIZE(buf_heap_map)); + /* access memory map through uncached region */ sof->memory_map = cache_to_uncache(&memmap); @@ -211,9 +231,9 @@ void platform_init_memmap(struct sof *sof) /* heap buffer init */ sof->memory_map->buffer[0].blocks = ARRAY_SIZE(buf_heap_map); sof->memory_map->buffer[0].map = uncached_block_map(buf_heap_map); - sof->memory_map->buffer[0].heap = (unsigned long)malloc(HEAP_BUFFER_SIZE); - sof->memory_map->buffer[0].size = HEAP_BUFFER_SIZE; - sof->memory_map->buffer[0].info.free = HEAP_BUFFER_SIZE; + sof->memory_map->buffer[0].heap = (unsigned long)malloc(heap_buffer_size); + sof->memory_map->buffer[0].size = heap_buffer_size; + sof->memory_map->buffer[0].info.free = heap_buffer_size; sof->memory_map->buffer[0].caps = SOF_MEM_CAPS_RAM | SOF_MEM_CAPS_HP | SOF_MEM_CAPS_CACHE | SOF_MEM_CAPS_DMA; @@ -228,7 +248,7 @@ void platform_init_memmap(struct sof *sof) /* .total init */ sof->memory_map->total.free = HEAP_SYSTEM_T_SIZE + - HEAP_SYS_RUNTIME_T_SIZE + HEAP_RUNTIME_SIZE + HEAP_BUFFER_SIZE + + HEAP_SYS_RUNTIME_T_SIZE + HEAP_RUNTIME_SIZE + heap_buffer_size + HEAP_LP_BUFFER_SIZE; }