2727
2828#include <sof/lib_manager.h>
2929#include <sof/audio/component.h>
30+ #include <sof/schedule/dp_schedule.h>
3031#include <rtos/userspace_helper.h>
3132#include <utilities/array.h>
3233#include <zephyr/sys/sem.h>
@@ -53,8 +54,7 @@ struct user_worker {
5354 uint32_t reference_count ; /* module reference count */
5455 void * stack_ptr ; /* pointer to worker stack */
5556 struct k_work_user_q work_queue ;
56- struct k_msgq * in_msgq ; /* pointer to input message queue */
57- struct k_msgq * out_msgq ; /* pointer to output message queue */
57+ struct k_event event ;
5858};
5959
6060/*
@@ -84,53 +84,9 @@ uint32_t ptable_size(struct k_mem_domain *domain)
8484
8585 return cnt ;
8686}
87- #if 0
88- static int userspace_proxy_msgq_alloc (struct userspace_context * context )
89- {
90- char * buffer ;
91-
92- buffer = rzalloc (SOF_MEM_FLAG_USER_SHARED_BUFFER , MAX_PARAM_SIZE * 2 );
93- if (!buffer )
94- return - ENOMEM ;
95-
96- context -> in_msgq = k_object_alloc (K_OBJ_MSGQ );
97- if (!context -> in_msgq ) {
98- rfree (buffer );
99- return - ENOMEM ;
100- }
101-
102- context -> out_msgq = k_object_alloc (K_OBJ_MSGQ );
103- if (!context -> out_msgq ) {
104- k_object_free (context -> in_msgq );
105- rfree (buffer );
106- return - ENOMEM ;
107- }
108- /* k_msgq_alloc_init */
109- k_msgq_init (context -> in_msgq , buffer , MAX_PARAM_SIZE , 1 );
110- k_msgq_init (context -> out_msgq , (buffer + MAX_PARAM_SIZE ), MAX_PARAM_SIZE , 1 );
11187
112- return 0 ;
113- }
114-
115- static void user_worker_msgq_free ()
116- {
117- int ret ;
118- /* in_msgq->buffer_start points to whole buffer allocated for message queues */
119- /* TODO: Assert error code */
120- ret = k_msgq_cleanup (worker .in_msgq );
121- assert (!ret );
122- ret = k_msgq_cleanup (worker .out_msgq );
123- assert (!ret );
124-
125- rfree (worker .in_msgq -> buffer_start );
126- k_object_free (worker .in_msgq );
127- k_object_free (worker .out_msgq );
128- }
129- #endif
13088static int user_worker_create ()
13189{
132- char * buffer = NULL ;
133-
13490 if (worker .reference_count )
13591 return 0 ;
13692
@@ -142,66 +98,36 @@ static int user_worker_create()
14298 return - ENOMEM ;
14399 }
144100
145- buffer = rzalloc (SOF_MEM_FLAG_USER_SHARED_BUFFER , MAX_PARAM_SIZE * 2 );
146- if (!buffer )
147- goto error ;
148-
149- worker .in_msgq = k_object_alloc (K_OBJ_MSGQ );
150- if (!worker .in_msgq )
151- goto error ;
152-
153- worker .out_msgq = k_object_alloc (K_OBJ_MSGQ );
154- if (!worker .out_msgq )
155- goto error ;
156-
157- /* k_msgq_alloc_init */
158- k_msgq_init (worker .in_msgq , buffer , MAX_PARAM_SIZE , 1 );
159- k_msgq_init (worker .out_msgq , (buffer + MAX_PARAM_SIZE ), MAX_PARAM_SIZE , 1 );
160-
101+ k_event_init (& worker .event );
161102 k_work_user_queue_start (& worker .work_queue , worker .stack_ptr , CONFIG_SOF_STACK_SIZE , 0 ,
162103 "Userspace proxy worker" );
163104
164105 worker .thread_id = k_work_user_queue_thread_get (& worker .work_queue );
165106
166107 /* Grant a thread access to a kernel object (IPC msg. data). */
167- k_thread_access_grant (worker .thread_id , worker .in_msgq , worker . out_msgq );
108+ k_thread_access_grant (worker .thread_id , & worker .event );
168109
169110 worker .reference_count ++ ;
170111 return 0 ;
171-
112+ #if 0
172113error :
173114 /* TODO: Moze wspolna funckja free? */
174- k_object_free (worker .in_msgq );
175- k_object_free (worker .out_msgq );
176- rfree (buffer );
177115 user_stack_free (worker .stack_ptr );
178116 return - ENOMEM ;
117+ #endif
179118}
180119
181120static void user_worker_free ()
182121{
183- int ret ;
184-
185122 /* Module removed so decrement counter */
186123 worker .reference_count -- ;
187124
188125 /* Free worker resources if no more active user space modules */
189126 if (worker .reference_count == 0 ) {
190127 tr_dbg (& userspace_proxy_tr , "free" );
191128
192- /* in_msgq->buffer_start points to whole buffer allocated for message queues */
193- /* TODO: Assert error code */
194- ret = k_msgq_cleanup (worker .in_msgq );
195- assert (!ret );
196- ret = k_msgq_cleanup (worker .out_msgq );
197- assert (!ret );
198-
199129 k_thread_abort (worker .thread_id );
200130 user_stack_free (worker .stack_ptr );
201-
202- rfree (worker .in_msgq -> buffer_start );
203- k_object_free (worker .in_msgq );
204- k_object_free (worker .out_msgq );
205131 }
206132}
207133
@@ -222,8 +148,7 @@ static int user_work_item_init(struct userspace_context *context, struct k_heap
222148
223149 k_work_user_init (& work_item -> work_item , userspace_proxy_worker_handler );
224150
225- work_item -> in_msgq = worker .in_msgq ;
226- work_item -> out_msgq = worker .out_msgq ;
151+ work_item -> event = & worker .event ;
227152 work_item -> params .context = context ;
228153 context -> work_item = work_item ;
229154
@@ -275,23 +200,20 @@ static int userspace_proxy_invoke(struct userspace_context *context, struct proc
275200 return ret ;
276201 }
277202
278- ret = k_msgq_put (worker .in_msgq , params , K_FOREVER );
279- if (ret < 0 ) {
280- comp_err (mod -> dev , "k_msgq_put(): error: %d" , ret );
281- return ret ;
282- }
283-
284203 ret = k_work_user_submit_to_queue (& worker .work_queue , & context -> work_item -> work_item );
285204 if (ret < 0 ) {
286205 comp_err (mod -> dev , "k_work_user_submit_to_queue(): error: %d" , ret );
287206 return ret ;
288207 }
289208
290- ret = k_msgq_get (worker .out_msgq , params , K_FOREVER );
291- if (ret < 0 )
292- comp_err (mod -> dev , "k_msgq_get(): error: %d" , ret );
209+ /* Timeout value is aligned with the ipc_wait_for_compound_msg function */
210+ if (!k_event_wait_safe (& worker .event , DP_TASK_EVENT_IPC_DONE , false,
211+ Z_TIMEOUT_US (250 * 20 ))) {
212+ comp_err (mod -> dev , "ipc processing timedout." );
213+ return - ETIMEDOUT ;
214+ }
293215
294- return ret ;
216+ return 0 ;
295217}
296218
297219extern struct k_mem_partition ipc_partition ;
0 commit comments