xref: /linux/drivers/accel/amdxdna/amdxdna_mailbox.h (revision bbfd5594756011167b8f8de9a00e0c946afda1e6)
1b87f920bSLizhi Hou /* SPDX-License-Identifier: GPL-2.0 */
2b87f920bSLizhi Hou /*
3b87f920bSLizhi Hou  * Copyright (C) 2022-2024, Advanced Micro Devices, Inc.
4b87f920bSLizhi Hou  */
5b87f920bSLizhi Hou 
6b87f920bSLizhi Hou #ifndef _AIE2_MAILBOX_H_
7b87f920bSLizhi Hou #define _AIE2_MAILBOX_H_
8b87f920bSLizhi Hou 
9b87f920bSLizhi Hou struct mailbox;
10b87f920bSLizhi Hou struct mailbox_channel;
11b87f920bSLizhi Hou 
12b87f920bSLizhi Hou /*
13b87f920bSLizhi Hou  * xdna_mailbox_msg - message struct
14b87f920bSLizhi Hou  *
15b87f920bSLizhi Hou  * @opcode:	opcode for firmware
16b87f920bSLizhi Hou  * @handle:	handle used for the notify callback
17b87f920bSLizhi Hou  * @notify_cb:  callback function to notify the sender when there is response
18b87f920bSLizhi Hou  * @send_data:	pointing to sending data
19b87f920bSLizhi Hou  * @send_size:	size of the sending data
20b87f920bSLizhi Hou  *
21b87f920bSLizhi Hou  * The mailbox will split the sending data in to multiple firmware message if
22b87f920bSLizhi Hou  * the size of the data is too big. This is transparent to the sender. The
23b87f920bSLizhi Hou  * sender will receive one notification.
24b87f920bSLizhi Hou  */
25b87f920bSLizhi Hou struct xdna_mailbox_msg {
26b87f920bSLizhi Hou 	u32		opcode;
27b87f920bSLizhi Hou 	void		*handle;
28*41257629SLizhi Hou 	int		(*notify_cb)(void *handle, void __iomem *data, size_t size);
29b87f920bSLizhi Hou 	u8		*send_data;
30b87f920bSLizhi Hou 	size_t		send_size;
31b87f920bSLizhi Hou };
32b87f920bSLizhi Hou 
33b87f920bSLizhi Hou /*
34b87f920bSLizhi Hou  * xdna_mailbox_res - mailbox hardware resource
35b87f920bSLizhi Hou  *
36b87f920bSLizhi Hou  * @ringbuf_base:	ring buffer base address
37b87f920bSLizhi Hou  * @ringbuf_size:	ring buffer size
38b87f920bSLizhi Hou  * @mbox_base:		mailbox base address
39b87f920bSLizhi Hou  * @mbox_size:		mailbox size
40b87f920bSLizhi Hou  */
41b87f920bSLizhi Hou struct xdna_mailbox_res {
423c8cfec3SLizhi Hou 	void __iomem	*ringbuf_base;
43b87f920bSLizhi Hou 	size_t		ringbuf_size;
443c8cfec3SLizhi Hou 	void __iomem	*mbox_base;
45b87f920bSLizhi Hou 	size_t		mbox_size;
46b87f920bSLizhi Hou 	const char	*name;
47b87f920bSLizhi Hou };
48b87f920bSLizhi Hou 
49b87f920bSLizhi Hou /*
50b87f920bSLizhi Hou  * xdna_mailbox_chann_res - resources
51b87f920bSLizhi Hou  *
52b87f920bSLizhi Hou  * @rb_start_addr:	ring buffer start address
53b87f920bSLizhi Hou  * @rb_size:		ring buffer size
54b87f920bSLizhi Hou  * @mb_head_ptr_reg:	mailbox head pointer register
55b87f920bSLizhi Hou  * @mb_tail_ptr_reg:	mailbox tail pointer register
56b87f920bSLizhi Hou  */
57b87f920bSLizhi Hou struct xdna_mailbox_chann_res {
58b87f920bSLizhi Hou 	u32 rb_start_addr;
59b87f920bSLizhi Hou 	u32 rb_size;
60b87f920bSLizhi Hou 	u32 mb_head_ptr_reg;
61b87f920bSLizhi Hou 	u32 mb_tail_ptr_reg;
62b87f920bSLizhi Hou };
63b87f920bSLizhi Hou 
64b87f920bSLizhi Hou /*
65b87f920bSLizhi Hou  * xdna_mailbox_create() -- create mailbox subsystem and initialize
66b87f920bSLizhi Hou  *
67b87f920bSLizhi Hou  * @ddev: device pointer
68b87f920bSLizhi Hou  * @res: SRAM and mailbox resources
69b87f920bSLizhi Hou  *
70b87f920bSLizhi Hou  * Return: If success, return a handle of mailbox subsystem.
71b87f920bSLizhi Hou  * Otherwise, return NULL pointer.
72b87f920bSLizhi Hou  */
73b87f920bSLizhi Hou struct mailbox *xdnam_mailbox_create(struct drm_device *ddev,
74b87f920bSLizhi Hou 				     const struct xdna_mailbox_res *res);
75b87f920bSLizhi Hou 
76b87f920bSLizhi Hou /*
77b87f920bSLizhi Hou  * xdna_mailbox_create_channel() -- Create a mailbox channel instance
78b87f920bSLizhi Hou  *
79b87f920bSLizhi Hou  * @mailbox: the handle return from xdna_mailbox_create()
80b87f920bSLizhi Hou  * @x2i: host to firmware mailbox resources
81b87f920bSLizhi Hou  * @i2x: firmware to host mailbox resources
82b87f920bSLizhi Hou  * @xdna_mailbox_intr_reg: register addr of MSI-X interrupt
83b87f920bSLizhi Hou  * @mb_irq: Linux IRQ number associated with mailbox MSI-X interrupt vector index
84b87f920bSLizhi Hou  *
85b87f920bSLizhi Hou  * Return: If success, return a handle of mailbox channel. Otherwise, return NULL.
86b87f920bSLizhi Hou  */
87b87f920bSLizhi Hou struct mailbox_channel *
88b87f920bSLizhi Hou xdna_mailbox_create_channel(struct mailbox *mailbox,
89b87f920bSLizhi Hou 			    const struct xdna_mailbox_chann_res *x2i,
90b87f920bSLizhi Hou 			    const struct xdna_mailbox_chann_res *i2x,
91b87f920bSLizhi Hou 			    u32 xdna_mailbox_intr_reg,
92b87f920bSLizhi Hou 			    int mb_irq);
93b87f920bSLizhi Hou 
94b87f920bSLizhi Hou /*
95b87f920bSLizhi Hou  * xdna_mailbox_destroy_channel() -- destroy mailbox channel
96b87f920bSLizhi Hou  *
97b87f920bSLizhi Hou  * @mailbox_chann: the handle return from xdna_mailbox_create_channel()
98b87f920bSLizhi Hou  *
99b87f920bSLizhi Hou  * Return: if success, return 0. otherwise return error code
100b87f920bSLizhi Hou  */
101b87f920bSLizhi Hou int xdna_mailbox_destroy_channel(struct mailbox_channel *mailbox_chann);
102b87f920bSLizhi Hou 
103b87f920bSLizhi Hou /*
104b87f920bSLizhi Hou  * xdna_mailbox_stop_channel() -- stop mailbox channel
105b87f920bSLizhi Hou  *
106b87f920bSLizhi Hou  * @mailbox_chann: the handle return from xdna_mailbox_create_channel()
107b87f920bSLizhi Hou  *
108b87f920bSLizhi Hou  * Return: if success, return 0. otherwise return error code
109b87f920bSLizhi Hou  */
110b87f920bSLizhi Hou void xdna_mailbox_stop_channel(struct mailbox_channel *mailbox_chann);
111b87f920bSLizhi Hou 
112b87f920bSLizhi Hou /*
113b87f920bSLizhi Hou  * xdna_mailbox_send_msg() -- Send a message
114b87f920bSLizhi Hou  *
115b87f920bSLizhi Hou  * @mailbox_chann: Mailbox channel handle
116b87f920bSLizhi Hou  * @msg: message struct for message information
117b87f920bSLizhi Hou  * @tx_timeout: the timeout value for sending the message in ms.
118b87f920bSLizhi Hou  *
119b87f920bSLizhi Hou  * Return: If success return 0, otherwise, return error code
120b87f920bSLizhi Hou  */
121b87f920bSLizhi Hou int xdna_mailbox_send_msg(struct mailbox_channel *mailbox_chann,
122b87f920bSLizhi Hou 			  const struct xdna_mailbox_msg *msg, u64 tx_timeout);
123b87f920bSLizhi Hou 
124b87f920bSLizhi Hou #endif /* _AIE2_MAILBOX_ */
125