1919#include <rtos/symbol.h>
2020#include <rtos/wait.h>
2121
22+ #define SHARED_HEAP_MEM_SIZE 0
23+
2224#if CONFIG_VIRTUAL_HEAP
2325#include <sof/lib/regions_mm.h>
2426
@@ -98,7 +100,14 @@ static uint8_t __aligned(PLATFORM_DCACHE_ALIGN) heapmem[HEAPMEM_SIZE];
98100 * to allow memory management driver to control unused
99101 * memory pages.
100102 */
101- __section (".heap_mem" ) static uint8_t __aligned (PLATFORM_DCACHE_ALIGN ) heapmem [HEAPMEM_SIZE ];
103+ #if CONFIG_USERSPACE
104+ #undef SHARED_HEAP_MEM_SIZE
105+ #define SHARED_HEAP_MEM_SIZE ROUND_UP(CONFIG_SOF_ZEPHYR_SHARED_HEAP_SIZE, HOST_PAGE_SIZE)
106+ __section (".shared_heap_mem" )
107+ static uint8_t __aligned (HOST_PAGE_SIZE ) shared_heapmem [SHARED_HEAP_MEM_SIZE ];
108+ #endif /* CONFIG_USERSPACE */
109+ __section (".heap_mem" ) static uint8_t __aligned (HOST_PAGE_SIZE ) heapmem [HEAPMEM_SIZE -
110+ SHARED_HEAP_MEM_SIZE ];
102111
103112#elif defined(CONFIG_ARCH_POSIX )
104113
@@ -125,6 +134,40 @@ extern char _end[], _heap_sentry[];
125134
126135static struct k_heap sof_heap ;
127136
137+ #if CONFIG_USERSPACE
138+ static struct k_heap shared_heap ;
139+
140+ static bool is_shd_heap_pointer (void * ptr )
141+ {
142+ uintptr_t shd_heap_start = POINTER_TO_UINT (shared_heapmem );
143+ uintptr_t shd_heap_end = POINTER_TO_UINT (shared_heapmem + SHARED_HEAP_MEM_SIZE );
144+
145+ if (is_cached (ptr ))
146+ ptr = sys_cache_uncached_ptr_get ((__sparse_force void __sparse_cache * )ptr );
147+
148+ return (POINTER_TO_UINT (ptr ) >= shd_heap_start ) && (POINTER_TO_UINT (ptr ) < shd_heap_end );
149+ }
150+
151+ /**
152+ * Returns the start of HPSRAM Shared memory heap.
153+ * @return Pointer to the HPSRAM Shared memory location which can be used
154+ * for HPSRAM Shared heap.
155+ */
156+ uintptr_t get_shared_heap_start (void )
157+ {
158+ return ROUND_UP (POINTER_TO_UINT (shared_heapmem ), HOST_PAGE_SIZE );
159+ }
160+
161+ /**
162+ * Returns the size of HPSRAM Shared memory heap.
163+ * @return Size of the HPSRAM Shared memory region which can be used for HPSRAM Shared heap.
164+ */
165+ size_t get_shared_heap_size (void )
166+ {
167+ return ROUND_DOWN (SHARED_HEAP_MEM_SIZE , HOST_PAGE_SIZE );
168+ }
169+ #endif /* CONFIG_USERSPACE */
170+
128171#if CONFIG_L3_HEAP
129172static struct k_heap l3_heap ;
130173static struct k_heap l3_heap_copy __imrdata ;
@@ -243,15 +286,17 @@ static void *virtual_heap_alloc(struct vmh_heap *heap, uint32_t flags, size_t by
243286 return mem ;
244287}
245288
289+ extern int _unused_ram_start_marker ;
290+
246291/**
247292 * Checks whether pointer is from virtual memory range.
248293 * @param ptr Pointer to memory being checked.
249294 * @return True if pointer falls into virtual memory region, false otherwise.
250295 */
251296static bool is_virtual_heap_pointer (void * ptr )
252297{
253- uintptr_t virtual_heap_start = POINTER_TO_UINT (sys_cache_cached_ptr_get ( & heapmem )) +
254- HEAPMEM_SIZE ;
298+ uintptr_t virtual_heap_start = POINTER_TO_UINT (
299+ sys_cache_cached_ptr_get ( & _unused_ram_start_marker )) ;
255300 uintptr_t virtual_heap_end = CONFIG_KERNEL_VM_BASE + CONFIG_KERNEL_VM_SIZE ;
256301
257302 if (!is_cached (ptr ))
@@ -393,6 +438,10 @@ void *rmalloc(uint32_t flags, size_t bytes)
393438 return ptr ;
394439#else
395440 k_panic ();
441+ #endif
442+ #if CONFIG_USERSPACE
443+ } else if (flags & SOF_MEM_FLAG_USER_SHARED ) {
444+ heap = & shared_heap ;
396445#endif
397446 } else {
398447 heap = & sof_heap ;
@@ -477,16 +526,20 @@ void *rballoc_align(uint32_t flags, size_t bytes,
477526 tr_err (& zephyr_tr , "L3_HEAP not available." );
478527 return NULL ;
479528#endif
529+ #if CONFIG_USERSPACE
530+ } else if (flags & SOF_MEM_FLAG_USER_SHARED ) {
531+ heap = & shared_heap ;
532+ #endif /* CONFIG_USERSPACE */
480533 } else {
481- heap = & sof_heap ;
482- }
483-
484534#if CONFIG_VIRTUAL_HEAP
485535 /* Use virtual heap if it is available */
486536 if (virtual_buffers_heap )
487537 return virtual_heap_alloc (virtual_buffers_heap , flags , bytes , align );
488538#endif /* CONFIG_VIRTUAL_HEAP */
489539
540+ heap = & sof_heap ;
541+ }
542+
490543 if (flags & SOF_MEM_FLAG_COHERENT )
491544 return heap_alloc_aligned (heap , align , bytes );
492545
@@ -516,13 +569,24 @@ void rfree(void *ptr)
516569 }
517570#endif
518571
572+ #if CONFIG_USERSPACE
573+ if (is_shd_heap_pointer (ptr )) {
574+ heap_free (& shared_heap , ptr );
575+ return ;
576+ }
577+ #endif
578+
519579 heap_free (& sof_heap , ptr );
520580}
521581EXPORT_SYMBOL (rfree );
522582
523583static int heap_init (void )
524584{
525- sys_heap_init (& sof_heap .heap , heapmem , HEAPMEM_SIZE );
585+ sys_heap_init (& sof_heap .heap , heapmem , HEAPMEM_SIZE - SHARED_HEAP_MEM_SIZE );
586+
587+ #if CONFIG_USERSPACE
588+ sys_heap_init (& shared_heap .heap , shared_heapmem , SHARED_HEAP_MEM_SIZE );
589+ #endif
526590
527591#if CONFIG_L3_HEAP
528592 if (l3_heap_copy .heap .heap )
0 commit comments