162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2020-2023 Intel Corporation 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __IVPU_IPC_H__ 762306a36Sopenharmony_ci#define __IVPU_IPC_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/interrupt.h> 1062306a36Sopenharmony_ci#include <linux/spinlock.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "vpu_jsm_api.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct ivpu_bo; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* VPU FW boot notification */ 1762306a36Sopenharmony_ci#define IVPU_IPC_CHAN_BOOT_MSG 0x3ff 1862306a36Sopenharmony_ci#define IVPU_IPC_BOOT_MSG_DATA_ADDR 0x424f4f54 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* The alignment to be used for IPC Buffers and IPC Data. */ 2162306a36Sopenharmony_ci#define IVPU_IPC_ALIGNMENT 64 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define IVPU_IPC_HDR_FREE 0 2462306a36Sopenharmony_ci#define IVPU_IPC_HDR_ALLOCATED 1 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/** 2762306a36Sopenharmony_ci * struct ivpu_ipc_hdr - The IPC message header structure, exchanged 2862306a36Sopenharmony_ci * with the VPU device firmware. 2962306a36Sopenharmony_ci * @data_addr: The VPU address of the payload (JSM message) 3062306a36Sopenharmony_ci * @data_size: The size of the payload. 3162306a36Sopenharmony_ci * @channel: The channel used. 3262306a36Sopenharmony_ci * @src_node: The Node ID of the sender. 3362306a36Sopenharmony_ci * @dst_node: The Node ID of the intended receiver. 3462306a36Sopenharmony_ci * @status: IPC buffer usage status 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_cistruct ivpu_ipc_hdr { 3762306a36Sopenharmony_ci u32 data_addr; 3862306a36Sopenharmony_ci u32 data_size; 3962306a36Sopenharmony_ci u16 channel; 4062306a36Sopenharmony_ci u8 src_node; 4162306a36Sopenharmony_ci u8 dst_node; 4262306a36Sopenharmony_ci u8 status; 4362306a36Sopenharmony_ci} __packed __aligned(IVPU_IPC_ALIGNMENT); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct ivpu_ipc_consumer { 4662306a36Sopenharmony_ci struct list_head link; 4762306a36Sopenharmony_ci u32 channel; 4862306a36Sopenharmony_ci u32 tx_vpu_addr; 4962306a36Sopenharmony_ci u32 request_id; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci spinlock_t rx_msg_lock; /* Protects rx_msg_list */ 5262306a36Sopenharmony_ci struct list_head rx_msg_list; 5362306a36Sopenharmony_ci wait_queue_head_t rx_msg_wq; 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistruct ivpu_ipc_info { 5762306a36Sopenharmony_ci struct gen_pool *mm_tx; 5862306a36Sopenharmony_ci struct ivpu_bo *mem_tx; 5962306a36Sopenharmony_ci struct ivpu_bo *mem_rx; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci atomic_t rx_msg_count; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci spinlock_t cons_list_lock; /* Protects cons_list */ 6462306a36Sopenharmony_ci struct list_head cons_list; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci atomic_t request_id; 6762306a36Sopenharmony_ci struct mutex lock; /* Lock on status */ 6862306a36Sopenharmony_ci bool on; 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ciint ivpu_ipc_init(struct ivpu_device *vdev); 7262306a36Sopenharmony_civoid ivpu_ipc_fini(struct ivpu_device *vdev); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_civoid ivpu_ipc_enable(struct ivpu_device *vdev); 7562306a36Sopenharmony_civoid ivpu_ipc_disable(struct ivpu_device *vdev); 7662306a36Sopenharmony_civoid ivpu_ipc_reset(struct ivpu_device *vdev); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ciint ivpu_ipc_irq_handler(struct ivpu_device *vdev); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_civoid ivpu_ipc_consumer_add(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, 8162306a36Sopenharmony_ci u32 channel); 8262306a36Sopenharmony_civoid ivpu_ipc_consumer_del(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciint ivpu_ipc_receive(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, 8562306a36Sopenharmony_ci struct ivpu_ipc_hdr *ipc_buf, struct vpu_jsm_msg *ipc_payload, 8662306a36Sopenharmony_ci unsigned long timeout_ms); 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ciint ivpu_ipc_send_receive(struct ivpu_device *vdev, struct vpu_jsm_msg *req, 8962306a36Sopenharmony_ci enum vpu_ipc_msg_type expected_resp_type, 9062306a36Sopenharmony_ci struct vpu_jsm_msg *resp, u32 channel, 9162306a36Sopenharmony_ci unsigned long timeout_ms); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#endif /* __IVPU_IPC_H__ */ 94