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