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