xref: /freebsd/sys/dev/qat/include/common/adf_pfvf_msg.h (revision ded037e65e5239671b1292ec987a2e0894b217b5)
1266b0663SKrzysztof Zdziarski /* SPDX-License-Identifier: BSD-3-Clause */
2*ded037e6SHareshx Sankar Raj /* Copyright(c) 2007-2025 Intel Corporation */
3266b0663SKrzysztof Zdziarski #ifndef ADF_PFVF_MSG_H
4266b0663SKrzysztof Zdziarski #define ADF_PFVF_MSG_H
5266b0663SKrzysztof Zdziarski 
6266b0663SKrzysztof Zdziarski /*
7266b0663SKrzysztof Zdziarski  * PF<->VF Gen2 Messaging format
8266b0663SKrzysztof Zdziarski  *
9266b0663SKrzysztof Zdziarski  * The PF has an array of 32-bit PF2VF registers, one for each VF. The
10266b0663SKrzysztof Zdziarski  * PF can access all these registers while each VF can access only the one
11266b0663SKrzysztof Zdziarski  * register associated with that particular VF.
12266b0663SKrzysztof Zdziarski  *
13266b0663SKrzysztof Zdziarski  * The register functionally is split into two parts:
14266b0663SKrzysztof Zdziarski  * The bottom half is for PF->VF messages. In particular when the first
15266b0663SKrzysztof Zdziarski  * bit of this register (bit 0) gets set an interrupt will be triggered
16266b0663SKrzysztof Zdziarski  * in the respective VF.
17266b0663SKrzysztof Zdziarski  * The top half is for VF->PF messages. In particular when the first bit
18266b0663SKrzysztof Zdziarski  * of this half of register (bit 16) gets set an interrupt will be triggered
19266b0663SKrzysztof Zdziarski  * in the PF.
20266b0663SKrzysztof Zdziarski  *
21266b0663SKrzysztof Zdziarski  * The remaining bits within this register are available to encode messages.
22266b0663SKrzysztof Zdziarski  * and implement a collision control mechanism to prevent concurrent use of
23266b0663SKrzysztof Zdziarski  * the PF2VF register by both the PF and VF.
24266b0663SKrzysztof Zdziarski  *
25266b0663SKrzysztof Zdziarski  *  31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
26266b0663SKrzysztof Zdziarski  *  _______________________________________________
27266b0663SKrzysztof Zdziarski  * |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
28266b0663SKrzysztof Zdziarski  * +-----------------------------------------------+
29266b0663SKrzysztof Zdziarski  *  \___________________________/ \_________/ ^   ^
30266b0663SKrzysztof Zdziarski  *                ^                    ^      |   |
31266b0663SKrzysztof Zdziarski  *                |                    |      |   VF2PF Int
32266b0663SKrzysztof Zdziarski  *                |                    |      Message Origin
33266b0663SKrzysztof Zdziarski  *                |                    Message Type
34266b0663SKrzysztof Zdziarski  *                Message-specific Data/Reserved
35266b0663SKrzysztof Zdziarski  *
36266b0663SKrzysztof Zdziarski  *  15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
37266b0663SKrzysztof Zdziarski  *  _______________________________________________
38266b0663SKrzysztof Zdziarski  * |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
39266b0663SKrzysztof Zdziarski  * +-----------------------------------------------+
40266b0663SKrzysztof Zdziarski  *  \___________________________/ \_________/ ^   ^
41266b0663SKrzysztof Zdziarski  *                ^                    ^      |   |
42266b0663SKrzysztof Zdziarski  *                |                    |      |   PF2VF Int
43266b0663SKrzysztof Zdziarski  *                |                    |      Message Origin
44266b0663SKrzysztof Zdziarski  *                |                    Message Type
45266b0663SKrzysztof Zdziarski  *                Message-specific Data/Reserved
46266b0663SKrzysztof Zdziarski  *
47266b0663SKrzysztof Zdziarski  * Message Origin (Should always be 1)
48266b0663SKrzysztof Zdziarski  * A legacy out-of-tree QAT driver allowed for a set of messages not supported
49266b0663SKrzysztof Zdziarski  * by this driver; these had a Msg Origin of 0 and are ignored by this driver.
50266b0663SKrzysztof Zdziarski  *
51266b0663SKrzysztof Zdziarski  * When a PF or VF attempts to send a message in the lower or upper 16 bits,
52266b0663SKrzysztof Zdziarski  * respectively, the other 16 bits are written to first with a defined
53266b0663SKrzysztof Zdziarski  * IN_USE_BY pattern as part of a collision control scheme (see function
54266b0663SKrzysztof Zdziarski  * adf_gen2_pfvf_send() in adf_pf2vf_msg.c).
55266b0663SKrzysztof Zdziarski  *
56266b0663SKrzysztof Zdziarski  *
57266b0663SKrzysztof Zdziarski  * PF<->VF Gen4 Messaging format
58266b0663SKrzysztof Zdziarski  *
59266b0663SKrzysztof Zdziarski  * Similarly to the gen2 messaging format, 32-bit long registers are used for
60266b0663SKrzysztof Zdziarski  * communication between PF and VFs. However, each VF and PF share a pair of
61266b0663SKrzysztof Zdziarski  * 32-bits register to avoid collisions: one for PV to VF messages and one
62266b0663SKrzysztof Zdziarski  * for VF to PF messages.
63266b0663SKrzysztof Zdziarski  *
64266b0663SKrzysztof Zdziarski  * Both the Interrupt bit and the Message Origin bit retain the same position
65266b0663SKrzysztof Zdziarski  * and meaning, although non-system messages are now deprecated and not
66266b0663SKrzysztof Zdziarski  * expected.
67266b0663SKrzysztof Zdziarski  *
68266b0663SKrzysztof Zdziarski  *  31 30              9  8  7  6  5  4  3  2  1  0
69266b0663SKrzysztof Zdziarski  *  _______________________________________________
70266b0663SKrzysztof Zdziarski  * |  |  |   . . .   |  |  |  |  |  |  |  |  |  |  |
71266b0663SKrzysztof Zdziarski  * +-----------------------------------------------+
72266b0663SKrzysztof Zdziarski  *  \_____________________/ \_______________/  ^  ^
73266b0663SKrzysztof Zdziarski  *             ^                     ^         |  |
74266b0663SKrzysztof Zdziarski  *             |                     |         |  PF/VF Int
75266b0663SKrzysztof Zdziarski  *             |                     |         Message Origin
76266b0663SKrzysztof Zdziarski  *             |                     Message Type
77266b0663SKrzysztof Zdziarski  *             Message-specific Data/Reserved
78266b0663SKrzysztof Zdziarski  *
79266b0663SKrzysztof Zdziarski  * For both formats, the message reception is acknowledged by lowering the
80266b0663SKrzysztof Zdziarski  * interrupt bit on the register where the message was sent.
81266b0663SKrzysztof Zdziarski  */
82266b0663SKrzysztof Zdziarski 
83266b0663SKrzysztof Zdziarski /* PFVF message common bits */
84266b0663SKrzysztof Zdziarski #define ADF_PFVF_INT BIT(0)
85266b0663SKrzysztof Zdziarski #define ADF_PFVF_MSGORIGIN_SYSTEM BIT(1)
86266b0663SKrzysztof Zdziarski 
87266b0663SKrzysztof Zdziarski /* Different generations have different CSR layouts, use this struct
88266b0663SKrzysztof Zdziarski  * to abstract these differences away
89266b0663SKrzysztof Zdziarski  */
90266b0663SKrzysztof Zdziarski struct pfvf_message {
91266b0663SKrzysztof Zdziarski 	u8 type;
92266b0663SKrzysztof Zdziarski 	u32 data;
93266b0663SKrzysztof Zdziarski };
94266b0663SKrzysztof Zdziarski 
95266b0663SKrzysztof Zdziarski /* PF->VF messages */
96266b0663SKrzysztof Zdziarski enum pf2vf_msgtype {
97266b0663SKrzysztof Zdziarski 	ADF_PF2VF_MSGTYPE_RESTARTING = 0x01,
98266b0663SKrzysztof Zdziarski 	ADF_PF2VF_MSGTYPE_VERSION_RESP = 0x02,
99266b0663SKrzysztof Zdziarski 	ADF_PF2VF_MSGTYPE_BLKMSG_RESP = 0x03,
100*ded037e6SHareshx Sankar Raj 	ADF_PF2VF_MSGTYPE_FATAL_ERROR = 0x04,
101266b0663SKrzysztof Zdziarski 	/* Values from 0x10 are Gen4 specific, message type is only 4 bits in
102266b0663SKrzysztof Zdziarski 	   Gen2 devices. */
103266b0663SKrzysztof Zdziarski 	ADF_PF2VF_MSGTYPE_RP_RESET_RESP = 0x10,
104266b0663SKrzysztof Zdziarski };
105266b0663SKrzysztof Zdziarski 
106266b0663SKrzysztof Zdziarski /* VF->PF messages */
107266b0663SKrzysztof Zdziarski enum vf2pf_msgtype {
108266b0663SKrzysztof Zdziarski 	ADF_VF2PF_MSGTYPE_INIT = 0x03,
109266b0663SKrzysztof Zdziarski 	ADF_VF2PF_MSGTYPE_SHUTDOWN = 0x04,
110266b0663SKrzysztof Zdziarski 	ADF_VF2PF_MSGTYPE_VERSION_REQ = 0x05,
111266b0663SKrzysztof Zdziarski 	ADF_VF2PF_MSGTYPE_COMPAT_VER_REQ = 0x06,
112266b0663SKrzysztof Zdziarski 	ADF_VF2PF_MSGTYPE_LARGE_BLOCK_REQ = 0x07,
113266b0663SKrzysztof Zdziarski 	ADF_VF2PF_MSGTYPE_MEDIUM_BLOCK_REQ = 0x08,
114266b0663SKrzysztof Zdziarski 	ADF_VF2PF_MSGTYPE_SMALL_BLOCK_REQ = 0x09,
115*ded037e6SHareshx Sankar Raj 	ADF_VF2PF_MSGTYPE_RESTARTING_COMPLETE = 0x0a,
116266b0663SKrzysztof Zdziarski 	/* Values from 0x10 are Gen4 specific, message type is only 4 bits in
117266b0663SKrzysztof Zdziarski 	   Gen2 devices. */
118266b0663SKrzysztof Zdziarski 	ADF_VF2PF_MSGTYPE_RP_RESET = 0x10,
119266b0663SKrzysztof Zdziarski };
120266b0663SKrzysztof Zdziarski 
121266b0663SKrzysztof Zdziarski /* VF/PF compatibility version. */
122266b0663SKrzysztof Zdziarski enum pfvf_compatibility_version {
123266b0663SKrzysztof Zdziarski 	/* Support for extended capabilities */
124266b0663SKrzysztof Zdziarski 	ADF_PFVF_COMPAT_CAPABILITIES = 0x02,
125266b0663SKrzysztof Zdziarski 	/* In-use pattern cleared by receiver */
126266b0663SKrzysztof Zdziarski 	ADF_PFVF_COMPAT_FAST_ACK = 0x03,
127266b0663SKrzysztof Zdziarski 	/* Ring to service mapping support for non-standard mappings */
128266b0663SKrzysztof Zdziarski 	ADF_PFVF_COMPAT_RING_TO_SVC_MAP = 0x04,
129*ded037e6SHareshx Sankar Raj 	/* Fallback compat */
130*ded037e6SHareshx Sankar Raj 	ADF_PFVF_COMPAT_FALLBACK = 0x05,
131266b0663SKrzysztof Zdziarski 	/* Reference to the latest version */
132*ded037e6SHareshx Sankar Raj 	ADF_PFVF_COMPAT_THIS_VERSION = 0x05,
133266b0663SKrzysztof Zdziarski };
134266b0663SKrzysztof Zdziarski 
135266b0663SKrzysztof Zdziarski /* PF->VF Version Response */
136266b0663SKrzysztof Zdziarski #define ADF_PF2VF_VERSION_RESP_VERS_MASK GENMASK(7, 0)
137266b0663SKrzysztof Zdziarski #define ADF_PF2VF_VERSION_RESP_RESULT_MASK GENMASK(9, 8)
138266b0663SKrzysztof Zdziarski 
139266b0663SKrzysztof Zdziarski enum pf2vf_compat_response {
140266b0663SKrzysztof Zdziarski 	ADF_PF2VF_VF_COMPATIBLE = 0x01,
141266b0663SKrzysztof Zdziarski 	ADF_PF2VF_VF_INCOMPATIBLE = 0x02,
142266b0663SKrzysztof Zdziarski 	ADF_PF2VF_VF_COMPAT_UNKNOWN = 0x03,
143266b0663SKrzysztof Zdziarski };
144266b0663SKrzysztof Zdziarski 
145266b0663SKrzysztof Zdziarski enum ring_reset_result {
146266b0663SKrzysztof Zdziarski 	RPRESET_SUCCESS = 0x00,
147266b0663SKrzysztof Zdziarski 	RPRESET_NOT_SUPPORTED = 0x01,
148266b0663SKrzysztof Zdziarski 	RPRESET_INVAL_BANK = 0x02,
149266b0663SKrzysztof Zdziarski 	RPRESET_TIMEOUT = 0x03,
150266b0663SKrzysztof Zdziarski };
151266b0663SKrzysztof Zdziarski 
152266b0663SKrzysztof Zdziarski #define ADF_VF2PF_RNG_RESET_RP_MASK GENMASK(1, 0)
153266b0663SKrzysztof Zdziarski #define ADF_VF2PF_RNG_RESET_RSVD_MASK GENMASK(25, 2)
154266b0663SKrzysztof Zdziarski 
155266b0663SKrzysztof Zdziarski /* PF->VF Block Responses */
156266b0663SKrzysztof Zdziarski #define ADF_PF2VF_BLKMSG_RESP_TYPE_MASK GENMASK(1, 0)
157266b0663SKrzysztof Zdziarski #define ADF_PF2VF_BLKMSG_RESP_DATA_MASK GENMASK(9, 2)
158266b0663SKrzysztof Zdziarski 
159266b0663SKrzysztof Zdziarski enum pf2vf_blkmsg_resp_type {
160266b0663SKrzysztof Zdziarski 	ADF_PF2VF_BLKMSG_RESP_TYPE_DATA = 0x00,
161266b0663SKrzysztof Zdziarski 	ADF_PF2VF_BLKMSG_RESP_TYPE_CRC = 0x01,
162266b0663SKrzysztof Zdziarski 	ADF_PF2VF_BLKMSG_RESP_TYPE_ERROR = 0x02,
163266b0663SKrzysztof Zdziarski };
164266b0663SKrzysztof Zdziarski 
165266b0663SKrzysztof Zdziarski /* PF->VF Block Error Code */
166266b0663SKrzysztof Zdziarski enum pf2vf_blkmsg_error {
167266b0663SKrzysztof Zdziarski 	ADF_PF2VF_INVALID_BLOCK_TYPE = 0x00,
168266b0663SKrzysztof Zdziarski 	ADF_PF2VF_INVALID_BYTE_NUM_REQ = 0x01,
169266b0663SKrzysztof Zdziarski 	ADF_PF2VF_PAYLOAD_TRUNCATED = 0x02,
170266b0663SKrzysztof Zdziarski 	ADF_PF2VF_UNSPECIFIED_ERROR = 0x03,
171266b0663SKrzysztof Zdziarski };
172266b0663SKrzysztof Zdziarski 
173266b0663SKrzysztof Zdziarski /* VF->PF Block Requests */
174266b0663SKrzysztof Zdziarski #define ADF_VF2PF_LARGE_BLOCK_TYPE_MASK GENMASK(1, 0)
175266b0663SKrzysztof Zdziarski #define ADF_VF2PF_LARGE_BLOCK_BYTE_MASK GENMASK(8, 2)
176266b0663SKrzysztof Zdziarski #define ADF_VF2PF_MEDIUM_BLOCK_TYPE_MASK GENMASK(2, 0)
177266b0663SKrzysztof Zdziarski #define ADF_VF2PF_MEDIUM_BLOCK_BYTE_MASK GENMASK(8, 3)
178266b0663SKrzysztof Zdziarski #define ADF_VF2PF_SMALL_BLOCK_TYPE_MASK GENMASK(3, 0)
179266b0663SKrzysztof Zdziarski #define ADF_VF2PF_SMALL_BLOCK_BYTE_MASK GENMASK(8, 4)
180266b0663SKrzysztof Zdziarski #define ADF_VF2PF_BLOCK_CRC_REQ_MASK BIT(9)
181266b0663SKrzysztof Zdziarski 
182266b0663SKrzysztof Zdziarski /* PF->VF Block Request Types
183266b0663SKrzysztof Zdziarski  *  0..15 - 32 byte message
184266b0663SKrzysztof Zdziarski  * 16..23 - 64 byte message
185266b0663SKrzysztof Zdziarski  * 24..27 - 128 byte message
186266b0663SKrzysztof Zdziarski  */
187266b0663SKrzysztof Zdziarski enum vf2pf_blkmsg_req_type {
188266b0663SKrzysztof Zdziarski 	ADF_VF2PF_BLKMSG_REQ_CAP_SUMMARY = 0x02,
189266b0663SKrzysztof Zdziarski 	ADF_VF2PF_BLKMSG_REQ_RING_SVC_MAP = 0x03,
190266b0663SKrzysztof Zdziarski };
191266b0663SKrzysztof Zdziarski 
192266b0663SKrzysztof Zdziarski #define ADF_VF2PF_SMALL_BLOCK_TYPE_MAX                                         \
193266b0663SKrzysztof Zdziarski 	(FIELD_MAX(ADF_VF2PF_SMALL_BLOCK_TYPE_MASK))
194266b0663SKrzysztof Zdziarski 
195266b0663SKrzysztof Zdziarski #define ADF_VF2PF_MEDIUM_BLOCK_TYPE_MAX                                        \
196266b0663SKrzysztof Zdziarski 	(FIELD_MAX(ADF_VF2PF_MEDIUM_BLOCK_TYPE_MASK) +                         \
197266b0663SKrzysztof Zdziarski 	 ADF_VF2PF_SMALL_BLOCK_TYPE_MAX + 1)
198266b0663SKrzysztof Zdziarski 
199266b0663SKrzysztof Zdziarski #define ADF_VF2PF_LARGE_BLOCK_TYPE_MAX                                         \
200266b0663SKrzysztof Zdziarski 	(FIELD_MAX(ADF_VF2PF_LARGE_BLOCK_TYPE_MASK) +                          \
201266b0663SKrzysztof Zdziarski 	 ADF_VF2PF_MEDIUM_BLOCK_TYPE_MAX)
202266b0663SKrzysztof Zdziarski 
203266b0663SKrzysztof Zdziarski #define ADF_VF2PF_SMALL_BLOCK_BYTE_MAX                                         \
204266b0663SKrzysztof Zdziarski 	FIELD_MAX(ADF_VF2PF_SMALL_BLOCK_BYTE_MASK)
205266b0663SKrzysztof Zdziarski 
206266b0663SKrzysztof Zdziarski #define ADF_VF2PF_MEDIUM_BLOCK_BYTE_MAX                                        \
207266b0663SKrzysztof Zdziarski 	FIELD_MAX(ADF_VF2PF_MEDIUM_BLOCK_BYTE_MASK)
208266b0663SKrzysztof Zdziarski 
209266b0663SKrzysztof Zdziarski #define ADF_VF2PF_LARGE_BLOCK_BYTE_MAX                                         \
210266b0663SKrzysztof Zdziarski 	FIELD_MAX(ADF_VF2PF_LARGE_BLOCK_BYTE_MASK)
211266b0663SKrzysztof Zdziarski 
212266b0663SKrzysztof Zdziarski struct pfvf_blkmsg_header {
213266b0663SKrzysztof Zdziarski 	u8 version;
214266b0663SKrzysztof Zdziarski 	u8 payload_size;
215266b0663SKrzysztof Zdziarski } __packed;
216266b0663SKrzysztof Zdziarski 
217266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_HEADER_SIZE (sizeof(struct pfvf_blkmsg_header))
218266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_PAYLOAD_SIZE(blkmsg)                                   \
219266b0663SKrzysztof Zdziarski 	(sizeof(blkmsg) - ADF_PFVF_BLKMSG_HEADER_SIZE)
220266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_MSG_SIZE(blkmsg)                                       \
221266b0663SKrzysztof Zdziarski 	(ADF_PFVF_BLKMSG_HEADER_SIZE + (blkmsg)->hdr.payload_size)
222266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_MSG_MAX_SIZE 128
223266b0663SKrzysztof Zdziarski 
224266b0663SKrzysztof Zdziarski /* PF->VF Block message header bytes */
225266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_VER_BYTE 0
226266b0663SKrzysztof Zdziarski #define ADF_PFVF_BLKMSG_LEN_BYTE 1
227266b0663SKrzysztof Zdziarski 
228266b0663SKrzysztof Zdziarski /* PF/VF Capabilities message values */
229266b0663SKrzysztof Zdziarski enum blkmsg_capabilities_versions {
230266b0663SKrzysztof Zdziarski 	ADF_PFVF_CAPABILITIES_V1_VERSION = 0x01,
231266b0663SKrzysztof Zdziarski 	ADF_PFVF_CAPABILITIES_V2_VERSION = 0x02,
232266b0663SKrzysztof Zdziarski 	ADF_PFVF_CAPABILITIES_V3_VERSION = 0x03,
233266b0663SKrzysztof Zdziarski };
234266b0663SKrzysztof Zdziarski 
235266b0663SKrzysztof Zdziarski struct capabilities_v1 {
236266b0663SKrzysztof Zdziarski 	struct pfvf_blkmsg_header hdr;
237266b0663SKrzysztof Zdziarski 	u32 ext_dc_caps;
238266b0663SKrzysztof Zdziarski } __packed;
239266b0663SKrzysztof Zdziarski 
240266b0663SKrzysztof Zdziarski struct capabilities_v2 {
241266b0663SKrzysztof Zdziarski 	struct pfvf_blkmsg_header hdr;
242266b0663SKrzysztof Zdziarski 	u32 ext_dc_caps;
243266b0663SKrzysztof Zdziarski 	u32 capabilities;
244266b0663SKrzysztof Zdziarski } __packed;
245266b0663SKrzysztof Zdziarski 
246266b0663SKrzysztof Zdziarski struct capabilities_v3 {
247266b0663SKrzysztof Zdziarski 	struct pfvf_blkmsg_header hdr;
248266b0663SKrzysztof Zdziarski 	u32 ext_dc_caps;
249266b0663SKrzysztof Zdziarski 	u32 capabilities;
250266b0663SKrzysztof Zdziarski 	u32 frequency;
251266b0663SKrzysztof Zdziarski } __packed;
252266b0663SKrzysztof Zdziarski 
253266b0663SKrzysztof Zdziarski /* PF/VF Ring to service mapping values */
254266b0663SKrzysztof Zdziarski enum blkmsg_ring_to_svc_versions {
255266b0663SKrzysztof Zdziarski 	ADF_PFVF_RING_TO_SVC_VERSION = 0x01,
256266b0663SKrzysztof Zdziarski };
257266b0663SKrzysztof Zdziarski 
258266b0663SKrzysztof Zdziarski struct ring_to_svc_map_v1 {
259266b0663SKrzysztof Zdziarski 	struct pfvf_blkmsg_header hdr;
260266b0663SKrzysztof Zdziarski 	u16 map;
261266b0663SKrzysztof Zdziarski } __packed;
262266b0663SKrzysztof Zdziarski 
263266b0663SKrzysztof Zdziarski #endif /* ADF_PFVF_MSG_H */
264