xref: /linux/drivers/accel/ivpu/ivpu_ipc.h (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
15d7422cfSJacek Lawrynowicz /* SPDX-License-Identifier: GPL-2.0-only */
25d7422cfSJacek Lawrynowicz /*
3*b7ed87ffSMaciej Falkowski  * Copyright (C) 2020-2024 Intel Corporation
45d7422cfSJacek Lawrynowicz  */
55d7422cfSJacek Lawrynowicz 
65d7422cfSJacek Lawrynowicz #ifndef __IVPU_IPC_H__
75d7422cfSJacek Lawrynowicz #define __IVPU_IPC_H__
85d7422cfSJacek Lawrynowicz 
95d7422cfSJacek Lawrynowicz #include <linux/interrupt.h>
105d7422cfSJacek Lawrynowicz #include <linux/spinlock.h>
115d7422cfSJacek Lawrynowicz 
125d7422cfSJacek Lawrynowicz #include "vpu_jsm_api.h"
135d7422cfSJacek Lawrynowicz 
145d7422cfSJacek Lawrynowicz struct ivpu_bo;
155d7422cfSJacek Lawrynowicz 
165d7422cfSJacek Lawrynowicz /* VPU FW boot notification */
175d7422cfSJacek Lawrynowicz #define IVPU_IPC_CHAN_BOOT_MSG		0x3ff
185d7422cfSJacek Lawrynowicz #define IVPU_IPC_BOOT_MSG_DATA_ADDR	0x424f4f54
195d7422cfSJacek Lawrynowicz 
205d7422cfSJacek Lawrynowicz /* The alignment to be used for IPC Buffers and IPC Data. */
215d7422cfSJacek Lawrynowicz #define IVPU_IPC_ALIGNMENT	   64
225d7422cfSJacek Lawrynowicz 
235d7422cfSJacek Lawrynowicz #define IVPU_IPC_HDR_FREE	   0
2434224133SAndrzej Kacprowski #define IVPU_IPC_HDR_ALLOCATED	   1
255d7422cfSJacek Lawrynowicz 
265d7422cfSJacek Lawrynowicz /**
275d7422cfSJacek Lawrynowicz  * struct ivpu_ipc_hdr - The IPC message header structure, exchanged
285d7422cfSJacek Lawrynowicz  * with the VPU device firmware.
295d7422cfSJacek Lawrynowicz  * @data_addr: The VPU address of the payload (JSM message)
305d7422cfSJacek Lawrynowicz  * @data_size: The size of the payload.
315d7422cfSJacek Lawrynowicz  * @channel: The channel used.
325d7422cfSJacek Lawrynowicz  * @src_node: The Node ID of the sender.
335d7422cfSJacek Lawrynowicz  * @dst_node: The Node ID of the intended receiver.
345d7422cfSJacek Lawrynowicz  * @status: IPC buffer usage status
355d7422cfSJacek Lawrynowicz  */
365d7422cfSJacek Lawrynowicz struct ivpu_ipc_hdr {
375d7422cfSJacek Lawrynowicz 	u32 data_addr;
385d7422cfSJacek Lawrynowicz 	u32 data_size;
395d7422cfSJacek Lawrynowicz 	u16 channel;
405d7422cfSJacek Lawrynowicz 	u8 src_node;
415d7422cfSJacek Lawrynowicz 	u8 dst_node;
425d7422cfSJacek Lawrynowicz 	u8 status;
435d7422cfSJacek Lawrynowicz } __packed __aligned(IVPU_IPC_ALIGNMENT);
445d7422cfSJacek Lawrynowicz 
453b434a34SJacek Lawrynowicz typedef void (*ivpu_ipc_rx_callback_t)(struct ivpu_device *vdev,
463b434a34SJacek Lawrynowicz 				       struct ivpu_ipc_hdr *ipc_hdr,
473b434a34SJacek Lawrynowicz 				       struct vpu_jsm_msg *jsm_msg);
483b434a34SJacek Lawrynowicz 
493b434a34SJacek Lawrynowicz struct ivpu_ipc_rx_msg {
503b434a34SJacek Lawrynowicz 	struct list_head link;
513b434a34SJacek Lawrynowicz 	struct ivpu_ipc_hdr *ipc_hdr;
523b434a34SJacek Lawrynowicz 	struct vpu_jsm_msg *jsm_msg;
533b434a34SJacek Lawrynowicz 	ivpu_ipc_rx_callback_t callback;
543b434a34SJacek Lawrynowicz };
553b434a34SJacek Lawrynowicz 
565d7422cfSJacek Lawrynowicz struct ivpu_ipc_consumer {
575d7422cfSJacek Lawrynowicz 	struct list_head link;
585d7422cfSJacek Lawrynowicz 	u32 channel;
595d7422cfSJacek Lawrynowicz 	u32 tx_vpu_addr;
605d7422cfSJacek Lawrynowicz 	u32 request_id;
61ba6b035dSStanislaw Gruszka 	bool aborted;
623b434a34SJacek Lawrynowicz 	ivpu_ipc_rx_callback_t rx_callback;
635d7422cfSJacek Lawrynowicz 
64043a2d5dSStanislaw Gruszka 	spinlock_t rx_lock; /* Protects rx_msg_list and aborted */
655d7422cfSJacek Lawrynowicz 	struct list_head rx_msg_list;
665d7422cfSJacek Lawrynowicz 	wait_queue_head_t rx_msg_wq;
675d7422cfSJacek Lawrynowicz };
685d7422cfSJacek Lawrynowicz 
695d7422cfSJacek Lawrynowicz struct ivpu_ipc_info {
705d7422cfSJacek Lawrynowicz 	struct gen_pool *mm_tx;
715d7422cfSJacek Lawrynowicz 	struct ivpu_bo *mem_tx;
725d7422cfSJacek Lawrynowicz 	struct ivpu_bo *mem_rx;
735d7422cfSJacek Lawrynowicz 
745d7422cfSJacek Lawrynowicz 	atomic_t rx_msg_count;
755d7422cfSJacek Lawrynowicz 
763b434a34SJacek Lawrynowicz 	spinlock_t cons_lock; /* Protects cons_list and cb_msg_list */
775d7422cfSJacek Lawrynowicz 	struct list_head cons_list;
783b434a34SJacek Lawrynowicz 	struct list_head cb_msg_list;
795d7422cfSJacek Lawrynowicz 
805d7422cfSJacek Lawrynowicz 	atomic_t request_id;
815d7422cfSJacek Lawrynowicz 	struct mutex lock; /* Lock on status */
825d7422cfSJacek Lawrynowicz 	bool on;
835d7422cfSJacek Lawrynowicz };
845d7422cfSJacek Lawrynowicz 
855d7422cfSJacek Lawrynowicz int ivpu_ipc_init(struct ivpu_device *vdev);
865d7422cfSJacek Lawrynowicz void ivpu_ipc_fini(struct ivpu_device *vdev);
875d7422cfSJacek Lawrynowicz 
885d7422cfSJacek Lawrynowicz void ivpu_ipc_enable(struct ivpu_device *vdev);
895d7422cfSJacek Lawrynowicz void ivpu_ipc_disable(struct ivpu_device *vdev);
905d7422cfSJacek Lawrynowicz void ivpu_ipc_reset(struct ivpu_device *vdev);
915d7422cfSJacek Lawrynowicz 
922f7ffb06SJacek Lawrynowicz void ivpu_ipc_irq_handler(struct ivpu_device *vdev);
932f7ffb06SJacek Lawrynowicz void ivpu_ipc_irq_thread_handler(struct ivpu_device *vdev);
945d7422cfSJacek Lawrynowicz 
955d7422cfSJacek Lawrynowicz void ivpu_ipc_consumer_add(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
963b434a34SJacek Lawrynowicz 			   u32 channel, ivpu_ipc_rx_callback_t callback);
975d7422cfSJacek Lawrynowicz void ivpu_ipc_consumer_del(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons);
985d7422cfSJacek Lawrynowicz 
99*b7ed87ffSMaciej Falkowski int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
100*b7ed87ffSMaciej Falkowski 		  struct vpu_jsm_msg *req);
1015d7422cfSJacek Lawrynowicz int ivpu_ipc_receive(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
1023b434a34SJacek Lawrynowicz 		     struct ivpu_ipc_hdr *ipc_buf, struct vpu_jsm_msg *jsm_msg,
1035d7422cfSJacek Lawrynowicz 		     unsigned long timeout_ms);
1045d7422cfSJacek Lawrynowicz 
10545e45362SKarol Wachowski int ivpu_ipc_send_receive_active(struct ivpu_device *vdev, struct vpu_jsm_msg *req,
10645e45362SKarol Wachowski 				 enum vpu_ipc_msg_type expected_resp, struct vpu_jsm_msg *resp,
10745e45362SKarol Wachowski 				 u32 channel, unsigned long timeout_ms);
1085d7422cfSJacek Lawrynowicz int ivpu_ipc_send_receive(struct ivpu_device *vdev, struct vpu_jsm_msg *req,
10945e45362SKarol Wachowski 			  enum vpu_ipc_msg_type expected_resp, struct vpu_jsm_msg *resp,
11045e45362SKarol Wachowski 			  u32 channel, unsigned long timeout_ms);
1115d7422cfSJacek Lawrynowicz 
1125d7422cfSJacek Lawrynowicz #endif /* __IVPU_IPC_H__ */
113