@@ -150,4 +150,73 @@ size_t get_shared_buffer_heap_size(void);
150150
151151#endif
152152
153+ #include <sof/lib/vregion.h>
154+ #include <string.h>
155+
156+ struct mod_alloc_ctx {
157+ struct k_heap * heap ;
158+ struct vregion * vreg ;
159+ };
160+
161+ /**
162+ * Allocate memory from a mod_alloc_ctx context.
163+ *
164+ * When the context has a vregion, allocates from the vregion interim
165+ * partition. Coherent memory is used when SOF_MEM_FLAG_COHERENT is set
166+ * in flags. Falls back to sof_heap_alloc() otherwise.
167+ *
168+ * @param ctx Allocation context (heap + optional vregion).
169+ * @param flags Allocation flags (SOF_MEM_FLAG_*).
170+ * @param size Size in bytes.
171+ * @param alignment Required alignment in bytes.
172+ * @return Pointer to allocated memory or NULL on failure.
173+ */
174+ static inline void * sof_ctx_alloc (struct mod_alloc_ctx * ctx , uint32_t flags ,
175+ size_t size , size_t alignment )
176+ {
177+ if (!ctx || !ctx -> vreg )
178+ return sof_heap_alloc (ctx ? ctx -> heap : NULL , flags , size , alignment );
179+
180+ if (flags & SOF_MEM_FLAG_COHERENT )
181+ return vregion_alloc_coherent_align (ctx -> vreg , VREGION_MEM_TYPE_INTERIM ,
182+ size , alignment );
183+
184+ return vregion_alloc_align (ctx -> vreg , VREGION_MEM_TYPE_INTERIM , size , alignment );
185+ }
186+
187+ /**
188+ * Allocate zero-initialized memory from a mod_alloc_ctx context.
189+ * @param ctx Allocation context.
190+ * @param flags Allocation flags (SOF_MEM_FLAG_*).
191+ * @param size Size in bytes.
192+ * @param alignment Required alignment in bytes.
193+ * @return Pointer to allocated memory or NULL on failure.
194+ */
195+ static inline void * sof_ctx_zalloc (struct mod_alloc_ctx * ctx , uint32_t flags ,
196+ size_t size , size_t alignment )
197+ {
198+ void * ptr = sof_ctx_alloc (ctx , flags , size , alignment );
199+
200+ if (ptr )
201+ memset (ptr , 0 , size );
202+
203+ return ptr ;
204+ }
205+
206+ /**
207+ * Free memory allocated from a mod_alloc_ctx context.
208+ * @param ctx Allocation context.
209+ * @param ptr Pointer to free.
210+ */
211+ static inline void sof_ctx_free (struct mod_alloc_ctx * ctx , void * ptr )
212+ {
213+ if (!ptr )
214+ return ;
215+
216+ if (ctx && ctx -> vreg )
217+ vregion_free (ctx -> vreg , ptr );
218+ else
219+ sof_heap_free (ctx ? ctx -> heap : NULL , ptr );
220+ }
221+
153222#endif /* __ZEPHYR_RTOS_ALLOC_H__ */
0 commit comments