GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / net / ethernet / marvell / octeon_ep / octep_ctrl_mbox.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Marvell Octeon EP (EndPoint) Ethernet Driver
3  *
4  * Copyright (C) 2020 Marvell.
5  *
6  */
7  #ifndef __OCTEP_CTRL_MBOX_H__
8 #define __OCTEP_CTRL_MBOX_H__
9
10 /*              barmem structure
11  * |===========================================|
12  * |Info (16 + 120 + 120 = 256 bytes)          |
13  * |-------------------------------------------|
14  * |magic number (8 bytes)                     |
15  * |bar memory size (4 bytes)                  |
16  * |reserved (4 bytes)                         |
17  * |-------------------------------------------|
18  * |host version (8 bytes)                     |
19  * |    low 32 bits                            |
20  * |host status (8 bytes)                      |
21  * |host reserved (104 bytes)                  |
22  * |-------------------------------------------|
23  * |fw version's (8 bytes)                     |
24  * |    min=high 32 bits, max=low 32 bits      |
25  * |fw status (8 bytes)                        |
26  * |fw reserved (104 bytes)                    |
27  * |===========================================|
28  * |Host to Fw Queue info (16 bytes)           |
29  * |-------------------------------------------|
30  * |producer index (4 bytes)                   |
31  * |consumer index (4 bytes)                   |
32  * |max element size (4 bytes)                 |
33  * |reserved (4 bytes)                         |
34  * |===========================================|
35  * |Fw to Host Queue info (16 bytes)           |
36  * |-------------------------------------------|
37  * |producer index (4 bytes)                   |
38  * |consumer index (4 bytes)                   |
39  * |max element size (4 bytes)                 |
40  * |reserved (4 bytes)                         |
41  * |===========================================|
42  * |Host to Fw Queue ((total size-288/2) bytes)|
43  * |-------------------------------------------|
44  * |                                           |
45  * |===========================================|
46  * |===========================================|
47  * |Fw to Host Queue ((total size-288/2) bytes)|
48  * |-------------------------------------------|
49  * |                                           |
50  * |===========================================|
51  */
52
53 #define OCTEP_CTRL_MBOX_MAGIC_NUMBER                    0xdeaddeadbeefbeefull
54
55 /* Valid request message */
56 #define OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ                BIT(0)
57 /* Valid response message */
58 #define OCTEP_CTRL_MBOX_MSG_HDR_FLAG_RESP               BIT(1)
59 /* Valid notification, no response required */
60 #define OCTEP_CTRL_MBOX_MSG_HDR_FLAG_NOTIFY             BIT(2)
61 /* Valid custom message */
62 #define OCTEP_CTRL_MBOX_MSG_HDR_FLAG_CUSTOM             BIT(3)
63
64 #define OCTEP_CTRL_MBOX_MSG_DESC_MAX                    4
65
66 enum octep_ctrl_mbox_status {
67         OCTEP_CTRL_MBOX_STATUS_INVALID = 0,
68         OCTEP_CTRL_MBOX_STATUS_INIT,
69         OCTEP_CTRL_MBOX_STATUS_READY,
70         OCTEP_CTRL_MBOX_STATUS_UNINIT
71 };
72
73 /* mbox message */
74 union octep_ctrl_mbox_msg_hdr {
75         u64 words[2];
76         struct {
77                 /* must be 0 */
78                 u16 reserved1:15;
79                 /* vf_idx is valid if 1 */
80                 u16 is_vf:1;
81                 /* sender vf index 0-(n-1), 0 if (is_vf==0) */
82                 u16 vf_idx;
83                 /* total size of message excluding header */
84                 u32 sz;
85                 /* OCTEP_CTRL_MBOX_MSG_HDR_FLAG_* */
86                 u32 flags;
87                 /* identifier to match responses */
88                 u16 msg_id;
89                 u16 reserved2;
90         } s;
91 };
92
93 /* mbox message buffer */
94 struct octep_ctrl_mbox_msg_buf {
95         u32 reserved1;
96         u16 reserved2;
97         /* size of buffer */
98         u16 sz;
99         /* pointer to message buffer */
100         void *msg;
101 };
102
103 /* mbox message */
104 struct octep_ctrl_mbox_msg {
105         /* mbox transaction header */
106         union octep_ctrl_mbox_msg_hdr hdr;
107         /* number of sg buffer's */
108         int sg_num;
109         /* message buffer's */
110         struct octep_ctrl_mbox_msg_buf sg_list[OCTEP_CTRL_MBOX_MSG_DESC_MAX];
111 };
112
113 /* Mbox queue */
114 struct octep_ctrl_mbox_q {
115         /* size of queue buffer */
116         u32 sz;
117         /* producer address in bar mem */
118         u8 __iomem *hw_prod;
119         /* consumer address in bar mem */
120         u8 __iomem *hw_cons;
121         /* q base address in bar mem */
122         u8 __iomem *hw_q;
123 };
124
125 struct octep_ctrl_mbox {
126         /* control plane version */
127         u64 version;
128         /* size of bar memory */
129         u32 barmem_sz;
130         /* pointer to BAR memory */
131         u8 __iomem *barmem;
132         /* host-to-fw queue */
133         struct octep_ctrl_mbox_q h2fq;
134         /* fw-to-host queue */
135         struct octep_ctrl_mbox_q f2hq;
136         /* lock for h2fq */
137         struct mutex h2fq_lock;
138         /* lock for f2hq */
139         struct mutex f2hq_lock;
140         /* Min control plane version supported by firmware */
141         u32 min_fw_version;
142         /* Max control plane version supported by firmware */
143         u32 max_fw_version;
144 };
145
146 /* Initialize control mbox.
147  *
148  * @param mbox: non-null pointer to struct octep_ctrl_mbox.
149  *
150  * return value: 0 on success, -errno on failure.
151  */
152 int octep_ctrl_mbox_init(struct octep_ctrl_mbox *mbox);
153
154 /* Send mbox message.
155  *
156  * @param mbox: non-null pointer to struct octep_ctrl_mbox.
157  * @param msg:  non-null pointer to struct octep_ctrl_mbox_msg.
158  *              Caller should fill msg.sz and msg.desc.sz for each message.
159  *
160  * return value: 0 on success, -errno on failure.
161  */
162 int octep_ctrl_mbox_send(struct octep_ctrl_mbox *mbox, struct octep_ctrl_mbox_msg *msg);
163
164 /* Retrieve mbox message.
165  *
166  * @param mbox: non-null pointer to struct octep_ctrl_mbox.
167  * @param msg:  non-null pointer to struct octep_ctrl_mbox_msg.
168  *              Caller should fill msg.sz and msg.desc.sz for each message.
169  *
170  * return value: 0 on success, -errno on failure.
171  */
172 int octep_ctrl_mbox_recv(struct octep_ctrl_mbox *mbox, struct octep_ctrl_mbox_msg *msg);
173
174 /* Uninitialize control mbox.
175  *
176  * @param mbox: non-null pointer to struct octep_ctrl_mbox.
177  *
178  * return value: 0 on success, -errno on failure.
179  */
180 int octep_ctrl_mbox_uninit(struct octep_ctrl_mbox *mbox);
181
182 #endif /* __OCTEP_CTRL_MBOX_H__ */