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