Lines Matching full:cons

67 ivpu_ipc_tx_prepare(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,  in ivpu_ipc_tx_prepare()  argument
102 tx_buf->ipc.channel = cons->channel; in ivpu_ipc_tx_prepare()
112 cons->request_id = req->request_id; in ivpu_ipc_tx_prepare()
115 cons->tx_vpu_addr = tx_buf_vpu_addr; in ivpu_ipc_tx_prepare()
137 ivpu_ipc_rx_msg_add(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, in ivpu_ipc_rx_msg_add() argument
156 rx_msg->callback = cons->rx_callback; in ivpu_ipc_rx_msg_add()
161 spin_lock(&cons->rx_lock); in ivpu_ipc_rx_msg_add()
162 list_add_tail(&rx_msg->link, &cons->rx_msg_list); in ivpu_ipc_rx_msg_add()
163 spin_unlock(&cons->rx_lock); in ivpu_ipc_rx_msg_add()
164 wake_up(&cons->rx_msg_wq); in ivpu_ipc_rx_msg_add()
177 void ivpu_ipc_consumer_add(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, in ivpu_ipc_consumer_add() argument
182 INIT_LIST_HEAD(&cons->link); in ivpu_ipc_consumer_add()
183 cons->channel = channel; in ivpu_ipc_consumer_add()
184 cons->tx_vpu_addr = 0; in ivpu_ipc_consumer_add()
185 cons->request_id = 0; in ivpu_ipc_consumer_add()
186 cons->aborted = false; in ivpu_ipc_consumer_add()
187 cons->rx_callback = rx_callback; in ivpu_ipc_consumer_add()
188 spin_lock_init(&cons->rx_lock); in ivpu_ipc_consumer_add()
189 INIT_LIST_HEAD(&cons->rx_msg_list); in ivpu_ipc_consumer_add()
190 init_waitqueue_head(&cons->rx_msg_wq); in ivpu_ipc_consumer_add()
193 list_add_tail(&cons->link, &ipc->cons_list); in ivpu_ipc_consumer_add()
197 void ivpu_ipc_consumer_del(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons) in ivpu_ipc_consumer_del() argument
203 list_del(&cons->link); in ivpu_ipc_consumer_del()
206 spin_lock_irq(&cons->rx_lock); in ivpu_ipc_consumer_del()
207 list_for_each_entry_safe(rx_msg, r, &cons->rx_msg_list, link) in ivpu_ipc_consumer_del()
209 spin_unlock_irq(&cons->rx_lock); in ivpu_ipc_consumer_del()
211 ivpu_ipc_tx_release(vdev, cons->tx_vpu_addr); in ivpu_ipc_consumer_del()
214 int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, struct vpu_jsm_msg *req) in ivpu_ipc_send() argument
226 ret = ivpu_ipc_tx_prepare(vdev, cons, req); in ivpu_ipc_send()
230 ivpu_ipc_tx(vdev, cons->tx_vpu_addr); in ivpu_ipc_send()
238 static bool ivpu_ipc_rx_need_wakeup(struct ivpu_ipc_consumer *cons) in ivpu_ipc_rx_need_wakeup() argument
242 spin_lock_irq(&cons->rx_lock); in ivpu_ipc_rx_need_wakeup()
243 ret = !list_empty(&cons->rx_msg_list) || cons->aborted; in ivpu_ipc_rx_need_wakeup()
244 spin_unlock_irq(&cons->rx_lock); in ivpu_ipc_rx_need_wakeup()
249 int ivpu_ipc_receive(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, in ivpu_ipc_receive() argument
256 if (drm_WARN_ONCE(&vdev->drm, cons->rx_callback, "Consumer works only in async mode\n")) in ivpu_ipc_receive()
259 wait_ret = wait_event_timeout(cons->rx_msg_wq, in ivpu_ipc_receive()
260 ivpu_ipc_rx_need_wakeup(cons), in ivpu_ipc_receive()
266 spin_lock_irq(&cons->rx_lock); in ivpu_ipc_receive()
267 if (cons->aborted) { in ivpu_ipc_receive()
268 spin_unlock_irq(&cons->rx_lock); in ivpu_ipc_receive()
271 rx_msg = list_first_entry_or_null(&cons->rx_msg_list, struct ivpu_ipc_rx_msg, link); in ivpu_ipc_receive()
273 spin_unlock_irq(&cons->rx_lock); in ivpu_ipc_receive()
293 spin_unlock_irq(&cons->rx_lock); in ivpu_ipc_receive()
302 struct ivpu_ipc_consumer cons; in ivpu_ipc_send_receive_internal() local
308 ivpu_ipc_consumer_add(vdev, &cons, channel, NULL); in ivpu_ipc_send_receive_internal()
310 ret = ivpu_ipc_send(vdev, &cons, req); in ivpu_ipc_send_receive_internal()
316 ret = ivpu_ipc_receive(vdev, &cons, NULL, resp, timeout_ms); in ivpu_ipc_send_receive_internal()
329 ivpu_ipc_consumer_del(vdev, &cons); in ivpu_ipc_send_receive_internal()
363 struct ivpu_ipc_consumer cons; in ivpu_ipc_send_and_wait() local
370 ivpu_ipc_consumer_add(vdev, &cons, channel, NULL); in ivpu_ipc_send_and_wait()
372 ret = ivpu_ipc_send(vdev, &cons, req); in ivpu_ipc_send_and_wait()
381 ivpu_ipc_consumer_del(vdev, &cons); in ivpu_ipc_send_and_wait()
387 ivpu_ipc_match_consumer(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, in ivpu_ipc_match_consumer() argument
390 if (cons->channel != ipc_hdr->channel) in ivpu_ipc_match_consumer()
393 if (!jsm_msg || jsm_msg->request_id == cons->request_id) in ivpu_ipc_match_consumer()
402 struct ivpu_ipc_consumer *cons; in ivpu_ipc_irq_handler() local
448 list_for_each_entry(cons, &ipc->cons_list, link) { in ivpu_ipc_irq_handler()
449 if (ivpu_ipc_match_consumer(vdev, cons, ipc_hdr, jsm_msg)) { in ivpu_ipc_irq_handler()
450 ivpu_ipc_rx_msg_add(vdev, cons, ipc_hdr, jsm_msg); in ivpu_ipc_irq_handler()
559 struct ivpu_ipc_consumer *cons, *c; in ivpu_ipc_disable() local
569 list_for_each_entry_safe(cons, c, &ipc->cons_list, link) { in ivpu_ipc_disable()
570 spin_lock(&cons->rx_lock); in ivpu_ipc_disable()
571 if (!cons->rx_callback) in ivpu_ipc_disable()
572 cons->aborted = true; in ivpu_ipc_disable()
573 list_for_each_entry_safe(rx_msg, r, &cons->rx_msg_list, link) in ivpu_ipc_disable()
575 spin_unlock(&cons->rx_lock); in ivpu_ipc_disable()
576 wake_up(&cons->rx_msg_wq); in ivpu_ipc_disable()