New upstream version 18.11-rc1
[deb_dpdk.git] / drivers / net / bnxt / hsi_struct_def_dpdk.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2014-2018 Broadcom Limited
3  * All rights reserved.
4  *
5  * DO NOT MODIFY!!! This file is automatically generated.
6  */
7
8 #ifndef _HSI_STRUCT_DEF_DPDK_H_
9 #define _HSI_STRUCT_DEF_DPDK_H_
10
11 /* This is the HWRM command header. */
12 /* hwrm_cmd_hdr (size:128b/16B) */
13 struct hwrm_cmd_hdr {
14         /* The HWRM command request type. */
15         uint16_t        req_type;
16         /*
17          * The completion ring to send the completion event on. This should
18          * be the NQ ID returned from the `nq_alloc` HWRM command.
19          */
20         uint16_t        cmpl_ring;
21         /*
22          * The sequence ID is used by the driver for tracking multiple
23          * commands. This ID is treated as opaque data by the firmware and
24          * the value is returned in the `hwrm_resp_hdr` upon completion.
25          */
26         uint16_t        seq_id;
27         /*
28          * The target ID of the command:
29          * * 0x0-0xFFF8 - The function ID
30          * * 0xFFF8-0xFFFE - Reserved for internal processors
31          * * 0xFFFF - HWRM
32          */
33         uint16_t        target_id;
34         /*
35          * A physical address pointer pointing to a host buffer that the
36          * command's response data will be written. This can be either a host
37          * physical address (HPA) or a guest physical address (GPA) and must
38          * point to a physically contiguous block of memory.
39          */
40         uint64_t        resp_addr;
41 } __attribute__((packed));
42
43 /* This is the HWRM response header. */
44 /* hwrm_resp_hdr (size:64b/8B) */
45 struct hwrm_resp_hdr {
46         /* The specific error status for the command. */
47         uint16_t        error_code;
48         /* The HWRM command request type. */
49         uint16_t        req_type;
50         /* The sequence ID from the original command. */
51         uint16_t        seq_id;
52         /* The length of the response data in number of bytes. */
53         uint16_t        resp_len;
54 } __attribute__((packed));
55
56 /*
57  * TLV encapsulated message. Use the TLV type field of the
58  * TLV to determine the type of message encapsulated.
59  */
60 #define CMD_DISCR_TLV_ENCAP UINT32_C(0x8000)
61 #define CMD_DISCR_LAST     CMD_DISCR_TLV_ENCAP
62
63
64 /* HWRM request message */
65 #define TLV_TYPE_HWRM_REQUEST                    UINT32_C(0x1)
66 /* HWRM response message */
67 #define TLV_TYPE_HWRM_RESPONSE                   UINT32_C(0x2)
68 /* RoCE slow path command */
69 #define TLV_TYPE_ROCE_SP_COMMAND                 UINT32_C(0x3)
70 /* RoCE slow path command to query CC Gen1 support. */
71 #define TLV_TYPE_QUERY_ROCE_CC_GEN1              UINT32_C(0xcommand 0x0005)
72 /* RoCE slow path command to modify CC Gen1 support. */
73 #define TLV_TYPE_MODIFY_ROCE_CC_GEN1             UINT32_C(0xcommand 0x0005)
74 /* Engine CKV - The device's serial number. */
75 #define TLV_TYPE_ENGINE_CKV_DEVICE_SERIAL_NUMBER UINT32_C(0x8001)
76 /* Engine CKV - Per-function random nonce data. */
77 #define TLV_TYPE_ENGINE_CKV_NONCE                UINT32_C(0x8002)
78 /* Engine CKV - Initialization vector. */
79 #define TLV_TYPE_ENGINE_CKV_IV                   UINT32_C(0x8003)
80 /* Engine CKV - Authentication tag. */
81 #define TLV_TYPE_ENGINE_CKV_AUTH_TAG             UINT32_C(0x8004)
82 /* Engine CKV - The encrypted data. */
83 #define TLV_TYPE_ENGINE_CKV_CIPHERTEXT           UINT32_C(0x8005)
84 /* Engine CKV - Supported algorithms. */
85 #define TLV_TYPE_ENGINE_CKV_ALGORITHMS           UINT32_C(0x8006)
86 /* Engine CKV - The EC curve name and ECC public key information. */
87 #define TLV_TYPE_ENGINE_CKV_ECC_PUBLIC_KEY       UINT32_C(0x8007)
88 /* Engine CKV - The ECDSA signature. */
89 #define TLV_TYPE_ENGINE_CKV_ECDSA_SIGNATURE      UINT32_C(0x8008)
90 #define TLV_TYPE_LAST \
91         TLV_TYPE_ENGINE_CKV_ECDSA_SIGNATURE
92
93
94 /* tlv (size:64b/8B) */
95 struct tlv {
96         /*
97          * The command discriminator is used to differentiate between various
98          * types of HWRM messages. This includes legacy HWRM and RoCE slowpath
99          * command messages as well as newer TLV encapsulated HWRM commands.
100          *
101          * For TLV encapsulated messages this field must be 0x8000.
102          */
103         uint16_t        cmd_discr;
104         uint8_t reserved_8b;
105         uint8_t flags;
106         /*
107          * Indicates the presence of additional TLV encapsulated data
108          * follows this TLV.
109          */
110         #define TLV_FLAGS_MORE         UINT32_C(0x1)
111         /* Last TLV in a sequence of TLVs. */
112         #define TLV_FLAGS_MORE_LAST      UINT32_C(0x0)
113         /* More TLVs follow this TLV. */
114         #define TLV_FLAGS_MORE_NOT_LAST  UINT32_C(0x1)
115         /*
116          * When an HWRM receiver detects a TLV type that it does not
117          * support with the TLV required flag set, the receiver must
118          * reject the HWRM message with an error code indicating an
119          * unsupported TLV type.
120          */
121         #define TLV_FLAGS_REQUIRED     UINT32_C(0x2)
122         /* No */
123         #define TLV_FLAGS_REQUIRED_NO    (UINT32_C(0x0) << 1)
124         /* Yes */
125         #define TLV_FLAGS_REQUIRED_YES   (UINT32_C(0x1) << 1)
126         #define TLV_FLAGS_REQUIRED_LAST TLV_FLAGS_REQUIRED_YES
127         /*
128          * This field defines the TLV type value which is divided into
129          * two ranges to differentiate between global and local TLV types.
130          * Global TLV types must be unique across all defined TLV types.
131          * Local TLV types are valid only for extensions to a given
132          * HWRM message and may be repeated across different HWRM message
133          * types. There is a direct correlation of each HWRM message type
134          * to a single global TLV type value.
135          *
136          * Global TLV range: `0 - (63k-1)`
137          *
138          * Local TLV range: `63k - (64k-1)`
139          */
140         uint16_t        tlv_type;
141         /*
142          * Length of the message data encapsulated by this TLV in bytes.
143          * This length does not include the size of the TLV header itself
144          * and it must be an integer multiple of 8B.
145          */
146         uint16_t        length;
147 } __attribute__((packed));
148
149 /* Input */
150 /* input (size:128b/16B) */
151 struct input {
152         /*
153          * This value indicates what type of request this is.  The format
154          * for the rest of the command is determined by this field.
155          */
156         uint16_t        req_type;
157         /*
158          * This value indicates the what completion ring the request will
159          * be optionally completed on.  If the value is -1, then no
160          * CR completion will be generated.  Any other value must be a
161          * valid CR ring_id value for this function.
162          */
163         uint16_t        cmpl_ring;
164         /* This value indicates the command sequence number. */
165         uint16_t        seq_id;
166         /*
167          * Target ID of this command.
168          *
169          * 0x0 - 0xFFF8 - Used for function ids
170          * 0xFFF8 - 0xFFFE - Reserved for internal processors
171          * 0xFFFF - HWRM
172          */
173         uint16_t        target_id;
174         /*
175          * This is the host address where the response will be written
176          * when the request is complete.  This area must be 16B aligned
177          * and must be cleared to zero before the request is made.
178          */
179         uint64_t        resp_addr;
180 } __attribute__((packed));
181
182 /* Output */
183 /* output (size:64b/8B) */
184 struct output {
185         /*
186          * Pass/Fail or error type
187          *
188          * Note: receiver to verify the in parameters, and fail the call
189          * with an error when appropriate
190          */
191         uint16_t        error_code;
192         /* This field returns the type of original request. */
193         uint16_t        req_type;
194         /* This field provides original sequence number of the command. */
195         uint16_t        seq_id;
196         /*
197          * This field is the length of the response in bytes.  The
198          * last byte of the response is a valid flag that will read
199          * as '1' when the command has been completely written to
200          * memory.
201          */
202         uint16_t        resp_len;
203 } __attribute__((packed));
204
205 /* Short Command Structure */
206 /* hwrm_short_input (size:128b/16B) */
207 struct hwrm_short_input {
208         /*
209          * This field indicates the type of request in the request buffer.
210          * The format for the rest of the command (request) is determined
211          * by this field.
212          */
213         uint16_t        req_type;
214         /*
215          * This field indicates a signature that is used to identify short
216          * form of the command listed here. This field shall be set to
217          * 17185 (0x4321).
218          */
219         uint16_t        signature;
220         /* Signature indicating this is a short form of HWRM command */
221         #define HWRM_SHORT_INPUT_SIGNATURE_SHORT_CMD UINT32_C(0x4321)
222         #define HWRM_SHORT_INPUT_SIGNATURE_LAST \
223                 HWRM_SHORT_INPUT_SIGNATURE_SHORT_CMD
224         /* Reserved for future use. */
225         uint16_t        unused_0;
226         /* This value indicates the length of the request. */
227         uint16_t        size;
228         /*
229          * This is the host address where the request was written.
230          * This area must be 16B aligned.
231          */
232         uint64_t        req_addr;
233 } __attribute__((packed));
234
235 /*
236  * Command numbering
237  * # NOTE - definitions already in hwrm_req_type, in hwrm_types.yaml
238  * #        So only structure definition is provided here.
239  */
240 /* cmd_nums (size:64b/8B) */
241 struct cmd_nums {
242         /*
243          * This version of the specification defines the commands listed in
244          * the table below. The following are general implementation
245          * requirements for these commands:
246          *
247          * # All commands listed below that are marked neither
248          * reserved nor experimental shall be implemented by the HWRM.
249          * # A HWRM client compliant to this specification should not use
250          * commands outside of the list below.
251          * # A HWRM client compliant to this specification should not use
252          * command numbers marked reserved below.
253          * # A command marked experimental below may not be implemented
254          * by the HWRM.
255          * # A command marked experimental may change in the
256          * future version of the HWRM specification.
257          * # A command not listed below may be implemented by the HWRM.
258          * The behavior of commands that are not listed below is outside
259          * the scope of this specification.
260          */
261         uint16_t        req_type;
262         #define HWRM_VER_GET                              UINT32_C(0x0)
263         #define HWRM_FUNC_DRV_IF_CHANGE                   UINT32_C(0xd)
264         #define HWRM_FUNC_BUF_UNRGTR                      UINT32_C(0xe)
265         #define HWRM_FUNC_VF_CFG                          UINT32_C(0xf)
266         /* Reserved for future use. */
267         #define HWRM_RESERVED1                            UINT32_C(0x10)
268         #define HWRM_FUNC_RESET                           UINT32_C(0x11)
269         #define HWRM_FUNC_GETFID                          UINT32_C(0x12)
270         #define HWRM_FUNC_VF_ALLOC                        UINT32_C(0x13)
271         #define HWRM_FUNC_VF_FREE                         UINT32_C(0x14)
272         #define HWRM_FUNC_QCAPS                           UINT32_C(0x15)
273         #define HWRM_FUNC_QCFG                            UINT32_C(0x16)
274         #define HWRM_FUNC_CFG                             UINT32_C(0x17)
275         #define HWRM_FUNC_QSTATS                          UINT32_C(0x18)
276         #define HWRM_FUNC_CLR_STATS                       UINT32_C(0x19)
277         #define HWRM_FUNC_DRV_UNRGTR                      UINT32_C(0x1a)
278         #define HWRM_FUNC_VF_RESC_FREE                    UINT32_C(0x1b)
279         #define HWRM_FUNC_VF_VNIC_IDS_QUERY               UINT32_C(0x1c)
280         #define HWRM_FUNC_DRV_RGTR                        UINT32_C(0x1d)
281         #define HWRM_FUNC_DRV_QVER                        UINT32_C(0x1e)
282         #define HWRM_FUNC_BUF_RGTR                        UINT32_C(0x1f)
283         #define HWRM_PORT_PHY_CFG                         UINT32_C(0x20)
284         #define HWRM_PORT_MAC_CFG                         UINT32_C(0x21)
285         /* Experimental */
286         #define HWRM_PORT_TS_QUERY                        UINT32_C(0x22)
287         #define HWRM_PORT_QSTATS                          UINT32_C(0x23)
288         #define HWRM_PORT_LPBK_QSTATS                     UINT32_C(0x24)
289         /* Experimental */
290         #define HWRM_PORT_CLR_STATS                       UINT32_C(0x25)
291         /* Experimental */
292         #define HWRM_PORT_LPBK_CLR_STATS                  UINT32_C(0x26)
293         #define HWRM_PORT_PHY_QCFG                        UINT32_C(0x27)
294         #define HWRM_PORT_MAC_QCFG                        UINT32_C(0x28)
295         /* Experimental */
296         #define HWRM_PORT_MAC_PTP_QCFG                    UINT32_C(0x29)
297         #define HWRM_PORT_PHY_QCAPS                       UINT32_C(0x2a)
298         #define HWRM_PORT_PHY_I2C_WRITE                   UINT32_C(0x2b)
299         #define HWRM_PORT_PHY_I2C_READ                    UINT32_C(0x2c)
300         #define HWRM_PORT_LED_CFG                         UINT32_C(0x2d)
301         #define HWRM_PORT_LED_QCFG                        UINT32_C(0x2e)
302         #define HWRM_PORT_LED_QCAPS                       UINT32_C(0x2f)
303         #define HWRM_QUEUE_QPORTCFG                       UINT32_C(0x30)
304         #define HWRM_QUEUE_QCFG                           UINT32_C(0x31)
305         #define HWRM_QUEUE_CFG                            UINT32_C(0x32)
306         #define HWRM_FUNC_VLAN_CFG                        UINT32_C(0x33)
307         #define HWRM_FUNC_VLAN_QCFG                       UINT32_C(0x34)
308         #define HWRM_QUEUE_PFCENABLE_QCFG                 UINT32_C(0x35)
309         #define HWRM_QUEUE_PFCENABLE_CFG                  UINT32_C(0x36)
310         #define HWRM_QUEUE_PRI2COS_QCFG                   UINT32_C(0x37)
311         #define HWRM_QUEUE_PRI2COS_CFG                    UINT32_C(0x38)
312         #define HWRM_QUEUE_COS2BW_QCFG                    UINT32_C(0x39)
313         #define HWRM_QUEUE_COS2BW_CFG                     UINT32_C(0x3a)
314         /* Experimental */
315         #define HWRM_QUEUE_DSCP_QCAPS                     UINT32_C(0x3b)
316         /* Experimental */
317         #define HWRM_QUEUE_DSCP2PRI_QCFG                  UINT32_C(0x3c)
318         /* Experimental */
319         #define HWRM_QUEUE_DSCP2PRI_CFG                   UINT32_C(0x3d)
320         #define HWRM_VNIC_ALLOC                           UINT32_C(0x40)
321         #define HWRM_VNIC_FREE                            UINT32_C(0x41)
322         #define HWRM_VNIC_CFG                             UINT32_C(0x42)
323         #define HWRM_VNIC_QCFG                            UINT32_C(0x43)
324         #define HWRM_VNIC_TPA_CFG                         UINT32_C(0x44)
325         /* Experimental */
326         #define HWRM_VNIC_TPA_QCFG                        UINT32_C(0x45)
327         #define HWRM_VNIC_RSS_CFG                         UINT32_C(0x46)
328         #define HWRM_VNIC_RSS_QCFG                        UINT32_C(0x47)
329         #define HWRM_VNIC_PLCMODES_CFG                    UINT32_C(0x48)
330         #define HWRM_VNIC_PLCMODES_QCFG                   UINT32_C(0x49)
331         #define HWRM_VNIC_QCAPS                           UINT32_C(0x4a)
332         #define HWRM_RING_ALLOC                           UINT32_C(0x50)
333         #define HWRM_RING_FREE                            UINT32_C(0x51)
334         #define HWRM_RING_CMPL_RING_QAGGINT_PARAMS        UINT32_C(0x52)
335         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS     UINT32_C(0x53)
336         #define HWRM_RING_AGGINT_QCAPS                    UINT32_C(0x54)
337         #define HWRM_RING_RESET                           UINT32_C(0x5e)
338         #define HWRM_RING_GRP_ALLOC                       UINT32_C(0x60)
339         #define HWRM_RING_GRP_FREE                        UINT32_C(0x61)
340         /* Reserved for future use. */
341         #define HWRM_RESERVED5                            UINT32_C(0x64)
342         /* Reserved for future use. */
343         #define HWRM_RESERVED6                            UINT32_C(0x65)
344         #define HWRM_VNIC_RSS_COS_LB_CTX_ALLOC            UINT32_C(0x70)
345         #define HWRM_VNIC_RSS_COS_LB_CTX_FREE             UINT32_C(0x71)
346         #define HWRM_CFA_L2_FILTER_ALLOC                  UINT32_C(0x90)
347         #define HWRM_CFA_L2_FILTER_FREE                   UINT32_C(0x91)
348         #define HWRM_CFA_L2_FILTER_CFG                    UINT32_C(0x92)
349         #define HWRM_CFA_L2_SET_RX_MASK                   UINT32_C(0x93)
350         #define HWRM_CFA_VLAN_ANTISPOOF_CFG               UINT32_C(0x94)
351         #define HWRM_CFA_TUNNEL_FILTER_ALLOC              UINT32_C(0x95)
352         #define HWRM_CFA_TUNNEL_FILTER_FREE               UINT32_C(0x96)
353         /* Experimental */
354         #define HWRM_CFA_ENCAP_RECORD_ALLOC               UINT32_C(0x97)
355         /* Experimental */
356         #define HWRM_CFA_ENCAP_RECORD_FREE                UINT32_C(0x98)
357         #define HWRM_CFA_NTUPLE_FILTER_ALLOC              UINT32_C(0x99)
358         #define HWRM_CFA_NTUPLE_FILTER_FREE               UINT32_C(0x9a)
359         #define HWRM_CFA_NTUPLE_FILTER_CFG                UINT32_C(0x9b)
360         /* Experimental */
361         #define HWRM_CFA_EM_FLOW_ALLOC                    UINT32_C(0x9c)
362         /* Experimental */
363         #define HWRM_CFA_EM_FLOW_FREE                     UINT32_C(0x9d)
364         /* Experimental */
365         #define HWRM_CFA_EM_FLOW_CFG                      UINT32_C(0x9e)
366         #define HWRM_TUNNEL_DST_PORT_QUERY                UINT32_C(0xa0)
367         #define HWRM_TUNNEL_DST_PORT_ALLOC                UINT32_C(0xa1)
368         #define HWRM_TUNNEL_DST_PORT_FREE                 UINT32_C(0xa2)
369         #define HWRM_STAT_CTX_ALLOC                       UINT32_C(0xb0)
370         #define HWRM_STAT_CTX_FREE                        UINT32_C(0xb1)
371         #define HWRM_STAT_CTX_QUERY                       UINT32_C(0xb2)
372         #define HWRM_STAT_CTX_CLR_STATS                   UINT32_C(0xb3)
373         #define HWRM_PORT_QSTATS_EXT                      UINT32_C(0xb4)
374         #define HWRM_FW_RESET                             UINT32_C(0xc0)
375         #define HWRM_FW_QSTATUS                           UINT32_C(0xc1)
376         #define HWRM_FW_HEALTH_CHECK                      UINT32_C(0xc2)
377         #define HWRM_FW_SYNC                              UINT32_C(0xc3)
378         /* Experimental */
379         #define HWRM_FW_SET_TIME                          UINT32_C(0xc8)
380         /* Experimental */
381         #define HWRM_FW_GET_TIME                          UINT32_C(0xc9)
382         /* Experimental */
383         #define HWRM_FW_SET_STRUCTURED_DATA               UINT32_C(0xca)
384         /* Experimental */
385         #define HWRM_FW_GET_STRUCTURED_DATA               UINT32_C(0xcb)
386         /* Experimental */
387         #define HWRM_FW_IPC_MAILBOX                       UINT32_C(0xcc)
388         #define HWRM_EXEC_FWD_RESP                        UINT32_C(0xd0)
389         #define HWRM_REJECT_FWD_RESP                      UINT32_C(0xd1)
390         #define HWRM_FWD_RESP                             UINT32_C(0xd2)
391         #define HWRM_FWD_ASYNC_EVENT_CMPL                 UINT32_C(0xd3)
392         #define HWRM_OEM_CMD                              UINT32_C(0xd4)
393         #define HWRM_TEMP_MONITOR_QUERY                   UINT32_C(0xe0)
394         #define HWRM_WOL_FILTER_ALLOC                     UINT32_C(0xf0)
395         #define HWRM_WOL_FILTER_FREE                      UINT32_C(0xf1)
396         #define HWRM_WOL_FILTER_QCFG                      UINT32_C(0xf2)
397         #define HWRM_WOL_REASON_QCFG                      UINT32_C(0xf3)
398         /* Experimental */
399         #define HWRM_CFA_METER_PROFILE_ALLOC              UINT32_C(0xf5)
400         /* Experimental */
401         #define HWRM_CFA_METER_PROFILE_FREE               UINT32_C(0xf6)
402         /* Experimental */
403         #define HWRM_CFA_METER_PROFILE_CFG                UINT32_C(0xf7)
404         /* Experimental */
405         #define HWRM_CFA_METER_INSTANCE_ALLOC             UINT32_C(0xf8)
406         /* Experimental */
407         #define HWRM_CFA_METER_INSTANCE_FREE              UINT32_C(0xf9)
408         /* Experimental */
409         #define HWRM_CFA_VFR_ALLOC                        UINT32_C(0xfd)
410         /* Experimental */
411         #define HWRM_CFA_VFR_FREE                         UINT32_C(0xfe)
412         /* Experimental */
413         #define HWRM_CFA_VF_PAIR_ALLOC                    UINT32_C(0x100)
414         /* Experimental */
415         #define HWRM_CFA_VF_PAIR_FREE                     UINT32_C(0x101)
416         /* Experimental */
417         #define HWRM_CFA_VF_PAIR_INFO                     UINT32_C(0x102)
418         /* Experimental */
419         #define HWRM_CFA_FLOW_ALLOC                       UINT32_C(0x103)
420         /* Experimental */
421         #define HWRM_CFA_FLOW_FREE                        UINT32_C(0x104)
422         /* Experimental */
423         #define HWRM_CFA_FLOW_FLUSH                       UINT32_C(0x105)
424         /* Experimental */
425         #define HWRM_CFA_FLOW_STATS                       UINT32_C(0x106)
426         /* Experimental */
427         #define HWRM_CFA_FLOW_INFO                        UINT32_C(0x107)
428         /* Experimental */
429         #define HWRM_CFA_DECAP_FILTER_ALLOC               UINT32_C(0x108)
430         /* Experimental */
431         #define HWRM_CFA_DECAP_FILTER_FREE                UINT32_C(0x109)
432         #define HWRM_CFA_VLAN_ANTISPOOF_QCFG              UINT32_C(0x10a)
433         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC       UINT32_C(0x10b)
434         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE        UINT32_C(0x10c)
435         /* Experimental */
436         #define HWRM_CFA_PAIR_ALLOC                       UINT32_C(0x10d)
437         /* Experimental */
438         #define HWRM_CFA_PAIR_FREE                        UINT32_C(0x10e)
439         /* Experimental */
440         #define HWRM_CFA_PAIR_INFO                        UINT32_C(0x10f)
441         /* Experimental */
442         #define HWRM_FW_IPC_MSG                           UINT32_C(0x110)
443         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO        UINT32_C(0x111)
444         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE       UINT32_C(0x112)
445         /* Engine CKV - Ping the device and SRT firmware to get the public key. */
446         #define HWRM_ENGINE_CKV_HELLO                     UINT32_C(0x12d)
447         /* Engine CKV - Get the current allocation status of keys provisioned in the key vault. */
448         #define HWRM_ENGINE_CKV_STATUS                    UINT32_C(0x12e)
449         /* Engine CKV - Add a new CKEK used to encrypt keys. */
450         #define HWRM_ENGINE_CKV_CKEK_ADD                  UINT32_C(0x12f)
451         /* Engine CKV - Delete a previously added CKEK. */
452         #define HWRM_ENGINE_CKV_CKEK_DELETE               UINT32_C(0x130)
453         /* Engine CKV - Add a new key to the key vault. */
454         #define HWRM_ENGINE_CKV_KEY_ADD                   UINT32_C(0x131)
455         /* Engine CKV - Delete a key from the key vault. */
456         #define HWRM_ENGINE_CKV_KEY_DELETE                UINT32_C(0x132)
457         /* Engine CKV - Delete all keys from the key vault. */
458         #define HWRM_ENGINE_CKV_FLUSH                     UINT32_C(0x133)
459         /* Engine CKV - Get random data. */
460         #define HWRM_ENGINE_CKV_RNG_GET                   UINT32_C(0x134)
461         /* Engine CKV - Generate and encrypt a new AES key. */
462         #define HWRM_ENGINE_CKV_KEY_GEN                   UINT32_C(0x135)
463         /* Engine - Query the available queue groups configuration. */
464         #define HWRM_ENGINE_QG_CONFIG_QUERY               UINT32_C(0x13c)
465         /* Engine - Query the queue groups assigned to a function. */
466         #define HWRM_ENGINE_QG_QUERY                      UINT32_C(0x13d)
467         /* Engine - Query the available queue group meter profile configuration. */
468         #define HWRM_ENGINE_QG_METER_PROFILE_CONFIG_QUERY UINT32_C(0x13e)
469         /* Engine - Query the configuration of a queue group meter profile. */
470         #define HWRM_ENGINE_QG_METER_PROFILE_QUERY        UINT32_C(0x13f)
471         /* Engine - Allocate a queue group meter profile. */
472         #define HWRM_ENGINE_QG_METER_PROFILE_ALLOC        UINT32_C(0x140)
473         /* Engine - Free a queue group meter profile. */
474         #define HWRM_ENGINE_QG_METER_PROFILE_FREE         UINT32_C(0x141)
475         /* Engine - Query the meters assigned to a queue group. */
476         #define HWRM_ENGINE_QG_METER_QUERY                UINT32_C(0x142)
477         /* Engine - Bind a queue group meter profile to a queue group. */
478         #define HWRM_ENGINE_QG_METER_BIND                 UINT32_C(0x143)
479         /* Engine - Unbind a queue group meter profile from a queue group. */
480         #define HWRM_ENGINE_QG_METER_UNBIND               UINT32_C(0x144)
481         /* Engine - Bind a queue group to a function. */
482         #define HWRM_ENGINE_QG_FUNC_BIND                  UINT32_C(0x145)
483         /* Engine - Query the scheduling group configuration. */
484         #define HWRM_ENGINE_SG_CONFIG_QUERY               UINT32_C(0x146)
485         /* Engine - Query the queue groups assigned to a scheduling group. */
486         #define HWRM_ENGINE_SG_QUERY                      UINT32_C(0x147)
487         /* Engine - Query the configuration of a scheduling group's meter profiles. */
488         #define HWRM_ENGINE_SG_METER_QUERY                UINT32_C(0x148)
489         /* Engine - Configure a scheduling group's meter profiles. */
490         #define HWRM_ENGINE_SG_METER_CONFIG               UINT32_C(0x149)
491         /* Engine - Bind a queue group to a scheduling group. */
492         #define HWRM_ENGINE_SG_QG_BIND                    UINT32_C(0x14a)
493         /* Engine - Unbind a queue group from its scheduling group. */
494         #define HWRM_ENGINE_QG_SG_UNBIND                  UINT32_C(0x14b)
495         /* Engine - Query the Engine configuration. */
496         #define HWRM_ENGINE_CONFIG_QUERY                  UINT32_C(0x154)
497         /* Engine - Configure the statistics accumulator for an Engine. */
498         #define HWRM_ENGINE_STATS_CONFIG                  UINT32_C(0x155)
499         /* Engine - Clear the statistics accumulator for an Engine. */
500         #define HWRM_ENGINE_STATS_CLEAR                   UINT32_C(0x156)
501         /* Engine - Query the statistics accumulator for an Engine. */
502         #define HWRM_ENGINE_STATS_QUERY                   UINT32_C(0x157)
503         /* Engine - Allocate an Engine RQ. */
504         #define HWRM_ENGINE_RQ_ALLOC                      UINT32_C(0x15e)
505         /* Engine - Free an Engine RQ. */
506         #define HWRM_ENGINE_RQ_FREE                       UINT32_C(0x15f)
507         /* Engine - Allocate an Engine CQ. */
508         #define HWRM_ENGINE_CQ_ALLOC                      UINT32_C(0x160)
509         /* Engine - Free an Engine CQ. */
510         #define HWRM_ENGINE_CQ_FREE                       UINT32_C(0x161)
511         /* Engine - Allocate an NQ. */
512         #define HWRM_ENGINE_NQ_ALLOC                      UINT32_C(0x162)
513         /* Engine - Free an NQ. */
514         #define HWRM_ENGINE_NQ_FREE                       UINT32_C(0x163)
515         /* Engine - Set the on-die RQE credit update location. */
516         #define HWRM_ENGINE_ON_DIE_RQE_CREDITS            UINT32_C(0x164)
517         /* Experimental */
518         #define HWRM_FUNC_RESOURCE_QCAPS                  UINT32_C(0x190)
519         /* Experimental */
520         #define HWRM_FUNC_VF_RESOURCE_CFG                 UINT32_C(0x191)
521         /* Experimental */
522         #define HWRM_FUNC_BACKING_STORE_QCAPS             UINT32_C(0x192)
523         /* Experimental */
524         #define HWRM_FUNC_BACKING_STORE_CFG               UINT32_C(0x193)
525         /* Experimental */
526         #define HWRM_FUNC_BACKING_STORE_QCFG              UINT32_C(0x194)
527         /* Configures the BW of any VF */
528         #define HWRM_FUNC_VF_BW_CFG                       UINT32_C(0x195)
529         /* Queries the BW of any VF */
530         #define HWRM_FUNC_VF_BW_QCFG                      UINT32_C(0x196)
531         /* Experimental */
532         #define HWRM_SELFTEST_QLIST                       UINT32_C(0x200)
533         /* Experimental */
534         #define HWRM_SELFTEST_EXEC                        UINT32_C(0x201)
535         /* Experimental */
536         #define HWRM_SELFTEST_IRQ                         UINT32_C(0x202)
537         /* Experimental */
538         #define HWRM_SELFTEST_RETRIEVE_SERDES_DATA        UINT32_C(0x203)
539         /* Experimental */
540         #define HWRM_PCIE_QSTATS                          UINT32_C(0x204)
541         /* Experimental */
542         #define HWRM_DBG_READ_DIRECT                      UINT32_C(0xff10)
543         /* Experimental */
544         #define HWRM_DBG_READ_INDIRECT                    UINT32_C(0xff11)
545         /* Experimental */
546         #define HWRM_DBG_WRITE_DIRECT                     UINT32_C(0xff12)
547         /* Experimental */
548         #define HWRM_DBG_WRITE_INDIRECT                   UINT32_C(0xff13)
549         #define HWRM_DBG_DUMP                             UINT32_C(0xff14)
550         /* Experimental */
551         #define HWRM_DBG_ERASE_NVM                        UINT32_C(0xff15)
552         /* Experimental */
553         #define HWRM_DBG_CFG                              UINT32_C(0xff16)
554         /* Experimental */
555         #define HWRM_DBG_COREDUMP_LIST                    UINT32_C(0xff17)
556         /* Experimental */
557         #define HWRM_DBG_COREDUMP_INITIATE                UINT32_C(0xff18)
558         /* Experimental */
559         #define HWRM_DBG_COREDUMP_RETRIEVE                UINT32_C(0xff19)
560         /* Experimental */
561         #define HWRM_DBG_FW_CLI                           UINT32_C(0xff1a)
562         /*  */
563         #define HWRM_DBG_I2C_CMD                          UINT32_C(0xff1b)
564         /*  */
565         #define HWRM_DBG_RING_INFO_GET                    UINT32_C(0xff1c)
566         /* Experimental */
567         #define HWRM_NVM_FACTORY_DEFAULTS                 UINT32_C(0xffee)
568         #define HWRM_NVM_VALIDATE_OPTION                  UINT32_C(0xffef)
569         #define HWRM_NVM_FLUSH                            UINT32_C(0xfff0)
570         #define HWRM_NVM_GET_VARIABLE                     UINT32_C(0xfff1)
571         #define HWRM_NVM_SET_VARIABLE                     UINT32_C(0xfff2)
572         #define HWRM_NVM_INSTALL_UPDATE                   UINT32_C(0xfff3)
573         #define HWRM_NVM_MODIFY                           UINT32_C(0xfff4)
574         #define HWRM_NVM_VERIFY_UPDATE                    UINT32_C(0xfff5)
575         #define HWRM_NVM_GET_DEV_INFO                     UINT32_C(0xfff6)
576         #define HWRM_NVM_ERASE_DIR_ENTRY                  UINT32_C(0xfff7)
577         #define HWRM_NVM_MOD_DIR_ENTRY                    UINT32_C(0xfff8)
578         #define HWRM_NVM_FIND_DIR_ENTRY                   UINT32_C(0xfff9)
579         #define HWRM_NVM_GET_DIR_ENTRIES                  UINT32_C(0xfffa)
580         #define HWRM_NVM_GET_DIR_INFO                     UINT32_C(0xfffb)
581         #define HWRM_NVM_RAW_DUMP                         UINT32_C(0xfffc)
582         #define HWRM_NVM_READ                             UINT32_C(0xfffd)
583         #define HWRM_NVM_WRITE                            UINT32_C(0xfffe)
584         #define HWRM_NVM_RAW_WRITE_BLK                    UINT32_C(0xffff)
585         #define HWRM_LAST                                HWRM_NVM_RAW_WRITE_BLK
586         uint16_t        unused_0[3];
587 } __attribute__((packed));
588
589 /* Return Codes */
590 /* ret_codes (size:64b/8B) */
591 struct ret_codes {
592         uint16_t        error_code;
593         /* Request was successfully executed by the HWRM. */
594         #define HWRM_ERR_CODE_SUCCESS                UINT32_C(0x0)
595         /* The HWRM failed to execute the request. */
596         #define HWRM_ERR_CODE_FAIL                   UINT32_C(0x1)
597         /*
598          * The request contains invalid argument(s) or input
599          * parameters.
600          */
601         #define HWRM_ERR_CODE_INVALID_PARAMS         UINT32_C(0x2)
602         /*
603          * The requester is not allowed to access the requested
604          * resource. This error code shall be provided in a
605          * response to a request to query or modify an existing
606          * resource that is not accessible by the requester.
607          */
608         #define HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED UINT32_C(0x3)
609         /*
610          * The HWRM is unable to allocate the requested resource.
611          * This code only applies to requests for HWRM resource
612          * allocations.
613          */
614         #define HWRM_ERR_CODE_RESOURCE_ALLOC_ERROR   UINT32_C(0x4)
615         /*
616          * Invalid combination of flags is specified in the
617          * request.
618          */
619         #define HWRM_ERR_CODE_INVALID_FLAGS          UINT32_C(0x5)
620         /*
621          * Invalid combination of enables fields is specified in
622          * the request.
623          */
624         #define HWRM_ERR_CODE_INVALID_ENABLES        UINT32_C(0x6)
625         /*
626          * Request contains a required TLV that is not supported by
627          * the installed version of firmware.
628          */
629         #define HWRM_ERR_CODE_UNSUPPORTED_TLV        UINT32_C(0x7)
630         /*
631          * No firmware buffer available to accept the request. Driver
632          * should retry the request.
633          */
634         #define HWRM_ERR_CODE_NO_BUFFER              UINT32_C(0x8)
635         /*
636          * This error code is only reported by firmware when some
637          * sub-option of a supported HWRM command is unsupported.
638          */
639         #define HWRM_ERR_CODE_UNSUPPORTED_OPTION_ERR UINT32_C(0x9)
640         /*
641          * Generic HWRM execution error that represents an
642          * internal error.
643          */
644         #define HWRM_ERR_CODE_HWRM_ERROR             UINT32_C(0xf)
645         /* Unknown error */
646         #define HWRM_ERR_CODE_UNKNOWN_ERR            UINT32_C(0xfffe)
647         /* Unsupported or invalid command */
648         #define HWRM_ERR_CODE_CMD_NOT_SUPPORTED      UINT32_C(0xffff)
649         #define HWRM_ERR_CODE_LAST \
650                 HWRM_ERR_CODE_CMD_NOT_SUPPORTED
651         uint16_t        unused_0[3];
652 } __attribute__((packed));
653
654 /* Output */
655 /* hwrm_err_output (size:128b/16B) */
656 struct hwrm_err_output {
657         /*
658          * Pass/Fail or error type
659          *
660          * Note: receiver to verify the in parameters, and fail the call
661          * with an error when appropriate
662          */
663         uint16_t        error_code;
664         /* This field returns the type of original request. */
665         uint16_t        req_type;
666         /* This field provides original sequence number of the command. */
667         uint16_t        seq_id;
668         /*
669          * This field is the length of the response in bytes.  The
670          * last byte of the response is a valid flag that will read
671          * as '1' when the command has been completely written to
672          * memory.
673          */
674         uint16_t        resp_len;
675         /* debug info for this error response. */
676         uint32_t        opaque_0;
677         /* debug info for this error response. */
678         uint16_t        opaque_1;
679         /*
680          * In the case of an error response, command specific error
681          * code is returned in this field.
682          */
683         uint8_t cmd_err;
684         /*
685          * This field is used in Output records to indicate that the output
686          * is completely written to RAM.  This field should be read as '1'
687          * to indicate that the output has been completely written.
688          * When writing a command completion or response to an internal processor,
689          * the order of writes has to be such that this field is written last.
690          */
691         uint8_t valid;
692 } __attribute__((packed));
693 /*
694  * Following is the signature for HWRM message field that indicates not
695  * applicable (All F's). Need to cast it the size of the field if needed.
696  */
697 #define HWRM_NA_SIGNATURE ((uint32_t)(-1))
698 /* hwrm_func_buf_rgtr */
699 #define HWRM_MAX_REQ_LEN 128
700 /* hwrm_selftest_qlist */
701 #define HWRM_MAX_RESP_LEN 280
702 /* 7 bit indirection table index. */
703 #define HW_HASH_INDEX_SIZE 0x80
704 #define HW_HASH_KEY_SIZE 40
705 /* valid key for HWRM response */
706 #define HWRM_RESP_VALID_KEY 1
707 #define HWRM_VERSION_MAJOR 1
708 #define HWRM_VERSION_MINOR 9
709 #define HWRM_VERSION_UPDATE 2
710 /* non-zero means beta version */
711 #define HWRM_VERSION_RSVD 53
712 #define HWRM_VERSION_STR "1.9.2.53"
713
714 /****************
715  * hwrm_ver_get *
716  ****************/
717
718
719 /* hwrm_ver_get_input (size:192b/24B) */
720 struct hwrm_ver_get_input {
721         /* The HWRM command request type. */
722         uint16_t        req_type;
723         /*
724          * The completion ring to send the completion event on. This should
725          * be the NQ ID returned from the `nq_alloc` HWRM command.
726          */
727         uint16_t        cmpl_ring;
728         /*
729          * The sequence ID is used by the driver for tracking multiple
730          * commands. This ID is treated as opaque data by the firmware and
731          * the value is returned in the `hwrm_resp_hdr` upon completion.
732          */
733         uint16_t        seq_id;
734         /*
735          * The target ID of the command:
736          * * 0x0-0xFFF8 - The function ID
737          * * 0xFFF8-0xFFFE - Reserved for internal processors
738          * * 0xFFFF - HWRM
739          */
740         uint16_t        target_id;
741         /*
742          * A physical address pointer pointing to a host buffer that the
743          * command's response data will be written. This can be either a host
744          * physical address (HPA) or a guest physical address (GPA) and must
745          * point to a physically contiguous block of memory.
746          */
747         uint64_t        resp_addr;
748         /*
749          * This field represents the major version of HWRM interface
750          * specification supported by the driver HWRM implementation.
751          * The interface major version is intended to change only when
752          * non backward compatible changes are made to the HWRM
753          * interface specification.
754          */
755         uint8_t hwrm_intf_maj;
756         /*
757          * This field represents the minor version of HWRM interface
758          * specification supported by the driver HWRM implementation.
759          * A change in interface minor version is used to reflect
760          * significant backward compatible modification to HWRM
761          * interface specification.
762          * This can be due to addition or removal of functionality.
763          * HWRM interface specifications with the same major version
764          * but different minor versions are compatible.
765          */
766         uint8_t hwrm_intf_min;
767         /*
768          * This field represents the update version of HWRM interface
769          * specification supported by the driver HWRM implementation.
770          * The interface update version is used to reflect minor
771          * changes or bug fixes to a released HWRM interface
772          * specification.
773          */
774         uint8_t hwrm_intf_upd;
775         uint8_t unused_0[5];
776 } __attribute__((packed));
777
778 /* hwrm_ver_get_output (size:1408b/176B) */
779 struct hwrm_ver_get_output {
780         /* The specific error status for the command. */
781         uint16_t        error_code;
782         /* The HWRM command request type. */
783         uint16_t        req_type;
784         /* The sequence ID from the original command. */
785         uint16_t        seq_id;
786         /* The length of the response data in number of bytes. */
787         uint16_t        resp_len;
788         /*
789          * This field represents the major version of HWRM interface
790          * specification supported by the HWRM implementation.
791          * The interface major version is intended to change only when
792          * non backward compatible changes are made to the HWRM
793          * interface specification.
794          * A HWRM implementation that is compliant with this
795          * specification shall provide value of 1 in this field.
796          */
797         uint8_t hwrm_intf_maj_8b;
798         /*
799          * This field represents the minor version of HWRM interface
800          * specification supported by the HWRM implementation.
801          * A change in interface minor version is used to reflect
802          * significant backward compatible modification to HWRM
803          * interface specification.
804          * This can be due to addition or removal of functionality.
805          * HWRM interface specifications with the same major version
806          * but different minor versions are compatible.
807          * A HWRM implementation that is compliant with this
808          * specification shall provide value of 2 in this field.
809          */
810         uint8_t hwrm_intf_min_8b;
811         /*
812          * This field represents the update version of HWRM interface
813          * specification supported by the HWRM implementation.
814          * The interface update version is used to reflect minor
815          * changes or bug fixes to a released HWRM interface
816          * specification.
817          * A HWRM implementation that is compliant with this
818          * specification shall provide value of 2 in this field.
819          */
820         uint8_t hwrm_intf_upd_8b;
821         uint8_t hwrm_intf_rsvd_8b;
822         /*
823          * This field represents the major version of HWRM firmware.
824          * A change in firmware major version represents a major
825          * firmware release.
826          */
827         uint8_t hwrm_fw_maj_8b;
828         /*
829          * This field represents the minor version of HWRM firmware.
830          * A change in firmware minor version represents significant
831          * firmware functionality changes.
832          */
833         uint8_t hwrm_fw_min_8b;
834         /*
835          * This field represents the build version of HWRM firmware.
836          * A change in firmware build version represents bug fixes
837          * to a released firmware.
838          */
839         uint8_t hwrm_fw_bld_8b;
840         /*
841          * This field is a reserved field. This field can be used to
842          * represent firmware branches or customer specific releases
843          * tied to a specific (major,minor,update) version of the
844          * HWRM firmware.
845          */
846         uint8_t hwrm_fw_rsvd_8b;
847         /*
848          * This field represents the major version of mgmt firmware.
849          * A change in major version represents a major release.
850          */
851         uint8_t mgmt_fw_maj_8b;
852         /*
853          * This field represents the minor version of mgmt firmware.
854          * A change in minor version represents significant
855          * functionality changes.
856          */
857         uint8_t mgmt_fw_min_8b;
858         /*
859          * This field represents the build version of mgmt firmware.
860          * A change in update version represents bug fixes.
861          */
862         uint8_t mgmt_fw_bld_8b;
863         /*
864          * This field is a reserved field. This field can be used to
865          * represent firmware branches or customer specific releases
866          * tied to a specific (major,minor,update) version
867          */
868         uint8_t mgmt_fw_rsvd_8b;
869         /*
870          * This field represents the major version of network
871          * control firmware.
872          * A change in major version represents a major release.
873          */
874         uint8_t netctrl_fw_maj_8b;
875         /*
876          * This field represents the minor version of network
877          * control firmware.
878          * A change in minor version represents significant
879          * functionality changes.
880          */
881         uint8_t netctrl_fw_min_8b;
882         /*
883          * This field represents the build version of network
884          * control firmware.
885          * A change in update version represents bug fixes.
886          */
887         uint8_t netctrl_fw_bld_8b;
888         /*
889          * This field is a reserved field. This field can be used to
890          * represent firmware branches or customer specific releases
891          * tied to a specific (major,minor,update) version
892          */
893         uint8_t netctrl_fw_rsvd_8b;
894         /*
895          * This field is used to indicate device's capabilities and
896          * configurations.
897          */
898         uint32_t        dev_caps_cfg;
899         /*
900          * If set to 1, then secure firmware update behavior
901          * is supported.
902          * If set to 0, then secure firmware update behavior is
903          * not supported.
904          */
905         #define HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SECURE_FW_UPD_SUPPORTED \
906                 UINT32_C(0x1)
907         /*
908          * If set to 1, then firmware based DCBX agent is supported.
909          * If set to 0, then firmware based DCBX agent capability
910          * is not supported on this device.
911          */
912         #define HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_FW_DCBX_AGENT_SUPPORTED \
913                 UINT32_C(0x2)
914         /*
915          * If set to 1, then HWRM short command format is supported.
916          * If set to 0, then HWRM short command format is not supported.
917          */
918         #define HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SHORT_CMD_SUPPORTED \
919                 UINT32_C(0x4)
920         /*
921          * If set to 1, then HWRM short command format is required.
922          * If set to 0, then HWRM short command format is not required.
923          */
924         #define HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SHORT_CMD_REQUIRED \
925                 UINT32_C(0x8)
926         /*
927          * If set to 1, then the KONG host mailbox channel is supported.
928          * If set to 0, then the KONG host mailbox channel is not supported.
929          * By default, this flag should be 0 for older version of core firmware.
930          */
931         #define HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_KONG_MB_CHNL_SUPPORTED \
932                 UINT32_C(0x10)
933         /*
934          * If set to 1, then the 64bit flow handle is supported in addition to the
935          * legacy 16bit flow handle. If set to 0, then the 64bit flow handle is not
936          * supported. By default, this flag should be 0 for older version of core firmware.
937          */
938         #define HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_FLOW_HANDLE_64BIT_SUPPORTED \
939                 UINT32_C(0x20)
940         /*
941          * If set to 1, then filter type can be provided in filter_alloc or filter_cfg
942          * filter types like L2 for l2 traffic and ROCE for roce & l2 traffic.
943          * If set to 0, then filter types not supported.
944          * By default, this flag should be 0 for older version of core firmware.
945          */
946         #define HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_L2_FILTER_TYPES_ROCE_OR_L2_SUPPORTED \
947                 UINT32_C(0x40)
948         /*
949          * If set to 1, firmware is capable to support virtio vSwitch offload model.
950          * If set to 0, firmware can't supported virtio vSwitch offload model.
951          * By default, this flag should be 0 for older version of core firmware.
952          */
953         #define HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_VIRTIO_VSWITCH_OFFLOAD_SUPPORTED \
954                 UINT32_C(0x80)
955         /*
956          * If set to 1, firmware is capable to support trusted VF.
957          * If set to 0, firmware is not capable to support trusted VF.
958          * By default, this flag should be 0 for older version of core firmware.
959          */
960         #define HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_TRUSTED_VF_SUPPORTED \
961                 UINT32_C(0x100)
962         /*
963          * This field represents the major version of RoCE firmware.
964          * A change in major version represents a major release.
965          */
966         uint8_t roce_fw_maj_8b;
967         /*
968          * This field represents the minor version of RoCE firmware.
969          * A change in minor version represents significant
970          * functionality changes.
971          */
972         uint8_t roce_fw_min_8b;
973         /*
974          * This field represents the build version of RoCE firmware.
975          * A change in update version represents bug fixes.
976          */
977         uint8_t roce_fw_bld_8b;
978         /*
979          * This field is a reserved field. This field can be used to
980          * represent firmware branches or customer specific releases
981          * tied to a specific (major,minor,update) version
982          */
983         uint8_t roce_fw_rsvd_8b;
984         /*
985          * This field represents the name of HWRM FW (ASCII chars
986          * with NULL at the end).
987          */
988         char    hwrm_fw_name[16];
989         /*
990          * This field represents the name of mgmt FW (ASCII chars
991          * with NULL at the end).
992          */
993         char    mgmt_fw_name[16];
994         /*
995          * This field represents the name of network control
996          * firmware (ASCII chars with NULL at the end).
997          */
998         char    netctrl_fw_name[16];
999         /*
1000          * This field is reserved for future use.
1001          * The responder should set it to 0.
1002          * The requester should ignore this field.
1003          */
1004         uint8_t reserved2[16];
1005         /*
1006          * This field represents the name of RoCE FW (ASCII chars
1007          * with NULL at the end).
1008          */
1009         char    roce_fw_name[16];
1010         /* This field returns the chip number. */
1011         uint16_t        chip_num;
1012         /* This field returns the revision of chip. */
1013         uint8_t chip_rev;
1014         /* This field returns the chip metal number. */
1015         uint8_t chip_metal;
1016         /* This field returns the bond id of the chip. */
1017         uint8_t chip_bond_id;
1018         /* This value indicates the type of platform used for chip implementation. */
1019         uint8_t chip_platform_type;
1020         /* ASIC */
1021         #define HWRM_VER_GET_OUTPUT_CHIP_PLATFORM_TYPE_ASIC      UINT32_C(0x0)
1022         /* FPGA platform of the chip. */
1023         #define HWRM_VER_GET_OUTPUT_CHIP_PLATFORM_TYPE_FPGA      UINT32_C(0x1)
1024         /* Palladium platform of the chip. */
1025         #define HWRM_VER_GET_OUTPUT_CHIP_PLATFORM_TYPE_PALLADIUM UINT32_C(0x2)
1026         #define HWRM_VER_GET_OUTPUT_CHIP_PLATFORM_TYPE_LAST \
1027                 HWRM_VER_GET_OUTPUT_CHIP_PLATFORM_TYPE_PALLADIUM
1028         /*
1029          * This field returns the maximum value of request window that
1030          * is supported by the HWRM. The request window is mapped
1031          * into device address space using MMIO.
1032          */
1033         uint16_t        max_req_win_len;
1034         /*
1035          * This field returns the maximum value of response buffer in
1036          * bytes.
1037          */
1038         uint16_t        max_resp_len;
1039         /*
1040          * This field returns the default request timeout value in
1041          * milliseconds.
1042          */
1043         uint16_t        def_req_timeout;
1044         /*
1045          * This field will indicate if any subsystems is not fully
1046          * initialized.
1047          */
1048         uint8_t flags;
1049         /*
1050          * If set to 1, device is not ready.
1051          * If set to 0, device is ready to accept all HWRM commands.
1052          */
1053         #define HWRM_VER_GET_OUTPUT_FLAGS_DEV_NOT_RDY       UINT32_C(0x1)
1054         /*
1055          * If set to 1, external version present.
1056          * If set to 0, external version not present.
1057          */
1058         #define HWRM_VER_GET_OUTPUT_FLAGS_EXT_VER_AVAIL     UINT32_C(0x2)
1059         uint8_t unused_0[2];
1060         /*
1061          * For backward compatibility this field must be set to 1.
1062          * Older drivers might look for this field to be 1 before
1063          * processing the message.
1064          */
1065         uint8_t always_1;
1066         /*
1067          * This field represents the major version of HWRM interface
1068          * specification supported by the HWRM implementation.
1069          * The interface major version is intended to change only when
1070          * non backward compatible changes are made to the HWRM
1071          * interface specification. A HWRM implementation that is
1072          * compliant with this specification shall provide value of 1
1073          * in this field.
1074          */
1075         uint16_t        hwrm_intf_major;
1076         /*
1077          * This field represents the minor version of HWRM interface
1078          * specification supported by the HWRM implementation.
1079          * A change in interface minor version is used to reflect
1080          * significant backward compatible modification to HWRM
1081          * interface specification. This can be due to addition or
1082          * removal of functionality. HWRM interface specifications
1083          * with the same major version but different minor versions are
1084          * compatible. A HWRM implementation that is compliant with
1085          * this specification shall provide value of 2 in this field.
1086          */
1087         uint16_t        hwrm_intf_minor;
1088         /*
1089          * This field represents the update version of HWRM interface
1090          * specification supported by the HWRM implementation. The
1091          * interface update version is used to reflect minor changes or
1092          * bug fixes to a released HWRM interface specification.
1093          * A HWRM implementation that is compliant with this
1094          * specification shall provide value of 2 in this field.
1095          */
1096         uint16_t        hwrm_intf_build;
1097         /*
1098          * This field represents the patch version of HWRM interface
1099          * specification supported by the HWRM implementation.
1100          */
1101         uint16_t        hwrm_intf_patch;
1102         /*
1103          * This field represents the major version of HWRM firmware.
1104          * A change in firmware major version represents a major
1105          * firmware release.
1106          */
1107         uint16_t        hwrm_fw_major;
1108         /*
1109          * This field represents the minor version of HWRM firmware.
1110          * A change in firmware minor version represents significant
1111          * firmware functionality changes.
1112          */
1113         uint16_t        hwrm_fw_minor;
1114         /*
1115          * This field represents the build version of HWRM firmware.
1116          * A change in firmware build version represents bug fixes to
1117          * a released firmware.
1118          */
1119         uint16_t        hwrm_fw_build;
1120         /*
1121          * This field is a reserved field.
1122          * This field can be used to represent firmware branches or customer
1123          * specific releases tied to a specific (major,minor,update) version
1124          * of the HWRM firmware.
1125          */
1126         uint16_t        hwrm_fw_patch;
1127         /*
1128          * This field represents the major version of mgmt firmware.
1129          * A change in major version represents a major release.
1130          */
1131         uint16_t        mgmt_fw_major;
1132         /*
1133          * This field represents the minor version of HWRM firmware.
1134          * A change in firmware minor version represents significant
1135          * firmware functionality changes.
1136          */
1137         uint16_t        mgmt_fw_minor;
1138         /*
1139          * This field represents the build version of mgmt firmware.
1140          * A change in update version represents bug fixes.
1141          */
1142         uint16_t        mgmt_fw_build;
1143         /*
1144          * This field is a reserved field. This field can be used to
1145          * represent firmware branches or customer specific releases
1146          * tied to a specific (major,minor,update) version.
1147          */
1148         uint16_t        mgmt_fw_patch;
1149         /*
1150          * This field represents the major version of network control
1151          * firmware. A change in major version represents
1152          * a major release.
1153          */
1154         uint16_t        netctrl_fw_major;
1155         /*
1156          * This field represents the minor version of network control
1157          * firmware. A change in minor version represents significant
1158          * functionality changes.
1159          */
1160         uint16_t        netctrl_fw_minor;
1161         /*
1162          * This field represents the build version of network control
1163          * firmware. A change in update version represents bug fixes.
1164          */
1165         uint16_t        netctrl_fw_build;
1166         /*
1167          * This field is a reserved field. This field can be used to
1168          * represent firmware branches or customer specific releases
1169          * tied to a specific (major,minor,update) version
1170          */
1171         uint16_t        netctrl_fw_patch;
1172         /*
1173          * This field represents the major version of RoCE firmware.
1174          * A change in major version represents a major release.
1175          */
1176         uint16_t        roce_fw_major;
1177         /*
1178          * This field represents the minor version of RoCE firmware.
1179          * A change in minor version represents significant
1180          * functionality changes.
1181          */
1182         uint16_t        roce_fw_minor;
1183         /*
1184          * This field represents the build version of RoCE firmware.
1185          * A change in update version represents bug fixes.
1186          */
1187         uint16_t        roce_fw_build;
1188         /*
1189          * This field is a reserved field. This field can be used to
1190          * represent firmware branches or customer specific releases
1191          * tied to a specific (major,minor,update) version
1192          */
1193         uint16_t        roce_fw_patch;
1194         /*
1195          * This field returns the maximum extended request length acceptable
1196          * by the device which allows requests greater than mailbox size when
1197          * used with the short cmd request format.
1198          */
1199         uint16_t        max_ext_req_len;
1200         uint8_t unused_1[5];
1201         /*
1202          * This field is used in Output records to indicate that the output
1203          * is completely written to RAM.  This field should be read as '1'
1204          * to indicate that the output has been completely written.
1205          * When writing a command completion or response to an internal processor,
1206          * the order of writes has to be such that this field is written last.
1207          */
1208         uint8_t valid;
1209 } __attribute__((packed));
1210
1211 /* bd_base (size:64b/8B) */
1212 struct bd_base {
1213         uint8_t type;
1214         /* This value identifies the type of buffer descriptor. */
1215         #define BD_BASE_TYPE_MASK             UINT32_C(0x3f)
1216         #define BD_BASE_TYPE_SFT              0
1217         /*
1218          * Indicates that this BD is 16B long and is used for
1219          * normal L2 packet transmission.
1220          */
1221         #define BD_BASE_TYPE_TX_BD_SHORT        UINT32_C(0x0)
1222         /*
1223          * Indicates that this BD is 1BB long and is an empty
1224          * TX BD.  Not valid for use by the driver.
1225          */
1226         #define BD_BASE_TYPE_TX_BD_EMPTY        UINT32_C(0x1)
1227         /*
1228          * Indicates that this BD is 16B long and is an RX Producer
1229          * (ie. empty) buffer descriptor.
1230          */
1231         #define BD_BASE_TYPE_RX_PROD_PKT        UINT32_C(0x4)
1232         /*
1233          * Indicates that this BD is 16B long and is an RX
1234          * Producer Buffer BD.
1235          */
1236         #define BD_BASE_TYPE_RX_PROD_BFR        UINT32_C(0x5)
1237         /*
1238          * Indicates that this BD is 16B long and is an
1239          * RX Producer Assembly Buffer Descriptor.
1240          */
1241         #define BD_BASE_TYPE_RX_PROD_AGG        UINT32_C(0x6)
1242         /*
1243          * Indicates that this BD is 32B long and is used for
1244          * normal L2 packet transmission.
1245          */
1246         #define BD_BASE_TYPE_TX_BD_LONG         UINT32_C(0x10)
1247         /*
1248          * Indicates that this BD is 32B long and is used for
1249          * L2 packet transmission for small packets that require
1250          * low latency.
1251          */
1252         #define BD_BASE_TYPE_TX_BD_LONG_INLINE  UINT32_C(0x11)
1253         #define BD_BASE_TYPE_LAST              BD_BASE_TYPE_TX_BD_LONG_INLINE
1254         uint8_t unused_1[7];
1255 } __attribute__((packed));
1256
1257 /* tx_bd_short (size:128b/16B) */
1258 struct tx_bd_short {
1259         /*
1260          * All bits in this field must be valid on the first BD of a packet.
1261          * Only the packet_end bit must be valid for the remaining BDs
1262          * of a packet.
1263          */
1264         uint16_t        flags_type;
1265         /* This value identifies the type of buffer descriptor. */
1266         #define TX_BD_SHORT_TYPE_MASK            UINT32_C(0x3f)
1267         #define TX_BD_SHORT_TYPE_SFT             0
1268         /*
1269          * Indicates that this BD is 16B long and is used for
1270          * normal L2 packet transmission.
1271          */
1272         #define TX_BD_SHORT_TYPE_TX_BD_SHORT       UINT32_C(0x0)
1273         #define TX_BD_SHORT_TYPE_LAST             TX_BD_SHORT_TYPE_TX_BD_SHORT
1274         /*
1275          * All bits in this field must be valid on the first BD of a packet.
1276          * Only the packet_end bit must be valid for the remaining BDs
1277          * of a packet.
1278          */
1279         #define TX_BD_SHORT_FLAGS_MASK           UINT32_C(0xffc0)
1280         #define TX_BD_SHORT_FLAGS_SFT            6
1281         /*
1282          * If set to 1, the packet ends with the data in the buffer
1283          * pointed to by this descriptor.  This flag must be
1284          * valid on every BD.
1285          */
1286         #define TX_BD_SHORT_FLAGS_PACKET_END      UINT32_C(0x40)
1287         /*
1288          * If set to 1, the device will not generate a completion for
1289          * this transmit packet unless there is an error in it's
1290          * processing.
1291          * If this bit
1292          * is set to 0, then the packet will be completed normally.
1293          *
1294          * This bit must be valid only on the first BD of a packet.
1295          */
1296         #define TX_BD_SHORT_FLAGS_NO_CMPL         UINT32_C(0x80)
1297         /*
1298          * This value indicates how many 16B BD locations are consumed
1299          * in the ring by this packet.
1300          * A value of 1 indicates that this BD is the only BD (and that
1301          * the it is a short BD).  A value
1302          * of 3 indicates either 3 short BDs or 1 long BD and one short
1303          * BD in the packet.  A value of 0 indicates
1304          * that there are 32 BD locations in the packet (the maximum).
1305          *
1306          * This field is valid only on the first BD of a packet.
1307          */
1308         #define TX_BD_SHORT_FLAGS_BD_CNT_MASK     UINT32_C(0x1f00)
1309         #define TX_BD_SHORT_FLAGS_BD_CNT_SFT      8
1310         /*
1311          * This value is a hint for the length of the entire packet.
1312          * It is used by the chip to optimize internal processing.
1313          *
1314          * The packet will be dropped if the hint is too short.
1315          *
1316          * This field is valid only on the first BD of a packet.
1317          */
1318         #define TX_BD_SHORT_FLAGS_LHINT_MASK      UINT32_C(0x6000)
1319         #define TX_BD_SHORT_FLAGS_LHINT_SFT       13
1320         /* indicates packet length < 512B */
1321         #define TX_BD_SHORT_FLAGS_LHINT_LT512       (UINT32_C(0x0) << 13)
1322         /* indicates 512 <= packet length < 1KB */
1323         #define TX_BD_SHORT_FLAGS_LHINT_LT1K        (UINT32_C(0x1) << 13)
1324         /* indicates 1KB <= packet length < 2KB */
1325         #define TX_BD_SHORT_FLAGS_LHINT_LT2K        (UINT32_C(0x2) << 13)
1326         /* indicates packet length >= 2KB */
1327         #define TX_BD_SHORT_FLAGS_LHINT_GTE2K       (UINT32_C(0x3) << 13)
1328         #define TX_BD_SHORT_FLAGS_LHINT_LAST \
1329                 TX_BD_SHORT_FLAGS_LHINT_GTE2K
1330         /*
1331          * If set to 1, the device immediately updates the Send Consumer
1332          * Index after the buffer associated with this descriptor has
1333          * been transferred via DMA to NIC memory from host memory. An
1334          * interrupt may or may not be generated according to the state
1335          * of the interrupt avoidance mechanisms. If this bit
1336          * is set to 0, then the Consumer Index is only updated as soon
1337          * as one of the host interrupt coalescing conditions has been met.
1338          *
1339          * This bit must be valid on the first BD of a packet.
1340          */
1341         #define TX_BD_SHORT_FLAGS_COAL_NOW        UINT32_C(0x8000)
1342         /*
1343          * This is the length of the host physical buffer this BD describes
1344          * in bytes.
1345          *
1346          * This field must be valid on all BDs of a packet.
1347          */
1348         uint16_t        len;
1349         /*
1350          * The opaque data field is pass through to the completion and can be
1351          * used for any data that the driver wants to associate with the
1352          * transmit BD.
1353          *
1354          * This field must be valid on the first BD of a packet.
1355          */
1356         uint32_t        opaque;
1357         /*
1358          * This is the host physical address for the portion of the packet
1359          * described by this TX BD.
1360          *
1361          * This value must be valid on all BDs of a packet.
1362          */
1363         uint64_t        address;
1364 } __attribute__((packed));
1365
1366 /* tx_bd_long (size:128b/16B) */
1367 struct tx_bd_long {
1368         /* This value identifies the type of buffer descriptor. */
1369         uint16_t        flags_type;
1370         /*
1371          * This value indicates the type of buffer descriptor.
1372          * packet.
1373          */
1374         #define TX_BD_LONG_TYPE_MASK            UINT32_C(0x3f)
1375         #define TX_BD_LONG_TYPE_SFT             0
1376         /*
1377          * Indicates that this BD is 32B long and is used for
1378          * normal L2 packet transmission.
1379          */
1380         #define TX_BD_LONG_TYPE_TX_BD_LONG        UINT32_C(0x10)
1381         #define TX_BD_LONG_TYPE_LAST             TX_BD_LONG_TYPE_TX_BD_LONG
1382         /*
1383          * All bits in this field must be valid on the first BD of a packet.
1384          * Only the packet_end bit must be valid for the remaining BDs
1385          * of a packet.
1386          */
1387         #define TX_BD_LONG_FLAGS_MASK           UINT32_C(0xffc0)
1388         #define TX_BD_LONG_FLAGS_SFT            6
1389         /*
1390          * If set to 1, the packet ends with the data in the buffer
1391          * pointed to by this descriptor.  This flag must be
1392          * valid on every BD.
1393          */
1394         #define TX_BD_LONG_FLAGS_PACKET_END      UINT32_C(0x40)
1395         /*
1396          * If set to 1, the device will not generate a completion for
1397          * this transmit packet unless there is an error in it's
1398          * processing.
1399          * If this bit
1400          * is set to 0, then the packet will be completed normally.
1401          *
1402          * This bit must be valid only on the first BD of a packet.
1403          */
1404         #define TX_BD_LONG_FLAGS_NO_CMPL         UINT32_C(0x80)
1405         /*
1406          * This value indicates how many 16B BD locations are consumed
1407          * in the ring by this packet.
1408          * A value of 1 indicates that this BD is the only BD (and that
1409          * the it is a short BD).  A value
1410          * of 3 indicates either 3 short BDs or 1 long BD and one short
1411          * BD in the packet.  A value of 0 indicates
1412          * that there are 32 BD locations in the packet (the maximum).
1413          *
1414          * This field is valid only on the first BD of a packet.
1415          */
1416         #define TX_BD_LONG_FLAGS_BD_CNT_MASK     UINT32_C(0x1f00)
1417         #define TX_BD_LONG_FLAGS_BD_CNT_SFT      8
1418         /*
1419          * This value is a hint for the length of the entire packet.
1420          * It is used by the chip to optimize internal processing.
1421          *
1422          * The packet will be dropped if the hint is too short.
1423          *
1424          * This field is valid only on the first BD of a packet.
1425          */
1426         #define TX_BD_LONG_FLAGS_LHINT_MASK      UINT32_C(0x6000)
1427         #define TX_BD_LONG_FLAGS_LHINT_SFT       13
1428         /* indicates packet length < 512B */
1429         #define TX_BD_LONG_FLAGS_LHINT_LT512       (UINT32_C(0x0) << 13)
1430         /* indicates 512 <= packet length < 1KB */
1431         #define TX_BD_LONG_FLAGS_LHINT_LT1K        (UINT32_C(0x1) << 13)
1432         /* indicates 1KB <= packet length < 2KB */
1433         #define TX_BD_LONG_FLAGS_LHINT_LT2K        (UINT32_C(0x2) << 13)
1434         /* indicates packet length >= 2KB */
1435         #define TX_BD_LONG_FLAGS_LHINT_GTE2K       (UINT32_C(0x3) << 13)
1436         #define TX_BD_LONG_FLAGS_LHINT_LAST       TX_BD_LONG_FLAGS_LHINT_GTE2K
1437         /*
1438          * If set to 1, the device immediately updates the Send Consumer
1439          * Index after the buffer associated with this descriptor has
1440          * been transferred via DMA to NIC memory from host memory. An
1441          * interrupt may or may not be generated according to the state
1442          * of the interrupt avoidance mechanisms. If this bit
1443          * is set to 0, then the Consumer Index is only updated as soon
1444          * as one of the host interrupt coalescing conditions has been met.
1445          *
1446          * This bit must be valid on the first BD of a packet.
1447          */
1448         #define TX_BD_LONG_FLAGS_COAL_NOW        UINT32_C(0x8000)
1449         /*
1450          * This is the length of the host physical buffer this BD describes
1451          * in bytes.
1452          *
1453          * This field must be valid on all BDs of a packet.
1454          */
1455         uint16_t        len;
1456         /*
1457          * The opaque data field is pass through to the completion and can be
1458          * used for any data that the driver wants to associate with the
1459          * transmit BD.
1460          *
1461          * This field must be valid on the first BD of a packet.
1462          */
1463         uint32_t        opaque;
1464         /*
1465          * This is the host physical address for the portion of the packet
1466          * described by this TX BD.
1467          *
1468          * This value must be valid on all BDs of a packet.
1469          */
1470         uint64_t        address;
1471 } __attribute__((packed));
1472
1473 /* Last 16 bytes of tx_bd_long. */
1474 /* tx_bd_long_hi (size:128b/16B) */
1475 struct tx_bd_long_hi {
1476         /*
1477          * All bits in this field must be valid on the first BD of a packet.
1478          * Their value on other BDs of the packet will be ignored.
1479          */
1480         uint16_t        lflags;
1481         /*
1482          * If set to 1, the controller replaces the TCP/UPD checksum
1483          * fields of normal TCP/UPD checksum, or the inner TCP/UDP
1484          * checksum field of the encapsulated TCP/UDP packets with the
1485          * hardware calculated TCP/UDP checksum for the packet associated
1486          * with this descriptor. The flag is ignored if the LSO flag is set.
1487          *
1488          * This bit must be valid on the first BD of a packet.
1489          */
1490         #define TX_BD_LONG_LFLAGS_TCP_UDP_CHKSUM     UINT32_C(0x1)
1491         /*
1492          * If set to 1,  the controller replaces the IP checksum of the
1493          * normal packets, or the inner IP checksum of the encapsulated
1494          * packets with the hardware calculated IP checksum for the
1495          * packet associated with this descriptor.
1496          *
1497          * This bit must be valid on the first BD of a packet.
1498          */
1499         #define TX_BD_LONG_LFLAGS_IP_CHKSUM          UINT32_C(0x2)
1500         /*
1501          * If set to 1, the controller will not append an Ethernet CRC
1502          * to the end of the frame.
1503          *
1504          * This bit must be valid on the first BD of a packet.
1505          *
1506          * Packet must be 64B or longer when this flag is set.  It is not
1507          * useful to use this bit with any form of TX offload such as
1508          * CSO or LSO.  The intent is that the packet from the host already
1509          * has a valid Ethernet CRC on the packet.
1510          */
1511         #define TX_BD_LONG_LFLAGS_NOCRC              UINT32_C(0x4)
1512         /*
1513          * If set to 1, the device will record the time at which the packet
1514          * was actually transmitted at the TX MAC.
1515          *
1516          * This bit must be valid on the first BD of a packet.
1517          */
1518         #define TX_BD_LONG_LFLAGS_STAMP              UINT32_C(0x8)
1519         /*
1520          * If set to 1, The controller replaces the tunnel IP checksum
1521          * field with hardware calculated IP checksum for the IP header
1522          * of the packet associated with this descriptor.
1523          *
1524          * For outer UDP checksum, global outer UDP checksum TE_NIC register
1525          * needs to be enabled. If the global outer UDP checksum TE_NIC register
1526          * bit is set, outer UDP checksum will be calculated for the following
1527          * cases:
1528          * 1. Packets with tcp_udp_chksum flag set to offload checksum for inner
1529          * packet AND the inner packet is TCP/UDP. If the inner packet is ICMP for
1530          * example (non-TCP/UDP), even if the tcp_udp_chksum is set, the outer UDP
1531          * checksum will not be calculated.
1532          * 2. Packets with lso flag set which implies inner TCP checksum calculation
1533          * as part of LSO operation.
1534          */
1535         #define TX_BD_LONG_LFLAGS_T_IP_CHKSUM        UINT32_C(0x10)
1536         /*
1537          * If set to 1,  the device will treat this packet with LSO(Large
1538          * Send Offload) processing for both normal or encapsulated
1539          * packets, which is a form of TCP segmentation.  When this bit
1540          * is 1, the hdr_size and mss fields must be valid. The driver
1541          * doesn't need to set t_ip_chksum, ip_chksum, and tcp_udp_chksum
1542          * flags since the controller will replace the appropriate
1543          * checksum fields for segmented packets.
1544          *
1545          * When this bit is 1, the hdr_size and mss fields must be valid.
1546          */
1547         #define TX_BD_LONG_LFLAGS_LSO                UINT32_C(0x20)
1548         /*
1549          * If set to zero when LSO is '1', then the IPID will be treated
1550          * as a 16b number and will be wrapped if it exceeds a value of
1551          * 0xffff.
1552          *
1553          * If set to one when LSO is '1', then the IPID will be treated
1554          * as a 15b number and will be wrapped if it exceeds a value 0f
1555          * 0x7fff.
1556          */
1557         #define TX_BD_LONG_LFLAGS_IPID_FMT           UINT32_C(0x40)
1558         /*
1559          * If set to zero when LSO is '1', then the IPID of the tunnel
1560          * IP header will not be modified during LSO operations.
1561          *
1562          * If set to one when LSO is '1', then the IPID of the tunnel
1563          * IP header will be incremented for each subsequent segment of an
1564          * LSO operation.
1565          *
1566          * The flag is ignored if the LSO packet is a normal (non-tunneled)
1567          * TCP packet.
1568          */
1569         #define TX_BD_LONG_LFLAGS_T_IPID             UINT32_C(0x80)
1570         /*
1571          * If set to '1', then the RoCE ICRC will be appended to the
1572          * packet.  Packet must be a valid RoCE format packet.
1573          */
1574         #define TX_BD_LONG_LFLAGS_ROCE_CRC           UINT32_C(0x100)
1575         /*
1576          * If set to '1', then the FCoE CRC will be appended to the
1577          * packet.  Packet must be a valid FCoE format packet.
1578          */
1579         #define TX_BD_LONG_LFLAGS_FCOE_CRC           UINT32_C(0x200)
1580         uint16_t        hdr_size;
1581         /*
1582          * When LSO is '1', this field must contain the offset of the
1583          * TCP payload from the beginning of the packet in as
1584          * 16b words. In case of encapsulated/tunneling packet, this  field
1585          * contains the offset of the inner TCP payload from beginning of the
1586          * packet as 16-bit words.
1587          *
1588          * This value must be valid on the first BD of a packet.
1589          */
1590         #define TX_BD_LONG_HDR_SIZE_MASK UINT32_C(0x1ff)
1591         #define TX_BD_LONG_HDR_SIZE_SFT 0
1592         uint32_t        mss;
1593         /*
1594          * This is the MSS value that will be used to do the LSO processing.
1595          * The value is the length in bytes of the TCP payload for each
1596          * segment generated by the LSO operation.
1597          *
1598          * This value must be valid on the first BD of a packet.
1599          */
1600         #define TX_BD_LONG_MSS_MASK UINT32_C(0x7fff)
1601         #define TX_BD_LONG_MSS_SFT 0
1602         uint16_t        unused2;
1603         /*
1604          * This value selects a CFA action to perform on the packet.
1605          * Set this value to zero if no CFA action is desired.
1606          *
1607          * This value must be valid on the first BD of a packet.
1608          */
1609         uint16_t        cfa_action;
1610         /*
1611          * This value is action meta-data that defines CFA edit operations
1612          * that are done in addition to any action editing.
1613          */
1614         uint32_t        cfa_meta;
1615         /* When key=1, This is the VLAN tag VID value. */
1616         #define TX_BD_LONG_CFA_META_VLAN_VID_MASK     UINT32_C(0xfff)
1617         #define TX_BD_LONG_CFA_META_VLAN_VID_SFT      0
1618         /* When key=1, This is the VLAN tag DE value. */
1619         #define TX_BD_LONG_CFA_META_VLAN_DE           UINT32_C(0x1000)
1620         /* When key=1, This is the VLAN tag PRI value. */
1621         #define TX_BD_LONG_CFA_META_VLAN_PRI_MASK     UINT32_C(0xe000)
1622         #define TX_BD_LONG_CFA_META_VLAN_PRI_SFT      13
1623         /* When key=1, This is the VLAN tag TPID select value. */
1624         #define TX_BD_LONG_CFA_META_VLAN_TPID_MASK    UINT32_C(0x70000)
1625         #define TX_BD_LONG_CFA_META_VLAN_TPID_SFT     16
1626         /* 0x88a8 */
1627         #define TX_BD_LONG_CFA_META_VLAN_TPID_TPID88A8  (UINT32_C(0x0) << 16)
1628         /* 0x8100 */
1629         #define TX_BD_LONG_CFA_META_VLAN_TPID_TPID8100  (UINT32_C(0x1) << 16)
1630         /* 0x9100 */
1631         #define TX_BD_LONG_CFA_META_VLAN_TPID_TPID9100  (UINT32_C(0x2) << 16)
1632         /* 0x9200 */
1633         #define TX_BD_LONG_CFA_META_VLAN_TPID_TPID9200  (UINT32_C(0x3) << 16)
1634         /* 0x9300 */
1635         #define TX_BD_LONG_CFA_META_VLAN_TPID_TPID9300  (UINT32_C(0x4) << 16)
1636         /* Value programmed in CFA VLANTPID register. */
1637         #define TX_BD_LONG_CFA_META_VLAN_TPID_TPIDCFG   (UINT32_C(0x5) << 16)
1638         #define TX_BD_LONG_CFA_META_VLAN_TPID_LAST \
1639                 TX_BD_LONG_CFA_META_VLAN_TPID_TPIDCFG
1640         /* When key=1, This is the VLAN tag TPID select value. */
1641         #define TX_BD_LONG_CFA_META_VLAN_RESERVED_MASK UINT32_C(0xff80000)
1642         #define TX_BD_LONG_CFA_META_VLAN_RESERVED_SFT 19
1643         /*
1644          * This field identifies the type of edit to be performed
1645          * on the packet.
1646          *
1647          * This value must be valid on the first BD of a packet.
1648          */
1649         #define TX_BD_LONG_CFA_META_KEY_MASK          UINT32_C(0xf0000000)
1650         #define TX_BD_LONG_CFA_META_KEY_SFT           28
1651         /* No editing */
1652         #define TX_BD_LONG_CFA_META_KEY_NONE            (UINT32_C(0x0) << 28)
1653         /*
1654          * - meta[17:16] - TPID select value (0 = 0x8100).
1655          * - meta[15:12] - PRI/DE value.
1656          * - meta[11:0] - VID value.
1657          */
1658         #define TX_BD_LONG_CFA_META_KEY_VLAN_TAG        (UINT32_C(0x1) << 28)
1659         #define TX_BD_LONG_CFA_META_KEY_LAST \
1660                 TX_BD_LONG_CFA_META_KEY_VLAN_TAG
1661 } __attribute__((packed));
1662
1663 /*
1664  * This structure is used to inform the NIC of packet data that needs to be
1665  * transmitted with additional processing that requires extra data such as
1666  * VLAN insertion plus attached inline data. This BD type may be used to
1667  * improve latency for small packets needing the additional extended features
1668  * supported by long BDs.
1669  */
1670 /* tx_bd_long_inline (size:256b/32B) */
1671 struct tx_bd_long_inline {
1672         uint16_t        flags_type;
1673         /* This value identifies the type of buffer descriptor. */
1674         #define TX_BD_LONG_INLINE_TYPE_MASK             UINT32_C(0x3f)
1675         #define TX_BD_LONG_INLINE_TYPE_SFT              0
1676         /*
1677          * This type of BD is 32B long and is used for inline L2 packet
1678          * transmission.
1679          */
1680         #define TX_BD_LONG_INLINE_TYPE_TX_BD_LONG_INLINE  UINT32_C(0x11)
1681         #define TX_BD_LONG_INLINE_TYPE_LAST \
1682                 TX_BD_LONG_INLINE_TYPE_TX_BD_LONG_INLINE
1683         /*
1684          * All bits in this field may be set on the first BD of a packet.
1685          * Only the packet_end bit may be set in non-first BDs.
1686          */
1687         #define TX_BD_LONG_INLINE_FLAGS_MASK            UINT32_C(0xffc0)
1688         #define TX_BD_LONG_INLINE_FLAGS_SFT             6
1689         /*
1690          * If set to 1, the packet ends with the data in the buffer
1691          * pointed to by this descriptor.  This flag must be
1692          * valid on every BD.
1693          */
1694         #define TX_BD_LONG_INLINE_FLAGS_PACKET_END       UINT32_C(0x40)
1695         /*
1696          * If set to 1, the device will not generate a completion for
1697          * this transmit packet unless there is an error in its processing.
1698          * If this bit is set to 0, then the packet will be completed
1699          * normally.
1700          *
1701          * This bit may be set only on the first BD of a packet.
1702          */
1703         #define TX_BD_LONG_INLINE_FLAGS_NO_CMPL          UINT32_C(0x80)
1704         /*
1705          * This value indicates how many 16B BD locations are consumed
1706          * in the ring by this packet, including the BD and inline
1707          * data.
1708          */
1709         #define TX_BD_LONG_INLINE_FLAGS_BD_CNT_MASK      UINT32_C(0x1f00)
1710         #define TX_BD_LONG_INLINE_FLAGS_BD_CNT_SFT       8
1711         /* This field is deprecated. */
1712         #define TX_BD_LONG_INLINE_FLAGS_LHINT_MASK       UINT32_C(0x6000)
1713         #define TX_BD_LONG_INLINE_FLAGS_LHINT_SFT        13
1714         /*
1715          * If set to 1, the device immediately updates the Send Consumer
1716          * Index after the buffer associated with this descriptor has
1717          * been transferred via DMA to NIC memory from host memory. An
1718          * interrupt may or may not be generated according to the state
1719          * of the interrupt avoidance mechanisms. If this bit
1720          * is set to 0, then the Consumer Index is only updated as soon
1721          * as one of the host interrupt coalescing conditions has been met.
1722          *
1723          * This bit must be valid on the first BD of a packet.
1724          */
1725         #define TX_BD_LONG_INLINE_FLAGS_COAL_NOW         UINT32_C(0x8000)
1726         /*
1727          * This is the length of the inline data, not including BD length, in
1728          * bytes.
1729          * The maximum value is 480.
1730          *
1731          * This field must be valid on all BDs of a packet.
1732          */
1733         uint16_t        len;
1734         /*
1735          * The opaque data field is passed through to the completion and can be
1736          * used for any data that the driver wants to associate with the transmit
1737          * BD.
1738          *
1739          * This field must be valid on the first BD of a packet.
1740          */
1741         uint32_t        opaque;
1742         uint64_t        unused1;
1743         /*
1744          * All bits in this field must be valid on the first BD of a packet.
1745          * Their value on other BDs of the packet is ignored.
1746          */
1747         uint16_t        lflags;
1748         /*
1749          * If set to 1, the controller replaces the TCP/UPD checksum
1750          * fields of normal TCP/UPD checksum, or the inner TCP/UDP
1751          * checksum field of the encapsulated TCP/UDP packets with the
1752          * hardware calculated TCP/UDP checksum for the packet associated
1753          * with this descriptor. The flag is ignored if the LSO flag is set.
1754          */
1755         #define TX_BD_LONG_INLINE_LFLAGS_TCP_UDP_CHKSUM     UINT32_C(0x1)
1756         /*
1757          * If set to 1, the controller replaces the IP checksum of the
1758          * normal packets, or the inner IP checksum of the encapsulated
1759          * packets with the hardware calculated IP checksum for the
1760          * packet associated with this descriptor.
1761          */
1762         #define TX_BD_LONG_INLINE_LFLAGS_IP_CHKSUM          UINT32_C(0x2)
1763         /*
1764          * If set to 1, the controller will not append an Ethernet CRC
1765          * to the end of the frame.
1766          *
1767          * Packet must be 64B or longer when this flag is set. It is not
1768          * useful to use this bit with any form of TX offload such as
1769          * CSO or LSO. The intent is that the packet from the host already
1770          * has a valid Ethernet CRC on the packet.
1771          */
1772         #define TX_BD_LONG_INLINE_LFLAGS_NOCRC              UINT32_C(0x4)
1773         /*
1774          * If set to 1, the device will record the time at which the packet
1775          * was actually transmitted at the TX MAC.
1776          */
1777         #define TX_BD_LONG_INLINE_LFLAGS_STAMP              UINT32_C(0x8)
1778         /*
1779          * If set to 1, the controller replaces the tunnel IP checksum
1780          * field with hardware calculated IP checksum for the IP header
1781          * of the packet associated with this descriptor. The hardware
1782          * updates an outer UDP checksum if it is non-zero.
1783          */
1784         #define TX_BD_LONG_INLINE_LFLAGS_T_IP_CHKSUM        UINT32_C(0x10)
1785         /*
1786          * This bit must be 0 for BDs of this type. LSO is not supported with
1787          * inline BDs.
1788          */
1789         #define TX_BD_LONG_INLINE_LFLAGS_LSO                UINT32_C(0x20)
1790         /* Since LSO is not supported with inline BDs, this bit is not used. */
1791         #define TX_BD_LONG_INLINE_LFLAGS_IPID_FMT           UINT32_C(0x40)
1792         /* Since LSO is not supported with inline BDs, this bit is not used. */
1793         #define TX_BD_LONG_INLINE_LFLAGS_T_IPID             UINT32_C(0x80)
1794         /*
1795          * If set to '1', then the RoCE ICRC will be appended to the
1796          * packet.  Packet must be a valid RoCE format packet.
1797          */
1798         #define TX_BD_LONG_INLINE_LFLAGS_ROCE_CRC           UINT32_C(0x100)
1799         /*
1800          * If set to '1', then the FCoE CRC will be appended to the
1801          * packet.  Packet must be a valid FCoE format packet.
1802          */
1803         #define TX_BD_LONG_INLINE_LFLAGS_FCOE_CRC           UINT32_C(0x200)
1804         uint16_t        unused2;
1805         uint32_t        unused3;
1806         uint16_t        unused4;
1807         /*
1808          * This value selects a CFA action to perform on the packet.
1809          * Set this value to zero if no CFA action is desired.
1810          *
1811          * This value must be valid on the first BD of a packet.
1812          */
1813         uint16_t        cfa_action;
1814         /*
1815          * This value is action meta-data that defines CFA edit operations
1816          * that are done in addition to any action editing.
1817          */
1818         uint32_t        cfa_meta;
1819         /* When key = 1, this is the VLAN tag VID value. */
1820         #define TX_BD_LONG_INLINE_CFA_META_VLAN_VID_MASK     UINT32_C(0xfff)
1821         #define TX_BD_LONG_INLINE_CFA_META_VLAN_VID_SFT      0
1822         /* When key = 1, this is the VLAN tag DE value. */
1823         #define TX_BD_LONG_INLINE_CFA_META_VLAN_DE           UINT32_C(0x1000)
1824         /* When key = 1, this is the VLAN tag PRI value. */
1825         #define TX_BD_LONG_INLINE_CFA_META_VLAN_PRI_MASK     UINT32_C(0xe000)
1826         #define TX_BD_LONG_INLINE_CFA_META_VLAN_PRI_SFT      13
1827         /* When key = 1, this is the VLAN tag TPID select value. */
1828         #define TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_MASK    UINT32_C(0x70000)
1829         #define TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_SFT     16
1830         /* 0x88a8 */
1831         #define TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_TPID88A8 \
1832                 (UINT32_C(0x0) << 16)
1833         /* 0x8100 */
1834         #define TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_TPID8100 \
1835                 (UINT32_C(0x1) << 16)
1836         /* 0x9100 */
1837         #define TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_TPID9100 \
1838                 (UINT32_C(0x2) << 16)
1839         /* 0x9200 */
1840         #define TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_TPID9200 \
1841                 (UINT32_C(0x3) << 16)
1842         /* 0x9300 */
1843         #define TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_TPID9300 \
1844                 (UINT32_C(0x4) << 16)
1845         /* Value programmed in CFA VLANTPID register. */
1846         #define TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_TPIDCFG \
1847                 (UINT32_C(0x5) << 16)
1848         #define TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_LAST \
1849                 TX_BD_LONG_INLINE_CFA_META_VLAN_TPID_TPIDCFG
1850         #define TX_BD_LONG_INLINE_CFA_META_VLAN_RESERVED_MASK \
1851                 UINT32_C(0xff80000)
1852         #define TX_BD_LONG_INLINE_CFA_META_VLAN_RESERVED_SFT 19
1853         /*
1854          * This field identifies the type of edit to be performed
1855          * on the packet.
1856          *
1857          * This value must be valid on the first BD of a packet.
1858          */
1859         #define TX_BD_LONG_INLINE_CFA_META_KEY_MASK \
1860                 UINT32_C(0xf0000000)
1861         #define TX_BD_LONG_INLINE_CFA_META_KEY_SFT           28
1862         /* No editing */
1863         #define TX_BD_LONG_INLINE_CFA_META_KEY_NONE \
1864                 (UINT32_C(0x0) << 28)
1865         /*
1866          * - meta[17:16] - TPID select value (0 = 0x8100).
1867          * - meta[15:12] - PRI/DE value.
1868          * - meta[11:0] - VID value.
1869          */
1870         #define TX_BD_LONG_INLINE_CFA_META_KEY_VLAN_TAG \
1871                 (UINT32_C(0x1) << 28)
1872         #define TX_BD_LONG_INLINE_CFA_META_KEY_LAST \
1873                 TX_BD_LONG_INLINE_CFA_META_KEY_VLAN_TAG
1874 } __attribute__((packed));
1875
1876 /* tx_bd_empty (size:128b/16B) */
1877 struct tx_bd_empty {
1878         /* This value identifies the type of buffer descriptor. */
1879         uint8_t type;
1880         #define TX_BD_EMPTY_TYPE_MASK       UINT32_C(0x3f)
1881         #define TX_BD_EMPTY_TYPE_SFT        0
1882         /*
1883          * Indicates that this BD is 1BB long and is an empty
1884          * TX BD.  Not valid for use by the driver.
1885          */
1886         #define TX_BD_EMPTY_TYPE_TX_BD_EMPTY  UINT32_C(0x1)
1887         #define TX_BD_EMPTY_TYPE_LAST        TX_BD_EMPTY_TYPE_TX_BD_EMPTY
1888         uint8_t unused_1[3];
1889         uint8_t unused_2;
1890         uint8_t unused_3[3];
1891         uint8_t unused_4[8];
1892 } __attribute__((packed));
1893
1894 /* rx_prod_pkt_bd (size:128b/16B) */
1895 struct rx_prod_pkt_bd {
1896         /* This value identifies the type of buffer descriptor. */
1897         uint16_t        flags_type;
1898         /* This value identifies the type of buffer descriptor. */
1899         #define RX_PROD_PKT_BD_TYPE_MASK         UINT32_C(0x3f)
1900         #define RX_PROD_PKT_BD_TYPE_SFT          0
1901         /*
1902          * Indicates that this BD is 16B long and is an RX Producer
1903          * (ie. empty) buffer descriptor.
1904          */
1905         #define RX_PROD_PKT_BD_TYPE_RX_PROD_PKT    UINT32_C(0x4)
1906         #define RX_PROD_PKT_BD_TYPE_LAST \
1907                 RX_PROD_PKT_BD_TYPE_RX_PROD_PKT
1908         #define RX_PROD_PKT_BD_FLAGS_MASK        UINT32_C(0xffc0)
1909         #define RX_PROD_PKT_BD_FLAGS_SFT         6
1910         /*
1911          * If set to 1, the packet will be placed at the address plus
1912          * 2B.  The 2 Bytes of padding will be written as zero.
1913          */
1914         #define RX_PROD_PKT_BD_FLAGS_SOP_PAD      UINT32_C(0x40)
1915         /*
1916          * If set to 1, the packet write will be padded out to the
1917          * nearest cache-line with zero value padding.
1918          */
1919         #define RX_PROD_PKT_BD_FLAGS_EOP_PAD      UINT32_C(0x80)
1920         /*
1921          * This value is the number of additional buffers in the ring that
1922          * describe the buffer space to be consumed for the this packet.
1923          * If the value is zero, then the packet must fit within the
1924          * space described by this BD.  If this value is 1 or more, it
1925          * indicates how many additional "buffer" BDs are in the ring
1926          * immediately following this BD to be used for the same
1927          * network packet.
1928          *
1929          * Even if the packet to be placed does not need all the
1930          * additional buffers, they will be consumed anyway.
1931          */
1932         #define RX_PROD_PKT_BD_FLAGS_BUFFERS_MASK UINT32_C(0x300)
1933         #define RX_PROD_PKT_BD_FLAGS_BUFFERS_SFT  8
1934         /*
1935          * This is the length in Bytes of the host physical buffer where
1936          * data for the packet may be placed in host memory.
1937          */
1938         uint16_t        len;
1939         /*
1940          * The opaque data field is pass through to the completion and can be
1941          * used for any data that the driver wants to associate with this
1942          * receive buffer set.
1943          */
1944         uint32_t        opaque;
1945         /*
1946          * This is the host physical address where data for the packet may
1947          * by placed in host memory.
1948          */
1949         uint64_t        address;
1950 } __attribute__((packed));
1951
1952 /* rx_prod_bfr_bd (size:128b/16B) */
1953 struct rx_prod_bfr_bd {
1954         /* This value identifies the type of buffer descriptor. */
1955         uint16_t        flags_type;
1956         /* This value identifies the type of buffer descriptor. */
1957         #define RX_PROD_BFR_BD_TYPE_MASK       UINT32_C(0x3f)
1958         #define RX_PROD_BFR_BD_TYPE_SFT        0
1959         /*
1960          * Indicates that this BD is 16B long and is an RX
1961          * Producer Buffer BD.
1962          */
1963         #define RX_PROD_BFR_BD_TYPE_RX_PROD_BFR  UINT32_C(0x5)
1964         #define RX_PROD_BFR_BD_TYPE_LAST        RX_PROD_BFR_BD_TYPE_RX_PROD_BFR
1965         #define RX_PROD_BFR_BD_FLAGS_MASK      UINT32_C(0xffc0)
1966         #define RX_PROD_BFR_BD_FLAGS_SFT       6
1967         /*
1968          * This is the length in Bytes of the host physical buffer where
1969          * data for the packet may be placed in host memory.
1970          */
1971         uint16_t        len;
1972         /* This field is not used. */
1973         uint32_t        opaque;
1974         /*
1975          * This is the host physical address where data for the packet may
1976          * by placed in host memory.
1977          */
1978         uint64_t        address;
1979 } __attribute__((packed));
1980
1981 /* rx_prod_agg_bd (size:128b/16B) */
1982 struct rx_prod_agg_bd {
1983         /* This value identifies the type of buffer descriptor. */
1984         uint16_t        flags_type;
1985         /* This value identifies the type of buffer descriptor. */
1986         #define RX_PROD_AGG_BD_TYPE_MASK         UINT32_C(0x3f)
1987         #define RX_PROD_AGG_BD_TYPE_SFT          0
1988         /*
1989          * Indicates that this BD is 16B long and is an
1990          * RX Producer Assembly Buffer Descriptor.
1991          */
1992         #define RX_PROD_AGG_BD_TYPE_RX_PROD_AGG    UINT32_C(0x6)
1993         #define RX_PROD_AGG_BD_TYPE_LAST \
1994                 RX_PROD_AGG_BD_TYPE_RX_PROD_AGG
1995         #define RX_PROD_AGG_BD_FLAGS_MASK        UINT32_C(0xffc0)
1996         #define RX_PROD_AGG_BD_FLAGS_SFT         6
1997         /*
1998          * If set to 1, the packet write will be padded out to the
1999          * nearest cache-line with zero value padding.
2000          */
2001         #define RX_PROD_AGG_BD_FLAGS_EOP_PAD      UINT32_C(0x40)
2002         /*
2003          * This is the length in Bytes of the host physical buffer where
2004          * data for the packet may be placed in host memory.
2005          */
2006         uint16_t        len;
2007         /*
2008          * The opaque data field is pass through to the completion and can be
2009          * used for any data that the driver wants to associate with this
2010          * receive assembly buffer.
2011          */
2012         uint32_t        opaque;
2013         /*
2014          * This is the host physical address where data for the packet may
2015          * by placed in host memory.
2016          */
2017         uint64_t        address;
2018 } __attribute__((packed));
2019
2020 /* cmpl_base (size:128b/16B) */
2021 struct cmpl_base {
2022         uint16_t        type;
2023         /*
2024          * This field indicates the exact type of the completion.
2025          * By convention, the LSB identifies the length of the
2026          * record in 16B units.  Even values indicate 16B
2027          * records.  Odd values indicate 32B
2028          * records.
2029          */
2030         #define CMPL_BASE_TYPE_MASK            UINT32_C(0x3f)
2031         #define CMPL_BASE_TYPE_SFT             0
2032         /*
2033          * TX L2 completion:
2034          *  Completion of TX packet.  Length = 16B
2035          */
2036         #define CMPL_BASE_TYPE_TX_L2             UINT32_C(0x0)
2037         /*
2038          * RX L2 completion:
2039          * Completion of and L2 RX packet. Length = 32B
2040          */
2041         #define CMPL_BASE_TYPE_RX_L2             UINT32_C(0x11)
2042         /*
2043          * RX Aggregation Buffer completion :
2044          * Completion of an L2 aggregation buffer in support of
2045          * TPA, HDS, or Jumbo packet completion.  Length = 16B
2046          */
2047         #define CMPL_BASE_TYPE_RX_AGG            UINT32_C(0x12)
2048         /*
2049          * RX L2 TPA Start Completion:
2050          * Completion at the beginning of a TPA operation.
2051          * Length = 32B
2052          */
2053         #define CMPL_BASE_TYPE_RX_TPA_START      UINT32_C(0x13)
2054         /*
2055          * RX L2 TPA End Completion:
2056          * Completion at the end of a TPA operation.
2057          * Length = 32B
2058          */
2059         #define CMPL_BASE_TYPE_RX_TPA_END        UINT32_C(0x15)
2060         /*
2061          * Statistics Ejection Completion:
2062          * Completion of statistics data ejection buffer.
2063          * Length = 16B
2064          */
2065         #define CMPL_BASE_TYPE_STAT_EJECT        UINT32_C(0x1a)
2066         /*
2067          * HWRM Command Completion:
2068          * Completion of an HWRM command.
2069          */
2070         #define CMPL_BASE_TYPE_HWRM_DONE         UINT32_C(0x20)
2071         /* Forwarded HWRM Request */
2072         #define CMPL_BASE_TYPE_HWRM_FWD_REQ      UINT32_C(0x22)
2073         /* Forwarded HWRM Response */
2074         #define CMPL_BASE_TYPE_HWRM_FWD_RESP     UINT32_C(0x24)
2075         /* HWRM Asynchronous Event Information */
2076         #define CMPL_BASE_TYPE_HWRM_ASYNC_EVENT  UINT32_C(0x2e)
2077         /* CQ Notification */
2078         #define CMPL_BASE_TYPE_CQ_NOTIFICATION   UINT32_C(0x30)
2079         /* SRQ Threshold Event */
2080         #define CMPL_BASE_TYPE_SRQ_EVENT         UINT32_C(0x32)
2081         /* DBQ Threshold Event */
2082         #define CMPL_BASE_TYPE_DBQ_EVENT         UINT32_C(0x34)
2083         /* QP Async Notification */
2084         #define CMPL_BASE_TYPE_QP_EVENT          UINT32_C(0x38)
2085         /* Function Async Notification */
2086         #define CMPL_BASE_TYPE_FUNC_EVENT        UINT32_C(0x3a)
2087         #define CMPL_BASE_TYPE_LAST             CMPL_BASE_TYPE_FUNC_EVENT
2088         /* info1 is 16 b */
2089         uint16_t        info1;
2090         /* info2 is 32 b */
2091         uint32_t        info2;
2092         /*
2093          * This value is written by the NIC such that it will be different
2094          * for each pass through the completion queue.   The even passes
2095          * will write 1.  The odd passes will write 0.
2096          */
2097         uint32_t        info3_v;
2098         #define CMPL_BASE_V         UINT32_C(0x1)
2099         #define CMPL_BASE_INFO3_MASK UINT32_C(0xfffffffe)
2100         #define CMPL_BASE_INFO3_SFT 1
2101         /* info4 is 32 b */
2102         uint32_t        info4;
2103 } __attribute__((packed));
2104
2105 /* tx_cmpl (size:128b/16B) */
2106 struct tx_cmpl {
2107         uint16_t        flags_type;
2108         /*
2109          * This field indicates the exact type of the completion.
2110          * By convention, the LSB identifies the length of the
2111          * record in 16B units.  Even values indicate 16B
2112          * records.  Odd values indicate 32B
2113          * records.
2114          */
2115         #define TX_CMPL_TYPE_MASK       UINT32_C(0x3f)
2116         #define TX_CMPL_TYPE_SFT        0
2117         /*
2118          * TX L2 completion:
2119          *  Completion of TX packet.  Length = 16B
2120          */
2121         #define TX_CMPL_TYPE_TX_L2        UINT32_C(0x0)
2122         #define TX_CMPL_TYPE_LAST        TX_CMPL_TYPE_TX_L2
2123         #define TX_CMPL_FLAGS_MASK      UINT32_C(0xffc0)
2124         #define TX_CMPL_FLAGS_SFT       6
2125         /*
2126          * When this bit is '1', it indicates a packet that has an
2127          * error of some type.  Type of error is indicated in
2128          * error_flags.
2129          */
2130         #define TX_CMPL_FLAGS_ERROR      UINT32_C(0x40)
2131         /*
2132          * When this bit is '1', it indicates that the packet completed
2133          * was transmitted using the push acceleration data provided
2134          * by the driver.  When this bit is '0', it indicates that the
2135          * packet had not push acceleration data written or was executed
2136          * as a normal packet even though push data was provided.
2137          */
2138         #define TX_CMPL_FLAGS_PUSH       UINT32_C(0x80)
2139         /* unused1 is 16 b */
2140         uint16_t        unused_0;
2141         /*
2142          * This is a copy of the opaque field from the first TX BD of this
2143          * transmitted packet.
2144          */
2145         uint32_t        opaque;
2146         uint16_t        errors_v;
2147         /*
2148          * This value is written by the NIC such that it will be different
2149          * for each pass through the completion queue.   The even passes
2150          * will write 1.  The odd passes will write 0.
2151          */
2152         #define TX_CMPL_V                              UINT32_C(0x1)
2153         #define TX_CMPL_ERRORS_MASK                    UINT32_C(0xfffe)
2154         #define TX_CMPL_ERRORS_SFT                     1
2155         /*
2156          * This error indicates that there was some sort of problem
2157          * with the BDs for the packet.
2158          */
2159         #define TX_CMPL_ERRORS_BUFFER_ERROR_MASK        UINT32_C(0xe)
2160         #define TX_CMPL_ERRORS_BUFFER_ERROR_SFT         1
2161         /* No error */
2162         #define TX_CMPL_ERRORS_BUFFER_ERROR_NO_ERROR      (UINT32_C(0x0) << 1)
2163         /*
2164          * Bad Format:
2165          * BDs were not formatted correctly.
2166          */
2167         #define TX_CMPL_ERRORS_BUFFER_ERROR_BAD_FMT       (UINT32_C(0x2) << 1)
2168         #define TX_CMPL_ERRORS_BUFFER_ERROR_LAST \
2169                 TX_CMPL_ERRORS_BUFFER_ERROR_BAD_FMT
2170         /*
2171          * When this bit is '1', it indicates that the length of
2172          * the packet was zero.  No packet was transmitted.
2173          */
2174         #define TX_CMPL_ERRORS_ZERO_LENGTH_PKT          UINT32_C(0x10)
2175         /*
2176          * When this bit is '1', it indicates that the packet
2177          * was longer than the programmed limit in TDI. No
2178          * packet was transmitted.
2179          */
2180         #define TX_CMPL_ERRORS_EXCESSIVE_BD_LENGTH      UINT32_C(0x20)
2181         /*
2182          * When this bit is '1', it indicates that one or more of the
2183          * BDs associated with this packet generated a PCI error.
2184          * This probably means the address was not valid.
2185          */
2186         #define TX_CMPL_ERRORS_DMA_ERROR                UINT32_C(0x40)
2187         /*
2188          * When this bit is '1', it indicates that the packet was longer
2189          * than indicated by the hint.  No packet was transmitted.
2190          */
2191         #define TX_CMPL_ERRORS_HINT_TOO_SHORT           UINT32_C(0x80)
2192         /*
2193          * When this bit is '1', it indicates that the packet was
2194          * dropped due to Poison TLP error on one or more of the
2195          * TLPs in the PXP completion.
2196          */
2197         #define TX_CMPL_ERRORS_POISON_TLP_ERROR         UINT32_C(0x100)
2198         /* unused2 is 16 b */
2199         uint16_t        unused_1;
2200         /* unused3 is 32 b */
2201         uint32_t        unused_2;
2202 } __attribute__((packed));
2203
2204 /* rx_pkt_cmpl (size:128b/16B) */
2205 struct rx_pkt_cmpl {
2206         uint16_t        flags_type;
2207         /*
2208          * This field indicates the exact type of the completion.
2209          * By convention, the LSB identifies the length of the
2210          * record in 16B units.  Even values indicate 16B
2211          * records.  Odd values indicate 32B
2212          * records.
2213          */
2214         #define RX_PKT_CMPL_TYPE_MASK                   UINT32_C(0x3f)
2215         #define RX_PKT_CMPL_TYPE_SFT                    0
2216         /*
2217          * RX L2 completion:
2218          * Completion of and L2 RX packet. Length = 32B
2219          */
2220         #define RX_PKT_CMPL_TYPE_RX_L2                    UINT32_C(0x11)
2221         #define RX_PKT_CMPL_TYPE_LAST                    RX_PKT_CMPL_TYPE_RX_L2
2222         #define RX_PKT_CMPL_FLAGS_MASK                  UINT32_C(0xffc0)
2223         #define RX_PKT_CMPL_FLAGS_SFT                   6
2224         /*
2225          * When this bit is '1', it indicates a packet that has an
2226          * error of some type.  Type of error is indicated in
2227          * error_flags.
2228          */
2229         #define RX_PKT_CMPL_FLAGS_ERROR                  UINT32_C(0x40)
2230         /* This field indicates how the packet was placed in the buffer. */
2231         #define RX_PKT_CMPL_FLAGS_PLACEMENT_MASK         UINT32_C(0x380)
2232         #define RX_PKT_CMPL_FLAGS_PLACEMENT_SFT          7
2233         /*
2234          * Normal:
2235          * Packet was placed using normal algorithm.
2236          */
2237         #define RX_PKT_CMPL_FLAGS_PLACEMENT_NORMAL         (UINT32_C(0x0) << 7)
2238         /*
2239          * Jumbo:
2240          * Packet was placed using jumbo algorithm.
2241          */
2242         #define RX_PKT_CMPL_FLAGS_PLACEMENT_JUMBO          (UINT32_C(0x1) << 7)
2243         /*
2244          * Header/Data Separation:
2245          * Packet was placed using Header/Data separation algorithm.
2246          * The separation location is indicated by the itype field.
2247          */
2248         #define RX_PKT_CMPL_FLAGS_PLACEMENT_HDS            (UINT32_C(0x2) << 7)
2249         #define RX_PKT_CMPL_FLAGS_PLACEMENT_LAST \
2250                 RX_PKT_CMPL_FLAGS_PLACEMENT_HDS
2251         /* This bit is '1' if the RSS field in this completion is valid. */
2252         #define RX_PKT_CMPL_FLAGS_RSS_VALID              UINT32_C(0x400)
2253         /* unused is 1 b */
2254         #define RX_PKT_CMPL_FLAGS_UNUSED                 UINT32_C(0x800)
2255         /*
2256          * This value indicates what the inner packet determined for the
2257          * packet was.
2258          */
2259         #define RX_PKT_CMPL_FLAGS_ITYPE_MASK             UINT32_C(0xf000)
2260         #define RX_PKT_CMPL_FLAGS_ITYPE_SFT              12
2261         /*
2262          * Not Known:
2263          * Indicates that the packet type was not known.
2264          */
2265         #define RX_PKT_CMPL_FLAGS_ITYPE_NOT_KNOWN \
2266                 (UINT32_C(0x0) << 12)
2267         /*
2268          * IP Packet:
2269          * Indicates that the packet was an IP packet, but further
2270          * classification was not possible.
2271          */
2272         #define RX_PKT_CMPL_FLAGS_ITYPE_IP \
2273                 (UINT32_C(0x1) << 12)
2274         /*
2275          * TCP Packet:
2276          * Indicates that the packet was IP and TCP.
2277          * This indicates that the payload_offset field is valid.
2278          */
2279         #define RX_PKT_CMPL_FLAGS_ITYPE_TCP \
2280                 (UINT32_C(0x2) << 12)
2281         /*
2282          * UDP Packet:
2283          * Indicates that the packet was IP and UDP.
2284          * This indicates that the payload_offset field is valid.
2285          */
2286         #define RX_PKT_CMPL_FLAGS_ITYPE_UDP \
2287                 (UINT32_C(0x3) << 12)
2288         /*
2289          * FCoE Packet:
2290          * Indicates that the packet was recognized as a FCoE.
2291          * This also indicates that the payload_offset field is valid.
2292          */
2293         #define RX_PKT_CMPL_FLAGS_ITYPE_FCOE \
2294                 (UINT32_C(0x4) << 12)
2295         /*
2296          * RoCE Packet:
2297          * Indicates that the packet was recognized as a RoCE.
2298          * This also indicates that the payload_offset field is valid.
2299          */
2300         #define RX_PKT_CMPL_FLAGS_ITYPE_ROCE \
2301                 (UINT32_C(0x5) << 12)
2302         /*
2303          * ICMP Packet:
2304          * Indicates that the packet was recognized as ICMP.
2305          * This indicates that the payload_offset field is valid.
2306          */
2307         #define RX_PKT_CMPL_FLAGS_ITYPE_ICMP \
2308                 (UINT32_C(0x7) << 12)
2309         /*
2310          * PtP packet wo/timestamp:
2311          * Indicates that the packet was recognized as a PtP
2312          * packet.
2313          */
2314         #define RX_PKT_CMPL_FLAGS_ITYPE_PTP_WO_TIMESTAMP \
2315                 (UINT32_C(0x8) << 12)
2316         /*
2317          * PtP packet w/timestamp:
2318          * Indicates that the packet was recognized as a PtP
2319          * packet and that a timestamp was taken for the packet.
2320          */
2321         #define RX_PKT_CMPL_FLAGS_ITYPE_PTP_W_TIMESTAMP \
2322                 (UINT32_C(0x9) << 12)
2323         #define RX_PKT_CMPL_FLAGS_ITYPE_LAST \
2324                 RX_PKT_CMPL_FLAGS_ITYPE_PTP_W_TIMESTAMP
2325         /*
2326          * This is the length of the data for the packet stored in the
2327          * buffer(s) identified by the opaque value.  This includes
2328          * the packet BD and any associated buffer BDs.  This does not include
2329          * the the length of any data places in aggregation BDs.
2330          */
2331         uint16_t        len;
2332         /*
2333          * This is a copy of the opaque field from the RX BD this completion
2334          * corresponds to.
2335          */
2336         uint32_t        opaque;
2337         uint8_t agg_bufs_v1;
2338         /*
2339          * This value is written by the NIC such that it will be different
2340          * for each pass through the completion queue.   The even passes
2341          * will write 1.  The odd passes will write 0.
2342          */
2343         #define RX_PKT_CMPL_V1           UINT32_C(0x1)
2344         /*
2345          * This value is the number of aggregation buffers that follow this
2346          * entry in the completion ring that are a part of this packet.
2347          * If the value is zero, then the packet is completely contained
2348          * in the buffer space provided for the packet in the RX ring.
2349          */
2350         #define RX_PKT_CMPL_AGG_BUFS_MASK UINT32_C(0x3e)
2351         #define RX_PKT_CMPL_AGG_BUFS_SFT 1
2352         /* unused1 is 2 b */
2353         #define RX_PKT_CMPL_UNUSED1_MASK UINT32_C(0xc0)
2354         #define RX_PKT_CMPL_UNUSED1_SFT  6
2355         /*
2356          * This is the RSS hash type for the packet.  The value is packed
2357          * {tuple_extrac_op[1:0],rss_profile_id[4:0],tuple_extrac_op[2]}.
2358          *
2359          * The value of tuple_extrac_op provides the information about
2360          * what fields the hash was computed on.
2361          * * 0: The RSS hash was computed over source IP address,
2362          * destination IP address, source port, and destination port of inner
2363          * IP and TCP or UDP headers. Note: For non-tunneled packets,
2364          * the packet headers are considered inner packet headers for the RSS
2365          * hash computation purpose.
2366          * * 1: The RSS hash was computed over source IP address and destination
2367          * IP address of inner IP header. Note: For non-tunneled packets,
2368          * the packet headers are considered inner packet headers for the RSS
2369          * hash computation purpose.
2370          * * 2: The RSS hash was computed over source IP address,
2371          * destination IP address, source port, and destination port of
2372          * IP and TCP or UDP headers of outer tunnel headers.
2373          * Note: For non-tunneled packets, this value is not applicable.
2374          * * 3: The RSS hash was computed over source IP address and
2375          * destination IP address of IP header of outer tunnel headers.
2376          * Note: For non-tunneled packets, this value is not applicable.
2377          *
2378          * Note that 4-tuples values listed above are applicable
2379          * for layer 4 protocols supported and enabled for RSS in the hardware,
2380          * HWRM firmware, and drivers. For example, if RSS hash is supported and
2381          * enabled for TCP traffic only, then the values of tuple_extract_op
2382          * corresponding to 4-tuples are only valid for TCP traffic.
2383          */
2384         uint8_t rss_hash_type;
2385         /*
2386          * This value indicates the offset in bytes from the beginning of the packet
2387          * where the inner payload starts.  This value is valid for TCP, UDP,
2388          * FCoE, and RoCE packets.
2389          *
2390          * A value of zero indicates that header is 256B into the packet.
2391          */
2392         uint8_t payload_offset;
2393         /* unused2 is 8 b */
2394         uint8_t unused1;
2395         /*
2396          * This value is the RSS hash value calculated for the packet
2397          * based on the mode bits and key value in the VNIC.
2398          */
2399         uint32_t        rss_hash;
2400 } __attribute__((packed));
2401
2402 /* Last 16 bytes of rx_pkt_cmpl. */
2403 /* rx_pkt_cmpl_hi (size:128b/16B) */
2404 struct rx_pkt_cmpl_hi {
2405         uint32_t        flags2;
2406         /*
2407          * This indicates that the ip checksum was calculated for the
2408          * inner packet and that the ip_cs_error field indicates if there
2409          * was an error.
2410          */
2411         #define RX_PKT_CMPL_FLAGS2_IP_CS_CALC       UINT32_C(0x1)
2412         /*
2413          * This indicates that the TCP, UDP or ICMP checksum was
2414          * calculated for the inner packet and that the l4_cs_error field
2415          * indicates if there was an error.
2416          */
2417         #define RX_PKT_CMPL_FLAGS2_L4_CS_CALC       UINT32_C(0x2)
2418         /*
2419          * This indicates that the ip checksum was calculated for the
2420          * tunnel header and that the t_ip_cs_error field indicates if there
2421          * was an error.
2422          */
2423         #define RX_PKT_CMPL_FLAGS2_T_IP_CS_CALC     UINT32_C(0x4)
2424         /*
2425          * This indicates that the UDP checksum was
2426          * calculated for the tunnel packet and that the t_l4_cs_error field
2427          * indicates if there was an error.
2428          */
2429         #define RX_PKT_CMPL_FLAGS2_T_L4_CS_CALC     UINT32_C(0x8)
2430         /* This value indicates what format the metadata field is. */
2431         #define RX_PKT_CMPL_FLAGS2_META_FORMAT_MASK UINT32_C(0xf0)
2432         #define RX_PKT_CMPL_FLAGS2_META_FORMAT_SFT  4
2433         /* No metadata informtaion.  Value is zero. */
2434         #define RX_PKT_CMPL_FLAGS2_META_FORMAT_NONE   (UINT32_C(0x0) << 4)
2435         /*
2436          * The metadata field contains the VLAN tag and TPID value.
2437          * - metadata[11:0] contains the vlan VID value.
2438          * - metadata[12] contains the vlan DE value.
2439          * - metadata[15:13] contains the vlan PRI value.
2440          * - metadata[31:16] contains the vlan TPID value.
2441          */
2442         #define RX_PKT_CMPL_FLAGS2_META_FORMAT_VLAN   (UINT32_C(0x1) << 4)
2443         #define RX_PKT_CMPL_FLAGS2_META_FORMAT_LAST \
2444                 RX_PKT_CMPL_FLAGS2_META_FORMAT_VLAN
2445         /*
2446          * This field indicates the IP type for the inner-most IP header.
2447          * A value of '0' indicates IPv4.  A value of '1' indicates IPv6.
2448          * This value is only valid if itype indicates a packet
2449          * with an IP header.
2450          */
2451         #define RX_PKT_CMPL_FLAGS2_IP_TYPE          UINT32_C(0x100)
2452         /*
2453          * This is data from the CFA block as indicated by the meta_format
2454          * field.
2455          */
2456         uint32_t        metadata;
2457         /* When meta_format=1, this value is the VLAN VID. */
2458         #define RX_PKT_CMPL_METADATA_VID_MASK UINT32_C(0xfff)
2459         #define RX_PKT_CMPL_METADATA_VID_SFT  0
2460         /* When meta_format=1, this value is the VLAN DE. */
2461         #define RX_PKT_CMPL_METADATA_DE       UINT32_C(0x1000)
2462         /* When meta_format=1, this value is the VLAN PRI. */
2463         #define RX_PKT_CMPL_METADATA_PRI_MASK UINT32_C(0xe000)
2464         #define RX_PKT_CMPL_METADATA_PRI_SFT  13
2465         /* When meta_format=1, this value is the VLAN TPID. */
2466         #define RX_PKT_CMPL_METADATA_TPID_MASK UINT32_C(0xffff0000)
2467         #define RX_PKT_CMPL_METADATA_TPID_SFT 16
2468         uint16_t        errors_v2;
2469         /*
2470          * This value is written by the NIC such that it will be different
2471          * for each pass through the completion queue.   The even passes
2472          * will write 1.  The odd passes will write 0.
2473          */
2474         #define RX_PKT_CMPL_V2 \
2475                 UINT32_C(0x1)
2476         #define RX_PKT_CMPL_ERRORS_MASK \
2477                 UINT32_C(0xfffe)
2478         #define RX_PKT_CMPL_ERRORS_SFT                               1
2479         /*
2480          * This error indicates that there was some sort of problem with
2481          * the BDs for the packet that was found after part of the
2482          * packet was already placed.  The packet should be treated as
2483          * invalid.
2484          */
2485         #define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_MASK \
2486                 UINT32_C(0xe)
2487         #define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_SFT                   1
2488         /* No buffer error */
2489         #define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_NO_BUFFER \
2490                 (UINT32_C(0x0) << 1)
2491         /*
2492          * Did Not Fit:
2493          * Packet did not fit into packet buffer provided.
2494          * For regular placement, this means the packet did not fit
2495          * in the buffer provided.  For HDS and jumbo placement, this
2496          * means that the packet could not be placed into 7 physical
2497          * buffers or less.
2498          */
2499         #define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_DID_NOT_FIT \
2500                 (UINT32_C(0x1) << 1)
2501         /*
2502          * Not On Chip:
2503          * All BDs needed for the packet were not on-chip when
2504          * the packet arrived.
2505          */
2506         #define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_NOT_ON_CHIP \
2507                 (UINT32_C(0x2) << 1)
2508         /*
2509          * Bad Format:
2510          * BDs were not formatted correctly.
2511          */
2512         #define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_BAD_FORMAT \
2513                 (UINT32_C(0x3) << 1)
2514         #define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_LAST \
2515                 RX_PKT_CMPL_ERRORS_BUFFER_ERROR_BAD_FORMAT
2516         /*
2517          * This indicates that there was an error in the IP header
2518          * checksum.
2519          */
2520         #define RX_PKT_CMPL_ERRORS_IP_CS_ERROR \
2521                 UINT32_C(0x10)
2522         /*
2523          * This indicates that there was an error in the TCP, UDP
2524          * or ICMP checksum.
2525          */
2526         #define RX_PKT_CMPL_ERRORS_L4_CS_ERROR \
2527                 UINT32_C(0x20)
2528         /*
2529          * This indicates that there was an error in the tunnel
2530          * IP header checksum.
2531          */
2532         #define RX_PKT_CMPL_ERRORS_T_IP_CS_ERROR \
2533                 UINT32_C(0x40)
2534         /*
2535          * This indicates that there was an error in the tunnel
2536          * UDP checksum.
2537          */
2538         #define RX_PKT_CMPL_ERRORS_T_L4_CS_ERROR \
2539                 UINT32_C(0x80)
2540         /*
2541          * This indicates that there was a CRC error on either an FCoE
2542          * or RoCE packet.  The itype indicates the packet type.
2543          */
2544         #define RX_PKT_CMPL_ERRORS_CRC_ERROR \
2545                 UINT32_C(0x100)
2546         /*
2547          * This indicates that there was an error in the tunnel
2548          * portion of the packet when this
2549          * field is non-zero.
2550          */
2551         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_MASK \
2552                 UINT32_C(0xe00)
2553         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_SFT                    9
2554         /*
2555          * No additional error occurred on the tunnel portion
2556          * of the packet of the packet does not have a tunnel.
2557          */
2558         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_NO_ERROR \
2559                 (UINT32_C(0x0) << 9)
2560         /*
2561          * Indicates that IP header version does not match
2562          * expectation from L2 Ethertype for IPv4 and IPv6
2563          * in the tunnel header.
2564          */
2565         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_VERSION \
2566                 (UINT32_C(0x1) << 9)
2567         /*
2568          * Indicates that header length is out of range in the
2569          * tunnel header. Valid for
2570          * IPv4.
2571          */
2572         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_HDR_LEN \
2573                 (UINT32_C(0x2) << 9)
2574         /*
2575          * Indicates that the physical packet is shorter than that
2576          * claimed by the PPPoE header length for a tunnel PPPoE
2577          * packet.
2578          */
2579         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_TUNNEL_TOTAL_ERROR \
2580                 (UINT32_C(0x3) << 9)
2581         /*
2582          * Indicates that physical packet is shorter than that claimed
2583          * by the tunnel l3 header length. Valid for IPv4, or IPv6
2584          * tunnel packet packets.
2585          */
2586         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_IP_TOTAL_ERROR \
2587                 (UINT32_C(0x4) << 9)
2588         /*
2589          * Indicates that the physical packet is shorter than that
2590          * claimed by the tunnel UDP header length for a tunnel
2591          * UDP packet that is not fragmented.
2592          */
2593         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_UDP_TOTAL_ERROR \
2594                 (UINT32_C(0x5) << 9)
2595         /*
2596          * indicates that the IPv4 TTL or IPv6 hop limit check
2597          * have failed (e.g. TTL = 0) in the tunnel header. Valid
2598          * for IPv4, and IPv6.
2599          */
2600         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL \
2601                 (UINT32_C(0x6) << 9)
2602         #define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_LAST \
2603                 RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL
2604         /*
2605          * This indicates that there was an error in the inner
2606          * portion of the packet when this
2607          * field is non-zero.
2608          */
2609         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_MASK \
2610                 UINT32_C(0xf000)
2611         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_SFT                      12
2612         /*
2613          * No additional error occurred on the tunnel portion
2614          * of the packet of the packet does not have a tunnel.
2615          */
2616         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_NO_ERROR \
2617                 (UINT32_C(0x0) << 12)
2618         /*
2619          * Indicates that IP header version does not match
2620          * expectation from L2 Ethertype for IPv4 and IPv6 or that
2621          * option other than VFT was parsed on
2622          * FCoE packet.
2623          */
2624         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_L3_BAD_VERSION \
2625                 (UINT32_C(0x1) << 12)
2626         /*
2627          * indicates that header length is out of range. Valid for
2628          * IPv4 and RoCE
2629          */
2630         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_L3_BAD_HDR_LEN \
2631                 (UINT32_C(0x2) << 12)
2632         /*
2633          * indicates that the IPv4 TTL or IPv6 hop limit check
2634          * have failed (e.g. TTL = 0). Valid for IPv4, and IPv6
2635          */
2636         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_L3_BAD_TTL \
2637                 (UINT32_C(0x3) << 12)
2638         /*
2639          * Indicates that physical packet is shorter than that
2640          * claimed by the l3 header length. Valid for IPv4,
2641          * IPv6 packet or RoCE packets.
2642          */
2643         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_IP_TOTAL_ERROR \
2644                 (UINT32_C(0x4) << 12)
2645         /*
2646          * Indicates that the physical packet is shorter than that
2647          * claimed by the UDP header length for a UDP packet that is
2648          * not fragmented.
2649          */
2650         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_UDP_TOTAL_ERROR \
2651                 (UINT32_C(0x5) << 12)
2652         /*
2653          * Indicates that TCP header length > IP payload. Valid for
2654          * TCP packets only.
2655          */
2656         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN \
2657                 (UINT32_C(0x6) << 12)
2658         /* Indicates that TCP header length < 5. Valid for TCP. */
2659         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN_TOO_SMALL \
2660                 (UINT32_C(0x7) << 12)
2661         /*
2662          * Indicates that TCP option headers result in a TCP header
2663          * size that does not match data offset in TCP header. Valid
2664          * for TCP.
2665          */
2666         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN \
2667                 (UINT32_C(0x8) << 12)
2668         #define RX_PKT_CMPL_ERRORS_PKT_ERROR_LAST \
2669                 RX_PKT_CMPL_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN
2670         /*
2671          * This field identifies the CFA action rule that was used for this
2672          * packet.
2673          */
2674         uint16_t        cfa_code;
2675         uint32_t        reorder;
2676         /*
2677          * This value holds the reordering sequence number for the packet.
2678          * If the reordering sequence is not valid, then this value is zero.
2679          * The reordering domain for the packet is in the bottom 8 to 10b of
2680          * the rss_hash value.  The bottom 20b of this value contain the
2681          * ordering domain value for the packet.
2682          */
2683         #define RX_PKT_CMPL_REORDER_MASK UINT32_C(0xffffff)
2684         #define RX_PKT_CMPL_REORDER_SFT 0
2685 } __attribute__((packed));
2686
2687 /* rx_tpa_start_cmpl (size:128b/16B) */
2688 struct rx_tpa_start_cmpl {
2689         uint16_t        flags_type;
2690         /*
2691          * This field indicates the exact type of the completion.
2692          * By convention, the LSB identifies the length of the
2693          * record in 16B units.  Even values indicate 16B
2694          * records.  Odd values indicate 32B
2695          * records.
2696          */
2697         #define RX_TPA_START_CMPL_TYPE_MASK                UINT32_C(0x3f)
2698         #define RX_TPA_START_CMPL_TYPE_SFT                 0
2699         /*
2700          * RX L2 TPA Start Completion:
2701          * Completion at the beginning of a TPA operation.
2702          * Length = 32B
2703          */
2704         #define RX_TPA_START_CMPL_TYPE_RX_TPA_START          UINT32_C(0x13)
2705         #define RX_TPA_START_CMPL_TYPE_LAST \
2706                 RX_TPA_START_CMPL_TYPE_RX_TPA_START
2707         #define RX_TPA_START_CMPL_FLAGS_MASK               UINT32_C(0xffc0)
2708         #define RX_TPA_START_CMPL_FLAGS_SFT                6
2709         /* This bit will always be '0' for TPA start completions. */
2710         #define RX_TPA_START_CMPL_FLAGS_ERROR               UINT32_C(0x40)
2711         /* This field indicates how the packet was placed in the buffer. */
2712         #define RX_TPA_START_CMPL_FLAGS_PLACEMENT_MASK      UINT32_C(0x380)
2713         #define RX_TPA_START_CMPL_FLAGS_PLACEMENT_SFT       7
2714         /*
2715          * Jumbo:
2716          * TPA Packet was placed using jumbo algorithm.  This means
2717          * that the first buffer will be filled with data before
2718          * moving to aggregation buffers.  Each aggregation buffer
2719          * will be filled before moving to the next aggregation
2720          * buffer.
2721          */
2722         #define RX_TPA_START_CMPL_FLAGS_PLACEMENT_JUMBO \
2723                 (UINT32_C(0x1) << 7)
2724         /*
2725          * Header/Data Separation:
2726          * Packet was placed using Header/Data separation algorithm.
2727          * The separation location is indicated by the itype field.
2728          */
2729         #define RX_TPA_START_CMPL_FLAGS_PLACEMENT_HDS \
2730                 (UINT32_C(0x2) << 7)
2731         /*
2732          * GRO/Jumbo:
2733          * Packet will be placed using GRO/Jumbo where the first
2734          * packet is filled with data. Subsequent packets will be
2735          * placed such that any one packet does not span two
2736          * aggregation buffers unless it starts at the beginning of
2737          * an aggregation buffer.
2738          */
2739         #define RX_TPA_START_CMPL_FLAGS_PLACEMENT_GRO_JUMBO \
2740                 (UINT32_C(0x5) << 7)
2741         /*
2742          * GRO/Header-Data Separation:
2743          * Packet will be placed using GRO/HDS where the header
2744          * is in the first packet.
2745          * Payload of each packet will be
2746          * placed such that any one packet does not span two
2747          * aggregation buffers unless it starts at the beginning of
2748          * an aggregation buffer.
2749          */
2750         #define RX_TPA_START_CMPL_FLAGS_PLACEMENT_GRO_HDS \
2751                 (UINT32_C(0x6) << 7)
2752         #define RX_TPA_START_CMPL_FLAGS_PLACEMENT_LAST \
2753                 RX_TPA_START_CMPL_FLAGS_PLACEMENT_GRO_HDS
2754         /* This bit is '1' if the RSS field in this completion is valid. */
2755         #define RX_TPA_START_CMPL_FLAGS_RSS_VALID           UINT32_C(0x400)
2756         /* unused is 1 b */
2757         #define RX_TPA_START_CMPL_FLAGS_UNUSED              UINT32_C(0x800)
2758         /*
2759          * This value indicates what the inner packet determined for the
2760          * packet was.
2761          */
2762         #define RX_TPA_START_CMPL_FLAGS_ITYPE_MASK          UINT32_C(0xf000)
2763         #define RX_TPA_START_CMPL_FLAGS_ITYPE_SFT           12
2764         /*
2765          * TCP Packet:
2766          * Indicates that the packet was IP and TCP.
2767          */
2768         #define RX_TPA_START_CMPL_FLAGS_ITYPE_TCP \
2769                 (UINT32_C(0x2) << 12)
2770         #define RX_TPA_START_CMPL_FLAGS_ITYPE_LAST \
2771                 RX_TPA_START_CMPL_FLAGS_ITYPE_TCP
2772         /*
2773          * This value indicates the amount of packet data written to the
2774          * buffer the opaque field in this completion corresponds to.
2775          */
2776         uint16_t        len;
2777         /*
2778          * This is a copy of the opaque field from the RX BD this completion
2779          * corresponds to.
2780          */
2781         uint32_t        opaque;
2782         /*
2783          * This value is written by the NIC such that it will be different
2784          * for each pass through the completion queue.   The even passes
2785          * will write 1.  The odd passes will write 0.
2786          */
2787         uint8_t v1;
2788         /*
2789          * This value is written by the NIC such that it will be different
2790          * for each pass through the completion queue.   The even passes
2791          * will write 1.  The odd passes will write 0.
2792          */
2793         #define RX_TPA_START_CMPL_V1 UINT32_C(0x1)
2794         #define RX_TPA_START_CMPL_LAST RX_TPA_START_CMPL_V1
2795         /*
2796          * This is the RSS hash type for the packet.  The value is packed
2797          * {tuple_extrac_op[1:0],rss_profile_id[4:0],tuple_extrac_op[2]}.
2798          *
2799          * The value of tuple_extrac_op provides the information about
2800          * what fields the hash was computed on.
2801          * * 0: The RSS hash was computed over source IP address,
2802          * destination IP address, source port, and destination port of inner
2803          * IP and TCP or UDP headers. Note: For non-tunneled packets,
2804          * the packet headers are considered inner packet headers for the RSS
2805          * hash computation purpose.
2806          * * 1: The RSS hash was computed over source IP address and destination
2807          * IP address of inner IP header. Note: For non-tunneled packets,
2808          * the packet headers are considered inner packet headers for the RSS
2809          * hash computation purpose.
2810          * * 2: The RSS hash was computed over source IP address,
2811          * destination IP address, source port, and destination port of
2812          * IP and TCP or UDP headers of outer tunnel headers.
2813          * Note: For non-tunneled packets, this value is not applicable.
2814          * * 3: The RSS hash was computed over source IP address and
2815          * destination IP address of IP header of outer tunnel headers.
2816          * Note: For non-tunneled packets, this value is not applicable.
2817          *
2818          * Note that 4-tuples values listed above are applicable
2819          * for layer 4 protocols supported and enabled for RSS in the hardware,
2820          * HWRM firmware, and drivers. For example, if RSS hash is supported and
2821          * enabled for TCP traffic only, then the values of tuple_extract_op
2822          * corresponding to 4-tuples are only valid for TCP traffic.
2823          */
2824         uint8_t rss_hash_type;
2825         /*
2826          * This is the aggregation ID that the completion is associated
2827          * with.  Use this number to correlate the TPA start completion
2828          * with the TPA end completion.
2829          */
2830         uint16_t        agg_id;
2831         /* unused2 is 9 b */
2832         #define RX_TPA_START_CMPL_UNUSED2_MASK UINT32_C(0x1ff)
2833         #define RX_TPA_START_CMPL_UNUSED2_SFT 0
2834         /*
2835          * This is the aggregation ID that the completion is associated
2836          * with.  Use this number to correlate the TPA start completion
2837          * with the TPA end completion.
2838          */
2839         #define RX_TPA_START_CMPL_AGG_ID_MASK UINT32_C(0xfe00)
2840         #define RX_TPA_START_CMPL_AGG_ID_SFT  9
2841         /*
2842          * This value is the RSS hash value calculated for the packet
2843          * based on the mode bits and key value in the VNIC.
2844          */
2845         uint32_t        rss_hash;
2846 } __attribute__((packed));
2847
2848 /* Last 16 bytes of rx_tpq_start_cmpl. */
2849 /* rx_tpa_start_cmpl_hi (size:128b/16B) */
2850 struct rx_tpa_start_cmpl_hi {
2851         uint32_t        flags2;
2852         /*
2853          * This indicates that the ip checksum was calculated for the
2854          * inner packet and that the sum passed for all segments
2855          * included in the aggregation.
2856          */
2857         #define RX_TPA_START_CMPL_FLAGS2_IP_CS_CALC       UINT32_C(0x1)
2858         /*
2859          * This indicates that the TCP, UDP or ICMP checksum was
2860          * calculated for the inner packet and that the sum passed
2861          * for all segments included in the aggregation.
2862          */
2863         #define RX_TPA_START_CMPL_FLAGS2_L4_CS_CALC       UINT32_C(0x2)
2864         /*
2865          * This indicates that the ip checksum was calculated for the
2866          * tunnel header and that the sum passed for all segments
2867          * included in the aggregation.
2868          */
2869         #define RX_TPA_START_CMPL_FLAGS2_T_IP_CS_CALC     UINT32_C(0x4)
2870         /*
2871          * This indicates that the UDP checksum was
2872          * calculated for the tunnel packet and that the sum passed for
2873          * all segments included in the aggregation.
2874          */
2875         #define RX_TPA_START_CMPL_FLAGS2_T_L4_CS_CALC     UINT32_C(0x8)
2876         /* This value indicates what format the metadata field is. */
2877         #define RX_TPA_START_CMPL_FLAGS2_META_FORMAT_MASK UINT32_C(0xf0)
2878         #define RX_TPA_START_CMPL_FLAGS2_META_FORMAT_SFT  4
2879         /* No metadata informtaion.  Value is zero. */
2880         #define RX_TPA_START_CMPL_FLAGS2_META_FORMAT_NONE \
2881                 (UINT32_C(0x0) << 4)
2882         /*
2883          * The metadata field contains the VLAN tag and TPID value.
2884          * - metadata[11:0] contains the vlan VID value.
2885          * - metadata[12] contains the vlan DE value.
2886          * - metadata[15:13] contains the vlan PRI value.
2887          * - metadata[31:16] contains the vlan TPID value.
2888          */
2889         #define RX_TPA_START_CMPL_FLAGS2_META_FORMAT_VLAN \
2890                 (UINT32_C(0x1) << 4)
2891         #define RX_TPA_START_CMPL_FLAGS2_META_FORMAT_LAST \
2892                 RX_TPA_START_CMPL_FLAGS2_META_FORMAT_VLAN
2893         /*
2894          * This field indicates the IP type for the inner-most IP header.
2895          * A value of '0' indicates IPv4.  A value of '1' indicates IPv6.
2896          */
2897         #define RX_TPA_START_CMPL_FLAGS2_IP_TYPE          UINT32_C(0x100)
2898         /*
2899          * This is data from the CFA block as indicated by the meta_format
2900          * field.
2901          */
2902         uint32_t        metadata;
2903         /* When meta_format=1, this value is the VLAN VID. */
2904         #define RX_TPA_START_CMPL_METADATA_VID_MASK UINT32_C(0xfff)
2905         #define RX_TPA_START_CMPL_METADATA_VID_SFT  0
2906         /* When meta_format=1, this value is the VLAN DE. */
2907         #define RX_TPA_START_CMPL_METADATA_DE       UINT32_C(0x1000)
2908         /* When meta_format=1, this value is the VLAN PRI. */
2909         #define RX_TPA_START_CMPL_METADATA_PRI_MASK UINT32_C(0xe000)
2910         #define RX_TPA_START_CMPL_METADATA_PRI_SFT  13
2911         /* When meta_format=1, this value is the VLAN TPID. */
2912         #define RX_TPA_START_CMPL_METADATA_TPID_MASK UINT32_C(0xffff0000)
2913         #define RX_TPA_START_CMPL_METADATA_TPID_SFT 16
2914         uint16_t        v2;
2915         /*
2916          * This value is written by the NIC such that it will be different
2917          * for each pass through the completion queue.   The even passes
2918          * will write 1.  The odd passes will write 0.
2919          */
2920         #define RX_TPA_START_CMPL_V2     UINT32_C(0x1)
2921         /*
2922          * This field identifies the CFA action rule that was used for this
2923          * packet.
2924          */
2925         uint16_t        cfa_code;
2926         /*
2927          * This is the size in bytes of the inner most L4 header.
2928          * This can be subtracted from the payload_offset to determine
2929          * the start of the inner most L4 header.
2930          */
2931         uint32_t        inner_l4_size_inner_l3_offset_inner_l2_offset_outer_l3_offset;
2932         /*
2933          * This is the offset from the beginning of the packet in bytes for
2934          * the outer L3 header.  If there is no outer L3 header, then this
2935          * value is zero.
2936          */
2937         #define RX_TPA_START_CMPL_OUTER_L3_OFFSET_MASK UINT32_C(0x1ff)
2938         #define RX_TPA_START_CMPL_OUTER_L3_OFFSET_SFT 0
2939         /*
2940          * This is the offset from the beginning of the packet in bytes for
2941          * the inner most L2 header.
2942          */
2943         #define RX_TPA_START_CMPL_INNER_L2_OFFSET_MASK UINT32_C(0x3fe00)
2944         #define RX_TPA_START_CMPL_INNER_L2_OFFSET_SFT 9
2945         /*
2946          * This is the offset from the beginning of the packet in bytes for
2947          * the inner most L3 header.
2948          */
2949         #define RX_TPA_START_CMPL_INNER_L3_OFFSET_MASK UINT32_C(0x7fc0000)
2950         #define RX_TPA_START_CMPL_INNER_L3_OFFSET_SFT 18
2951         /*
2952          * This is the size in bytes of the inner most L4 header.
2953          * This can be subtracted from the payload_offset to determine
2954          * the start of the inner most L4 header.
2955          */
2956         #define RX_TPA_START_CMPL_INNER_L4_SIZE_MASK  UINT32_C(0xf8000000)
2957         #define RX_TPA_START_CMPL_INNER_L4_SIZE_SFT   27
2958 } __attribute__((packed));
2959
2960 /* rx_tpa_end_cmpl (size:128b/16B) */
2961 struct rx_tpa_end_cmpl {
2962         uint16_t        flags_type;
2963         /*
2964          * This field indicates the exact type of the completion.
2965          * By convention, the LSB identifies the length of the
2966          * record in 16B units.  Even values indicate 16B
2967          * records.  Odd values indicate 32B
2968          * records.
2969          */
2970         #define RX_TPA_END_CMPL_TYPE_MASK                UINT32_C(0x3f)
2971         #define RX_TPA_END_CMPL_TYPE_SFT                 0
2972         /*
2973          * RX L2 TPA End Completion:
2974          * Completion at the end of a TPA operation.
2975          * Length = 32B
2976          */
2977         #define RX_TPA_END_CMPL_TYPE_RX_TPA_END            UINT32_C(0x15)
2978         #define RX_TPA_END_CMPL_TYPE_LAST \
2979                 RX_TPA_END_CMPL_TYPE_RX_TPA_END
2980         #define RX_TPA_END_CMPL_FLAGS_MASK               UINT32_C(0xffc0)
2981         #define RX_TPA_END_CMPL_FLAGS_SFT                6
2982         /*
2983          * When this bit is '1', it indicates a packet that has an
2984          * error of some type.  Type of error is indicated in
2985          * error_flags.
2986          */
2987         #define RX_TPA_END_CMPL_FLAGS_ERROR               UINT32_C(0x40)
2988         /* This field indicates how the packet was placed in the buffer. */
2989         #define RX_TPA_END_CMPL_FLAGS_PLACEMENT_MASK      UINT32_C(0x380)
2990         #define RX_TPA_END_CMPL_FLAGS_PLACEMENT_SFT       7
2991         /*
2992          * Jumbo:
2993          * TPA Packet was placed using jumbo algorithm.  This means
2994          * that the first buffer will be filled with data before
2995          * moving to aggregation buffers.  Each aggregation buffer
2996          * will be filled before moving to the next aggregation
2997          * buffer.
2998          */
2999         #define RX_TPA_END_CMPL_FLAGS_PLACEMENT_JUMBO \
3000                 (UINT32_C(0x1) << 7)
3001         /*
3002          * Header/Data Separation:
3003          * Packet was placed using Header/Data separation algorithm.
3004          * The separation location is indicated by the itype field.
3005          */
3006         #define RX_TPA_END_CMPL_FLAGS_PLACEMENT_HDS \
3007                 (UINT32_C(0x2) << 7)
3008         /*
3009          * GRO/Jumbo:
3010          * Packet will be placed using GRO/Jumbo where the first
3011          * packet is filled with data. Subsequent packets will be
3012          * placed such that any one packet does not span two
3013          * aggregation buffers unless it starts at the beginning of
3014          * an aggregation buffer.
3015          */
3016         #define RX_TPA_END_CMPL_FLAGS_PLACEMENT_GRO_JUMBO \
3017                 (UINT32_C(0x5) << 7)
3018         /*
3019          * GRO/Header-Data Separation:
3020          * Packet will be placed using GRO/HDS where the header
3021          * is in the first packet.
3022          * Payload of each packet will be
3023          * placed such that any one packet does not span two
3024          * aggregation buffers unless it starts at the beginning of
3025          * an aggregation buffer.
3026          */
3027         #define RX_TPA_END_CMPL_FLAGS_PLACEMENT_GRO_HDS \
3028                 (UINT32_C(0x6) << 7)
3029         #define RX_TPA_END_CMPL_FLAGS_PLACEMENT_LAST \
3030                 RX_TPA_END_CMPL_FLAGS_PLACEMENT_GRO_HDS
3031         /* unused is 2 b */
3032         #define RX_TPA_END_CMPL_FLAGS_UNUSED_MASK         UINT32_C(0xc00)
3033         #define RX_TPA_END_CMPL_FLAGS_UNUSED_SFT          10
3034         /*
3035          * This value indicates what the inner packet determined for the
3036          * packet was.
3037          *  - 2 TCP Packet
3038          *      Indicates that the packet was IP and TCP.  This indicates
3039          *      that the ip_cs field is valid and that the tcp_udp_cs
3040          *      field is valid and contains the TCP checksum.
3041          *      This also indicates that the payload_offset field is valid.
3042          */
3043         #define RX_TPA_END_CMPL_FLAGS_ITYPE_MASK          UINT32_C(0xf000)
3044         #define RX_TPA_END_CMPL_FLAGS_ITYPE_SFT           12
3045         /*
3046          * This value is zero for TPA End completions.
3047          * There is no data in the buffer that corresponds to the opaque
3048          * value in this completion.
3049          */
3050         uint16_t        len;
3051         /*
3052          * This is a copy of the opaque field from the RX BD this completion
3053          * corresponds to.
3054          */
3055         uint32_t        opaque;
3056         /*
3057          * This value is written by the NIC such that it will be different
3058          * for each pass through the completion queue.   The even passes
3059          * will write 1.  The odd passes will write 0.
3060          */
3061         uint8_t agg_bufs_v1;
3062         /*
3063          * This value is written by the NIC such that it will be different
3064          * for each pass through the completion queue.   The even passes
3065          * will write 1.  The odd passes will write 0.
3066          */
3067         #define RX_TPA_END_CMPL_V1           UINT32_C(0x1)
3068         /*
3069          * This value is the number of aggregation buffers that follow this
3070          * entry in the completion ring that are a part of this aggregation
3071          * packet.
3072          * If the value is zero, then the packet is completely contained
3073          * in the buffer space provided in the aggregation start completion.
3074          */
3075         #define RX_TPA_END_CMPL_AGG_BUFS_MASK UINT32_C(0x7e)
3076         #define RX_TPA_END_CMPL_AGG_BUFS_SFT 1
3077         /* This value is the number of segments in the TPA operation. */
3078         uint8_t tpa_segs;
3079         /*
3080          * This value indicates the offset in bytes from the beginning of the packet
3081          * where the inner payload starts.  This value is valid for TCP, UDP,
3082          * FCoE, and RoCE packets.
3083          *
3084          * A value of zero indicates an offset of 256 bytes.
3085          */
3086         uint8_t payload_offset;
3087         uint8_t agg_id;
3088         /* unused2 is 1 b */
3089         #define RX_TPA_END_CMPL_UNUSED2     UINT32_C(0x1)
3090         /*
3091          * This is the aggregation ID that the completion is associated
3092          * with.  Use this number to correlate the TPA start completion
3093          * with the TPA end completion.
3094          */
3095         #define RX_TPA_END_CMPL_AGG_ID_MASK UINT32_C(0xfe)
3096         #define RX_TPA_END_CMPL_AGG_ID_SFT  1
3097         /*
3098          * For non-GRO packets, this value is the
3099          * timestamp delta between earliest and latest timestamp values for
3100          * TPA packet. If packets were not time stamped, then delta will be
3101          * zero.
3102          *
3103          * For GRO packets, this field is zero except for the following
3104          * sub-fields.
3105          * - tsdelta[31]
3106          *     Timestamp present indication.  When '0', no Timestamp
3107          *     option is in the packet.  When '1', then a Timestamp
3108          *     option is present in the packet.
3109          */
3110         uint32_t        tsdelta;
3111 } __attribute__((packed));
3112
3113 /* Last 16 bytes of rx_tpa_end_cmpl. */
3114 /* rx_tpa_end_cmpl_hi (size:128b/16B) */
3115 struct rx_tpa_end_cmpl_hi {
3116         /*
3117          * This value is the number of duplicate ACKs that have been
3118          * received as part of the TPA operation.
3119          */
3120         uint32_t        tpa_dup_acks;
3121         /*
3122          * This value is the number of duplicate ACKs that have been
3123          * received as part of the TPA operation.
3124          */
3125         #define RX_TPA_END_CMPL_TPA_DUP_ACKS_MASK UINT32_C(0xf)
3126         #define RX_TPA_END_CMPL_TPA_DUP_ACKS_SFT 0
3127         /*
3128          * This value is the valid when TPA completion is active.  It
3129          * indicates the length of the longest segment of the TPA operation
3130          * for LRO mode and the length of the first segment in GRO mode.
3131          *
3132          * This value may be used by GRO software to re-construct the original
3133          * packet stream from the TPA packet.  This is the length of all
3134          * but the last segment for GRO.  In LRO mode this value may be used
3135          * to indicate MSS size to the stack.
3136          */
3137         uint16_t        tpa_seg_len;
3138         /* unused4 is 16 b */
3139         uint16_t        unused3;
3140         uint16_t        errors_v2;
3141         /*
3142          * This value is written by the NIC such that it will be different
3143          * for each pass through the completion queue.   The even passes
3144          * will write 1.  The odd passes will write 0.
3145          */
3146         #define RX_TPA_END_CMPL_V2                             UINT32_C(0x1)
3147         #define RX_TPA_END_CMPL_ERRORS_MASK                    UINT32_C(0xfffe)
3148         #define RX_TPA_END_CMPL_ERRORS_SFT                     1
3149         /*
3150          * This error indicates that there was some sort of problem with
3151          * the BDs for the packet that was found after part of the
3152          * packet was already placed.  The packet should be treated as
3153          * invalid.
3154          */
3155         #define RX_TPA_END_CMPL_ERRORS_BUFFER_ERROR_MASK        UINT32_C(0xe)
3156         #define RX_TPA_END_CMPL_ERRORS_BUFFER_ERROR_SFT         1
3157         /*
3158          * This error occurs when there is a fatal HW problem in
3159          * the chip only.  It indicates that there were not
3160          * BDs on chip but that there was adequate reservation.
3161          * provided by the TPA block.
3162          */
3163         #define RX_TPA_END_CMPL_ERRORS_BUFFER_ERROR_NOT_ON_CHIP \
3164                 (UINT32_C(0x2) << 1)
3165         /*
3166          * This error occurs when TPA block was not configured to
3167          * reserve adequate BDs for TPA operations on this RX
3168          * ring.  All data for the TPA operation was not placed.
3169          *
3170          * This error can also be generated when the number of
3171          * segments is not programmed correctly in TPA and the
3172          * 33 total aggregation buffers allowed for the TPA
3173          * operation has been exceeded.
3174          */
3175         #define RX_TPA_END_CMPL_ERRORS_BUFFER_ERROR_RSV_ERROR \
3176                 (UINT32_C(0x4) << 1)
3177         #define RX_TPA_END_CMPL_ERRORS_BUFFER_ERROR_LAST \
3178                 RX_TPA_END_CMPL_ERRORS_BUFFER_ERROR_RSV_ERROR
3179         /* unused5 is 16 b */
3180         uint16_t        unused_4;
3181         /*
3182          * This is the opaque value that was completed for the TPA start
3183          * completion that corresponds to this TPA end completion.
3184          */
3185         uint32_t        start_opaque;
3186 } __attribute__((packed));
3187
3188 /* rx_abuf_cmpl (size:128b/16B) */
3189 struct rx_abuf_cmpl {
3190         uint16_t        type;
3191         /*
3192          * This field indicates the exact type of the completion.
3193          * By convention, the LSB identifies the length of the
3194          * record in 16B units.  Even values indicate 16B
3195          * records.  Odd values indicate 32B
3196          * records.
3197          */
3198         #define RX_ABUF_CMPL_TYPE_MASK  UINT32_C(0x3f)
3199         #define RX_ABUF_CMPL_TYPE_SFT   0
3200         /*
3201          * RX Aggregation Buffer completion :
3202          * Completion of an L2 aggregation buffer in support of
3203          * TPA, HDS, or Jumbo packet completion.  Length = 16B
3204          */
3205         #define RX_ABUF_CMPL_TYPE_RX_AGG  UINT32_C(0x12)
3206         #define RX_ABUF_CMPL_TYPE_LAST   RX_ABUF_CMPL_TYPE_RX_AGG
3207         /*
3208          * This is the length of the data for the packet stored in this
3209          * aggregation buffer identified by the opaque value.  This does not
3210          * include the length of any
3211          * data placed in other aggregation BDs or in the packet or buffer
3212          * BDs.   This length does not include any space added due to
3213          * hdr_offset register during HDS placement mode.
3214          */
3215         uint16_t        len;
3216         /*
3217          * This is a copy of the opaque field from the RX BD this aggregation
3218          * buffer corresponds to.
3219          */
3220         uint32_t        opaque;
3221         uint32_t        v;
3222         /*
3223          * This value is written by the NIC such that it will be different
3224          * for each pass through the completion queue.   The even passes
3225          * will write 1.  The odd passes will write 0.
3226          */
3227         #define RX_ABUF_CMPL_V     UINT32_C(0x1)
3228         /* unused3 is 32 b */
3229         uint32_t        unused_2;
3230 } __attribute__((packed));
3231
3232 /* eject_cmpl (size:128b/16B) */
3233 struct eject_cmpl {
3234         uint16_t        type;
3235         /*
3236          * This field indicates the exact type of the completion.
3237          * By convention, the LSB identifies the length of the
3238          * record in 16B units.  Even values indicate 16B
3239          * records.  Odd values indicate 32B
3240          * records.
3241          */
3242         #define EJECT_CMPL_TYPE_MASK      UINT32_C(0x3f)
3243         #define EJECT_CMPL_TYPE_SFT       0
3244         /*
3245          * Statistics Ejection Completion:
3246          * Completion of statistics data ejection buffer.
3247          * Length = 16B
3248          */
3249         #define EJECT_CMPL_TYPE_STAT_EJECT  UINT32_C(0x1a)
3250         #define EJECT_CMPL_TYPE_LAST       EJECT_CMPL_TYPE_STAT_EJECT
3251         /*
3252          * This is the length of the statistics data stored in this
3253          * buffer.
3254          */
3255         uint16_t        len;
3256         /*
3257          * This is a copy of the opaque field from the RX BD this ejection
3258          * buffer corresponds to.
3259          */
3260         uint32_t        opaque;
3261         uint32_t        v;
3262         /*
3263          * This value is written by the NIC such that it will be different
3264          * for each pass through the completion queue.   The even passes
3265          * will write 1.  The odd passes will write 0.
3266          */
3267         #define EJECT_CMPL_V     UINT32_C(0x1)
3268         /* unused3 is 32 b */
3269         uint32_t        unused_2;
3270 } __attribute__((packed));
3271
3272 /* hwrm_cmpl (size:128b/16B) */
3273 struct hwrm_cmpl {
3274         uint16_t        type;
3275         /*
3276          * This field indicates the exact type of the completion.
3277          * By convention, the LSB identifies the length of the
3278          * record in 16B units.  Even values indicate 16B
3279          * records.  Odd values indicate 32B
3280          * records.
3281          */
3282         #define HWRM_CMPL_TYPE_MASK     UINT32_C(0x3f)
3283         #define HWRM_CMPL_TYPE_SFT      0
3284         /*
3285          * HWRM Command Completion:
3286          * Completion of an HWRM command.
3287          */
3288         #define HWRM_CMPL_TYPE_HWRM_DONE  UINT32_C(0x20)
3289         #define HWRM_CMPL_TYPE_LAST      HWRM_CMPL_TYPE_HWRM_DONE
3290         /* This is the sequence_id of the HWRM command that has completed. */
3291         uint16_t        sequence_id;
3292         /* unused2 is 32 b */
3293         uint32_t        unused_1;
3294         uint32_t        v;
3295         /*
3296          * This value is written by the NIC such that it will be different
3297          * for each pass through the completion queue.   The even passes
3298          * will write 1.  The odd passes will write 0.
3299          */
3300         #define HWRM_CMPL_V     UINT32_C(0x1)
3301         /* unused4 is 32 b */
3302         uint32_t        unused_3;
3303 } __attribute__((packed));
3304
3305 /* hwrm_fwd_req_cmpl (size:128b/16B) */
3306 struct hwrm_fwd_req_cmpl {
3307         /*
3308          * This field indicates the exact type of the completion.
3309          * By convention, the LSB identifies the length of the
3310          * record in 16B units.  Even values indicate 16B
3311          * records.  Odd values indicate 32B
3312          * records.
3313          */
3314         uint16_t        req_len_type;
3315         /*
3316          * This field indicates the exact type of the completion.
3317          * By convention, the LSB identifies the length of the
3318          * record in 16B units.  Even values indicate 16B
3319          * records.  Odd values indicate 32B
3320          * records.
3321          */
3322         #define HWRM_FWD_REQ_CMPL_TYPE_MASK        UINT32_C(0x3f)
3323         #define HWRM_FWD_REQ_CMPL_TYPE_SFT         0
3324         /* Forwarded HWRM Request */
3325         #define HWRM_FWD_REQ_CMPL_TYPE_HWRM_FWD_REQ  UINT32_C(0x22)
3326         #define HWRM_FWD_REQ_CMPL_TYPE_LAST \
3327                 HWRM_FWD_REQ_CMPL_TYPE_HWRM_FWD_REQ
3328         /* Length of forwarded request in bytes. */
3329         #define HWRM_FWD_REQ_CMPL_REQ_LEN_MASK     UINT32_C(0xffc0)
3330         #define HWRM_FWD_REQ_CMPL_REQ_LEN_SFT      6
3331         /*
3332          * Source ID of this request.
3333          * Typically used in forwarding requests and responses.
3334          * 0x0 - 0xFFF8 - Used for function ids
3335          * 0xFFF8 - 0xFFFE - Reserved for internal processors
3336          * 0xFFFF - HWRM
3337          */
3338         uint16_t        source_id;
3339         /* unused1 is 32 b */
3340         uint32_t        unused0;
3341         /* Address of forwarded request. */
3342         uint32_t        req_buf_addr_v[2];
3343         /*
3344          * This value is written by the NIC such that it will be different
3345          * for each pass through the completion queue.   The even passes
3346          * will write 1.  The odd passes will write 0.
3347          */
3348         #define HWRM_FWD_REQ_CMPL_V                UINT32_C(0x1)
3349         /* Address of forwarded request. */
3350         #define HWRM_FWD_REQ_CMPL_REQ_BUF_ADDR_MASK UINT32_C(0xfffffffe)
3351         #define HWRM_FWD_REQ_CMPL_REQ_BUF_ADDR_SFT 1
3352 } __attribute__((packed));
3353
3354 /* hwrm_fwd_resp_cmpl (size:128b/16B) */
3355 struct hwrm_fwd_resp_cmpl {
3356         uint16_t        type;
3357         /*
3358          * This field indicates the exact type of the completion.
3359          * By convention, the LSB identifies the length of the
3360          * record in 16B units.  Even values indicate 16B
3361          * records.  Odd values indicate 32B
3362          * records.
3363          */
3364         #define HWRM_FWD_RESP_CMPL_TYPE_MASK         UINT32_C(0x3f)
3365         #define HWRM_FWD_RESP_CMPL_TYPE_SFT          0
3366         /* Forwarded HWRM Response */
3367         #define HWRM_FWD_RESP_CMPL_TYPE_HWRM_FWD_RESP  UINT32_C(0x24)
3368         #define HWRM_FWD_RESP_CMPL_TYPE_LAST \
3369                 HWRM_FWD_RESP_CMPL_TYPE_HWRM_FWD_RESP
3370         /*
3371          * Source ID of this response.
3372          * Typically used in forwarding requests and responses.
3373          * 0x0 - 0xFFF8 - Used for function ids
3374          * 0xFFF8 - 0xFFFE - Reserved for internal processors
3375          * 0xFFFF - HWRM
3376          */
3377         uint16_t        source_id;
3378         /* Length of forwarded response in bytes. */
3379         uint16_t        resp_len;
3380         /* unused2 is 16 b */
3381         uint16_t        unused_1;
3382         /* Address of forwarded request. */
3383         uint32_t        resp_buf_addr_v[2];
3384         /*
3385          * This value is written by the NIC such that it will be different
3386          * for each pass through the completion queue.   The even passes
3387          * will write 1.  The odd passes will write 0.
3388          */
3389         #define HWRM_FWD_RESP_CMPL_V                 UINT32_C(0x1)
3390         /* Address of forwarded request. */
3391         #define HWRM_FWD_RESP_CMPL_RESP_BUF_ADDR_MASK UINT32_C(0xfffffffe)
3392         #define HWRM_FWD_RESP_CMPL_RESP_BUF_ADDR_SFT 1
3393 } __attribute__((packed));
3394
3395 /* hwrm_async_event_cmpl (size:128b/16B) */
3396 struct hwrm_async_event_cmpl {
3397         uint16_t        type;
3398         /*
3399          * This field indicates the exact type of the completion.
3400          * By convention, the LSB identifies the length of the
3401          * record in 16B units.  Even values indicate 16B
3402          * records.  Odd values indicate 32B
3403          * records.
3404          */
3405         #define HWRM_ASYNC_EVENT_CMPL_TYPE_MASK            UINT32_C(0x3f)
3406         #define HWRM_ASYNC_EVENT_CMPL_TYPE_SFT             0
3407         /* HWRM Asynchronous Event Information */
3408         #define HWRM_ASYNC_EVENT_CMPL_TYPE_HWRM_ASYNC_EVENT  UINT32_C(0x2e)
3409         #define HWRM_ASYNC_EVENT_CMPL_TYPE_LAST \
3410                 HWRM_ASYNC_EVENT_CMPL_TYPE_HWRM_ASYNC_EVENT
3411         /* Identifiers of events. */
3412         uint16_t        event_id;
3413         /* Link status changed */
3414         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE \
3415                 UINT32_C(0x0)
3416         /* Link MTU changed */
3417         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_MTU_CHANGE \
3418                 UINT32_C(0x1)
3419         /* Link speed changed */
3420         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE \
3421                 UINT32_C(0x2)
3422         /* DCB Configuration changed */
3423         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE \
3424                 UINT32_C(0x3)
3425         /* Port connection not allowed */
3426         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED \
3427                 UINT32_C(0x4)
3428         /* Link speed configuration was not allowed */
3429         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_NOT_ALLOWED \
3430                 UINT32_C(0x5)
3431         /* Link speed configuration change */
3432         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE \
3433                 UINT32_C(0x6)
3434         /* Port PHY configuration change */
3435         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_PHY_CFG_CHANGE \
3436                 UINT32_C(0x7)
3437         /* Reset notification to clients */
3438         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY \
3439                 UINT32_C(0x8)
3440         /* Function driver unloaded */
3441         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_FUNC_DRVR_UNLOAD \
3442                 UINT32_C(0x10)
3443         /* Function driver loaded */
3444         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_FUNC_DRVR_LOAD \
3445                 UINT32_C(0x11)
3446         /* Function FLR related processing has completed */
3447         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_FUNC_FLR_PROC_CMPLT \
3448                 UINT32_C(0x12)
3449         /* PF driver unloaded */
3450         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD \
3451                 UINT32_C(0x20)
3452         /* PF driver loaded */
3453         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_LOAD \
3454                 UINT32_C(0x21)
3455         /* VF Function Level Reset (FLR) */
3456         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_VF_FLR \
3457                 UINT32_C(0x30)
3458         /* VF MAC Address Change */
3459         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_VF_MAC_ADDR_CHANGE \
3460                 UINT32_C(0x31)
3461         /* PF-VF communication channel status change. */
3462         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_VF_COMM_STATUS_CHANGE \
3463                 UINT32_C(0x32)
3464         /* VF Configuration Change */
3465         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_VF_CFG_CHANGE \
3466                 UINT32_C(0x33)
3467         /* LLFC/PFC Configuration Change */
3468         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LLFC_PFC_CHANGE \
3469                 UINT32_C(0x34)
3470         /* Default VNIC Configuration Change */
3471         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DEFAULT_VNIC_CHANGE \
3472                 UINT32_C(0x35)
3473         /* HWRM Error */
3474         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_HWRM_ERROR \
3475                 UINT32_C(0xff)
3476         #define HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LAST \
3477                 HWRM_ASYNC_EVENT_CMPL_EVENT_ID_HWRM_ERROR
3478         /* Event specific data */
3479         uint32_t        event_data2;
3480         uint8_t opaque_v;
3481         /*
3482          * This value is written by the NIC such that it will be different
3483          * for each pass through the completion queue.   The even passes
3484          * will write 1.  The odd passes will write 0.
3485          */
3486         #define HWRM_ASYNC_EVENT_CMPL_V          UINT32_C(0x1)
3487         /* opaque is 7 b */
3488         #define HWRM_ASYNC_EVENT_CMPL_OPAQUE_MASK UINT32_C(0xfe)
3489         #define HWRM_ASYNC_EVENT_CMPL_OPAQUE_SFT 1
3490         /* 8-lsb timestamp from POR (100-msec resolution) */
3491         uint8_t timestamp_lo;
3492         /* 16-lsb timestamp from POR (100-msec resolution) */
3493         uint16_t        timestamp_hi;
3494         /* Event specific data */
3495         uint32_t        event_data1;
3496 } __attribute__((packed));
3497
3498 /* hwrm_async_event_cmpl_link_status_change (size:128b/16B) */
3499 struct hwrm_async_event_cmpl_link_status_change {
3500         uint16_t        type;
3501         /*
3502          * This field indicates the exact type of the completion.
3503          * By convention, the LSB identifies the length of the
3504          * record in 16B units.  Even values indicate 16B
3505          * records.  Odd values indicate 32B
3506          * records.
3507          */
3508         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_TYPE_MASK \
3509                 UINT32_C(0x3f)
3510         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_TYPE_SFT             0
3511         /* HWRM Asynchronous Event Information */
3512         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_TYPE_HWRM_ASYNC_EVENT \
3513                 UINT32_C(0x2e)
3514         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_TYPE_LAST \
3515                 HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_TYPE_HWRM_ASYNC_EVENT
3516         /* Identifiers of events. */
3517         uint16_t        event_id;
3518         /* Link status changed */
3519         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_ID_LINK_STATUS_CHANGE \
3520                 UINT32_C(0x0)
3521         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_ID_LAST \
3522                 HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_ID_LINK_STATUS_CHANGE
3523         /* Event specific data */
3524         uint32_t        event_data2;
3525         uint8_t opaque_v;
3526         /*
3527          * This value is written by the NIC such that it will be different
3528          * for each pass through the completion queue.   The even passes
3529          * will write 1.  The odd passes will write 0.
3530          */
3531         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_V \
3532                 UINT32_C(0x1)
3533         /* opaque is 7 b */
3534         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_OPAQUE_MASK \
3535                 UINT32_C(0xfe)
3536         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_OPAQUE_SFT 1
3537         /* 8-lsb timestamp from POR (100-msec resolution) */
3538         uint8_t timestamp_lo;
3539         /* 16-lsb timestamp from POR (100-msec resolution) */
3540         uint16_t        timestamp_hi;
3541         /* Event specific data */
3542         uint32_t        event_data1;
3543         /* Indicates link status change */
3544         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_LINK_CHANGE \
3545                 UINT32_C(0x1)
3546         /*
3547          * If this bit set to 0, then it indicates that the link
3548          * was up and it went down.
3549          */
3550         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_LINK_CHANGE_DOWN \
3551                 UINT32_C(0x0)
3552         /*
3553          * If this bit is set to 1, then it indicates that the link
3554          * was down and it went up.
3555          */
3556         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_LINK_CHANGE_UP \
3557                 UINT32_C(0x1)
3558         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_LINK_CHANGE_LAST \
3559                 HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_LINK_CHANGE_UP
3560         /* Indicates the physical port this link status change occur */
3561         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_PORT_MASK \
3562                 UINT32_C(0xe)
3563         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_PORT_SFT \
3564                 1
3565         /* PORT ID */
3566         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_PORT_ID_MASK \
3567                 UINT32_C(0xffff0)
3568         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_PORT_ID_SFT \
3569                 4
3570         /* Indicates the physical function this event occured on. */
3571         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_PF_ID_MASK \
3572                 UINT32_C(0xff00000)
3573         #define HWRM_ASYNC_EVENT_CMPL_LINK_STATUS_CHANGE_EVENT_DATA1_PF_ID_SFT \
3574                 20
3575 } __attribute__((packed));
3576
3577 /* hwrm_async_event_cmpl_link_mtu_change (size:128b/16B) */
3578 struct hwrm_async_event_cmpl_link_mtu_change {
3579         uint16_t        type;
3580         /*
3581          * This field indicates the exact type of the completion.
3582          * By convention, the LSB identifies the length of the
3583          * record in 16B units.  Even values indicate 16B
3584          * records.  Odd values indicate 32B
3585          * records.
3586          */
3587         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_TYPE_MASK \
3588                 UINT32_C(0x3f)
3589         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_TYPE_SFT             0
3590         /* HWRM Asynchronous Event Information */
3591         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_TYPE_HWRM_ASYNC_EVENT \
3592                 UINT32_C(0x2e)
3593         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_TYPE_LAST \
3594                 HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_TYPE_HWRM_ASYNC_EVENT
3595         /* Identifiers of events. */
3596         uint16_t        event_id;
3597         /* Link MTU changed */
3598         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_EVENT_ID_LINK_MTU_CHANGE \
3599                 UINT32_C(0x1)
3600         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_EVENT_ID_LAST \
3601                 HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_EVENT_ID_LINK_MTU_CHANGE
3602         /* Event specific data */
3603         uint32_t        event_data2;
3604         uint8_t opaque_v;
3605         /*
3606          * This value is written by the NIC such that it will be different
3607          * for each pass through the completion queue.   The even passes
3608          * will write 1.  The odd passes will write 0.
3609          */
3610         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_V          UINT32_C(0x1)
3611         /* opaque is 7 b */
3612         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_OPAQUE_MASK \
3613                 UINT32_C(0xfe)
3614         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_OPAQUE_SFT 1
3615         /* 8-lsb timestamp from POR (100-msec resolution) */
3616         uint8_t timestamp_lo;
3617         /* 16-lsb timestamp from POR (100-msec resolution) */
3618         uint16_t        timestamp_hi;
3619         /* Event specific data */
3620         uint32_t        event_data1;
3621         /* The new MTU of the link in bytes. */
3622         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_EVENT_DATA1_NEW_MTU_MASK \
3623                 UINT32_C(0xffff)
3624         #define HWRM_ASYNC_EVENT_CMPL_LINK_MTU_CHANGE_EVENT_DATA1_NEW_MTU_SFT 0
3625 } __attribute__((packed));
3626
3627 /* hwrm_async_event_cmpl_link_speed_change (size:128b/16B) */
3628 struct hwrm_async_event_cmpl_link_speed_change {
3629         uint16_t        type;
3630         /*
3631          * This field indicates the exact type of the completion.
3632          * By convention, the LSB identifies the length of the
3633          * record in 16B units.  Even values indicate 16B
3634          * records.  Odd values indicate 32B
3635          * records.
3636          */
3637         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_TYPE_MASK \
3638                 UINT32_C(0x3f)
3639         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_TYPE_SFT             0
3640         /* HWRM Asynchronous Event Information */
3641         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_TYPE_HWRM_ASYNC_EVENT \
3642                 UINT32_C(0x2e)
3643         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_TYPE_LAST \
3644                 HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_TYPE_HWRM_ASYNC_EVENT
3645         /* Identifiers of events. */
3646         uint16_t        event_id;
3647         /* Link speed changed */
3648         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_ID_LINK_SPEED_CHANGE \
3649                 UINT32_C(0x2)
3650         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_ID_LAST \
3651                 HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_ID_LINK_SPEED_CHANGE
3652         /* Event specific data */
3653         uint32_t        event_data2;
3654         uint8_t opaque_v;
3655         /*
3656          * This value is written by the NIC such that it will be different
3657          * for each pass through the completion queue.   The even passes
3658          * will write 1.  The odd passes will write 0.
3659          */
3660         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_V \
3661                 UINT32_C(0x1)
3662         /* opaque is 7 b */
3663         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_OPAQUE_MASK \
3664                 UINT32_C(0xfe)
3665         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_OPAQUE_SFT 1
3666         /* 8-lsb timestamp from POR (100-msec resolution) */
3667         uint8_t timestamp_lo;
3668         /* 16-lsb timestamp from POR (100-msec resolution) */
3669         uint16_t        timestamp_hi;
3670         /* Event specific data */
3671         uint32_t        event_data1;
3672         /*
3673          * When this bit is '1', the link was forced to the
3674          * force_link_speed value.
3675          */
3676         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_FORCE \
3677                 UINT32_C(0x1)
3678         /* The new link speed in 100 Mbps units. */
3679         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_MASK \
3680                 UINT32_C(0xfffe)
3681         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_SFT \
3682                 1
3683         /* 100Mb link speed */
3684         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_100MB \
3685                 (UINT32_C(0x1) << 1)
3686         /* 1Gb link speed */
3687         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_1GB \
3688                 (UINT32_C(0xa) << 1)
3689         /* 2Gb link speed */
3690         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_2GB \
3691                 (UINT32_C(0x14) << 1)
3692         /* 25Gb link speed */
3693         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_2_5GB \
3694                 (UINT32_C(0x19) << 1)
3695         /* 10Gb link speed */
3696         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_10GB \
3697                 (UINT32_C(0x64) << 1)
3698         /* 20Mb link speed */
3699         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_20GB \
3700                 (UINT32_C(0xc8) << 1)
3701         /* 25Gb link speed */
3702         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_25GB \
3703                 (UINT32_C(0xfa) << 1)
3704         /* 40Gb link speed */
3705         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_40GB \
3706                 (UINT32_C(0x190) << 1)
3707         /* 50Gb link speed */
3708         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_50GB \
3709                 (UINT32_C(0x1f4) << 1)
3710         /* 100Gb link speed */
3711         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_100GB \
3712                 (UINT32_C(0x3e8) << 1)
3713         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_LAST \
3714                 HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_NEW_LINK_SPEED_100MBPS_100GB
3715         /* PORT ID */
3716         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_PORT_ID_MASK \
3717                 UINT32_C(0xffff0000)
3718         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CHANGE_EVENT_DATA1_PORT_ID_SFT \
3719                 16
3720 } __attribute__((packed));
3721
3722 /* hwrm_async_event_cmpl_dcb_config_change (size:128b/16B) */
3723 struct hwrm_async_event_cmpl_dcb_config_change {
3724         uint16_t        type;
3725         /*
3726          * This field indicates the exact type of the completion.
3727          * By convention, the LSB identifies the length of the
3728          * record in 16B units.  Even values indicate 16B
3729          * records.  Odd values indicate 32B
3730          * records.
3731          */
3732         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_TYPE_MASK \
3733                 UINT32_C(0x3f)
3734         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_TYPE_SFT             0
3735         /* HWRM Asynchronous Event Information */
3736         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_TYPE_HWRM_ASYNC_EVENT \
3737                 UINT32_C(0x2e)
3738         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_TYPE_LAST \
3739                 HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_TYPE_HWRM_ASYNC_EVENT
3740         /* Identifiers of events. */
3741         uint16_t        event_id;
3742         /* DCB Configuration changed */
3743         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_ID_DCB_CONFIG_CHANGE \
3744                 UINT32_C(0x3)
3745         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_ID_LAST \
3746                 HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_ID_DCB_CONFIG_CHANGE
3747         /* Event specific data */
3748         uint32_t        event_data2;
3749         /* ETS configuration change */
3750         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA2_ETS \
3751                 UINT32_C(0x1)
3752         /* PFC configuration change */
3753         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA2_PFC \
3754                 UINT32_C(0x2)
3755         /* APP configuration change */
3756         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA2_APP \
3757                 UINT32_C(0x4)
3758         uint8_t opaque_v;
3759         /*
3760          * This value is written by the NIC such that it will be different
3761          * for each pass through the completion queue.   The even passes
3762          * will write 1.  The odd passes will write 0.
3763          */
3764         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_V \
3765                 UINT32_C(0x1)
3766         /* opaque is 7 b */
3767         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_OPAQUE_MASK \
3768                 UINT32_C(0xfe)
3769         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_OPAQUE_SFT 1
3770         /* 8-lsb timestamp from POR (100-msec resolution) */
3771         uint8_t timestamp_lo;
3772         /* 16-lsb timestamp from POR (100-msec resolution) */
3773         uint16_t        timestamp_hi;
3774         /* Event specific data */
3775         uint32_t        event_data1;
3776         /* PORT ID */
3777         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_PORT_ID_MASK \
3778                 UINT32_C(0xffff)
3779         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_PORT_ID_SFT \
3780                 0
3781         /* Priority recommended for RoCE traffic */
3782         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_ROCE_PRIORITY_MASK \
3783                 UINT32_C(0xff0000)
3784         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_ROCE_PRIORITY_SFT \
3785                 16
3786         /* none is 255 */
3787         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_ROCE_PRIORITY_NONE \
3788                 (UINT32_C(0xff) << 16)
3789         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_ROCE_PRIORITY_LAST \
3790                 HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_ROCE_PRIORITY_NONE
3791         /* Priority recommended for L2 traffic */
3792         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_L2_PRIORITY_MASK \
3793                 UINT32_C(0xff000000)
3794         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_L2_PRIORITY_SFT \
3795                 24
3796         /* none is 255 */
3797         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_L2_PRIORITY_NONE \
3798                 (UINT32_C(0xff) << 24)
3799         #define HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_L2_PRIORITY_LAST \
3800                 HWRM_ASYNC_EVENT_CMPL_DCB_CONFIG_CHANGE_EVENT_DATA1_RECOMMEND_L2_PRIORITY_NONE
3801 } __attribute__((packed));
3802
3803 /* hwrm_async_event_cmpl_port_conn_not_allowed (size:128b/16B) */
3804 struct hwrm_async_event_cmpl_port_conn_not_allowed {
3805         uint16_t        type;
3806         /*
3807          * This field indicates the exact type of the completion.
3808          * By convention, the LSB identifies the length of the
3809          * record in 16B units.  Even values indicate 16B
3810          * records.  Odd values indicate 32B
3811          * records.
3812          */
3813         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_TYPE_MASK \
3814                 UINT32_C(0x3f)
3815         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_TYPE_SFT \
3816                 0
3817         /* HWRM Asynchronous Event Information */
3818         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_TYPE_HWRM_ASYNC_EVENT \
3819                 UINT32_C(0x2e)
3820         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_TYPE_LAST \
3821                 HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_TYPE_HWRM_ASYNC_EVENT
3822         /* Identifiers of events. */
3823         uint16_t        event_id;
3824         /* Port connection not allowed */
3825         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_ID_PORT_CONN_NOT_ALLOWED \
3826                 UINT32_C(0x4)
3827         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_ID_LAST \
3828                 HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_ID_PORT_CONN_NOT_ALLOWED
3829         /* Event specific data */
3830         uint32_t        event_data2;
3831         uint8_t opaque_v;
3832         /*
3833          * This value is written by the NIC such that it will be different
3834          * for each pass through the completion queue.   The even passes
3835          * will write 1.  The odd passes will write 0.
3836          */
3837         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_V \
3838                 UINT32_C(0x1)
3839         /* opaque is 7 b */
3840         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_OPAQUE_MASK \
3841                 UINT32_C(0xfe)
3842         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_OPAQUE_SFT 1
3843         /* 8-lsb timestamp from POR (100-msec resolution) */
3844         uint8_t timestamp_lo;
3845         /* 16-lsb timestamp from POR (100-msec resolution) */
3846         uint16_t        timestamp_hi;
3847         /* Event specific data */
3848         uint32_t        event_data1;
3849         /* PORT ID */
3850         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_PORT_ID_MASK \
3851                 UINT32_C(0xffff)
3852         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_PORT_ID_SFT \
3853                 0
3854         /*
3855          * This value indicates the current port level enforcement policy
3856          * for the optics module when there is an optical module mismatch
3857          * and port is not connected.
3858          */
3859         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_MASK \
3860                 UINT32_C(0xff0000)
3861         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_SFT \
3862                 16
3863         /* No enforcement */
3864         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_NONE \
3865                 (UINT32_C(0x0) << 16)
3866         /* Disable Transmit side Laser. */
3867         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_DISABLETX \
3868                 (UINT32_C(0x1) << 16)
3869         /* Raise a warning message. */
3870         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_WARNINGMSG \
3871                 (UINT32_C(0x2) << 16)
3872         /* Power down the module. */
3873         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_PWRDOWN \
3874                 (UINT32_C(0x3) << 16)
3875         #define HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_LAST \
3876                 HWRM_ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_ENFORCEMENT_POLICY_PWRDOWN
3877 } __attribute__((packed));
3878
3879 /* hwrm_async_event_cmpl_link_speed_cfg_not_allowed (size:128b/16B) */
3880 struct hwrm_async_event_cmpl_link_speed_cfg_not_allowed {
3881         uint16_t        type;
3882         /*
3883          * This field indicates the exact type of the completion.
3884          * By convention, the LSB identifies the length of the
3885          * record in 16B units.  Even values indicate 16B
3886          * records.  Odd values indicate 32B
3887          * records.
3888          */
3889         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_TYPE_MASK \
3890                 UINT32_C(0x3f)
3891         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_TYPE_SFT \
3892                 0
3893         /* HWRM Asynchronous Event Information */
3894         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_TYPE_HWRM_ASYNC_EVENT \
3895                 UINT32_C(0x2e)
3896         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_TYPE_LAST \
3897                 HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_TYPE_HWRM_ASYNC_EVENT
3898         /* Identifiers of events. */
3899         uint16_t        event_id;
3900         /* Link speed configuration was not allowed */
3901         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_EVENT_ID_LINK_SPEED_CFG_NOT_ALLOWED \
3902                 UINT32_C(0x5)
3903         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_EVENT_ID_LAST \
3904                 HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_EVENT_ID_LINK_SPEED_CFG_NOT_ALLOWED
3905         /* Event specific data */
3906         uint32_t        event_data2;
3907         uint8_t opaque_v;
3908         /*
3909          * This value is written by the NIC such that it will be different
3910          * for each pass through the completion queue.   The even passes
3911          * will write 1.  The odd passes will write 0.
3912          */
3913         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_V \
3914                 UINT32_C(0x1)
3915         /* opaque is 7 b */
3916         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_OPAQUE_MASK \
3917                 UINT32_C(0xfe)
3918         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_OPAQUE_SFT 1
3919         /* 8-lsb timestamp from POR (100-msec resolution) */
3920         uint8_t timestamp_lo;
3921         /* 16-lsb timestamp from POR (100-msec resolution) */
3922         uint16_t        timestamp_hi;
3923         /* Event specific data */
3924         uint32_t        event_data1;
3925         /* PORT ID */
3926         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_EVENT_DATA1_PORT_ID_MASK \
3927                 UINT32_C(0xffff)
3928         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_NOT_ALLOWED_EVENT_DATA1_PORT_ID_SFT \
3929                 0
3930 } __attribute__((packed));
3931
3932 /* hwrm_async_event_cmpl_link_speed_cfg_change (size:128b/16B) */
3933 struct hwrm_async_event_cmpl_link_speed_cfg_change {
3934         uint16_t        type;
3935         /*
3936          * This field indicates the exact type of the completion.
3937          * By convention, the LSB identifies the length of the
3938          * record in 16B units.  Even values indicate 16B
3939          * records.  Odd values indicate 32B
3940          * records.
3941          */
3942         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_TYPE_MASK \
3943                 UINT32_C(0x3f)
3944         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_TYPE_SFT \
3945                 0
3946         /* HWRM Asynchronous Event Information */
3947         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_TYPE_HWRM_ASYNC_EVENT \
3948                 UINT32_C(0x2e)
3949         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_TYPE_LAST \
3950                 HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_TYPE_HWRM_ASYNC_EVENT
3951         /* Identifiers of events. */
3952         uint16_t        event_id;
3953         /* Link speed configuration change */
3954         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_ID_LINK_SPEED_CFG_CHANGE \
3955                 UINT32_C(0x6)
3956         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_ID_LAST \
3957                 HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_ID_LINK_SPEED_CFG_CHANGE
3958         /* Event specific data */
3959         uint32_t        event_data2;
3960         uint8_t opaque_v;
3961         /*
3962          * This value is written by the NIC such that it will be different
3963          * for each pass through the completion queue.   The even passes
3964          * will write 1.  The odd passes will write 0.
3965          */
3966         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_V \
3967                 UINT32_C(0x1)
3968         /* opaque is 7 b */
3969         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_OPAQUE_MASK \
3970                 UINT32_C(0xfe)
3971         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_OPAQUE_SFT 1
3972         /* 8-lsb timestamp from POR (100-msec resolution) */
3973         uint8_t timestamp_lo;
3974         /* 16-lsb timestamp from POR (100-msec resolution) */
3975         uint16_t        timestamp_hi;
3976         /* Event specific data */
3977         uint32_t        event_data1;
3978         /* PORT ID */
3979         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_DATA1_PORT_ID_MASK \
3980                 UINT32_C(0xffff)
3981         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_DATA1_PORT_ID_SFT \
3982                 0
3983         /*
3984          * If set to 1, it indicates that the supported link speeds
3985          * configuration on the port has changed.
3986          * If set to 0, then there is no change in supported link speeds
3987          * configuration.
3988          */
3989         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_DATA1_SUPPORTED_LINK_SPEEDS_CHANGE \
3990                 UINT32_C(0x10000)
3991         /*
3992          * If set to 1, it indicates that the link speed configuration
3993          * on the port has become illegal or invalid.
3994          * If set to 0, then the link speed configuration on the port is
3995          * legal or valid.
3996          */
3997         #define HWRM_ASYNC_EVENT_CMPL_LINK_SPEED_CFG_CHANGE_EVENT_DATA1_ILLEGAL_LINK_SPEED_CFG \
3998                 UINT32_C(0x20000)
3999 } __attribute__((packed));
4000
4001 /* hwrm_async_event_cmpl_port_phy_cfg_change (size:128b/16B) */
4002 struct hwrm_async_event_cmpl_port_phy_cfg_change {
4003         uint16_t        type;
4004         /*
4005          * This field indicates the exact type of the completion.
4006          * By convention, the LSB identifies the length of the
4007          * record in 16B units.  Even values indicate 16B
4008          * records.  Odd values indicate 32B
4009          * records.
4010          */
4011         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_TYPE_MASK \
4012                 UINT32_C(0x3f)
4013         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_TYPE_SFT \
4014                 0
4015         /* HWRM Asynchronous Event Information */
4016         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_TYPE_HWRM_ASYNC_EVENT \
4017                 UINT32_C(0x2e)
4018         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_TYPE_LAST \
4019                 HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_TYPE_HWRM_ASYNC_EVENT
4020         /* Identifiers of events. */
4021         uint16_t        event_id;
4022         /* Port PHY configuration change */
4023         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_ID_PORT_PHY_CFG_CHANGE \
4024                 UINT32_C(0x7)
4025         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_ID_LAST \
4026                 HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_ID_PORT_PHY_CFG_CHANGE
4027         /* Event specific data */
4028         uint32_t        event_data2;
4029         uint8_t opaque_v;
4030         /*
4031          * This value is written by the NIC such that it will be different
4032          * for each pass through the completion queue.   The even passes
4033          * will write 1.  The odd passes will write 0.
4034          */
4035         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_V \
4036                 UINT32_C(0x1)
4037         /* opaque is 7 b */
4038         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_OPAQUE_MASK \
4039                 UINT32_C(0xfe)
4040         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_OPAQUE_SFT 1
4041         /* 8-lsb timestamp from POR (100-msec resolution) */
4042         uint8_t timestamp_lo;
4043         /* 16-lsb timestamp from POR (100-msec resolution) */
4044         uint16_t        timestamp_hi;
4045         /* Event specific data */
4046         uint32_t        event_data1;
4047         /* PORT ID */
4048         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_PORT_ID_MASK \
4049                 UINT32_C(0xffff)
4050         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_PORT_ID_SFT \
4051                 0
4052         /*
4053          * If set to 1, it indicates that the FEC
4054          * configuration on the port has changed.
4055          * If set to 0, then there is no change in FEC configuration.
4056          */
4057         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_FEC_CFG_CHANGE \
4058                 UINT32_C(0x10000)
4059         /*
4060          * If set to 1, it indicates that the EEE configuration
4061          * on the port has changed.
4062          * If set to 0, then there is no change in EEE configuration
4063          * on the port.
4064          */
4065         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_EEE_CFG_CHANGE \
4066                 UINT32_C(0x20000)
4067         /*
4068          * If set to 1, it indicates that the pause configuration
4069          * on the PHY has changed.
4070          * If set to 0, then there is no change in the pause
4071          * configuration on the PHY.
4072          */
4073         #define HWRM_ASYNC_EVENT_CMPL_PORT_PHY_CFG_CHANGE_EVENT_DATA1_PAUSE_CFG_CHANGE \
4074                 UINT32_C(0x40000)
4075 } __attribute__((packed));
4076
4077 /* hwrm_async_event_cmpl_reset_notify (size:128b/16B) */
4078 struct hwrm_async_event_cmpl_reset_notify {
4079         uint16_t        type;
4080         /*
4081          * This field indicates the exact type of the completion.
4082          * By convention, the LSB identifies the length of the
4083          * record in 16B units.  Even values indicate 16B
4084          * records.  Odd values indicate 32B
4085          * records.
4086          */
4087         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_TYPE_MASK \
4088                 UINT32_C(0x3f)
4089         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_TYPE_SFT             0
4090         /* HWRM Asynchronous Event Information */
4091         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_TYPE_HWRM_ASYNC_EVENT \
4092                 UINT32_C(0x2e)
4093         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_TYPE_LAST \
4094                 HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_TYPE_HWRM_ASYNC_EVENT
4095         /* Identifiers of events. */
4096         uint16_t        event_id;
4097         /* Notify clients of imminent reset. */
4098         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_ID_RESET_NOTIFY \
4099                 UINT32_C(0x8)
4100         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_ID_LAST \
4101                 HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_ID_RESET_NOTIFY
4102         /* Event specific data */
4103         uint32_t        event_data2;
4104         uint8_t opaque_v;
4105         /*
4106          * This value is written by the NIC such that it will be different
4107          * for each pass through the completion queue.   The even passes
4108          * will write 1.  The odd passes will write 0.
4109          */
4110         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_V          UINT32_C(0x1)
4111         /* opaque is 7 b */
4112         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_OPAQUE_MASK UINT32_C(0xfe)
4113         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_OPAQUE_SFT 1
4114         /* 8-lsb timestamp from POR (100-msec resolution) */
4115         uint8_t timestamp_lo;
4116         /* 16-lsb timestamp from POR (100-msec resolution) */
4117         uint16_t        timestamp_hi;
4118         /* Event specific data */
4119         uint32_t        event_data1;
4120         /* Indicates driver action requested */
4121         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DRIVER_ACTION_MASK \
4122                 UINT32_C(0xff)
4123         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DRIVER_ACTION_SFT \
4124                 0
4125         /*
4126          * If set to 1, it indicates that the l2 client should
4127          * stop sending in band traffic to Nitro.
4128          * if set to 0, there is no change in L2 client behavior.
4129          */
4130         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DRIVER_ACTION_DRIVER_STOP_TX_QUEUE \
4131                 UINT32_C(0x1)
4132         /*
4133          * If set to 1, it indicates that the L2 client should
4134          * bring down the interface.
4135          * If set to 0, then there is no change in L2 client behavior.
4136          */
4137         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DRIVER_ACTION_DRIVER_IFDOWN \
4138                 UINT32_C(0x2)
4139         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DRIVER_ACTION_LAST \
4140                 HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DRIVER_ACTION_DRIVER_IFDOWN
4141         /* Indicates reason for reset. */
4142         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK \
4143                 UINT32_C(0xff00)
4144         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_SFT \
4145                 8
4146         /* A management client has requested reset. */
4147         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MANAGEMENT_RESET_REQUEST \
4148                 (UINT32_C(0x1) << 8)
4149         /* A fatal firmware exception has occurred. */
4150         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_FATAL \
4151                 (UINT32_C(0x2) << 8)
4152         /* A non-fatal firmware exception has occurred. */
4153         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_NON_FATAL \
4154                 (UINT32_C(0x3) << 8)
4155         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_LAST \
4156                 HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_NON_FATAL
4157         /*
4158          * Minimum time before driver should attempt access - units 100ms ticks.
4159          * Range 0-65535
4160          */
4161         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DELAY_IN_100MS_TICKS_MASK \
4162                 UINT32_C(0xffff0000)
4163         #define HWRM_ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_DELAY_IN_100MS_TICKS_SFT \
4164                 16
4165 } __attribute__((packed));
4166
4167 /* hwrm_async_event_cmpl_func_drvr_unload (size:128b/16B) */
4168 struct hwrm_async_event_cmpl_func_drvr_unload {
4169         uint16_t        type;
4170         /*
4171          * This field indicates the exact type of the completion.
4172          * By convention, the LSB identifies the length of the
4173          * record in 16B units.  Even values indicate 16B
4174          * records.  Odd values indicate 32B
4175          * records.
4176          */
4177         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_TYPE_MASK \
4178                 UINT32_C(0x3f)
4179         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_TYPE_SFT             0
4180         /* HWRM Asynchronous Event Information */
4181         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_TYPE_HWRM_ASYNC_EVENT \
4182                 UINT32_C(0x2e)
4183         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_TYPE_LAST \
4184                 HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_TYPE_HWRM_ASYNC_EVENT
4185         /* Identifiers of events. */
4186         uint16_t        event_id;
4187         /* Function driver unloaded */
4188         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_EVENT_ID_FUNC_DRVR_UNLOAD \
4189                 UINT32_C(0x10)
4190         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_EVENT_ID_LAST \
4191                 HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_EVENT_ID_FUNC_DRVR_UNLOAD
4192         /* Event specific data */
4193         uint32_t        event_data2;
4194         uint8_t opaque_v;
4195         /*
4196          * This value is written by the NIC such that it will be different
4197          * for each pass through the completion queue.   The even passes
4198          * will write 1.  The odd passes will write 0.
4199          */
4200         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_V          UINT32_C(0x1)
4201         /* opaque is 7 b */
4202         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_OPAQUE_MASK \
4203                 UINT32_C(0xfe)
4204         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_OPAQUE_SFT 1
4205         /* 8-lsb timestamp from POR (100-msec resolution) */
4206         uint8_t timestamp_lo;
4207         /* 16-lsb timestamp from POR (100-msec resolution) */
4208         uint16_t        timestamp_hi;
4209         /* Event specific data */
4210         uint32_t        event_data1;
4211         /* Function ID */
4212         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_EVENT_DATA1_FUNC_ID_MASK \
4213                 UINT32_C(0xffff)
4214         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_UNLOAD_EVENT_DATA1_FUNC_ID_SFT \
4215                 0
4216 } __attribute__((packed));
4217
4218 /* hwrm_async_event_cmpl_func_drvr_load (size:128b/16B) */
4219 struct hwrm_async_event_cmpl_func_drvr_load {
4220         uint16_t        type;
4221         /*
4222          * This field indicates the exact type of the completion.
4223          * By convention, the LSB identifies the length of the
4224          * record in 16B units.  Even values indicate 16B
4225          * records.  Odd values indicate 32B
4226          * records.
4227          */
4228         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_TYPE_MASK \
4229                 UINT32_C(0x3f)
4230         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_TYPE_SFT             0
4231         /* HWRM Asynchronous Event Information */
4232         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_TYPE_HWRM_ASYNC_EVENT \
4233                 UINT32_C(0x2e)
4234         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_TYPE_LAST \
4235                 HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_TYPE_HWRM_ASYNC_EVENT
4236         /* Identifiers of events. */
4237         uint16_t        event_id;
4238         /* Function driver loaded */
4239         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_EVENT_ID_FUNC_DRVR_LOAD \
4240                 UINT32_C(0x11)
4241         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_EVENT_ID_LAST \
4242                 HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_EVENT_ID_FUNC_DRVR_LOAD
4243         /* Event specific data */
4244         uint32_t        event_data2;
4245         uint8_t opaque_v;
4246         /*
4247          * This value is written by the NIC such that it will be different
4248          * for each pass through the completion queue.   The even passes
4249          * will write 1.  The odd passes will write 0.
4250          */
4251         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_V          UINT32_C(0x1)
4252         /* opaque is 7 b */
4253         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_OPAQUE_MASK UINT32_C(0xfe)
4254         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_OPAQUE_SFT 1
4255         /* 8-lsb timestamp from POR (100-msec resolution) */
4256         uint8_t timestamp_lo;
4257         /* 16-lsb timestamp from POR (100-msec resolution) */
4258         uint16_t        timestamp_hi;
4259         /* Event specific data */
4260         uint32_t        event_data1;
4261         /* Function ID */
4262         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_EVENT_DATA1_FUNC_ID_MASK \
4263                 UINT32_C(0xffff)
4264         #define HWRM_ASYNC_EVENT_CMPL_FUNC_DRVR_LOAD_EVENT_DATA1_FUNC_ID_SFT 0
4265 } __attribute__((packed));
4266
4267 /* hwrm_async_event_cmpl_func_flr_proc_cmplt (size:128b/16B) */
4268 struct hwrm_async_event_cmpl_func_flr_proc_cmplt {
4269         uint16_t        type;
4270         /*
4271          * This field indicates the exact type of the completion.
4272          * By convention, the LSB identifies the length of the
4273          * record in 16B units.  Even values indicate 16B
4274          * records.  Odd values indicate 32B
4275          * records.
4276          */
4277         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_TYPE_MASK \
4278                 UINT32_C(0x3f)
4279         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_TYPE_SFT \
4280                 0
4281         /* HWRM Asynchronous Event Information */
4282         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_TYPE_HWRM_ASYNC_EVENT \
4283                 UINT32_C(0x2e)
4284         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_TYPE_LAST \
4285                 HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_TYPE_HWRM_ASYNC_EVENT
4286         /* Identifiers of events. */
4287         uint16_t        event_id;
4288         /* Function FLR related processing has completed */
4289         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_EVENT_ID_FUNC_FLR_PROC_CMPLT \
4290                 UINT32_C(0x12)
4291         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_EVENT_ID_LAST \
4292                 HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_EVENT_ID_FUNC_FLR_PROC_CMPLT
4293         /* Event specific data */
4294         uint32_t        event_data2;
4295         uint8_t opaque_v;
4296         /*
4297          * This value is written by the NIC such that it will be different
4298          * for each pass through the completion queue.   The even passes
4299          * will write 1.  The odd passes will write 0.
4300          */
4301         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_V \
4302                 UINT32_C(0x1)
4303         /* opaque is 7 b */
4304         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_OPAQUE_MASK \
4305                 UINT32_C(0xfe)
4306         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_OPAQUE_SFT 1
4307         /* 8-lsb timestamp from POR (100-msec resolution) */
4308         uint8_t timestamp_lo;
4309         /* 16-lsb timestamp from POR (100-msec resolution) */
4310         uint16_t        timestamp_hi;
4311         /* Event specific data */
4312         uint32_t        event_data1;
4313         /* Function ID */
4314         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_EVENT_DATA1_FUNC_ID_MASK \
4315                 UINT32_C(0xffff)
4316         #define HWRM_ASYNC_EVENT_CMPL_FUNC_FLR_PROC_CMPLT_EVENT_DATA1_FUNC_ID_SFT \
4317                 0
4318 } __attribute__((packed));
4319
4320 /* hwrm_async_event_cmpl_pf_drvr_unload (size:128b/16B) */
4321 struct hwrm_async_event_cmpl_pf_drvr_unload {
4322         uint16_t        type;
4323         /*
4324          * This field indicates the exact type of the completion.
4325          * By convention, the LSB identifies the length of the
4326          * record in 16B units.  Even values indicate 16B
4327          * records.  Odd values indicate 32B
4328          * records.
4329          */
4330         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_TYPE_MASK \
4331                 UINT32_C(0x3f)
4332         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_TYPE_SFT             0
4333         /* HWRM Asynchronous Event Information */
4334         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_TYPE_HWRM_ASYNC_EVENT \
4335                 UINT32_C(0x2e)
4336         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_TYPE_LAST \
4337                 HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_TYPE_HWRM_ASYNC_EVENT
4338         /* Identifiers of events. */
4339         uint16_t        event_id;
4340         /* PF driver unloaded */
4341         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_EVENT_ID_PF_DRVR_UNLOAD \
4342                 UINT32_C(0x20)
4343         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_EVENT_ID_LAST \
4344                 HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_EVENT_ID_PF_DRVR_UNLOAD
4345         /* Event specific data */
4346         uint32_t        event_data2;
4347         uint8_t opaque_v;
4348         /*
4349          * This value is written by the NIC such that it will be different
4350          * for each pass through the completion queue.   The even passes
4351          * will write 1.  The odd passes will write 0.
4352          */
4353         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_V          UINT32_C(0x1)
4354         /* opaque is 7 b */
4355         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_OPAQUE_MASK UINT32_C(0xfe)
4356         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_OPAQUE_SFT 1
4357         /* 8-lsb timestamp from POR (100-msec resolution) */
4358         uint8_t timestamp_lo;
4359         /* 16-lsb timestamp from POR (100-msec resolution) */
4360         uint16_t        timestamp_hi;
4361         /* Event specific data */
4362         uint32_t        event_data1;
4363         /* PF ID */
4364         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_EVENT_DATA1_FUNC_ID_MASK \
4365                 UINT32_C(0xffff)
4366         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_EVENT_DATA1_FUNC_ID_SFT 0
4367         /* Indicates the physical port this pf belongs to */
4368         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_EVENT_DATA1_PORT_MASK \
4369                 UINT32_C(0x70000)
4370         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_UNLOAD_EVENT_DATA1_PORT_SFT    16
4371 } __attribute__((packed));
4372
4373 /* hwrm_async_event_cmpl_pf_drvr_load (size:128b/16B) */
4374 struct hwrm_async_event_cmpl_pf_drvr_load {
4375         uint16_t        type;
4376         /*
4377          * This field indicates the exact type of the completion.
4378          * By convention, the LSB identifies the length of the
4379          * record in 16B units.  Even values indicate 16B
4380          * records.  Odd values indicate 32B
4381          * records.
4382          */
4383         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_TYPE_MASK \
4384                 UINT32_C(0x3f)
4385         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_TYPE_SFT             0
4386         /* HWRM Asynchronous Event Information */
4387         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_TYPE_HWRM_ASYNC_EVENT \
4388                 UINT32_C(0x2e)
4389         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_TYPE_LAST \
4390                 HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_TYPE_HWRM_ASYNC_EVENT
4391         /* Identifiers of events. */
4392         uint16_t        event_id;
4393         /* PF driver loaded */
4394         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_EVENT_ID_PF_DRVR_LOAD \
4395                 UINT32_C(0x21)
4396         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_EVENT_ID_LAST \
4397                 HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_EVENT_ID_PF_DRVR_LOAD
4398         /* Event specific data */
4399         uint32_t        event_data2;
4400         uint8_t opaque_v;
4401         /*
4402          * This value is written by the NIC such that it will be different
4403          * for each pass through the completion queue.   The even passes
4404          * will write 1.  The odd passes will write 0.
4405          */
4406         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_V          UINT32_C(0x1)
4407         /* opaque is 7 b */
4408         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_OPAQUE_MASK UINT32_C(0xfe)
4409         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_OPAQUE_SFT 1
4410         /* 8-lsb timestamp from POR (100-msec resolution) */
4411         uint8_t timestamp_lo;
4412         /* 16-lsb timestamp from POR (100-msec resolution) */
4413         uint16_t        timestamp_hi;
4414         /* Event specific data */
4415         uint32_t        event_data1;
4416         /* PF ID */
4417         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_EVENT_DATA1_FUNC_ID_MASK \
4418                 UINT32_C(0xffff)
4419         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_EVENT_DATA1_FUNC_ID_SFT 0
4420         /* Indicates the physical port this pf belongs to */
4421         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_EVENT_DATA1_PORT_MASK \
4422                 UINT32_C(0x70000)
4423         #define HWRM_ASYNC_EVENT_CMPL_PF_DRVR_LOAD_EVENT_DATA1_PORT_SFT    16
4424 } __attribute__((packed));
4425
4426 /* hwrm_async_event_cmpl_vf_flr (size:128b/16B) */
4427 struct hwrm_async_event_cmpl_vf_flr {
4428         uint16_t        type;
4429         /*
4430          * This field indicates the exact type of the completion.
4431          * By convention, the LSB identifies the length of the
4432          * record in 16B units.  Even values indicate 16B
4433          * records.  Odd values indicate 32B
4434          * records.
4435          */
4436         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_TYPE_MASK \
4437                 UINT32_C(0x3f)
4438         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_TYPE_SFT             0
4439         /* HWRM Asynchronous Event Information */
4440         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_TYPE_HWRM_ASYNC_EVENT \
4441                 UINT32_C(0x2e)
4442         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_TYPE_LAST \
4443                 HWRM_ASYNC_EVENT_CMPL_VF_FLR_TYPE_HWRM_ASYNC_EVENT
4444         /* Identifiers of events. */
4445         uint16_t        event_id;
4446         /* VF Function Level Reset (FLR) */
4447         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_EVENT_ID_VF_FLR UINT32_C(0x30)
4448         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_EVENT_ID_LAST \
4449                 HWRM_ASYNC_EVENT_CMPL_VF_FLR_EVENT_ID_VF_FLR
4450         /* Event specific data */
4451         uint32_t        event_data2;
4452         uint8_t opaque_v;
4453         /*
4454          * This value is written by the NIC such that it will be different
4455          * for each pass through the completion queue.   The even passes
4456          * will write 1.  The odd passes will write 0.
4457          */
4458         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_V          UINT32_C(0x1)
4459         /* opaque is 7 b */
4460         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_OPAQUE_MASK UINT32_C(0xfe)
4461         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_OPAQUE_SFT 1
4462         /* 8-lsb timestamp from POR (100-msec resolution) */
4463         uint8_t timestamp_lo;
4464         /* 16-lsb timestamp from POR (100-msec resolution) */
4465         uint16_t        timestamp_hi;
4466         /* Event specific data */
4467         uint32_t        event_data1;
4468         /* VF ID */
4469         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_EVENT_DATA1_VF_ID_MASK \
4470                 UINT32_C(0xffff)
4471         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_EVENT_DATA1_VF_ID_SFT 0
4472         /* Indicates the physical function this event occured on. */
4473         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_EVENT_DATA1_PF_ID_MASK \
4474                 UINT32_C(0xff0000)
4475         #define HWRM_ASYNC_EVENT_CMPL_VF_FLR_EVENT_DATA1_PF_ID_SFT 16
4476 } __attribute__((packed));
4477
4478 /* hwrm_async_event_cmpl_vf_mac_addr_change (size:128b/16B) */
4479 struct hwrm_async_event_cmpl_vf_mac_addr_change {
4480         uint16_t        type;
4481         /*
4482          * This field indicates the exact type of the completion.
4483          * By convention, the LSB identifies the length of the
4484          * record in 16B units.  Even values indicate 16B
4485          * records.  Odd values indicate 32B
4486          * records.
4487          */
4488         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_TYPE_MASK \
4489                 UINT32_C(0x3f)
4490         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_TYPE_SFT             0
4491         /* HWRM Asynchronous Event Information */
4492         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_TYPE_HWRM_ASYNC_EVENT \
4493                 UINT32_C(0x2e)
4494         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_TYPE_LAST \
4495                 HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_TYPE_HWRM_ASYNC_EVENT
4496         /* Identifiers of events. */
4497         uint16_t        event_id;
4498         /* VF MAC Address Change */
4499         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_EVENT_ID_VF_MAC_ADDR_CHANGE \
4500                 UINT32_C(0x31)
4501         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_EVENT_ID_LAST \
4502                 HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_EVENT_ID_VF_MAC_ADDR_CHANGE
4503         /* Event specific data */
4504         uint32_t        event_data2;
4505         uint8_t opaque_v;
4506         /*
4507          * This value is written by the NIC such that it will be different
4508          * for each pass through the completion queue.   The even passes
4509          * will write 1.  The odd passes will write 0.
4510          */
4511         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_V \
4512                 UINT32_C(0x1)
4513         /* opaque is 7 b */
4514         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_OPAQUE_MASK \
4515                 UINT32_C(0xfe)
4516         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_OPAQUE_SFT 1
4517         /* 8-lsb timestamp from POR (100-msec resolution) */
4518         uint8_t timestamp_lo;
4519         /* 16-lsb timestamp from POR (100-msec resolution) */
4520         uint16_t        timestamp_hi;
4521         /* Event specific data */
4522         uint32_t        event_data1;
4523         /* VF ID */
4524         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_EVENT_DATA1_VF_ID_MASK \
4525                 UINT32_C(0xffff)
4526         #define HWRM_ASYNC_EVENT_CMPL_VF_MAC_ADDR_CHANGE_EVENT_DATA1_VF_ID_SFT \
4527                 0
4528 } __attribute__((packed));
4529
4530 /* hwrm_async_event_cmpl_pf_vf_comm_status_change (size:128b/16B) */
4531 struct hwrm_async_event_cmpl_pf_vf_comm_status_change {
4532         uint16_t        type;
4533         /*
4534          * This field indicates the exact type of the completion.
4535          * By convention, the LSB identifies the length of the
4536          * record in 16B units.  Even values indicate 16B
4537          * records.  Odd values indicate 32B
4538          * records.
4539          */
4540         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_TYPE_MASK \
4541                 UINT32_C(0x3f)
4542         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_TYPE_SFT \
4543                 0
4544         /* HWRM Asynchronous Event Information */
4545         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_TYPE_HWRM_ASYNC_EVENT \
4546                 UINT32_C(0x2e)
4547         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_TYPE_LAST \
4548                 HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_TYPE_HWRM_ASYNC_EVENT
4549         /* Identifiers of events. */
4550         uint16_t        event_id;
4551         /* PF-VF communication channel status change. */
4552         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_EVENT_ID_PF_VF_COMM_STATUS_CHANGE \
4553                 UINT32_C(0x32)
4554         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_EVENT_ID_LAST \
4555                 HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_EVENT_ID_PF_VF_COMM_STATUS_CHANGE
4556         /* Event specific data */
4557         uint32_t        event_data2;
4558         uint8_t opaque_v;
4559         /*
4560          * This value is written by the NIC such that it will be different
4561          * for each pass through the completion queue.   The even passes
4562          * will write 1.  The odd passes will write 0.
4563          */
4564         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_V \
4565                 UINT32_C(0x1)
4566         /* opaque is 7 b */
4567         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_OPAQUE_MASK \
4568                 UINT32_C(0xfe)
4569         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_OPAQUE_SFT 1
4570         /* 8-lsb timestamp from POR (100-msec resolution) */
4571         uint8_t timestamp_lo;
4572         /* 16-lsb timestamp from POR (100-msec resolution) */
4573         uint16_t        timestamp_hi;
4574         /* Event specific data */
4575         uint32_t        event_data1;
4576         /*
4577          * If this bit is set to 1, then it indicates that the PF-VF
4578          * communication was lost and it is established.
4579          * If this bit set to 0, then it indicates that the PF-VF
4580          * communication was established and it is lost.
4581          */
4582         #define HWRM_ASYNC_EVENT_CMPL_PF_VF_COMM_STATUS_CHANGE_EVENT_DATA1_COMM_ESTABLISHED \
4583                 UINT32_C(0x1)
4584 } __attribute__((packed));
4585
4586 /* hwrm_async_event_cmpl_vf_cfg_change (size:128b/16B) */
4587 struct hwrm_async_event_cmpl_vf_cfg_change {
4588         uint16_t        type;
4589         /*
4590          * This field indicates the exact type of the completion.
4591          * By convention, the LSB identifies the length of the
4592          * record in 16B units.  Even values indicate 16B
4593          * records.  Odd values indicate 32B
4594          * records.
4595          */
4596         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_TYPE_MASK \
4597                 UINT32_C(0x3f)
4598         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_TYPE_SFT             0
4599         /* HWRM Asynchronous Event Information */
4600         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_TYPE_HWRM_ASYNC_EVENT \
4601                 UINT32_C(0x2e)
4602         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_TYPE_LAST \
4603                 HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_TYPE_HWRM_ASYNC_EVENT
4604         /* Identifiers of events. */
4605         uint16_t        event_id;
4606         /* VF Configuration Change */
4607         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_EVENT_ID_VF_CFG_CHANGE \
4608                 UINT32_C(0x33)
4609         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_EVENT_ID_LAST \
4610                 HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_EVENT_ID_VF_CFG_CHANGE
4611         /* Event specific data */
4612         uint32_t        event_data2;
4613         uint8_t opaque_v;
4614         /*
4615          * This value is written by the NIC such that it will be different
4616          * for each pass through the completion queue.   The even passes
4617          * will write 1.  The odd passes will write 0.
4618          */
4619         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_V          UINT32_C(0x1)
4620         /* opaque is 7 b */
4621         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_OPAQUE_MASK UINT32_C(0xfe)
4622         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_OPAQUE_SFT 1
4623         /* 8-lsb timestamp from POR (100-msec resolution) */
4624         uint8_t timestamp_lo;
4625         /* 16-lsb timestamp from POR (100-msec resolution) */
4626         uint16_t        timestamp_hi;
4627         /*
4628          * Each flag provided in this field indicates a specific VF
4629          * configuration change. At least one of these flags shall be set to 1
4630          * when an asynchronous event completion of this type is provided
4631          * by the HWRM.
4632          */
4633         uint32_t        event_data1;
4634         /*
4635          * If this bit is set to 1, then the value of MTU
4636          * was changed on this VF.
4637          * If set to 0, then this bit should be ignored.
4638          */
4639         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_EVENT_DATA1_MTU_CHANGE \
4640                 UINT32_C(0x1)
4641         /*
4642          * If this bit is set to 1, then the value of MRU
4643          * was changed on this VF.
4644          * If set to 0, then this bit should be ignored.
4645          */
4646         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_EVENT_DATA1_MRU_CHANGE \
4647                 UINT32_C(0x2)
4648         /*
4649          * If this bit is set to 1, then the value of default MAC
4650          * address was changed on this VF.
4651          * If set to 0, then this bit should be ignored.
4652          */
4653         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_EVENT_DATA1_DFLT_MAC_ADDR_CHANGE \
4654                 UINT32_C(0x4)
4655         /*
4656          * If this bit is set to 1, then the value of default VLAN
4657          * was changed on this VF.
4658          * If set to 0, then this bit should be ignored.
4659          */
4660         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_EVENT_DATA1_DFLT_VLAN_CHANGE \
4661                 UINT32_C(0x8)
4662         /*
4663          * If this bit is set to 1, then the value of trusted VF enable
4664          * was changed on this VF.
4665          * If set to 0, then this bit should be ignored.
4666          */
4667         #define HWRM_ASYNC_EVENT_CMPL_VF_CFG_CHANGE_EVENT_DATA1_TRUSTED_VF_CFG_CHANGE \
4668                 UINT32_C(0x10)
4669 } __attribute__((packed));
4670
4671 /* hwrm_async_event_cmpl_llfc_pfc_change (size:128b/16B) */
4672 struct hwrm_async_event_cmpl_llfc_pfc_change {
4673         uint16_t        type;
4674         /*
4675          * This field indicates the exact type of the completion.
4676          * By convention, the LSB identifies the length of the
4677          * record in 16B units.  Even values indicate 16B
4678          * records.  Odd values indicate 32B
4679          * records.
4680          */
4681         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_TYPE_MASK \
4682                 UINT32_C(0x3f)
4683         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_TYPE_SFT             0
4684         /* HWRM Asynchronous Event Information */
4685         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_TYPE_HWRM_ASYNC_EVENT \
4686                 UINT32_C(0x2e)
4687         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_TYPE_LAST \
4688                 HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_TYPE_HWRM_ASYNC_EVENT
4689         /* unused1 is 10 b */
4690         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_UNUSED1_MASK \
4691                 UINT32_C(0xffc0)
4692         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_UNUSED1_SFT          6
4693         /* Identifiers of events. */
4694         uint16_t        event_id;
4695         /* LLFC/PFC Configuration Change */
4696         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_ID_LLFC_PFC_CHANGE \
4697                 UINT32_C(0x34)
4698         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_ID_LAST \
4699                 HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_ID_LLFC_PFC_CHANGE
4700         /* Event specific data */
4701         uint32_t        event_data2;
4702         uint8_t opaque_v;
4703         /*
4704          * This value is written by the NIC such that it will be different
4705          * for each pass through the completion queue.   The even passes
4706          * will write 1.  The odd passes will write 0.
4707          */
4708         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_V          UINT32_C(0x1)
4709         /* opaque is 7 b */
4710         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_OPAQUE_MASK \
4711                 UINT32_C(0xfe)
4712         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_OPAQUE_SFT 1
4713         /* 8-lsb timestamp from POR (100-msec resolution) */
4714         uint8_t timestamp_lo;
4715         /* 16-lsb timestamp from POR (100-msec resolution) */
4716         uint16_t        timestamp_hi;
4717         /* Event specific data */
4718         uint32_t        event_data1;
4719         /* Indicates llfc pfc status change */
4720         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_LLFC_PFC_MASK \
4721                 UINT32_C(0x3)
4722         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_LLFC_PFC_SFT \
4723                 0
4724         /*
4725          * If this field set to 1, then it indicates that llfc is
4726          * enabled.
4727          */
4728         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_LLFC_PFC_LLFC \
4729                 UINT32_C(0x1)
4730         /*
4731          * If this field is set to 2, then it indicates that pfc
4732          * is enabled.
4733          */
4734         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_LLFC_PFC_PFC \
4735                 UINT32_C(0x2)
4736         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_LLFC_PFC_LAST \
4737                 HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_LLFC_PFC_PFC
4738         /* Indicates the physical port this llfc pfc change occur */
4739         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_PORT_MASK \
4740                 UINT32_C(0x1c)
4741         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_PORT_SFT \
4742                 2
4743         /* PORT ID */
4744         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_PORT_ID_MASK \
4745                 UINT32_C(0x1fffe0)
4746         #define HWRM_ASYNC_EVENT_CMPL_LLFC_PFC_CHANGE_EVENT_DATA1_PORT_ID_SFT \
4747                 5
4748 } __attribute__((packed));
4749
4750 /* hwrm_async_event_cmpl_default_vnic_change (size:128b/16B) */
4751 struct hwrm_async_event_cmpl_default_vnic_change {
4752         uint16_t        type;
4753         /*
4754          * This field indicates the exact type of the completion.
4755          * By convention, the LSB identifies the length of the
4756          * record in 16B units.  Even values indicate 16B
4757          * records.  Odd values indicate 32B
4758          * records.
4759          */
4760         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_MASK \
4761                 UINT32_C(0x3f)
4762         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_SFT \
4763                 0
4764         /* HWRM Asynchronous Event Information */
4765         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_HWRM_ASYNC_EVENT \
4766                 UINT32_C(0x2e)
4767         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_LAST \
4768                 HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_HWRM_ASYNC_EVENT
4769         /* unused1 is 10 b */
4770         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_UNUSED1_MASK \
4771                 UINT32_C(0xffc0)
4772         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_UNUSED1_SFT \
4773                 6
4774         /* Identifiers of events. */
4775         uint16_t        event_id;
4776         /* Notification of a default vnic allocaiton or free */
4777         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_ID_ALLOC_FREE_NOTIFICATION \
4778                 UINT32_C(0x35)
4779         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_ID_LAST \
4780                 HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_ID_ALLOC_FREE_NOTIFICATION
4781         /* Event specific data */
4782         uint32_t        event_data2;
4783         uint8_t opaque_v;
4784         /*
4785          * This value is written by the NIC such that it will be different
4786          * for each pass through the completion queue.   The even passes
4787          * will write 1.  The odd passes will write 0.
4788          */
4789         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_V \
4790                 UINT32_C(0x1)
4791         /* opaque is 7 b */
4792         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_OPAQUE_MASK \
4793                 UINT32_C(0xfe)
4794         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_OPAQUE_SFT 1
4795         /* 8-lsb timestamp from POR (100-msec resolution) */
4796         uint8_t timestamp_lo;
4797         /* 16-lsb timestamp from POR (100-msec resolution) */
4798         uint16_t        timestamp_hi;
4799         /* Event specific data */
4800         uint32_t        event_data1;
4801         /* Indicates default vnic configuration change */
4802         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_MASK \
4803                 UINT32_C(0x3)
4804         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_SFT \
4805                 0
4806         /*
4807          * If this field is set to 1, then it indicates that
4808          * a default VNIC has been allocate.
4809          */
4810         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_DEF_VNIC_ALLOC \
4811                 UINT32_C(0x1)
4812         /*
4813          * If this field is set to 2, then it indicates that
4814          * a default VNIC has been freed.
4815          */
4816         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_DEF_VNIC_FREE \
4817                 UINT32_C(0x2)
4818         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_LAST \
4819                 HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_DEF_VNIC_FREE
4820         /* Indicates the physical function this event occured on. */
4821         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_PF_ID_MASK \
4822                 UINT32_C(0x3fc)
4823         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_PF_ID_SFT \
4824                 2
4825         /* Indicates the virtual function this event occured on */
4826         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_VF_ID_MASK \
4827                 UINT32_C(0x3fffc00)
4828         #define HWRM_ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_VF_ID_SFT \
4829                 10
4830 } __attribute__((packed));
4831
4832 /* hwrm_async_event_cmpl_hwrm_error (size:128b/16B) */
4833 struct hwrm_async_event_cmpl_hwrm_error {
4834         uint16_t        type;
4835         /*
4836          * This field indicates the exact type of the completion.
4837          * By convention, the LSB identifies the length of the
4838          * record in 16B units.  Even values indicate 16B
4839          * records.  Odd values indicate 32B
4840          * records.
4841          */
4842         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_TYPE_MASK \
4843                 UINT32_C(0x3f)
4844         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_TYPE_SFT             0
4845         /* HWRM Asynchronous Event Information */
4846         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_TYPE_HWRM_ASYNC_EVENT \
4847                 UINT32_C(0x2e)
4848         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_TYPE_LAST \
4849                 HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_TYPE_HWRM_ASYNC_EVENT
4850         /* Identifiers of events. */
4851         uint16_t        event_id;
4852         /* HWRM Error */
4853         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_ID_HWRM_ERROR \
4854                 UINT32_C(0xff)
4855         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_ID_LAST \
4856                 HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_ID_HWRM_ERROR
4857         /* Event specific data */
4858         uint32_t        event_data2;
4859         /* Severity of HWRM Error */
4860         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_DATA2_SEVERITY_MASK \
4861                 UINT32_C(0xff)
4862         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_DATA2_SEVERITY_SFT     0
4863         /* Warning */
4864         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_DATA2_SEVERITY_WARNING \
4865                 UINT32_C(0x0)
4866         /* Non-fatal Error */
4867         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_DATA2_SEVERITY_NONFATAL \
4868                 UINT32_C(0x1)
4869         /* Fatal Error */
4870         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_DATA2_SEVERITY_FATAL \
4871                 UINT32_C(0x2)
4872         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_DATA2_SEVERITY_LAST \
4873                 HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_DATA2_SEVERITY_FATAL
4874         uint8_t opaque_v;
4875         /*
4876          * This value is written by the NIC such that it will be different
4877          * for each pass through the completion queue.   The even passes
4878          * will write 1.  The odd passes will write 0.
4879          */
4880         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_V          UINT32_C(0x1)
4881         /* opaque is 7 b */
4882         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_OPAQUE_MASK UINT32_C(0xfe)
4883         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_OPAQUE_SFT 1
4884         /* 8-lsb timestamp from POR (100-msec resolution) */
4885         uint8_t timestamp_lo;
4886         /* 16-lsb timestamp from POR (100-msec resolution) */
4887         uint16_t        timestamp_hi;
4888         /* Event specific data */
4889         uint32_t        event_data1;
4890         /* Time stamp for error event */
4891         #define HWRM_ASYNC_EVENT_CMPL_HWRM_ERROR_EVENT_DATA1_TIMESTAMP \
4892                 UINT32_C(0x1)
4893 } __attribute__((packed));
4894
4895 /*******************
4896  * hwrm_func_reset *
4897  *******************/
4898
4899
4900 /* hwrm_func_reset_input (size:192b/24B) */
4901 struct hwrm_func_reset_input {
4902         /* The HWRM command request type. */
4903         uint16_t        req_type;
4904         /*
4905          * The completion ring to send the completion event on. This should
4906          * be the NQ ID returned from the `nq_alloc` HWRM command.
4907          */
4908         uint16_t        cmpl_ring;
4909         /*
4910          * The sequence ID is used by the driver for tracking multiple
4911          * commands. This ID is treated as opaque data by the firmware and
4912          * the value is returned in the `hwrm_resp_hdr` upon completion.
4913          */
4914         uint16_t        seq_id;
4915         /*
4916          * The target ID of the command:
4917          * * 0x0-0xFFF8 - The function ID
4918          * * 0xFFF8-0xFFFE - Reserved for internal processors
4919          * * 0xFFFF - HWRM
4920          */
4921         uint16_t        target_id;
4922         /*
4923          * A physical address pointer pointing to a host buffer that the
4924          * command's response data will be written. This can be either a host
4925          * physical address (HPA) or a guest physical address (GPA) and must
4926          * point to a physically contiguous block of memory.
4927          */
4928         uint64_t        resp_addr;
4929         uint32_t        enables;
4930         /*
4931          * This bit must be '1' for the vf_id_valid field to be
4932          * configured.
4933          */
4934         #define HWRM_FUNC_RESET_INPUT_ENABLES_VF_ID_VALID     UINT32_C(0x1)
4935         /*
4936          * The ID of the VF that this PF is trying to reset.
4937          * Only the parent PF shall be allowed to reset a child VF.
4938          *
4939          * A parent PF driver shall use this field only when a specific child VF
4940          * is requested to be reset.
4941          */
4942         uint16_t        vf_id;
4943         /* This value indicates the level of a function reset. */
4944         uint8_t func_reset_level;
4945         /*
4946          * Reset the caller function and its children VFs (if any). If no
4947          * children functions exist, then reset the caller function only.
4948          */
4949         #define HWRM_FUNC_RESET_INPUT_FUNC_RESET_LEVEL_RESETALL \
4950                 UINT32_C(0x0)
4951         /* Reset the caller function only */
4952         #define HWRM_FUNC_RESET_INPUT_FUNC_RESET_LEVEL_RESETME \
4953                 UINT32_C(0x1)
4954         /*
4955          * Reset all children VFs of the caller function driver if the
4956          * caller is a PF driver.
4957          * It is an error to specify this level by a VF driver.
4958          * It is an error to specify this level by a PF driver with
4959          * no children VFs.
4960          */
4961         #define HWRM_FUNC_RESET_INPUT_FUNC_RESET_LEVEL_RESETCHILDREN \
4962                 UINT32_C(0x2)
4963         /*
4964          * Reset a specific VF of the caller function driver if the caller
4965          * is the parent PF driver.
4966          * It is an error to specify this level by a VF driver.
4967          * It is an error to specify this level by a PF driver that is not
4968          * the parent of the VF that is being requested to reset.
4969          */
4970         #define HWRM_FUNC_RESET_INPUT_FUNC_RESET_LEVEL_RESETVF \
4971                 UINT32_C(0x3)
4972         #define HWRM_FUNC_RESET_INPUT_FUNC_RESET_LEVEL_LAST \
4973                 HWRM_FUNC_RESET_INPUT_FUNC_RESET_LEVEL_RESETVF
4974         uint8_t unused_0;
4975 } __attribute__((packed));
4976
4977 /* hwrm_func_reset_output (size:128b/16B) */
4978 struct hwrm_func_reset_output {
4979         /* The specific error status for the command. */
4980         uint16_t        error_code;
4981         /* The HWRM command request type. */
4982         uint16_t        req_type;
4983         /* The sequence ID from the original command. */
4984         uint16_t        seq_id;
4985         /* The length of the response data in number of bytes. */
4986         uint16_t        resp_len;
4987         uint8_t unused_0[7];
4988         /*
4989          * This field is used in Output records to indicate that the output
4990          * is completely written to RAM.  This field should be read as '1'
4991          * to indicate that the output has been completely written.
4992          * When writing a command completion or response to an internal processor,
4993          * the order of writes has to be such that this field is written last.
4994          */
4995         uint8_t valid;
4996 } __attribute__((packed));
4997
4998 /********************
4999  * hwrm_func_getfid *
5000  ********************/
5001
5002
5003 /* hwrm_func_getfid_input (size:192b/24B) */
5004 struct hwrm_func_getfid_input {
5005         /* The HWRM command request type. */
5006         uint16_t        req_type;
5007         /*
5008          * The completion ring to send the completion event on. This should
5009          * be the NQ ID returned from the `nq_alloc` HWRM command.
5010          */
5011         uint16_t        cmpl_ring;
5012         /*
5013          * The sequence ID is used by the driver for tracking multiple
5014          * commands. This ID is treated as opaque data by the firmware and
5015          * the value is returned in the `hwrm_resp_hdr` upon completion.
5016          */
5017         uint16_t        seq_id;
5018         /*
5019          * The target ID of the command:
5020          * * 0x0-0xFFF8 - The function ID
5021          * * 0xFFF8-0xFFFE - Reserved for internal processors
5022          * * 0xFFFF - HWRM
5023          */
5024         uint16_t        target_id;
5025         /*
5026          * A physical address pointer pointing to a host buffer that the
5027          * command's response data will be written. This can be either a host
5028          * physical address (HPA) or a guest physical address (GPA) and must
5029          * point to a physically contiguous block of memory.
5030          */
5031         uint64_t        resp_addr;
5032         uint32_t        enables;
5033         /*
5034          * This bit must be '1' for the pci_id field to be
5035          * configured.
5036          */
5037         #define HWRM_FUNC_GETFID_INPUT_ENABLES_PCI_ID     UINT32_C(0x1)
5038         /*
5039          * This value is the PCI ID of the queried function.
5040          * If ARI is enabled, then it is
5041          * Bus Number (8b):Function Number(8b). Otherwise, it is
5042          * Bus Number (8b):Device Number (5b):Function Number(3b).
5043          */
5044         uint16_t        pci_id;
5045         uint8_t unused_0[2];
5046 } __attribute__((packed));
5047
5048 /* hwrm_func_getfid_output (size:128b/16B) */
5049 struct hwrm_func_getfid_output {
5050         /* The specific error status for the command. */
5051         uint16_t        error_code;
5052         /* The HWRM command request type. */
5053         uint16_t        req_type;
5054         /* The sequence ID from the original command. */
5055         uint16_t        seq_id;
5056         /* The length of the response data in number of bytes. */
5057         uint16_t        resp_len;
5058         /*
5059          * FID value.  This value is used to identify operations on the PCI
5060          * bus as belonging to a particular PCI function.
5061          */
5062         uint16_t        fid;
5063         uint8_t unused_0[5];
5064         /*
5065          * This field is used in Output records to indicate that the output
5066          * is completely written to RAM.  This field should be read as '1'
5067          * to indicate that the output has been completely written.
5068          * When writing a command completion or response to an internal processor,
5069          * the order of writes has to be such that this field is written last.
5070          */
5071         uint8_t valid;
5072 } __attribute__((packed));
5073
5074 /**********************
5075  * hwrm_func_vf_alloc *
5076  **********************/
5077
5078
5079 /* hwrm_func_vf_alloc_input (size:192b/24B) */
5080 struct hwrm_func_vf_alloc_input {
5081         /* The HWRM command request type. */
5082         uint16_t        req_type;
5083         /*
5084          * The completion ring to send the completion event on. This should
5085          * be the NQ ID returned from the `nq_alloc` HWRM command.
5086          */
5087         uint16_t        cmpl_ring;
5088         /*
5089          * The sequence ID is used by the driver for tracking multiple
5090          * commands. This ID is treated as opaque data by the firmware and
5091          * the value is returned in the `hwrm_resp_hdr` upon completion.
5092          */
5093         uint16_t        seq_id;
5094         /*
5095          * The target ID of the command:
5096          * * 0x0-0xFFF8 - The function ID
5097          * * 0xFFF8-0xFFFE - Reserved for internal processors
5098          * * 0xFFFF - HWRM
5099          */
5100         uint16_t        target_id;
5101         /*
5102          * A physical address pointer pointing to a host buffer that the
5103          * command's response data will be written. This can be either a host
5104          * physical address (HPA) or a guest physical address (GPA) and must
5105          * point to a physically contiguous block of memory.
5106          */
5107         uint64_t        resp_addr;
5108         uint32_t        enables;
5109         /*
5110          * This bit must be '1' for the first_vf_id field to be
5111          * configured.
5112          */
5113         #define HWRM_FUNC_VF_ALLOC_INPUT_ENABLES_FIRST_VF_ID     UINT32_C(0x1)
5114         /*
5115          * This value is used to identify a Virtual Function (VF).
5116          * The scope of VF ID is local within a PF.
5117          */
5118         uint16_t        first_vf_id;
5119         /* The number of virtual functions requested. */
5120         uint16_t        num_vfs;
5121 } __attribute__((packed));
5122
5123 /* hwrm_func_vf_alloc_output (size:128b/16B) */
5124 struct hwrm_func_vf_alloc_output {
5125         /* The specific error status for the command. */
5126         uint16_t        error_code;
5127         /* The HWRM command request type. */
5128         uint16_t        req_type;
5129         /* The sequence ID from the original command. */
5130         uint16_t        seq_id;
5131         /* The length of the response data in number of bytes. */
5132         uint16_t        resp_len;
5133         /* The ID of the first VF allocated. */
5134         uint16_t        first_vf_id;
5135         uint8_t unused_0[5];
5136         /*
5137          * This field is used in Output records to indicate that the output
5138          * is completely written to RAM.  This field should be read as '1'
5139          * to indicate that the output has been completely written.
5140          * When writing a command completion or response to an internal processor,
5141          * the order of writes has to be such that this field is written last.
5142          */
5143         uint8_t valid;
5144 } __attribute__((packed));
5145
5146 /*********************
5147  * hwrm_func_vf_free *
5148  *********************/
5149
5150
5151 /* hwrm_func_vf_free_input (size:192b/24B) */
5152 struct hwrm_func_vf_free_input {
5153         /* The HWRM command request type. */
5154         uint16_t        req_type;
5155         /*
5156          * The completion ring to send the completion event on. This should
5157          * be the NQ ID returned from the `nq_alloc` HWRM command.
5158          */
5159         uint16_t        cmpl_ring;
5160         /*
5161          * The sequence ID is used by the driver for tracking multiple
5162          * commands. This ID is treated as opaque data by the firmware and
5163          * the value is returned in the `hwrm_resp_hdr` upon completion.
5164          */
5165         uint16_t        seq_id;
5166         /*
5167          * The target ID of the command:
5168          * * 0x0-0xFFF8 - The function ID
5169          * * 0xFFF8-0xFFFE - Reserved for internal processors
5170          * * 0xFFFF - HWRM
5171          */
5172         uint16_t        target_id;
5173         /*
5174          * A physical address pointer pointing to a host buffer that the
5175          * command's response data will be written. This can be either a host
5176          * physical address (HPA) or a guest physical address (GPA) and must
5177          * point to a physically contiguous block of memory.
5178          */
5179         uint64_t        resp_addr;
5180         uint32_t        enables;
5181         /*
5182          * This bit must be '1' for the first_vf_id field to be
5183          * configured.
5184          */
5185         #define HWRM_FUNC_VF_FREE_INPUT_ENABLES_FIRST_VF_ID     UINT32_C(0x1)
5186         /*
5187          * This value is used to identify a Virtual Function (VF).
5188          * The scope of VF ID is local within a PF.
5189          */
5190         uint16_t        first_vf_id;
5191         /*
5192          * The number of virtual functions requested.
5193          * 0xFFFF - Cleanup all children of this PF.
5194          */
5195         uint16_t        num_vfs;
5196 } __attribute__((packed));
5197
5198 /* hwrm_func_vf_free_output (size:128b/16B) */
5199 struct hwrm_func_vf_free_output {
5200         /* The specific error status for the command. */
5201         uint16_t        error_code;
5202         /* The HWRM command request type. */
5203         uint16_t        req_type;
5204         /* The sequence ID from the original command. */
5205         uint16_t        seq_id;
5206         /* The length of the response data in number of bytes. */
5207         uint16_t        resp_len;
5208         uint8_t unused_0[7];
5209         /*
5210          * This field is used in Output records to indicate that the output
5211          * is completely written to RAM.  This field should be read as '1'
5212          * to indicate that the output has been completely written.
5213          * When writing a command completion or response to an internal processor,
5214          * the order of writes has to be such that this field is written last.
5215          */
5216         uint8_t valid;
5217 } __attribute__((packed));
5218
5219 /********************
5220  * hwrm_func_vf_cfg *
5221  ********************/
5222
5223
5224 /* hwrm_func_vf_cfg_input (size:448b/56B) */
5225 struct hwrm_func_vf_cfg_input {
5226         /* The HWRM command request type. */
5227         uint16_t        req_type;
5228         /*
5229          * The completion ring to send the completion event on. This should
5230          * be the NQ ID returned from the `nq_alloc` HWRM command.
5231          */
5232         uint16_t        cmpl_ring;
5233         /*
5234          * The sequence ID is used by the driver for tracking multiple
5235          * commands. This ID is treated as opaque data by the firmware and
5236          * the value is returned in the `hwrm_resp_hdr` upon completion.
5237          */
5238         uint16_t        seq_id;
5239         /*
5240          * The target ID of the command:
5241          * * 0x0-0xFFF8 - The function ID
5242          * * 0xFFF8-0xFFFE - Reserved for internal processors
5243          * * 0xFFFF - HWRM
5244          */
5245         uint16_t        target_id;
5246         /*
5247          * A physical address pointer pointing to a host buffer that the
5248          * command's response data will be written. This can be either a host
5249          * physical address (HPA) or a guest physical address (GPA) and must
5250          * point to a physically contiguous block of memory.
5251          */
5252         uint64_t        resp_addr;
5253         uint32_t        enables;
5254         /*
5255          * This bit must be '1' for the mtu field to be
5256          * configured.
5257          */
5258         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_MTU \
5259                 UINT32_C(0x1)
5260         /*
5261          * This bit must be '1' for the guest_vlan field to be
5262          * configured.
5263          */
5264         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_GUEST_VLAN \
5265                 UINT32_C(0x2)
5266         /*
5267          * This bit must be '1' for the async_event_cr field to be
5268          * configured.
5269          */
5270         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_ASYNC_EVENT_CR \
5271                 UINT32_C(0x4)
5272         /*
5273          * This bit must be '1' for the dflt_mac_addr field to be
5274          * configured.
5275          */
5276         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_DFLT_MAC_ADDR \
5277                 UINT32_C(0x8)
5278         /*
5279          * This bit must be '1' for the num_rsscos_ctxs field to be
5280          * configured.
5281          */
5282         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_NUM_RSSCOS_CTXS \
5283                 UINT32_C(0x10)
5284         /*
5285          * This bit must be '1' for the num_cmpl_rings field to be
5286          * configured.
5287          */
5288         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_NUM_CMPL_RINGS \
5289                 UINT32_C(0x20)
5290         /*
5291          * This bit must be '1' for the num_tx_rings field to be
5292          * configured.
5293          */
5294         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_NUM_TX_RINGS \
5295                 UINT32_C(0x40)
5296         /*
5297          * This bit must be '1' for the num_rx_rings field to be
5298          * configured.
5299          */
5300         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_NUM_RX_RINGS \
5301                 UINT32_C(0x80)
5302         /*
5303          * This bit must be '1' for the num_l2_ctxs field to be
5304          * configured.
5305          */
5306         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_NUM_L2_CTXS \
5307                 UINT32_C(0x100)
5308         /*
5309          * This bit must be '1' for the num_vnics field to be
5310          * configured.
5311          */
5312         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_NUM_VNICS \
5313                 UINT32_C(0x200)
5314         /*
5315          * This bit must be '1' for the num_stat_ctxs field to be
5316          * configured.
5317          */
5318         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_NUM_STAT_CTXS \
5319                 UINT32_C(0x400)
5320         /*
5321          * This bit must be '1' for the num_hw_ring_grps field to be
5322          * configured.
5323          */
5324         #define HWRM_FUNC_VF_CFG_INPUT_ENABLES_NUM_HW_RING_GRPS \
5325                 UINT32_C(0x800)
5326         /*
5327          * The maximum transmission unit requested on the function.
5328          * The HWRM should make sure that the mtu of
5329          * the function does not exceed the mtu of the physical
5330          * port that this function is associated with.
5331          *
5332          * In addition to requesting mtu per function, it is
5333          * possible to configure mtu per transmit ring.
5334          * By default, the mtu of each transmit ring associated
5335          * with a function is equal to the mtu of the function.
5336          * The HWRM should make sure that the mtu of each transmit
5337          * ring that is assigned to a function has a valid mtu.
5338          */
5339         uint16_t        mtu;
5340         /*
5341          * The guest VLAN for the function being configured.
5342          * This field's format is same as 802.1Q Tag's
5343          * Tag Control Information (TCI) format that includes both
5344          * Priority Code Point (PCP) and VLAN Identifier (VID).
5345          */
5346         uint16_t        guest_vlan;
5347         /*
5348          * ID of the target completion ring for receiving asynchronous
5349          * event completions. If this field is not valid, then the
5350          * HWRM shall use the default completion ring of the function
5351          * that is being configured as the target completion ring for
5352          * providing any asynchronous event completions for that
5353          * function.
5354          * If this field is valid, then the HWRM shall use the
5355          * completion ring identified by this ID as the target
5356          * completion ring for providing any asynchronous event
5357          * completions for the function that is being configured.
5358          */
5359         uint16_t        async_event_cr;
5360         /*
5361          * This value is the current MAC address requested by the VF
5362          * driver to be configured on this VF. A value of
5363          * 00-00-00-00-00-00 indicates no MAC address configuration
5364          * is requested by the VF driver.
5365          * The parent PF driver may reject or overwrite this
5366          * MAC address.
5367          */
5368         uint8_t dflt_mac_addr[6];
5369         uint32_t        flags;
5370         /*
5371          * This bit requests that the firmware test to see if all the assets
5372          * requested in this command (i.e. number of TX rings) are available.
5373          * The firmware will return an error if the requested assets are
5374          * not available. The firwmare will NOT reserve the assets if they
5375          * are available.
5376          */
5377         #define HWRM_FUNC_VF_CFG_INPUT_FLAGS_TX_ASSETS_TEST \
5378                 UINT32_C(0x1)
5379         /*
5380          * This bit requests that the firmware test to see if all the assets
5381          * requested in this command (i.e. number of RX rings) are available.
5382          * The firmware will return an error if the requested assets are
5383          * not available. The firwmare will NOT reserve the assets if they
5384          * are available.
5385          */
5386         #define HWRM_FUNC_VF_CFG_INPUT_FLAGS_RX_ASSETS_TEST \
5387                 UINT32_C(0x2)
5388         /*
5389          * This bit requests that the firmware test to see if all the assets
5390          * requested in this command (i.e. number of CMPL rings) are available.
5391          * The firmware will return an error if the requested assets are
5392          * not available. The firwmare will NOT reserve the assets if they
5393          * are available.
5394          */
5395         #define HWRM_FUNC_VF_CFG_INPUT_FLAGS_CMPL_ASSETS_TEST \
5396                 UINT32_C(0x4)
5397         /*
5398          * This bit requests that the firmware test to see if all the assets
5399          * requested in this command (i.e. number of RSS ctx) are available.
5400          * The firmware will return an error if the requested assets are
5401          * not available. The firwmare will NOT reserve the assets if they
5402          * are available.
5403          */
5404         #define HWRM_FUNC_VF_CFG_INPUT_FLAGS_RSSCOS_CTX_ASSETS_TEST \
5405                 UINT32_C(0x8)
5406         /*
5407          * This bit requests that the firmware test to see if all the assets
5408          * requested in this command (i.e. number of ring groups) are available.
5409          * The firmware will return an error if the requested assets are
5410          * not available. The firwmare will NOT reserve the assets if they
5411          * are available.
5412          */
5413         #define HWRM_FUNC_VF_CFG_INPUT_FLAGS_RING_GRP_ASSETS_TEST \
5414                 UINT32_C(0x10)
5415         /*
5416          * This bit requests that the firmware test to see if all the assets
5417          * requested in this command (i.e. number of stat ctx) are available.
5418          * The firmware will return an error if the requested assets are
5419          * not available. The firwmare will NOT reserve the assets if they
5420          * are available.
5421          */
5422         #define HWRM_FUNC_VF_CFG_INPUT_FLAGS_STAT_CTX_ASSETS_TEST \
5423                 UINT32_C(0x20)
5424         /*
5425          * This bit requests that the firmware test to see if all the assets
5426          * requested in this command (i.e. number of VNICs) are available.
5427          * The firmware will return an error if the requested assets are
5428          * not available. The firwmare will NOT reserve the assets if they
5429          * are available.
5430          */
5431         #define HWRM_FUNC_VF_CFG_INPUT_FLAGS_VNIC_ASSETS_TEST \
5432                 UINT32_C(0x40)
5433         /*
5434          * This bit requests that the firmware test to see if all the assets
5435          * requested in this command (i.e. number of L2 ctx) are available.
5436          * The firmware will return an error if the requested assets are
5437          * not available. The firwmare will NOT reserve the assets if they
5438          * are available.
5439          */
5440         #define HWRM_FUNC_VF_CFG_INPUT_FLAGS_L2_CTX_ASSETS_TEST \
5441                 UINT32_C(0x80)
5442         /* The number of RSS/COS contexts requested for the VF. */
5443         uint16_t        num_rsscos_ctxs;
5444         /* The number of completion rings requested for the VF. */
5445         uint16_t        num_cmpl_rings;
5446         /* The number of transmit rings requested for the VF. */
5447         uint16_t        num_tx_rings;
5448         /* The number of receive rings requested for the VF. */
5449         uint16_t        num_rx_rings;
5450         /* The number of L2 contexts requested for the VF. */
5451         uint16_t        num_l2_ctxs;
5452         /* The number of vnics requested for the VF. */
5453         uint16_t        num_vnics;
5454         /* The number of statistic contexts requested for the VF. */
5455         uint16_t        num_stat_ctxs;
5456         /* The number of HW ring groups requested for the VF. */
5457         uint16_t        num_hw_ring_grps;
5458         uint8_t unused_0[4];
5459 } __attribute__((packed));
5460
5461 /* hwrm_func_vf_cfg_output (size:128b/16B) */
5462 struct hwrm_func_vf_cfg_output {
5463         /* The specific error status for the command. */
5464         uint16_t        error_code;
5465         /* The HWRM command request type. */
5466         uint16_t        req_type;
5467         /* The sequence ID from the original command. */
5468         uint16_t        seq_id;
5469         /* The length of the response data in number of bytes. */
5470         uint16_t        resp_len;
5471         uint8_t unused_0[7];
5472         /*
5473          * This field is used in Output records to indicate that the output
5474          * is completely written to RAM.  This field should be read as '1'
5475          * to indicate that the output has been completely written.
5476          * When writing a command completion or response to an internal processor,
5477          * the order of writes has to be such that this field is written last.
5478          */
5479         uint8_t valid;
5480 } __attribute__((packed));
5481
5482 /*******************
5483  * hwrm_func_qcaps *
5484  *******************/
5485
5486
5487 /* hwrm_func_qcaps_input (size:192b/24B) */
5488 struct hwrm_func_qcaps_input {
5489         /* The HWRM command request type. */
5490         uint16_t        req_type;
5491         /*
5492          * The completion ring to send the completion event on. This should
5493          * be the NQ ID returned from the `nq_alloc` HWRM command.
5494          */
5495         uint16_t        cmpl_ring;
5496         /*
5497          * The sequence ID is used by the driver for tracking multiple
5498          * commands. This ID is treated as opaque data by the firmware and
5499          * the value is returned in the `hwrm_resp_hdr` upon completion.
5500          */
5501         uint16_t        seq_id;
5502         /*
5503          * The target ID of the command:
5504          * * 0x0-0xFFF8 - The function ID
5505          * * 0xFFF8-0xFFFE - Reserved for internal processors
5506          * * 0xFFFF - HWRM
5507          */
5508         uint16_t        target_id;
5509         /*
5510          * A physical address pointer pointing to a host buffer that the
5511          * command's response data will be written. This can be either a host
5512          * physical address (HPA) or a guest physical address (GPA) and must
5513          * point to a physically contiguous block of memory.
5514          */
5515         uint64_t        resp_addr;
5516         /*
5517          * Function ID of the function that is being queried.
5518          * 0xFF... (All Fs) if the query is for the requesting
5519          * function.
5520          */
5521         uint16_t        fid;
5522         uint8_t unused_0[6];
5523 } __attribute__((packed));
5524
5525 /* hwrm_func_qcaps_output (size:640b/80B) */
5526 struct hwrm_func_qcaps_output {
5527         /* The specific error status for the command. */
5528         uint16_t        error_code;
5529         /* The HWRM command request type. */
5530         uint16_t        req_type;
5531         /* The sequence ID from the original command. */
5532         uint16_t        seq_id;
5533         /* The length of the response data in number of bytes. */
5534         uint16_t        resp_len;
5535         /*
5536          * FID value.  This value is used to identify operations on the PCI
5537          * bus as belonging to a particular PCI function.
5538          */
5539         uint16_t        fid;
5540         /*
5541          * Port ID of port that this function is associated with.
5542          * Valid only for the PF.
5543          * 0xFF... (All Fs) if this function is not associated with
5544          * any port.
5545          * 0xFF... (All Fs) if this function is called from a VF.
5546          */
5547         uint16_t        port_id;
5548         uint32_t        flags;
5549         /* If 1, then Push mode is supported on this function. */
5550         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_PUSH_MODE_SUPPORTED \
5551                 UINT32_C(0x1)
5552         /*
5553          * If 1, then the global MSI-X auto-masking is enabled for the
5554          * device.
5555          */
5556         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_GLOBAL_MSIX_AUTOMASKING \
5557                 UINT32_C(0x2)
5558         /*
5559          * If 1, then the Precision Time Protocol (PTP) processing
5560          * is supported on this function.
5561          * The HWRM should enable PTP on only a single Physical
5562          * Function (PF) per port.
5563          */
5564         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_PTP_SUPPORTED \
5565                 UINT32_C(0x4)
5566         /*
5567          * If 1, then RDMA over Converged Ethernet (RoCE) v1
5568          * is supported on this function.
5569          */
5570         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_ROCE_V1_SUPPORTED \
5571                 UINT32_C(0x8)
5572         /*
5573          * If 1, then RDMA over Converged Ethernet (RoCE) v2
5574          * is supported on this function.
5575          */
5576         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_ROCE_V2_SUPPORTED \
5577                 UINT32_C(0x10)
5578         /*
5579          * If 1, then control and configuration of WoL magic packet
5580          * are supported on this function.
5581          */
5582         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_WOL_MAGICPKT_SUPPORTED \
5583                 UINT32_C(0x20)
5584         /*
5585          * If 1, then control and configuration of bitmap pattern
5586          * packet are supported on this function.
5587          */
5588         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_WOL_BMP_SUPPORTED \
5589                 UINT32_C(0x40)
5590         /*
5591          * If set to 1, then the control and configuration of rate limit
5592          * of an allocated TX ring on the queried function is supported.
5593          */
5594         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_TX_RING_RL_SUPPORTED \
5595                 UINT32_C(0x80)
5596         /*
5597          * If 1, then control and configuration of minimum and
5598          * maximum bandwidths are supported on the queried function.
5599          */
5600         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_TX_BW_CFG_SUPPORTED \
5601                 UINT32_C(0x100)
5602         /*
5603          * If the query is for a VF, then this flag shall be ignored.
5604          * If this query is for a PF and this flag is set to 1,
5605          * then the PF has the capability to set the rate limits
5606          * on the TX rings of its children VFs.
5607          * If this query is for a PF and this flag is set to 0, then
5608          * the PF does not have the capability to set the rate limits
5609          * on the TX rings of its children VFs.
5610          */
5611         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_VF_TX_RING_RL_SUPPORTED \
5612                 UINT32_C(0x200)
5613         /*
5614          * If the query is for a VF, then this flag shall be ignored.
5615          * If this query is for a PF and this flag is set to 1,
5616          * then the PF has the capability to set the minimum and/or
5617          * maximum bandwidths for its children VFs.
5618          * If this query is for a PF and this flag is set to 0, then
5619          * the PF does not have the capability to set the minimum or
5620          * maximum bandwidths for its children VFs.
5621          */
5622         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_VF_BW_CFG_SUPPORTED \
5623                 UINT32_C(0x400)
5624         /*
5625          * Standard TX Ring mode is used for the allocation of TX ring
5626          * and underlying scheduling resources that allow bandwidth
5627          * reservation and limit settings on the queried function.
5628          * If set to 1, then standard TX ring mode is supported
5629          * on the queried function.
5630          * If set to 0, then standard TX ring mode is not available
5631          * on the queried function.
5632          */
5633         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_STD_TX_RING_MODE_SUPPORTED \
5634                 UINT32_C(0x800)
5635         /*
5636          * If the query is for a VF, then this flag shall be ignored,
5637          * If this query is for a PF and this flag is set to 1,
5638          * then the PF has the capability to detect GENEVE tunnel
5639          * flags.
5640          */
5641         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_GENEVE_TUN_FLAGS_SUPPORTED \
5642                 UINT32_C(0x1000)
5643         /*
5644          * If the query is for a VF, then this flag shall be ignored,
5645          * If this query is for a PF and this flag is set to 1,
5646          * then the PF has the capability to detect NVGRE tunnel
5647          * flags.
5648          */
5649         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_NVGRE_TUN_FLAGS_SUPPORTED \
5650                 UINT32_C(0x2000)
5651         /*
5652          * If the query is for a VF, then this flag shall be ignored,
5653          * If this query is for a PF and this flag is set to 1,
5654          * then the PF has the capability to detect GRE tunnel
5655          * flags.
5656          */
5657         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_GRE_TUN_FLAGS_SUPPORTED \
5658                 UINT32_C(0x4000)
5659         /*
5660          * If the query is for a VF, then this flag shall be ignored,
5661          * If this query is for a PF and this flag is set to 1,
5662          * then the PF has the capability to detect MPLS tunnel
5663          * flags.
5664          */
5665         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_MPLS_TUN_FLAGS_SUPPORTED \
5666                 UINT32_C(0x8000)
5667         /*
5668          * If the query is for a VF, then this flag shall be ignored,
5669          * If this query is for a PF and this flag is set to 1,
5670          * then the PF has the capability to support pcie stats.
5671          */
5672         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_PCIE_STATS_SUPPORTED \
5673                 UINT32_C(0x10000)
5674         /*
5675          * If the query is for a VF, then this flag shall be ignored,
5676          * If this query is for a PF and this flag is set to 1,
5677          * then the PF has the capability to adopt the VF's belonging
5678          * to another PF.
5679          */
5680         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_ADOPTED_PF_SUPPORTED \
5681                 UINT32_C(0x20000)
5682         /*
5683          * If the query is for a VF, then this flag shall be ignored,
5684          * If this query is for a PF and this flag is set to 1,
5685          * then the PF has the capability to administer another PF.
5686          */
5687         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_ADMIN_PF_SUPPORTED \
5688                 UINT32_C(0x40000)
5689         /*
5690          * If the query is for a VF, then this flag shall be ignored.
5691          * If this query is for a PF and this flag is set to 1, then
5692          * the PF will know that the firmware has the capability to track
5693          * the virtual link status.
5694          */
5695         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_LINK_ADMIN_STATUS_SUPPORTED \
5696                 UINT32_C(0x80000)
5697         /*
5698          * If 1, then this function supports the push mode that uses
5699          * write combine buffers and the long inline tx buffer descriptor.
5700          */
5701         #define HWRM_FUNC_QCAPS_OUTPUT_FLAGS_WCB_PUSH_MODE \
5702                 UINT32_C(0x100000)
5703         /*
5704          * This value is current MAC address configured for this
5705          * function. A value of 00-00-00-00-00-00 indicates no
5706          * MAC address is currently configured.
5707          */
5708         uint8_t mac_address[6];
5709         /*
5710          * The maximum number of RSS/COS contexts that can be
5711          * allocated to the function.
5712          */
5713         uint16_t        max_rsscos_ctx;
5714         /*
5715          * The maximum number of completion rings that can be
5716          * allocated to the function.
5717          */
5718         uint16_t        max_cmpl_rings;
5719         /*
5720          * The maximum number of transmit rings that can be
5721          * allocated to the function.
5722          */
5723         uint16_t        max_tx_rings;
5724         /*
5725          * The maximum number of receive rings that can be
5726          * allocated to the function.
5727          */
5728         uint16_t        max_rx_rings;
5729         /*
5730          * The maximum number of L2 contexts that can be
5731          * allocated to the function.
5732          */
5733         uint16_t        max_l2_ctxs;
5734         /*
5735          * The maximum number of VNICs that can be
5736          * allocated to the function.
5737          */
5738         uint16_t        max_vnics;
5739         /*
5740          * The identifier for the first VF enabled on a PF. This
5741          * is valid only on the PF with SR-IOV enabled.
5742          * 0xFF... (All Fs) if this command is called on a PF with
5743          * SR-IOV disabled or on a VF.
5744          */
5745         uint16_t        first_vf_id;
5746         /*
5747          * The maximum number of VFs that can be
5748          * allocated to the function. This is valid only on the
5749          * PF with SR-IOV enabled. 0xFF... (All Fs) if this
5750          * command is called on a PF with SR-IOV disabled or
5751          * on a VF.
5752          */
5753         uint16_t        max_vfs;
5754         /*
5755          * The maximum number of statistic contexts that can be
5756          * allocated to the function.
5757          */
5758         uint16_t        max_stat_ctx;
5759         /*
5760          * The maximum number of Encapsulation records that can be
5761          * offloaded by this function.
5762          */
5763         uint32_t        max_encap_records;
5764         /*
5765          * The maximum number of decapsulation records that can
5766          * be offloaded by this function.
5767          */
5768         uint32_t        max_decap_records;
5769         /*
5770          * The maximum number of Exact Match (EM) flows that can be
5771          * offloaded by this function on the TX side.
5772          */
5773         uint32_t        max_tx_em_flows;
5774         /*
5775          * The maximum number of Wildcard Match (WM) flows that can
5776          * be offloaded by this function on the TX side.
5777          */
5778         uint32_t        max_tx_wm_flows;
5779         /*
5780          * The maximum number of Exact Match (EM) flows that can be
5781          * offloaded by this function on the RX side.
5782          */
5783         uint32_t        max_rx_em_flows;
5784         /*
5785          * The maximum number of Wildcard Match (WM) flows that can
5786          * be offloaded by this function on the RX side.
5787          */
5788         uint32_t        max_rx_wm_flows;
5789         /*
5790          * The maximum number of multicast filters that can
5791          * be supported by this function on the RX side.
5792          */
5793         uint32_t        max_mcast_filters;
5794         /*
5795          * The maximum value of flow_id that can be supported
5796          * in completion records.
5797          */
5798         uint32_t        max_flow_id;
5799         /*
5800          * The maximum number of HW ring groups that can be
5801          * supported on this function.
5802          */
5803         uint32_t        max_hw_ring_grps;
5804         /*
5805          * The maximum number of strict priority transmit rings
5806          * that can be allocated to the function.
5807          * This number indicates the maximum number of TX rings
5808          * that can be assigned strict priorities out of the
5809          * maximum number of TX rings that can be allocated
5810          * (max_tx_rings) to the function.
5811          */
5812         uint16_t        max_sp_tx_rings;
5813         uint8_t unused_0;
5814         /*
5815          * This field is used in Output records to indicate that the output
5816          * is completely written to RAM.  This field should be read as '1'
5817          * to indicate that the output has been completely written.
5818          * When writing a command completion or response to an internal processor,
5819          * the order of writes has to be such that this field is written last.
5820          */
5821         uint8_t valid;
5822 } __attribute__((packed));
5823
5824 /******************
5825  * hwrm_func_qcfg *
5826  ******************/
5827
5828
5829 /* hwrm_func_qcfg_input (size:192b/24B) */
5830 struct hwrm_func_qcfg_input {
5831         /* The HWRM command request type. */
5832         uint16_t        req_type;
5833         /*
5834          * The completion ring to send the completion event on. This should
5835          * be the NQ ID returned from the `nq_alloc` HWRM command.
5836          */
5837         uint16_t        cmpl_ring;
5838         /*
5839          * The sequence ID is used by the driver for tracking multiple
5840          * commands. This ID is treated as opaque data by the firmware and
5841          * the value is returned in the `hwrm_resp_hdr` upon completion.
5842          */
5843         uint16_t        seq_id;
5844         /*
5845          * The target ID of the command:
5846          * * 0x0-0xFFF8 - The function ID
5847          * * 0xFFF8-0xFFFE - Reserved for internal processors
5848          * * 0xFFFF - HWRM
5849          */
5850         uint16_t        target_id;
5851         /*
5852          * A physical address pointer pointing to a host buffer that the
5853          * command's response data will be written. This can be either a host
5854          * physical address (HPA) or a guest physical address (GPA) and must
5855          * point to a physically contiguous block of memory.
5856          */
5857         uint64_t        resp_addr;
5858         /*
5859          * Function ID of the function that is being queried.
5860          * 0xFF... (All Fs) if the query is for the requesting
5861          * function.
5862          */
5863         uint16_t        fid;
5864         uint8_t unused_0[6];
5865 } __attribute__((packed));
5866
5867 /* hwrm_func_qcfg_output (size:640b/80B) */
5868 struct hwrm_func_qcfg_output {
5869         /* The specific error status for the command. */
5870         uint16_t        error_code;
5871         /* The HWRM command request type. */
5872         uint16_t        req_type;
5873         /* The sequence ID from the original command. */
5874         uint16_t        seq_id;
5875         /* The length of the response data in number of bytes. */
5876         uint16_t        resp_len;
5877         /*
5878          * FID value.  This value is used to identify operations on the PCI
5879          * bus as belonging to a particular PCI function.
5880          */
5881         uint16_t        fid;
5882         /*
5883          * Port ID of port that this function is associated with.
5884          * 0xFF... (All Fs) if this function is not associated with
5885          * any port.
5886          */
5887         uint16_t        port_id;
5888         /*
5889          * This value is the current VLAN setting for this
5890          * function. The value of 0 for this field indicates
5891          * no priority tagging or VLAN is used.
5892          * This field's format is same as 802.1Q Tag's
5893          * Tag Control Information (TCI) format that includes both
5894          * Priority Code Point (PCP) and VLAN Identifier (VID).
5895          */
5896         uint16_t        vlan;
5897         uint16_t        flags;
5898         /*
5899          * If 1, then magic packet based Out-Of-Box WoL is enabled on
5900          * the port associated with this function.
5901          */
5902         #define HWRM_FUNC_QCFG_OUTPUT_FLAGS_OOB_WOL_MAGICPKT_ENABLED \
5903                 UINT32_C(0x1)
5904         /*
5905          * If 1, then bitmap pattern based Out-Of-Box WoL packet is enabled
5906          * on the port associated with this function.
5907          */
5908         #define HWRM_FUNC_QCFG_OUTPUT_FLAGS_OOB_WOL_BMP_ENABLED \
5909                 UINT32_C(0x2)
5910         /*
5911          * If set to 1, then FW based DCBX agent is enabled and running on
5912          * the port associated with this function.
5913          * If set to 0, then DCBX agent is not running in the firmware.
5914          */
5915         #define HWRM_FUNC_QCFG_OUTPUT_FLAGS_FW_DCBX_AGENT_ENABLED \
5916                 UINT32_C(0x4)
5917         /*
5918          * Standard TX Ring mode is used for the allocation of TX ring
5919          * and underlying scheduling resources that allow bandwidth
5920          * reservation and limit settings on the queried function.
5921          * If set to 1, then standard TX ring mode is enabled
5922          * on the queried function.
5923          * If set to 0, then the standard TX ring mode is disabled
5924          * on the queried function. In this extended TX ring resource
5925          * mode, the minimum and maximum bandwidth settings are not
5926          * supported to allow the allocation of TX rings to span multiple
5927          * scheduler nodes.
5928          */
5929         #define HWRM_FUNC_QCFG_OUTPUT_FLAGS_STD_TX_RING_MODE_ENABLED \
5930                 UINT32_C(0x8)
5931         /*
5932          * If set to 1 then FW based LLDP agent is enabled and running on
5933          * the port associated with this function.
5934          * If set to 0 then the LLDP agent is not running in the firmware.
5935          */
5936         #define HWRM_FUNC_QCFG_OUTPUT_FLAGS_FW_LLDP_AGENT_ENABLED \
5937                 UINT32_C(0x10)
5938         /*
5939          * If set to 1, then multi-host mode is active for this function.
5940          * If set to 0, then multi-host mode is inactive for this function
5941          * or not applicable for this device.
5942          */
5943         #define HWRM_FUNC_QCFG_OUTPUT_FLAGS_MULTI_HOST \
5944                 UINT32_C(0x20)
5945         /*
5946          * If the function that is being queried is a PF, then the HWRM shall
5947          * set this field to 0 and the HWRM client shall ignore this field.
5948          * If the function that is being queried is a VF, then the HWRM shall
5949          * set this field to 1 if the queried VF is trusted, otherwise the HWRM
5950          * shall set this field to 0.
5951          */
5952         #define HWRM_FUNC_QCFG_OUTPUT_FLAGS_TRUSTED_VF \
5953                 UINT32_C(0x40)
5954         /*
5955          * This value is current MAC address configured for this
5956          * function. A value of 00-00-00-00-00-00 indicates no
5957          * MAC address is currently configured.
5958          */
5959         uint8_t mac_address[6];
5960         /*
5961          * This value is current PCI ID of this
5962          * function. If ARI is enabled, then it is
5963          * Bus Number (8b):Function Number(8b). Otherwise, it is
5964          * Bus Number (8b):Device Number (4b):Function Number(4b).
5965          * If multi-host mode is active, the 4 lsb will indicate
5966          * the PF index for this function.
5967          */
5968         uint16_t        pci_id;
5969         /*
5970          * The number of RSS/COS contexts currently
5971          * allocated to the function.
5972          */
5973         uint16_t        alloc_rsscos_ctx;
5974         /*
5975          * The number of completion rings currently allocated to
5976          * the function. This does not include the rings allocated
5977          * to any children functions if any.
5978          */
5979         uint16_t        alloc_cmpl_rings;
5980         /*
5981          * The number of transmit rings currently allocated to
5982          * the function. This does not include the rings allocated
5983          * to any children functions if any.
5984          */
5985         uint16_t        alloc_tx_rings;
5986         /*
5987          * The number of receive rings currently allocated to
5988          * the function. This does not include the rings allocated
5989          * to any children functions if any.
5990          */
5991         uint16_t        alloc_rx_rings;
5992         /* The allocated number of L2 contexts to the function. */
5993         uint16_t        alloc_l2_ctx;
5994         /* The allocated number of vnics to the function. */
5995         uint16_t        alloc_vnics;
5996         /*
5997          * The maximum transmission unit of the function.
5998          * For rings allocated on this function, this default
5999          * value is used if ring MTU is not specified.
6000          */
6001         uint16_t        mtu;
6002         /*
6003          * The maximum receive unit of the function.
6004          * For vnics allocated on this function, this default
6005          * value is used if vnic MRU is not specified.
6006          */
6007         uint16_t        mru;
6008         /* The statistics context assigned to a function. */
6009         uint16_t        stat_ctx_id;
6010         /*
6011          * The HWRM shall return Unknown value for this field
6012          * when this command is used to query VF's configuration.
6013          */
6014         uint8_t port_partition_type;
6015         /* Single physical function */
6016         #define HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_SPF     UINT32_C(0x0)
6017         /* Multiple physical functions */
6018         #define HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_MPFS    UINT32_C(0x1)
6019         /* Network Partitioning 1.0 */
6020         #define HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_NPAR1_0 UINT32_C(0x2)
6021         /* Network Partitioning 1.5 */
6022         #define HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_NPAR1_5 UINT32_C(0x3)
6023         /* Network Partitioning 2.0 */
6024         #define HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_NPAR2_0 UINT32_C(0x4)
6025         /* Unknown */
6026         #define HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_UNKNOWN \
6027                 UINT32_C(0xff)
6028         #define HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_LAST \
6029                 HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_UNKNOWN
6030         /*
6031          * This field will indicate number of physical functions on this port_partition.
6032          * HWRM shall return unavail (i.e. value of 0) for this field
6033          * when this command is used to query VF's configuration or
6034          * from older firmware that doesn't support this field.
6035          */
6036         uint8_t port_pf_cnt;
6037         /* number of PFs is not available */
6038         #define HWRM_FUNC_QCFG_OUTPUT_PORT_PF_CNT_UNAVAIL UINT32_C(0x0)
6039         #define HWRM_FUNC_QCFG_OUTPUT_PORT_PF_CNT_LAST \
6040                 HWRM_FUNC_QCFG_OUTPUT_PORT_PF_CNT_UNAVAIL
6041         /*
6042          * The default VNIC ID assigned to a function that is
6043          * being queried.
6044          */
6045         uint16_t        dflt_vnic_id;
6046         uint16_t        max_mtu_configured;
6047         /*
6048          * Minimum BW allocated for this function.
6049          * The HWRM will translate this value into byte counter and
6050          * time interval used for the scheduler inside the device.
6051          * A value of 0 indicates the minimum bandwidth is not
6052          * configured.
6053          */
6054         uint32_t        min_bw;
6055         /* The bandwidth value. */
6056         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_MASK \
6057                 UINT32_C(0xfffffff)
6058         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_SFT              0
6059         /* The granularity of the value (bits or bytes). */
6060         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_SCALE \
6061                 UINT32_C(0x10000000)
6062         /* Value is in bits. */
6063         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_SCALE_BITS \
6064                 (UINT32_C(0x0) << 28)
6065         /* Value is in bytes. */
6066         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_SCALE_BYTES \
6067                 (UINT32_C(0x1) << 28)
6068         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_SCALE_LAST \
6069                 HWRM_FUNC_QCFG_OUTPUT_MIN_BW_SCALE_BYTES
6070         /* bw_value_unit is 3 b */
6071         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_MASK \
6072                 UINT32_C(0xe0000000)
6073         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_SFT         29
6074         /* Value is in Mb or MB (base 10). */
6075         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_MEGA \
6076                 (UINT32_C(0x0) << 29)
6077         /* Value is in Kb or KB (base 10). */
6078         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_KILO \
6079                 (UINT32_C(0x2) << 29)
6080         /* Value is in bits or bytes. */
6081         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_BASE \
6082                 (UINT32_C(0x4) << 29)
6083         /* Value is in Gb or GB (base 10). */
6084         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_GIGA \
6085                 (UINT32_C(0x6) << 29)
6086         /* Value is in 1/100th of a percentage of total bandwidth. */
6087         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
6088                 (UINT32_C(0x1) << 29)
6089         /* Invalid unit */
6090         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_INVALID \
6091                 (UINT32_C(0x7) << 29)
6092         #define HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_LAST \
6093                 HWRM_FUNC_QCFG_OUTPUT_MIN_BW_BW_VALUE_UNIT_INVALID
6094         /*
6095          * Maximum BW allocated for this function.
6096          * The HWRM will translate this value into byte counter and
6097          * time interval used for the scheduler inside the device.
6098          * A value of 0 indicates that the maximum bandwidth is not
6099          * configured.
6100          */
6101         uint32_t        max_bw;
6102         /* The bandwidth value. */
6103         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_MASK \
6104                 UINT32_C(0xfffffff)
6105         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_SFT              0
6106         /* The granularity of the value (bits or bytes). */
6107         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_SCALE \
6108                 UINT32_C(0x10000000)
6109         /* Value is in bits. */
6110         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_SCALE_BITS \
6111                 (UINT32_C(0x0) << 28)
6112         /* Value is in bytes. */
6113         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_SCALE_BYTES \
6114                 (UINT32_C(0x1) << 28)
6115         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_SCALE_LAST \
6116                 HWRM_FUNC_QCFG_OUTPUT_MAX_BW_SCALE_BYTES
6117         /* bw_value_unit is 3 b */
6118         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_MASK \
6119                 UINT32_C(0xe0000000)
6120         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_SFT         29
6121         /* Value is in Mb or MB (base 10). */
6122         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_MEGA \
6123                 (UINT32_C(0x0) << 29)
6124         /* Value is in Kb or KB (base 10). */
6125         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_KILO \
6126                 (UINT32_C(0x2) << 29)
6127         /* Value is in bits or bytes. */
6128         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_BASE \
6129                 (UINT32_C(0x4) << 29)
6130         /* Value is in Gb or GB (base 10). */
6131         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_GIGA \
6132                 (UINT32_C(0x6) << 29)
6133         /* Value is in 1/100th of a percentage of total bandwidth. */
6134         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
6135                 (UINT32_C(0x1) << 29)
6136         /* Invalid unit */
6137         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_INVALID \
6138                 (UINT32_C(0x7) << 29)
6139         #define HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_LAST \
6140                 HWRM_FUNC_QCFG_OUTPUT_MAX_BW_BW_VALUE_UNIT_INVALID
6141         /*
6142          * This value indicates the Edge virtual bridge mode for the
6143          * domain that this function belongs to.
6144          */
6145         uint8_t evb_mode;
6146         /* No Edge Virtual Bridging (EVB) */
6147         #define HWRM_FUNC_QCFG_OUTPUT_EVB_MODE_NO_EVB UINT32_C(0x0)
6148         /* Virtual Ethernet Bridge (VEB) */
6149         #define HWRM_FUNC_QCFG_OUTPUT_EVB_MODE_VEB    UINT32_C(0x1)
6150         /* Virtual Ethernet Port Aggregator (VEPA) */
6151         #define HWRM_FUNC_QCFG_OUTPUT_EVB_MODE_VEPA   UINT32_C(0x2)
6152         #define HWRM_FUNC_QCFG_OUTPUT_EVB_MODE_LAST \
6153                 HWRM_FUNC_QCFG_OUTPUT_EVB_MODE_VEPA
6154         uint8_t options;
6155         /*
6156          * This value indicates the PCIE device cache line size.
6157          * The cache line size allows the DMA writes to terminate and
6158          * start at the cache boundary.
6159          */
6160         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_CACHE_LINESIZE_MASK \
6161                 UINT32_C(0x3)
6162         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_CACHE_LINESIZE_SFT          0
6163         /* Cache Line Size 64 bytes */
6164         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_CACHE_LINESIZE_SIZE_64 \
6165                 UINT32_C(0x0)
6166         /* Cache Line Size 128 bytes */
6167         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_CACHE_LINESIZE_SIZE_128 \
6168                 UINT32_C(0x1)
6169         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_CACHE_LINESIZE_LAST \
6170                 HWRM_FUNC_QCFG_OUTPUT_OPTIONS_CACHE_LINESIZE_SIZE_128
6171         /* This value is the virtual link admin state setting. */
6172         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_LINK_ADMIN_STATE_MASK \
6173                 UINT32_C(0xc)
6174         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_LINK_ADMIN_STATE_SFT        2
6175         /* Admin link state is in forced down mode. */
6176         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_LINK_ADMIN_STATE_FORCED_DOWN \
6177                 (UINT32_C(0x0) << 2)
6178         /* Admin link state is in forced up mode. */
6179         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_LINK_ADMIN_STATE_FORCED_UP \
6180                 (UINT32_C(0x1) << 2)
6181         /* Admin link state is in auto mode  - follows the physical link state. */
6182         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_LINK_ADMIN_STATE_AUTO \
6183                 (UINT32_C(0x2) << 2)
6184         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_LINK_ADMIN_STATE_LAST \
6185                 HWRM_FUNC_QCFG_OUTPUT_OPTIONS_LINK_ADMIN_STATE_AUTO
6186         /* Reserved for future. */
6187         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_RSVD_MASK \
6188                 UINT32_C(0xf0)
6189         #define HWRM_FUNC_QCFG_OUTPUT_OPTIONS_RSVD_SFT                    4
6190         /*
6191          * The number of VFs that are allocated to the function.
6192          * This is valid only on the PF with SR-IOV enabled.
6193          * 0xFF... (All Fs) if this command is called on a PF with
6194          * SR-IOV disabled or on a VF.
6195          */
6196         uint16_t        alloc_vfs;
6197         /*
6198          * The number of allocated multicast filters for this
6199          * function on the RX side.
6200          */
6201         uint32_t        alloc_mcast_filters;
6202         /*
6203          * The number of allocated HW ring groups for this
6204          * function.
6205          */
6206         uint32_t        alloc_hw_ring_grps;
6207         /*
6208          * The number of strict priority transmit rings out of
6209          * currently allocated TX rings to the function
6210          * (alloc_tx_rings).
6211          */
6212         uint16_t        alloc_sp_tx_rings;
6213         /*
6214          * The number of statistics contexts
6215          * currently reserved for the function.
6216          */
6217         uint16_t        alloc_stat_ctx;
6218         /*
6219          * This field specifies how many NQs are reserved for the PF.
6220          * Remaining NQs that belong to the PF are available for VFs.
6221          * Once a PF has created VFs, it cannot change how many NQs are
6222          * reserved for itself (since the NQs must be contiguous in HW).
6223          */
6224         uint16_t        alloc_msix;
6225         uint8_t unused_2[5];
6226         /*
6227          * This field is used in Output records to indicate that the output
6228          * is completely written to RAM.  This field should be read as '1'
6229          * to indicate that the output has been completely written.
6230          * When writing a command completion or response to an internal processor,
6231          * the order of writes has to be such that this field is written last.
6232          */
6233         uint8_t valid;
6234 } __attribute__((packed));
6235
6236 /*****************
6237  * hwrm_func_cfg *
6238  *****************/
6239
6240
6241 /* hwrm_func_cfg_input (size:704b/88B) */
6242 struct hwrm_func_cfg_input {
6243         /* The HWRM command request type. */
6244         uint16_t        req_type;
6245         /*
6246          * The completion ring to send the completion event on. This should
6247          * be the NQ ID returned from the `nq_alloc` HWRM command.
6248          */
6249         uint16_t        cmpl_ring;
6250         /*
6251          * The sequence ID is used by the driver for tracking multiple
6252          * commands. This ID is treated as opaque data by the firmware and
6253          * the value is returned in the `hwrm_resp_hdr` upon completion.
6254          */
6255         uint16_t        seq_id;
6256         /*
6257          * The target ID of the command:
6258          * * 0x0-0xFFF8 - The function ID
6259          * * 0xFFF8-0xFFFE - Reserved for internal processors
6260          * * 0xFFFF - HWRM
6261          */
6262         uint16_t        target_id;
6263         /*
6264          * A physical address pointer pointing to a host buffer that the
6265          * command's response data will be written. This can be either a host
6266          * physical address (HPA) or a guest physical address (GPA) and must
6267          * point to a physically contiguous block of memory.
6268          */
6269         uint64_t        resp_addr;
6270         /*
6271          * Function ID of the function that is being
6272          * configured.
6273          * If set to 0xFF... (All Fs), then the the configuration is
6274          * for the requesting function.
6275          */
6276         uint16_t        fid;
6277         /*
6278          * This field specifies how many NQs will be reserved for the PF.
6279          * Remaining NQs that belong to the PF become available for VFs.
6280          * Once a PF has created VFs, it cannot change how many NQs are
6281          * reserved for itself (since the NQs must be contiguous in HW).
6282          */
6283         uint16_t        num_msix;
6284         uint32_t        flags;
6285         /*
6286          * When this bit is '1', the function is disabled with
6287          * source MAC address check.
6288          * This is an anti-spoofing check. If this flag is set,
6289          * then the function shall be configured to disallow
6290          * transmission of frames with the source MAC address that
6291          * is configured for this function.
6292          */
6293         #define HWRM_FUNC_CFG_INPUT_FLAGS_SRC_MAC_ADDR_CHECK_DISABLE \
6294                 UINT32_C(0x1)
6295         /*
6296          * When this bit is '1', the function is enabled with
6297          * source MAC address check.
6298          * This is an anti-spoofing check. If this flag is set,
6299          * then the function shall be configured to allow
6300          * transmission of frames with the source MAC address that
6301          * is configured for this function.
6302          */
6303         #define HWRM_FUNC_CFG_INPUT_FLAGS_SRC_MAC_ADDR_CHECK_ENABLE \
6304                 UINT32_C(0x2)
6305         /* reserved. */
6306         #define HWRM_FUNC_CFG_INPUT_FLAGS_RSVD_MASK \
6307                 UINT32_C(0x1fc)
6308         #define HWRM_FUNC_CFG_INPUT_FLAGS_RSVD_SFT                       2
6309         /*
6310          * Standard TX Ring mode is used for the allocation of TX ring
6311          * and underlying scheduling resources that allow bandwidth
6312          * reservation and limit settings on the queried function.
6313          * If set to 1, then standard TX ring mode is requested to be
6314          * enabled on the function being configured.
6315          */
6316         #define HWRM_FUNC_CFG_INPUT_FLAGS_STD_TX_RING_MODE_ENABLE \
6317                 UINT32_C(0x200)
6318         /*
6319          * Standard TX Ring mode is used for the allocation of TX ring
6320          * and underlying scheduling resources that allow bandwidth
6321          * reservation and limit settings on the queried function.
6322          * If set to 1, then the standard TX ring mode is requested to
6323          * be disabled on the function being configured. In this extended
6324          * TX ring resource mode, the minimum and maximum bandwidth settings
6325          * are not supported to allow the allocation of TX rings to
6326          * span multiple scheduler nodes.
6327          */
6328         #define HWRM_FUNC_CFG_INPUT_FLAGS_STD_TX_RING_MODE_DISABLE \
6329                 UINT32_C(0x400)
6330         /*
6331          * If this bit is set, virtual mac address configured
6332          * in this command will be persistent over warm boot.
6333          */
6334         #define HWRM_FUNC_CFG_INPUT_FLAGS_VIRT_MAC_PERSIST \
6335                 UINT32_C(0x800)
6336         /*
6337          * This bit only applies to the VF. If this bit is set, the statistic
6338          * context counters will not be cleared when the statistic context is freed
6339          * or a function reset is called on VF. This bit will be cleared when the PF
6340          * is unloaded or a function reset is called on the PF.
6341          */
6342         #define HWRM_FUNC_CFG_INPUT_FLAGS_NO_AUTOCLEAR_STATISTIC \
6343                 UINT32_C(0x1000)
6344         /*
6345          * This bit requests that the firmware test to see if all the assets
6346          * requested in this command (i.e. number of TX rings) are available.
6347          * The firmware will return an error if the requested assets are
6348          * not available. The firwmare will NOT reserve the assets if they
6349          * are available.
6350          */
6351         #define HWRM_FUNC_CFG_INPUT_FLAGS_TX_ASSETS_TEST \
6352                 UINT32_C(0x2000)
6353         /*
6354          * This bit requests that the firmware test to see if all the assets
6355          * requested in this command (i.e. number of RX rings) are available.
6356          * The firmware will return an error if the requested assets are
6357          * not available. The firwmare will NOT reserve the assets if they
6358          * are available.
6359          */
6360         #define HWRM_FUNC_CFG_INPUT_FLAGS_RX_ASSETS_TEST \
6361                 UINT32_C(0x4000)
6362         /*
6363          * This bit requests that the firmware test to see if all the assets
6364          * requested in this command (i.e. number of CMPL rings) are available.
6365          * The firmware will return an error if the requested assets are
6366          * not available. The firwmare will NOT reserve the assets if they
6367          * are available.
6368          */
6369         #define HWRM_FUNC_CFG_INPUT_FLAGS_CMPL_ASSETS_TEST \
6370                 UINT32_C(0x8000)
6371         /*
6372          * This bit requests that the firmware test to see if all the assets
6373          * requested in this command (i.e. number of RSS ctx) are available.
6374          * The firmware will return an error if the requested assets are
6375          * not available. The firwmare will NOT reserve the assets if they
6376          * are available.
6377          */
6378         #define HWRM_FUNC_CFG_INPUT_FLAGS_RSSCOS_CTX_ASSETS_TEST \
6379                 UINT32_C(0x10000)
6380         /*
6381          * This bit requests that the firmware test to see if all the assets
6382          * requested in this command (i.e. number of ring groups) are available.
6383          * The firmware will return an error if the requested assets are
6384          * not available. The firwmare will NOT reserve the assets if they
6385          * are available.
6386          */
6387         #define HWRM_FUNC_CFG_INPUT_FLAGS_RING_GRP_ASSETS_TEST \
6388                 UINT32_C(0x20000)
6389         /*
6390          * This bit requests that the firmware test to see if all the assets
6391          * requested in this command (i.e. number of stat ctx) are available.
6392          * The firmware will return an error if the requested assets are
6393          * not available. The firwmare will NOT reserve the assets if they
6394          * are available.
6395          */
6396         #define HWRM_FUNC_CFG_INPUT_FLAGS_STAT_CTX_ASSETS_TEST \
6397                 UINT32_C(0x40000)
6398         /*
6399          * This bit requests that the firmware test to see if all the assets
6400          * requested in this command (i.e. number of VNICs) are available.
6401          * The firmware will return an error if the requested assets are
6402          * not available. The firwmare will NOT reserve the assets if they
6403          * are available.
6404          */
6405         #define HWRM_FUNC_CFG_INPUT_FLAGS_VNIC_ASSETS_TEST \
6406                 UINT32_C(0x80000)
6407         /*
6408          * This bit requests that the firmware test to see if all the assets
6409          * requested in this command (i.e. number of L2 ctx) are available.
6410          * The firmware will return an error if the requested assets are
6411          * not available. The firwmare will NOT reserve the assets if they
6412          * are available.
6413          */
6414         #define HWRM_FUNC_CFG_INPUT_FLAGS_L2_CTX_ASSETS_TEST \
6415                 UINT32_C(0x100000)
6416         /*
6417          * This configuration change can be initiated by a PF driver. This
6418          * configuration request shall be targeted to a VF. From local host
6419          * resident HWRM clients, only the parent PF driver shall be allowed
6420          * to initiate this change on one of its children VFs. If this bit is
6421          * set to 1, then the VF that is being configured is requested to be
6422          * trusted. If this bit is set to 0, then the VF that is being configured
6423          * is requested to be not trusted.
6424          */
6425         #define HWRM_FUNC_CFG_INPUT_FLAGS_TRUSTED_VF_ENABLE \
6426                 UINT32_C(0x200000)
6427         uint32_t        enables;
6428         /*
6429          * This bit must be '1' for the mtu field to be
6430          * configured.
6431          */
6432         #define HWRM_FUNC_CFG_INPUT_ENABLES_MTU \
6433                 UINT32_C(0x1)
6434         /*
6435          * This bit must be '1' for the mru field to be
6436          * configured.
6437          */
6438         #define HWRM_FUNC_CFG_INPUT_ENABLES_MRU \
6439                 UINT32_C(0x2)
6440         /*
6441          * This bit must be '1' for the num_rsscos_ctxs field to be
6442          * configured.
6443          */
6444         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_RSSCOS_CTXS \
6445                 UINT32_C(0x4)
6446         /*
6447          * This bit must be '1' for the num_cmpl_rings field to be
6448          * configured.
6449          */
6450         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_CMPL_RINGS \
6451                 UINT32_C(0x8)
6452         /*
6453          * This bit must be '1' for the num_tx_rings field to be
6454          * configured.
6455          */
6456         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_TX_RINGS \
6457                 UINT32_C(0x10)
6458         /*
6459          * This bit must be '1' for the num_rx_rings field to be
6460          * configured.
6461          */
6462         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_RX_RINGS \
6463                 UINT32_C(0x20)
6464         /*
6465          * This bit must be '1' for the num_l2_ctxs field to be
6466          * configured.
6467          */
6468         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_L2_CTXS \
6469                 UINT32_C(0x40)
6470         /*
6471          * This bit must be '1' for the num_vnics field to be
6472          * configured.
6473          */
6474         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_VNICS \
6475                 UINT32_C(0x80)
6476         /*
6477          * This bit must be '1' for the num_stat_ctxs field to be
6478          * configured.
6479          */
6480         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_STAT_CTXS \
6481                 UINT32_C(0x100)
6482         /*
6483          * This bit must be '1' for the dflt_mac_addr field to be
6484          * configured.
6485          */
6486         #define HWRM_FUNC_CFG_INPUT_ENABLES_DFLT_MAC_ADDR \
6487                 UINT32_C(0x200)
6488         /*
6489          * This bit must be '1' for the dflt_vlan field to be
6490          * configured.
6491          */
6492         #define HWRM_FUNC_CFG_INPUT_ENABLES_DFLT_VLAN \
6493                 UINT32_C(0x400)
6494         /*
6495          * This bit must be '1' for the dflt_ip_addr field to be
6496          * configured.
6497          */
6498         #define HWRM_FUNC_CFG_INPUT_ENABLES_DFLT_IP_ADDR \
6499                 UINT32_C(0x800)
6500         /*
6501          * This bit must be '1' for the min_bw field to be
6502          * configured.
6503          */
6504         #define HWRM_FUNC_CFG_INPUT_ENABLES_MIN_BW \
6505                 UINT32_C(0x1000)
6506         /*
6507          * This bit must be '1' for the max_bw field to be
6508          * configured.
6509          */
6510         #define HWRM_FUNC_CFG_INPUT_ENABLES_MAX_BW \
6511                 UINT32_C(0x2000)
6512         /*
6513          * This bit must be '1' for the async_event_cr field to be
6514          * configured.
6515          */
6516         #define HWRM_FUNC_CFG_INPUT_ENABLES_ASYNC_EVENT_CR \
6517                 UINT32_C(0x4000)
6518         /*
6519          * This bit must be '1' for the vlan_antispoof_mode field to be
6520          * configured.
6521          */
6522         #define HWRM_FUNC_CFG_INPUT_ENABLES_VLAN_ANTISPOOF_MODE \
6523                 UINT32_C(0x8000)
6524         /*
6525          * This bit must be '1' for the allowed_vlan_pris field to be
6526          * configured.
6527          */
6528         #define HWRM_FUNC_CFG_INPUT_ENABLES_ALLOWED_VLAN_PRIS \
6529                 UINT32_C(0x10000)
6530         /*
6531          * This bit must be '1' for the evb_mode field to be
6532          * configured.
6533          */
6534         #define HWRM_FUNC_CFG_INPUT_ENABLES_EVB_MODE \
6535                 UINT32_C(0x20000)
6536         /*
6537          * This bit must be '1' for the num_mcast_filters field to be
6538          * configured.
6539          */
6540         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_MCAST_FILTERS \
6541                 UINT32_C(0x40000)
6542         /*
6543          * This bit must be '1' for the num_hw_ring_grps field to be
6544          * configured.
6545          */
6546         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_HW_RING_GRPS \
6547                 UINT32_C(0x80000)
6548         /*
6549          * This bit must be '1' for the cache_linesize field to be
6550          * configured.
6551          */
6552         #define HWRM_FUNC_CFG_INPUT_ENABLES_CACHE_LINESIZE \
6553                 UINT32_C(0x100000)
6554         /*
6555          * This bit must be '1' for the num_msix field to be
6556          * configured.
6557          */
6558         #define HWRM_FUNC_CFG_INPUT_ENABLES_NUM_MSIX \
6559                 UINT32_C(0x200000)
6560         /*
6561          * This bit must be '1' for the link admin state field to be
6562          * configured.
6563          */
6564         #define HWRM_FUNC_CFG_INPUT_ENABLES_ADMIN_LINK_STATE \
6565                 UINT32_C(0x400000)
6566         /*
6567          * The maximum transmission unit of the function.
6568          * The HWRM should make sure that the mtu of
6569          * the function does not exceed the mtu of the physical
6570          * port that this function is associated with.
6571          *
6572          * In addition to configuring mtu per function, it is
6573          * possible to configure mtu per transmit ring.
6574          * By default, the mtu of each transmit ring associated
6575          * with a function is equal to the mtu of the function.
6576          * The HWRM should make sure that the mtu of each transmit
6577          * ring that is assigned to a function has a valid mtu.
6578          */
6579         uint16_t        mtu;
6580         /*
6581          * The maximum receive unit of the function.
6582          * The HWRM should make sure that the mru of
6583          * the function does not exceed the mru of the physical
6584          * port that this function is associated with.
6585          *
6586          * In addition to configuring mru per function, it is
6587          * possible to configure mru per vnic.
6588          * By default, the mru of each vnic associated
6589          * with a function is equal to the mru of the function.
6590          * The HWRM should make sure that the mru of each vnic
6591          * that is assigned to a function has a valid mru.
6592          */
6593         uint16_t        mru;
6594         /*
6595          * The number of RSS/COS contexts requested for the
6596          * function.
6597          */
6598         uint16_t        num_rsscos_ctxs;
6599         /*
6600          * The number of completion rings requested for the
6601          * function. This does not include the rings allocated
6602          * to any children functions if any.
6603          */
6604         uint16_t        num_cmpl_rings;
6605         /*
6606          * The number of transmit rings requested for the function.
6607          * This does not include the rings allocated to any
6608          * children functions if any.
6609          */
6610         uint16_t        num_tx_rings;
6611         /*
6612          * The number of receive rings requested for the function.
6613          * This does not include the rings allocated
6614          * to any children functions if any.
6615          */
6616         uint16_t        num_rx_rings;
6617         /* The requested number of L2 contexts for the function. */
6618         uint16_t        num_l2_ctxs;
6619         /* The requested number of vnics for the function. */
6620         uint16_t        num_vnics;
6621         /* The requested number of statistic contexts for the function. */
6622         uint16_t        num_stat_ctxs;
6623         /*
6624          * The number of HW ring groups that should
6625          * be reserved for this function.
6626          */
6627         uint16_t        num_hw_ring_grps;
6628         /* The default MAC address for the function being configured. */
6629         uint8_t dflt_mac_addr[6];
6630         /*
6631          * The default VLAN for the function being configured.
6632          * This field's format is same as 802.1Q Tag's
6633          * Tag Control Information (TCI) format that includes both
6634          * Priority Code Point (PCP) and VLAN Identifier (VID).
6635          */
6636         uint16_t        dflt_vlan;
6637         /*
6638          * The default IP address for the function being configured.
6639          * This address is only used in enabling source property check.
6640          */
6641         uint32_t        dflt_ip_addr[4];
6642         /*
6643          * Minimum BW allocated for this function.
6644          * The HWRM will translate this value into byte counter and
6645          * time interval used for the scheduler inside the device.
6646          */
6647         uint32_t        min_bw;
6648         /* The bandwidth value. */
6649         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_MASK \
6650                 UINT32_C(0xfffffff)
6651         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_SFT              0
6652         /* The granularity of the value (bits or bytes). */
6653         #define HWRM_FUNC_CFG_INPUT_MIN_BW_SCALE \
6654                 UINT32_C(0x10000000)
6655         /* Value is in bits. */
6656         #define HWRM_FUNC_CFG_INPUT_MIN_BW_SCALE_BITS \
6657                 (UINT32_C(0x0) << 28)
6658         /* Value is in bytes. */
6659         #define HWRM_FUNC_CFG_INPUT_MIN_BW_SCALE_BYTES \
6660                 (UINT32_C(0x1) << 28)
6661         #define HWRM_FUNC_CFG_INPUT_MIN_BW_SCALE_LAST \
6662                 HWRM_FUNC_CFG_INPUT_MIN_BW_SCALE_BYTES
6663         /* bw_value_unit is 3 b */
6664         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_MASK \
6665                 UINT32_C(0xe0000000)
6666         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_SFT         29
6667         /* Value is in Mb or MB (base 10). */
6668         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_MEGA \
6669                 (UINT32_C(0x0) << 29)
6670         /* Value is in Kb or KB (base 10). */
6671         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_KILO \
6672                 (UINT32_C(0x2) << 29)
6673         /* Value is in bits or bytes. */
6674         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_BASE \
6675                 (UINT32_C(0x4) << 29)
6676         /* Value is in Gb or GB (base 10). */
6677         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_GIGA \
6678                 (UINT32_C(0x6) << 29)
6679         /* Value is in 1/100th of a percentage of total bandwidth. */
6680         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
6681                 (UINT32_C(0x1) << 29)
6682         /* Invalid unit */
6683         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_INVALID \
6684                 (UINT32_C(0x7) << 29)
6685         #define HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_LAST \
6686                 HWRM_FUNC_CFG_INPUT_MIN_BW_BW_VALUE_UNIT_INVALID
6687         /*
6688          * Maximum BW allocated for this function.
6689          * The HWRM will translate this value into byte counter and
6690          * time interval used for the scheduler inside the device.
6691          */
6692         uint32_t        max_bw;
6693         /* The bandwidth value. */
6694         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_MASK \
6695                 UINT32_C(0xfffffff)
6696         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_SFT              0
6697         /* The granularity of the value (bits or bytes). */
6698         #define HWRM_FUNC_CFG_INPUT_MAX_BW_SCALE \
6699                 UINT32_C(0x10000000)
6700         /* Value is in bits. */
6701         #define HWRM_FUNC_CFG_INPUT_MAX_BW_SCALE_BITS \
6702                 (UINT32_C(0x0) << 28)
6703         /* Value is in bytes. */
6704         #define HWRM_FUNC_CFG_INPUT_MAX_BW_SCALE_BYTES \
6705                 (UINT32_C(0x1) << 28)
6706         #define HWRM_FUNC_CFG_INPUT_MAX_BW_SCALE_LAST \
6707                 HWRM_FUNC_CFG_INPUT_MAX_BW_SCALE_BYTES
6708         /* bw_value_unit is 3 b */
6709         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_MASK \
6710                 UINT32_C(0xe0000000)
6711         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_SFT         29
6712         /* Value is in Mb or MB (base 10). */
6713         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_MEGA \
6714                 (UINT32_C(0x0) << 29)
6715         /* Value is in Kb or KB (base 10). */
6716         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_KILO \
6717                 (UINT32_C(0x2) << 29)
6718         /* Value is in bits or bytes. */
6719         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_BASE \
6720                 (UINT32_C(0x4) << 29)
6721         /* Value is in Gb or GB (base 10). */
6722         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_GIGA \
6723                 (UINT32_C(0x6) << 29)
6724         /* Value is in 1/100th of a percentage of total bandwidth. */
6725         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
6726                 (UINT32_C(0x1) << 29)
6727         /* Invalid unit */
6728         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_INVALID \
6729                 (UINT32_C(0x7) << 29)
6730         #define HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_LAST \
6731                 HWRM_FUNC_CFG_INPUT_MAX_BW_BW_VALUE_UNIT_INVALID
6732         /*
6733          * ID of the target completion ring for receiving asynchronous
6734          * event completions. If this field is not valid, then the
6735          * HWRM shall use the default completion ring of the function
6736          * that is being configured as the target completion ring for
6737          * providing any asynchronous event completions for that
6738          * function.
6739          * If this field is valid, then the HWRM shall use the
6740          * completion ring identified by this ID as the target
6741          * completion ring for providing any asynchronous event
6742          * completions for the function that is being configured.
6743          */
6744         uint16_t        async_event_cr;
6745         /* VLAN Anti-spoofing mode. */
6746         uint8_t vlan_antispoof_mode;
6747         /* No VLAN anti-spoofing checks are enabled */
6748         #define HWRM_FUNC_CFG_INPUT_VLAN_ANTISPOOF_MODE_NOCHECK \
6749                 UINT32_C(0x0)
6750         /* Validate VLAN against the configured VLAN(s) */
6751         #define HWRM_FUNC_CFG_INPUT_VLAN_ANTISPOOF_MODE_VALIDATE_VLAN \
6752                 UINT32_C(0x1)
6753         /* Insert VLAN if it does not exist, otherwise discard */
6754         #define HWRM_FUNC_CFG_INPUT_VLAN_ANTISPOOF_MODE_INSERT_IF_VLANDNE \
6755                 UINT32_C(0x2)
6756         /* Insert VLAN if it does not exist, override VLAN if it exists */
6757         #define HWRM_FUNC_CFG_INPUT_VLAN_ANTISPOOF_MODE_INSERT_OR_OVERRIDE_VLAN \
6758                 UINT32_C(0x3)
6759         #define HWRM_FUNC_CFG_INPUT_VLAN_ANTISPOOF_MODE_LAST \
6760                 HWRM_FUNC_CFG_INPUT_VLAN_ANTISPOOF_MODE_INSERT_OR_OVERRIDE_VLAN
6761         /*
6762          * This bit field defines VLAN PRIs that are allowed on
6763          * this function.
6764          * If nth bit is set, then VLAN PRI n is allowed on this
6765          * function.
6766          */
6767         uint8_t allowed_vlan_pris;
6768         /*
6769          * The HWRM shall allow a PF driver to change EVB mode for the
6770          * partition it belongs to.
6771          * The HWRM shall not allow a VF driver to change the EVB mode.
6772          * The HWRM shall take into account the switching of EVB mode
6773          * from one to another and reconfigure hardware resources as
6774          * appropriately.
6775          * The switching from VEB to VEPA mode requires
6776          * the disabling of the loopback traffic. Additionally,
6777          * source knock outs are handled differently in VEB and VEPA
6778          * modes.
6779          */
6780         uint8_t evb_mode;
6781         /* No Edge Virtual Bridging (EVB) */
6782         #define HWRM_FUNC_CFG_INPUT_EVB_MODE_NO_EVB UINT32_C(0x0)
6783         /* Virtual Ethernet Bridge (VEB) */
6784         #define HWRM_FUNC_CFG_INPUT_EVB_MODE_VEB    UINT32_C(0x1)
6785         /* Virtual Ethernet Port Aggregator (VEPA) */
6786         #define HWRM_FUNC_CFG_INPUT_EVB_MODE_VEPA   UINT32_C(0x2)
6787         #define HWRM_FUNC_CFG_INPUT_EVB_MODE_LAST \
6788                 HWRM_FUNC_CFG_INPUT_EVB_MODE_VEPA
6789         uint8_t options;
6790         /*
6791          * This value indicates the PCIE device cache line size.
6792          * The cache line size allows the DMA writes to terminate and
6793          * start at the cache boundary.
6794          */
6795         #define HWRM_FUNC_CFG_INPUT_OPTIONS_CACHE_LINESIZE_MASK \
6796                 UINT32_C(0x3)
6797         #define HWRM_FUNC_CFG_INPUT_OPTIONS_CACHE_LINESIZE_SFT          0
6798         /* Cache Line Size 64 bytes */
6799         #define HWRM_FUNC_CFG_INPUT_OPTIONS_CACHE_LINESIZE_SIZE_64 \
6800                 UINT32_C(0x0)
6801         /* Cache Line Size 128 bytes */
6802         #define HWRM_FUNC_CFG_INPUT_OPTIONS_CACHE_LINESIZE_SIZE_128 \
6803                 UINT32_C(0x1)
6804         #define HWRM_FUNC_CFG_INPUT_OPTIONS_CACHE_LINESIZE_LAST \
6805                 HWRM_FUNC_CFG_INPUT_OPTIONS_CACHE_LINESIZE_SIZE_128
6806         /* This value is the virtual link admin state setting. */
6807         #define HWRM_FUNC_CFG_INPUT_OPTIONS_LINK_ADMIN_STATE_MASK \
6808                 UINT32_C(0xc)
6809         #define HWRM_FUNC_CFG_INPUT_OPTIONS_LINK_ADMIN_STATE_SFT        2
6810         /* Admin state is forced down. */
6811         #define HWRM_FUNC_CFG_INPUT_OPTIONS_LINK_ADMIN_STATE_FORCED_DOWN \
6812                 (UINT32_C(0x0) << 2)
6813         /* Admin state is forced up. */
6814         #define HWRM_FUNC_CFG_INPUT_OPTIONS_LINK_ADMIN_STATE_FORCED_UP \
6815                 (UINT32_C(0x1) << 2)
6816         /* Admin state is in auto mode - is to follow the physical link state. */
6817         #define HWRM_FUNC_CFG_INPUT_OPTIONS_LINK_ADMIN_STATE_AUTO \
6818                 (UINT32_C(0x2) << 2)
6819         #define HWRM_FUNC_CFG_INPUT_OPTIONS_LINK_ADMIN_STATE_LAST \
6820                 HWRM_FUNC_CFG_INPUT_OPTIONS_LINK_ADMIN_STATE_AUTO
6821         /* Reserved for future. */
6822         #define HWRM_FUNC_CFG_INPUT_OPTIONS_RSVD_MASK \
6823                 UINT32_C(0xf0)
6824         #define HWRM_FUNC_CFG_INPUT_OPTIONS_RSVD_SFT                    4
6825         /*
6826          * The number of multicast filters that should
6827          * be reserved for this function on the RX side.
6828          */
6829         uint16_t        num_mcast_filters;
6830 } __attribute__((packed));
6831
6832 /* hwrm_func_cfg_output (size:128b/16B) */
6833 struct hwrm_func_cfg_output {
6834         /* The specific error status for the command. */
6835         uint16_t        error_code;
6836         /* The HWRM command request type. */
6837         uint16_t        req_type;
6838         /* The sequence ID from the original command. */
6839         uint16_t        seq_id;
6840         /* The length of the response data in number of bytes. */
6841         uint16_t        resp_len;
6842         uint8_t unused_0[7];
6843         /*
6844          * This field is used in Output records to indicate that the output
6845          * is completely written to RAM.  This field should be read as '1'
6846          * to indicate that the output has been completely written.
6847          * When writing a command completion or response to an internal processor,
6848          * the order of writes has to be such that this field is written last.
6849          */
6850         uint8_t valid;
6851 } __attribute__((packed));
6852
6853 /********************
6854  * hwrm_func_qstats *
6855  ********************/
6856
6857
6858 /* hwrm_func_qstats_input (size:192b/24B) */
6859 struct hwrm_func_qstats_input {
6860         /* The HWRM command request type. */
6861         uint16_t        req_type;
6862         /*
6863          * The completion ring to send the completion event on. This should
6864          * be the NQ ID returned from the `nq_alloc` HWRM command.
6865          */
6866         uint16_t        cmpl_ring;
6867         /*
6868          * The sequence ID is used by the driver for tracking multiple
6869          * commands. This ID is treated as opaque data by the firmware and
6870          * the value is returned in the `hwrm_resp_hdr` upon completion.
6871          */
6872         uint16_t        seq_id;
6873         /*
6874          * The target ID of the command:
6875          * * 0x0-0xFFF8 - The function ID
6876          * * 0xFFF8-0xFFFE - Reserved for internal processors
6877          * * 0xFFFF - HWRM
6878          */
6879         uint16_t        target_id;
6880         /*
6881          * A physical address pointer pointing to a host buffer that the
6882          * command's response data will be written. This can be either a host
6883          * physical address (HPA) or a guest physical address (GPA) and must
6884          * point to a physically contiguous block of memory.
6885          */
6886         uint64_t        resp_addr;
6887         /*
6888          * Function ID of the function that is being queried.
6889          * 0xFF... (All Fs) if the query is for the requesting
6890          * function.
6891          */
6892         uint16_t        fid;
6893         uint8_t unused_0[6];
6894 } __attribute__((packed));
6895
6896 /* hwrm_func_qstats_output (size:1408b/176B) */
6897 struct hwrm_func_qstats_output {
6898         /* The specific error status for the command. */
6899         uint16_t        error_code;
6900         /* The HWRM command request type. */
6901         uint16_t        req_type;
6902         /* The sequence ID from the original command. */
6903         uint16_t        seq_id;
6904         /* The length of the response data in number of bytes. */
6905         uint16_t        resp_len;
6906         /* Number of transmitted unicast packets on the function. */
6907         uint64_t        tx_ucast_pkts;
6908         /* Number of transmitted multicast packets on the function. */
6909         uint64_t        tx_mcast_pkts;
6910         /* Number of transmitted broadcast packets on the function. */
6911         uint64_t        tx_bcast_pkts;
6912         /*
6913          * Number of transmitted packets that were discarded due to
6914          * internal NIC resource problems.  For transmit, this
6915          * can only happen if TMP is configured to allow dropping
6916          * in HOL blocking conditions, which is not a normal
6917          * configuration.
6918          */
6919         uint64_t        tx_discard_pkts;
6920         /*
6921          * Number of dropped packets on transmit path on the function.
6922          * These are packets that have been marked for drop by
6923          * the TE CFA block or are packets that exceeded the
6924          * transmit MTU limit for the function.
6925          */
6926         uint64_t        tx_drop_pkts;
6927         /* Number of transmitted bytes for unicast traffic on the function. */
6928         uint64_t        tx_ucast_bytes;
6929         /* Number of transmitted bytes for multicast traffic on the function. */
6930         uint64_t        tx_mcast_bytes;
6931         /* Number of transmitted bytes for broadcast traffic on the function. */
6932         uint64_t        tx_bcast_bytes;
6933         /* Number of received unicast packets on the function. */
6934         uint64_t        rx_ucast_pkts;
6935         /* Number of received multicast packets on the function. */
6936         uint64_t        rx_mcast_pkts;
6937         /* Number of received broadcast packets on the function. */
6938         uint64_t        rx_bcast_pkts;
6939         /*
6940          * Number of received packets that were discarded on the function
6941          * due to resource limitations.  This can happen for 3 reasons.
6942          * # The BD used for the packet has a bad format.
6943          * # There were no BDs available in the ring for the packet.
6944          * # There were no BDs available on-chip for the packet.
6945          */
6946         uint64_t        rx_discard_pkts;
6947         /*
6948          * Number of dropped packets on received path on the function.
6949          * These are packets that have been marked for drop by the
6950          * RE CFA.
6951          */
6952         uint64_t        rx_drop_pkts;
6953         /* Number of received bytes for unicast traffic on the function. */
6954         uint64_t        rx_ucast_bytes;
6955         /* Number of received bytes for multicast traffic on the function. */
6956         uint64_t        rx_mcast_bytes;
6957         /* Number of received bytes for broadcast traffic on the function. */
6958         uint64_t        rx_bcast_bytes;
6959         /* Number of aggregated unicast packets on the function. */
6960         uint64_t        rx_agg_pkts;
6961         /* Number of aggregated unicast bytes on the function. */
6962         uint64_t        rx_agg_bytes;
6963         /* Number of aggregation events on the function. */
6964         uint64_t        rx_agg_events;
6965         /* Number of aborted aggregations on the function. */
6966         uint64_t        rx_agg_aborts;
6967         uint8_t unused_0[7];
6968         /*
6969          * This field is used in Output records to indicate that the output
6970          * is completely written to RAM.  This field should be read as '1'
6971          * to indicate that the output has been completely written.
6972          * When writing a command completion or response to an internal processor,
6973          * the order of writes has to be such that this field is written last.
6974          */
6975         uint8_t valid;
6976 } __attribute__((packed));
6977
6978 /***********************
6979  * hwrm_func_clr_stats *
6980  ***********************/
6981
6982
6983 /* hwrm_func_clr_stats_input (size:192b/24B) */
6984 struct hwrm_func_clr_stats_input {
6985         /* The HWRM command request type. */
6986         uint16_t        req_type;
6987         /*
6988          * The completion ring to send the completion event on. This should
6989          * be the NQ ID returned from the `nq_alloc` HWRM command.
6990          */
6991         uint16_t        cmpl_ring;
6992         /*
6993          * The sequence ID is used by the driver for tracking multiple
6994          * commands. This ID is treated as opaque data by the firmware and
6995          * the value is returned in the `hwrm_resp_hdr` upon completion.
6996          */
6997         uint16_t        seq_id;
6998         /*
6999          * The target ID of the command:
7000          * * 0x0-0xFFF8 - The function ID
7001          * * 0xFFF8-0xFFFE - Reserved for internal processors
7002          * * 0xFFFF - HWRM
7003          */
7004         uint16_t        target_id;
7005         /*
7006          * A physical address pointer pointing to a host buffer that the
7007          * command's response data will be written. This can be either a host
7008          * physical address (HPA) or a guest physical address (GPA) and must
7009          * point to a physically contiguous block of memory.
7010          */
7011         uint64_t        resp_addr;
7012         /*
7013          * Function ID of the function.
7014          * 0xFF... (All Fs) if the query is for the requesting
7015          * function.
7016          */
7017         uint16_t        fid;
7018         uint8_t unused_0[6];
7019 } __attribute__((packed));
7020
7021 /* hwrm_func_clr_stats_output (size:128b/16B) */
7022 struct hwrm_func_clr_stats_output {
7023         /* The specific error status for the command. */
7024         uint16_t        error_code;
7025         /* The HWRM command request type. */
7026         uint16_t        req_type;
7027         /* The sequence ID from the original command. */
7028         uint16_t        seq_id;
7029         /* The length of the response data in number of bytes. */
7030         uint16_t        resp_len;
7031         uint8_t unused_0[7];
7032         /*
7033          * This field is used in Output records to indicate that the output
7034          * is completely written to RAM.  This field should be read as '1'
7035          * to indicate that the output has been completely written.
7036          * When writing a command completion or response to an internal processor,
7037          * the order of writes has to be such that this field is written last.
7038          */
7039         uint8_t valid;
7040 } __attribute__((packed));
7041
7042 /**************************
7043  * hwrm_func_vf_resc_free *
7044  **************************/
7045
7046
7047 /* hwrm_func_vf_resc_free_input (size:192b/24B) */
7048 struct hwrm_func_vf_resc_free_input {
7049         /* The HWRM command request type. */
7050         uint16_t        req_type;
7051         /*
7052          * The completion ring to send the completion event on. This should
7053          * be the NQ ID returned from the `nq_alloc` HWRM command.
7054          */
7055         uint16_t        cmpl_ring;
7056         /*
7057          * The sequence ID is used by the driver for tracking multiple
7058          * commands. This ID is treated as opaque data by the firmware and
7059          * the value is returned in the `hwrm_resp_hdr` upon completion.
7060          */
7061         uint16_t        seq_id;
7062         /*
7063          * The target ID of the command:
7064          * * 0x0-0xFFF8 - The function ID
7065          * * 0xFFF8-0xFFFE - Reserved for internal processors
7066          * * 0xFFFF - HWRM
7067          */
7068         uint16_t        target_id;
7069         /*
7070          * A physical address pointer pointing to a host buffer that the
7071          * command's response data will be written. This can be either a host
7072          * physical address (HPA) or a guest physical address (GPA) and must
7073          * point to a physically contiguous block of memory.
7074          */
7075         uint64_t        resp_addr;
7076         /*
7077          * This value is used to identify a Virtual Function (VF).
7078          * The scope of VF ID is local within a PF.
7079          */
7080         uint16_t        vf_id;
7081         uint8_t unused_0[6];
7082 } __attribute__((packed));
7083
7084 /* hwrm_func_vf_resc_free_output (size:128b/16B) */
7085 struct hwrm_func_vf_resc_free_output {
7086         /* The specific error status for the command. */
7087         uint16_t        error_code;
7088         /* The HWRM command request type. */
7089         uint16_t        req_type;
7090         /* The sequence ID from the original command. */
7091         uint16_t        seq_id;
7092         /* The length of the response data in number of bytes. */
7093         uint16_t        resp_len;
7094         uint8_t unused_0[7];
7095         /*
7096          * This field is used in Output records to indicate that the output
7097          * is completely written to RAM.  This field should be read as '1'
7098          * to indicate that the output has been completely written.
7099          * When writing a command completion or response to an internal processor,
7100          * the order of writes has to be such that this field is written last.
7101          */
7102         uint8_t valid;
7103 } __attribute__((packed));
7104
7105 /**********************
7106  * hwrm_func_drv_rgtr *
7107  **********************/
7108
7109
7110 /* hwrm_func_drv_rgtr_input (size:896b/112B) */
7111 struct hwrm_func_drv_rgtr_input {
7112         /* The HWRM command request type. */
7113         uint16_t        req_type;
7114         /*
7115          * The completion ring to send the completion event on. This should
7116          * be the NQ ID returned from the `nq_alloc` HWRM command.
7117          */
7118         uint16_t        cmpl_ring;
7119         /*
7120          * The sequence ID is used by the driver for tracking multiple
7121          * commands. This ID is treated as opaque data by the firmware and
7122          * the value is returned in the `hwrm_resp_hdr` upon completion.
7123          */
7124         uint16_t        seq_id;
7125         /*
7126          * The target ID of the command:
7127          * * 0x0-0xFFF8 - The function ID
7128          * * 0xFFF8-0xFFFE - Reserved for internal processors
7129          * * 0xFFFF - HWRM
7130          */
7131         uint16_t        target_id;
7132         /*
7133          * A physical address pointer pointing to a host buffer that the
7134          * command's response data will be written. This can be either a host
7135          * physical address (HPA) or a guest physical address (GPA) and must
7136          * point to a physically contiguous block of memory.
7137          */
7138         uint64_t        resp_addr;
7139         uint32_t        flags;
7140         /*
7141          * When this bit is '1', the function driver is requesting
7142          * all requests from its children VF drivers to be
7143          * forwarded to itself.
7144          * This flag can only be set by the PF driver.
7145          * If a VF driver sets this flag, it should be ignored
7146          * by the HWRM.
7147          */
7148         #define HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_FWD_ALL_MODE \
7149                 UINT32_C(0x1)
7150         /*
7151          * When this bit is '1', the function is requesting none of
7152          * the requests from its children VF drivers to be
7153          * forwarded to itself.
7154          * This flag can only be set by the PF driver.
7155          * If a VF driver sets this flag, it should be ignored
7156          * by the HWRM.
7157          */
7158         #define HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_FWD_NONE_MODE \
7159                 UINT32_C(0x2)
7160         /*
7161          * When this bit is '1', then ver_maj_8b, ver_min_8b, ver_upd_8b
7162          * fields shall be ignored and ver_maj, ver_min, ver_upd
7163          * and ver_patch shall be used for the driver version information.
7164          * When this bit is '0', then ver_maj_8b, ver_min_8b, ver_upd_8b
7165          * fields shall be used for the driver version information and
7166          * ver_maj, ver_min, ver_upd and ver_patch shall be ignored.
7167          */
7168         #define HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_16BIT_VER_MODE \
7169                 UINT32_C(0x4)
7170         /*
7171          * When this bit is '1', the function is indicating support of
7172          * 64bit flow handle.  The firmware that only supports 64bit flow
7173          * handle should check this bit before allowing processing of
7174          * HWRM_CFA_FLOW_XXX commands from the requesting function as firmware
7175          * with 64bit flow handle support can only be compatible with drivers
7176          * that support 64bit flow handle. The legacy drivers that don't support
7177          * 64bit flow handle won't be able to use HWRM_CFA_FLOW_XXX commands when
7178          * running with new firmware that only supports 64bit flow handle. The new
7179          * firmware support 64bit flow handle returns HWRM_ERR_CODE_CMD_NOT_SUPPORTED
7180          * status to the legacy driver when encounters these commands.
7181          */
7182         #define HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_FLOW_HANDLE_64BIT_MODE \
7183                 UINT32_C(0x8)
7184         uint32_t        enables;
7185         /*
7186          * This bit must be '1' for the os_type field to be
7187          * configured.
7188          */
7189         #define HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_OS_TYPE \
7190                 UINT32_C(0x1)
7191         /*
7192          * This bit must be '1' for the ver field to be
7193          * configured.
7194          */
7195         #define HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_VER \
7196                 UINT32_C(0x2)
7197         /*
7198          * This bit must be '1' for the timestamp field to be
7199          * configured.
7200          */
7201         #define HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_TIMESTAMP \
7202                 UINT32_C(0x4)
7203         /*
7204          * This bit must be '1' for the vf_req_fwd field to be
7205          * configured.
7206          */
7207         #define HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_VF_REQ_FWD \
7208                 UINT32_C(0x8)
7209         /*
7210          * This bit must be '1' for the async_event_fwd field to be
7211          * configured.
7212          */
7213         #define HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_ASYNC_EVENT_FWD \
7214                 UINT32_C(0x10)
7215         /* This value indicates the type of OS.  The values are based on CIM_OperatingSystem.mof file as published by the DMTF. */
7216         uint16_t        os_type;
7217         /* Unknown */
7218         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_UNKNOWN   UINT32_C(0x0)
7219         /* Other OS not listed below. */
7220         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_OTHER     UINT32_C(0x1)
7221         /* MSDOS OS. */
7222         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_MSDOS     UINT32_C(0xe)
7223         /* Windows OS. */
7224         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_WINDOWS   UINT32_C(0x12)
7225         /* Solaris OS. */
7226         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_SOLARIS   UINT32_C(0x1d)
7227         /* Linux OS. */
7228         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_LINUX     UINT32_C(0x24)
7229         /* FreeBSD OS. */
7230         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_FREEBSD   UINT32_C(0x2a)
7231         /* VMware ESXi OS. */
7232         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_ESXI      UINT32_C(0x68)
7233         /* Microsoft Windows 8 64-bit OS. */
7234         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_WIN864    UINT32_C(0x73)
7235         /* Microsoft Windows Server 2012 R2 OS. */
7236         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_WIN2012R2 UINT32_C(0x74)
7237         /* UEFI driver. */
7238         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_UEFI      UINT32_C(0x8000)
7239         #define HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_LAST \
7240                 HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_UEFI
7241         /* This is the 8bit major version of the driver. */
7242         uint8_t ver_maj_8b;
7243         /* This is the 8bit minor version of the driver. */
7244         uint8_t ver_min_8b;
7245         /* This is the 8bit update version of the driver. */
7246         uint8_t ver_upd_8b;
7247         uint8_t unused_0[3];
7248         /*
7249          * This is a 32-bit timestamp provided by the driver for
7250          * keep alive.
7251          * The timestamp is in multiples of 1ms.
7252          */
7253         uint32_t        timestamp;
7254         uint8_t unused_1[4];
7255         /*
7256          * This is a 256-bit bit mask provided by the PF driver for
7257          * letting the HWRM know what commands issued by the VF driver
7258          * to the HWRM should be forwarded to the PF driver.
7259          * Nth bit refers to the Nth req_type.
7260          *
7261          * Setting Nth bit to 1 indicates that requests from the
7262          * VF driver with req_type equal to N shall be forwarded to
7263          * the parent PF driver.
7264          *
7265          * This field is not valid for the VF driver.
7266          */
7267         uint32_t        vf_req_fwd[8];
7268         /*
7269          * This is a 256-bit bit mask provided by the function driver
7270          * (PF or VF driver) to indicate the list of asynchronous event
7271          * completions to be forwarded.
7272          *
7273          * Nth bit refers to the Nth event_id.
7274          *
7275          * Setting Nth bit to 1 by the function driver shall result in
7276          * the HWRM forwarding asynchronous event completion with
7277          * event_id equal to N.
7278          *
7279          * If all bits are set to 0 (value of 0), then the HWRM shall
7280          * not forward any asynchronous event completion to this
7281          * function driver.
7282          */
7283         uint32_t        async_event_fwd[8];
7284         /* This is the 16bit major version of the driver. */
7285         uint16_t        ver_maj;
7286         /* This is the 16bit minor version of the driver. */
7287         uint16_t        ver_min;
7288         /* This is the 16bit update version of the driver. */
7289         uint16_t        ver_upd;
7290         /* This is the 16bit patch version of the driver. */
7291         uint16_t        ver_patch;
7292 } __attribute__((packed));
7293
7294 /* hwrm_func_drv_rgtr_output (size:128b/16B) */
7295 struct hwrm_func_drv_rgtr_output {
7296         /* The specific error status for the command. */
7297         uint16_t        error_code;
7298         /* The HWRM command request type. */
7299         uint16_t        req_type;
7300         /* The sequence ID from the original command. */
7301         uint16_t        seq_id;
7302         /* The length of the response data in number of bytes. */
7303         uint16_t        resp_len;
7304         uint32_t        flags;
7305         /*
7306          * When this bit is '1', it indicates that the
7307          * HWRM_FUNC_DRV_IF_CHANGE call is supported.
7308          */
7309         #define HWRM_FUNC_DRV_RGTR_OUTPUT_FLAGS_IF_CHANGE_SUPPORTED \
7310                 UINT32_C(0x1)
7311         uint8_t unused_0[3];
7312         /*
7313          * This field is used in Output records to indicate that the output
7314          * is completely written to RAM.  This field should be read as '1'
7315          * to indicate that the output has been completely written.
7316          * When writing a command completion or response to an internal processor,
7317          * the order of writes has to be such that this field is written last.
7318          */
7319         uint8_t valid;
7320 } __attribute__((packed));
7321
7322 /************************
7323  * hwrm_func_drv_unrgtr *
7324  ************************/
7325
7326
7327 /* hwrm_func_drv_unrgtr_input (size:192b/24B) */
7328 struct hwrm_func_drv_unrgtr_input {
7329         /* The HWRM command request type. */
7330         uint16_t        req_type;
7331         /*
7332          * The completion ring to send the completion event on. This should
7333          * be the NQ ID returned from the `nq_alloc` HWRM command.
7334          */
7335         uint16_t        cmpl_ring;
7336         /*
7337          * The sequence ID is used by the driver for tracking multiple
7338          * commands. This ID is treated as opaque data by the firmware and
7339          * the value is returned in the `hwrm_resp_hdr` upon completion.
7340          */
7341         uint16_t        seq_id;
7342         /*
7343          * The target ID of the command:
7344          * * 0x0-0xFFF8 - The function ID
7345          * * 0xFFF8-0xFFFE - Reserved for internal processors
7346          * * 0xFFFF - HWRM
7347          */
7348         uint16_t        target_id;
7349         /*
7350          * A physical address pointer pointing to a host buffer that the
7351          * command's response data will be written. This can be either a host
7352          * physical address (HPA) or a guest physical address (GPA) and must
7353          * point to a physically contiguous block of memory.
7354          */
7355         uint64_t        resp_addr;
7356         uint32_t        flags;
7357         /*
7358          * When this bit is '1', the function driver is notifying
7359          * the HWRM to prepare for the shutdown.
7360          */
7361         #define HWRM_FUNC_DRV_UNRGTR_INPUT_FLAGS_PREPARE_FOR_SHUTDOWN \
7362                 UINT32_C(0x1)
7363         uint8_t unused_0[4];
7364 } __attribute__((packed));
7365
7366 /* hwrm_func_drv_unrgtr_output (size:128b/16B) */
7367 struct hwrm_func_drv_unrgtr_output {
7368         /* The specific error status for the command. */
7369         uint16_t        error_code;
7370         /* The HWRM command request type. */
7371         uint16_t        req_type;
7372         /* The sequence ID from the original command. */
7373         uint16_t        seq_id;
7374         /* The length of the response data in number of bytes. */
7375         uint16_t        resp_len;
7376         uint8_t unused_0[7];
7377         /*
7378          * This field is used in Output records to indicate that the output
7379          * is completely written to RAM.  This field should be read as '1'
7380          * to indicate that the output has been completely written.
7381          * When writing a command completion or response to an internal processor,
7382          * the order of writes has to be such that this field is written last.
7383          */
7384         uint8_t valid;
7385 } __attribute__((packed));
7386
7387 /**********************
7388  * hwrm_func_buf_rgtr *
7389  **********************/
7390
7391
7392 /* hwrm_func_buf_rgtr_input (size:1024b/128B) */
7393 struct hwrm_func_buf_rgtr_input {
7394         /* The HWRM command request type. */
7395         uint16_t        req_type;
7396         /*
7397          * The completion ring to send the completion event on. This should
7398          * be the NQ ID returned from the `nq_alloc` HWRM command.
7399          */
7400         uint16_t        cmpl_ring;
7401         /*
7402          * The sequence ID is used by the driver for tracking multiple
7403          * commands. This ID is treated as opaque data by the firmware and
7404          * the value is returned in the `hwrm_resp_hdr` upon completion.
7405          */
7406         uint16_t        seq_id;
7407         /*
7408          * The target ID of the command:
7409          * * 0x0-0xFFF8 - The function ID
7410          * * 0xFFF8-0xFFFE - Reserved for internal processors
7411          * * 0xFFFF - HWRM
7412          */
7413         uint16_t        target_id;
7414         /*
7415          * A physical address pointer pointing to a host buffer that the
7416          * command's response data will be written. This can be either a host
7417          * physical address (HPA) or a guest physical address (GPA) and must
7418          * point to a physically contiguous block of memory.
7419          */
7420         uint64_t        resp_addr;
7421         uint32_t        enables;
7422         /*
7423          * This bit must be '1' for the vf_id field to be
7424          * configured.
7425          */
7426         #define HWRM_FUNC_BUF_RGTR_INPUT_ENABLES_VF_ID            UINT32_C(0x1)
7427         /*
7428          * This bit must be '1' for the err_buf_addr field to be
7429          * configured.
7430          */
7431         #define HWRM_FUNC_BUF_RGTR_INPUT_ENABLES_ERR_BUF_ADDR     UINT32_C(0x2)
7432         /*
7433          * This value is used to identify a Virtual Function (VF).
7434          * The scope of VF ID is local within a PF.
7435          */
7436         uint16_t        vf_id;
7437         /*
7438          * This field represents the number of pages used for request
7439          * buffer(s).
7440          */
7441         uint16_t        req_buf_num_pages;
7442         /*
7443          * This field represents the page size used for request
7444          * buffer(s).
7445          */
7446         uint16_t        req_buf_page_size;
7447         /* 16 bytes */
7448         #define HWRM_FUNC_BUF_RGTR_INPUT_REQ_BUF_PAGE_SIZE_16B UINT32_C(0x4)
7449         /* 4 Kbytes */
7450         #define HWRM_FUNC_BUF_RGTR_INPUT_REQ_BUF_PAGE_SIZE_4K  UINT32_C(0xc)
7451         /* 8 Kbytes */
7452         #define HWRM_FUNC_BUF_RGTR_INPUT_REQ_BUF_PAGE_SIZE_8K  UINT32_C(0xd)
7453         /* 64 Kbytes */
7454         #define HWRM_FUNC_BUF_RGTR_INPUT_REQ_BUF_PAGE_SIZE_64K UINT32_C(0x10)
7455         /* 2 Mbytes */
7456         #define HWRM_FUNC_BUF_RGTR_INPUT_REQ_BUF_PAGE_SIZE_2M  UINT32_C(0x15)
7457         /* 4 Mbytes */
7458         #define HWRM_FUNC_BUF_RGTR_INPUT_REQ_BUF_PAGE_SIZE_4M  UINT32_C(0x16)
7459         /* 1 Gbytes */
7460         #define HWRM_FUNC_BUF_RGTR_INPUT_REQ_BUF_PAGE_SIZE_1G  UINT32_C(0x1e)
7461         #define HWRM_FUNC_BUF_RGTR_INPUT_REQ_BUF_PAGE_SIZE_LAST \
7462                 HWRM_FUNC_BUF_RGTR_INPUT_REQ_BUF_PAGE_SIZE_1G
7463         /* The length of the request buffer per VF in bytes. */
7464         uint16_t        req_buf_len;
7465         /* The length of the response buffer in bytes. */
7466         uint16_t        resp_buf_len;
7467         uint8_t unused_0[2];
7468         /* This field represents the page address of page #0. */
7469         uint64_t        req_buf_page_addr0;
7470         /* This field represents the page address of page #1. */
7471         uint64_t        req_buf_page_addr1;
7472         /* This field represents the page address of page #2. */
7473         uint64_t        req_buf_page_addr2;
7474         /* This field represents the page address of page #3. */
7475         uint64_t        req_buf_page_addr3;
7476         /* This field represents the page address of page #4. */
7477         uint64_t        req_buf_page_addr4;
7478         /* This field represents the page address of page #5. */
7479         uint64_t        req_buf_page_addr5;
7480         /* This field represents the page address of page #6. */
7481         uint64_t        req_buf_page_addr6;
7482         /* This field represents the page address of page #7. */
7483         uint64_t        req_buf_page_addr7;
7484         /* This field represents the page address of page #8. */
7485         uint64_t        req_buf_page_addr8;
7486         /* This field represents the page address of page #9. */
7487         uint64_t        req_buf_page_addr9;
7488         /*
7489          * This field is used to receive the error reporting from
7490          * the chipset. Only applicable for PFs.
7491          */
7492         uint64_t        error_buf_addr;
7493         /*
7494          * This field is used to receive the response forwarded by the
7495          * HWRM.
7496          */
7497         uint64_t        resp_buf_addr;
7498 } __attribute__((packed));
7499
7500 /* hwrm_func_buf_rgtr_output (size:128b/16B) */
7501 struct hwrm_func_buf_rgtr_output {
7502         /* The specific error status for the command. */
7503         uint16_t        error_code;
7504         /* The HWRM command request type. */
7505         uint16_t        req_type;
7506         /* The sequence ID from the original command. */
7507         uint16_t        seq_id;
7508         /* The length of the response data in number of bytes. */
7509         uint16_t        resp_len;
7510         uint8_t unused_0[7];
7511         /*
7512          * This field is used in Output records to indicate that the output
7513          * is completely written to RAM.  This field should be read as '1'
7514          * to indicate that the output has been completely written.
7515          * When writing a command completion or response to an internal processor,
7516          * the order of writes has to be such that this field is written last.
7517          */
7518         uint8_t valid;
7519 } __attribute__((packed));
7520
7521 /************************
7522  * hwrm_func_buf_unrgtr *
7523  ************************/
7524
7525
7526 /* hwrm_func_buf_unrgtr_input (size:192b/24B) */
7527 struct hwrm_func_buf_unrgtr_input {
7528         /* The HWRM command request type. */
7529         uint16_t        req_type;
7530         /*
7531          * The completion ring to send the completion event on. This should
7532          * be the NQ ID returned from the `nq_alloc` HWRM command.
7533          */
7534         uint16_t        cmpl_ring;
7535         /*
7536          * The sequence ID is used by the driver for tracking multiple
7537          * commands. This ID is treated as opaque data by the firmware and
7538          * the value is returned in the `hwrm_resp_hdr` upon completion.
7539          */
7540         uint16_t        seq_id;
7541         /*
7542          * The target ID of the command:
7543          * * 0x0-0xFFF8 - The function ID
7544          * * 0xFFF8-0xFFFE - Reserved for internal processors
7545          * * 0xFFFF - HWRM
7546          */
7547         uint16_t        target_id;
7548         /*
7549          * A physical address pointer pointing to a host buffer that the
7550          * command's response data will be written. This can be either a host
7551          * physical address (HPA) or a guest physical address (GPA) and must
7552          * point to a physically contiguous block of memory.
7553          */
7554         uint64_t        resp_addr;
7555         uint32_t        enables;
7556         /*
7557          * This bit must be '1' for the vf_id field to be
7558          * configured.
7559          */
7560         #define HWRM_FUNC_BUF_UNRGTR_INPUT_ENABLES_VF_ID     UINT32_C(0x1)
7561         /*
7562          * This value is used to identify a Virtual Function (VF).
7563          * The scope of VF ID is local within a PF.
7564          */
7565         uint16_t        vf_id;
7566         uint8_t unused_0[2];
7567 } __attribute__((packed));
7568
7569 /* hwrm_func_buf_unrgtr_output (size:128b/16B) */
7570 struct hwrm_func_buf_unrgtr_output {
7571         /* The specific error status for the command. */
7572         uint16_t        error_code;
7573         /* The HWRM command request type. */
7574         uint16_t        req_type;
7575         /* The sequence ID from the original command. */
7576         uint16_t        seq_id;
7577         /* The length of the response data in number of bytes. */
7578         uint16_t        resp_len;
7579         uint8_t unused_0[7];
7580         /*
7581          * This field is used in Output records to indicate that the output
7582          * is completely written to RAM.  This field should be read as '1'
7583          * to indicate that the output has been completely written.
7584          * When writing a command completion or response to an internal processor,
7585          * the order of writes has to be such that this field is written last.
7586          */
7587         uint8_t valid;
7588 } __attribute__((packed));
7589
7590 /**********************
7591  * hwrm_func_drv_qver *
7592  **********************/
7593
7594
7595 /* hwrm_func_drv_qver_input (size:192b/24B) */
7596 struct hwrm_func_drv_qver_input {
7597         /* The HWRM command request type. */
7598         uint16_t        req_type;
7599         /*
7600          * The completion ring to send the completion event on. This should
7601          * be the NQ ID returned from the `nq_alloc` HWRM command.
7602          */
7603         uint16_t        cmpl_ring;
7604         /*
7605          * The sequence ID is used by the driver for tracking multiple
7606          * commands. This ID is treated as opaque data by the firmware and
7607          * the value is returned in the `hwrm_resp_hdr` upon completion.
7608          */
7609         uint16_t        seq_id;
7610         /*
7611          * The target ID of the command:
7612          * * 0x0-0xFFF8 - The function ID
7613          * * 0xFFF8-0xFFFE - Reserved for internal processors
7614          * * 0xFFFF - HWRM
7615          */
7616         uint16_t        target_id;
7617         /*
7618          * A physical address pointer pointing to a host buffer that the
7619          * command's response data will be written. This can be either a host
7620          * physical address (HPA) or a guest physical address (GPA) and must
7621          * point to a physically contiguous block of memory.
7622          */
7623         uint64_t        resp_addr;
7624         /* Reserved for future use. */
7625         uint32_t        reserved;
7626         /*
7627          * Function ID of the function that is being queried.
7628          * 0xFF... (All Fs) if the query is for the requesting
7629          * function.
7630          */
7631         uint16_t        fid;
7632         uint8_t unused_0[2];
7633 } __attribute__((packed));
7634
7635 /* hwrm_func_drv_qver_output (size:256b/32B) */
7636 struct hwrm_func_drv_qver_output {
7637         /* The specific error status for the command. */
7638         uint16_t        error_code;
7639         /* The HWRM command request type. */
7640         uint16_t        req_type;
7641         /* The sequence ID from the original command. */
7642         uint16_t        seq_id;
7643         /* The length of the response data in number of bytes. */
7644         uint16_t        resp_len;
7645         /* This value indicates the type of OS.  The values are based on CIM_OperatingSystem.mof file as published by the DMTF. */
7646         uint16_t        os_type;
7647         /* Unknown */
7648         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_UNKNOWN   UINT32_C(0x0)
7649         /* Other OS not listed below. */
7650         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_OTHER     UINT32_C(0x1)
7651         /* MSDOS OS. */
7652         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_MSDOS     UINT32_C(0xe)
7653         /* Windows OS. */
7654         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_WINDOWS   UINT32_C(0x12)
7655         /* Solaris OS. */
7656         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_SOLARIS   UINT32_C(0x1d)
7657         /* Linux OS. */
7658         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_LINUX     UINT32_C(0x24)
7659         /* FreeBSD OS. */
7660         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_FREEBSD   UINT32_C(0x2a)
7661         /* VMware ESXi OS. */
7662         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_ESXI      UINT32_C(0x68)
7663         /* Microsoft Windows 8 64-bit OS. */
7664         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_WIN864    UINT32_C(0x73)
7665         /* Microsoft Windows Server 2012 R2 OS. */
7666         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_WIN2012R2 UINT32_C(0x74)
7667         /* UEFI driver. */
7668         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_UEFI      UINT32_C(0x8000)
7669         #define HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_LAST \
7670                 HWRM_FUNC_DRV_QVER_OUTPUT_OS_TYPE_UEFI
7671         /* This is the 8bit major version of the driver. */
7672         uint8_t ver_maj_8b;
7673         /* This is the 8bit minor version of the driver. */
7674         uint8_t ver_min_8b;
7675         /* This is the 8bit update version of the driver. */
7676         uint8_t ver_upd_8b;
7677         uint8_t unused_0[3];
7678         /* This is the 16bit major version of the driver. */
7679         uint16_t        ver_maj;
7680         /* This is the 16bit minor version of the driver. */
7681         uint16_t        ver_min;
7682         /* This is the 16bit update version of the driver. */
7683         uint16_t        ver_upd;
7684         /* This is the 16bit patch version of the driver. */
7685         uint16_t        ver_patch;
7686         uint8_t unused_1[7];
7687         /*
7688          * This field is used in Output records to indicate that the output
7689          * is completely written to RAM.  This field should be read as '1'
7690          * to indicate that the output has been completely written.
7691          * When writing a command completion or response to an internal processor,
7692          * the order of writes has to be such that this field is written last.
7693          */
7694         uint8_t valid;
7695 } __attribute__((packed));
7696
7697 /****************************
7698  * hwrm_func_resource_qcaps *
7699  ****************************/
7700
7701
7702 /* hwrm_func_resource_qcaps_input (size:192b/24B) */
7703 struct hwrm_func_resource_qcaps_input {
7704         /* The HWRM command request type. */
7705         uint16_t        req_type;
7706         /*
7707          * The completion ring to send the completion event on. This should
7708          * be the NQ ID returned from the `nq_alloc` HWRM command.
7709          */
7710         uint16_t        cmpl_ring;
7711         /*
7712          * The sequence ID is used by the driver for tracking multiple
7713          * commands. This ID is treated as opaque data by the firmware and
7714          * the value is returned in the `hwrm_resp_hdr` upon completion.
7715          */
7716         uint16_t        seq_id;
7717         /*
7718          * The target ID of the command:
7719          * * 0x0-0xFFF8 - The function ID
7720          * * 0xFFF8-0xFFFE - Reserved for internal processors
7721          * * 0xFFFF - HWRM
7722          */
7723         uint16_t        target_id;
7724         /*
7725          * A physical address pointer pointing to a host buffer that the
7726          * command's response data will be written. This can be either a host
7727          * physical address (HPA) or a guest physical address (GPA) and must
7728          * point to a physically contiguous block of memory.
7729          */
7730         uint64_t        resp_addr;
7731         /*
7732          * Function ID of the function that is being queried.
7733          * 0xFF... (All Fs) if the query is for the requesting
7734          * function.
7735          */
7736         uint16_t        fid;
7737         uint8_t unused_0[6];
7738 } __attribute__((packed));
7739
7740 /* hwrm_func_resource_qcaps_output (size:448b/56B) */
7741 struct hwrm_func_resource_qcaps_output {
7742         /* The specific error status for the command. */
7743         uint16_t        error_code;
7744         /* The HWRM command request type. */
7745         uint16_t        req_type;
7746         /* The sequence ID from the original command. */
7747         uint16_t        seq_id;
7748         /* The length of the response data in number of bytes. */
7749         uint16_t        resp_len;
7750         /* Maximum guaranteed number of VFs supported by PF. Not applicable for VFs. */
7751         uint16_t        max_vfs;
7752         /* Maximum guaranteed number of MSI-X vectors supported by function */
7753         uint16_t        max_msix;
7754         /* Hint of strategy to be used by PF driver to reserve resources for its VF */
7755         uint16_t        vf_reservation_strategy;
7756         /* The PF driver should evenly divide its remaining resources among all VFs. */
7757         #define HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESERVATION_STRATEGY_MAXIMAL \
7758                 UINT32_C(0x0)
7759         /* The PF driver should only reserve minimal resources for each VF. */
7760         #define HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESERVATION_STRATEGY_MINIMAL \
7761                 UINT32_C(0x1)
7762         /*
7763          * The PF driver should not reserve any resources for each VF until the
7764          * the VF interface is brought up.
7765          */
7766         #define HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESERVATION_STRATEGY_MINIMAL_STATIC \
7767                 UINT32_C(0x2)
7768         #define HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESERVATION_STRATEGY_LAST \
7769                 HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESERVATION_STRATEGY_MINIMAL_STATIC
7770         /* Minimum guaranteed number of RSS/COS contexts */
7771         uint16_t        min_rsscos_ctx;
7772         /* Maximum non-guaranteed number of RSS/COS contexts */
7773         uint16_t        max_rsscos_ctx;
7774         /* Minimum guaranteed number of completion rings */
7775         uint16_t        min_cmpl_rings;
7776         /* Maximum non-guaranteed number of completion rings */
7777         uint16_t        max_cmpl_rings;
7778         /* Minimum guaranteed number of transmit rings */
7779         uint16_t        min_tx_rings;
7780         /* Maximum non-guaranteed number of transmit rings */
7781         uint16_t        max_tx_rings;
7782         /* Minimum guaranteed number of receive rings */
7783         uint16_t        min_rx_rings;
7784         /* Maximum non-guaranteed number of receive rings */
7785         uint16_t        max_rx_rings;
7786         /* Minimum guaranteed number of L2 contexts */
7787         uint16_t        min_l2_ctxs;
7788         /* Maximum non-guaranteed number of L2 contexts */
7789         uint16_t        max_l2_ctxs;
7790         /* Minimum guaranteed number of VNICs */
7791         uint16_t        min_vnics;
7792         /* Maximum non-guaranteed number of VNICs */
7793         uint16_t        max_vnics;
7794         /* Minimum guaranteed number of statistic contexts */
7795         uint16_t        min_stat_ctx;
7796         /* Maximum non-guaranteed number of statistic contexts */
7797         uint16_t        max_stat_ctx;
7798         /* Minimum guaranteed number of ring groups */
7799         uint16_t        min_hw_ring_grps;
7800         /* Maximum non-guaranteed number of ring groups */
7801         uint16_t        max_hw_ring_grps;
7802         /*
7803          * Maximum number of inputs into the transmit scheduler for this function.
7804          * The number of TX rings assigned to the function cannot exceed this value.
7805          */
7806         uint16_t        max_tx_scheduler_inputs;
7807         uint16_t        flags;
7808         /*
7809          * When this bit is '1', it indicates that VF_RESOURCE_CFG supports
7810          * feature to reserve all minimum resources when minimum >= 1, otherwise
7811          * returns an error.
7812          */
7813         #define HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_FLAGS_MIN_GUARANTEED \
7814                 UINT32_C(0x1)
7815         uint8_t unused_0[5];
7816         /*
7817          * This field is used in Output records to indicate that the output
7818          * is completely written to RAM.  This field should be read as '1'
7819          * to indicate that the output has been completely written.
7820          * When writing a command completion or response to an internal processor,
7821          * the order of writes has to be such that this field is written last.
7822          */
7823         uint8_t valid;
7824 } __attribute__((packed));
7825
7826 /*********************************
7827  * hwrm_func_backing_store_qcaps *
7828  *********************************/
7829
7830
7831 /* hwrm_func_backing_store_qcaps_input (size:128b/16B) */
7832 struct hwrm_func_backing_store_qcaps_input {
7833         /* The HWRM command request type. */
7834         uint16_t        req_type;
7835         /*
7836          * The completion ring to send the completion event on. This should
7837          * be the NQ ID returned from the `nq_alloc` HWRM command.
7838          */
7839         uint16_t        cmpl_ring;
7840         /*
7841          * The sequence ID is used by the driver for tracking multiple
7842          * commands. This ID is treated as opaque data by the firmware and
7843          * the value is returned in the `hwrm_resp_hdr` upon completion.
7844          */
7845         uint16_t        seq_id;
7846         /*
7847          * The target ID of the command:
7848          * * 0x0-0xFFF8 - The function ID
7849          * * 0xFFF8-0xFFFE - Reserved for internal processors
7850          * * 0xFFFF - HWRM
7851          */
7852         uint16_t        target_id;
7853         /*
7854          * A physical address pointer pointing to a host buffer that the
7855          * command's response data will be written. This can be either a host
7856          * physical address (HPA) or a guest physical address (GPA) and must
7857          * point to a physically contiguous block of memory.
7858          */
7859         uint64_t        resp_addr;
7860 } __attribute__((packed));
7861
7862 /* hwrm_func_backing_store_qcaps_output (size:576b/72B) */
7863 struct hwrm_func_backing_store_qcaps_output {
7864         /* The specific error status for the command. */
7865         uint16_t        error_code;
7866         /* The HWRM command request type. */
7867         uint16_t        req_type;
7868         /* The sequence ID from the original command. */
7869         uint16_t        seq_id;
7870         /* The length of the response data in number of bytes. */
7871         uint16_t        resp_len;
7872         /* Maximum number of QP context entries supported for this function. */
7873         uint32_t        qp_max_entries;
7874         /*
7875          * Minimum number of QP context entries that are needed to be reserved
7876          * for QP1 for the PF and its VFs. PF drivers must allocate at least
7877          * this many QP context entries, even if RoCE will not be used.
7878          */
7879         uint16_t        qp_min_qp1_entries;
7880         /* Maximum number of QP context entries that can be used for L2. */
7881         uint16_t        qp_max_l2_entries;
7882         /* Number of bytes that must be allocated for each context entry. */
7883         uint16_t        qp_entry_size;
7884         /* Maximum number of SRQ context entries that can be used for L2. */
7885         uint16_t        srq_max_l2_entries;
7886         /* Maximum number of SRQ context entries supported for this function. */
7887         uint32_t        srq_max_entries;
7888         /* Number of bytes that must be allocated for each context entry. */
7889         uint16_t        srq_entry_size;
7890         /* Maximum number of CQ context entries that can be used for L2. */
7891         uint16_t        cq_max_l2_entries;
7892         /* Maximum number of CQ context entries supported for this function. */
7893         uint32_t        cq_max_entries;
7894         /* Number of bytes that must be allocated for each context entry. */
7895         uint16_t        cq_entry_size;
7896         /* Maximum number of VNIC context entries supported for this function. */
7897         uint16_t        vnic_max_vnic_entries;
7898         /* Maximum number of Ring table context entries supported for this function. */
7899         uint16_t        vnic_max_ring_table_entries;
7900         /* Number of bytes that must be allocated for each context entry. */
7901         uint16_t        vnic_entry_size;
7902         /* Maximum number of statistic context entries supported for this function. */
7903         uint32_t        stat_max_entries;
7904         /* Number of bytes that must be allocated for each context entry. */
7905         uint16_t        stat_entry_size;
7906         /* Number of bytes that must be allocated for each context entry. */
7907         uint16_t        tqm_entry_size;
7908         /* Minimum number of TQM context entries required per ring. */
7909         uint32_t        tqm_min_entries_per_ring;
7910         /*
7911          * Maximum number of TQM context entries supported per ring. This is
7912          * actually a recommended TQM queue size based on worst case usage of
7913          * the TQM queue.
7914          *
7915          * TQM fastpath rings should be sized large enough to accommodate the
7916          * maximum number of QPs (either L2 or RoCE, or both if shared)
7917          * that can be enqueued to the TQM ring.
7918          *
7919          * TQM slowpath rings should be sized as follows:
7920          *
7921          * num_entries = num_vnics + num_l2_tx_rings + num_roce_qps + tqm_min_size
7922          *
7923          * Where:
7924          *   num_vnics is the number of VNICs allocated in the VNIC backing store
7925          *   num_l2_tx_rings is the number of L2 rings in the QP backing store
7926          *   num_roce_qps is the number of RoCE QPs in the QP backing store
7927          *   tqm_min_size is tqm_min_entries_per_ring reported by
7928          *     HWRM_FUNC_BACKING_STORE_QCAPS
7929          *
7930          * Note that TQM ring sizes cannot be extended while the system is
7931          * operational. If a PF driver needs to extend a TQM ring, it needs
7932          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
7933          * the backing store.
7934          */
7935         uint32_t        tqm_max_entries_per_ring;
7936         /* Maximum number of MR/AV context entries supported for this function. */
7937         uint32_t        mrav_max_entries;
7938         /* Number of bytes that must be allocated for each context entry. */
7939         uint16_t        mrav_entry_size;
7940         /* Number of bytes that must be allocated for each context entry. */
7941         uint16_t        tim_entry_size;
7942         /* Maximum number of Timer context entries supported for this function. */
7943         uint32_t        tim_max_entries;
7944         uint8_t unused_0[2];
7945         /*
7946          * The number of entries specified for any TQM ring must be a
7947          * multiple of this value to prevent any resource allocation
7948          * limitations.
7949          */
7950         uint8_t tqm_entries_multiple;
7951         /*
7952          * This field is used in Output records to indicate that the output
7953          * is completely written to RAM.  This field should be read as '1'
7954          * to indicate that the output has been completely written.
7955          * When writing a command completion or response to an internal processor,
7956          * the order of writes has to be such that this field is written last.
7957          */
7958         uint8_t valid;
7959 } __attribute__((packed));
7960
7961 /*******************************
7962  * hwrm_func_backing_store_cfg *
7963  *******************************/
7964
7965
7966 /* hwrm_func_backing_store_cfg_input (size:2048b/256B) */
7967 struct hwrm_func_backing_store_cfg_input {
7968         /* The HWRM command request type. */
7969         uint16_t        req_type;
7970         /*
7971          * The completion ring to send the completion event on. This should
7972          * be the NQ ID returned from the `nq_alloc` HWRM command.
7973          */
7974         uint16_t        cmpl_ring;
7975         /*
7976          * The sequence ID is used by the driver for tracking multiple
7977          * commands. This ID is treated as opaque data by the firmware and
7978          * the value is returned in the `hwrm_resp_hdr` upon completion.
7979          */
7980         uint16_t        seq_id;
7981         /*
7982          * The target ID of the command:
7983          * * 0x0-0xFFF8 - The function ID
7984          * * 0xFFF8-0xFFFE - Reserved for internal processors
7985          * * 0xFFFF - HWRM
7986          */
7987         uint16_t        target_id;
7988         /*
7989          * A physical address pointer pointing to a host buffer that the
7990          * command's response data will be written. This can be either a host
7991          * physical address (HPA) or a guest physical address (GPA) and must
7992          * point to a physically contiguous block of memory.
7993          */
7994         uint64_t        resp_addr;
7995         uint32_t        flags;
7996         /*
7997          * When set, the firmware only uses on-chip resources and does not
7998          * expect any backing store to be provided by the host driver. This
7999          * mode provides minimal L2 functionality (e.g. limited L2 resources,
8000          * no RoCE).
8001          */
8002         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_FLAGS_PREBOOT_MODE \
8003                 UINT32_C(0x1)
8004         uint32_t        enables;
8005         /*
8006          * This bit must be '1' for the qp fields to be
8007          * configured.
8008          */
8009         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_QP \
8010                 UINT32_C(0x1)
8011         /*
8012          * This bit must be '1' for the srq fields to be
8013          * configured.
8014          */
8015         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_SRQ \
8016                 UINT32_C(0x2)
8017         /*
8018          * This bit must be '1' for the cq fields to be
8019          * configured.
8020          */
8021         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_CQ \
8022                 UINT32_C(0x4)
8023         /*
8024          * This bit must be '1' for the vnic fields to be
8025          * configured.
8026          */
8027         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_VNIC \
8028                 UINT32_C(0x8)
8029         /*
8030          * This bit must be '1' for the stat fields to be
8031          * configured.
8032          */
8033         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_STAT \
8034                 UINT32_C(0x10)
8035         /*
8036          * This bit must be '1' for the tqm_sp fields to be
8037          * configured.
8038          */
8039         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_SP \
8040                 UINT32_C(0x20)
8041         /*
8042          * This bit must be '1' for the tqm_ring0 fields to be
8043          * configured.
8044          */
8045         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_RING0 \
8046                 UINT32_C(0x40)
8047         /*
8048          * This bit must be '1' for the tqm_ring1 fields to be
8049          * configured.
8050          */
8051         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_RING1 \
8052                 UINT32_C(0x80)
8053         /*
8054          * This bit must be '1' for the tqm_ring2 fields to be
8055          * configured.
8056          */
8057         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_RING2 \
8058                 UINT32_C(0x100)
8059         /*
8060          * This bit must be '1' for the tqm_ring3 fields to be
8061          * configured.
8062          */
8063         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_RING3 \
8064                 UINT32_C(0x200)
8065         /*
8066          * This bit must be '1' for the tqm_ring4 fields to be
8067          * configured.
8068          */
8069         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_RING4 \
8070                 UINT32_C(0x400)
8071         /*
8072          * This bit must be '1' for the tqm_ring5 fields to be
8073          * configured.
8074          */
8075         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_RING5 \
8076                 UINT32_C(0x800)
8077         /*
8078          * This bit must be '1' for the tqm_ring6 fields to be
8079          * configured.
8080          */
8081         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_RING6 \
8082                 UINT32_C(0x1000)
8083         /*
8084          * This bit must be '1' for the tqm_ring7 fields to be
8085          * configured.
8086          */
8087         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_RING7 \
8088                 UINT32_C(0x2000)
8089         /*
8090          * This bit must be '1' for the mrav fields to be
8091          * configured.
8092          */
8093         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_MRAV \
8094                 UINT32_C(0x4000)
8095         /*
8096          * This bit must be '1' for the tim fields to be
8097          * configured.
8098          */
8099         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TIM \
8100                 UINT32_C(0x8000)
8101         /* QPC page size and level. */
8102         uint8_t qpc_pg_size_qpc_lvl;
8103         /* QPC PBL indirect levels. */
8104         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_LVL_MASK \
8105                 UINT32_C(0xf)
8106         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_LVL_SFT       0
8107         /* PBL pointer is physical start address. */
8108         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_LVL_LVL_0 \
8109                 UINT32_C(0x0)
8110         /* PBL pointer points to PTE table. */
8111         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_LVL_LVL_1 \
8112                 UINT32_C(0x1)
8113         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8114         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_LVL_LVL_2 \
8115                 UINT32_C(0x2)
8116         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_LVL_LAST \
8117                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_LVL_LVL_2
8118         /* QPC page size. */
8119         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_MASK \
8120                 UINT32_C(0xf0)
8121         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_SFT   4
8122         /* 4KB. */
8123         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_PG_4K \
8124                 (UINT32_C(0x0) << 4)
8125         /* 8KB. */
8126         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_PG_8K \
8127                 (UINT32_C(0x1) << 4)
8128         /* 64KB. */
8129         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_PG_64K \
8130                 (UINT32_C(0x2) << 4)
8131         /* 2MB. */
8132         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_PG_2M \
8133                 (UINT32_C(0x3) << 4)
8134         /* 8MB. */
8135         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_PG_8M \
8136                 (UINT32_C(0x4) << 4)
8137         /* 1GB. */
8138         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_PG_1G \
8139                 (UINT32_C(0x5) << 4)
8140         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_LAST \
8141                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_PG_SIZE_PG_1G
8142         /* SRQ page size and level. */
8143         uint8_t srq_pg_size_srq_lvl;
8144         /* SRQ PBL indirect levels. */
8145         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_LVL_MASK \
8146                 UINT32_C(0xf)
8147         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_LVL_SFT       0
8148         /* PBL pointer is physical start address. */
8149         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_LVL_LVL_0 \
8150                 UINT32_C(0x0)
8151         /* PBL pointer points to PTE table. */
8152         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_LVL_LVL_1 \
8153                 UINT32_C(0x1)
8154         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8155         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_LVL_LVL_2 \
8156                 UINT32_C(0x2)
8157         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_LVL_LAST \
8158                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_LVL_LVL_2
8159         /* SRQ page size. */
8160         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_MASK \
8161                 UINT32_C(0xf0)
8162         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_SFT   4
8163         /* 4KB. */
8164         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_4K \
8165                 (UINT32_C(0x0) << 4)
8166         /* 8KB. */
8167         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_8K \
8168                 (UINT32_C(0x1) << 4)
8169         /* 64KB. */
8170         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_64K \
8171                 (UINT32_C(0x2) << 4)
8172         /* 2MB. */
8173         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_2M \
8174                 (UINT32_C(0x3) << 4)
8175         /* 8MB. */
8176         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_8M \
8177                 (UINT32_C(0x4) << 4)
8178         /* 1GB. */
8179         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_1G \
8180                 (UINT32_C(0x5) << 4)
8181         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_LAST \
8182                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_SRQ_PG_SIZE_PG_1G
8183         /* CQ page size and level. */
8184         uint8_t cq_pg_size_cq_lvl;
8185         /* CQ PBL indirect levels. */
8186         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_LVL_MASK \
8187                 UINT32_C(0xf)
8188         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_LVL_SFT       0
8189         /* PBL pointer is physical start address. */
8190         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_LVL_LVL_0 \
8191                 UINT32_C(0x0)
8192         /* PBL pointer points to PTE table. */
8193         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_LVL_LVL_1 \
8194                 UINT32_C(0x1)
8195         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8196         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_LVL_LVL_2 \
8197                 UINT32_C(0x2)
8198         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_LVL_LAST \
8199                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_LVL_LVL_2
8200         /* CQ page size. */
8201         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_MASK \
8202                 UINT32_C(0xf0)
8203         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_SFT   4
8204         /* 4KB. */
8205         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_PG_4K \
8206                 (UINT32_C(0x0) << 4)
8207         /* 8KB. */
8208         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_PG_8K \
8209                 (UINT32_C(0x1) << 4)
8210         /* 64KB. */
8211         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_PG_64K \
8212                 (UINT32_C(0x2) << 4)
8213         /* 2MB. */
8214         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_PG_2M \
8215                 (UINT32_C(0x3) << 4)
8216         /* 8MB. */
8217         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_PG_8M \
8218                 (UINT32_C(0x4) << 4)
8219         /* 1GB. */
8220         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_PG_1G \
8221                 (UINT32_C(0x5) << 4)
8222         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_LAST \
8223                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_CQ_PG_SIZE_PG_1G
8224         /* VNIC page size and level. */
8225         uint8_t vnic_pg_size_vnic_lvl;
8226         /* VNIC PBL indirect levels. */
8227         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_LVL_MASK \
8228                 UINT32_C(0xf)
8229         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_LVL_SFT       0
8230         /* PBL pointer is physical start address. */
8231         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_LVL_LVL_0 \
8232                 UINT32_C(0x0)
8233         /* PBL pointer points to PTE table. */
8234         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_LVL_LVL_1 \
8235                 UINT32_C(0x1)
8236         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8237         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_LVL_LVL_2 \
8238                 UINT32_C(0x2)
8239         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_LVL_LAST \
8240                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_LVL_LVL_2
8241         /* VNIC page size. */
8242         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_MASK \
8243                 UINT32_C(0xf0)
8244         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_SFT   4
8245         /* 4KB. */
8246         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_PG_4K \
8247                 (UINT32_C(0x0) << 4)
8248         /* 8KB. */
8249         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_PG_8K \
8250                 (UINT32_C(0x1) << 4)
8251         /* 64KB. */
8252         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_PG_64K \
8253                 (UINT32_C(0x2) << 4)
8254         /* 2MB. */
8255         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_PG_2M \
8256                 (UINT32_C(0x3) << 4)
8257         /* 8MB. */
8258         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_PG_8M \
8259                 (UINT32_C(0x4) << 4)
8260         /* 1GB. */
8261         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_PG_1G \
8262                 (UINT32_C(0x5) << 4)
8263         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_LAST \
8264                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_VNIC_PG_SIZE_PG_1G
8265         /* Stat page size and level. */
8266         uint8_t stat_pg_size_stat_lvl;
8267         /* Stat PBL indirect levels. */
8268         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_LVL_MASK \
8269                 UINT32_C(0xf)
8270         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_LVL_SFT       0
8271         /* PBL pointer is physical start address. */
8272         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_LVL_LVL_0 \
8273                 UINT32_C(0x0)
8274         /* PBL pointer points to PTE table. */
8275         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_LVL_LVL_1 \
8276                 UINT32_C(0x1)
8277         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8278         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_LVL_LVL_2 \
8279                 UINT32_C(0x2)
8280         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_LVL_LAST \
8281                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_LVL_LVL_2
8282         /* Stat page size. */
8283         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_MASK \
8284                 UINT32_C(0xf0)
8285         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_SFT   4
8286         /* 4KB. */
8287         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_PG_4K \
8288                 (UINT32_C(0x0) << 4)
8289         /* 8KB. */
8290         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_PG_8K \
8291                 (UINT32_C(0x1) << 4)
8292         /* 64KB. */
8293         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_PG_64K \
8294                 (UINT32_C(0x2) << 4)
8295         /* 2MB. */
8296         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_PG_2M \
8297                 (UINT32_C(0x3) << 4)
8298         /* 8MB. */
8299         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_PG_8M \
8300                 (UINT32_C(0x4) << 4)
8301         /* 1GB. */
8302         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_PG_1G \
8303                 (UINT32_C(0x5) << 4)
8304         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_LAST \
8305                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_STAT_PG_SIZE_PG_1G
8306         /* TQM slow path page size and level. */
8307         uint8_t tqm_sp_pg_size_tqm_sp_lvl;
8308         /* TQM slow path PBL indirect levels. */
8309         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_LVL_MASK \
8310                 UINT32_C(0xf)
8311         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_LVL_SFT       0
8312         /* PBL pointer is physical start address. */
8313         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_LVL_LVL_0 \
8314                 UINT32_C(0x0)
8315         /* PBL pointer points to PTE table. */
8316         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_LVL_LVL_1 \
8317                 UINT32_C(0x1)
8318         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8319         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_LVL_LVL_2 \
8320                 UINT32_C(0x2)
8321         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_LVL_LAST \
8322                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_LVL_LVL_2
8323         /* TQM slow path page size. */
8324         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_MASK \
8325                 UINT32_C(0xf0)
8326         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_SFT   4
8327         /* 4KB. */
8328         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_PG_4K \
8329                 (UINT32_C(0x0) << 4)
8330         /* 8KB. */
8331         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_PG_8K \
8332                 (UINT32_C(0x1) << 4)
8333         /* 64KB. */
8334         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_PG_64K \
8335                 (UINT32_C(0x2) << 4)
8336         /* 2MB. */
8337         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_PG_2M \
8338                 (UINT32_C(0x3) << 4)
8339         /* 8MB. */
8340         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_PG_8M \
8341                 (UINT32_C(0x4) << 4)
8342         /* 1GB. */
8343         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_PG_1G \
8344                 (UINT32_C(0x5) << 4)
8345         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_LAST \
8346                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_SP_PG_SIZE_PG_1G
8347         /* TQM ring 0 page size and level. */
8348         uint8_t tqm_ring0_pg_size_tqm_ring0_lvl;
8349         /* TQM ring 0 PBL indirect levels. */
8350         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_LVL_MASK \
8351                 UINT32_C(0xf)
8352         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_LVL_SFT       0
8353         /* PBL pointer is physical start address. */
8354         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_LVL_LVL_0 \
8355                 UINT32_C(0x0)
8356         /* PBL pointer points to PTE table. */
8357         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_LVL_LVL_1 \
8358                 UINT32_C(0x1)
8359         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8360         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_LVL_LVL_2 \
8361                 UINT32_C(0x2)
8362         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_LVL_LAST \
8363                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_LVL_LVL_2
8364         /* TQM ring 0 page size. */
8365         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_MASK \
8366                 UINT32_C(0xf0)
8367         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_SFT   4
8368         /* 4KB. */
8369         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_PG_4K \
8370                 (UINT32_C(0x0) << 4)
8371         /* 8KB. */
8372         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_PG_8K \
8373                 (UINT32_C(0x1) << 4)
8374         /* 64KB. */
8375         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_PG_64K \
8376                 (UINT32_C(0x2) << 4)
8377         /* 2MB. */
8378         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_PG_2M \
8379                 (UINT32_C(0x3) << 4)
8380         /* 8MB. */
8381         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_PG_8M \
8382                 (UINT32_C(0x4) << 4)
8383         /* 1GB. */
8384         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_PG_1G \
8385                 (UINT32_C(0x5) << 4)
8386         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_LAST \
8387                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING0_PG_SIZE_PG_1G
8388         /* TQM ring 1 page size and level. */
8389         uint8_t tqm_ring1_pg_size_tqm_ring1_lvl;
8390         /* TQM ring 1 PBL indirect levels. */
8391         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_LVL_MASK \
8392                 UINT32_C(0xf)
8393         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_LVL_SFT       0
8394         /* PBL pointer is physical start address. */
8395         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_LVL_LVL_0 \
8396                 UINT32_C(0x0)
8397         /* PBL pointer points to PTE table. */
8398         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_LVL_LVL_1 \
8399                 UINT32_C(0x1)
8400         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8401         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_LVL_LVL_2 \
8402                 UINT32_C(0x2)
8403         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_LVL_LAST \
8404                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_LVL_LVL_2
8405         /* TQM ring 1 page size. */
8406         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_MASK \
8407                 UINT32_C(0xf0)
8408         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_SFT   4
8409         /* 4KB. */
8410         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_PG_4K \
8411                 (UINT32_C(0x0) << 4)
8412         /* 8KB. */
8413         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_PG_8K \
8414                 (UINT32_C(0x1) << 4)
8415         /* 64KB. */
8416         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_PG_64K \
8417                 (UINT32_C(0x2) << 4)
8418         /* 2MB. */
8419         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_PG_2M \
8420                 (UINT32_C(0x3) << 4)
8421         /* 8MB. */
8422         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_PG_8M \
8423                 (UINT32_C(0x4) << 4)
8424         /* 1GB. */
8425         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_PG_1G \
8426                 (UINT32_C(0x5) << 4)
8427         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_LAST \
8428                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING1_PG_SIZE_PG_1G
8429         /* TQM ring 2 page size and level. */
8430         uint8_t tqm_ring2_pg_size_tqm_ring2_lvl;
8431         /* TQM ring 2 PBL indirect levels. */
8432         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_LVL_MASK \
8433                 UINT32_C(0xf)
8434         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_LVL_SFT       0
8435         /* PBL pointer is physical start address. */
8436         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_LVL_LVL_0 \
8437                 UINT32_C(0x0)
8438         /* PBL pointer points to PTE table. */
8439         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_LVL_LVL_1 \
8440                 UINT32_C(0x1)
8441         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8442         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_LVL_LVL_2 \
8443                 UINT32_C(0x2)
8444         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_LVL_LAST \
8445                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_LVL_LVL_2
8446         /* TQM ring 2 page size. */
8447         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_MASK \
8448                 UINT32_C(0xf0)
8449         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_SFT   4
8450         /* 4KB. */
8451         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_PG_4K \
8452                 (UINT32_C(0x0) << 4)
8453         /* 8KB. */
8454         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_PG_8K \
8455                 (UINT32_C(0x1) << 4)
8456         /* 64KB. */
8457         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_PG_64K \
8458                 (UINT32_C(0x2) << 4)
8459         /* 2MB. */
8460         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_PG_2M \
8461                 (UINT32_C(0x3) << 4)
8462         /* 8MB. */
8463         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_PG_8M \
8464                 (UINT32_C(0x4) << 4)
8465         /* 1GB. */
8466         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_PG_1G \
8467                 (UINT32_C(0x5) << 4)
8468         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_LAST \
8469                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING2_PG_SIZE_PG_1G
8470         /* TQM ring 3 page size and level. */
8471         uint8_t tqm_ring3_pg_size_tqm_ring3_lvl;
8472         /* TQM ring 3 PBL indirect levels. */
8473         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_LVL_MASK \
8474                 UINT32_C(0xf)
8475         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_LVL_SFT       0
8476         /* PBL pointer is physical start address. */
8477         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_LVL_LVL_0 \
8478                 UINT32_C(0x0)
8479         /* PBL pointer points to PTE table. */
8480         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_LVL_LVL_1 \
8481                 UINT32_C(0x1)
8482         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8483         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_LVL_LVL_2 \
8484                 UINT32_C(0x2)
8485         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_LVL_LAST \
8486                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_LVL_LVL_2
8487         /* TQM ring 3 page size. */
8488         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_MASK \
8489                 UINT32_C(0xf0)
8490         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_SFT   4
8491         /* 4KB. */
8492         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_PG_4K \
8493                 (UINT32_C(0x0) << 4)
8494         /* 8KB. */
8495         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_PG_8K \
8496                 (UINT32_C(0x1) << 4)
8497         /* 64KB. */
8498         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_PG_64K \
8499                 (UINT32_C(0x2) << 4)
8500         /* 2MB. */
8501         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_PG_2M \
8502                 (UINT32_C(0x3) << 4)
8503         /* 8MB. */
8504         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_PG_8M \
8505                 (UINT32_C(0x4) << 4)
8506         /* 1GB. */
8507         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_PG_1G \
8508                 (UINT32_C(0x5) << 4)
8509         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_LAST \
8510                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING3_PG_SIZE_PG_1G
8511         /* TQM ring 4 page size and level. */
8512         uint8_t tqm_ring4_pg_size_tqm_ring4_lvl;
8513         /* TQM ring 4 PBL indirect levels. */
8514         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_LVL_MASK \
8515                 UINT32_C(0xf)
8516         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_LVL_SFT       0
8517         /* PBL pointer is physical start address. */
8518         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_LVL_LVL_0 \
8519                 UINT32_C(0x0)
8520         /* PBL pointer points to PTE table. */
8521         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_LVL_LVL_1 \
8522                 UINT32_C(0x1)
8523         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8524         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_LVL_LVL_2 \
8525                 UINT32_C(0x2)
8526         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_LVL_LAST \
8527                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_LVL_LVL_2
8528         /* TQM ring 4 page size. */
8529         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_MASK \
8530                 UINT32_C(0xf0)
8531         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_SFT   4
8532         /* 4KB. */
8533         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_PG_4K \
8534                 (UINT32_C(0x0) << 4)
8535         /* 8KB. */
8536         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_PG_8K \
8537                 (UINT32_C(0x1) << 4)
8538         /* 64KB. */
8539         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_PG_64K \
8540                 (UINT32_C(0x2) << 4)
8541         /* 2MB. */
8542         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_PG_2M \
8543                 (UINT32_C(0x3) << 4)
8544         /* 8MB. */
8545         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_PG_8M \
8546                 (UINT32_C(0x4) << 4)
8547         /* 1GB. */
8548         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_PG_1G \
8549                 (UINT32_C(0x5) << 4)
8550         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_LAST \
8551                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING4_PG_SIZE_PG_1G
8552         /* TQM ring 5 page size and level. */
8553         uint8_t tqm_ring5_pg_size_tqm_ring5_lvl;
8554         /* TQM ring 5 PBL indirect levels. */
8555         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_LVL_MASK \
8556                 UINT32_C(0xf)
8557         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_LVL_SFT       0
8558         /* PBL pointer is physical start address. */
8559         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_LVL_LVL_0 \
8560                 UINT32_C(0x0)
8561         /* PBL pointer points to PTE table. */
8562         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_LVL_LVL_1 \
8563                 UINT32_C(0x1)
8564         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8565         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_LVL_LVL_2 \
8566                 UINT32_C(0x2)
8567         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_LVL_LAST \
8568                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_LVL_LVL_2
8569         /* TQM ring 5 page size. */
8570         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_MASK \
8571                 UINT32_C(0xf0)
8572         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_SFT   4
8573         /* 4KB. */
8574         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_PG_4K \
8575                 (UINT32_C(0x0) << 4)
8576         /* 8KB. */
8577         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_PG_8K \
8578                 (UINT32_C(0x1) << 4)
8579         /* 64KB. */
8580         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_PG_64K \
8581                 (UINT32_C(0x2) << 4)
8582         /* 2MB. */
8583         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_PG_2M \
8584                 (UINT32_C(0x3) << 4)
8585         /* 8MB. */
8586         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_PG_8M \
8587                 (UINT32_C(0x4) << 4)
8588         /* 1GB. */
8589         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_PG_1G \
8590                 (UINT32_C(0x5) << 4)
8591         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_LAST \
8592                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING5_PG_SIZE_PG_1G
8593         /* TQM ring 6 page size and level. */
8594         uint8_t tqm_ring6_pg_size_tqm_ring6_lvl;
8595         /* TQM ring 6 PBL indirect levels. */
8596         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_LVL_MASK \
8597                 UINT32_C(0xf)
8598         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_LVL_SFT       0
8599         /* PBL pointer is physical start address. */
8600         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_LVL_LVL_0 \
8601                 UINT32_C(0x0)
8602         /* PBL pointer points to PTE table. */
8603         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_LVL_LVL_1 \
8604                 UINT32_C(0x1)
8605         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8606         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_LVL_LVL_2 \
8607                 UINT32_C(0x2)
8608         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_LVL_LAST \
8609                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_LVL_LVL_2
8610         /* TQM ring 6 page size. */
8611         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_MASK \
8612                 UINT32_C(0xf0)
8613         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_SFT   4
8614         /* 4KB. */
8615         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_PG_4K \
8616                 (UINT32_C(0x0) << 4)
8617         /* 8KB. */
8618         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_PG_8K \
8619                 (UINT32_C(0x1) << 4)
8620         /* 64KB. */
8621         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_PG_64K \
8622                 (UINT32_C(0x2) << 4)
8623         /* 2MB. */
8624         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_PG_2M \
8625                 (UINT32_C(0x3) << 4)
8626         /* 8MB. */
8627         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_PG_8M \
8628                 (UINT32_C(0x4) << 4)
8629         /* 1GB. */
8630         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_PG_1G \
8631                 (UINT32_C(0x5) << 4)
8632         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_LAST \
8633                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING6_PG_SIZE_PG_1G
8634         /* TQM ring 7 page size and level. */
8635         uint8_t tqm_ring7_pg_size_tqm_ring7_lvl;
8636         /* TQM ring 7 PBL indirect levels. */
8637         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_LVL_MASK \
8638                 UINT32_C(0xf)
8639         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_LVL_SFT       0
8640         /* PBL pointer is physical start address. */
8641         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_LVL_LVL_0 \
8642                 UINT32_C(0x0)
8643         /* PBL pointer points to PTE table. */
8644         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_LVL_LVL_1 \
8645                 UINT32_C(0x1)
8646         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8647         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_LVL_LVL_2 \
8648                 UINT32_C(0x2)
8649         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_LVL_LAST \
8650                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_LVL_LVL_2
8651         /* TQM ring 7 page size. */
8652         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_MASK \
8653                 UINT32_C(0xf0)
8654         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_SFT   4
8655         /* 4KB. */
8656         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_PG_4K \
8657                 (UINT32_C(0x0) << 4)
8658         /* 8KB. */
8659         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_PG_8K \
8660                 (UINT32_C(0x1) << 4)
8661         /* 64KB. */
8662         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_PG_64K \
8663                 (UINT32_C(0x2) << 4)
8664         /* 2MB. */
8665         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_PG_2M \
8666                 (UINT32_C(0x3) << 4)
8667         /* 8MB. */
8668         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_PG_8M \
8669                 (UINT32_C(0x4) << 4)
8670         /* 1GB. */
8671         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_PG_1G \
8672                 (UINT32_C(0x5) << 4)
8673         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_LAST \
8674                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TQM_RING7_PG_SIZE_PG_1G
8675         /* MR/AV page size and level. */
8676         uint8_t mrav_pg_size_mrav_lvl;
8677         /* MR/AV PBL indirect levels. */
8678         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_LVL_MASK \
8679                 UINT32_C(0xf)
8680         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_LVL_SFT       0
8681         /* PBL pointer is physical start address. */
8682         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_LVL_LVL_0 \
8683                 UINT32_C(0x0)
8684         /* PBL pointer points to PTE table. */
8685         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_LVL_LVL_1 \
8686                 UINT32_C(0x1)
8687         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8688         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_LVL_LVL_2 \
8689                 UINT32_C(0x2)
8690         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_LVL_LAST \
8691                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_LVL_LVL_2
8692         /* MR/AV page size. */
8693         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_MASK \
8694                 UINT32_C(0xf0)
8695         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_SFT   4
8696         /* 4KB. */
8697         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_PG_4K \
8698                 (UINT32_C(0x0) << 4)
8699         /* 8KB. */
8700         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_PG_8K \
8701                 (UINT32_C(0x1) << 4)
8702         /* 64KB. */
8703         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_PG_64K \
8704                 (UINT32_C(0x2) << 4)
8705         /* 2MB. */
8706         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_PG_2M \
8707                 (UINT32_C(0x3) << 4)
8708         /* 8MB. */
8709         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_PG_8M \
8710                 (UINT32_C(0x4) << 4)
8711         /* 1GB. */
8712         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_PG_1G \
8713                 (UINT32_C(0x5) << 4)
8714         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_LAST \
8715                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_MRAV_PG_SIZE_PG_1G
8716         /* Timer page size and level. */
8717         uint8_t tim_pg_size_tim_lvl;
8718         /* Timer PBL indirect levels. */
8719         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_LVL_MASK \
8720                 UINT32_C(0xf)
8721         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_LVL_SFT       0
8722         /* PBL pointer is physical start address. */
8723         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_LVL_LVL_0 \
8724                 UINT32_C(0x0)
8725         /* PBL pointer points to PTE table. */
8726         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_LVL_LVL_1 \
8727                 UINT32_C(0x1)
8728         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
8729         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_LVL_LVL_2 \
8730                 UINT32_C(0x2)
8731         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_LVL_LAST \
8732                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_LVL_LVL_2
8733         /* Timer page size. */
8734         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_MASK \
8735                 UINT32_C(0xf0)
8736         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_SFT   4
8737         /* 4KB. */
8738         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_PG_4K \
8739                 (UINT32_C(0x0) << 4)
8740         /* 8KB. */
8741         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_PG_8K \
8742                 (UINT32_C(0x1) << 4)
8743         /* 64KB. */
8744         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_PG_64K \
8745                 (UINT32_C(0x2) << 4)
8746         /* 2MB. */
8747         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_PG_2M \
8748                 (UINT32_C(0x3) << 4)
8749         /* 8MB. */
8750         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_PG_8M \
8751                 (UINT32_C(0x4) << 4)
8752         /* 1GB. */
8753         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_PG_1G \
8754                 (UINT32_C(0x5) << 4)
8755         #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_LAST \
8756                 HWRM_FUNC_BACKING_STORE_CFG_INPUT_TIM_PG_SIZE_PG_1G
8757         /* QP page directory. */
8758         uint64_t        qpc_page_dir;
8759         /* SRQ page directory. */
8760         uint64_t        srq_page_dir;
8761         /* CQ page directory. */
8762         uint64_t        cq_page_dir;
8763         /* VNIC page directory. */
8764         uint64_t        vnic_page_dir;
8765         /* Stat page directory. */
8766         uint64_t        stat_page_dir;
8767         /* TQM slowpath page directory. */
8768         uint64_t        tqm_sp_page_dir;
8769         /* TQM ring 0 page directory. */
8770         uint64_t        tqm_ring0_page_dir;
8771         /* TQM ring 1 page directory. */
8772         uint64_t        tqm_ring1_page_dir;
8773         /* TQM ring 2 page directory. */
8774         uint64_t        tqm_ring2_page_dir;
8775         /* TQM ring 3 page directory. */
8776         uint64_t        tqm_ring3_page_dir;
8777         /* TQM ring 4 page directory. */
8778         uint64_t        tqm_ring4_page_dir;
8779         /* TQM ring 5 page directory. */
8780         uint64_t        tqm_ring5_page_dir;
8781         /* TQM ring 6 page directory. */
8782         uint64_t        tqm_ring6_page_dir;
8783         /* TQM ring 7 page directory. */
8784         uint64_t        tqm_ring7_page_dir;
8785         /* MR/AV page directory. */
8786         uint64_t        mrav_page_dir;
8787         /* Timer page directory. */
8788         uint64_t        tim_page_dir;
8789         /* Number of QPs. */
8790         uint32_t        qp_num_entries;
8791         /* Number of SRQs. */
8792         uint32_t        srq_num_entries;
8793         /* Number of CQs. */
8794         uint32_t        cq_num_entries;
8795         /* Number of Stats. */
8796         uint32_t        stat_num_entries;
8797         /*
8798          * Number of TQM slowpath entries.
8799          *
8800          * TQM slowpath rings should be sized as follows:
8801          *
8802          * num_entries = num_vnics + num_l2_tx_rings + num_roce_qps + tqm_min_size
8803          *
8804          * Where:
8805          *   num_vnics is the number of VNICs allocated in the VNIC backing store
8806          *   num_l2_tx_rings is the number of L2 rings in the QP backing store
8807          *   num_roce_qps is the number of RoCE QPs in the QP backing store
8808          *   tqm_min_size is tqm_min_entries_per_ring reported by
8809          *     HWRM_FUNC_BACKING_STORE_QCAPS
8810          *
8811          * Note that TQM ring sizes cannot be extended while the system is
8812          * operational. If a PF driver needs to extend a TQM ring, it needs
8813          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
8814          * the backing store.
8815          */
8816         uint32_t        tqm_sp_num_entries;
8817         /*
8818          * Number of TQM ring 0 entries.
8819          *
8820          * TQM fastpath rings should be sized large enough to accommodate the
8821          * maximum number of QPs (either L2 or RoCE, or both if shared)
8822          * that can be enqueued to the TQM ring.
8823          *
8824          * Note that TQM ring sizes cannot be extended while the system is
8825          * operational. If a PF driver needs to extend a TQM ring, it needs
8826          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
8827          * the backing store.
8828          */
8829         uint32_t        tqm_ring0_num_entries;
8830         /*
8831          * Number of TQM ring 1 entries.
8832          *
8833          * TQM fastpath rings should be sized large enough to accommodate the
8834          * maximum number of QPs (either L2 or RoCE, or both if shared)
8835          * that can be enqueued to the TQM ring.
8836          *
8837          * Note that TQM ring sizes cannot be extended while the system is
8838          * operational. If a PF driver needs to extend a TQM ring, it needs
8839          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
8840          * the backing store.
8841          */
8842         uint32_t        tqm_ring1_num_entries;
8843         /*
8844          * Number of TQM ring 2 entries.
8845          *
8846          * TQM fastpath rings should be sized large enough to accommodate the
8847          * maximum number of QPs (either L2 or RoCE, or both if shared)
8848          * that can be enqueued to the TQM ring.
8849          *
8850          * Note that TQM ring sizes cannot be extended while the system is
8851          * operational. If a PF driver needs to extend a TQM ring, it needs
8852          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
8853          * the backing store.
8854          */
8855         uint32_t        tqm_ring2_num_entries;
8856         /*
8857          * Number of TQM ring 3 entries.
8858          *
8859          * TQM fastpath rings should be sized large enough to accommodate the
8860          * maximum number of QPs (either L2 or RoCE, or both if shared)
8861          * that can be enqueued to the TQM ring.
8862          *
8863          * Note that TQM ring sizes cannot be extended while the system is
8864          * operational. If a PF driver needs to extend a TQM ring, it needs
8865          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
8866          * the backing store.
8867          */
8868         uint32_t        tqm_ring3_num_entries;
8869         /*
8870          * Number of TQM ring 4 entries.
8871          *
8872          * TQM fastpath rings should be sized large enough to accommodate the
8873          * maximum number of QPs (either L2 or RoCE, or both if shared)
8874          * that can be enqueued to the TQM ring.
8875          *
8876          * Note that TQM ring sizes cannot be extended while the system is
8877          * operational. If a PF driver needs to extend a TQM ring, it needs
8878          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
8879          * the backing store.
8880          */
8881         uint32_t        tqm_ring4_num_entries;
8882         /*
8883          * Number of TQM ring 5 entries.
8884          *
8885          * TQM fastpath rings should be sized large enough to accommodate the
8886          * maximum number of QPs (either L2 or RoCE, or both if shared)
8887          * that can be enqueued to the TQM ring.
8888          *
8889          * Note that TQM ring sizes cannot be extended while the system is
8890          * operational. If a PF driver needs to extend a TQM ring, it needs
8891          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
8892          * the backing store.
8893          */
8894         uint32_t        tqm_ring5_num_entries;
8895         /*
8896          * Number of TQM ring 6 entries.
8897          *
8898          * TQM fastpath rings should be sized large enough to accommodate the
8899          * maximum number of QPs (either L2 or RoCE, or both if shared)
8900          * that can be enqueued to the TQM ring.
8901          *
8902          * Note that TQM ring sizes cannot be extended while the system is
8903          * operational. If a PF driver needs to extend a TQM ring, it needs
8904          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
8905          * the backing store.
8906          */
8907         uint32_t        tqm_ring6_num_entries;
8908         /*
8909          * Number of TQM ring 7 entries.
8910          *
8911          * TQM fastpath rings should be sized large enough to accommodate the
8912          * maximum number of QPs (either L2 or RoCE, or both if shared)
8913          * that can be enqueued to the TQM ring.
8914          *
8915          * Note that TQM ring sizes cannot be extended while the system is
8916          * operational. If a PF driver needs to extend a TQM ring, it needs
8917          * to reset the function (e.g. HWRM_FUNC_RESET) and then reallocate
8918          * the backing store.
8919          */
8920         uint32_t        tqm_ring7_num_entries;
8921         /* Number of MR/AV entries. */
8922         uint32_t        mrav_num_entries;
8923         /* Number of Timer entries. */
8924         uint32_t        tim_num_entries;
8925         /* Number of entries to reserve for QP1 */
8926         uint16_t        qp_num_qp1_entries;
8927         /* Number of entries to reserve for L2 */
8928         uint16_t        qp_num_l2_entries;
8929         /* Number of bytes that have been allocated for each context entry. */
8930         uint16_t        qp_entry_size;
8931         /* Number of entries to reserve for L2 */
8932         uint16_t        srq_num_l2_entries;
8933         /* Number of bytes that have been allocated for each context entry. */
8934         uint16_t        srq_entry_size;
8935         /* Number of entries to reserve for L2 */
8936         uint16_t        cq_num_l2_entries;
8937         /* Number of bytes that have been allocated for each context entry. */
8938         uint16_t        cq_entry_size;
8939         /* Number of entries to reserve for VNIC entries */
8940         uint16_t        vnic_num_vnic_entries;
8941         /* Number of entries to reserve for Ring table entries */
8942         uint16_t        vnic_num_ring_table_entries;
8943         /* Number of bytes that have been allocated for each context entry. */
8944         uint16_t        vnic_entry_size;
8945         /* Number of bytes that have been allocated for each context entry. */
8946         uint16_t        stat_entry_size;
8947         /* Number of bytes that have been allocated for each context entry. */
8948         uint16_t        tqm_entry_size;
8949         /* Number of bytes that have been allocated for each context entry. */
8950         uint16_t        mrav_entry_size;
8951         /* Number of bytes that have been allocated for each context entry. */
8952         uint16_t        tim_entry_size;
8953 } __attribute__((packed));
8954
8955 /* hwrm_func_backing_store_cfg_output (size:128b/16B) */
8956 struct hwrm_func_backing_store_cfg_output {
8957         /* The specific error status for the command. */
8958         uint16_t        error_code;
8959         /* The HWRM command request type. */
8960         uint16_t        req_type;
8961         /* The sequence ID from the original command. */
8962         uint16_t        seq_id;
8963         /* The length of the response data in number of bytes. */
8964         uint16_t        resp_len;
8965         uint8_t unused_0[7];
8966         /*
8967          * This field is used in Output records to indicate that the output
8968          * is completely written to RAM.  This field should be read as '1'
8969          * to indicate that the output has been completely written.
8970          * When writing a command completion or response to an internal processor,
8971          * the order of writes has to be such that this field is written last.
8972          */
8973         uint8_t valid;
8974 } __attribute__((packed));
8975
8976 /********************************
8977  * hwrm_func_backing_store_qcfg *
8978  ********************************/
8979
8980
8981 /* hwrm_func_backing_store_qcfg_input (size:128b/16B) */
8982 struct hwrm_func_backing_store_qcfg_input {
8983         /* The HWRM command request type. */
8984         uint16_t        req_type;
8985         /*
8986          * The completion ring to send the completion event on. This should
8987          * be the NQ ID returned from the `nq_alloc` HWRM command.
8988          */
8989         uint16_t        cmpl_ring;
8990         /*
8991          * The sequence ID is used by the driver for tracking multiple
8992          * commands. This ID is treated as opaque data by the firmware and
8993          * the value is returned in the `hwrm_resp_hdr` upon completion.
8994          */
8995         uint16_t        seq_id;
8996         /*
8997          * The target ID of the command:
8998          * * 0x0-0xFFF8 - The function ID
8999          * * 0xFFF8-0xFFFE - Reserved for internal processors
9000          * * 0xFFFF - HWRM
9001          */
9002         uint16_t        target_id;
9003         /*
9004          * A physical address pointer pointing to a host buffer that the
9005          * command's response data will be written. This can be either a host
9006          * physical address (HPA) or a guest physical address (GPA) and must
9007          * point to a physically contiguous block of memory.
9008          */
9009         uint64_t        resp_addr;
9010 } __attribute__((packed));
9011
9012 /* hwrm_func_backing_store_qcfg_output (size:1920b/240B) */
9013 struct hwrm_func_backing_store_qcfg_output {
9014         /* The specific error status for the command. */
9015         uint16_t        error_code;
9016         /* The HWRM command request type. */
9017         uint16_t        req_type;
9018         /* The sequence ID from the original command. */
9019         uint16_t        seq_id;
9020         /* The length of the response data in number of bytes. */
9021         uint16_t        resp_len;
9022         uint32_t        flags;
9023         /*
9024          * When set, the firmware only uses on-chip resources and does not
9025          * expect any backing store to be provided by the host driver. This
9026          * mode provides minimal L2 functionality (e.g. limited L2 resources,
9027          * no RoCE).
9028          */
9029         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_FLAGS_PREBOOT_MODE \
9030                 UINT32_C(0x1)
9031         uint8_t unused_0[4];
9032         /*
9033          * This bit must be '1' for the qp fields to be
9034          * configured.
9035          */
9036         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_QP \
9037                 UINT32_C(0x1)
9038         /*
9039          * This bit must be '1' for the srq fields to be
9040          * configured.
9041          */
9042         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_SRQ \
9043                 UINT32_C(0x2)
9044         /*
9045          * This bit must be '1' for the cq fields to be
9046          * configured.
9047          */
9048         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_CQ \
9049                 UINT32_C(0x4)
9050         /*
9051          * This bit must be '1' for the vnic fields to be
9052          * configured.
9053          */
9054         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_VNIC \
9055                 UINT32_C(0x8)
9056         /*
9057          * This bit must be '1' for the stat fields to be
9058          * configured.
9059          */
9060         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_STAT \
9061                 UINT32_C(0x10)
9062         /*
9063          * This bit must be '1' for the tqm_sp fields to be
9064          * configured.
9065          */
9066         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TQM_SP \
9067                 UINT32_C(0x20)
9068         /*
9069          * This bit must be '1' for the tqm_ring0 fields to be
9070          * configured.
9071          */
9072         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TQM_RING0 \
9073                 UINT32_C(0x40)
9074         /*
9075          * This bit must be '1' for the tqm_ring1 fields to be
9076          * configured.
9077          */
9078         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TQM_RING1 \
9079                 UINT32_C(0x80)
9080         /*
9081          * This bit must be '1' for the tqm_ring2 fields to be
9082          * configured.
9083          */
9084         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TQM_RING2 \
9085                 UINT32_C(0x100)
9086         /*
9087          * This bit must be '1' for the tqm_ring3 fields to be
9088          * configured.
9089          */
9090         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TQM_RING3 \
9091                 UINT32_C(0x200)
9092         /*
9093          * This bit must be '1' for the tqm_ring4 fields to be
9094          * configured.
9095          */
9096         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TQM_RING4 \
9097                 UINT32_C(0x400)
9098         /*
9099          * This bit must be '1' for the tqm_ring5 fields to be
9100          * configured.
9101          */
9102         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TQM_RING5 \
9103                 UINT32_C(0x800)
9104         /*
9105          * This bit must be '1' for the tqm_ring6 fields to be
9106          * configured.
9107          */
9108         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TQM_RING6 \
9109                 UINT32_C(0x1000)
9110         /*
9111          * This bit must be '1' for the tqm_ring7 fields to be
9112          * configured.
9113          */
9114         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TQM_RING7 \
9115                 UINT32_C(0x2000)
9116         /*
9117          * This bit must be '1' for the mrav fields to be
9118          * configured.
9119          */
9120         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_MRAV \
9121                 UINT32_C(0x4000)
9122         /*
9123          * This bit must be '1' for the tim fields to be
9124          * configured.
9125          */
9126         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_UNUSED_0_TIM \
9127                 UINT32_C(0x8000)
9128         /* QPC page size and level. */
9129         uint8_t qpc_pg_size_qpc_lvl;
9130         /* QPC PBL indirect levels. */
9131         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_LVL_MASK \
9132                 UINT32_C(0xf)
9133         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_LVL_SFT       0
9134         /* PBL pointer is physical start address. */
9135         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_LVL_LVL_0 \
9136                 UINT32_C(0x0)
9137         /* PBL pointer points to PTE table. */
9138         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_LVL_LVL_1 \
9139                 UINT32_C(0x1)
9140         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9141         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_LVL_LVL_2 \
9142                 UINT32_C(0x2)
9143         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_LVL_LAST \
9144                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_LVL_LVL_2
9145         /* QPC page size. */
9146         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_MASK \
9147                 UINT32_C(0xf0)
9148         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_SFT   4
9149         /* 4KB. */
9150         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_PG_4K \
9151                 (UINT32_C(0x0) << 4)
9152         /* 8KB. */
9153         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_PG_8K \
9154                 (UINT32_C(0x1) << 4)
9155         /* 64KB. */
9156         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_PG_64K \
9157                 (UINT32_C(0x2) << 4)
9158         /* 2MB. */
9159         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_PG_2M \
9160                 (UINT32_C(0x3) << 4)
9161         /* 8MB. */
9162         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_PG_8M \
9163                 (UINT32_C(0x4) << 4)
9164         /* 1GB. */
9165         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_PG_1G \
9166                 (UINT32_C(0x5) << 4)
9167         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_LAST \
9168                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_QPC_PG_SIZE_PG_1G
9169         /* SRQ page size and level. */
9170         uint8_t srq_pg_size_srq_lvl;
9171         /* SRQ PBL indirect levels. */
9172         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_LVL_MASK \
9173                 UINT32_C(0xf)
9174         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_LVL_SFT       0
9175         /* PBL pointer is physical start address. */
9176         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_LVL_LVL_0 \
9177                 UINT32_C(0x0)
9178         /* PBL pointer points to PTE table. */
9179         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_LVL_LVL_1 \
9180                 UINT32_C(0x1)
9181         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9182         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_LVL_LVL_2 \
9183                 UINT32_C(0x2)
9184         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_LVL_LAST \
9185                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_LVL_LVL_2
9186         /* SRQ page size. */
9187         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_MASK \
9188                 UINT32_C(0xf0)
9189         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_SFT   4
9190         /* 4KB. */
9191         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_PG_4K \
9192                 (UINT32_C(0x0) << 4)
9193         /* 8KB. */
9194         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_PG_8K \
9195                 (UINT32_C(0x1) << 4)
9196         /* 64KB. */
9197         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_PG_64K \
9198                 (UINT32_C(0x2) << 4)
9199         /* 2MB. */
9200         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_PG_2M \
9201                 (UINT32_C(0x3) << 4)
9202         /* 8MB. */
9203         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_PG_8M \
9204                 (UINT32_C(0x4) << 4)
9205         /* 1GB. */
9206         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_PG_1G \
9207                 (UINT32_C(0x5) << 4)
9208         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_LAST \
9209                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_SRQ_PG_SIZE_PG_1G
9210         /* CQ page size and level. */
9211         uint8_t cq_pg_size_cq_lvl;
9212         /* CQ PBL indirect levels. */
9213         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_LVL_MASK \
9214                 UINT32_C(0xf)
9215         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_LVL_SFT       0
9216         /* PBL pointer is physical start address. */
9217         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_LVL_LVL_0 \
9218                 UINT32_C(0x0)
9219         /* PBL pointer points to PTE table. */
9220         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_LVL_LVL_1 \
9221                 UINT32_C(0x1)
9222         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9223         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_LVL_LVL_2 \
9224                 UINT32_C(0x2)
9225         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_LVL_LAST \
9226                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_LVL_LVL_2
9227         /* CQ page size. */
9228         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_MASK \
9229                 UINT32_C(0xf0)
9230         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_SFT   4
9231         /* 4KB. */
9232         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_PG_4K \
9233                 (UINT32_C(0x0) << 4)
9234         /* 8KB. */
9235         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_PG_8K \
9236                 (UINT32_C(0x1) << 4)
9237         /* 64KB. */
9238         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_PG_64K \
9239                 (UINT32_C(0x2) << 4)
9240         /* 2MB. */
9241         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_PG_2M \
9242                 (UINT32_C(0x3) << 4)
9243         /* 8MB. */
9244         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_PG_8M \
9245                 (UINT32_C(0x4) << 4)
9246         /* 1GB. */
9247         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_PG_1G \
9248                 (UINT32_C(0x5) << 4)
9249         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_LAST \
9250                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_CQ_PG_SIZE_PG_1G
9251         /* VNIC page size and level. */
9252         uint8_t vnic_pg_size_vnic_lvl;
9253         /* VNIC PBL indirect levels. */
9254         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_LVL_MASK \
9255                 UINT32_C(0xf)
9256         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_LVL_SFT       0
9257         /* PBL pointer is physical start address. */
9258         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_LVL_LVL_0 \
9259                 UINT32_C(0x0)
9260         /* PBL pointer points to PTE table. */
9261         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_LVL_LVL_1 \
9262                 UINT32_C(0x1)
9263         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9264         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_LVL_LVL_2 \
9265                 UINT32_C(0x2)
9266         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_LVL_LAST \
9267                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_LVL_LVL_2
9268         /* VNIC page size. */
9269         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_MASK \
9270                 UINT32_C(0xf0)
9271         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_SFT   4
9272         /* 4KB. */
9273         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_PG_4K \
9274                 (UINT32_C(0x0) << 4)
9275         /* 8KB. */
9276         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_PG_8K \
9277                 (UINT32_C(0x1) << 4)
9278         /* 64KB. */
9279         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_PG_64K \
9280                 (UINT32_C(0x2) << 4)
9281         /* 2MB. */
9282         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_PG_2M \
9283                 (UINT32_C(0x3) << 4)
9284         /* 8MB. */
9285         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_PG_8M \
9286                 (UINT32_C(0x4) << 4)
9287         /* 1GB. */
9288         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_PG_1G \
9289                 (UINT32_C(0x5) << 4)
9290         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_LAST \
9291                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_VNIC_PG_SIZE_PG_1G
9292         /* Stat page size and level. */
9293         uint8_t stat_pg_size_stat_lvl;
9294         /* Stat PBL indirect levels. */
9295         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_LVL_MASK \
9296                 UINT32_C(0xf)
9297         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_LVL_SFT       0
9298         /* PBL pointer is physical start address. */
9299         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_LVL_LVL_0 \
9300                 UINT32_C(0x0)
9301         /* PBL pointer points to PTE table. */
9302         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_LVL_LVL_1 \
9303                 UINT32_C(0x1)
9304         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9305         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_LVL_LVL_2 \
9306                 UINT32_C(0x2)
9307         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_LVL_LAST \
9308                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_LVL_LVL_2
9309         /* Stat page size. */
9310         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_MASK \
9311                 UINT32_C(0xf0)
9312         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_SFT   4
9313         /* 4KB. */
9314         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_PG_4K \
9315                 (UINT32_C(0x0) << 4)
9316         /* 8KB. */
9317         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_PG_8K \
9318                 (UINT32_C(0x1) << 4)
9319         /* 64KB. */
9320         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_PG_64K \
9321                 (UINT32_C(0x2) << 4)
9322         /* 2MB. */
9323         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_PG_2M \
9324                 (UINT32_C(0x3) << 4)
9325         /* 8MB. */
9326         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_PG_8M \
9327                 (UINT32_C(0x4) << 4)
9328         /* 1GB. */
9329         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_PG_1G \
9330                 (UINT32_C(0x5) << 4)
9331         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_LAST \
9332                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_STAT_PG_SIZE_PG_1G
9333         /* TQM slow path page size and level. */
9334         uint8_t tqm_sp_pg_size_tqm_sp_lvl;
9335         /* TQM slow path PBL indirect levels. */
9336         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_LVL_MASK \
9337                 UINT32_C(0xf)
9338         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_LVL_SFT       0
9339         /* PBL pointer is physical start address. */
9340         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_LVL_LVL_0 \
9341                 UINT32_C(0x0)
9342         /* PBL pointer points to PTE table. */
9343         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_LVL_LVL_1 \
9344                 UINT32_C(0x1)
9345         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9346         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_LVL_LVL_2 \
9347                 UINT32_C(0x2)
9348         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_LVL_LAST \
9349                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_LVL_LVL_2
9350         /* TQM slow path page size. */
9351         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_MASK \
9352                 UINT32_C(0xf0)
9353         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_SFT   4
9354         /* 4KB. */
9355         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_PG_4K \
9356                 (UINT32_C(0x0) << 4)
9357         /* 8KB. */
9358         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_PG_8K \
9359                 (UINT32_C(0x1) << 4)
9360         /* 64KB. */
9361         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_PG_64K \
9362                 (UINT32_C(0x2) << 4)
9363         /* 2MB. */
9364         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_PG_2M \
9365                 (UINT32_C(0x3) << 4)
9366         /* 8MB. */
9367         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_PG_8M \
9368                 (UINT32_C(0x4) << 4)
9369         /* 1GB. */
9370         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_PG_1G \
9371                 (UINT32_C(0x5) << 4)
9372         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_LAST \
9373                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_SP_PG_SIZE_PG_1G
9374         /* TQM ring 0 page size and level. */
9375         uint8_t tqm_ring0_pg_size_tqm_ring0_lvl;
9376         /* TQM ring 0 PBL indirect levels. */
9377         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_LVL_MASK \
9378                 UINT32_C(0xf)
9379         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_LVL_SFT       0
9380         /* PBL pointer is physical start address. */
9381         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_LVL_LVL_0 \
9382                 UINT32_C(0x0)
9383         /* PBL pointer points to PTE table. */
9384         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_LVL_LVL_1 \
9385                 UINT32_C(0x1)
9386         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9387         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_LVL_LVL_2 \
9388                 UINT32_C(0x2)
9389         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_LVL_LAST \
9390                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_LVL_LVL_2
9391         /* TQM ring 0 page size. */
9392         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_MASK \
9393                 UINT32_C(0xf0)
9394         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_SFT   4
9395         /* 4KB. */
9396         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_PG_4K \
9397                 (UINT32_C(0x0) << 4)
9398         /* 8KB. */
9399         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_PG_8K \
9400                 (UINT32_C(0x1) << 4)
9401         /* 64KB. */
9402         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_PG_64K \
9403                 (UINT32_C(0x2) << 4)
9404         /* 2MB. */
9405         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_PG_2M \
9406                 (UINT32_C(0x3) << 4)
9407         /* 8MB. */
9408         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_PG_8M \
9409                 (UINT32_C(0x4) << 4)
9410         /* 1GB. */
9411         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_PG_1G \
9412                 (UINT32_C(0x5) << 4)
9413         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_LAST \
9414                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING0_PG_SIZE_PG_1G
9415         /* TQM ring 1 page size and level. */
9416         uint8_t tqm_ring1_pg_size_tqm_ring1_lvl;
9417         /* TQM ring 1 PBL indirect levels. */
9418         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_LVL_MASK \
9419                 UINT32_C(0xf)
9420         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_LVL_SFT       0
9421         /* PBL pointer is physical start address. */
9422         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_LVL_LVL_0 \
9423                 UINT32_C(0x0)
9424         /* PBL pointer points to PTE table. */
9425         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_LVL_LVL_1 \
9426                 UINT32_C(0x1)
9427         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9428         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_LVL_LVL_2 \
9429                 UINT32_C(0x2)
9430         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_LVL_LAST \
9431                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_LVL_LVL_2
9432         /* TQM ring 1 page size. */
9433         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_MASK \
9434                 UINT32_C(0xf0)
9435         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_SFT   4
9436         /* 4KB. */
9437         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_PG_4K \
9438                 (UINT32_C(0x0) << 4)
9439         /* 8KB. */
9440         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_PG_8K \
9441                 (UINT32_C(0x1) << 4)
9442         /* 64KB. */
9443         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_PG_64K \
9444                 (UINT32_C(0x2) << 4)
9445         /* 2MB. */
9446         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_PG_2M \
9447                 (UINT32_C(0x3) << 4)
9448         /* 8MB. */
9449         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_PG_8M \
9450                 (UINT32_C(0x4) << 4)
9451         /* 1GB. */
9452         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_PG_1G \
9453                 (UINT32_C(0x5) << 4)
9454         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_LAST \
9455                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING1_PG_SIZE_PG_1G
9456         /* TQM ring 2 page size and level. */
9457         uint8_t tqm_ring2_pg_size_tqm_ring2_lvl;
9458         /* TQM ring 2 PBL indirect levels. */
9459         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_LVL_MASK \
9460                 UINT32_C(0xf)
9461         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_LVL_SFT       0
9462         /* PBL pointer is physical start address. */
9463         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_LVL_LVL_0 \
9464                 UINT32_C(0x0)
9465         /* PBL pointer points to PTE table. */
9466         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_LVL_LVL_1 \
9467                 UINT32_C(0x1)
9468         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9469         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_LVL_LVL_2 \
9470                 UINT32_C(0x2)
9471         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_LVL_LAST \
9472                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_LVL_LVL_2
9473         /* TQM ring 2 page size. */
9474         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_MASK \
9475                 UINT32_C(0xf0)
9476         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_SFT   4
9477         /* 4KB. */
9478         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_PG_4K \
9479                 (UINT32_C(0x0) << 4)
9480         /* 8KB. */
9481         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_PG_8K \
9482                 (UINT32_C(0x1) << 4)
9483         /* 64KB. */
9484         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_PG_64K \
9485                 (UINT32_C(0x2) << 4)
9486         /* 2MB. */
9487         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_PG_2M \
9488                 (UINT32_C(0x3) << 4)
9489         /* 8MB. */
9490         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_PG_8M \
9491                 (UINT32_C(0x4) << 4)
9492         /* 1GB. */
9493         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_PG_1G \
9494                 (UINT32_C(0x5) << 4)
9495         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_LAST \
9496                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING2_PG_SIZE_PG_1G
9497         /* TQM ring 3 page size and level. */
9498         uint8_t tqm_ring3_pg_size_tqm_ring3_lvl;
9499         /* TQM ring 3 PBL indirect levels. */
9500         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_LVL_MASK \
9501                 UINT32_C(0xf)
9502         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_LVL_SFT       0
9503         /* PBL pointer is physical start address. */
9504         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_LVL_LVL_0 \
9505                 UINT32_C(0x0)
9506         /* PBL pointer points to PTE table. */
9507         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_LVL_LVL_1 \
9508                 UINT32_C(0x1)
9509         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9510         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_LVL_LVL_2 \
9511                 UINT32_C(0x2)
9512         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_LVL_LAST \
9513                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_LVL_LVL_2
9514         /* TQM ring 3 page size. */
9515         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_MASK \
9516                 UINT32_C(0xf0)
9517         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_SFT   4
9518         /* 4KB. */
9519         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_PG_4K \
9520                 (UINT32_C(0x0) << 4)
9521         /* 8KB. */
9522         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_PG_8K \
9523                 (UINT32_C(0x1) << 4)
9524         /* 64KB. */
9525         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_PG_64K \
9526                 (UINT32_C(0x2) << 4)
9527         /* 2MB. */
9528         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_PG_2M \
9529                 (UINT32_C(0x3) << 4)
9530         /* 8MB. */
9531         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_PG_8M \
9532                 (UINT32_C(0x4) << 4)
9533         /* 1GB. */
9534         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_PG_1G \
9535                 (UINT32_C(0x5) << 4)
9536         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_LAST \
9537                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING3_PG_SIZE_PG_1G
9538         /* TQM ring 4 page size and level. */
9539         uint8_t tqm_ring4_pg_size_tqm_ring4_lvl;
9540         /* TQM ring 4 PBL indirect levels. */
9541         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_LVL_MASK \
9542                 UINT32_C(0xf)
9543         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_LVL_SFT       0
9544         /* PBL pointer is physical start address. */
9545         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_LVL_LVL_0 \
9546                 UINT32_C(0x0)
9547         /* PBL pointer points to PTE table. */
9548         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_LVL_LVL_1 \
9549                 UINT32_C(0x1)
9550         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9551         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_LVL_LVL_2 \
9552                 UINT32_C(0x2)
9553         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_LVL_LAST \
9554                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_LVL_LVL_2
9555         /* TQM ring 4 page size. */
9556         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_MASK \
9557                 UINT32_C(0xf0)
9558         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_SFT   4
9559         /* 4KB. */
9560         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_PG_4K \
9561                 (UINT32_C(0x0) << 4)
9562         /* 8KB. */
9563         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_PG_8K \
9564                 (UINT32_C(0x1) << 4)
9565         /* 64KB. */
9566         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_PG_64K \
9567                 (UINT32_C(0x2) << 4)
9568         /* 2MB. */
9569         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_PG_2M \
9570                 (UINT32_C(0x3) << 4)
9571         /* 8MB. */
9572         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_PG_8M \
9573                 (UINT32_C(0x4) << 4)
9574         /* 1GB. */
9575         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_PG_1G \
9576                 (UINT32_C(0x5) << 4)
9577         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_LAST \
9578                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING4_PG_SIZE_PG_1G
9579         /* TQM ring 5 page size and level. */
9580         uint8_t tqm_ring5_pg_size_tqm_ring5_lvl;
9581         /* TQM ring 5 PBL indirect levels. */
9582         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_LVL_MASK \
9583                 UINT32_C(0xf)
9584         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_LVL_SFT       0
9585         /* PBL pointer is physical start address. */
9586         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_LVL_LVL_0 \
9587                 UINT32_C(0x0)
9588         /* PBL pointer points to PTE table. */
9589         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_LVL_LVL_1 \
9590                 UINT32_C(0x1)
9591         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9592         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_LVL_LVL_2 \
9593                 UINT32_C(0x2)
9594         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_LVL_LAST \
9595                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_LVL_LVL_2
9596         /* TQM ring 5 page size. */
9597         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_MASK \
9598                 UINT32_C(0xf0)
9599         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_SFT   4
9600         /* 4KB. */
9601         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_PG_4K \
9602                 (UINT32_C(0x0) << 4)
9603         /* 8KB. */
9604         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_PG_8K \
9605                 (UINT32_C(0x1) << 4)
9606         /* 64KB. */
9607         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_PG_64K \
9608                 (UINT32_C(0x2) << 4)
9609         /* 2MB. */
9610         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_PG_2M \
9611                 (UINT32_C(0x3) << 4)
9612         /* 8MB. */
9613         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_PG_8M \
9614                 (UINT32_C(0x4) << 4)
9615         /* 1GB. */
9616         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_PG_1G \
9617                 (UINT32_C(0x5) << 4)
9618         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_LAST \
9619                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING5_PG_SIZE_PG_1G
9620         /* TQM ring 6 page size and level. */
9621         uint8_t tqm_ring6_pg_size_tqm_ring6_lvl;
9622         /* TQM ring 6 PBL indirect levels. */
9623         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_LVL_MASK \
9624                 UINT32_C(0xf)
9625         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_LVL_SFT       0
9626         /* PBL pointer is physical start address. */
9627         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_LVL_LVL_0 \
9628                 UINT32_C(0x0)
9629         /* PBL pointer points to PTE table. */
9630         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_LVL_LVL_1 \
9631                 UINT32_C(0x1)
9632         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9633         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_LVL_LVL_2 \
9634                 UINT32_C(0x2)
9635         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_LVL_LAST \
9636                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_LVL_LVL_2
9637         /* TQM ring 6 page size. */
9638         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_MASK \
9639                 UINT32_C(0xf0)
9640         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_SFT   4
9641         /* 4KB. */
9642         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_PG_4K \
9643                 (UINT32_C(0x0) << 4)
9644         /* 8KB. */
9645         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_PG_8K \
9646                 (UINT32_C(0x1) << 4)
9647         /* 64KB. */
9648         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_PG_64K \
9649                 (UINT32_C(0x2) << 4)
9650         /* 2MB. */
9651         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_PG_2M \
9652                 (UINT32_C(0x3) << 4)
9653         /* 8MB. */
9654         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_PG_8M \
9655                 (UINT32_C(0x4) << 4)
9656         /* 1GB. */
9657         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_PG_1G \
9658                 (UINT32_C(0x5) << 4)
9659         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_LAST \
9660                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING6_PG_SIZE_PG_1G
9661         /* TQM ring 7 page size and level. */
9662         uint8_t tqm_ring7_pg_size_tqm_ring7_lvl;
9663         /* TQM ring 7 PBL indirect levels. */
9664         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_LVL_MASK \
9665                 UINT32_C(0xf)
9666         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_LVL_SFT       0
9667         /* PBL pointer is physical start address. */
9668         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_LVL_LVL_0 \
9669                 UINT32_C(0x0)
9670         /* PBL pointer points to PTE table. */
9671         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_LVL_LVL_1 \
9672                 UINT32_C(0x1)
9673         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9674         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_LVL_LVL_2 \
9675                 UINT32_C(0x2)
9676         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_LVL_LAST \
9677                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_LVL_LVL_2
9678         /* TQM ring 7 page size. */
9679         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_MASK \
9680                 UINT32_C(0xf0)
9681         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_SFT   4
9682         /* 4KB. */
9683         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_PG_4K \
9684                 (UINT32_C(0x0) << 4)
9685         /* 8KB. */
9686         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_PG_8K \
9687                 (UINT32_C(0x1) << 4)
9688         /* 64KB. */
9689         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_PG_64K \
9690                 (UINT32_C(0x2) << 4)
9691         /* 2MB. */
9692         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_PG_2M \
9693                 (UINT32_C(0x3) << 4)
9694         /* 8MB. */
9695         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_PG_8M \
9696                 (UINT32_C(0x4) << 4)
9697         /* 1GB. */
9698         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_PG_1G \
9699                 (UINT32_C(0x5) << 4)
9700         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_LAST \
9701                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TQM_RING7_PG_SIZE_PG_1G
9702         /* MR/AV page size and level. */
9703         uint8_t mrav_pg_size_mrav_lvl;
9704         /* MR/AV PBL indirect levels. */
9705         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_LVL_MASK \
9706                 UINT32_C(0xf)
9707         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_LVL_SFT       0
9708         /* PBL pointer is physical start address. */
9709         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_LVL_LVL_0 \
9710                 UINT32_C(0x0)
9711         /* PBL pointer points to PTE table. */
9712         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_LVL_LVL_1 \
9713                 UINT32_C(0x1)
9714         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9715         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_LVL_LVL_2 \
9716                 UINT32_C(0x2)
9717         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_LVL_LAST \
9718                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_LVL_LVL_2
9719         /* MR/AV page size. */
9720         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_MASK \
9721                 UINT32_C(0xf0)
9722         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_SFT   4
9723         /* 4KB. */
9724         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_PG_4K \
9725                 (UINT32_C(0x0) << 4)
9726         /* 8KB. */
9727         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_PG_8K \
9728                 (UINT32_C(0x1) << 4)
9729         /* 64KB. */
9730         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_PG_64K \
9731                 (UINT32_C(0x2) << 4)
9732         /* 2MB. */
9733         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_PG_2M \
9734                 (UINT32_C(0x3) << 4)
9735         /* 8MB. */
9736         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_PG_8M \
9737                 (UINT32_C(0x4) << 4)
9738         /* 1GB. */
9739         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_PG_1G \
9740                 (UINT32_C(0x5) << 4)
9741         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_LAST \
9742                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_MRAV_PG_SIZE_PG_1G
9743         /* Timer page size and level. */
9744         uint8_t tim_pg_size_tim_lvl;
9745         /* Timer PBL indirect levels. */
9746         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_LVL_MASK \
9747                 UINT32_C(0xf)
9748         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_LVL_SFT       0
9749         /* PBL pointer is physical start address. */
9750         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_LVL_LVL_0 \
9751                 UINT32_C(0x0)
9752         /* PBL pointer points to PTE table. */
9753         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_LVL_LVL_1 \
9754                 UINT32_C(0x1)
9755         /* PBL pointer points to PDE table with each entry pointing to PTE tables. */
9756         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_LVL_LVL_2 \
9757                 UINT32_C(0x2)
9758         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_LVL_LAST \
9759                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_LVL_LVL_2
9760         /* Timer page size. */
9761         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_MASK \
9762                 UINT32_C(0xf0)
9763         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_SFT   4
9764         /* 4KB. */
9765         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_PG_4K \
9766                 (UINT32_C(0x0) << 4)
9767         /* 8KB. */
9768         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_PG_8K \
9769                 (UINT32_C(0x1) << 4)
9770         /* 64KB. */
9771         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_PG_64K \
9772                 (UINT32_C(0x2) << 4)
9773         /* 2MB. */
9774         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_PG_2M \
9775                 (UINT32_C(0x3) << 4)
9776         /* 8MB. */
9777         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_PG_8M \
9778                 (UINT32_C(0x4) << 4)
9779         /* 1GB. */
9780         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_PG_1G \
9781                 (UINT32_C(0x5) << 4)
9782         #define HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_LAST \
9783                 HWRM_FUNC_BACKING_STORE_QCFG_OUTPUT_TIM_PG_SIZE_PG_1G
9784         /* QP page directory. */
9785         uint64_t        qpc_page_dir;
9786         /* SRQ page directory. */
9787         uint64_t        srq_page_dir;
9788         /* CQ page directory. */
9789         uint64_t        cq_page_dir;
9790         /* VNIC page directory. */
9791         uint64_t        vnic_page_dir;
9792         /* Stat page directory. */
9793         uint64_t        stat_page_dir;
9794         /* TQM slowpath page directory. */
9795         uint64_t        tqm_sp_page_dir;
9796         /* TQM ring 0 page directory. */
9797         uint64_t        tqm_ring0_page_dir;
9798         /* TQM ring 1 page directory. */
9799         uint64_t        tqm_ring1_page_dir;
9800         /* TQM ring 2 page directory. */
9801         uint64_t        tqm_ring2_page_dir;
9802         /* TQM ring 3 page directory. */
9803         uint64_t        tqm_ring3_page_dir;
9804         /* TQM ring 4 page directory. */
9805         uint64_t        tqm_ring4_page_dir;
9806         /* TQM ring 5 page directory. */
9807         uint64_t        tqm_ring5_page_dir;
9808         /* TQM ring 6 page directory. */
9809         uint64_t        tqm_ring6_page_dir;
9810         /* TQM ring 7 page directory. */
9811         uint64_t        tqm_ring7_page_dir;
9812         /* MR/AV page directory. */
9813         uint64_t        mrav_page_dir;
9814         /* Timer page directory. */
9815         uint64_t        tim_page_dir;
9816         /* Number of entries to reserve for QP1 */
9817         uint16_t        qp_num_qp1_entries;
9818         /* Number of entries to reserve for L2 */
9819         uint16_t        qp_num_l2_entries;
9820         /* Number of QPs. */
9821         uint32_t        qp_num_entries;
9822         /* Number of SRQs. */
9823         uint32_t        srq_num_entries;
9824         /* Number of entries to reserve for L2 */
9825         uint16_t        srq_num_l2_entries;
9826         /* Number of entries to reserve for L2 */
9827         uint16_t        cq_num_l2_entries;
9828         /* Number of CQs. */
9829         uint32_t        cq_num_entries;
9830         /* Number of entries to reserve for VNIC entries */
9831         uint16_t        vnic_num_vnic_entries;
9832         /* Number of entries to reserve for Ring table entries */
9833         uint16_t        vnic_num_ring_table_entries;
9834         /* Number of Stats. */
9835         uint32_t        stat_num_entries;
9836         /* Number of TQM slowpath entries. */
9837         uint32_t        tqm_sp_num_entries;
9838         /* Number of TQM ring 0 entries. */
9839         uint32_t        tqm_ring0_num_entries;
9840         /* Number of TQM ring 1 entries. */
9841         uint32_t        tqm_ring1_num_entries;
9842         /* Number of TQM ring 2 entries. */
9843         uint32_t        tqm_ring2_num_entries;
9844         /* Number of TQM ring 3 entries. */
9845         uint32_t        tqm_ring3_num_entries;
9846         /* Number of TQM ring 4 entries. */
9847         uint32_t        tqm_ring4_num_entries;
9848         /* Number of TQM ring 5 entries. */
9849         uint32_t        tqm_ring5_num_entries;
9850         /* Number of TQM ring 6 entries. */
9851         uint32_t        tqm_ring6_num_entries;
9852         /* Number of TQM ring 7 entries. */
9853         uint32_t        tqm_ring7_num_entries;
9854         /* Number of MR/AV entries. */
9855         uint32_t        mrav_num_entries;
9856         /* Number of Timer entries. */
9857         uint32_t        tim_num_entries;
9858         uint8_t unused_1[7];
9859         /*
9860          * This field is used in Output records to indicate that the output
9861          * is completely written to RAM.  This field should be read as '1'
9862          * to indicate that the output has been completely written.
9863          * When writing a command completion or response to an internal processor,
9864          * the order of writes has to be such that this field is written last.
9865          */
9866         uint8_t valid;
9867 } __attribute__((packed));
9868
9869 /***********************
9870  * hwrm_func_vlan_qcfg *
9871  ***********************/
9872
9873
9874 /* hwrm_func_vlan_qcfg_input (size:192b/24B) */
9875 struct hwrm_func_vlan_qcfg_input {
9876         /* The HWRM command request type. */
9877         uint16_t        req_type;
9878         /*
9879          * The completion ring to send the completion event on. This should
9880          * be the NQ ID returned from the `nq_alloc` HWRM command.
9881          */
9882         uint16_t        cmpl_ring;
9883         /*
9884          * The sequence ID is used by the driver for tracking multiple
9885          * commands. This ID is treated as opaque data by the firmware and
9886          * the value is returned in the `hwrm_resp_hdr` upon completion.
9887          */
9888         uint16_t        seq_id;
9889         /*
9890          * The target ID of the command:
9891          * * 0x0-0xFFF8 - The function ID
9892          * * 0xFFF8-0xFFFE - Reserved for internal processors
9893          * * 0xFFFF - HWRM
9894          */
9895         uint16_t        target_id;
9896         /*
9897          * A physical address pointer pointing to a host buffer that the
9898          * command's response data will be written. This can be either a host
9899          * physical address (HPA) or a guest physical address (GPA) and must
9900          * point to a physically contiguous block of memory.
9901          */
9902         uint64_t        resp_addr;
9903         /*
9904          * Function ID of the function that is being
9905          * configured.
9906          * If set to 0xFF... (All Fs), then the configuration is
9907          * for the requesting function.
9908          */
9909         uint16_t        fid;
9910         uint8_t unused_0[6];
9911 } __attribute__((packed));
9912
9913 /* hwrm_func_vlan_qcfg_output (size:320b/40B) */
9914 struct hwrm_func_vlan_qcfg_output {
9915         /* The specific error status for the command. */
9916         uint16_t        error_code;
9917         /* The HWRM command request type. */
9918         uint16_t        req_type;
9919         /* The sequence ID from the original command. */
9920         uint16_t        seq_id;
9921         /* The length of the response data in number of bytes. */
9922         uint16_t        resp_len;
9923         uint64_t        unused_0;
9924         /* S-TAG VLAN identifier configured for the function. */
9925         uint16_t        stag_vid;
9926         /* S-TAG PCP value configured for the function. */
9927         uint8_t stag_pcp;
9928         uint8_t unused_1;
9929         /*
9930          * S-TAG TPID value configured for the function. This field is specified in
9931          * network byte order.
9932          */
9933         uint16_t        stag_tpid;
9934         /* C-TAG VLAN identifier configured for the function. */
9935         uint16_t        ctag_vid;
9936         /* C-TAG PCP value configured for the function. */
9937         uint8_t ctag_pcp;
9938         uint8_t unused_2;
9939         /*
9940          * C-TAG TPID value configured for the function. This field is specified in
9941          * network byte order.
9942          */
9943         uint16_t        ctag_tpid;
9944         /* Future use. */
9945         uint32_t        rsvd2;
9946         /* Future use. */
9947         uint32_t        rsvd3;
9948         uint8_t unused_3[3];
9949         /*
9950          * This field is used in Output records to indicate that the output
9951          * is completely written to RAM.  This field should be read as '1'
9952          * to indicate that the output has been completely written.
9953          * When writing a command completion or response to an internal processor,
9954          * the order of writes has to be such that this field is written last.
9955          */
9956         uint8_t valid;
9957 } __attribute__((packed));
9958
9959 /**********************
9960  * hwrm_func_vlan_cfg *
9961  **********************/
9962
9963
9964 /* hwrm_func_vlan_cfg_input (size:384b/48B) */
9965 struct hwrm_func_vlan_cfg_input {
9966         /* The HWRM command request type. */
9967         uint16_t        req_type;
9968         /*
9969          * The completion ring to send the completion event on. This should
9970          * be the NQ ID returned from the `nq_alloc` HWRM command.
9971          */
9972         uint16_t        cmpl_ring;
9973         /*
9974          * The sequence ID is used by the driver for tracking multiple
9975          * commands. This ID is treated as opaque data by the firmware and
9976          * the value is returned in the `hwrm_resp_hdr` upon completion.
9977          */
9978         uint16_t        seq_id;
9979         /*
9980          * The target ID of the command:
9981          * * 0x0-0xFFF8 - The function ID
9982          * * 0xFFF8-0xFFFE - Reserved for internal processors
9983          * * 0xFFFF - HWRM
9984          */
9985         uint16_t        target_id;
9986         /*
9987          * A physical address pointer pointing to a host buffer that the
9988          * command's response data will be written. This can be either a host
9989          * physical address (HPA) or a guest physical address (GPA) and must
9990          * point to a physically contiguous block of memory.
9991          */
9992         uint64_t        resp_addr;
9993         /*
9994          * Function ID of the function that is being
9995          * configured.
9996          * If set to 0xFF... (All Fs), then the configuration is
9997          * for the requesting function.
9998          */
9999         uint16_t        fid;
10000         uint8_t unused_0[2];
10001         uint32_t        enables;
10002         /*
10003          * This bit must be '1' for the stag_vid field to be
10004          * configured.
10005          */
10006         #define HWRM_FUNC_VLAN_CFG_INPUT_ENABLES_STAG_VID      UINT32_C(0x1)
10007         /*
10008          * This bit must be '1' for the ctag_vid field to be
10009          * configured.
10010          */
10011         #define HWRM_FUNC_VLAN_CFG_INPUT_ENABLES_CTAG_VID      UINT32_C(0x2)
10012         /*
10013          * This bit must be '1' for the stag_pcp field to be
10014          * configured.
10015          */
10016         #define HWRM_FUNC_VLAN_CFG_INPUT_ENABLES_STAG_PCP      UINT32_C(0x4)
10017         /*
10018          * This bit must be '1' for the ctag_pcp field to be
10019          * configured.
10020          */
10021         #define HWRM_FUNC_VLAN_CFG_INPUT_ENABLES_CTAG_PCP      UINT32_C(0x8)
10022         /*
10023          * This bit must be '1' for the stag_tpid field to be
10024          * configured.
10025          */
10026         #define HWRM_FUNC_VLAN_CFG_INPUT_ENABLES_STAG_TPID     UINT32_C(0x10)
10027         /*
10028          * This bit must be '1' for the ctag_tpid field to be
10029          * configured.
10030          */
10031         #define HWRM_FUNC_VLAN_CFG_INPUT_ENABLES_CTAG_TPID     UINT32_C(0x20)
10032         /* S-TAG VLAN identifier configured for the function. */
10033         uint16_t        stag_vid;
10034         /* S-TAG PCP value configured for the function. */
10035         uint8_t stag_pcp;
10036         uint8_t unused_1;
10037         /*
10038          * S-TAG TPID value configured for the function. This field is specified in
10039          * network byte order.
10040          */
10041         uint16_t        stag_tpid;
10042         /* C-TAG VLAN identifier configured for the function. */
10043         uint16_t        ctag_vid;
10044         /* C-TAG PCP value configured for the function. */
10045         uint8_t ctag_pcp;
10046         uint8_t unused_2;
10047         /*
10048          * C-TAG TPID value configured for the function. This field is specified in
10049          * network byte order.
10050          */
10051         uint16_t        ctag_tpid;
10052         /* Future use. */
10053         uint32_t        rsvd1;
10054         /* Future use. */
10055         uint32_t        rsvd2;
10056         uint8_t unused_3[4];
10057 } __attribute__((packed));
10058
10059 /* hwrm_func_vlan_cfg_output (size:128b/16B) */
10060 struct hwrm_func_vlan_cfg_output {
10061         /* The specific error status for the command. */
10062         uint16_t        error_code;
10063         /* The HWRM command request type. */
10064         uint16_t        req_type;
10065         /* The sequence ID from the original command. */
10066         uint16_t        seq_id;
10067         /* The length of the response data in number of bytes. */
10068         uint16_t        resp_len;
10069         uint8_t unused_0[7];
10070         /*
10071          * This field is used in Output records to indicate that the output
10072          * is completely written to RAM.  This field should be read as '1'
10073          * to indicate that the output has been completely written.
10074          * When writing a command completion or response to an internal processor,
10075          * the order of writes has to be such that this field is written last.
10076          */
10077         uint8_t valid;
10078 } __attribute__((packed));
10079
10080 /*******************************
10081  * hwrm_func_vf_vnic_ids_query *
10082  *******************************/
10083
10084
10085 /* hwrm_func_vf_vnic_ids_query_input (size:256b/32B) */
10086 struct hwrm_func_vf_vnic_ids_query_input {
10087         /* The HWRM command request type. */
10088         uint16_t        req_type;
10089         /*
10090          * The completion ring to send the completion event on. This should
10091          * be the NQ ID returned from the `nq_alloc` HWRM command.
10092          */
10093         uint16_t        cmpl_ring;
10094         /*
10095          * The sequence ID is used by the driver for tracking multiple
10096          * commands. This ID is treated as opaque data by the firmware and
10097          * the value is returned in the `hwrm_resp_hdr` upon completion.
10098          */
10099         uint16_t        seq_id;
10100         /*
10101          * The target ID of the command:
10102          * * 0x0-0xFFF8 - The function ID
10103          * * 0xFFF8-0xFFFE - Reserved for internal processors
10104          * * 0xFFFF - HWRM
10105          */
10106         uint16_t        target_id;
10107         /*
10108          * A physical address pointer pointing to a host buffer that the
10109          * command's response data will be written. This can be either a host
10110          * physical address (HPA) or a guest physical address (GPA) and must
10111          * point to a physically contiguous block of memory.
10112          */
10113         uint64_t        resp_addr;
10114         /*
10115          * This value is used to identify a Virtual Function (VF).
10116          * The scope of VF ID is local within a PF.
10117          */
10118         uint16_t        vf_id;
10119         uint8_t unused_0[2];
10120         /* Max number of vnic ids in vnic id table */
10121         uint32_t        max_vnic_id_cnt;
10122         /* This is the address for VF VNIC ID table */
10123         uint64_t        vnic_id_tbl_addr;
10124 } __attribute__((packed));
10125
10126 /* hwrm_func_vf_vnic_ids_query_output (size:128b/16B) */
10127 struct hwrm_func_vf_vnic_ids_query_output {
10128         /* The specific error status for the command. */
10129         uint16_t        error_code;
10130         /* The HWRM command request type. */
10131         uint16_t        req_type;
10132         /* The sequence ID from the original command. */
10133         uint16_t        seq_id;
10134         /* The length of the response data in number of bytes. */
10135         uint16_t        resp_len;
10136         /*
10137          * Actual number of vnic ids
10138          *
10139          * Each VNIC ID is written as a 32-bit number.
10140          */
10141         uint32_t        vnic_id_cnt;
10142         uint8_t unused_0[3];
10143         /*
10144          * This field is used in Output records to indicate that the output
10145          * is completely written to RAM.  This field should be read as '1'
10146          * to indicate that the output has been completely written.
10147          * When writing a command completion or response to an internal processor,
10148          * the order of writes has to be such that this field is written last.
10149          */
10150         uint8_t valid;
10151 } __attribute__((packed));
10152
10153 /***********************
10154  * hwrm_func_vf_bw_cfg *
10155  ***********************/
10156
10157
10158 /* hwrm_func_vf_bw_cfg_input (size:960b/120B) */
10159 struct hwrm_func_vf_bw_cfg_input {
10160         /* The HWRM command request type. */
10161         uint16_t        req_type;
10162         /*
10163          * The completion ring to send the completion event on. This should
10164          * be the NQ ID returned from the `nq_alloc` HWRM command.
10165          */
10166         uint16_t        cmpl_ring;
10167         /*
10168          * The sequence ID is used by the driver for tracking multiple
10169          * commands. This ID is treated as opaque data by the firmware and
10170          * the value is returned in the `hwrm_resp_hdr` upon completion.
10171          */
10172         uint16_t        seq_id;
10173         /*
10174          * The target ID of the command:
10175          * * 0x0-0xFFF8 - The function ID
10176          * * 0xFFF8-0xFFFE - Reserved for internal processors
10177          * * 0xFFFF - HWRM
10178          */
10179         uint16_t        target_id;
10180         /*
10181          * A physical address pointer pointing to a host buffer that the
10182          * command's response data will be written. This can be either a host
10183          * physical address (HPA) or a guest physical address (GPA) and must
10184          * point to a physically contiguous block of memory.
10185          */
10186         uint64_t        resp_addr;
10187         /*
10188          * The number of VF functions that are being configured.
10189          * The cmd space allows up to 50 VFs' BW to be configured with one cmd.
10190          */
10191         uint16_t        num_vfs;
10192         uint16_t        unused[3];
10193         /* These 16-bit fields contain the VF fid and the rate scale percentage. */
10194         uint16_t        vfn[48];
10195         /* The physical VF id the adjustment will be made to. */
10196         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_VFID_MASK     UINT32_C(0xfff)
10197         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_VFID_SFT      0
10198         /*
10199          * This field configures the rate scale percentage of the VF as specified
10200          * by the physical VF id.
10201          */
10202         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_MASK     UINT32_C(0xf000)
10203         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_SFT      12
10204         /* 0% of the max tx rate */
10205         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_0 \
10206                 (UINT32_C(0x0) << 12)
10207         /* 6.66% of the max tx rate */
10208         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_6_66 \
10209                 (UINT32_C(0x1) << 12)
10210         /* 13.33% of the max tx rate */
10211         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_13_33 \
10212                 (UINT32_C(0x2) << 12)
10213         /* 20% of the max tx rate */
10214         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_20 \
10215                 (UINT32_C(0x3) << 12)
10216         /* 26.66% of the max tx rate */
10217         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_26_66 \
10218                 (UINT32_C(0x4) << 12)
10219         /* 33% of the max tx rate */
10220         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_33_33 \
10221                 (UINT32_C(0x5) << 12)
10222         /* 40% of the max tx rate */
10223         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_40 \
10224                 (UINT32_C(0x6) << 12)
10225         /* 46.66% of the max tx rate */
10226         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_46_66 \
10227                 (UINT32_C(0x7) << 12)
10228         /* 53.33% of the max tx rate */
10229         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_53_33 \
10230                 (UINT32_C(0x8) << 12)
10231         /* 60% of the max tx rate */
10232         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_60 \
10233                 (UINT32_C(0x9) << 12)
10234         /* 66.66% of the max tx rate */
10235         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_66_66 \
10236                 (UINT32_C(0xa) << 12)
10237         /* 53.33% of the max tx rate */
10238         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_73_33 \
10239                 (UINT32_C(0xb) << 12)
10240         /* 80% of the max tx rate */
10241         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_80 \
10242                 (UINT32_C(0xc) << 12)
10243         /* 86.66% of the max tx rate */
10244         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_86_66 \
10245                 (UINT32_C(0xd) << 12)
10246         /* 93.33% of the max tx rate */
10247         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_93_33 \
10248                 (UINT32_C(0xe) << 12)
10249         /* 100% of the max tx rate */
10250         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_100 \
10251                 (UINT32_C(0xf) << 12)
10252         #define HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_LAST \
10253                 HWRM_FUNC_VF_BW_CFG_INPUT_VFN_RATE_PCT_100
10254 } __attribute__((packed));
10255
10256 /* hwrm_func_vf_bw_cfg_output (size:128b/16B) */
10257 struct hwrm_func_vf_bw_cfg_output {
10258         /* The specific error status for the command. */
10259         uint16_t        error_code;
10260         /* The HWRM command request type. */
10261         uint16_t        req_type;
10262         /* The sequence ID from the original command. */
10263         uint16_t        seq_id;
10264         /* The length of the response data in number of bytes. */
10265         uint16_t        resp_len;
10266         uint8_t unused_0[7];
10267         /*
10268          * This field is used in Output records to indicate that the output
10269          * is completely written to RAM.  This field should be read as '1'
10270          * to indicate that the output has been completely written.
10271          * When writing a command completion or response to an internal processor,
10272          * the order of writes has to be such that this field is written last.
10273          */
10274         uint8_t valid;
10275 } __attribute__((packed));
10276
10277 /************************
10278  * hwrm_func_vf_bw_qcfg *
10279  ************************/
10280
10281
10282 /* hwrm_func_vf_bw_qcfg_input (size:960b/120B) */
10283 struct hwrm_func_vf_bw_qcfg_input {
10284         /* The HWRM command request type. */
10285         uint16_t        req_type;
10286         /*
10287          * The completion ring to send the completion event on. This should
10288          * be the NQ ID returned from the `nq_alloc` HWRM command.
10289          */
10290         uint16_t        cmpl_ring;
10291         /*
10292          * The sequence ID is used by the driver for tracking multiple
10293          * commands. This ID is treated as opaque data by the firmware and
10294          * the value is returned in the `hwrm_resp_hdr` upon completion.
10295          */
10296         uint16_t        seq_id;
10297         /*
10298          * The target ID of the command:
10299          * * 0x0-0xFFF8 - The function ID
10300          * * 0xFFF8-0xFFFE - Reserved for internal processors
10301          * * 0xFFFF - HWRM
10302          */
10303         uint16_t        target_id;
10304         /*
10305          * A physical address pointer pointing to a host buffer that the
10306          * command's response data will be written. This can be either a host
10307          * physical address (HPA) or a guest physical address (GPA) and must
10308          * point to a physically contiguous block of memory.
10309          */
10310         uint64_t        resp_addr;
10311         /*
10312          * The number of VF functions that are being queried.
10313          * The inline response space allows the host to query up to 50 VFs'
10314          * rate scale percentage
10315          */
10316         uint16_t        num_vfs;
10317         uint16_t        unused[3];
10318         /* These 16-bit fields contain the VF fid */
10319         uint16_t        vfn[48];
10320         /* The physical VF id of interest */
10321         #define HWRM_FUNC_VF_BW_QCFG_INPUT_VFN_VFID_MASK UINT32_C(0xfff)
10322         #define HWRM_FUNC_VF_BW_QCFG_INPUT_VFN_VFID_SFT 0
10323 } __attribute__((packed));
10324
10325 /* hwrm_func_vf_bw_qcfg_output (size:960b/120B) */
10326 struct hwrm_func_vf_bw_qcfg_output {
10327         /* The specific error status for the command. */
10328         uint16_t        error_code;
10329         /* The HWRM command request type. */
10330         uint16_t        req_type;
10331         /* The sequence ID from the original command. */
10332         uint16_t        seq_id;
10333         /* The length of the response data in number of bytes. */
10334         uint16_t        resp_len;
10335         /*
10336          * The number of VF functions that are being queried.
10337          * The inline response space allows the host to query up to 50 VFs' rate
10338          * scale percentage
10339          */
10340         uint16_t        num_vfs;
10341         uint16_t        unused[3];
10342         /* These 16-bit fields contain the VF fid and the rate scale percentage. */
10343         uint16_t        vfn[48];
10344         /* The physical VF id the adjustment will be made to. */
10345         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_VFID_MASK     UINT32_C(0xfff)
10346         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_VFID_SFT      0
10347         /*
10348          * This field configures the rate scale percentage of the VF as specified
10349          * by the physical VF id.
10350          */
10351         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_MASK     UINT32_C(0xf000)
10352         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_SFT      12
10353         /* 0% of the max tx rate */
10354         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_0 \
10355                 (UINT32_C(0x0) << 12)
10356         /* 6.66% of the max tx rate */
10357         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_6_66 \
10358                 (UINT32_C(0x1) << 12)
10359         /* 13.33% of the max tx rate */
10360         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_13_33 \
10361                 (UINT32_C(0x2) << 12)
10362         /* 20% of the max tx rate */
10363         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_20 \
10364                 (UINT32_C(0x3) << 12)
10365         /* 26.66% of the max tx rate */
10366         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_26_66 \
10367                 (UINT32_C(0x4) << 12)
10368         /* 33% of the max tx rate */
10369         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_33_33 \
10370                 (UINT32_C(0x5) << 12)
10371         /* 40% of the max tx rate */
10372         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_40 \
10373                 (UINT32_C(0x6) << 12)
10374         /* 46.66% of the max tx rate */
10375         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_46_66 \
10376                 (UINT32_C(0x7) << 12)
10377         /* 53.33% of the max tx rate */
10378         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_53_33 \
10379                 (UINT32_C(0x8) << 12)
10380         /* 60% of the max tx rate */
10381         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_60 \
10382                 (UINT32_C(0x9) << 12)
10383         /* 66.66% of the max tx rate */
10384         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_66_66 \
10385                 (UINT32_C(0xa) << 12)
10386         /* 53.33% of the max tx rate */
10387         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_73_33 \
10388                 (UINT32_C(0xb) << 12)
10389         /* 80% of the max tx rate */
10390         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_80 \
10391                 (UINT32_C(0xc) << 12)
10392         /* 86.66% of the max tx rate */
10393         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_86_66 \
10394                 (UINT32_C(0xd) << 12)
10395         /* 93.33% of the max tx rate */
10396         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_93_33 \
10397                 (UINT32_C(0xe) << 12)
10398         /* 100% of the max tx rate */
10399         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_100 \
10400                 (UINT32_C(0xf) << 12)
10401         #define HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_LAST \
10402                 HWRM_FUNC_VF_BW_QCFG_OUTPUT_VFN_RATE_PCT_100
10403         uint8_t unused_0[7];
10404         /*
10405          * This field is used in Output records to indicate that the output
10406          * is completely written to RAM.  This field should be read as '1'
10407          * to indicate that the output has been completely written.
10408          * When writing a command completion or response to an internal processor,
10409          * the order of writes has to be such that this field is written last.
10410          */
10411         uint8_t valid;
10412 } __attribute__((packed));
10413
10414 /***************************
10415  * hwrm_func_drv_if_change *
10416  ***************************/
10417
10418
10419 /* hwrm_func_drv_if_change_input (size:192b/24B) */
10420 struct hwrm_func_drv_if_change_input {
10421         /* The HWRM command request type. */
10422         uint16_t        req_type;
10423         /*
10424          * The completion ring to send the completion event on. This should
10425          * be the NQ ID returned from the `nq_alloc` HWRM command.
10426          */
10427         uint16_t        cmpl_ring;
10428         /*
10429          * The sequence ID is used by the driver for tracking multiple
10430          * commands. This ID is treated as opaque data by the firmware and
10431          * the value is returned in the `hwrm_resp_hdr` upon completion.
10432          */
10433         uint16_t        seq_id;
10434         /*
10435          * The target ID of the command:
10436          * * 0x0-0xFFF8 - The function ID
10437          * * 0xFFF8-0xFFFE - Reserved for internal processors
10438          * * 0xFFFF - HWRM
10439          */
10440         uint16_t        target_id;
10441         /*
10442          * A physical address pointer pointing to a host buffer that the
10443          * command's response data will be written. This can be either a host
10444          * physical address (HPA) or a guest physical address (GPA) and must
10445          * point to a physically contiguous block of memory.
10446          */
10447         uint64_t        resp_addr;
10448         uint32_t        flags;
10449         /*
10450          * When this bit is '1', the function driver is indicating
10451          * that the IF state is changing to UP state.  The call should
10452          * be made at the beginning of the driver's open call before
10453          * resources are allocated.  After making the call, the driver
10454          * should check the response to see if any resources may have
10455          * changed (see the response below).  If the driver fails
10456          * the open call, the driver should make this call again with
10457          * this bit cleared to indicate that the IF state is not UP.
10458          * During the driver's close call when the IF state is changing
10459          * to DOWN, the driver should make this call with the bit cleared
10460          * after all resources have been freed.
10461          */
10462         #define HWRM_FUNC_DRV_IF_CHANGE_INPUT_FLAGS_UP     UINT32_C(0x1)
10463         uint32_t        unused;
10464 } __attribute__((packed));
10465
10466 /* hwrm_func_drv_if_change_output (size:128b/16B) */
10467 struct hwrm_func_drv_if_change_output {
10468         /* The specific error status for the command. */
10469         uint16_t        error_code;
10470         /* The HWRM command request type. */
10471         uint16_t        req_type;
10472         /* The sequence ID from the original command. */
10473         uint16_t        seq_id;
10474         /* The length of the response data in number of bytes. */
10475         uint16_t        resp_len;
10476         uint32_t        flags;
10477         /*
10478          * When this bit is '1', it indicates that the resources reserved
10479          * for this function may have changed.  The driver should check
10480          * resource capabilities and reserve resources again before
10481          * allocating resources.
10482          */
10483         #define HWRM_FUNC_DRV_IF_CHANGE_OUTPUT_FLAGS_RESC_CHANGE \
10484                 UINT32_C(0x1)
10485         uint8_t unused_0[3];
10486         /*
10487          * This field is used in Output records to indicate that the output
10488          * is completely written to RAM.  This field should be read as '1'
10489          * to indicate that the output has been completely written.
10490          * When writing a command completion or response to an internal processor,
10491          * the order of writes has to be such that this field is written last.
10492          */
10493         uint8_t valid;
10494 } __attribute__((packed));
10495
10496 /*********************
10497  * hwrm_port_phy_cfg *
10498  *********************/
10499
10500
10501 /* hwrm_port_phy_cfg_input (size:448b/56B) */
10502 struct hwrm_port_phy_cfg_input {
10503         /* The HWRM command request type. */
10504         uint16_t        req_type;
10505         /*
10506          * The completion ring to send the completion event on. This should
10507          * be the NQ ID returned from the `nq_alloc` HWRM command.
10508          */
10509         uint16_t        cmpl_ring;
10510         /*
10511          * The sequence ID is used by the driver for tracking multiple
10512          * commands. This ID is treated as opaque data by the firmware and
10513          * the value is returned in the `hwrm_resp_hdr` upon completion.
10514          */
10515         uint16_t        seq_id;
10516         /*
10517          * The target ID of the command:
10518          * * 0x0-0xFFF8 - The function ID
10519          * * 0xFFF8-0xFFFE - Reserved for internal processors
10520          * * 0xFFFF - HWRM
10521          */
10522         uint16_t        target_id;
10523         /*
10524          * A physical address pointer pointing to a host buffer that the
10525          * command's response data will be written. This can be either a host
10526          * physical address (HPA) or a guest physical address (GPA) and must
10527          * point to a physically contiguous block of memory.
10528          */
10529         uint64_t        resp_addr;
10530         uint32_t        flags;
10531         /*
10532          * When this bit is set to '1', the PHY for the port shall
10533          * be reset.
10534          *
10535          * # If this bit is set to 1, then the HWRM shall reset the
10536          * PHY after applying PHY configuration changes specified
10537          * in this command.
10538          * # In order to guarantee that PHY configuration changes
10539          * specified in this command take effect, the HWRM
10540          * client should set this flag to 1.
10541          * # If this bit is not set to 1, then the HWRM may reset
10542          * the PHY depending on the current PHY configuration and
10543          * settings specified in this command.
10544          */
10545         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESET_PHY \
10546                 UINT32_C(0x1)
10547         /* deprecated bit.  Do not use!!! */
10548         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_DEPRECATED \
10549                 UINT32_C(0x2)
10550         /*
10551          * When this bit is set to '1', the link shall be forced to
10552          * the force_link_speed value.
10553          *
10554          * When this bit is set to '1', the HWRM client should
10555          * not enable any of the auto negotiation related
10556          * fields represented by auto_XXX fields in this command.
10557          * When this bit is set to '1' and the HWRM client has
10558          * enabled a auto_XXX field in this command, then the
10559          * HWRM shall ignore the enabled auto_XXX field.
10560          *
10561          * When this bit is set to zero, the link
10562          * shall be allowed to autoneg.
10563          */
10564         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_FORCE \
10565                 UINT32_C(0x4)
10566         /*
10567          * When this bit is set to '1', the auto-negotiation process
10568          * shall be restarted on the link.
10569          */
10570         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESTART_AUTONEG \
10571                 UINT32_C(0x8)
10572         /*
10573          * When this bit is set to '1', Energy Efficient Ethernet
10574          * (EEE) is requested to be enabled on this link.
10575          * If EEE is not supported on this port, then this flag
10576          * shall be ignored by the HWRM.
10577          */
10578         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_EEE_ENABLE \
10579                 UINT32_C(0x10)
10580         /*
10581          * When this bit is set to '1', Energy Efficient Ethernet
10582          * (EEE) is requested to be disabled on this link.
10583          * If EEE is not supported on this port, then this flag
10584          * shall be ignored by the HWRM.
10585          */
10586         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_EEE_DISABLE \
10587                 UINT32_C(0x20)
10588         /*
10589          * When this bit is set to '1' and EEE is enabled on this
10590          * link, then TX LPI is requested to be enabled on the link.
10591          * If EEE is not supported on this port, then this flag
10592          * shall be ignored by the HWRM.
10593          * If EEE is disabled on this port, then this flag shall be
10594          * ignored by the HWRM.
10595          */
10596         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_EEE_TX_LPI_ENABLE \
10597                 UINT32_C(0x40)
10598         /*
10599          * When this bit is set to '1' and EEE is enabled on this
10600          * link, then TX LPI is requested to be disabled on the link.
10601          * If EEE is not supported on this port, then this flag
10602          * shall be ignored by the HWRM.
10603          * If EEE is disabled on this port, then this flag shall be
10604          * ignored by the HWRM.
10605          */
10606         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_EEE_TX_LPI_DISABLE \
10607                 UINT32_C(0x80)
10608         /*
10609          * When set to 1, then the HWRM shall enable FEC autonegotitation
10610          * on this port if supported.
10611          * When set to 0, then this flag shall be ignored.
10612          * If FEC autonegotiation is not supported, then the HWRM shall ignore this
10613          * flag.
10614          */
10615         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_FEC_AUTONEG_ENABLE \
10616                 UINT32_C(0x100)
10617         /*
10618          * When set to 1, then the HWRM shall disable FEC autonegotiation
10619          * on this port if supported.
10620          * When set to 0, then this flag shall be ignored.
10621          * If FEC autonegotiation is not supported, then the HWRM shall ignore this
10622          * flag.
10623          */
10624         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_FEC_AUTONEG_DISABLE \
10625                 UINT32_C(0x200)
10626         /*
10627          * When set to 1, then the HWRM shall enable FEC CLAUSE 74 (Fire Code)
10628          * on this port if supported.
10629          * When set to 0, then this flag shall be ignored.
10630          * If FEC CLAUSE 74 is not supported, then the HWRM shall ignore this
10631          * flag.
10632          */
10633         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_FEC_CLAUSE74_ENABLE \
10634                 UINT32_C(0x400)
10635         /*
10636          * When set to 1, then the HWRM shall disable FEC CLAUSE 74 (Fire Code)
10637          * on this port if supported.
10638          * When set to 0, then this flag shall be ignored.
10639          * If FEC CLAUSE 74 is not supported, then the HWRM shall ignore this
10640          * flag.
10641          */
10642         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_FEC_CLAUSE74_DISABLE \
10643                 UINT32_C(0x800)
10644         /*
10645          * When set to 1, then the HWRM shall enable FEC CLAUSE 91 (Reed Solomon)
10646          * on this port if supported.
10647          * When set to 0, then this flag shall be ignored.
10648          * If FEC CLAUSE 91 is not supported, then the HWRM shall ignore this
10649          * flag.
10650          */
10651         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_FEC_CLAUSE91_ENABLE \
10652                 UINT32_C(0x1000)
10653         /*
10654          * When set to 1, then the HWRM shall disable FEC CLAUSE 91 (Reed Solomon)
10655          * on this port if supported.
10656          * When set to 0, then this flag shall be ignored.
10657          * If FEC CLAUSE 91 is not supported, then the HWRM shall ignore this
10658          * flag.
10659          */
10660         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_FEC_CLAUSE91_DISABLE \
10661                 UINT32_C(0x2000)
10662         /*
10663          * When this bit is set to '1', the link shall be forced to
10664          * be taken down.
10665          *
10666          * # When this bit is set to '1", all other
10667          * command input settings related to the link speed shall
10668          * be ignored.
10669          * Once the link state is forced down, it can be
10670          * explicitly cleared from that state by setting this flag
10671          * to '0'.
10672          * # If this flag is set to '0', then the link shall be
10673          * cleared from forced down state if the link is in forced
10674          * down state.
10675          * There may be conditions (e.g. out-of-band or sideband
10676          * configuration changes for the link) outside the scope
10677          * of the HWRM implementation that may clear forced down
10678          * link state.
10679          */
10680         #define HWRM_PORT_PHY_CFG_INPUT_FLAGS_FORCE_LINK_DWN \
10681                 UINT32_C(0x4000)
10682         uint32_t        enables;
10683         /*
10684          * This bit must be '1' for the auto_mode field to be
10685          * configured.
10686          */
10687         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_MODE \
10688                 UINT32_C(0x1)
10689         /*
10690          * This bit must be '1' for the auto_duplex field to be
10691          * configured.
10692          */
10693         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_DUPLEX \
10694                 UINT32_C(0x2)
10695         /*
10696          * This bit must be '1' for the auto_pause field to be
10697          * configured.
10698          */
10699         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_PAUSE \
10700                 UINT32_C(0x4)
10701         /*
10702          * This bit must be '1' for the auto_link_speed field to be
10703          * configured.
10704          */
10705         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED \
10706                 UINT32_C(0x8)
10707         /*
10708          * This bit must be '1' for the auto_link_speed_mask field to be
10709          * configured.
10710          */
10711         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED_MASK \
10712                 UINT32_C(0x10)
10713         /*
10714          * This bit must be '1' for the wirespeed field to be
10715          * configured.
10716          */
10717         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_WIRESPEED \
10718                 UINT32_C(0x20)
10719         /*
10720          * This bit must be '1' for the lpbk field to be
10721          * configured.
10722          */
10723         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_LPBK \
10724                 UINT32_C(0x40)
10725         /*
10726          * This bit must be '1' for the preemphasis field to be
10727          * configured.
10728          */
10729         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_PREEMPHASIS \
10730                 UINT32_C(0x80)
10731         /*
10732          * This bit must be '1' for the force_pause field to be
10733          * configured.
10734          */
10735         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_FORCE_PAUSE \
10736                 UINT32_C(0x100)
10737         /*
10738          * This bit must be '1' for the eee_link_speed_mask field to be
10739          * configured.
10740          */
10741         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_EEE_LINK_SPEED_MASK \
10742                 UINT32_C(0x200)
10743         /*
10744          * This bit must be '1' for the tx_lpi_timer field to be
10745          * configured.
10746          */
10747         #define HWRM_PORT_PHY_CFG_INPUT_ENABLES_TX_LPI_TIMER \
10748                 UINT32_C(0x400)
10749         /* Port ID of port that is to be configured. */
10750         uint16_t        port_id;
10751         /*
10752          * This is the speed that will be used if the force
10753          * bit is '1'.  If unsupported speed is selected, an error
10754          * will be generated.
10755          */
10756         uint16_t        force_link_speed;
10757         /* 100Mb link speed */
10758         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_100MB UINT32_C(0x1)
10759         /* 1Gb link speed */
10760         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_1GB   UINT32_C(0xa)
10761         /* 2Gb link speed */
10762         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_2GB   UINT32_C(0x14)
10763         /* 25Gb link speed */
10764         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_2_5GB UINT32_C(0x19)
10765         /* 10Gb link speed */
10766         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_10GB  UINT32_C(0x64)
10767         /* 20Mb link speed */
10768         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_20GB  UINT32_C(0xc8)
10769         /* 25Gb link speed */
10770         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_25GB  UINT32_C(0xfa)
10771         /* 40Gb link speed */
10772         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_40GB  UINT32_C(0x190)
10773         /* 50Gb link speed */
10774         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_50GB  UINT32_C(0x1f4)
10775         /* 100Gb link speed */
10776         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_100GB UINT32_C(0x3e8)
10777         /* 10Mb link speed */
10778         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_10MB  UINT32_C(0xffff)
10779         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_LAST \
10780                 HWRM_PORT_PHY_CFG_INPUT_FORCE_LINK_SPEED_10MB
10781         /*
10782          * This value is used to identify what autoneg mode is
10783          * used when the link speed is not being forced.
10784          */
10785         uint8_t auto_mode;
10786         /* Disable autoneg or autoneg disabled. No speeds are selected. */
10787         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_NONE         UINT32_C(0x0)
10788         /* Select all possible speeds for autoneg mode. */
10789         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_ALL_SPEEDS   UINT32_C(0x1)
10790         /*
10791          * Select only the auto_link_speed speed for autoneg mode. This mode has
10792          * been DEPRECATED. An HWRM client should not use this mode.
10793          */
10794         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_ONE_SPEED    UINT32_C(0x2)
10795         /*
10796          * Select the auto_link_speed or any speed below that speed for autoneg.
10797          * This mode has been DEPRECATED. An HWRM client should not use this mode.
10798          */
10799         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_ONE_OR_BELOW UINT32_C(0x3)
10800         /*
10801          * Select the speeds based on the corresponding link speed mask value
10802          * that is provided.
10803          */
10804         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_SPEED_MASK   UINT32_C(0x4)
10805         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_LAST \
10806                 HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_SPEED_MASK
10807         /*
10808          * This is the duplex setting that will be used if the autoneg_mode
10809          * is "one_speed" or "one_or_below".
10810          */
10811         uint8_t auto_duplex;
10812         /* Half Duplex will be requested. */
10813         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_DUPLEX_HALF UINT32_C(0x0)
10814         /* Full duplex will be requested. */
10815         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_DUPLEX_FULL UINT32_C(0x1)
10816         /* Both Half and Full dupex will be requested. */
10817         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_DUPLEX_BOTH UINT32_C(0x2)
10818         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_DUPLEX_LAST \
10819                 HWRM_PORT_PHY_CFG_INPUT_AUTO_DUPLEX_BOTH
10820         /*
10821          * This value is used to configure the pause that will be
10822          * used for autonegotiation.
10823          * Add text on the usage of auto_pause and force_pause.
10824          */
10825         uint8_t auto_pause;
10826         /*
10827          * When this bit is '1', Generation of tx pause messages
10828          * has been requested. Disabled otherwise.
10829          */
10830         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_PAUSE_TX \
10831                 UINT32_C(0x1)
10832         /*
10833          * When this bit is '1', Reception of rx pause messages
10834          * has been requested. Disabled otherwise.
10835          */
10836         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_PAUSE_RX \
10837                 UINT32_C(0x2)
10838         /*
10839          * When set to 1, the advertisement of pause is enabled.
10840          *
10841          * # When the auto_mode is not set to none and this flag is
10842          * set to 1, then the auto_pause bits on this port are being
10843          * advertised and autoneg pause results are being interpreted.
10844          * # When the auto_mode is not set to none and this
10845          * flag is set to 0, the pause is forced as indicated in
10846          * force_pause, and also advertised as auto_pause bits, but
10847          * the autoneg results are not interpreted since the pause
10848          * configuration is being forced.
10849          * # When the auto_mode is set to none and this flag is set to
10850          * 1, auto_pause bits should be ignored and should be set to 0.
10851          */
10852         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_PAUSE_AUTONEG_PAUSE \
10853                 UINT32_C(0x4)
10854         uint8_t unused_0;
10855         /*
10856          * This is the speed that will be used if the autoneg_mode
10857          * is "one_speed" or "one_or_below".  If an unsupported speed
10858          * is selected, an error will be generated.
10859          */
10860         uint16_t        auto_link_speed;
10861         /* 100Mb link speed */
10862         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_100MB UINT32_C(0x1)
10863         /* 1Gb link speed */
10864         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_1GB   UINT32_C(0xa)
10865         /* 2Gb link speed */
10866         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_2GB   UINT32_C(0x14)
10867         /* 25Gb link speed */
10868         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_2_5GB UINT32_C(0x19)
10869         /* 10Gb link speed */
10870         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_10GB  UINT32_C(0x64)
10871         /* 20Mb link speed */
10872         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_20GB  UINT32_C(0xc8)
10873         /* 25Gb link speed */
10874         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_25GB  UINT32_C(0xfa)
10875         /* 40Gb link speed */
10876         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_40GB  UINT32_C(0x190)
10877         /* 50Gb link speed */
10878         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_50GB  UINT32_C(0x1f4)
10879         /* 100Gb link speed */
10880         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_100GB UINT32_C(0x3e8)
10881         /* 10Mb link speed */
10882         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_10MB  UINT32_C(0xffff)
10883         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_LAST \
10884                 HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_10MB
10885         /*
10886          * This is a mask of link speeds that will be used if
10887          * autoneg_mode is "mask".  If unsupported speed is enabled
10888          * an error will be generated.
10889          */
10890         uint16_t        auto_link_speed_mask;
10891         /* 100Mb link speed (Half-duplex) */
10892         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_100MBHD \
10893                 UINT32_C(0x1)
10894         /* 100Mb link speed (Full-duplex) */
10895         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_100MB \
10896                 UINT32_C(0x2)
10897         /* 1Gb link speed (Half-duplex) */
10898         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_1GBHD \
10899                 UINT32_C(0x4)
10900         /* 1Gb link speed (Full-duplex) */
10901         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_1GB \
10902                 UINT32_C(0x8)
10903         /* 2Gb link speed */
10904         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_2GB \
10905                 UINT32_C(0x10)
10906         /* 25Gb link speed */
10907         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_2_5GB \
10908                 UINT32_C(0x20)
10909         /* 10Gb link speed */
10910         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_10GB \
10911                 UINT32_C(0x40)
10912         /* 20Gb link speed */
10913         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_20GB \
10914                 UINT32_C(0x80)
10915         /* 25Gb link speed */
10916         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_25GB \
10917                 UINT32_C(0x100)
10918         /* 40Gb link speed */
10919         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_40GB \
10920                 UINT32_C(0x200)
10921         /* 50Gb link speed */
10922         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_50GB \
10923                 UINT32_C(0x400)
10924         /* 100Gb link speed */
10925         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_100GB \
10926                 UINT32_C(0x800)
10927         /* 10Mb link speed (Half-duplex) */
10928         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_10MBHD \
10929                 UINT32_C(0x1000)
10930         /* 10Mb link speed (Full-duplex) */
10931         #define HWRM_PORT_PHY_CFG_INPUT_AUTO_LINK_SPEED_MASK_10MB \
10932                 UINT32_C(0x2000)
10933         /* This value controls the wirespeed feature. */
10934         uint8_t wirespeed;
10935         /* Wirespeed feature is disabled. */
10936         #define HWRM_PORT_PHY_CFG_INPUT_WIRESPEED_OFF UINT32_C(0x0)
10937         /* Wirespeed feature is enabled. */
10938         #define HWRM_PORT_PHY_CFG_INPUT_WIRESPEED_ON  UINT32_C(0x1)
10939         #define HWRM_PORT_PHY_CFG_INPUT_WIRESPEED_LAST \
10940                 HWRM_PORT_PHY_CFG_INPUT_WIRESPEED_ON
10941         /* This value controls the loopback setting for the PHY. */
10942         uint8_t lpbk;
10943         /* No loopback is selected.  Normal operation. */
10944         #define HWRM_PORT_PHY_CFG_INPUT_LPBK_NONE     UINT32_C(0x0)
10945         /*
10946          * The HW will be configured with local loopback such that
10947          * host data is sent back to the host without modification.
10948          */
10949         #define HWRM_PORT_PHY_CFG_INPUT_LPBK_LOCAL    UINT32_C(0x1)
10950         /*
10951          * The HW will be configured with remote loopback such that
10952          * port logic will send packets back out the transmitter that
10953          * are received.
10954          */
10955         #define HWRM_PORT_PHY_CFG_INPUT_LPBK_REMOTE   UINT32_C(0x2)
10956         /*
10957          * The HW will be configured with external loopback such that
10958          * host data is sent on the trasmitter and based on the external
10959          * loopback connection the data will be received without modification.
10960          */
10961         #define HWRM_PORT_PHY_CFG_INPUT_LPBK_EXTERNAL UINT32_C(0x3)
10962         #define HWRM_PORT_PHY_CFG_INPUT_LPBK_LAST \
10963                 HWRM_PORT_PHY_CFG_INPUT_LPBK_EXTERNAL
10964         /*
10965          * This value is used to configure the pause that will be
10966          * used for force mode.
10967          */
10968         uint8_t force_pause;
10969         /*
10970          * When this bit is '1', Generation of tx pause messages
10971          * is supported. Disabled otherwise.
10972          */
10973         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_PAUSE_TX     UINT32_C(0x1)
10974         /*
10975          * When this bit is '1', Reception of rx pause messages
10976          * is supported. Disabled otherwise.
10977          */
10978         #define HWRM_PORT_PHY_CFG_INPUT_FORCE_PAUSE_RX     UINT32_C(0x2)
10979         uint8_t unused_1;
10980         /*
10981          * This value controls the pre-emphasis to be used for the
10982          * link.  Driver should not set this value (use
10983          * enable.preemphasis = 0) unless driver is sure of setting.
10984          * Normally HWRM FW will determine proper pre-emphasis.
10985          */
10986         uint32_t        preemphasis;
10987         /*
10988          * Setting for link speed mask that is used to
10989          * advertise speeds during autonegotiation when EEE is enabled.
10990          * This field is valid only when EEE is enabled.
10991          * The speeds specified in this field shall be a subset of
10992          * speeds specified in auto_link_speed_mask.
10993          * If EEE is enabled,then at least one speed shall be provided
10994          * in this mask.
10995          */
10996         uint16_t        eee_link_speed_mask;
10997         /* Reserved */
10998         #define HWRM_PORT_PHY_CFG_INPUT_EEE_LINK_SPEED_MASK_RSVD1 \
10999                 UINT32_C(0x1)
11000         /* 100Mb link speed (Full-duplex) */
11001         #define HWRM_PORT_PHY_CFG_INPUT_EEE_LINK_SPEED_MASK_100MB \
11002                 UINT32_C(0x2)
11003         /* Reserved */
11004         #define HWRM_PORT_PHY_CFG_INPUT_EEE_LINK_SPEED_MASK_RSVD2 \
11005                 UINT32_C(0x4)
11006         /* 1Gb link speed (Full-duplex) */
11007         #define HWRM_PORT_PHY_CFG_INPUT_EEE_LINK_SPEED_MASK_1GB \
11008                 UINT32_C(0x8)
11009         /* Reserved */
11010         #define HWRM_PORT_PHY_CFG_INPUT_EEE_LINK_SPEED_MASK_RSVD3 \
11011                 UINT32_C(0x10)
11012         /* Reserved */
11013         #define HWRM_PORT_PHY_CFG_INPUT_EEE_LINK_SPEED_MASK_RSVD4 \
11014                 UINT32_C(0x20)
11015         /* 10Gb link speed */
11016         #define HWRM_PORT_PHY_CFG_INPUT_EEE_LINK_SPEED_MASK_10GB \
11017                 UINT32_C(0x40)
11018         uint8_t unused_2[2];
11019         /*
11020          * Reuested setting of TX LPI timer in microseconds.
11021          * This field is valid only when EEE is enabled and TX LPI is
11022          * enabled.
11023          */
11024         uint32_t        tx_lpi_timer;
11025         #define HWRM_PORT_PHY_CFG_INPUT_TX_LPI_TIMER_MASK UINT32_C(0xffffff)
11026         #define HWRM_PORT_PHY_CFG_INPUT_TX_LPI_TIMER_SFT 0
11027         uint32_t        unused_3;
11028 } __attribute__((packed));
11029
11030 /* hwrm_port_phy_cfg_output (size:128b/16B) */
11031 struct hwrm_port_phy_cfg_output {
11032         /* The specific error status for the command. */
11033         uint16_t        error_code;
11034         /* The HWRM command request type. */
11035         uint16_t        req_type;
11036         /* The sequence ID from the original command. */
11037         uint16_t        seq_id;
11038         /* The length of the response data in number of bytes. */
11039         uint16_t        resp_len;
11040         uint8_t unused_0[7];
11041         /*
11042          * This field is used in Output records to indicate that the output
11043          * is completely written to RAM.  This field should be read as '1'
11044          * to indicate that the output has been completely written.
11045          * When writing a command completion or response to an internal processor,
11046          * the order of writes has to be such that this field is written last.
11047          */
11048         uint8_t valid;
11049 } __attribute__((packed));
11050
11051 /* hwrm_port_phy_cfg_cmd_err (size:64b/8B) */
11052 struct hwrm_port_phy_cfg_cmd_err {
11053         /*
11054          * command specific error codes that goes to
11055          * the cmd_err field in Common HWRM Error Response.
11056          */
11057         uint8_t code;
11058         /* Unknown error */
11059         #define HWRM_PORT_PHY_CFG_CMD_ERR_CODE_UNKNOWN       UINT32_C(0x0)
11060         /* Unable to complete operation due to invalid speed */
11061         #define HWRM_PORT_PHY_CFG_CMD_ERR_CODE_ILLEGAL_SPEED UINT32_C(0x1)
11062         /*
11063          * retry the command since the phy is not ready.
11064          * retry count is returned in opaque_0.
11065          * This is only valid for the first command and
11066          * this value will not change for successive calls.
11067          * but if a 0 is returned at any time then this should
11068          * be treated as an un recoverable failure,
11069          *
11070          * retry interval in milli seconds is returned in opaque_1.
11071          * This specifies the time that user should wait before
11072          * issuing the next port_phy_cfg command.
11073          */
11074         #define HWRM_PORT_PHY_CFG_CMD_ERR_CODE_RETRY         UINT32_C(0x2)
11075         #define HWRM_PORT_PHY_CFG_CMD_ERR_CODE_LAST \
11076                 HWRM_PORT_PHY_CFG_CMD_ERR_CODE_RETRY
11077         uint8_t unused_0[7];
11078 } __attribute__((packed));
11079
11080 /**********************
11081  * hwrm_port_phy_qcfg *
11082  **********************/
11083
11084
11085 /* hwrm_port_phy_qcfg_input (size:192b/24B) */
11086 struct hwrm_port_phy_qcfg_input {
11087         /* The HWRM command request type. */
11088         uint16_t        req_type;
11089         /*
11090          * The completion ring to send the completion event on. This should
11091          * be the NQ ID returned from the `nq_alloc` HWRM command.
11092          */
11093         uint16_t        cmpl_ring;
11094         /*
11095          * The sequence ID is used by the driver for tracking multiple
11096          * commands. This ID is treated as opaque data by the firmware and
11097          * the value is returned in the `hwrm_resp_hdr` upon completion.
11098          */
11099         uint16_t        seq_id;
11100         /*
11101          * The target ID of the command:
11102          * * 0x0-0xFFF8 - The function ID
11103          * * 0xFFF8-0xFFFE - Reserved for internal processors
11104          * * 0xFFFF - HWRM
11105          */
11106         uint16_t        target_id;
11107         /*
11108          * A physical address pointer pointing to a host buffer that the
11109          * command's response data will be written. This can be either a host
11110          * physical address (HPA) or a guest physical address (GPA) and must
11111          * point to a physically contiguous block of memory.
11112          */
11113         uint64_t        resp_addr;
11114         /* Port ID of port that is to be queried. */
11115         uint16_t        port_id;
11116         uint8_t unused_0[6];
11117 } __attribute__((packed));
11118
11119 /* hwrm_port_phy_qcfg_output (size:768b/96B) */
11120 struct hwrm_port_phy_qcfg_output {
11121         /* The specific error status for the command. */
11122         uint16_t        error_code;
11123         /* The HWRM command request type. */
11124         uint16_t        req_type;
11125         /* The sequence ID from the original command. */
11126         uint16_t        seq_id;
11127         /* The length of the response data in number of bytes. */
11128         uint16_t        resp_len;
11129         /* This value indicates the current link status. */
11130         uint8_t link;
11131         /* There is no link or cable detected. */
11132         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_NO_LINK UINT32_C(0x0)
11133         /* There is no link, but a cable has been detected. */
11134         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SIGNAL  UINT32_C(0x1)
11135         /* There is a link. */
11136         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_LINK    UINT32_C(0x2)
11137         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_LAST \
11138                 HWRM_PORT_PHY_QCFG_OUTPUT_LINK_LINK
11139         uint8_t unused_0;
11140         /* This value indicates the current link speed of the connection. */
11141         uint16_t        link_speed;
11142         /* 100Mb link speed */
11143         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_100MB UINT32_C(0x1)
11144         /* 1Gb link speed */
11145         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_1GB   UINT32_C(0xa)
11146         /* 2Gb link speed */
11147         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_2GB   UINT32_C(0x14)
11148         /* 25Gb link speed */
11149         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_2_5GB UINT32_C(0x19)
11150         /* 10Gb link speed */
11151         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_10GB  UINT32_C(0x64)
11152         /* 20Mb link speed */
11153         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_20GB  UINT32_C(0xc8)
11154         /* 25Gb link speed */
11155         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_25GB  UINT32_C(0xfa)
11156         /* 40Gb link speed */
11157         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_40GB  UINT32_C(0x190)
11158         /* 50Gb link speed */
11159         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_50GB  UINT32_C(0x1f4)
11160         /* 100Gb link speed */
11161         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_100GB UINT32_C(0x3e8)
11162         /* 10Mb link speed */
11163         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_10MB  UINT32_C(0xffff)
11164         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_LAST \
11165                 HWRM_PORT_PHY_QCFG_OUTPUT_LINK_SPEED_10MB
11166         /*
11167          * This value is indicates the duplex of the current
11168          * configuration.
11169          */
11170         uint8_t duplex_cfg;
11171         /* Half Duplex connection. */
11172         #define HWRM_PORT_PHY_QCFG_OUTPUT_DUPLEX_CFG_HALF UINT32_C(0x0)
11173         /* Full duplex connection. */
11174         #define HWRM_PORT_PHY_QCFG_OUTPUT_DUPLEX_CFG_FULL UINT32_C(0x1)
11175         #define HWRM_PORT_PHY_QCFG_OUTPUT_DUPLEX_CFG_LAST \
11176                 HWRM_PORT_PHY_QCFG_OUTPUT_DUPLEX_CFG_FULL
11177         /*
11178          * This value is used to indicate the current
11179          * pause configuration. When autoneg is enabled, this value
11180          * represents the autoneg results of pause configuration.
11181          */
11182         uint8_t pause;
11183         /*
11184          * When this bit is '1', Generation of tx pause messages
11185          * is supported. Disabled otherwise.
11186          */
11187         #define HWRM_PORT_PHY_QCFG_OUTPUT_PAUSE_TX     UINT32_C(0x1)
11188         /*
11189          * When this bit is '1', Reception of rx pause messages
11190          * is supported. Disabled otherwise.
11191          */
11192         #define HWRM_PORT_PHY_QCFG_OUTPUT_PAUSE_RX     UINT32_C(0x2)
11193         /*
11194          * The supported speeds for the port. This is a bit mask.
11195          * For each speed that is supported, the corrresponding
11196          * bit will be set to '1'.
11197          */
11198         uint16_t        support_speeds;
11199         /* 100Mb link speed (Half-duplex) */
11200         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100MBHD \
11201                 UINT32_C(0x1)
11202         /* 100Mb link speed (Full-duplex) */
11203         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100MB \
11204                 UINT32_C(0x2)
11205         /* 1Gb link speed (Half-duplex) */
11206         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_1GBHD \
11207                 UINT32_C(0x4)
11208         /* 1Gb link speed (Full-duplex) */
11209         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_1GB \
11210                 UINT32_C(0x8)
11211         /* 2Gb link speed */
11212         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_2GB \
11213                 UINT32_C(0x10)
11214         /* 25Gb link speed */
11215         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_2_5GB \
11216                 UINT32_C(0x20)
11217         /* 10Gb link speed */
11218         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10GB \
11219                 UINT32_C(0x40)
11220         /* 20Gb link speed */
11221         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_20GB \
11222                 UINT32_C(0x80)
11223         /* 25Gb link speed */
11224         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_25GB \
11225                 UINT32_C(0x100)
11226         /* 40Gb link speed */
11227         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_40GB \
11228                 UINT32_C(0x200)
11229         /* 50Gb link speed */
11230         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_50GB \
11231                 UINT32_C(0x400)
11232         /* 100Gb link speed */
11233         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_100GB \
11234                 UINT32_C(0x800)
11235         /* 10Mb link speed (Half-duplex) */
11236         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10MBHD \
11237                 UINT32_C(0x1000)
11238         /* 10Mb link speed (Full-duplex) */
11239         #define HWRM_PORT_PHY_QCFG_OUTPUT_SUPPORT_SPEEDS_10MB \
11240                 UINT32_C(0x2000)
11241         /*
11242          * Current setting of forced link speed.
11243          * When the link speed is not being forced, this
11244          * value shall be set to 0.
11245          */
11246         uint16_t        force_link_speed;
11247         /* 100Mb link speed */
11248         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_100MB UINT32_C(0x1)
11249         /* 1Gb link speed */
11250         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_1GB   UINT32_C(0xa)
11251         /* 2Gb link speed */
11252         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_2GB   UINT32_C(0x14)
11253         /* 25Gb link speed */
11254         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_2_5GB UINT32_C(0x19)
11255         /* 10Gb link speed */
11256         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_10GB  UINT32_C(0x64)
11257         /* 20Mb link speed */
11258         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_20GB  UINT32_C(0xc8)
11259         /* 25Gb link speed */
11260         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_25GB  UINT32_C(0xfa)
11261         /* 40Gb link speed */
11262         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_40GB \
11263                 UINT32_C(0x190)
11264         /* 50Gb link speed */
11265         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_50GB \
11266                 UINT32_C(0x1f4)
11267         /* 100Gb link speed */
11268         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_100GB \
11269                 UINT32_C(0x3e8)
11270         /* 10Mb link speed */
11271         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_10MB \
11272                 UINT32_C(0xffff)
11273         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_LAST \
11274                 HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_LINK_SPEED_10MB
11275         /* Current setting of auto negotiation mode. */
11276         uint8_t auto_mode;
11277         /* Disable autoneg or autoneg disabled. No speeds are selected. */
11278         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_MODE_NONE         UINT32_C(0x0)
11279         /* Select all possible speeds for autoneg mode. */
11280         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_MODE_ALL_SPEEDS   UINT32_C(0x1)
11281         /*
11282          * Select only the auto_link_speed speed for autoneg mode. This mode has
11283          * been DEPRECATED. An HWRM client should not use this mode.
11284          */
11285         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_MODE_ONE_SPEED    UINT32_C(0x2)
11286         /*
11287          * Select the auto_link_speed or any speed below that speed for autoneg.
11288          * This mode has been DEPRECATED. An HWRM client should not use this mode.
11289          */
11290         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_MODE_ONE_OR_BELOW UINT32_C(0x3)
11291         /*
11292          * Select the speeds based on the corresponding link speed mask value
11293          * that is provided.
11294          */
11295         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_MODE_SPEED_MASK   UINT32_C(0x4)
11296         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_MODE_LAST \
11297                 HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_MODE_SPEED_MASK
11298         /*
11299          * Current setting of pause autonegotiation.
11300          * Move autoneg_pause flag here.
11301          */
11302         uint8_t auto_pause;
11303         /*
11304          * When this bit is '1', Generation of tx pause messages
11305          * has been requested. Disabled otherwise.
11306          */
11307         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_PAUSE_TX \
11308                 UINT32_C(0x1)
11309         /*
11310          * When this bit is '1', Reception of rx pause messages
11311          * has been requested. Disabled otherwise.
11312          */
11313         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_PAUSE_RX \
11314                 UINT32_C(0x2)
11315         /*
11316          * When set to 1, the advertisement of pause is enabled.
11317          *
11318          * # When the auto_mode is not set to none and this flag is
11319          * set to 1, then the auto_pause bits on this port are being
11320          * advertised and autoneg pause results are being interpreted.
11321          * # When the auto_mode is not set to none and this
11322          * flag is set to 0, the pause is forced as indicated in
11323          * force_pause, and also advertised as auto_pause bits, but
11324          * the autoneg results are not interpreted since the pause
11325          * configuration is being forced.
11326          * # When the auto_mode is set to none and this flag is set to
11327          * 1, auto_pause bits should be ignored and should be set to 0.
11328          */
11329         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_PAUSE_AUTONEG_PAUSE \
11330                 UINT32_C(0x4)
11331         /*
11332          * Current setting for auto_link_speed. This field is only
11333          * valid when auto_mode is set to "one_speed" or "one_or_below".
11334          */
11335         uint16_t        auto_link_speed;
11336         /* 100Mb link speed */
11337         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_100MB UINT32_C(0x1)
11338         /* 1Gb link speed */
11339         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_1GB   UINT32_C(0xa)
11340         /* 2Gb link speed */
11341         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_2GB   UINT32_C(0x14)
11342         /* 25Gb link speed */
11343         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_2_5GB UINT32_C(0x19)
11344         /* 10Gb link speed */
11345         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_10GB  UINT32_C(0x64)
11346         /* 20Mb link speed */
11347         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_20GB  UINT32_C(0xc8)
11348         /* 25Gb link speed */
11349         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_25GB  UINT32_C(0xfa)
11350         /* 40Gb link speed */
11351         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_40GB  UINT32_C(0x190)
11352         /* 50Gb link speed */
11353         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_50GB  UINT32_C(0x1f4)
11354         /* 100Gb link speed */
11355         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_100GB UINT32_C(0x3e8)
11356         /* 10Mb link speed */
11357         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_10MB \
11358                 UINT32_C(0xffff)
11359         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_LAST \
11360                 HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_10MB
11361         /*
11362          * Current setting for auto_link_speed_mask that is used to
11363          * advertise speeds during autonegotiation.
11364          * This field is only valid when auto_mode is set to "mask".
11365          * The speeds specified in this field shall be a subset of
11366          * supported speeds on this port.
11367          */
11368         uint16_t        auto_link_speed_mask;
11369         /* 100Mb link speed (Half-duplex) */
11370         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_100MBHD \
11371                 UINT32_C(0x1)
11372         /* 100Mb link speed (Full-duplex) */
11373         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_100MB \
11374                 UINT32_C(0x2)
11375         /* 1Gb link speed (Half-duplex) */
11376         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_1GBHD \
11377                 UINT32_C(0x4)
11378         /* 1Gb link speed (Full-duplex) */
11379         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_1GB \
11380                 UINT32_C(0x8)
11381         /* 2Gb link speed */
11382         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_2GB \
11383                 UINT32_C(0x10)
11384         /* 25Gb link speed */
11385         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_2_5GB \
11386                 UINT32_C(0x20)
11387         /* 10Gb link speed */
11388         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_10GB \
11389                 UINT32_C(0x40)
11390         /* 20Gb link speed */
11391         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_20GB \
11392                 UINT32_C(0x80)
11393         /* 25Gb link speed */
11394         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_25GB \
11395                 UINT32_C(0x100)
11396         /* 40Gb link speed */
11397         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_40GB \
11398                 UINT32_C(0x200)
11399         /* 50Gb link speed */
11400         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_50GB \
11401                 UINT32_C(0x400)
11402         /* 100Gb link speed */
11403         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_100GB \
11404                 UINT32_C(0x800)
11405         /* 10Mb link speed (Half-duplex) */
11406         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_10MBHD \
11407                 UINT32_C(0x1000)
11408         /* 10Mb link speed (Full-duplex) */
11409         #define HWRM_PORT_PHY_QCFG_OUTPUT_AUTO_LINK_SPEED_MASK_10MB \
11410                 UINT32_C(0x2000)
11411         /* Current setting for wirespeed. */
11412         uint8_t wirespeed;
11413         /* Wirespeed feature is disabled. */
11414         #define HWRM_PORT_PHY_QCFG_OUTPUT_WIRESPEED_OFF UINT32_C(0x0)
11415         /* Wirespeed feature is enabled. */
11416         #define HWRM_PORT_PHY_QCFG_OUTPUT_WIRESPEED_ON  UINT32_C(0x1)
11417         #define HWRM_PORT_PHY_QCFG_OUTPUT_WIRESPEED_LAST \
11418                 HWRM_PORT_PHY_QCFG_OUTPUT_WIRESPEED_ON
11419         /* Current setting for loopback. */
11420         uint8_t lpbk;
11421         /* No loopback is selected.  Normal operation. */
11422         #define HWRM_PORT_PHY_QCFG_OUTPUT_LPBK_NONE     UINT32_C(0x0)
11423         /*
11424          * The HW will be configured with local loopback such that
11425          * host data is sent back to the host without modification.
11426          */
11427         #define HWRM_PORT_PHY_QCFG_OUTPUT_LPBK_LOCAL    UINT32_C(0x1)
11428         /*
11429          * The HW will be configured with remote loopback such that
11430          * port logic will send packets back out the transmitter that
11431          * are received.
11432          */
11433         #define HWRM_PORT_PHY_QCFG_OUTPUT_LPBK_REMOTE   UINT32_C(0x2)
11434         /*
11435          * The HW will be configured with external loopback such that
11436          * host data is sent on the trasmitter and based on the external
11437          * loopback connection the data will be received without modification.
11438          */
11439         #define HWRM_PORT_PHY_QCFG_OUTPUT_LPBK_EXTERNAL UINT32_C(0x3)
11440         #define HWRM_PORT_PHY_QCFG_OUTPUT_LPBK_LAST \
11441                 HWRM_PORT_PHY_QCFG_OUTPUT_LPBK_EXTERNAL
11442         /*
11443          * Current setting of forced pause.
11444          * When the pause configuration is not being forced, then
11445          * this value shall be set to 0.
11446          */
11447         uint8_t force_pause;
11448         /*
11449          * When this bit is '1', Generation of tx pause messages
11450          * is supported. Disabled otherwise.
11451          */
11452         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_PAUSE_TX     UINT32_C(0x1)
11453         /*
11454          * When this bit is '1', Reception of rx pause messages
11455          * is supported. Disabled otherwise.
11456          */
11457         #define HWRM_PORT_PHY_QCFG_OUTPUT_FORCE_PAUSE_RX     UINT32_C(0x2)
11458         /*
11459          * This value indicates the current status of the optics module on
11460          * this port.
11461          */
11462         uint8_t module_status;
11463         /* Module is inserted and accepted */
11464         #define HWRM_PORT_PHY_QCFG_OUTPUT_MODULE_STATUS_NONE \
11465                 UINT32_C(0x0)
11466         /* Module is rejected and transmit side Laser is disabled. */
11467         #define HWRM_PORT_PHY_QCFG_OUTPUT_MODULE_STATUS_DISABLETX \
11468                 UINT32_C(0x1)
11469         /* Module mismatch warning. */
11470         #define HWRM_PORT_PHY_QCFG_OUTPUT_MODULE_STATUS_WARNINGMSG \
11471                 UINT32_C(0x2)
11472         /* Module is rejected and powered down. */
11473         #define HWRM_PORT_PHY_QCFG_OUTPUT_MODULE_STATUS_PWRDOWN \
11474                 UINT32_C(0x3)
11475         /* Module is not inserted. */
11476         #define HWRM_PORT_PHY_QCFG_OUTPUT_MODULE_STATUS_NOTINSERTED \
11477                 UINT32_C(0x4)
11478         /* Module status is not applicable. */
11479         #define HWRM_PORT_PHY_QCFG_OUTPUT_MODULE_STATUS_NOTAPPLICABLE \
11480                 UINT32_C(0xff)
11481         #define HWRM_PORT_PHY_QCFG_OUTPUT_MODULE_STATUS_LAST \
11482                 HWRM_PORT_PHY_QCFG_OUTPUT_MODULE_STATUS_NOTAPPLICABLE
11483         /* Current setting for preemphasis. */
11484         uint32_t        preemphasis;
11485         /* This field represents the major version of the PHY. */
11486         uint8_t phy_maj;
11487         /* This field represents the minor version of the PHY. */
11488         uint8_t phy_min;
11489         /* This field represents the build version of the PHY. */
11490         uint8_t phy_bld;
11491         /* This value represents a PHY type. */
11492         uint8_t phy_type;
11493         /* Unknown */
11494         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_UNKNOWN \
11495                 UINT32_C(0x0)
11496         /* BASE-CR */
11497         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASECR \
11498                 UINT32_C(0x1)
11499         /* BASE-KR4 (Deprecated) */
11500         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKR4 \
11501                 UINT32_C(0x2)
11502         /* BASE-LR */
11503         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASELR \
11504                 UINT32_C(0x3)
11505         /* BASE-SR */
11506         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASESR \
11507                 UINT32_C(0x4)
11508         /* BASE-KR2 (Deprecated) */
11509         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKR2 \
11510                 UINT32_C(0x5)
11511         /* BASE-KX */
11512         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKX \
11513                 UINT32_C(0x6)
11514         /* BASE-KR */
11515         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASEKR \
11516                 UINT32_C(0x7)
11517         /* BASE-T */
11518         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASET \
11519                 UINT32_C(0x8)
11520         /* EEE capable BASE-T */
11521         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASETE \
11522                 UINT32_C(0x9)
11523         /* SGMII connected external PHY */
11524         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_SGMIIEXTPHY \
11525                 UINT32_C(0xa)
11526         /* 25G_BASECR_CA_L */
11527         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_25G_BASECR_CA_L \
11528                 UINT32_C(0xb)
11529         /* 25G_BASECR_CA_S */
11530         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_25G_BASECR_CA_S \
11531                 UINT32_C(0xc)
11532         /* 25G_BASECR_CA_N */
11533         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_25G_BASECR_CA_N \
11534                 UINT32_C(0xd)
11535         /* 25G_BASESR */
11536         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_25G_BASESR \
11537                 UINT32_C(0xe)
11538         /* 100G_BASECR4 */
11539         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASECR4 \
11540                 UINT32_C(0xf)
11541         /* 100G_BASESR4 */
11542         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASESR4 \
11543                 UINT32_C(0x10)
11544         /* 100G_BASELR4 */
11545         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASELR4 \
11546                 UINT32_C(0x11)
11547         /* 100G_BASEER4 */
11548         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASEER4 \
11549                 UINT32_C(0x12)
11550         /* 100G_BASESR10 */
11551         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_100G_BASESR10 \
11552                 UINT32_C(0x13)
11553         /* 40G_BASECR4 */
11554         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASECR4 \
11555                 UINT32_C(0x14)
11556         /* 40G_BASESR4 */
11557         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASESR4 \
11558                 UINT32_C(0x15)
11559         /* 40G_BASELR4 */
11560         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASELR4 \
11561                 UINT32_C(0x16)
11562         /* 40G_BASEER4 */
11563         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_BASEER4 \
11564                 UINT32_C(0x17)
11565         /* 40G_ACTIVE_CABLE */
11566         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_40G_ACTIVE_CABLE \
11567                 UINT32_C(0x18)
11568         /* 1G_baseT */
11569         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASET \
11570                 UINT32_C(0x19)
11571         /* 1G_baseSX */
11572         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASESX \
11573                 UINT32_C(0x1a)
11574         /* 1G_baseCX */
11575         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASECX \
11576                 UINT32_C(0x1b)
11577         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_LAST \
11578                 HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASECX
11579         /* This value represents a media type. */
11580         uint8_t media_type;
11581         /* Unknown */
11582         #define HWRM_PORT_PHY_QCFG_OUTPUT_MEDIA_TYPE_UNKNOWN UINT32_C(0x0)
11583         /* Twisted Pair */
11584         #define HWRM_PORT_PHY_QCFG_OUTPUT_MEDIA_TYPE_TP      UINT32_C(0x1)
11585         /* Direct Attached Copper */
11586         #define HWRM_PORT_PHY_QCFG_OUTPUT_MEDIA_TYPE_DAC     UINT32_C(0x2)
11587         /* Fiber */
11588         #define HWRM_PORT_PHY_QCFG_OUTPUT_MEDIA_TYPE_FIBRE   UINT32_C(0x3)
11589         #define HWRM_PORT_PHY_QCFG_OUTPUT_MEDIA_TYPE_LAST \
11590                 HWRM_PORT_PHY_QCFG_OUTPUT_MEDIA_TYPE_FIBRE
11591         /* This value represents a transceiver type. */
11592         uint8_t xcvr_pkg_type;
11593         /* PHY and MAC are in the same package */
11594         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_PKG_TYPE_XCVR_INTERNAL \
11595                 UINT32_C(0x1)
11596         /* PHY and MAC are in different packages */
11597         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_PKG_TYPE_XCVR_EXTERNAL \
11598                 UINT32_C(0x2)
11599         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_PKG_TYPE_LAST \
11600                 HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_PKG_TYPE_XCVR_EXTERNAL
11601         uint8_t eee_config_phy_addr;
11602         /* This field represents PHY address. */
11603         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_ADDR_MASK \
11604                 UINT32_C(0x1f)
11605         #define HWRM_PORT_PHY_QCFG_OUTPUT_PHY_ADDR_SFT               0
11606         /*
11607          * This field represents flags related to EEE configuration.
11608          * These EEE configuration flags are valid only when the
11609          * auto_mode is not set to none (in other words autonegotiation
11610          * is enabled).
11611          */
11612         #define HWRM_PORT_PHY_QCFG_OUTPUT_EEE_CONFIG_MASK \
11613                 UINT32_C(0xe0)
11614         #define HWRM_PORT_PHY_QCFG_OUTPUT_EEE_CONFIG_SFT             5
11615         /*
11616          * When set to 1, Energy Efficient Ethernet (EEE) mode is enabled.
11617          * Speeds for autoneg with EEE mode enabled
11618          * are based on eee_link_speed_mask.
11619          */
11620         #define HWRM_PORT_PHY_QCFG_OUTPUT_EEE_CONFIG_EEE_ENABLED \
11621                 UINT32_C(0x20)
11622         /*
11623          * This flag is valid only when eee_enabled is set to 1.
11624          *
11625          * # If eee_enabled is set to 0, then EEE mode is disabled
11626          * and this flag shall be ignored.
11627          * # If eee_enabled is set to 1 and this flag is set to 1,
11628          * then Energy Efficient Ethernet (EEE) mode is enabled
11629          * and in use.
11630          * # If eee_enabled is set to 1 and this flag is set to 0,
11631          * then Energy Efficient Ethernet (EEE) mode is enabled
11632          * but is currently not in use.
11633          */
11634         #define HWRM_PORT_PHY_QCFG_OUTPUT_EEE_CONFIG_EEE_ACTIVE \
11635                 UINT32_C(0x40)
11636         /*
11637          * This flag is valid only when eee_enabled is set to 1.
11638          *
11639          * # If eee_enabled is set to 0, then EEE mode is disabled
11640          * and this flag shall be ignored.
11641          * # If eee_enabled is set to 1 and this flag is set to 1,
11642          * then Energy Efficient Ethernet (EEE) mode is enabled
11643          * and TX LPI is enabled.
11644          * # If eee_enabled is set to 1 and this flag is set to 0,
11645          * then Energy Efficient Ethernet (EEE) mode is enabled
11646          * but TX LPI is disabled.
11647          */
11648         #define HWRM_PORT_PHY_QCFG_OUTPUT_EEE_CONFIG_EEE_TX_LPI \
11649                 UINT32_C(0x80)
11650         /*
11651          * When set to 1, the parallel detection is used to determine
11652          * the speed of the link partner.
11653          *
11654          * Parallel detection is used when a autonegotiation capable
11655          * device is connected to a link parter that is not capable
11656          * of autonegotiation.
11657          */
11658         uint8_t parallel_detect;
11659         /*
11660          * When set to 1, the parallel detection is used to determine
11661          * the speed of the link partner.
11662          *
11663          * Parallel detection is used when a autonegotiation capable
11664          * device is connected to a link parter that is not capable
11665          * of autonegotiation.
11666          */
11667         #define HWRM_PORT_PHY_QCFG_OUTPUT_PARALLEL_DETECT     UINT32_C(0x1)
11668         /*
11669          * The advertised speeds for the port by the link partner.
11670          * Each advertised speed will be set to '1'.
11671          */
11672         uint16_t        link_partner_adv_speeds;
11673         /* 100Mb link speed (Half-duplex) */
11674         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_100MBHD \
11675                 UINT32_C(0x1)
11676         /* 100Mb link speed (Full-duplex) */
11677         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_100MB \
11678                 UINT32_C(0x2)
11679         /* 1Gb link speed (Half-duplex) */
11680         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_1GBHD \
11681                 UINT32_C(0x4)
11682         /* 1Gb link speed (Full-duplex) */
11683         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_1GB \
11684                 UINT32_C(0x8)
11685         /* 2Gb link speed */
11686         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_2GB \
11687                 UINT32_C(0x10)
11688         /* 25Gb link speed */
11689         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_2_5GB \
11690                 UINT32_C(0x20)
11691         /* 10Gb link speed */
11692         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_10GB \
11693                 UINT32_C(0x40)
11694         /* 20Gb link speed */
11695         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_20GB \
11696                 UINT32_C(0x80)
11697         /* 25Gb link speed */
11698         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_25GB \
11699                 UINT32_C(0x100)
11700         /* 40Gb link speed */
11701         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_40GB \
11702                 UINT32_C(0x200)
11703         /* 50Gb link speed */
11704         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_50GB \
11705                 UINT32_C(0x400)
11706         /* 100Gb link speed */
11707         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_100GB \
11708                 UINT32_C(0x800)
11709         /* 10Mb link speed (Half-duplex) */
11710         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_10MBHD \
11711                 UINT32_C(0x1000)
11712         /* 10Mb link speed (Full-duplex) */
11713         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_SPEEDS_10MB \
11714                 UINT32_C(0x2000)
11715         /*
11716          * The advertised autoneg for the port by the link partner.
11717          * This field is deprecated and should be set to 0.
11718          */
11719         uint8_t link_partner_adv_auto_mode;
11720         /* Disable autoneg or autoneg disabled. No speeds are selected. */
11721         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_AUTO_MODE_NONE \
11722                 UINT32_C(0x0)
11723         /* Select all possible speeds for autoneg mode. */
11724         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_AUTO_MODE_ALL_SPEEDS \
11725                 UINT32_C(0x1)
11726         /*
11727          * Select only the auto_link_speed speed for autoneg mode. This mode has
11728          * been DEPRECATED. An HWRM client should not use this mode.
11729          */
11730         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_AUTO_MODE_ONE_SPEED \
11731                 UINT32_C(0x2)
11732         /*
11733          * Select the auto_link_speed or any speed below that speed for autoneg.
11734          * This mode has been DEPRECATED. An HWRM client should not use this mode.
11735          */
11736         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_AUTO_MODE_ONE_OR_BELOW \
11737                 UINT32_C(0x3)
11738         /*
11739          * Select the speeds based on the corresponding link speed mask value
11740          * that is provided.
11741          */
11742         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_AUTO_MODE_SPEED_MASK \
11743                 UINT32_C(0x4)
11744         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_AUTO_MODE_LAST \
11745                 HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_AUTO_MODE_SPEED_MASK
11746         /* The advertised pause settings on the port by the link partner. */
11747         uint8_t link_partner_adv_pause;
11748         /*
11749          * When this bit is '1', Generation of tx pause messages
11750          * is supported. Disabled otherwise.
11751          */
11752         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_PAUSE_TX \
11753                 UINT32_C(0x1)
11754         /*
11755          * When this bit is '1', Reception of rx pause messages
11756          * is supported. Disabled otherwise.
11757          */
11758         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_PAUSE_RX \
11759                 UINT32_C(0x2)
11760         /*
11761          * Current setting for link speed mask that is used to
11762          * advertise speeds during autonegotiation when EEE is enabled.
11763          * This field is valid only when eee_enabled flags is set to 1.
11764          * The speeds specified in this field shall be a subset of
11765          * speeds specified in auto_link_speed_mask.
11766          */
11767         uint16_t        adv_eee_link_speed_mask;
11768         /* Reserved */
11769         #define HWRM_PORT_PHY_QCFG_OUTPUT_ADV_EEE_LINK_SPEED_MASK_RSVD1 \
11770                 UINT32_C(0x1)
11771         /* 100Mb link speed (Full-duplex) */
11772         #define HWRM_PORT_PHY_QCFG_OUTPUT_ADV_EEE_LINK_SPEED_MASK_100MB \
11773                 UINT32_C(0x2)
11774         /* Reserved */
11775         #define HWRM_PORT_PHY_QCFG_OUTPUT_ADV_EEE_LINK_SPEED_MASK_RSVD2 \
11776                 UINT32_C(0x4)
11777         /* 1Gb link speed (Full-duplex) */
11778         #define HWRM_PORT_PHY_QCFG_OUTPUT_ADV_EEE_LINK_SPEED_MASK_1GB \
11779                 UINT32_C(0x8)
11780         /* Reserved */
11781         #define HWRM_PORT_PHY_QCFG_OUTPUT_ADV_EEE_LINK_SPEED_MASK_RSVD3 \
11782                 UINT32_C(0x10)
11783         /* Reserved */
11784         #define HWRM_PORT_PHY_QCFG_OUTPUT_ADV_EEE_LINK_SPEED_MASK_RSVD4 \
11785                 UINT32_C(0x20)
11786         /* 10Gb link speed */
11787         #define HWRM_PORT_PHY_QCFG_OUTPUT_ADV_EEE_LINK_SPEED_MASK_10GB \
11788                 UINT32_C(0x40)
11789         /*
11790          * Current setting for link speed mask that is advertised by
11791          * the link partner when EEE is enabled.
11792          * This field is valid only when eee_enabled flags is set to 1.
11793          */
11794         uint16_t        link_partner_adv_eee_link_speed_mask;
11795         /* Reserved */
11796         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_EEE_LINK_SPEED_MASK_RSVD1 \
11797                 UINT32_C(0x1)
11798         /* 100Mb link speed (Full-duplex) */
11799         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_EEE_LINK_SPEED_MASK_100MB \
11800                 UINT32_C(0x2)
11801         /* Reserved */
11802         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_EEE_LINK_SPEED_MASK_RSVD2 \
11803                 UINT32_C(0x4)
11804         /* 1Gb link speed (Full-duplex) */
11805         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_EEE_LINK_SPEED_MASK_1GB \
11806                 UINT32_C(0x8)
11807         /* Reserved */
11808         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_EEE_LINK_SPEED_MASK_RSVD3 \
11809                 UINT32_C(0x10)
11810         /* Reserved */
11811         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_EEE_LINK_SPEED_MASK_RSVD4 \
11812                 UINT32_C(0x20)
11813         /* 10Gb link speed */
11814         #define HWRM_PORT_PHY_QCFG_OUTPUT_LINK_PARTNER_ADV_EEE_LINK_SPEED_MASK_10GB \
11815                 UINT32_C(0x40)
11816         uint32_t        xcvr_identifier_type_tx_lpi_timer;
11817         /*
11818          * Current setting of TX LPI timer in microseconds.
11819          * This field is valid only when_eee_enabled flag is set to 1
11820          * and tx_lpi_enabled is set to 1.
11821          */
11822         #define HWRM_PORT_PHY_QCFG_OUTPUT_TX_LPI_TIMER_MASK \
11823                 UINT32_C(0xffffff)
11824         #define HWRM_PORT_PHY_QCFG_OUTPUT_TX_LPI_TIMER_SFT             0
11825         /* This value represents transceiver identifier type. */
11826         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_IDENTIFIER_TYPE_MASK \
11827                 UINT32_C(0xff000000)
11828         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_IDENTIFIER_TYPE_SFT     24
11829         /* Unknown */
11830         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_IDENTIFIER_TYPE_UNKNOWN \
11831                 (UINT32_C(0x0) << 24)
11832         /* SFP/SFP+/SFP28 */
11833         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_IDENTIFIER_TYPE_SFP \
11834                 (UINT32_C(0x3) << 24)
11835         /* QSFP+ */
11836         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_IDENTIFIER_TYPE_QSFP \
11837                 (UINT32_C(0xc) << 24)
11838         /* QSFP+ */
11839         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_IDENTIFIER_TYPE_QSFPPLUS \
11840                 (UINT32_C(0xd) << 24)
11841         /* QSFP28 */
11842         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_IDENTIFIER_TYPE_QSFP28 \
11843                 (UINT32_C(0x11) << 24)
11844         #define HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_IDENTIFIER_TYPE_LAST \
11845                 HWRM_PORT_PHY_QCFG_OUTPUT_XCVR_IDENTIFIER_TYPE_QSFP28
11846         /*
11847          * This value represents the current configuration of
11848          * Forward Error Correction (FEC) on the port.
11849          */
11850         uint16_t        fec_cfg;
11851         /*
11852          * When set to 1, then FEC is not supported on this port. If this flag
11853          * is set to 1, then all other FEC configuration flags shall be ignored.
11854          * When set to 0, then FEC is supported as indicated by other
11855          * configuration flags.
11856          * If no cable is attached and the HWRM does not yet know the FEC
11857          * capability, then the HWRM shall set this flag to 1 when reporting
11858          * FEC capability.
11859          */
11860         #define HWRM_PORT_PHY_QCFG_OUTPUT_FEC_CFG_FEC_NONE_SUPPORTED \
11861                 UINT32_C(0x1)
11862         /*
11863          * When set to 1, then FEC autonegotiation is supported on this port.
11864          * When set to 0, then FEC autonegotiation is not supported on this port.
11865          */
11866         #define HWRM_PORT_PHY_QCFG_OUTPUT_FEC_CFG_FEC_AUTONEG_SUPPORTED \
11867                 UINT32_C(0x2)
11868         /*
11869          * When set to 1, then FEC autonegotiation is enabled on this port.
11870          * When set to 0, then FEC autonegotiation is disabled if supported.
11871          * This flag should be ignored if FEC autonegotiation is not supported on this port.
11872          */
11873         #define HWRM_PORT_PHY_QCFG_OUTPUT_FEC_CFG_FEC_AUTONEG_ENABLED \
11874                 UINT32_C(0x4)
11875         /*
11876          * When set to 1, then FEC CLAUSE 74 (Fire Code) is supported on this port.
11877          * When set to 0, then FEC CLAUSE 74 (Fire Code) is not supported on this port.
11878          */
11879         #define HWRM_PORT_PHY_QCFG_OUTPUT_FEC_CFG_FEC_CLAUSE74_SUPPORTED \
11880                 UINT32_C(0x8)
11881         /*
11882          * When set to 1, then FEC CLAUSE 74 (Fire Code) is enabled on this port.
11883          * When set to 0, then FEC CLAUSE 74 (Fire Code) is disabled if supported.
11884          * This flag should be ignored if FEC CLAUSE 74 is not supported on this port.
11885          */
11886         #define HWRM_PORT_PHY_QCFG_OUTPUT_FEC_CFG_FEC_CLAUSE74_ENABLED \
11887                 UINT32_C(0x10)
11888         /*
11889          * When set to 1, then FEC CLAUSE 91 (Reed Solomon) is supported on this port.
11890          * When set to 0, then FEC CLAUSE 91 (Reed Solomon) is not supported on this port.
11891          */
11892         #define HWRM_PORT_PHY_QCFG_OUTPUT_FEC_CFG_FEC_CLAUSE91_SUPPORTED \
11893                 UINT32_C(0x20)
11894         /*
11895          * When set to 1, then FEC CLAUSE 91 (Reed Solomon) is enabled on this port.
11896          * When set to 0, then FEC CLAUSE 91 (Reed Solomon) is disabled if supported.
11897          * This flag should be ignored if FEC CLAUSE 91 is not supported on this port.
11898          */
11899         #define HWRM_PORT_PHY_QCFG_OUTPUT_FEC_CFG_FEC_CLAUSE91_ENABLED \
11900                 UINT32_C(0x40)
11901         /*
11902          * This value is indicates the duplex of the current
11903          * connection state.
11904          */
11905         uint8_t duplex_state;
11906         /* Half Duplex connection. */
11907         #define HWRM_PORT_PHY_QCFG_OUTPUT_DUPLEX_STATE_HALF UINT32_C(0x0)
11908         /* Full duplex connection. */
11909         #define HWRM_PORT_PHY_QCFG_OUTPUT_DUPLEX_STATE_FULL UINT32_C(0x1)
11910         #define HWRM_PORT_PHY_QCFG_OUTPUT_DUPLEX_STATE_LAST \
11911                 HWRM_PORT_PHY_QCFG_OUTPUT_DUPLEX_STATE_FULL
11912         /* Option flags fields. */
11913         uint8_t option_flags;
11914         /* When this bit is '1', Media auto detect is enabled. */
11915         #define HWRM_PORT_PHY_QCFG_OUTPUT_OPTION_FLAGS_MEDIA_AUTO_DETECT \
11916                 UINT32_C(0x1)
11917         /*
11918          * Up to 16 bytes of null padded ASCII string representing
11919          * PHY vendor.
11920          * If the string is set to null, then the vendor name is not
11921          * available.
11922          */
11923         char    phy_vendor_name[16];
11924         /*
11925          * Up to 16 bytes of null padded ASCII string that
11926          * identifies vendor specific part number of the PHY.
11927          * If the string is set to null, then the vendor specific
11928          * part number is not available.
11929          */
11930         char    phy_vendor_partnumber[16];
11931         uint8_t unused_2[7];
11932         /*
11933          * This field is used in Output records to indicate that the output
11934          * is completely written to RAM.  This field should be read as '1'
11935          * to indicate that the output has been completely written.
11936          * When writing a command completion or response to an internal processor,
11937          * the order of writes has to be such that this field is written last.
11938          */
11939         uint8_t valid;
11940 } __attribute__((packed));
11941
11942 /*********************
11943  * hwrm_port_mac_cfg *
11944  *********************/
11945
11946
11947 /* hwrm_port_mac_cfg_input (size:320b/40B) */
11948 struct hwrm_port_mac_cfg_input {
11949         /* The HWRM command request type. */
11950         uint16_t        req_type;
11951         /*
11952          * The completion ring to send the completion event on. This should
11953          * be the NQ ID returned from the `nq_alloc` HWRM command.
11954          */
11955         uint16_t        cmpl_ring;
11956         /*
11957          * The sequence ID is used by the driver for tracking multiple
11958          * commands. This ID is treated as opaque data by the firmware and
11959          * the value is returned in the `hwrm_resp_hdr` upon completion.
11960          */
11961         uint16_t        seq_id;
11962         /*
11963          * The target ID of the command:
11964          * * 0x0-0xFFF8 - The function ID
11965          * * 0xFFF8-0xFFFE - Reserved for internal processors
11966          * * 0xFFFF - HWRM
11967          */
11968         uint16_t        target_id;
11969         /*
11970          * A physical address pointer pointing to a host buffer that the
11971          * command's response data will be written. This can be either a host
11972          * physical address (HPA) or a guest physical address (GPA) and must
11973          * point to a physically contiguous block of memory.
11974          */
11975         uint64_t        resp_addr;
11976         /*
11977          * In this field, there are a number of CoS mappings related flags
11978          * that are used to configure CoS mappings and their corresponding
11979          * priorities in the hardware.
11980          * For the priorities of CoS mappings, the HWRM uses the following
11981          * priority order (high to low) by default:
11982          * # vlan pri
11983          * # ip_dscp
11984          * # tunnel_vlan_pri
11985          * # default cos
11986          *
11987          * A subset of CoS mappings can be enabled.
11988          * If a priority is not specified for an enabled CoS mapping, the
11989          * priority will be assigned in the above order for the enabled CoS
11990          * mappings. For example, if vlan_pri and ip_dscp CoS mappings are
11991          * enabled and their priorities are not specified, the following
11992          * priority order (high to low) will be used by the HWRM:
11993          * # vlan_pri
11994          * # ip_dscp
11995          * # default cos
11996          *
11997          * vlan_pri CoS mapping together with default CoS with lower priority
11998          * are enabled by default by the HWRM.
11999          */
12000         uint32_t        flags;
12001         /*
12002          * When this bit is '1', this command will configure
12003          * the MAC to match the current link state of the PHY.
12004          * If the link is not established on the PHY, then this
12005          * bit has no effect.
12006          */
12007         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_MATCH_LINK \
12008                 UINT32_C(0x1)
12009         /*
12010          * When this bit is set to '1', the inner VLAN PRI to CoS mapping
12011          * is requested to be enabled.
12012          */
12013         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_VLAN_PRI2COS_ENABLE \
12014                 UINT32_C(0x2)
12015         /*
12016          * When this bit is set to '1', tunnel VLAN PRI field to
12017          * CoS mapping is requested to be enabled.
12018          */
12019         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_TUNNEL_PRI2COS_ENABLE \
12020                 UINT32_C(0x4)
12021         /*
12022          * When this bit is set to '1', the IP DSCP to CoS mapping is
12023          * requested to be enabled.
12024          */
12025         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_IP_DSCP2COS_ENABLE \
12026                 UINT32_C(0x8)
12027         /*
12028          * When this bit is '1', the HWRM is requested to
12029          * enable timestamp capture capability on the receive side
12030          * of this port.
12031          */
12032         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_PTP_RX_TS_CAPTURE_ENABLE \
12033                 UINT32_C(0x10)
12034         /*
12035          * When this bit is '1', the HWRM is requested to
12036          * disable timestamp capture capability on the receive side
12037          * of this port.
12038          */
12039         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_PTP_RX_TS_CAPTURE_DISABLE \
12040                 UINT32_C(0x20)
12041         /*
12042          * When this bit is '1', the HWRM is requested to
12043          * enable timestamp capture capability on the transmit side
12044          * of this port.
12045          */
12046         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_PTP_TX_TS_CAPTURE_ENABLE \
12047                 UINT32_C(0x40)
12048         /*
12049          * When this bit is '1', the HWRM is requested to
12050          * disable timestamp capture capability on the transmit side
12051          * of this port.
12052          */
12053         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_PTP_TX_TS_CAPTURE_DISABLE \
12054                 UINT32_C(0x80)
12055         /*
12056          * When this bit is '1', the Out-Of-Box WoL is requested to
12057          * be enabled on this port.
12058          */
12059         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_OOB_WOL_ENABLE \
12060                 UINT32_C(0x100)
12061         /*
12062          * When this bit is '1', the the Out-Of-Box WoL is requested to
12063          * be disabled on this port.
12064          */
12065         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_OOB_WOL_DISABLE \
12066                 UINT32_C(0x200)
12067         /*
12068          * When this bit is set to '1', the inner VLAN PRI to CoS mapping
12069          * is requested to be disabled.
12070          */
12071         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_VLAN_PRI2COS_DISABLE \
12072                 UINT32_C(0x400)
12073         /*
12074          * When this bit is set to '1', tunnel VLAN PRI field to
12075          * CoS mapping is requested to be disabled.
12076          */
12077         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_TUNNEL_PRI2COS_DISABLE \
12078                 UINT32_C(0x800)
12079         /*
12080          * When this bit is set to '1', the IP DSCP to CoS mapping is
12081          * requested to be disabled.
12082          */
12083         #define HWRM_PORT_MAC_CFG_INPUT_FLAGS_IP_DSCP2COS_DISABLE \
12084                 UINT32_C(0x1000)
12085         uint32_t        enables;
12086         /*
12087          * This bit must be '1' for the ipg field to be
12088          * configured.
12089          */
12090         #define HWRM_PORT_MAC_CFG_INPUT_ENABLES_IPG \
12091                 UINT32_C(0x1)
12092         /*
12093          * This bit must be '1' for the lpbk field to be
12094          * configured.
12095          */
12096         #define HWRM_PORT_MAC_CFG_INPUT_ENABLES_LPBK \
12097                 UINT32_C(0x2)
12098         /*
12099          * This bit must be '1' for the vlan_pri2cos_map_pri field to be
12100          * configured.
12101          */
12102         #define HWRM_PORT_MAC_CFG_INPUT_ENABLES_VLAN_PRI2COS_MAP_PRI \
12103                 UINT32_C(0x4)
12104         /*
12105          * This bit must be '1' for the tunnel_pri2cos_map_pri field to be
12106          * configured.
12107          */
12108         #define HWRM_PORT_MAC_CFG_INPUT_ENABLES_TUNNEL_PRI2COS_MAP_PRI \
12109                 UINT32_C(0x10)
12110         /*
12111          * This bit must be '1' for the dscp2cos_map_pri field to be
12112          * configured.
12113          */
12114         #define HWRM_PORT_MAC_CFG_INPUT_ENABLES_DSCP2COS_MAP_PRI \
12115                 UINT32_C(0x20)
12116         /*
12117          * This bit must be '1' for the rx_ts_capture_ptp_msg_type field to be
12118          * configured.
12119          */
12120         #define HWRM_PORT_MAC_CFG_INPUT_ENABLES_RX_TS_CAPTURE_PTP_MSG_TYPE \
12121                 UINT32_C(0x40)
12122         /*
12123          * This bit must be '1' for the tx_ts_capture_ptp_msg_type field to be
12124          * configured.
12125          */
12126         #define HWRM_PORT_MAC_CFG_INPUT_ENABLES_TX_TS_CAPTURE_PTP_MSG_TYPE \
12127                 UINT32_C(0x80)
12128         /*
12129          * This bit must be '1' for the cos_field_cfg field to be
12130          * configured.
12131          */
12132         #define HWRM_PORT_MAC_CFG_INPUT_ENABLES_COS_FIELD_CFG \
12133                 UINT32_C(0x100)
12134         /* Port ID of port that is to be configured. */
12135         uint16_t        port_id;
12136         /*
12137          * This value is used to configure the minimum IPG that will
12138          * be sent between packets by this port.
12139          */
12140         uint8_t ipg;
12141         /* This value controls the loopback setting for the MAC. */
12142         uint8_t lpbk;
12143         /* No loopback is selected.  Normal operation. */
12144         #define HWRM_PORT_MAC_CFG_INPUT_LPBK_NONE   UINT32_C(0x0)
12145         /*
12146          * The HW will be configured with local loopback such that
12147          * host data is sent back to the host without modification.
12148          */
12149         #define HWRM_PORT_MAC_CFG_INPUT_LPBK_LOCAL  UINT32_C(0x1)
12150         /*
12151          * The HW will be configured with remote loopback such that
12152          * port logic will send packets back out the transmitter that
12153          * are received.
12154          */
12155         #define HWRM_PORT_MAC_CFG_INPUT_LPBK_REMOTE UINT32_C(0x2)
12156         #define HWRM_PORT_MAC_CFG_INPUT_LPBK_LAST \
12157                 HWRM_PORT_MAC_CFG_INPUT_LPBK_REMOTE
12158         /*
12159          * This value controls the priority setting of VLAN PRI to CoS
12160          * mapping based on VLAN Tags of inner packet headers of
12161          * tunneled packets or packet headers of non-tunneled packets.
12162          *
12163          * # Each XXX_pri variable shall have a unique priority value
12164          * when it is being specified.
12165          * # When comparing priorities of mappings, higher value
12166          * indicates higher priority.
12167          * For example, a value of 0-3 is returned where 0 is being
12168          * the lowest priority and 3 is being the highest priority.
12169          */
12170         uint8_t vlan_pri2cos_map_pri;
12171         /* Reserved field. */
12172         uint8_t reserved1;
12173         /*
12174          * This value controls the priority setting of VLAN PRI to CoS
12175          * mapping based on VLAN Tags of tunneled header.
12176          * This mapping only applies when tunneled headers
12177          * are present.
12178          *
12179          * # Each XXX_pri variable shall have a unique priority value
12180          * when it is being specified.
12181          * # When comparing priorities of mappings, higher value
12182          * indicates higher priority.
12183          * For example, a value of 0-3 is returned where 0 is being
12184          * the lowest priority and 3 is being the highest priority.
12185          */
12186         uint8_t tunnel_pri2cos_map_pri;
12187         /*
12188          * This value controls the priority setting of IP DSCP to CoS
12189          * mapping based on inner IP header of tunneled packets or
12190          * IP header of non-tunneled packets.
12191          *
12192          * # Each XXX_pri variable shall have a unique priority value
12193          * when it is being specified.
12194          * # When comparing priorities of mappings, higher value
12195          * indicates higher priority.
12196          * For example, a value of 0-3 is returned where 0 is being
12197          * the lowest priority and 3 is being the highest priority.
12198          */
12199         uint8_t dscp2pri_map_pri;
12200         /*
12201          * This is a 16-bit bit mask that is used to request a
12202          * specific configuration of time stamp capture of PTP messages
12203          * on the receive side of this port.
12204          * This field shall be ignored if the ptp_rx_ts_capture_enable
12205          * flag is not set in this command.
12206          * Otherwise, if bit 'i' is set, then the HWRM is being
12207          * requested to configure the receive side of the port to
12208          * capture the time stamp of every received PTP message
12209          * with messageType field value set to i.
12210          */
12211         uint16_t        rx_ts_capture_ptp_msg_type;
12212         /*
12213          * This is a 16-bit bit mask that is used to request a
12214          * specific configuration of time stamp capture of PTP messages
12215          * on the transmit side of this port.
12216          * This field shall be ignored if the ptp_tx_ts_capture_enable
12217          * flag is not set in this command.
12218          * Otherwise, if bit 'i' is set, then the HWRM is being
12219          * requested to configure the transmit sied of the port to
12220          * capture the time stamp of every transmitted PTP message
12221          * with messageType field value set to i.
12222          */
12223         uint16_t        tx_ts_capture_ptp_msg_type;
12224         /* Configuration of CoS fields. */
12225         uint8_t cos_field_cfg;
12226         /* Reserved */
12227         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_RSVD1 \
12228                 UINT32_C(0x1)
12229         /*
12230          * This field is used to specify selection of VLAN PRI value
12231          * based on whether one or two VLAN Tags are present in
12232          * the inner packet headers of tunneled packets or
12233          * non-tunneled packets.
12234          * This field is valid only if inner VLAN PRI to CoS mapping
12235          * is enabled.
12236          * If VLAN PRI to CoS mapping is not enabled, then this
12237          * field shall be ignored.
12238          */
12239         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_VLAN_PRI_SEL_MASK \
12240                 UINT32_C(0x6)
12241         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_VLAN_PRI_SEL_SFT \
12242                 1
12243         /*
12244          * Select inner VLAN PRI when 1 or 2 VLAN Tags are
12245          * present in the inner packet headers
12246          */
12247         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_VLAN_PRI_SEL_INNERMOST \
12248                 (UINT32_C(0x0) << 1)
12249         /*
12250          * Select outer VLAN Tag PRI when 2 VLAN Tags are
12251          * present in the inner packet headers.
12252          * No VLAN PRI shall be selected for this configuration
12253          * if only one VLAN Tag is present in the inner
12254          * packet headers.
12255          */
12256         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_VLAN_PRI_SEL_OUTER \
12257                 (UINT32_C(0x1) << 1)
12258         /*
12259          * Select outermost VLAN PRI when 1 or 2 VLAN Tags
12260          * are present in the inner packet headers
12261          */
12262         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_VLAN_PRI_SEL_OUTERMOST \
12263                 (UINT32_C(0x2) << 1)
12264         /* Unspecified */
12265         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_VLAN_PRI_SEL_UNSPECIFIED \
12266                 (UINT32_C(0x3) << 1)
12267         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_VLAN_PRI_SEL_LAST \
12268                 HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_VLAN_PRI_SEL_UNSPECIFIED
12269         /*
12270          * This field is used to specify selection of tunnel VLAN
12271          * PRI value based on whether one or two VLAN Tags are
12272          * present in tunnel headers.
12273          * This field is valid only if tunnel VLAN PRI to CoS mapping
12274          * is enabled.
12275          * If tunnel VLAN PRI to CoS mapping is not enabled, then this
12276          * field shall be ignored.
12277          */
12278         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_MASK \
12279                 UINT32_C(0x18)
12280         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_SFT \
12281                 3
12282         /*
12283          * Select inner VLAN PRI when 1 or 2 VLAN Tags are
12284          * present in the tunnel packet headers
12285          */
12286         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_INNERMOST \
12287                 (UINT32_C(0x0) << 3)
12288         /*
12289          * Select outer VLAN Tag PRI when 2 VLAN Tags are
12290          * present in the tunnel packet headers.
12291          * No tunnel VLAN PRI shall be selected for this
12292          * configuration if only one VLAN Tag is present in
12293          * the tunnel packet headers.
12294          */
12295         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_OUTER \
12296                 (UINT32_C(0x1) << 3)
12297         /*
12298          * Select outermost VLAN PRI when 1 or 2 VLAN Tags
12299          * are present in the tunnel packet headers
12300          */
12301         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_OUTERMOST \
12302                 (UINT32_C(0x2) << 3)
12303         /* Unspecified */
12304         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_UNSPECIFIED \
12305                 (UINT32_C(0x3) << 3)
12306         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_LAST \
12307                 HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_UNSPECIFIED
12308         /*
12309          * This field shall be used to provide default CoS value
12310          * that has been configured on this port.
12311          * This field is valid only if default CoS mapping
12312          * is enabled.
12313          * If default CoS mapping is not enabled, then this
12314          * field shall be ignored.
12315          */
12316         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_DEFAULT_COS_MASK \
12317                 UINT32_C(0xe0)
12318         #define HWRM_PORT_MAC_CFG_INPUT_COS_FIELD_CFG_DEFAULT_COS_SFT \
12319                 5
12320         uint8_t unused_0[3];
12321 } __attribute__((packed));
12322
12323 /* hwrm_port_mac_cfg_output (size:128b/16B) */
12324 struct hwrm_port_mac_cfg_output {
12325         /* The specific error status for the command. */
12326         uint16_t        error_code;
12327         /* The HWRM command request type. */
12328         uint16_t        req_type;
12329         /* The sequence ID from the original command. */
12330         uint16_t        seq_id;
12331         /* The length of the response data in number of bytes. */
12332         uint16_t        resp_len;
12333         /*
12334          * This is the configured maximum length of Ethernet packet
12335          * payload that is allowed to be received on the port.
12336          * This value does not include the number of bytes used by
12337          * Ethernet header and trailer (CRC).
12338          */
12339         uint16_t        mru;
12340         /*
12341          * This is the configured maximum length of Ethernet packet
12342          * payload that is allowed to be transmitted on the port.
12343          * This value does not include the number of bytes used by
12344          * Ethernet header and trailer (CRC).
12345          */
12346         uint16_t        mtu;
12347         /* Current configuration of the IPG value. */
12348         uint8_t ipg;
12349         /* Current value of the loopback value. */
12350         uint8_t lpbk;
12351         /* No loopback is selected.  Normal operation. */
12352         #define HWRM_PORT_MAC_CFG_OUTPUT_LPBK_NONE   UINT32_C(0x0)
12353         /*
12354          * The HW will be configured with local loopback such that
12355          * host data is sent back to the host without modification.
12356          */
12357         #define HWRM_PORT_MAC_CFG_OUTPUT_LPBK_LOCAL  UINT32_C(0x1)
12358         /*
12359          * The HW will be configured with remote loopback such that
12360          * port logic will send packets back out the transmitter that
12361          * are received.
12362          */
12363         #define HWRM_PORT_MAC_CFG_OUTPUT_LPBK_REMOTE UINT32_C(0x2)
12364         #define HWRM_PORT_MAC_CFG_OUTPUT_LPBK_LAST \
12365                 HWRM_PORT_MAC_CFG_OUTPUT_LPBK_REMOTE
12366         uint8_t unused_0;
12367         /*
12368          * This field is used in Output records to indicate that the output
12369          * is completely written to RAM.  This field should be read as '1'
12370          * to indicate that the output has been completely written.
12371          * When writing a command completion or response to an internal processor,
12372          * the order of writes has to be such that this field is written last.
12373          */
12374         uint8_t valid;
12375 } __attribute__((packed));
12376
12377 /**********************
12378  * hwrm_port_mac_qcfg *
12379  **********************/
12380
12381
12382 /* hwrm_port_mac_qcfg_input (size:192b/24B) */
12383 struct hwrm_port_mac_qcfg_input {
12384         /* The HWRM command request type. */
12385         uint16_t        req_type;
12386         /*
12387          * The completion ring to send the completion event on. This should
12388          * be the NQ ID returned from the `nq_alloc` HWRM command.
12389          */
12390         uint16_t        cmpl_ring;
12391         /*
12392          * The sequence ID is used by the driver for tracking multiple
12393          * commands. This ID is treated as opaque data by the firmware and
12394          * the value is returned in the `hwrm_resp_hdr` upon completion.
12395          */
12396         uint16_t        seq_id;
12397         /*
12398          * The target ID of the command:
12399          * * 0x0-0xFFF8 - The function ID
12400          * * 0xFFF8-0xFFFE - Reserved for internal processors
12401          * * 0xFFFF - HWRM
12402          */
12403         uint16_t        target_id;
12404         /*
12405          * A physical address pointer pointing to a host buffer that the
12406          * command's response data will be written. This can be either a host
12407          * physical address (HPA) or a guest physical address (GPA) and must
12408          * point to a physically contiguous block of memory.
12409          */
12410         uint64_t        resp_addr;
12411         /* Port ID of port that is to be configured. */
12412         uint16_t        port_id;
12413         uint8_t unused_0[6];
12414 } __attribute__((packed));
12415
12416 /* hwrm_port_mac_qcfg_output (size:192b/24B) */
12417 struct hwrm_port_mac_qcfg_output {
12418         /* The specific error status for the command. */
12419         uint16_t        error_code;
12420         /* The HWRM command request type. */
12421         uint16_t        req_type;
12422         /* The sequence ID from the original command. */
12423         uint16_t        seq_id;
12424         /* The length of the response data in number of bytes. */
12425         uint16_t        resp_len;
12426         /*
12427          * This is the configured maximum length of Ethernet packet
12428          * payload that is allowed to be received on the port.
12429          * This value does not include the number of bytes used by the
12430          * Ethernet header and trailer (CRC).
12431          */
12432         uint16_t        mru;
12433         /*
12434          * This is the configured maximum length of Ethernet packet
12435          * payload that is allowed to be transmitted on the port.
12436          * This value does not include the number of bytes used by the
12437          * Ethernet header and trailer (CRC).
12438          */
12439         uint16_t        mtu;
12440         /*
12441          * The minimum IPG that will
12442          * be sent between packets by this port.
12443          */
12444         uint8_t ipg;
12445         /* The loopback setting for the MAC. */
12446         uint8_t lpbk;
12447         /* No loopback is selected.  Normal operation. */
12448         #define HWRM_PORT_MAC_QCFG_OUTPUT_LPBK_NONE   UINT32_C(0x0)
12449         /*
12450          * The HW will be configured with local loopback such that
12451          * host data is sent back to the host without modification.
12452          */
12453         #define HWRM_PORT_MAC_QCFG_OUTPUT_LPBK_LOCAL  UINT32_C(0x1)
12454         /*
12455          * The HW will be configured with remote loopback such that
12456          * port logic will send packets back out the transmitter that
12457          * are received.
12458          */
12459         #define HWRM_PORT_MAC_QCFG_OUTPUT_LPBK_REMOTE UINT32_C(0x2)
12460         #define HWRM_PORT_MAC_QCFG_OUTPUT_LPBK_LAST \
12461                 HWRM_PORT_MAC_QCFG_OUTPUT_LPBK_REMOTE
12462         /*
12463          * Priority setting for VLAN PRI to CoS mapping.
12464          * # Each XXX_pri variable shall have a unique priority value
12465          * when it is being used.
12466          * # When comparing priorities of mappings, higher value
12467          * indicates higher priority.
12468          * For example, a value of 0-3 is returned where 0 is being
12469          * the lowest priority and 3 is being the highest priority.
12470          * # If the correspoding CoS mapping is not enabled, then this
12471          * field should be ignored.
12472          * # This value indicates the normalized priority value retained
12473          * in the HWRM.
12474          */
12475         uint8_t vlan_pri2cos_map_pri;
12476         /*
12477          * In this field, a number of CoS mappings related flags
12478          * are used to indicate configured CoS mappings.
12479          */
12480         uint8_t flags;
12481         /*
12482          * When this bit is set to '1', the inner VLAN PRI to CoS mapping
12483          * is enabled.
12484          */
12485         #define HWRM_PORT_MAC_QCFG_OUTPUT_FLAGS_VLAN_PRI2COS_ENABLE \
12486                 UINT32_C(0x1)
12487         /*
12488          * When this bit is set to '1', tunnel VLAN PRI field to
12489          * CoS mapping is enabled.
12490          */
12491         #define HWRM_PORT_MAC_QCFG_OUTPUT_FLAGS_TUNNEL_PRI2COS_ENABLE \
12492                 UINT32_C(0x2)
12493         /*
12494          * When this bit is set to '1', the IP DSCP to CoS mapping is
12495          * enabled.
12496          */
12497         #define HWRM_PORT_MAC_QCFG_OUTPUT_FLAGS_IP_DSCP2COS_ENABLE \
12498                 UINT32_C(0x4)
12499         /*
12500          * When this bit is '1', the Out-Of-Box WoL is enabled on this
12501          * port.
12502          */
12503         #define HWRM_PORT_MAC_QCFG_OUTPUT_FLAGS_OOB_WOL_ENABLE \
12504                 UINT32_C(0x8)
12505         /* When this bit is '1', PTP is enabled for RX on this port. */
12506         #define HWRM_PORT_MAC_QCFG_OUTPUT_FLAGS_PTP_RX_TS_CAPTURE_ENABLE \
12507                 UINT32_C(0x10)
12508         /* When this bit is '1', PTP is enabled for TX on this port. */
12509         #define HWRM_PORT_MAC_QCFG_OUTPUT_FLAGS_PTP_TX_TS_CAPTURE_ENABLE \
12510                 UINT32_C(0x20)
12511         /*
12512          * Priority setting for tunnel VLAN PRI to CoS mapping.
12513          * # Each XXX_pri variable shall have a unique priority value
12514          * when it is being used.
12515          * # When comparing priorities of mappings, higher value
12516          * indicates higher priority.
12517          * For example, a value of 0-3 is returned where 0 is being
12518          * the lowest priority and 3 is being the highest priority.
12519          * # If the correspoding CoS mapping is not enabled, then this
12520          * field should be ignored.
12521          * # This value indicates the normalized priority value retained
12522          * in the HWRM.
12523          */
12524         uint8_t tunnel_pri2cos_map_pri;
12525         /*
12526          * Priority setting for DSCP to PRI mapping.
12527          * # Each XXX_pri variable shall have a unique priority value
12528          * when it is being used.
12529          * # When comparing priorities of mappings, higher value
12530          * indicates higher priority.
12531          * For example, a value of 0-3 is returned where 0 is being
12532          * the lowest priority and 3 is being the highest priority.
12533          * # If the correspoding CoS mapping is not enabled, then this
12534          * field should be ignored.
12535          * # This value indicates the normalized priority value retained
12536          * in the HWRM.
12537          */
12538         uint8_t dscp2pri_map_pri;
12539         /*
12540          * This is a 16-bit bit mask that represents the
12541          * current configuration of time stamp capture of PTP messages
12542          * on the receive side of this port.
12543          * If bit 'i' is set, then the receive side of the port
12544          * is configured to capture the time stamp of every
12545          * received PTP message with messageType field value set
12546          * to i.
12547          * If all bits are set to 0 (i.e. field value set 0),
12548          * then the receive side of the port is not configured
12549          * to capture timestamp for PTP messages.
12550          * If all bits are set to 1, then the receive side of the
12551          * port is configured to capture timestamp for all PTP
12552          * messages.
12553          */
12554         uint16_t        rx_ts_capture_ptp_msg_type;
12555         /*
12556          * This is a 16-bit bit mask that represents the
12557          * current configuration of time stamp capture of PTP messages
12558          * on the transmit side of this port.
12559          * If bit 'i' is set, then the transmit side of the port
12560          * is configured to capture the time stamp of every
12561          * received PTP message with messageType field value set
12562          * to i.
12563          * If all bits are set to 0 (i.e. field value set 0),
12564          * then the transmit side of the port is not configured
12565          * to capture timestamp for PTP messages.
12566          * If all bits are set to 1, then the transmit side of the
12567          * port is configured to capture timestamp for all PTP
12568          * messages.
12569          */
12570         uint16_t        tx_ts_capture_ptp_msg_type;
12571         /* Configuration of CoS fields. */
12572         uint8_t cos_field_cfg;
12573         /* Reserved */
12574         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_RSVD \
12575                 UINT32_C(0x1)
12576         /*
12577          * This field is used for selecting VLAN PRI value
12578          * based on whether one or two VLAN Tags are present in
12579          * the inner packet headers of tunneled packets or
12580          * non-tunneled packets.
12581          */
12582         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_VLAN_PRI_SEL_MASK \
12583                 UINT32_C(0x6)
12584         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_VLAN_PRI_SEL_SFT \
12585                 1
12586         /*
12587          * Select inner VLAN PRI when 1 or 2 VLAN Tags are
12588          * present in the inner packet headers
12589          */
12590         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_VLAN_PRI_SEL_INNERMOST \
12591                 (UINT32_C(0x0) << 1)
12592         /*
12593          * Select outer VLAN Tag PRI when 2 VLAN Tags are
12594          * present in the inner packet headers.
12595          * No VLAN PRI is selected for this configuration
12596          * if only one VLAN Tag is present in the inner
12597          * packet headers.
12598          */
12599         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_VLAN_PRI_SEL_OUTER \
12600                 (UINT32_C(0x1) << 1)
12601         /*
12602          * Select outermost VLAN PRI when 1 or 2 VLAN Tags
12603          * are present in the inner packet headers
12604          */
12605         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_VLAN_PRI_SEL_OUTERMOST \
12606                 (UINT32_C(0x2) << 1)
12607         /* Unspecified */
12608         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_VLAN_PRI_SEL_UNSPECIFIED \
12609                 (UINT32_C(0x3) << 1)
12610         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_VLAN_PRI_SEL_LAST \
12611                 HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_VLAN_PRI_SEL_UNSPECIFIED
12612         /*
12613          * This field is used for selecting tunnel VLAN PRI value
12614          * based on whether one or two VLAN Tags are present in
12615          * the tunnel headers of tunneled packets. This selection
12616          * does not apply to non-tunneled packets.
12617          */
12618         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_MASK \
12619                 UINT32_C(0x18)
12620         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_SFT \
12621                 3
12622         /*
12623          * Select inner VLAN PRI when 1 or 2 VLAN Tags are
12624          * present in the tunnel packet headers
12625          */
12626         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_INNERMOST \
12627                 (UINT32_C(0x0) << 3)
12628         /*
12629          * Select outer VLAN Tag PRI when 2 VLAN Tags are
12630          * present in the tunnel packet headers.
12631          * No VLAN PRI is selected for this configuration
12632          * if only one VLAN Tag is present in the tunnel
12633          * packet headers.
12634          */
12635         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_OUTER \
12636                 (UINT32_C(0x1) << 3)
12637         /*
12638          * Select outermost VLAN PRI when 1 or 2 VLAN Tags
12639          * are present in the tunnel packet headers
12640          */
12641         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_OUTERMOST \
12642                 (UINT32_C(0x2) << 3)
12643         /* Unspecified */
12644         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_UNSPECIFIED \
12645                 (UINT32_C(0x3) << 3)
12646         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_LAST \
12647                 HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_T_VLAN_PRI_SEL_UNSPECIFIED
12648         /*
12649          * This field is used to provide default CoS value that
12650          * has been configured on this port.
12651          */
12652         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_DEFAULT_COS_MASK \
12653                 UINT32_C(0xe0)
12654         #define HWRM_PORT_MAC_QCFG_OUTPUT_COS_FIELD_CFG_DEFAULT_COS_SFT \
12655                 5
12656         /*
12657          * This field is used in Output records to indicate that the output
12658          * is completely written to RAM.  This field should be read as '1'
12659          * to indicate that the output has been completely written.
12660          * When writing a command completion or response to an internal processor,
12661          * the order of writes has to be such that this field is written last.
12662          */
12663         uint8_t valid;
12664 } __attribute__((packed));
12665
12666 /**************************
12667  * hwrm_port_mac_ptp_qcfg *
12668  **************************/
12669
12670
12671 /* hwrm_port_mac_ptp_qcfg_input (size:192b/24B) */
12672 struct hwrm_port_mac_ptp_qcfg_input {
12673         /* The HWRM command request type. */
12674         uint16_t        req_type;
12675         /*
12676          * The completion ring to send the completion event on. This should
12677          * be the NQ ID returned from the `nq_alloc` HWRM command.
12678          */
12679         uint16_t        cmpl_ring;
12680         /*
12681          * The sequence ID is used by the driver for tracking multiple
12682          * commands. This ID is treated as opaque data by the firmware and
12683          * the value is returned in the `hwrm_resp_hdr` upon completion.
12684          */
12685         uint16_t        seq_id;
12686         /*
12687          * The target ID of the command:
12688          * * 0x0-0xFFF8 - The function ID
12689          * * 0xFFF8-0xFFFE - Reserved for internal processors
12690          * * 0xFFFF - HWRM
12691          */
12692         uint16_t        target_id;
12693         /*
12694          * A physical address pointer pointing to a host buffer that the
12695          * command's response data will be written. This can be either a host
12696          * physical address (HPA) or a guest physical address (GPA) and must
12697          * point to a physically contiguous block of memory.
12698          */
12699         uint64_t        resp_addr;
12700         /* Port ID of port that is being queried. */
12701         uint16_t        port_id;
12702         uint8_t unused_0[6];
12703 } __attribute__((packed));
12704
12705 /* hwrm_port_mac_ptp_qcfg_output (size:640b/80B) */
12706 struct hwrm_port_mac_ptp_qcfg_output {
12707         /* The specific error status for the command. */
12708         uint16_t        error_code;
12709         /* The HWRM command request type. */
12710         uint16_t        req_type;
12711         /* The sequence ID from the original command. */
12712         uint16_t        seq_id;
12713         /* The length of the response data in number of bytes. */
12714         uint16_t        resp_len;
12715         /*
12716          * In this field, a number of PTP related flags
12717          * are used to indicate configured PTP capabilities.
12718          */
12719         uint8_t flags;
12720         /*
12721          * When this bit is set to '1', the PTP related registers are
12722          * directly accessible by the host.
12723          */
12724         #define HWRM_PORT_MAC_PTP_QCFG_OUTPUT_FLAGS_DIRECT_ACCESS \
12725                 UINT32_C(0x1)
12726         /*
12727          * When this bit is set to '1', the PTP information is accessible
12728          * via HWRM commands.
12729          */
12730         #define HWRM_PORT_MAC_PTP_QCFG_OUTPUT_FLAGS_HWRM_ACCESS \
12731                 UINT32_C(0x2)
12732         uint8_t unused_0[3];
12733         /* Offset of the PTP register for the lower 32 bits of timestamp for RX. */
12734         uint32_t        rx_ts_reg_off_lower;
12735         /* Offset of the PTP register for the upper 32 bits of timestamp for RX. */
12736         uint32_t        rx_ts_reg_off_upper;
12737         /* Offset of the PTP register for the sequence ID for RX. */
12738         uint32_t        rx_ts_reg_off_seq_id;
12739         /* Offset of the first PTP source ID for RX. */
12740         uint32_t        rx_ts_reg_off_src_id_0;
12741         /* Offset of the second PTP source ID for RX. */
12742         uint32_t        rx_ts_reg_off_src_id_1;
12743         /* Offset of the third PTP source ID for RX. */
12744         uint32_t        rx_ts_reg_off_src_id_2;
12745         /* Offset of the domain ID for RX. */
12746         uint32_t        rx_ts_reg_off_domain_id;
12747         /* Offset of the PTP FIFO register for RX. */
12748         uint32_t        rx_ts_reg_off_fifo;
12749         /* Offset of the PTP advance FIFO register for RX. */
12750         uint32_t        rx_ts_reg_off_fifo_adv;
12751         /* PTP timestamp granularity for RX. */
12752         uint32_t        rx_ts_reg_off_granularity;
12753         /* Offset of the PTP register for the lower 32 bits of timestamp for TX. */
12754         uint32_t        tx_ts_reg_off_lower;
12755         /* Offset of the PTP register for the upper 32 bits of timestamp for TX. */
12756         uint32_t        tx_ts_reg_off_upper;
12757         /* Offset of the PTP register for the sequence ID for TX. */
12758         uint32_t        tx_ts_reg_off_seq_id;
12759         /* Offset of the PTP FIFO register for TX. */
12760         uint32_t        tx_ts_reg_off_fifo;
12761         /* PTP timestamp granularity for TX. */
12762         uint32_t        tx_ts_reg_off_granularity;
12763         uint8_t unused_1[7];
12764         /*
12765          * This field is used in Output records to indicate that the output
12766          * is completely written to RAM.  This field should be read as '1'
12767          * to indicate that the output has been completely written.
12768          * When writing a command completion or response to an internal processor,
12769          * the order of writes has to be such that this field is written last.
12770          */
12771         uint8_t valid;
12772 } __attribute__((packed));
12773
12774 /* Port Tx Statistics Formats */
12775 /* tx_port_stats (size:3264b/408B) */
12776 struct tx_port_stats {
12777         /* Total Number of 64 Bytes frames transmitted */
12778         uint64_t        tx_64b_frames;
12779         /* Total Number of 65-127 Bytes frames transmitted */
12780         uint64_t        tx_65b_127b_frames;
12781         /* Total Number of 128-255 Bytes frames transmitted */
12782         uint64_t        tx_128b_255b_frames;
12783         /* Total Number of 256-511 Bytes frames transmitted */
12784         uint64_t        tx_256b_511b_frames;
12785         /* Total Number of 512-1023 Bytes frames transmitted */
12786         uint64_t        tx_512b_1023b_frames;
12787         /* Total Number of 1024-1518 Bytes frames transmitted */
12788         uint64_t        tx_1024b_1518b_frames;
12789         /*
12790          * Total Number of each good VLAN (exludes FCS errors)
12791          * frame transmitted which is 1519 to 1522 bytes in length
12792          * inclusive (excluding framing bits but including FCS bytes).
12793          */
12794         uint64_t        tx_good_vlan_frames;
12795         /* Total Number of 1519-2047 Bytes frames transmitted */
12796         uint64_t        tx_1519b_2047b_frames;
12797         /* Total Number of 2048-4095 Bytes frames transmitted */
12798         uint64_t        tx_2048b_4095b_frames;
12799         /* Total Number of 4096-9216 Bytes frames transmitted */
12800         uint64_t        tx_4096b_9216b_frames;
12801         /* Total Number of 9217-16383 Bytes frames transmitted */
12802         uint64_t        tx_9217b_16383b_frames;
12803         /* Total Number of good frames transmitted */
12804         uint64_t        tx_good_frames;
12805         /* Total Number of frames transmitted */
12806         uint64_t        tx_total_frames;
12807         /* Total number of unicast frames transmitted */
12808         uint64_t        tx_ucast_frames;
12809         /* Total number of multicast frames transmitted */
12810         uint64_t        tx_mcast_frames;
12811         /* Total number of broadcast frames transmitted */
12812         uint64_t        tx_bcast_frames;
12813         /* Total number of PAUSE control frames transmitted */
12814         uint64_t        tx_pause_frames;
12815         /*
12816          * Total number of PFC/per-priority PAUSE
12817          * control frames transmitted
12818          */
12819         uint64_t        tx_pfc_frames;
12820         /* Total number of jabber frames transmitted */
12821         uint64_t        tx_jabber_frames;
12822         /* Total number of frames transmitted with FCS error */
12823         uint64_t        tx_fcs_err_frames;
12824         /* Total number of control frames transmitted */
12825         uint64_t        tx_control_frames;
12826         /* Total number of over-sized frames transmitted */
12827         uint64_t        tx_oversz_frames;
12828         /* Total number of frames with single deferral */
12829         uint64_t        tx_single_dfrl_frames;
12830         /* Total number of frames with multiple deferrals */
12831         uint64_t        tx_multi_dfrl_frames;
12832         /* Total number of frames with single collision */
12833         uint64_t        tx_single_coll_frames;
12834         /* Total number of frames with multiple collisions */
12835         uint64_t        tx_multi_coll_frames;
12836         /* Total number of frames with late collisions */
12837         uint64_t        tx_late_coll_frames;
12838         /* Total number of frames with excessive collisions */
12839         uint64_t        tx_excessive_coll_frames;
12840         /* Total number of fragmented frames transmitted */
12841         uint64_t        tx_frag_frames;
12842         /* Total number of transmit errors */
12843         uint64_t        tx_err;
12844         /* Total number of single VLAN tagged frames transmitted */
12845         uint64_t        tx_tagged_frames;
12846         /* Total number of double VLAN tagged frames transmitted */
12847         uint64_t        tx_dbl_tagged_frames;
12848         /* Total number of runt frames transmitted */
12849         uint64_t        tx_runt_frames;
12850         /* Total number of TX FIFO under runs */
12851         uint64_t        tx_fifo_underruns;
12852         /*
12853          * Total number of PFC frames with PFC enabled bit for
12854          * Pri 0 transmitted
12855          */
12856         uint64_t        tx_pfc_ena_frames_pri0;
12857         /*
12858          * Total number of PFC frames with PFC enabled bit for
12859          * Pri 1 transmitted
12860          */
12861         uint64_t        tx_pfc_ena_frames_pri1;
12862         /*
12863          * Total number of PFC frames with PFC enabled bit for
12864          * Pri 2 transmitted
12865          */
12866         uint64_t        tx_pfc_ena_frames_pri2;
12867         /*
12868          * Total number of PFC frames with PFC enabled bit for
12869          * Pri 3 transmitted
12870          */
12871         uint64_t        tx_pfc_ena_frames_pri3;
12872         /*
12873          * Total number of PFC frames with PFC enabled bit for
12874          * Pri 4 transmitted
12875          */
12876         uint64_t        tx_pfc_ena_frames_pri4;
12877         /*
12878          * Total number of PFC frames with PFC enabled bit for
12879          * Pri 5 transmitted
12880          */
12881         uint64_t        tx_pfc_ena_frames_pri5;
12882         /*
12883          * Total number of PFC frames with PFC enabled bit for
12884          * Pri 6 transmitted
12885          */
12886         uint64_t        tx_pfc_ena_frames_pri6;
12887         /*
12888          * Total number of PFC frames with PFC enabled bit for
12889          * Pri 7 transmitted
12890          */
12891         uint64_t        tx_pfc_ena_frames_pri7;
12892         /* Total number of EEE LPI Events on TX */
12893         uint64_t        tx_eee_lpi_events;
12894         /* EEE LPI Duration Counter on TX */
12895         uint64_t        tx_eee_lpi_duration;
12896         /*
12897          * Total number of Link Level Flow Control (LLFC) messages
12898          * transmitted
12899          */
12900         uint64_t        tx_llfc_logical_msgs;
12901         /* Total number of HCFC messages transmitted */
12902         uint64_t        tx_hcfc_msgs;
12903         /* Total number of TX collisions */
12904         uint64_t        tx_total_collisions;
12905         /* Total number of transmitted bytes */
12906         uint64_t        tx_bytes;
12907         /* Total number of end-to-end HOL frames */
12908         uint64_t        tx_xthol_frames;
12909         /* Total Tx Drops per Port reported by STATS block */
12910         uint64_t        tx_stat_discard;
12911         /* Total Tx Error Drops per Port reported by STATS block */
12912         uint64_t        tx_stat_error;
12913 } __attribute__((packed));
12914
12915 /* Port Rx Statistics Formats */
12916 /* rx_port_stats (size:4224b/528B) */
12917 struct rx_port_stats {
12918         /* Total Number of 64 Bytes frames received */
12919         uint64_t        rx_64b_frames;
12920         /* Total Number of 65-127 Bytes frames received */
12921         uint64_t        rx_65b_127b_frames;
12922         /* Total Number of 128-255 Bytes frames received */
12923         uint64_t        rx_128b_255b_frames;
12924         /* Total Number of 256-511 Bytes frames received */
12925         uint64_t        rx_256b_511b_frames;
12926         /* Total Number of 512-1023 Bytes frames received */
12927         uint64_t        rx_512b_1023b_frames;
12928         /* Total Number of 1024-1518 Bytes frames received */
12929         uint64_t        rx_1024b_1518b_frames;
12930         /*
12931          * Total Number of each good VLAN (exludes FCS errors)
12932          * frame received which is 1519 to 1522 bytes in length
12933          * inclusive (excluding framing bits but including FCS bytes).
12934          */
12935         uint64_t        rx_good_vlan_frames;
12936         /* Total Number of 1519-2047 Bytes frames received */
12937         uint64_t        rx_1519b_2047b_frames;
12938         /* Total Number of 2048-4095 Bytes frames received */
12939         uint64_t        rx_2048b_4095b_frames;
12940         /* Total Number of 4096-9216 Bytes frames received */
12941         uint64_t        rx_4096b_9216b_frames;
12942         /* Total Number of 9217-16383 Bytes frames received */
12943         uint64_t        rx_9217b_16383b_frames;
12944         /* Total number of frames received */
12945         uint64_t        rx_total_frames;
12946         /* Total number of unicast frames received */
12947         uint64_t        rx_ucast_frames;
12948         /* Total number of multicast frames received */
12949         uint64_t        rx_mcast_frames;
12950         /* Total number of broadcast frames received */
12951         uint64_t        rx_bcast_frames;
12952         /* Total number of received frames with FCS error */
12953         uint64_t        rx_fcs_err_frames;
12954         /* Total number of control frames received */
12955         uint64_t        rx_ctrl_frames;
12956         /* Total number of PAUSE frames received */
12957         uint64_t        rx_pause_frames;
12958         /* Total number of PFC frames received */
12959         uint64_t        rx_pfc_frames;
12960         /*
12961          * Total number of frames received with an unsupported
12962          * opcode
12963          */
12964         uint64_t        rx_unsupported_opcode_frames;
12965         /*
12966          * Total number of frames received with an unsupported
12967          * DA for pause and PFC
12968          */
12969         uint64_t        rx_unsupported_da_pausepfc_frames;
12970         /* Total number of frames received with an unsupported SA */
12971         uint64_t        rx_wrong_sa_frames;
12972         /* Total number of received packets with alignment error */
12973         uint64_t        rx_align_err_frames;
12974         /* Total number of received frames with out-of-range length */
12975         uint64_t        rx_oor_len_frames;
12976         /* Total number of received frames with error termination */
12977         uint64_t        rx_code_err_frames;
12978         /*
12979          * Total number of received frames with a false carrier is
12980          * detected during idle, as defined by RX_ER samples active
12981          * and RXD is 0xE. The event is reported along with the
12982          * statistics generated on the next received frame. Only
12983          * one false carrier condition can be detected and logged
12984          * between frames.
12985          *
12986          * Carrier event, valid for 10M/100M speed modes only.
12987          */
12988         uint64_t        rx_false_carrier_frames;
12989         /* Total number of over-sized frames received */
12990         uint64_t        rx_ovrsz_frames;
12991         /* Total number of jabber packets received */
12992         uint64_t        rx_jbr_frames;
12993         /* Total number of received frames with MTU error */
12994         uint64_t        rx_mtu_err_frames;
12995         /* Total number of received frames with CRC match */
12996         uint64_t        rx_match_crc_frames;
12997         /* Total number of frames received promiscuously */
12998         uint64_t        rx_promiscuous_frames;
12999         /*
13000          * Total number of received frames with one or two VLAN
13001          * tags
13002          */
13003         uint64_t        rx_tagged_frames;
13004         /* Total number of received frames with two VLAN tags */
13005         uint64_t        rx_double_tagged_frames;
13006         /* Total number of truncated frames received */
13007         uint64_t        rx_trunc_frames;
13008         /* Total number of good frames (without errors) received */
13009         uint64_t        rx_good_frames;
13010         /*
13011          * Total number of received PFC frames with transition from
13012          * XON to XOFF on Pri 0
13013          */
13014         uint64_t        rx_pfc_xon2xoff_frames_pri0;
13015         /*
13016          * Total number of received PFC frames with transition from
13017          * XON to XOFF on Pri 1
13018          */
13019         uint64_t        rx_pfc_xon2xoff_frames_pri1;
13020         /*
13021          * Total number of received PFC frames with transition from
13022          * XON to XOFF on Pri 2
13023          */
13024         uint64_t        rx_pfc_xon2xoff_frames_pri2;
13025         /*
13026          * Total number of received PFC frames with transition from
13027          * XON to XOFF on Pri 3
13028          */
13029         uint64_t        rx_pfc_xon2xoff_frames_pri3;
13030         /*
13031          * Total number of received PFC frames with transition from
13032          * XON to XOFF on Pri 4
13033          */
13034         uint64_t        rx_pfc_xon2xoff_frames_pri4;
13035         /*
13036          * Total number of received PFC frames with transition from
13037          * XON to XOFF on Pri 5
13038          */
13039         uint64_t        rx_pfc_xon2xoff_frames_pri5;
13040         /*
13041          * Total number of received PFC frames with transition from
13042          * XON to XOFF on Pri 6
13043          */
13044         uint64_t        rx_pfc_xon2xoff_frames_pri6;
13045         /*
13046          * Total number of received PFC frames with transition from
13047          * XON to XOFF on Pri 7
13048          */
13049         uint64_t        rx_pfc_xon2xoff_frames_pri7;
13050         /*
13051          * Total number of received PFC frames with PFC enabled
13052          * bit for Pri 0
13053          */
13054         uint64_t        rx_pfc_ena_frames_pri0;
13055         /*
13056          * Total number of received PFC frames with PFC enabled
13057          * bit for Pri 1
13058          */
13059         uint64_t        rx_pfc_ena_frames_pri1;
13060         /*
13061          * Total number of received PFC frames with PFC enabled
13062          * bit for Pri 2
13063          */
13064         uint64_t        rx_pfc_ena_frames_pri2;
13065         /*
13066          * Total number of received PFC frames with PFC enabled
13067          * bit for Pri 3
13068          */
13069         uint64_t        rx_pfc_ena_frames_pri3;
13070         /*
13071          * Total number of received PFC frames with PFC enabled
13072          * bit for Pri 4
13073          */
13074         uint64_t        rx_pfc_ena_frames_pri4;
13075         /*
13076          * Total number of received PFC frames with PFC enabled
13077          * bit for Pri 5
13078          */
13079         uint64_t        rx_pfc_ena_frames_pri5;
13080         /*
13081          * Total number of received PFC frames with PFC enabled
13082          * bit for Pri 6
13083          */
13084         uint64_t        rx_pfc_ena_frames_pri6;
13085         /*
13086          * Total number of received PFC frames with PFC enabled
13087          * bit for Pri 7
13088          */
13089         uint64_t        rx_pfc_ena_frames_pri7;
13090         /* Total Number of frames received with SCH CRC error */
13091         uint64_t        rx_sch_crc_err_frames;
13092         /* Total Number of under-sized frames received */
13093         uint64_t        rx_undrsz_frames;
13094         /* Total Number of fragmented frames received */
13095         uint64_t        rx_frag_frames;
13096         /* Total number of RX EEE LPI Events */
13097         uint64_t        rx_eee_lpi_events;
13098         /* EEE LPI Duration Counter on RX */
13099         uint64_t        rx_eee_lpi_duration;
13100         /*
13101          * Total number of physical type Link Level Flow Control
13102          * (LLFC) messages received
13103          */
13104         uint64_t        rx_llfc_physical_msgs;
13105         /*
13106          * Total number of logical type Link Level Flow Control
13107          * (LLFC) messages received
13108          */
13109         uint64_t        rx_llfc_logical_msgs;
13110         /*
13111          * Total number of logical type Link Level Flow Control
13112          * (LLFC) messages received with CRC error
13113          */
13114         uint64_t        rx_llfc_msgs_with_crc_err;
13115         /* Total number of HCFC messages received */
13116         uint64_t        rx_hcfc_msgs;
13117         /* Total number of HCFC messages received with CRC error */
13118         uint64_t        rx_hcfc_msgs_with_crc_err;
13119         /* Total number of received bytes */
13120         uint64_t        rx_bytes;
13121         /* Total number of bytes received in runt frames */
13122         uint64_t        rx_runt_bytes;
13123         /* Total number of runt frames received */
13124         uint64_t        rx_runt_frames;
13125         /* Total Rx Discards per Port reported by STATS block */
13126         uint64_t        rx_stat_discard;
13127         uint64_t        rx_stat_err;
13128 } __attribute__((packed));
13129
13130 /********************
13131  * hwrm_port_qstats *
13132  ********************/
13133
13134
13135 /* hwrm_port_qstats_input (size:320b/40B) */
13136 struct hwrm_port_qstats_input {
13137         /* The HWRM command request type. */
13138         uint16_t        req_type;
13139         /*
13140          * The completion ring to send the completion event on. This should
13141          * be the NQ ID returned from the `nq_alloc` HWRM command.
13142          */
13143         uint16_t        cmpl_ring;
13144         /*
13145          * The sequence ID is used by the driver for tracking multiple
13146          * commands. This ID is treated as opaque data by the firmware and
13147          * the value is returned in the `hwrm_resp_hdr` upon completion.
13148          */
13149         uint16_t        seq_id;
13150         /*
13151          * The target ID of the command:
13152          * * 0x0-0xFFF8 - The function ID
13153          * * 0xFFF8-0xFFFE - Reserved for internal processors
13154          * * 0xFFFF - HWRM
13155          */
13156         uint16_t        target_id;
13157         /*
13158          * A physical address pointer pointing to a host buffer that the
13159          * command's response data will be written. This can be either a host
13160          * physical address (HPA) or a guest physical address (GPA) and must
13161          * point to a physically contiguous block of memory.
13162          */
13163         uint64_t        resp_addr;
13164         /* Port ID of port that is being queried. */
13165         uint16_t        port_id;
13166         uint8_t unused_0[6];
13167         /*
13168          * This is the host address where
13169          * Tx port statistics will be stored
13170          */
13171         uint64_t        tx_stat_host_addr;
13172         /*
13173          * This is the host address where
13174          * Rx port statistics will be stored
13175          */
13176         uint64_t        rx_stat_host_addr;
13177 } __attribute__((packed));
13178
13179 /* hwrm_port_qstats_output (size:128b/16B) */
13180 struct hwrm_port_qstats_output {
13181         /* The specific error status for the command. */
13182         uint16_t        error_code;
13183         /* The HWRM command request type. */
13184         uint16_t        req_type;
13185         /* The sequence ID from the original command. */
13186         uint16_t        seq_id;
13187         /* The length of the response data in number of bytes. */
13188         uint16_t        resp_len;
13189         /* The size of TX port statistics block in bytes. */
13190         uint16_t        tx_stat_size;
13191         /* The size of RX port statistics block in bytes. */
13192         uint16_t        rx_stat_size;
13193         uint8_t unused_0[3];
13194         /*
13195          * This field is used in Output records to indicate that the output
13196          * is completely written to RAM.  This field should be read as '1'
13197          * to indicate that the output has been completely written.
13198          * When writing a command completion or response to an internal processor,
13199          * the order of writes has to be such that this field is written last.
13200          */
13201         uint8_t valid;
13202 } __attribute__((packed));
13203
13204 /* Port Tx Statistics extended Formats */
13205 /* tx_port_stats_ext (size:2048b/256B) */
13206 struct tx_port_stats_ext {
13207         /* Total number of tx bytes count on cos queue 0 */
13208         uint64_t        tx_bytes_cos0;
13209         /* Total number of tx bytes count on cos queue 1 */
13210         uint64_t        tx_bytes_cos1;
13211         /* Total number of tx bytes count on cos queue 2 */
13212         uint64_t        tx_bytes_cos2;
13213         /* Total number of tx bytes count on cos queue 3 */
13214         uint64_t        tx_bytes_cos3;
13215         /* Total number of tx bytes count on cos queue 4 */
13216         uint64_t        tx_bytes_cos4;
13217         /* Total number of tx bytes count on cos queue 5 */
13218         uint64_t        tx_bytes_cos5;
13219         /* Total number of tx bytes count on cos queue 6 */
13220         uint64_t        tx_bytes_cos6;
13221         /* Total number of tx bytes count on cos queue 7 */
13222         uint64_t        tx_bytes_cos7;
13223         /* Total number of tx packets count on cos queue 0 */
13224         uint64_t        tx_packets_cos0;
13225         /* Total number of tx packets count on cos queue 1 */
13226         uint64_t        tx_packets_cos1;
13227         /* Total number of tx packets count on cos queue 2 */
13228         uint64_t        tx_packets_cos2;
13229         /* Total number of tx packets count on cos queue 3 */
13230         uint64_t        tx_packets_cos3;
13231         /* Total number of tx packets count on cos queue 4 */
13232         uint64_t        tx_packets_cos4;
13233         /* Total number of tx packets count on cos queue 5 */
13234         uint64_t        tx_packets_cos5;
13235         /* Total number of tx packets count on cos queue 6 */
13236         uint64_t        tx_packets_cos6;
13237         /* Total number of tx packets count on cos queue 7 */
13238         uint64_t        tx_packets_cos7;
13239         /* time duration between transmitting a XON -> XOFF and a subsequent XOFF -> XON for priority 0 */
13240         uint64_t        pfc_pri0_tx_duration_us;
13241         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 0 */
13242         uint64_t        pfc_pri0_tx_transitions;
13243         /* time duration between transmitting a XON -> XOFF and a subsequent XOFF -> XON for priority 1 */
13244         uint64_t        pfc_pri1_tx_duration_us;
13245         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 1 */
13246         uint64_t        pfc_pri1_tx_transitions;
13247         /* time duration between transmitting a XON -> XOFF and a subsequent XOFF -> XON for priority 2 */
13248         uint64_t        pfc_pri2_tx_duration_us;
13249         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 2 */
13250         uint64_t        pfc_pri2_tx_transitions;
13251         /* time duration between transmitting a XON -> XOFF and a subsequent XOFF -> XON for priority 3 */
13252         uint64_t        pfc_pri3_tx_duration_us;
13253         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 3 */
13254         uint64_t        pfc_pri3_tx_transitions;
13255         /* time duration between transmitting a XON -> XOFF and a subsequent XOFF -> XON for priority 4 */
13256         uint64_t        pfc_pri4_tx_duration_us;
13257         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 4 */
13258         uint64_t        pfc_pri4_tx_transitions;
13259         /* time duration between transmitting a XON -> XOFF and a subsequent XOFF -> XON for priority 5 */
13260         uint64_t        pfc_pri5_tx_duration_us;
13261         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 5 */
13262         uint64_t        pfc_pri5_tx_transitions;
13263         /* time duration between transmitting a XON -> XOFF and a subsequent XOFF -> XON for priority 6 */
13264         uint64_t        pfc_pri6_tx_duration_us;
13265         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 6 */
13266         uint64_t        pfc_pri6_tx_transitions;
13267         /* time duration between transmitting a XON -> XOFF and a subsequent XOFF -> XON for priority 7 */
13268         uint64_t        pfc_pri7_tx_duration_us;
13269         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 7 */
13270         uint64_t        pfc_pri7_tx_transitions;
13271 } __attribute__((packed));
13272
13273 /* Port Rx Statistics extended Formats */
13274 /* rx_port_stats_ext (size:2368b/296B) */
13275 struct rx_port_stats_ext {
13276         /* Number of times link state changed to down */
13277         uint64_t        link_down_events;
13278         /* Number of times the idle rings with pause bit are found */
13279         uint64_t        continuous_pause_events;
13280         /* Number of times the active rings pause bit resumed back */
13281         uint64_t        resume_pause_events;
13282         /* Number of times, the ROCE cos queue PFC is disabled to avoid pause flood/burst */
13283         uint64_t        continuous_roce_pause_events;
13284         /* Number of times, the ROCE cos queue PFC is enabled back */
13285         uint64_t        resume_roce_pause_events;
13286         /* Total number of rx bytes count on cos queue 0 */
13287         uint64_t        rx_bytes_cos0;
13288         /* Total number of rx bytes count on cos queue 1 */
13289         uint64_t        rx_bytes_cos1;
13290         /* Total number of rx bytes count on cos queue 2 */
13291         uint64_t        rx_bytes_cos2;
13292         /* Total number of rx bytes count on cos queue 3 */
13293         uint64_t        rx_bytes_cos3;
13294         /* Total number of rx bytes count on cos queue 4 */
13295         uint64_t        rx_bytes_cos4;
13296         /* Total number of rx bytes count on cos queue 5 */
13297         uint64_t        rx_bytes_cos5;
13298         /* Total number of rx bytes count on cos queue 6 */
13299         uint64_t        rx_bytes_cos6;
13300         /* Total number of rx bytes count on cos queue 7 */
13301         uint64_t        rx_bytes_cos7;
13302         /* Total number of rx packets count on cos queue 0 */
13303         uint64_t        rx_packets_cos0;
13304         /* Total number of rx packets count on cos queue 1 */
13305         uint64_t        rx_packets_cos1;
13306         /* Total number of rx packets count on cos queue 2 */
13307         uint64_t        rx_packets_cos2;
13308         /* Total number of rx packets count on cos queue 3 */
13309         uint64_t        rx_packets_cos3;
13310         /* Total number of rx packets count on cos queue 4 */
13311         uint64_t        rx_packets_cos4;
13312         /* Total number of rx packets count on cos queue 5 */
13313         uint64_t        rx_packets_cos5;
13314         /* Total number of rx packets count on cos queue 6 */
13315         uint64_t        rx_packets_cos6;
13316         /* Total number of rx packets count on cos queue 7 */
13317         uint64_t        rx_packets_cos7;
13318         /* time duration receiving a XON -> XOFF and a subsequent XOFF -> XON for priority 0 */
13319         uint64_t        pfc_pri0_rx_duration_us;
13320         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 0 */
13321         uint64_t        pfc_pri0_rx_transitions;
13322         /* time duration receiving a XON -> XOFF and a subsequent XOFF -> XON for priority 1 */
13323         uint64_t        pfc_pri1_rx_duration_us;
13324         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 1 */
13325         uint64_t        pfc_pri1_rx_transitions;
13326         /* time duration receiving a XON -> XOFF and a subsequent XOFF -> XON for priority 2 */
13327         uint64_t        pfc_pri2_rx_duration_us;
13328         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 2 */
13329         uint64_t        pfc_pri2_rx_transitions;
13330         /* time duration receiving a XON -> XOFF and a subsequent XOFF -> XON for priority 3 */
13331         uint64_t        pfc_pri3_rx_duration_us;
13332         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 3 */
13333         uint64_t        pfc_pri3_rx_transitions;
13334         /* time duration receiving a XON -> XOFF and a subsequent XOFF -> XON for priority 4 */
13335         uint64_t        pfc_pri4_rx_duration_us;
13336         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 4 */
13337         uint64_t        pfc_pri4_rx_transitions;
13338         /* time duration receiving a XON -> XOFF and a subsequent XOFF -> XON for priority 5 */
13339         uint64_t        pfc_pri5_rx_duration_us;
13340         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 5 */
13341         uint64_t        pfc_pri5_rx_transitions;
13342         /* time duration receiving a XON -> XOFF and a subsequent XOFF -> XON for priority 6 */
13343         uint64_t        pfc_pri6_rx_duration_us;
13344         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 6 */
13345         uint64_t        pfc_pri6_rx_transitions;
13346         /* time duration receiving a XON -> XOFF and a subsequent XOFF -> XON for priority 7 */
13347         uint64_t        pfc_pri7_rx_duration_us;
13348         /* Number of times, a XON -> XOFF and XOFF -> XON transitions occur for priority 7 */
13349         uint64_t        pfc_pri7_rx_transitions;
13350 } __attribute__((packed));
13351
13352 /************************
13353  * hwrm_port_qstats_ext *
13354  ************************/
13355
13356
13357 /* hwrm_port_qstats_ext_input (size:320b/40B) */
13358 struct hwrm_port_qstats_ext_input {
13359         /* The HWRM command request type. */
13360         uint16_t        req_type;
13361         /*
13362          * The completion ring to send the completion event on. This should
13363          * be the NQ ID returned from the `nq_alloc` HWRM command.
13364          */
13365         uint16_t        cmpl_ring;
13366         /*
13367          * The sequence ID is used by the driver for tracking multiple
13368          * commands. This ID is treated as opaque data by the firmware and
13369          * the value is returned in the `hwrm_resp_hdr` upon completion.
13370          */
13371         uint16_t        seq_id;
13372         /*
13373          * The target ID of the command:
13374          * * 0x0-0xFFF8 - The function ID
13375          * * 0xFFF8-0xFFFE - Reserved for internal processors
13376          * * 0xFFFF - HWRM
13377          */
13378         uint16_t        target_id;
13379         /*
13380          * A physical address pointer pointing to a host buffer that the
13381          * command's response data will be written. This can be either a host
13382          * physical address (HPA) or a guest physical address (GPA) and must
13383          * point to a physically contiguous block of memory.
13384          */
13385         uint64_t        resp_addr;
13386         /* Port ID of port that is being queried. */
13387         uint16_t        port_id;
13388         /*
13389          * The size of TX port extended
13390          * statistics block in bytes.
13391          */
13392         uint16_t        tx_stat_size;
13393         /*
13394          * The size of RX port extended
13395          * statistics block in bytes
13396          */
13397         uint16_t        rx_stat_size;
13398         uint8_t unused_0[2];
13399         /*
13400          * This is the host address where
13401          * Tx port statistics will be stored
13402          */
13403         uint64_t        tx_stat_host_addr;
13404         /*
13405          * This is the host address where
13406          * Rx port statistics will be stored
13407          */
13408         uint64_t        rx_stat_host_addr;
13409 } __attribute__((packed));
13410
13411 /* hwrm_port_qstats_ext_output (size:128b/16B) */
13412 struct hwrm_port_qstats_ext_output {
13413         /* The specific error status for the command. */
13414         uint16_t        error_code;
13415         /* The HWRM command request type. */
13416         uint16_t        req_type;
13417         /* The sequence ID from the original command. */
13418         uint16_t        seq_id;
13419         /* The length of the response data in number of bytes. */
13420         uint16_t        resp_len;
13421         /* The size of TX port statistics block in bytes. */
13422         uint16_t        tx_stat_size;
13423         /* The size of RX port statistics block in bytes. */
13424         uint16_t        rx_stat_size;
13425         /* Total number of active cos queues available. */
13426         uint16_t        total_active_cos_queues;
13427         uint8_t flags;
13428         /*
13429          * If set to 1, then this field indicates that clear
13430          * roce specific counters is supported.
13431          */
13432         #define HWRM_PORT_QSTATS_EXT_OUTPUT_FLAGS_CLEAR_ROCE_COUNTERS_SUPPORTED \
13433                 UINT32_C(0x1)
13434         /*
13435          * This field is used in Output records to indicate that the output
13436          * is completely written to RAM.  This field should be read as '1'
13437          * to indicate that the output has been completely written.
13438          * When writing a command completion or response to an internal processor,
13439          * the order of writes has to be such that this field is written last.
13440          */
13441         uint8_t valid;
13442 } __attribute__((packed));
13443
13444 /*************************
13445  * hwrm_port_lpbk_qstats *
13446  *************************/
13447
13448
13449 /* hwrm_port_lpbk_qstats_input (size:128b/16B) */
13450 struct hwrm_port_lpbk_qstats_input {
13451         /* The HWRM command request type. */
13452         uint16_t        req_type;
13453         /*
13454          * The completion ring to send the completion event on. This should
13455          * be the NQ ID returned from the `nq_alloc` HWRM command.
13456          */
13457         uint16_t        cmpl_ring;
13458         /*
13459          * The sequence ID is used by the driver for tracking multiple
13460          * commands. This ID is treated as opaque data by the firmware and
13461          * the value is returned in the `hwrm_resp_hdr` upon completion.
13462          */
13463         uint16_t        seq_id;
13464         /*
13465          * The target ID of the command:
13466          * * 0x0-0xFFF8 - The function ID
13467          * * 0xFFF8-0xFFFE - Reserved for internal processors
13468          * * 0xFFFF - HWRM
13469          */
13470         uint16_t        target_id;
13471         /*
13472          * A physical address pointer pointing to a host buffer that the
13473          * command's response data will be written. This can be either a host
13474          * physical address (HPA) or a guest physical address (GPA) and must
13475          * point to a physically contiguous block of memory.
13476          */
13477         uint64_t        resp_addr;
13478 } __attribute__((packed));
13479
13480 /* hwrm_port_lpbk_qstats_output (size:768b/96B) */
13481 struct hwrm_port_lpbk_qstats_output {
13482         /* The specific error status for the command. */
13483         uint16_t        error_code;
13484         /* The HWRM command request type. */
13485         uint16_t        req_type;
13486         /* The sequence ID from the original command. */
13487         uint16_t        seq_id;
13488         /* The length of the response data in number of bytes. */
13489         uint16_t        resp_len;
13490         /* Number of transmitted unicast frames */
13491         uint64_t        lpbk_ucast_frames;
13492         /* Number of transmitted multicast frames */
13493         uint64_t        lpbk_mcast_frames;
13494         /* Number of transmitted broadcast frames */
13495         uint64_t        lpbk_bcast_frames;
13496         /* Number of transmitted bytes for unicast traffic */
13497         uint64_t        lpbk_ucast_bytes;
13498         /* Number of transmitted bytes for multicast traffic */
13499         uint64_t        lpbk_mcast_bytes;
13500         /* Number of transmitted bytes for broadcast traffic */
13501         uint64_t        lpbk_bcast_bytes;
13502         /* Total Tx Drops for loopback traffic reported by STATS block */
13503         uint64_t        tx_stat_discard;
13504         /* Total Tx Error Drops for loopback traffic reported by STATS block */
13505         uint64_t        tx_stat_error;
13506         /* Total Rx Drops for loopback traffic reported by STATS block */
13507         uint64_t        rx_stat_discard;
13508         /* Total Rx Error Drops for loopback traffic reported by STATS block */
13509         uint64_t        rx_stat_error;
13510         uint8_t unused_0[7];
13511         /*
13512          * This field is used in Output records to indicate that the output
13513          * is completely written to RAM.  This field should be read as '1'
13514          * to indicate that the output has been completely written.
13515          * When writing a command completion or response to an internal processor,
13516          * the order of writes has to be such that this field is written last.
13517          */
13518         uint8_t valid;
13519 } __attribute__((packed));
13520
13521 /***********************
13522  * hwrm_port_clr_stats *
13523  ***********************/
13524
13525
13526 /* hwrm_port_clr_stats_input (size:192b/24B) */
13527 struct hwrm_port_clr_stats_input {
13528         /* The HWRM command request type. */
13529         uint16_t        req_type;
13530         /*
13531          * The completion ring to send the completion event on. This should
13532          * be the NQ ID returned from the `nq_alloc` HWRM command.
13533          */
13534         uint16_t        cmpl_ring;
13535         /*
13536          * The sequence ID is used by the driver for tracking multiple
13537          * commands. This ID is treated as opaque data by the firmware and
13538          * the value is returned in the `hwrm_resp_hdr` upon completion.
13539          */
13540         uint16_t        seq_id;
13541         /*
13542          * The target ID of the command:
13543          * * 0x0-0xFFF8 - The function ID
13544          * * 0xFFF8-0xFFFE - Reserved for internal processors
13545          * * 0xFFFF - HWRM
13546          */
13547         uint16_t        target_id;
13548         /*
13549          * A physical address pointer pointing to a host buffer that the
13550          * command's response data will be written. This can be either a host
13551          * physical address (HPA) or a guest physical address (GPA) and must
13552          * point to a physically contiguous block of memory.
13553          */
13554         uint64_t        resp_addr;
13555         /* Port ID of port that is being queried. */
13556         uint16_t        port_id;
13557         uint8_t flags;
13558         /*
13559          * If set to 1, then this field indicates clear the following RoCE
13560          * specific counters.
13561          * RoCE associated TX/RX cos counters
13562          * CNP associated TX/RX cos counters
13563          * RoCE/CNP specific TX/RX flow counters
13564          * Firmware will determine the RoCE/CNP cos queue based on qos profile.
13565          * This flag is honored only when RoCE is enabled on that port.
13566          */
13567         #define HWRM_PORT_CLR_STATS_INPUT_FLAGS_ROCE_COUNTERS     UINT32_C(0x1)
13568         uint8_t unused_0[5];
13569 } __attribute__((packed));
13570
13571 /* hwrm_port_clr_stats_output (size:128b/16B) */
13572 struct hwrm_port_clr_stats_output {
13573         /* The specific error status for the command. */
13574         uint16_t        error_code;
13575         /* The HWRM command request type. */
13576         uint16_t        req_type;
13577         /* The sequence ID from the original command. */
13578         uint16_t        seq_id;
13579         /* The length of the response data in number of bytes. */
13580         uint16_t        resp_len;
13581         uint8_t unused_0[7];
13582         /*
13583          * This field is used in Output records to indicate that the output
13584          * is completely written to RAM.  This field should be read as '1'
13585          * to indicate that the output has been completely written.
13586          * When writing a command completion or response to an internal processor,
13587          * the order of writes has to be such that this field is written last.
13588          */
13589         uint8_t valid;
13590 } __attribute__((packed));
13591
13592 /***********************
13593  * hwrm_port_phy_qcaps *
13594  ***********************/
13595
13596
13597 /* hwrm_port_phy_qcaps_input (size:192b/24B) */
13598 struct hwrm_port_phy_qcaps_input {
13599         /* The HWRM command request type. */
13600         uint16_t        req_type;
13601         /*
13602          * The completion ring to send the completion event on. This should
13603          * be the NQ ID returned from the `nq_alloc` HWRM command.
13604          */
13605         uint16_t        cmpl_ring;
13606         /*
13607          * The sequence ID is used by the driver for tracking multiple
13608          * commands. This ID is treated as opaque data by the firmware and
13609          * the value is returned in the `hwrm_resp_hdr` upon completion.
13610          */
13611         uint16_t        seq_id;
13612         /*
13613          * The target ID of the command:
13614          * * 0x0-0xFFF8 - The function ID
13615          * * 0xFFF8-0xFFFE - Reserved for internal processors
13616          * * 0xFFFF - HWRM
13617          */
13618         uint16_t        target_id;
13619         /*
13620          * A physical address pointer pointing to a host buffer that the
13621          * command's response data will be written. This can be either a host
13622          * physical address (HPA) or a guest physical address (GPA) and must
13623          * point to a physically contiguous block of memory.
13624          */
13625         uint64_t        resp_addr;
13626         /* Port ID of port that is being queried. */
13627         uint16_t        port_id;
13628         uint8_t unused_0[6];
13629 } __attribute__((packed));
13630
13631 /* hwrm_port_phy_qcaps_output (size:192b/24B) */
13632 struct hwrm_port_phy_qcaps_output {
13633         /* The specific error status for the command. */
13634         uint16_t        error_code;
13635         /* The HWRM command request type. */
13636         uint16_t        req_type;
13637         /* The sequence ID from the original command. */
13638         uint16_t        seq_id;
13639         /* The length of the response data in number of bytes. */
13640         uint16_t        resp_len;
13641         /* PHY capability flags */
13642         uint8_t flags;
13643         /*
13644          * If set to 1, then this field indicates that the
13645          * link is capable of supporting EEE.
13646          */
13647         #define HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_EEE_SUPPORTED \
13648                 UINT32_C(0x1)
13649         /*
13650          * If set to 1, then this field indicates that the
13651          * PHY is capable of supporting external loopback.
13652          */
13653         #define HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_EXTERNAL_LPBK_SUPPORTED \
13654                 UINT32_C(0x2)
13655         /*
13656          * Reserved field. The HWRM shall set this field to 0.
13657          * An HWRM client shall ignore this field.
13658          */
13659         #define HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_RSVD1_MASK \
13660                 UINT32_C(0xfc)
13661         #define HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_RSVD1_SFT                   2
13662         /* Number of front panel ports for this device. */
13663         uint8_t port_cnt;
13664         /* Not supported or unknown */
13665         #define HWRM_PORT_PHY_QCAPS_OUTPUT_PORT_CNT_UNKNOWN UINT32_C(0x0)
13666         /* single port device */
13667         #define HWRM_PORT_PHY_QCAPS_OUTPUT_PORT_CNT_1       UINT32_C(0x1)
13668         /* 2-port device */
13669         #define HWRM_PORT_PHY_QCAPS_OUTPUT_PORT_CNT_2       UINT32_C(0x2)
13670         /* 3-port device */
13671         #define HWRM_PORT_PHY_QCAPS_OUTPUT_PORT_CNT_3       UINT32_C(0x3)
13672         /* 4-port device */
13673         #define HWRM_PORT_PHY_QCAPS_OUTPUT_PORT_CNT_4       UINT32_C(0x4)
13674         #define HWRM_PORT_PHY_QCAPS_OUTPUT_PORT_CNT_LAST \
13675                 HWRM_PORT_PHY_QCAPS_OUTPUT_PORT_CNT_4
13676         /*
13677          * This is a bit mask to indicate what speeds are supported
13678          * as forced speeds on this link.
13679          * For each speed that can be forced on this link, the
13680          * corresponding mask bit shall be set to '1'.
13681          */
13682         uint16_t        supported_speeds_force_mode;
13683         /* 100Mb link speed (Half-duplex) */
13684         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_100MBHD \
13685                 UINT32_C(0x1)
13686         /* 100Mb link speed (Full-duplex) */
13687         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_100MB \
13688                 UINT32_C(0x2)
13689         /* 1Gb link speed (Half-duplex) */
13690         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_1GBHD \
13691                 UINT32_C(0x4)
13692         /* 1Gb link speed (Full-duplex) */
13693         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_1GB \
13694                 UINT32_C(0x8)
13695         /* 2Gb link speed */
13696         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_2GB \
13697                 UINT32_C(0x10)
13698         /* 25Gb link speed */
13699         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_2_5GB \
13700                 UINT32_C(0x20)
13701         /* 10Gb link speed */
13702         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_10GB \
13703                 UINT32_C(0x40)
13704         /* 20Gb link speed */
13705         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_20GB \
13706                 UINT32_C(0x80)
13707         /* 25Gb link speed */
13708         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_25GB \
13709                 UINT32_C(0x100)
13710         /* 40Gb link speed */
13711         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_40GB \
13712                 UINT32_C(0x200)
13713         /* 50Gb link speed */
13714         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_50GB \
13715                 UINT32_C(0x400)
13716         /* 100Gb link speed */
13717         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_100GB \
13718                 UINT32_C(0x800)
13719         /* 10Mb link speed (Half-duplex) */
13720         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_10MBHD \
13721                 UINT32_C(0x1000)
13722         /* 10Mb link speed (Full-duplex) */
13723         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_FORCE_MODE_10MB \
13724                 UINT32_C(0x2000)
13725         /*
13726          * This is a bit mask to indicate what speeds are supported
13727          * for autonegotiation on this link.
13728          * For each speed that can be autonegotiated on this link, the
13729          * corresponding mask bit shall be set to '1'.
13730          */
13731         uint16_t        supported_speeds_auto_mode;
13732         /* 100Mb link speed (Half-duplex) */
13733         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_100MBHD \
13734                 UINT32_C(0x1)
13735         /* 100Mb link speed (Full-duplex) */
13736         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_100MB \
13737                 UINT32_C(0x2)
13738         /* 1Gb link speed (Half-duplex) */
13739         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_1GBHD \
13740                 UINT32_C(0x4)
13741         /* 1Gb link speed (Full-duplex) */
13742         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_1GB \
13743                 UINT32_C(0x8)
13744         /* 2Gb link speed */
13745         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_2GB \
13746                 UINT32_C(0x10)
13747         /* 25Gb link speed */
13748         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_2_5GB \
13749                 UINT32_C(0x20)
13750         /* 10Gb link speed */
13751         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_10GB \
13752                 UINT32_C(0x40)
13753         /* 20Gb link speed */
13754         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_20GB \
13755                 UINT32_C(0x80)
13756         /* 25Gb link speed */
13757         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_25GB \
13758                 UINT32_C(0x100)
13759         /* 40Gb link speed */
13760         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_40GB \
13761                 UINT32_C(0x200)
13762         /* 50Gb link speed */
13763         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_50GB \
13764                 UINT32_C(0x400)
13765         /* 100Gb link speed */
13766         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_100GB \
13767                 UINT32_C(0x800)
13768         /* 10Mb link speed (Half-duplex) */
13769         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_10MBHD \
13770                 UINT32_C(0x1000)
13771         /* 10Mb link speed (Full-duplex) */
13772         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_AUTO_MODE_10MB \
13773                 UINT32_C(0x2000)
13774         /*
13775          * This is a bit mask to indicate what speeds are supported
13776          * for EEE on this link.
13777          * For each speed that can be autonegotiated when EEE is enabled
13778          * on this link, the corresponding mask bit shall be set to '1'.
13779          * This field is only valid when the eee_suppotred is set to '1'.
13780          */
13781         uint16_t        supported_speeds_eee_mode;
13782         /* Reserved */
13783         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_EEE_MODE_RSVD1 \
13784                 UINT32_C(0x1)
13785         /* 100Mb link speed (Full-duplex) */
13786         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_EEE_MODE_100MB \
13787                 UINT32_C(0x2)
13788         /* Reserved */
13789         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_EEE_MODE_RSVD2 \
13790                 UINT32_C(0x4)
13791         /* 1Gb link speed (Full-duplex) */
13792         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_EEE_MODE_1GB \
13793                 UINT32_C(0x8)
13794         /* Reserved */
13795         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_EEE_MODE_RSVD3 \
13796                 UINT32_C(0x10)
13797         /* Reserved */
13798         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_EEE_MODE_RSVD4 \
13799                 UINT32_C(0x20)
13800         /* 10Gb link speed */
13801         #define HWRM_PORT_PHY_QCAPS_OUTPUT_SUPPORTED_SPEEDS_EEE_MODE_10GB \
13802                 UINT32_C(0x40)
13803         uint32_t        tx_lpi_timer_low;
13804         /*
13805          * The lowest value of TX LPI timer that can be set on this link
13806          * when EEE is enabled. This value is in microseconds.
13807          * This field is valid only when_eee_supported is set to '1'.
13808          */
13809         #define HWRM_PORT_PHY_QCAPS_OUTPUT_TX_LPI_TIMER_LOW_MASK \
13810                 UINT32_C(0xffffff)
13811         #define HWRM_PORT_PHY_QCAPS_OUTPUT_TX_LPI_TIMER_LOW_SFT 0
13812         /*
13813          * Reserved field. The HWRM shall set this field to 0.
13814          * An HWRM client shall ignore this field.
13815          */
13816         #define HWRM_PORT_PHY_QCAPS_OUTPUT_RSVD2_MASK \
13817                 UINT32_C(0xff000000)
13818         #define HWRM_PORT_PHY_QCAPS_OUTPUT_RSVD2_SFT            24
13819         uint32_t        valid_tx_lpi_timer_high;
13820         /*
13821          * The highest value of TX LPI timer that can be set on this link
13822          * when EEE is enabled. This value is in microseconds.
13823          * This field is valid only when_eee_supported is set to '1'.
13824          */
13825         #define HWRM_PORT_PHY_QCAPS_OUTPUT_TX_LPI_TIMER_HIGH_MASK \
13826                 UINT32_C(0xffffff)
13827         #define HWRM_PORT_PHY_QCAPS_OUTPUT_TX_LPI_TIMER_HIGH_SFT 0
13828         /*
13829          * This field is used in Output records to indicate that the output
13830          * is completely written to RAM.  This field should be read as '1'
13831          * to indicate that the output has been completely written.
13832          * When writing a command completion or response to an internal processor,
13833          * the order of writes has to be such that this field is written last.
13834          */
13835         #define HWRM_PORT_PHY_QCAPS_OUTPUT_VALID_MASK \
13836                 UINT32_C(0xff000000)
13837         #define HWRM_PORT_PHY_QCAPS_OUTPUT_VALID_SFT             24
13838 } __attribute__((packed));
13839
13840 /*********************
13841  * hwrm_port_led_cfg *
13842  *********************/
13843
13844
13845 /* hwrm_port_led_cfg_input (size:512b/64B) */
13846 struct hwrm_port_led_cfg_input {
13847         /* The HWRM command request type. */
13848         uint16_t        req_type;
13849         /*
13850          * The completion ring to send the completion event on. This should
13851          * be the NQ ID returned from the `nq_alloc` HWRM command.
13852          */
13853         uint16_t        cmpl_ring;
13854         /*
13855          * The sequence ID is used by the driver for tracking multiple
13856          * commands. This ID is treated as opaque data by the firmware and
13857          * the value is returned in the `hwrm_resp_hdr` upon completion.
13858          */
13859         uint16_t        seq_id;
13860         /*
13861          * The target ID of the command:
13862          * * 0x0-0xFFF8 - The function ID
13863          * * 0xFFF8-0xFFFE - Reserved for internal processors
13864          * * 0xFFFF - HWRM
13865          */
13866         uint16_t        target_id;
13867         /*
13868          * A physical address pointer pointing to a host buffer that the
13869          * command's response data will be written. This can be either a host
13870          * physical address (HPA) or a guest physical address (GPA) and must
13871          * point to a physically contiguous block of memory.
13872          */
13873         uint64_t        resp_addr;
13874         uint32_t        enables;
13875         /*
13876          * This bit must be '1' for the led0_id field to be
13877          * configured.
13878          */
13879         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED0_ID \
13880                 UINT32_C(0x1)
13881         /*
13882          * This bit must be '1' for the led0_state field to be
13883          * configured.
13884          */
13885         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED0_STATE \
13886                 UINT32_C(0x2)
13887         /*
13888          * This bit must be '1' for the led0_color field to be
13889          * configured.
13890          */
13891         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED0_COLOR \
13892                 UINT32_C(0x4)
13893         /*
13894          * This bit must be '1' for the led0_blink_on field to be
13895          * configured.
13896          */
13897         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED0_BLINK_ON \
13898                 UINT32_C(0x8)
13899         /*
13900          * This bit must be '1' for the led0_blink_off field to be
13901          * configured.
13902          */
13903         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED0_BLINK_OFF \
13904                 UINT32_C(0x10)
13905         /*
13906          * This bit must be '1' for the led0_group_id field to be
13907          * configured.
13908          */
13909         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED0_GROUP_ID \
13910                 UINT32_C(0x20)
13911         /*
13912          * This bit must be '1' for the led1_id field to be
13913          * configured.
13914          */
13915         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED1_ID \
13916                 UINT32_C(0x40)
13917         /*
13918          * This bit must be '1' for the led1_state field to be
13919          * configured.
13920          */
13921         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED1_STATE \
13922                 UINT32_C(0x80)
13923         /*
13924          * This bit must be '1' for the led1_color field to be
13925          * configured.
13926          */
13927         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED1_COLOR \
13928                 UINT32_C(0x100)
13929         /*
13930          * This bit must be '1' for the led1_blink_on field to be
13931          * configured.
13932          */
13933         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED1_BLINK_ON \
13934                 UINT32_C(0x200)
13935         /*
13936          * This bit must be '1' for the led1_blink_off field to be
13937          * configured.
13938          */
13939         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED1_BLINK_OFF \
13940                 UINT32_C(0x400)
13941         /*
13942          * This bit must be '1' for the led1_group_id field to be
13943          * configured.
13944          */
13945         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED1_GROUP_ID \
13946                 UINT32_C(0x800)
13947         /*
13948          * This bit must be '1' for the led2_id field to be
13949          * configured.
13950          */
13951         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED2_ID \
13952                 UINT32_C(0x1000)
13953         /*
13954          * This bit must be '1' for the led2_state field to be
13955          * configured.
13956          */
13957         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED2_STATE \
13958                 UINT32_C(0x2000)
13959         /*
13960          * This bit must be '1' for the led2_color field to be
13961          * configured.
13962          */
13963         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED2_COLOR \
13964                 UINT32_C(0x4000)
13965         /*
13966          * This bit must be '1' for the led2_blink_on field to be
13967          * configured.
13968          */
13969         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED2_BLINK_ON \
13970                 UINT32_C(0x8000)
13971         /*
13972          * This bit must be '1' for the led2_blink_off field to be
13973          * configured.
13974          */
13975         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED2_BLINK_OFF \
13976                 UINT32_C(0x10000)
13977         /*
13978          * This bit must be '1' for the led2_group_id field to be
13979          * configured.
13980          */
13981         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED2_GROUP_ID \
13982                 UINT32_C(0x20000)
13983         /*
13984          * This bit must be '1' for the led3_id field to be
13985          * configured.
13986          */
13987         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED3_ID \
13988                 UINT32_C(0x40000)
13989         /*
13990          * This bit must be '1' for the led3_state field to be
13991          * configured.
13992          */
13993         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED3_STATE \
13994                 UINT32_C(0x80000)
13995         /*
13996          * This bit must be '1' for the led3_color field to be
13997          * configured.
13998          */
13999         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED3_COLOR \
14000                 UINT32_C(0x100000)
14001         /*
14002          * This bit must be '1' for the led3_blink_on field to be
14003          * configured.
14004          */
14005         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED3_BLINK_ON \
14006                 UINT32_C(0x200000)
14007         /*
14008          * This bit must be '1' for the led3_blink_off field to be
14009          * configured.
14010          */
14011         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED3_BLINK_OFF \
14012                 UINT32_C(0x400000)
14013         /*
14014          * This bit must be '1' for the led3_group_id field to be
14015          * configured.
14016          */
14017         #define HWRM_PORT_LED_CFG_INPUT_ENABLES_LED3_GROUP_ID \
14018                 UINT32_C(0x800000)
14019         /* Port ID of port whose LEDs are configured. */
14020         uint16_t        port_id;
14021         /*
14022          * The number of LEDs that are being configured.
14023          * Up to 4 LEDs can be configured with this command.
14024          */
14025         uint8_t num_leds;
14026         /* Reserved field. */
14027         uint8_t rsvd;
14028         /* An identifier for the LED #0. */
14029         uint8_t led0_id;
14030         /* The requested state of the LED #0. */
14031         uint8_t led0_state;
14032         /* Default state of the LED */
14033         #define HWRM_PORT_LED_CFG_INPUT_LED0_STATE_DEFAULT  UINT32_C(0x0)
14034         /* Off */
14035         #define HWRM_PORT_LED_CFG_INPUT_LED0_STATE_OFF      UINT32_C(0x1)
14036         /* On */
14037         #define HWRM_PORT_LED_CFG_INPUT_LED0_STATE_ON       UINT32_C(0x2)
14038         /* Blink */
14039         #define HWRM_PORT_LED_CFG_INPUT_LED0_STATE_BLINK    UINT32_C(0x3)
14040         /* Blink Alternately */
14041         #define HWRM_PORT_LED_CFG_INPUT_LED0_STATE_BLINKALT UINT32_C(0x4)
14042         #define HWRM_PORT_LED_CFG_INPUT_LED0_STATE_LAST \
14043                 HWRM_PORT_LED_CFG_INPUT_LED0_STATE_BLINKALT
14044         /* The requested color of LED #0. */
14045         uint8_t led0_color;
14046         /* Default */
14047         #define HWRM_PORT_LED_CFG_INPUT_LED0_COLOR_DEFAULT    UINT32_C(0x0)
14048         /* Amber */
14049         #define HWRM_PORT_LED_CFG_INPUT_LED0_COLOR_AMBER      UINT32_C(0x1)
14050         /* Green */
14051         #define HWRM_PORT_LED_CFG_INPUT_LED0_COLOR_GREEN      UINT32_C(0x2)
14052         /* Green or Amber */
14053         #define HWRM_PORT_LED_CFG_INPUT_LED0_COLOR_GREENAMBER UINT32_C(0x3)
14054         #define HWRM_PORT_LED_CFG_INPUT_LED0_COLOR_LAST \
14055                 HWRM_PORT_LED_CFG_INPUT_LED0_COLOR_GREENAMBER
14056         uint8_t unused_0;
14057         /*
14058          * If the LED #0 state is "blink" or "blinkalt", then
14059          * this field represents the requested time in milliseconds
14060          * to keep LED on between cycles.
14061          */
14062         uint16_t        led0_blink_on;
14063         /*
14064          * If the LED #0 state is "blink" or "blinkalt", then
14065          * this field represents the requested time in milliseconds
14066          * to keep LED off between cycles.
14067          */
14068         uint16_t        led0_blink_off;
14069         /*
14070          * An identifier for the group of LEDs that LED #0 belongs
14071          * to.
14072          * If set to 0, then the LED #0 shall not be grouped and
14073          * shall be treated as an individual resource.
14074          * For all other non-zero values of this field, LED #0 shall
14075          * be grouped together with the LEDs with the same group ID
14076          * value.
14077          */
14078         uint8_t led0_group_id;
14079         /* Reserved field. */
14080         uint8_t rsvd0;
14081         /* An identifier for the LED #1. */
14082         uint8_t led1_id;
14083         /* The requested state of the LED #1. */
14084         uint8_t led1_state;
14085         /* Default state of the LED */
14086         #define HWRM_PORT_LED_CFG_INPUT_LED1_STATE_DEFAULT  UINT32_C(0x0)
14087         /* Off */
14088         #define HWRM_PORT_LED_CFG_INPUT_LED1_STATE_OFF      UINT32_C(0x1)
14089         /* On */
14090         #define HWRM_PORT_LED_CFG_INPUT_LED1_STATE_ON       UINT32_C(0x2)
14091         /* Blink */
14092         #define HWRM_PORT_LED_CFG_INPUT_LED1_STATE_BLINK    UINT32_C(0x3)
14093         /* Blink Alternately */
14094         #define HWRM_PORT_LED_CFG_INPUT_LED1_STATE_BLINKALT UINT32_C(0x4)
14095         #define HWRM_PORT_LED_CFG_INPUT_LED1_STATE_LAST \
14096                 HWRM_PORT_LED_CFG_INPUT_LED1_STATE_BLINKALT
14097         /* The requested color of LED #1. */
14098         uint8_t led1_color;
14099         /* Default */
14100         #define HWRM_PORT_LED_CFG_INPUT_LED1_COLOR_DEFAULT    UINT32_C(0x0)
14101         /* Amber */
14102         #define HWRM_PORT_LED_CFG_INPUT_LED1_COLOR_AMBER      UINT32_C(0x1)
14103         /* Green */
14104         #define HWRM_PORT_LED_CFG_INPUT_LED1_COLOR_GREEN      UINT32_C(0x2)
14105         /* Green or Amber */
14106         #define HWRM_PORT_LED_CFG_INPUT_LED1_COLOR_GREENAMBER UINT32_C(0x3)
14107         #define HWRM_PORT_LED_CFG_INPUT_LED1_COLOR_LAST \
14108                 HWRM_PORT_LED_CFG_INPUT_LED1_COLOR_GREENAMBER
14109         uint8_t unused_1;
14110         /*
14111          * If the LED #1 state is "blink" or "blinkalt", then
14112          * this field represents the requested time in milliseconds
14113          * to keep LED on between cycles.
14114          */
14115         uint16_t        led1_blink_on;
14116         /*
14117          * If the LED #1 state is "blink" or "blinkalt", then
14118          * this field represents the requested time in milliseconds
14119          * to keep LED off between cycles.
14120          */
14121         uint16_t        led1_blink_off;
14122         /*
14123          * An identifier for the group of LEDs that LED #1 belongs
14124          * to.
14125          * If set to 0, then the LED #1 shall not be grouped and
14126          * shall be treated as an individual resource.
14127          * For all other non-zero values of this field, LED #1 shall
14128          * be grouped together with the LEDs with the same group ID
14129          * value.
14130          */
14131         uint8_t led1_group_id;
14132         /* Reserved field. */
14133         uint8_t rsvd1;
14134         /* An identifier for the LED #2. */
14135         uint8_t led2_id;
14136         /* The requested state of the LED #2. */
14137         uint8_t led2_state;
14138         /* Default state of the LED */
14139         #define HWRM_PORT_LED_CFG_INPUT_LED2_STATE_DEFAULT  UINT32_C(0x0)
14140         /* Off */
14141         #define HWRM_PORT_LED_CFG_INPUT_LED2_STATE_OFF      UINT32_C(0x1)
14142         /* On */
14143         #define HWRM_PORT_LED_CFG_INPUT_LED2_STATE_ON       UINT32_C(0x2)
14144         /* Blink */
14145         #define HWRM_PORT_LED_CFG_INPUT_LED2_STATE_BLINK    UINT32_C(0x3)
14146         /* Blink Alternately */
14147         #define HWRM_PORT_LED_CFG_INPUT_LED2_STATE_BLINKALT UINT32_C(0x4)
14148         #define HWRM_PORT_LED_CFG_INPUT_LED2_STATE_LAST \
14149                 HWRM_PORT_LED_CFG_INPUT_LED2_STATE_BLINKALT
14150         /* The requested color of LED #2. */
14151         uint8_t led2_color;
14152         /* Default */
14153         #define HWRM_PORT_LED_CFG_INPUT_LED2_COLOR_DEFAULT    UINT32_C(0x0)
14154         /* Amber */
14155         #define HWRM_PORT_LED_CFG_INPUT_LED2_COLOR_AMBER      UINT32_C(0x1)
14156         /* Green */
14157         #define HWRM_PORT_LED_CFG_INPUT_LED2_COLOR_GREEN      UINT32_C(0x2)
14158         /* Green or Amber */
14159         #define HWRM_PORT_LED_CFG_INPUT_LED2_COLOR_GREENAMBER UINT32_C(0x3)
14160         #define HWRM_PORT_LED_CFG_INPUT_LED2_COLOR_LAST \
14161                 HWRM_PORT_LED_CFG_INPUT_LED2_COLOR_GREENAMBER
14162         uint8_t unused_2;
14163         /*
14164          * If the LED #2 state is "blink" or "blinkalt", then
14165          * this field represents the requested time in milliseconds
14166          * to keep LED on between cycles.
14167          */
14168         uint16_t        led2_blink_on;
14169         /*
14170          * If the LED #2 state is "blink" or "blinkalt", then
14171          * this field represents the requested time in milliseconds
14172          * to keep LED off between cycles.
14173          */
14174         uint16_t        led2_blink_off;
14175         /*
14176          * An identifier for the group of LEDs that LED #2 belongs
14177          * to.
14178          * If set to 0, then the LED #2 shall not be grouped and
14179          * shall be treated as an individual resource.
14180          * For all other non-zero values of this field, LED #2 shall
14181          * be grouped together with the LEDs with the same group ID
14182          * value.
14183          */
14184         uint8_t led2_group_id;
14185         /* Reserved field. */
14186         uint8_t rsvd2;
14187         /* An identifier for the LED #3. */
14188         uint8_t led3_id;
14189         /* The requested state of the LED #3. */
14190         uint8_t led3_state;
14191         /* Default state of the LED */
14192         #define HWRM_PORT_LED_CFG_INPUT_LED3_STATE_DEFAULT  UINT32_C(0x0)
14193         /* Off */
14194         #define HWRM_PORT_LED_CFG_INPUT_LED3_STATE_OFF      UINT32_C(0x1)
14195         /* On */
14196         #define HWRM_PORT_LED_CFG_INPUT_LED3_STATE_ON       UINT32_C(0x2)
14197         /* Blink */
14198         #define HWRM_PORT_LED_CFG_INPUT_LED3_STATE_BLINK    UINT32_C(0x3)
14199         /* Blink Alternately */
14200         #define HWRM_PORT_LED_CFG_INPUT_LED3_STATE_BLINKALT UINT32_C(0x4)
14201         #define HWRM_PORT_LED_CFG_INPUT_LED3_STATE_LAST \
14202                 HWRM_PORT_LED_CFG_INPUT_LED3_STATE_BLINKALT
14203         /* The requested color of LED #3. */
14204         uint8_t led3_color;
14205         /* Default */
14206         #define HWRM_PORT_LED_CFG_INPUT_LED3_COLOR_DEFAULT    UINT32_C(0x0)
14207         /* Amber */
14208         #define HWRM_PORT_LED_CFG_INPUT_LED3_COLOR_AMBER      UINT32_C(0x1)
14209         /* Green */
14210         #define HWRM_PORT_LED_CFG_INPUT_LED3_COLOR_GREEN      UINT32_C(0x2)
14211         /* Green or Amber */
14212         #define HWRM_PORT_LED_CFG_INPUT_LED3_COLOR_GREENAMBER UINT32_C(0x3)
14213         #define HWRM_PORT_LED_CFG_INPUT_LED3_COLOR_LAST \
14214                 HWRM_PORT_LED_CFG_INPUT_LED3_COLOR_GREENAMBER
14215         uint8_t unused_3;
14216         /*
14217          * If the LED #3 state is "blink" or "blinkalt", then
14218          * this field represents the requested time in milliseconds
14219          * to keep LED on between cycles.
14220          */
14221         uint16_t        led3_blink_on;
14222         /*
14223          * If the LED #3 state is "blink" or "blinkalt", then
14224          * this field represents the requested time in milliseconds
14225          * to keep LED off between cycles.
14226          */
14227         uint16_t        led3_blink_off;
14228         /*
14229          * An identifier for the group of LEDs that LED #3 belongs
14230          * to.
14231          * If set to 0, then the LED #3 shall not be grouped and
14232          * shall be treated as an individual resource.
14233          * For all other non-zero values of this field, LED #3 shall
14234          * be grouped together with the LEDs with the same group ID
14235          * value.
14236          */
14237         uint8_t led3_group_id;
14238         /* Reserved field. */
14239         uint8_t rsvd3;
14240 } __attribute__((packed));
14241
14242 /* hwrm_port_led_cfg_output (size:128b/16B) */
14243 struct hwrm_port_led_cfg_output {
14244         /* The specific error status for the command. */
14245         uint16_t        error_code;
14246         /* The HWRM command request type. */
14247         uint16_t        req_type;
14248         /* The sequence ID from the original command. */
14249         uint16_t        seq_id;
14250         /* The length of the response data in number of bytes. */
14251         uint16_t        resp_len;
14252         uint8_t unused_0[7];
14253         /*
14254          * This field is used in Output records to indicate that the output
14255          * is completely written to RAM.  This field should be read as '1'
14256          * to indicate that the output has been completely written.
14257          * When writing a command completion or response to an internal processor,
14258          * the order of writes has to be such that this field is written last.
14259          */
14260         uint8_t valid;
14261 } __attribute__((packed));
14262
14263 /**********************
14264  * hwrm_port_led_qcfg *
14265  **********************/
14266
14267
14268 /* hwrm_port_led_qcfg_input (size:192b/24B) */
14269 struct hwrm_port_led_qcfg_input {
14270         /* The HWRM command request type. */
14271         uint16_t        req_type;
14272         /*
14273          * The completion ring to send the completion event on. This should
14274          * be the NQ ID returned from the `nq_alloc` HWRM command.
14275          */
14276         uint16_t        cmpl_ring;
14277         /*
14278          * The sequence ID is used by the driver for tracking multiple
14279          * commands. This ID is treated as opaque data by the firmware and
14280          * the value is returned in the `hwrm_resp_hdr` upon completion.
14281          */
14282         uint16_t        seq_id;
14283         /*
14284          * The target ID of the command:
14285          * * 0x0-0xFFF8 - The function ID
14286          * * 0xFFF8-0xFFFE - Reserved for internal processors
14287          * * 0xFFFF - HWRM
14288          */
14289         uint16_t        target_id;
14290         /*
14291          * A physical address pointer pointing to a host buffer that the
14292          * command's response data will be written. This can be either a host
14293          * physical address (HPA) or a guest physical address (GPA) and must
14294          * point to a physically contiguous block of memory.
14295          */
14296         uint64_t        resp_addr;
14297         /* Port ID of port whose LED configuration is being queried. */
14298         uint16_t        port_id;
14299         uint8_t unused_0[6];
14300 } __attribute__((packed));
14301
14302 /* hwrm_port_led_qcfg_output (size:448b/56B) */
14303 struct hwrm_port_led_qcfg_output {
14304         /* The specific error status for the command. */
14305         uint16_t        error_code;
14306         /* The HWRM command request type. */
14307         uint16_t        req_type;
14308         /* The sequence ID from the original command. */
14309         uint16_t        seq_id;
14310         /* The length of the response data in number of bytes. */
14311         uint16_t        resp_len;
14312         /*
14313          * The number of LEDs that are configured on this port.
14314          * Up to 4 LEDs can be returned in the response.
14315          */
14316         uint8_t num_leds;
14317         /* An identifier for the LED #0. */
14318         uint8_t led0_id;
14319         /* The type of LED #0. */
14320         uint8_t led0_type;
14321         /* Speed LED */
14322         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_TYPE_SPEED    UINT32_C(0x0)
14323         /* Activity LED */
14324         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_TYPE_ACTIVITY UINT32_C(0x1)
14325         /* Invalid */
14326         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_TYPE_INVALID  UINT32_C(0xff)
14327         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_TYPE_LAST \
14328                 HWRM_PORT_LED_QCFG_OUTPUT_LED0_TYPE_INVALID
14329         /* The current state of the LED #0. */
14330         uint8_t led0_state;
14331         /* Default state of the LED */
14332         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_STATE_DEFAULT  UINT32_C(0x0)
14333         /* Off */
14334         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_STATE_OFF      UINT32_C(0x1)
14335         /* On */
14336         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_STATE_ON       UINT32_C(0x2)
14337         /* Blink */
14338         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_STATE_BLINK    UINT32_C(0x3)
14339         /* Blink Alternately */
14340         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_STATE_BLINKALT UINT32_C(0x4)
14341         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_STATE_LAST \
14342                 HWRM_PORT_LED_QCFG_OUTPUT_LED0_STATE_BLINKALT
14343         /* The color of LED #0. */
14344         uint8_t led0_color;
14345         /* Default */
14346         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_COLOR_DEFAULT    UINT32_C(0x0)
14347         /* Amber */
14348         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_COLOR_AMBER      UINT32_C(0x1)
14349         /* Green */
14350         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_COLOR_GREEN      UINT32_C(0x2)
14351         /* Green or Amber */
14352         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_COLOR_GREENAMBER UINT32_C(0x3)
14353         #define HWRM_PORT_LED_QCFG_OUTPUT_LED0_COLOR_LAST \
14354                 HWRM_PORT_LED_QCFG_OUTPUT_LED0_COLOR_GREENAMBER
14355         uint8_t unused_0;
14356         /*
14357          * If the LED #0 state is "blink" or "blinkalt", then
14358          * this field represents the requested time in milliseconds
14359          * to keep LED on between cycles.
14360          */
14361         uint16_t        led0_blink_on;
14362         /*
14363          * If the LED #0 state is "blink" or "blinkalt", then
14364          * this field represents the requested time in milliseconds
14365          * to keep LED off between cycles.
14366          */
14367         uint16_t        led0_blink_off;
14368         /*
14369          * An identifier for the group of LEDs that LED #0 belongs
14370          * to.
14371          * If set to 0, then the LED #0 is not grouped.
14372          * For all other non-zero values of this field, LED #0 is
14373          * grouped together with the LEDs with the same group ID
14374          * value.
14375          */
14376         uint8_t led0_group_id;
14377         /* An identifier for the LED #1. */
14378         uint8_t led1_id;
14379         /* The type of LED #1. */
14380         uint8_t led1_type;
14381         /* Speed LED */
14382         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_TYPE_SPEED    UINT32_C(0x0)
14383         /* Activity LED */
14384         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_TYPE_ACTIVITY UINT32_C(0x1)
14385         /* Invalid */
14386         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_TYPE_INVALID  UINT32_C(0xff)
14387         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_TYPE_LAST \
14388                 HWRM_PORT_LED_QCFG_OUTPUT_LED1_TYPE_INVALID
14389         /* The current state of the LED #1. */
14390         uint8_t led1_state;
14391         /* Default state of the LED */
14392         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_STATE_DEFAULT  UINT32_C(0x0)
14393         /* Off */
14394         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_STATE_OFF      UINT32_C(0x1)
14395         /* On */
14396         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_STATE_ON       UINT32_C(0x2)
14397         /* Blink */
14398         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_STATE_BLINK    UINT32_C(0x3)
14399         /* Blink Alternately */
14400         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_STATE_BLINKALT UINT32_C(0x4)
14401         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_STATE_LAST \
14402                 HWRM_PORT_LED_QCFG_OUTPUT_LED1_STATE_BLINKALT
14403         /* The color of LED #1. */
14404         uint8_t led1_color;
14405         /* Default */
14406         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_COLOR_DEFAULT    UINT32_C(0x0)
14407         /* Amber */
14408         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_COLOR_AMBER      UINT32_C(0x1)
14409         /* Green */
14410         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_COLOR_GREEN      UINT32_C(0x2)
14411         /* Green or Amber */
14412         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_COLOR_GREENAMBER UINT32_C(0x3)
14413         #define HWRM_PORT_LED_QCFG_OUTPUT_LED1_COLOR_LAST \
14414                 HWRM_PORT_LED_QCFG_OUTPUT_LED1_COLOR_GREENAMBER
14415         uint8_t unused_1;
14416         /*
14417          * If the LED #1 state is "blink" or "blinkalt", then
14418          * this field represents the requested time in milliseconds
14419          * to keep LED on between cycles.
14420          */
14421         uint16_t        led1_blink_on;
14422         /*
14423          * If the LED #1 state is "blink" or "blinkalt", then
14424          * this field represents the requested time in milliseconds
14425          * to keep LED off between cycles.
14426          */
14427         uint16_t        led1_blink_off;
14428         /*
14429          * An identifier for the group of LEDs that LED #1 belongs
14430          * to.
14431          * If set to 0, then the LED #1 is not grouped.
14432          * For all other non-zero values of this field, LED #1 is
14433          * grouped together with the LEDs with the same group ID
14434          * value.
14435          */
14436         uint8_t led1_group_id;
14437         /* An identifier for the LED #2. */
14438         uint8_t led2_id;
14439         /* The type of LED #2. */
14440         uint8_t led2_type;
14441         /* Speed LED */
14442         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_TYPE_SPEED    UINT32_C(0x0)
14443         /* Activity LED */
14444         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_TYPE_ACTIVITY UINT32_C(0x1)
14445         /* Invalid */
14446         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_TYPE_INVALID  UINT32_C(0xff)
14447         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_TYPE_LAST \
14448                 HWRM_PORT_LED_QCFG_OUTPUT_LED2_TYPE_INVALID
14449         /* The current state of the LED #2. */
14450         uint8_t led2_state;
14451         /* Default state of the LED */
14452         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_STATE_DEFAULT  UINT32_C(0x0)
14453         /* Off */
14454         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_STATE_OFF      UINT32_C(0x1)
14455         /* On */
14456         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_STATE_ON       UINT32_C(0x2)
14457         /* Blink */
14458         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_STATE_BLINK    UINT32_C(0x3)
14459         /* Blink Alternately */
14460         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_STATE_BLINKALT UINT32_C(0x4)
14461         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_STATE_LAST \
14462                 HWRM_PORT_LED_QCFG_OUTPUT_LED2_STATE_BLINKALT
14463         /* The color of LED #2. */
14464         uint8_t led2_color;
14465         /* Default */
14466         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_COLOR_DEFAULT    UINT32_C(0x0)
14467         /* Amber */
14468         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_COLOR_AMBER      UINT32_C(0x1)
14469         /* Green */
14470         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_COLOR_GREEN      UINT32_C(0x2)
14471         /* Green or Amber */
14472         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_COLOR_GREENAMBER UINT32_C(0x3)
14473         #define HWRM_PORT_LED_QCFG_OUTPUT_LED2_COLOR_LAST \
14474                 HWRM_PORT_LED_QCFG_OUTPUT_LED2_COLOR_GREENAMBER
14475         uint8_t unused_2;
14476         /*
14477          * If the LED #2 state is "blink" or "blinkalt", then
14478          * this field represents the requested time in milliseconds
14479          * to keep LED on between cycles.
14480          */
14481         uint16_t        led2_blink_on;
14482         /*
14483          * If the LED #2 state is "blink" or "blinkalt", then
14484          * this field represents the requested time in milliseconds
14485          * to keep LED off between cycles.
14486          */
14487         uint16_t        led2_blink_off;
14488         /*
14489          * An identifier for the group of LEDs that LED #2 belongs
14490          * to.
14491          * If set to 0, then the LED #2 is not grouped.
14492          * For all other non-zero values of this field, LED #2 is
14493          * grouped together with the LEDs with the same group ID
14494          * value.
14495          */
14496         uint8_t led2_group_id;
14497         /* An identifier for the LED #3. */
14498         uint8_t led3_id;
14499         /* The type of LED #3. */
14500         uint8_t led3_type;
14501         /* Speed LED */
14502         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_TYPE_SPEED    UINT32_C(0x0)
14503         /* Activity LED */
14504         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_TYPE_ACTIVITY UINT32_C(0x1)
14505         /* Invalid */
14506         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_TYPE_INVALID  UINT32_C(0xff)
14507         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_TYPE_LAST \
14508                 HWRM_PORT_LED_QCFG_OUTPUT_LED3_TYPE_INVALID
14509         /* The current state of the LED #3. */
14510         uint8_t led3_state;
14511         /* Default state of the LED */
14512         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_STATE_DEFAULT  UINT32_C(0x0)
14513         /* Off */
14514         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_STATE_OFF      UINT32_C(0x1)
14515         /* On */
14516         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_STATE_ON       UINT32_C(0x2)
14517         /* Blink */
14518         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_STATE_BLINK    UINT32_C(0x3)
14519         /* Blink Alternately */
14520         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_STATE_BLINKALT UINT32_C(0x4)
14521         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_STATE_LAST \
14522                 HWRM_PORT_LED_QCFG_OUTPUT_LED3_STATE_BLINKALT
14523         /* The color of LED #3. */
14524         uint8_t led3_color;
14525         /* Default */
14526         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_COLOR_DEFAULT    UINT32_C(0x0)
14527         /* Amber */
14528         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_COLOR_AMBER      UINT32_C(0x1)
14529         /* Green */
14530         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_COLOR_GREEN      UINT32_C(0x2)
14531         /* Green or Amber */
14532         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_COLOR_GREENAMBER UINT32_C(0x3)
14533         #define HWRM_PORT_LED_QCFG_OUTPUT_LED3_COLOR_LAST \
14534                 HWRM_PORT_LED_QCFG_OUTPUT_LED3_COLOR_GREENAMBER
14535         uint8_t unused_3;
14536         /*
14537          * If the LED #3 state is "blink" or "blinkalt", then
14538          * this field represents the requested time in milliseconds
14539          * to keep LED on between cycles.
14540          */
14541         uint16_t        led3_blink_on;
14542         /*
14543          * If the LED #3 state is "blink" or "blinkalt", then
14544          * this field represents the requested time in milliseconds
14545          * to keep LED off between cycles.
14546          */
14547         uint16_t        led3_blink_off;
14548         /*
14549          * An identifier for the group of LEDs that LED #3 belongs
14550          * to.
14551          * If set to 0, then the LED #3 is not grouped.
14552          * For all other non-zero values of this field, LED #3 is
14553          * grouped together with the LEDs with the same group ID
14554          * value.
14555          */
14556         uint8_t led3_group_id;
14557         uint8_t unused_4[6];
14558         /*
14559          * This field is used in Output records to indicate that the output
14560          * is completely written to RAM.  This field should be read as '1'
14561          * to indicate that the output has been completely written.
14562          * When writing a command completion or response to an internal processor,
14563          * the order of writes has to be such that this field is written last.
14564          */
14565         uint8_t valid;
14566 } __attribute__((packed));
14567
14568 /***********************
14569  * hwrm_port_led_qcaps *
14570  ***********************/
14571
14572
14573 /* hwrm_port_led_qcaps_input (size:192b/24B) */
14574 struct hwrm_port_led_qcaps_input {
14575         /* The HWRM command request type. */
14576         uint16_t        req_type;
14577         /*
14578          * The completion ring to send the completion event on. This should
14579          * be the NQ ID returned from the `nq_alloc` HWRM command.
14580          */
14581         uint16_t        cmpl_ring;
14582         /*
14583          * The sequence ID is used by the driver for tracking multiple
14584          * commands. This ID is treated as opaque data by the firmware and
14585          * the value is returned in the `hwrm_resp_hdr` upon completion.
14586          */
14587         uint16_t        seq_id;
14588         /*
14589          * The target ID of the command:
14590          * * 0x0-0xFFF8 - The function ID
14591          * * 0xFFF8-0xFFFE - Reserved for internal processors
14592          * * 0xFFFF - HWRM
14593          */
14594         uint16_t        target_id;
14595         /*
14596          * A physical address pointer pointing to a host buffer that the
14597          * command's response data will be written. This can be either a host
14598          * physical address (HPA) or a guest physical address (GPA) and must
14599          * point to a physically contiguous block of memory.
14600          */
14601         uint64_t        resp_addr;
14602         /* Port ID of port whose LED configuration is being queried. */
14603         uint16_t        port_id;
14604         uint8_t unused_0[6];
14605 } __attribute__((packed));
14606
14607 /* hwrm_port_led_qcaps_output (size:384b/48B) */
14608 struct hwrm_port_led_qcaps_output {
14609         /* The specific error status for the command. */
14610         uint16_t        error_code;
14611         /* The HWRM command request type. */
14612         uint16_t        req_type;
14613         /* The sequence ID from the original command. */
14614         uint16_t        seq_id;
14615         /* The length of the response data in number of bytes. */
14616         uint16_t        resp_len;
14617         /*
14618          * The number of LEDs that are configured on this port.
14619          * Up to 4 LEDs can be returned in the response.
14620          */
14621         uint8_t num_leds;
14622         /* Reserved for future use. */
14623         uint8_t unused[3];
14624         /* An identifier for the LED #0. */
14625         uint8_t led0_id;
14626         /* The type of LED #0. */
14627         uint8_t led0_type;
14628         /* Speed LED */
14629         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_TYPE_SPEED    UINT32_C(0x0)
14630         /* Activity LED */
14631         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_TYPE_ACTIVITY UINT32_C(0x1)
14632         /* Invalid */
14633         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_TYPE_INVALID  UINT32_C(0xff)
14634         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_TYPE_LAST \
14635                 HWRM_PORT_LED_QCAPS_OUTPUT_LED0_TYPE_INVALID
14636         /*
14637          * An identifier for the group of LEDs that LED #0 belongs
14638          * to.
14639          * If set to 0, then the LED #0 cannot be grouped.
14640          * For all other non-zero values of this field, LED #0 is
14641          * grouped together with the LEDs with the same group ID
14642          * value.
14643          */
14644         uint8_t led0_group_id;
14645         uint8_t unused_0;
14646         /* The states supported by LED #0. */
14647         uint16_t        led0_state_caps;
14648         /*
14649          * If set to 1, this LED is enabled.
14650          * If set to 0, this LED is disabled.
14651          */
14652         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_STATE_CAPS_ENABLED \
14653                 UINT32_C(0x1)
14654         /*
14655          * If set to 1, off state is supported on this LED.
14656          * If set to 0, off state is not supported on this LED.
14657          */
14658         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_STATE_CAPS_OFF_SUPPORTED \
14659                 UINT32_C(0x2)
14660         /*
14661          * If set to 1, on state is supported on this LED.
14662          * If set to 0, on state is not supported on this LED.
14663          */
14664         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_STATE_CAPS_ON_SUPPORTED \
14665                 UINT32_C(0x4)
14666         /*
14667          * If set to 1, blink state is supported on this LED.
14668          * If set to 0, blink state is not supported on this LED.
14669          */
14670         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_STATE_CAPS_BLINK_SUPPORTED \
14671                 UINT32_C(0x8)
14672         /*
14673          * If set to 1, blink_alt state is supported on this LED.
14674          * If set to 0, blink_alt state is not supported on this LED.
14675          */
14676         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_STATE_CAPS_BLINK_ALT_SUPPORTED \
14677                 UINT32_C(0x10)
14678         /* The colors supported by LED #0. */
14679         uint16_t        led0_color_caps;
14680         /* reserved. */
14681         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_COLOR_CAPS_RSVD \
14682                 UINT32_C(0x1)
14683         /*
14684          * If set to 1, Amber color is supported on this LED.
14685          * If set to 0, Amber color is not supported on this LED.
14686          */
14687         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_COLOR_CAPS_AMBER_SUPPORTED \
14688                 UINT32_C(0x2)
14689         /*
14690          * If set to 1, Green color is supported on this LED.
14691          * If set to 0, Green color is not supported on this LED.
14692          */
14693         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED0_COLOR_CAPS_GREEN_SUPPORTED \
14694                 UINT32_C(0x4)
14695         /* An identifier for the LED #1. */
14696         uint8_t led1_id;
14697         /* The type of LED #1. */
14698         uint8_t led1_type;
14699         /* Speed LED */
14700         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_TYPE_SPEED    UINT32_C(0x0)
14701         /* Activity LED */
14702         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_TYPE_ACTIVITY UINT32_C(0x1)
14703         /* Invalid */
14704         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_TYPE_INVALID  UINT32_C(0xff)
14705         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_TYPE_LAST \
14706                 HWRM_PORT_LED_QCAPS_OUTPUT_LED1_TYPE_INVALID
14707         /*
14708          * An identifier for the group of LEDs that LED #1 belongs
14709          * to.
14710          * If set to 0, then the LED #0 cannot be grouped.
14711          * For all other non-zero values of this field, LED #0 is
14712          * grouped together with the LEDs with the same group ID
14713          * value.
14714          */
14715         uint8_t led1_group_id;
14716         uint8_t unused_1;
14717         /* The states supported by LED #1. */
14718         uint16_t        led1_state_caps;
14719         /*
14720          * If set to 1, this LED is enabled.
14721          * If set to 0, this LED is disabled.
14722          */
14723         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_STATE_CAPS_ENABLED \
14724                 UINT32_C(0x1)
14725         /*
14726          * If set to 1, off state is supported on this LED.
14727          * If set to 0, off state is not supported on this LED.
14728          */
14729         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_STATE_CAPS_OFF_SUPPORTED \
14730                 UINT32_C(0x2)
14731         /*
14732          * If set to 1, on state is supported on this LED.
14733          * If set to 0, on state is not supported on this LED.
14734          */
14735         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_STATE_CAPS_ON_SUPPORTED \
14736                 UINT32_C(0x4)
14737         /*
14738          * If set to 1, blink state is supported on this LED.
14739          * If set to 0, blink state is not supported on this LED.
14740          */
14741         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_STATE_CAPS_BLINK_SUPPORTED \
14742                 UINT32_C(0x8)
14743         /*
14744          * If set to 1, blink_alt state is supported on this LED.
14745          * If set to 0, blink_alt state is not supported on this LED.
14746          */
14747         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_STATE_CAPS_BLINK_ALT_SUPPORTED \
14748                 UINT32_C(0x10)
14749         /* The colors supported by LED #1. */
14750         uint16_t        led1_color_caps;
14751         /* reserved. */
14752         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_COLOR_CAPS_RSVD \
14753                 UINT32_C(0x1)
14754         /*
14755          * If set to 1, Amber color is supported on this LED.
14756          * If set to 0, Amber color is not supported on this LED.
14757          */
14758         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_COLOR_CAPS_AMBER_SUPPORTED \
14759                 UINT32_C(0x2)
14760         /*
14761          * If set to 1, Green color is supported on this LED.
14762          * If set to 0, Green color is not supported on this LED.
14763          */
14764         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED1_COLOR_CAPS_GREEN_SUPPORTED \
14765                 UINT32_C(0x4)
14766         /* An identifier for the LED #2. */
14767         uint8_t led2_id;
14768         /* The type of LED #2. */
14769         uint8_t led2_type;
14770         /* Speed LED */
14771         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_TYPE_SPEED    UINT32_C(0x0)
14772         /* Activity LED */
14773         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_TYPE_ACTIVITY UINT32_C(0x1)
14774         /* Invalid */
14775         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_TYPE_INVALID  UINT32_C(0xff)
14776         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_TYPE_LAST \
14777                 HWRM_PORT_LED_QCAPS_OUTPUT_LED2_TYPE_INVALID
14778         /*
14779          * An identifier for the group of LEDs that LED #0 belongs
14780          * to.
14781          * If set to 0, then the LED #0 cannot be grouped.
14782          * For all other non-zero values of this field, LED #0 is
14783          * grouped together with the LEDs with the same group ID
14784          * value.
14785          */
14786         uint8_t led2_group_id;
14787         uint8_t unused_2;
14788         /* The states supported by LED #2. */
14789         uint16_t        led2_state_caps;
14790         /*
14791          * If set to 1, this LED is enabled.
14792          * If set to 0, this LED is disabled.
14793          */
14794         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_STATE_CAPS_ENABLED \
14795                 UINT32_C(0x1)
14796         /*
14797          * If set to 1, off state is supported on this LED.
14798          * If set to 0, off state is not supported on this LED.
14799          */
14800         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_STATE_CAPS_OFF_SUPPORTED \
14801                 UINT32_C(0x2)
14802         /*
14803          * If set to 1, on state is supported on this LED.
14804          * If set to 0, on state is not supported on this LED.
14805          */
14806         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_STATE_CAPS_ON_SUPPORTED \
14807                 UINT32_C(0x4)
14808         /*
14809          * If set to 1, blink state is supported on this LED.
14810          * If set to 0, blink state is not supported on this LED.
14811          */
14812         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_STATE_CAPS_BLINK_SUPPORTED \
14813                 UINT32_C(0x8)
14814         /*
14815          * If set to 1, blink_alt state is supported on this LED.
14816          * If set to 0, blink_alt state is not supported on this LED.
14817          */
14818         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_STATE_CAPS_BLINK_ALT_SUPPORTED \
14819                 UINT32_C(0x10)
14820         /* The colors supported by LED #2. */
14821         uint16_t        led2_color_caps;
14822         /* reserved. */
14823         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_COLOR_CAPS_RSVD \
14824                 UINT32_C(0x1)
14825         /*
14826          * If set to 1, Amber color is supported on this LED.
14827          * If set to 0, Amber color is not supported on this LED.
14828          */
14829         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_COLOR_CAPS_AMBER_SUPPORTED \
14830                 UINT32_C(0x2)
14831         /*
14832          * If set to 1, Green color is supported on this LED.
14833          * If set to 0, Green color is not supported on this LED.
14834          */
14835         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED2_COLOR_CAPS_GREEN_SUPPORTED \
14836                 UINT32_C(0x4)
14837         /* An identifier for the LED #3. */
14838         uint8_t led3_id;
14839         /* The type of LED #3. */
14840         uint8_t led3_type;
14841         /* Speed LED */
14842         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_TYPE_SPEED    UINT32_C(0x0)
14843         /* Activity LED */
14844         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_TYPE_ACTIVITY UINT32_C(0x1)
14845         /* Invalid */
14846         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_TYPE_INVALID  UINT32_C(0xff)
14847         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_TYPE_LAST \
14848                 HWRM_PORT_LED_QCAPS_OUTPUT_LED3_TYPE_INVALID
14849         /*
14850          * An identifier for the group of LEDs that LED #3 belongs
14851          * to.
14852          * If set to 0, then the LED #0 cannot be grouped.
14853          * For all other non-zero values of this field, LED #0 is
14854          * grouped together with the LEDs with the same group ID
14855          * value.
14856          */
14857         uint8_t led3_group_id;
14858         uint8_t unused_3;
14859         /* The states supported by LED #3. */
14860         uint16_t        led3_state_caps;
14861         /*
14862          * If set to 1, this LED is enabled.
14863          * If set to 0, this LED is disabled.
14864          */
14865         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_STATE_CAPS_ENABLED \
14866                 UINT32_C(0x1)
14867         /*
14868          * If set to 1, off state is supported on this LED.
14869          * If set to 0, off state is not supported on this LED.
14870          */
14871         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_STATE_CAPS_OFF_SUPPORTED \
14872                 UINT32_C(0x2)
14873         /*
14874          * If set to 1, on state is supported on this LED.
14875          * If set to 0, on state is not supported on this LED.
14876          */
14877         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_STATE_CAPS_ON_SUPPORTED \
14878                 UINT32_C(0x4)
14879         /*
14880          * If set to 1, blink state is supported on this LED.
14881          * If set to 0, blink state is not supported on this LED.
14882          */
14883         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_STATE_CAPS_BLINK_SUPPORTED \
14884                 UINT32_C(0x8)
14885         /*
14886          * If set to 1, blink_alt state is supported on this LED.
14887          * If set to 0, blink_alt state is not supported on this LED.
14888          */
14889         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_STATE_CAPS_BLINK_ALT_SUPPORTED \
14890                 UINT32_C(0x10)
14891         /* The colors supported by LED #3. */
14892         uint16_t        led3_color_caps;
14893         /* reserved. */
14894         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_COLOR_CAPS_RSVD \
14895                 UINT32_C(0x1)
14896         /*
14897          * If set to 1, Amber color is supported on this LED.
14898          * If set to 0, Amber color is not supported on this LED.
14899          */
14900         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_COLOR_CAPS_AMBER_SUPPORTED \
14901                 UINT32_C(0x2)
14902         /*
14903          * If set to 1, Green color is supported on this LED.
14904          * If set to 0, Green color is not supported on this LED.
14905          */
14906         #define HWRM_PORT_LED_QCAPS_OUTPUT_LED3_COLOR_CAPS_GREEN_SUPPORTED \
14907                 UINT32_C(0x4)
14908         uint8_t unused_4[3];
14909         /*
14910          * This field is used in Output records to indicate that the output
14911          * is completely written to RAM.  This field should be read as '1'
14912          * to indicate that the output has been completely written.
14913          * When writing a command completion or response to an internal processor,
14914          * the order of writes has to be such that this field is written last.
14915          */
14916         uint8_t valid;
14917 } __attribute__((packed));
14918
14919 /***********************
14920  * hwrm_queue_qportcfg *
14921  ***********************/
14922
14923
14924 /* hwrm_queue_qportcfg_input (size:192b/24B) */
14925 struct hwrm_queue_qportcfg_input {
14926         /* The HWRM command request type. */
14927         uint16_t        req_type;
14928         /*
14929          * The completion ring to send the completion event on. This should
14930          * be the NQ ID returned from the `nq_alloc` HWRM command.
14931          */
14932         uint16_t        cmpl_ring;
14933         /*
14934          * The sequence ID is used by the driver for tracking multiple
14935          * commands. This ID is treated as opaque data by the firmware and
14936          * the value is returned in the `hwrm_resp_hdr` upon completion.
14937          */
14938         uint16_t        seq_id;
14939         /*
14940          * The target ID of the command:
14941          * * 0x0-0xFFF8 - The function ID
14942          * * 0xFFF8-0xFFFE - Reserved for internal processors
14943          * * 0xFFFF - HWRM
14944          */
14945         uint16_t        target_id;
14946         /*
14947          * A physical address pointer pointing to a host buffer that the
14948          * command's response data will be written. This can be either a host
14949          * physical address (HPA) or a guest physical address (GPA) and must
14950          * point to a physically contiguous block of memory.
14951          */
14952         uint64_t        resp_addr;
14953         uint32_t        flags;
14954         /*
14955          * Enumeration denoting the RX, TX type of the resource.
14956          * This enumeration is used for resources that are similar for both
14957          * TX and RX paths of the chip.
14958          */
14959         #define HWRM_QUEUE_QPORTCFG_INPUT_FLAGS_PATH     UINT32_C(0x1)
14960         /* tx path */
14961         #define HWRM_QUEUE_QPORTCFG_INPUT_FLAGS_PATH_TX    UINT32_C(0x0)
14962         /* rx path */
14963         #define HWRM_QUEUE_QPORTCFG_INPUT_FLAGS_PATH_RX    UINT32_C(0x1)
14964         #define HWRM_QUEUE_QPORTCFG_INPUT_FLAGS_PATH_LAST \
14965                 HWRM_QUEUE_QPORTCFG_INPUT_FLAGS_PATH_RX
14966         /*
14967          * Port ID of port for which the queue configuration is being
14968          * queried.  This field is only required when sent by IPC.
14969          */
14970         uint16_t        port_id;
14971         /*
14972          * Drivers will set this capability when it can use
14973          * queue_idx_service_profile to map the queues to application.
14974          */
14975         uint8_t drv_qmap_cap;
14976         /* disabled */
14977         #define HWRM_QUEUE_QPORTCFG_INPUT_DRV_QMAP_CAP_DISABLED UINT32_C(0x0)
14978         /* enabled */
14979         #define HWRM_QUEUE_QPORTCFG_INPUT_DRV_QMAP_CAP_ENABLED  UINT32_C(0x1)
14980         #define HWRM_QUEUE_QPORTCFG_INPUT_DRV_QMAP_CAP_LAST \
14981                 HWRM_QUEUE_QPORTCFG_INPUT_DRV_QMAP_CAP_ENABLED
14982         uint8_t unused_0;
14983 } __attribute__((packed));
14984
14985 /* hwrm_queue_qportcfg_output (size:256b/32B) */
14986 struct hwrm_queue_qportcfg_output {
14987         /* The specific error status for the command. */
14988         uint16_t        error_code;
14989         /* The HWRM command request type. */
14990         uint16_t        req_type;
14991         /* The sequence ID from the original command. */
14992         uint16_t        seq_id;
14993         /* The length of the response data in number of bytes. */
14994         uint16_t        resp_len;
14995         /*
14996          * The maximum number of queues that can be configured on this
14997          * port.
14998          * Valid values range from 1 through 8.
14999          */
15000         uint8_t max_configurable_queues;
15001         /*
15002          * The maximum number of lossless queues that can be configured
15003          * on this port.
15004          * Valid values range from 0 through 8.
15005          */
15006         uint8_t max_configurable_lossless_queues;
15007         /*
15008          * Bitmask indicating which queues can be configured by the
15009          * hwrm_queue_cfg command.
15010          *
15011          * Each bit represents a specific queue where bit 0 represents
15012          * queue 0 and bit 7 represents queue 7.
15013          * # A value of 0 indicates that the queue is not configurable
15014          * by the hwrm_queue_cfg command.
15015          * # A value of 1 indicates that the queue is configurable.
15016          * # A hwrm_queue_cfg command shall return error when trying to
15017          * configure a queue not configurable.
15018          */
15019         uint8_t queue_cfg_allowed;
15020         /* Information about queue configuration. */
15021         uint8_t queue_cfg_info;
15022         /*
15023          * If this flag is set to '1', then the queues are
15024          * configured asymmetrically on TX and RX sides.
15025          * If this flag is set to '0', then the queues are
15026          * configured symmetrically on TX and RX sides. For
15027          * symmetric configuration, the queue configuration
15028          * including queue ids and service profiles on the
15029          * TX side is the same as the corresponding queue
15030          * configuration on the RX side.
15031          */
15032         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_CFG_INFO_ASYM_CFG \
15033                 UINT32_C(0x1)
15034         /*
15035          * Bitmask indicating which queues can be configured by the
15036          * hwrm_queue_pfcenable_cfg command.
15037          *
15038          * Each bit represents a specific priority where bit 0 represents
15039          * priority 0 and bit 7 represents priority 7.
15040          * # A value of 0 indicates that the priority is not configurable by
15041          * the hwrm_queue_pfcenable_cfg command.
15042          * # A value of 1 indicates that the priority is configurable.
15043          * # A hwrm_queue_pfcenable_cfg command shall return error when
15044          * trying to configure a priority that is not configurable.
15045          */
15046         uint8_t queue_pfcenable_cfg_allowed;
15047         /*
15048          * Bitmask indicating which queues can be configured by the
15049          * hwrm_queue_pri2cos_cfg command.
15050          *
15051          * Each bit represents a specific queue where bit 0 represents
15052          * queue 0 and bit 7 represents queue 7.
15053          * # A value of 0 indicates that the queue is not configurable
15054          * by the hwrm_queue_pri2cos_cfg command.
15055          * # A value of 1 indicates that the queue is configurable.
15056          * # A hwrm_queue_pri2cos_cfg command shall return error when
15057          * trying to configure a queue that is not configurable.
15058          */
15059         uint8_t queue_pri2cos_cfg_allowed;
15060         /*
15061          * Bitmask indicating which queues can be configured by the
15062          * hwrm_queue_pri2cos_cfg command.
15063          *
15064          * Each bit represents a specific queue where bit 0 represents
15065          * queue 0 and bit 7 represents queue 7.
15066          * # A value of 0 indicates that the queue is not configurable
15067          * by the hwrm_queue_pri2cos_cfg command.
15068          * # A value of 1 indicates that the queue is configurable.
15069          * # A hwrm_queue_pri2cos_cfg command shall return error when
15070          * trying to configure a queue not configurable.
15071          */
15072         uint8_t queue_cos2bw_cfg_allowed;
15073         /*
15074          * ID of CoS Queue 0.
15075          * FF - Invalid id
15076          *
15077          * # This ID can be used on any subsequent call to an hwrm command
15078          * that takes a queue id.
15079          * # IDs must always be queried by this command before any use
15080          * by the driver or software.
15081          * # Any driver or software should not make any assumptions about
15082          * queue IDs.
15083          * # A value of 0xff indicates that the queue is not available.
15084          * # Available queues may not be in sequential order.
15085          */
15086         uint8_t queue_id0;
15087         /* This value is applicable to CoS queues only. */
15088         uint8_t queue_id0_service_profile;
15089         /* Lossy (best-effort) */
15090         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSY \
15091                 UINT32_C(0x0)
15092         /* Lossless (legacy) */
15093         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSLESS \
15094                 UINT32_C(0x1)
15095         /* Lossless RoCE */
15096         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSLESS_ROCE \
15097                 UINT32_C(0x1)
15098         /* Lossy RoCE CNP */
15099         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSY_ROCE_CNP \
15100                 UINT32_C(0x2)
15101         /* Lossless NIC */
15102         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSLESS_NIC \
15103                 UINT32_C(0x3)
15104         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15105         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_UNKNOWN \
15106                 UINT32_C(0xff)
15107         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LAST \
15108                 HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_UNKNOWN
15109         /*
15110          * ID of CoS Queue 1.
15111          * FF - Invalid id
15112          *
15113          * # This ID can be used on any subsequent call to an hwrm command
15114          * that takes a queue id.
15115          * # IDs must always be queried by this command before any use
15116          * by the driver or software.
15117          * # Any driver or software should not make any assumptions about
15118          * queue IDs.
15119          * # A value of 0xff indicates that the queue is not available.
15120          * # Available queues may not be in sequential order.
15121          */
15122         uint8_t queue_id1;
15123         /* This value is applicable to CoS queues only. */
15124         uint8_t queue_id1_service_profile;
15125         /* Lossy (best-effort) */
15126         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID1_SERVICE_PROFILE_LOSSY \
15127                 UINT32_C(0x0)
15128         /* Lossless (legacy) */
15129         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID1_SERVICE_PROFILE_LOSSLESS \
15130                 UINT32_C(0x1)
15131         /* Lossless RoCE */
15132         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID1_SERVICE_PROFILE_LOSSLESS_ROCE \
15133                 UINT32_C(0x1)
15134         /* Lossy RoCE CNP */
15135         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID1_SERVICE_PROFILE_LOSSY_ROCE_CNP \
15136                 UINT32_C(0x2)
15137         /* Lossless NIC */
15138         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID1_SERVICE_PROFILE_LOSSLESS_NIC \
15139                 UINT32_C(0x3)
15140         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15141         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID1_SERVICE_PROFILE_UNKNOWN \
15142                 UINT32_C(0xff)
15143         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID1_SERVICE_PROFILE_LAST \
15144                 HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID1_SERVICE_PROFILE_UNKNOWN
15145         /*
15146          * ID of CoS Queue 2.
15147          * FF - Invalid id
15148          *
15149          * # This ID can be used on any subsequent call to an hwrm command
15150          * that takes a queue id.
15151          * # IDs must always be queried by this command before any use
15152          * by the driver or software.
15153          * # Any driver or software should not make any assumptions about
15154          * queue IDs.
15155          * # A value of 0xff indicates that the queue is not available.
15156          * # Available queues may not be in sequential order.
15157          */
15158         uint8_t queue_id2;
15159         /* This value is applicable to CoS queues only. */
15160         uint8_t queue_id2_service_profile;
15161         /* Lossy (best-effort) */
15162         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID2_SERVICE_PROFILE_LOSSY \
15163                 UINT32_C(0x0)
15164         /* Lossless (legacy) */
15165         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID2_SERVICE_PROFILE_LOSSLESS \
15166                 UINT32_C(0x1)
15167         /* Lossless RoCE */
15168         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID2_SERVICE_PROFILE_LOSSLESS_ROCE \
15169                 UINT32_C(0x1)
15170         /* Lossy RoCE CNP */
15171         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID2_SERVICE_PROFILE_LOSSY_ROCE_CNP \
15172                 UINT32_C(0x2)
15173         /* Lossless NIC */
15174         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID2_SERVICE_PROFILE_LOSSLESS_NIC \
15175                 UINT32_C(0x3)
15176         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15177         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID2_SERVICE_PROFILE_UNKNOWN \
15178                 UINT32_C(0xff)
15179         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID2_SERVICE_PROFILE_LAST \
15180                 HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID2_SERVICE_PROFILE_UNKNOWN
15181         /*
15182          * ID of CoS Queue 3.
15183          * FF - Invalid id
15184          *
15185          * # This ID can be used on any subsequent call to an hwrm command
15186          * that takes a queue id.
15187          * # IDs must always be queried by this command before any use
15188          * by the driver or software.
15189          * # Any driver or software should not make any assumptions about
15190          * queue IDs.
15191          * # A value of 0xff indicates that the queue is not available.
15192          * # Available queues may not be in sequential order.
15193          */
15194         uint8_t queue_id3;
15195         /* This value is applicable to CoS queues only. */
15196         uint8_t queue_id3_service_profile;
15197         /* Lossy (best-effort) */
15198         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID3_SERVICE_PROFILE_LOSSY \
15199                 UINT32_C(0x0)
15200         /* Lossless (legacy) */
15201         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID3_SERVICE_PROFILE_LOSSLESS \
15202                 UINT32_C(0x1)
15203         /* Lossless RoCE */
15204         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID3_SERVICE_PROFILE_LOSSLESS_ROCE \
15205                 UINT32_C(0x1)
15206         /* Lossy RoCE CNP */
15207         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID3_SERVICE_PROFILE_LOSSY_ROCE_CNP \
15208                 UINT32_C(0x2)
15209         /* Lossless NIC */
15210         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID3_SERVICE_PROFILE_LOSSLESS_NIC \
15211                 UINT32_C(0x3)
15212         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15213         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID3_SERVICE_PROFILE_UNKNOWN \
15214                 UINT32_C(0xff)
15215         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID3_SERVICE_PROFILE_LAST \
15216                 HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID3_SERVICE_PROFILE_UNKNOWN
15217         /*
15218          * ID of CoS Queue 4.
15219          * FF - Invalid id
15220          *
15221          * # This ID can be used on any subsequent call to an hwrm command
15222          * that takes a queue id.
15223          * # IDs must always be queried by this command before any use
15224          * by the driver or software.
15225          * # Any driver or software should not make any assumptions about
15226          * queue IDs.
15227          * # A value of 0xff indicates that the queue is not available.
15228          * # Available queues may not be in sequential order.
15229          */
15230         uint8_t queue_id4;
15231         /* This value is applicable to CoS queues only. */
15232         uint8_t queue_id4_service_profile;
15233         /* Lossy (best-effort) */
15234         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID4_SERVICE_PROFILE_LOSSY \
15235                 UINT32_C(0x0)
15236         /* Lossless (legacy) */
15237         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID4_SERVICE_PROFILE_LOSSLESS \
15238                 UINT32_C(0x1)
15239         /* Lossless RoCE */
15240         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID4_SERVICE_PROFILE_LOSSLESS_ROCE \
15241                 UINT32_C(0x1)
15242         /* Lossy RoCE CNP */
15243         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID4_SERVICE_PROFILE_LOSSY_ROCE_CNP \
15244                 UINT32_C(0x2)
15245         /* Lossless NIC */
15246         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID4_SERVICE_PROFILE_LOSSLESS_NIC \
15247                 UINT32_C(0x3)
15248         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15249         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID4_SERVICE_PROFILE_UNKNOWN \
15250                 UINT32_C(0xff)
15251         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID4_SERVICE_PROFILE_LAST \
15252                 HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID4_SERVICE_PROFILE_UNKNOWN
15253         /*
15254          * ID of CoS Queue 5.
15255          * FF - Invalid id
15256          *
15257          * # This ID can be used on any subsequent call to an hwrm command
15258          * that takes a queue id.
15259          * # IDs must always be queried by this command before any use
15260          * by the driver or software.
15261          * # Any driver or software should not make any assumptions about
15262          * queue IDs.
15263          * # A value of 0xff indicates that the queue is not available.
15264          * # Available queues may not be in sequential order.
15265          */
15266         uint8_t queue_id5;
15267         /* This value is applicable to CoS queues only. */
15268         uint8_t queue_id5_service_profile;
15269         /* Lossy (best-effort) */
15270         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID5_SERVICE_PROFILE_LOSSY \
15271                 UINT32_C(0x0)
15272         /* Lossless (legacy) */
15273         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID5_SERVICE_PROFILE_LOSSLESS \
15274                 UINT32_C(0x1)
15275         /* Lossless RoCE */
15276         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID5_SERVICE_PROFILE_LOSSLESS_ROCE \
15277                 UINT32_C(0x1)
15278         /* Lossy RoCE CNP */
15279         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID5_SERVICE_PROFILE_LOSSY_ROCE_CNP \
15280                 UINT32_C(0x2)
15281         /* Lossless NIC */
15282         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID5_SERVICE_PROFILE_LOSSLESS_NIC \
15283                 UINT32_C(0x3)
15284         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15285         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID5_SERVICE_PROFILE_UNKNOWN \
15286                 UINT32_C(0xff)
15287         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID5_SERVICE_PROFILE_LAST \
15288                 HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID5_SERVICE_PROFILE_UNKNOWN
15289         /*
15290          * ID of CoS Queue 6.
15291          * FF - Invalid id
15292          *
15293          * # This ID can be used on any subsequent call to an hwrm command
15294          * that takes a queue id.
15295          * # IDs must always be queried by this command before any use
15296          * by the driver or software.
15297          * # Any driver or software should not make any assumptions about
15298          * queue IDs.
15299          * # A value of 0xff indicates that the queue is not available.
15300          * # Available queues may not be in sequential order.
15301          */
15302         uint8_t queue_id6;
15303         /* This value is applicable to CoS queues only. */
15304         uint8_t queue_id6_service_profile;
15305         /* Lossy (best-effort) */
15306         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID6_SERVICE_PROFILE_LOSSY \
15307                 UINT32_C(0x0)
15308         /* Lossless (legacy) */
15309         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID6_SERVICE_PROFILE_LOSSLESS \
15310                 UINT32_C(0x1)
15311         /* Lossless RoCE */
15312         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID6_SERVICE_PROFILE_LOSSLESS_ROCE \
15313                 UINT32_C(0x1)
15314         /* Lossy RoCE CNP */
15315         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID6_SERVICE_PROFILE_LOSSY_ROCE_CNP \
15316                 UINT32_C(0x2)
15317         /* Lossless NIC */
15318         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID6_SERVICE_PROFILE_LOSSLESS_NIC \
15319                 UINT32_C(0x3)
15320         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15321         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID6_SERVICE_PROFILE_UNKNOWN \
15322                 UINT32_C(0xff)
15323         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID6_SERVICE_PROFILE_LAST \
15324                 HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID6_SERVICE_PROFILE_UNKNOWN
15325         /*
15326          * ID of CoS Queue 7.
15327          * FF - Invalid id
15328          *
15329          * # This ID can be used on any subsequent call to an hwrm command
15330          * that takes a queue id.
15331          * # IDs must always be queried by this command before any use
15332          * by the driver or software.
15333          * # Any driver or software should not make any assumptions about
15334          * queue IDs.
15335          * # A value of 0xff indicates that the queue is not available.
15336          * # Available queues may not be in sequential order.
15337          */
15338         uint8_t queue_id7;
15339         /* This value is applicable to CoS queues only. */
15340         uint8_t queue_id7_service_profile;
15341         /* Lossy (best-effort) */
15342         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID7_SERVICE_PROFILE_LOSSY \
15343                 UINT32_C(0x0)
15344         /* Lossless (legacy) */
15345         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID7_SERVICE_PROFILE_LOSSLESS \
15346                 UINT32_C(0x1)
15347         /* Lossless RoCE */
15348         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID7_SERVICE_PROFILE_LOSSLESS_ROCE \
15349                 UINT32_C(0x1)
15350         /* Lossy RoCE CNP */
15351         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID7_SERVICE_PROFILE_LOSSY_ROCE_CNP \
15352                 UINT32_C(0x2)
15353         /* Lossless NIC */
15354         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID7_SERVICE_PROFILE_LOSSLESS_NIC \
15355                 UINT32_C(0x3)
15356         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15357         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID7_SERVICE_PROFILE_UNKNOWN \
15358                 UINT32_C(0xff)
15359         #define HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID7_SERVICE_PROFILE_LAST \
15360                 HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID7_SERVICE_PROFILE_UNKNOWN
15361         /*
15362          * This field is used in Output records to indicate that the output
15363          * is completely written to RAM.  This field should be read as '1'
15364          * to indicate that the output has been completely written.
15365          * When writing a command completion or response to an internal processor,
15366          * the order of writes has to be such that this field is written last.
15367          */
15368         uint8_t valid;
15369 } __attribute__((packed));
15370
15371 /*******************
15372  * hwrm_queue_qcfg *
15373  *******************/
15374
15375
15376 /* hwrm_queue_qcfg_input (size:192b/24B) */
15377 struct hwrm_queue_qcfg_input {
15378         /* The HWRM command request type. */
15379         uint16_t        req_type;
15380         /*
15381          * The completion ring to send the completion event on. This should
15382          * be the NQ ID returned from the `nq_alloc` HWRM command.
15383          */
15384         uint16_t        cmpl_ring;
15385         /*
15386          * The sequence ID is used by the driver for tracking multiple
15387          * commands. This ID is treated as opaque data by the firmware and
15388          * the value is returned in the `hwrm_resp_hdr` upon completion.
15389          */
15390         uint16_t        seq_id;
15391         /*
15392          * The target ID of the command:
15393          * * 0x0-0xFFF8 - The function ID
15394          * * 0xFFF8-0xFFFE - Reserved for internal processors
15395          * * 0xFFFF - HWRM
15396          */
15397         uint16_t        target_id;
15398         /*
15399          * A physical address pointer pointing to a host buffer that the
15400          * command's response data will be written. This can be either a host
15401          * physical address (HPA) or a guest physical address (GPA) and must
15402          * point to a physically contiguous block of memory.
15403          */
15404         uint64_t        resp_addr;
15405         uint32_t        flags;
15406         /*
15407          * Enumeration denoting the RX, TX type of the resource.
15408          * This enumeration is used for resources that are similar for both
15409          * TX and RX paths of the chip.
15410          */
15411         #define HWRM_QUEUE_QCFG_INPUT_FLAGS_PATH     UINT32_C(0x1)
15412         /* tx path */
15413         #define HWRM_QUEUE_QCFG_INPUT_FLAGS_PATH_TX    UINT32_C(0x0)
15414         /* rx path */
15415         #define HWRM_QUEUE_QCFG_INPUT_FLAGS_PATH_RX    UINT32_C(0x1)
15416         #define HWRM_QUEUE_QCFG_INPUT_FLAGS_PATH_LAST \
15417                 HWRM_QUEUE_QCFG_INPUT_FLAGS_PATH_RX
15418         /* Queue ID of the queue. */
15419         uint32_t        queue_id;
15420 } __attribute__((packed));
15421
15422 /* hwrm_queue_qcfg_output (size:128b/16B) */
15423 struct hwrm_queue_qcfg_output {
15424         /* The specific error status for the command. */
15425         uint16_t        error_code;
15426         /* The HWRM command request type. */
15427         uint16_t        req_type;
15428         /* The sequence ID from the original command. */
15429         uint16_t        seq_id;
15430         /* The length of the response data in number of bytes. */
15431         uint16_t        resp_len;
15432         /*
15433          * This value is a the estimate packet length used in the
15434          * TX arbiter.
15435          */
15436         uint32_t        queue_len;
15437         /* This value is applicable to CoS queues only. */
15438         uint8_t service_profile;
15439         /* Lossy (best-effort) */
15440         #define HWRM_QUEUE_QCFG_OUTPUT_SERVICE_PROFILE_LOSSY    UINT32_C(0x0)
15441         /* Lossless */
15442         #define HWRM_QUEUE_QCFG_OUTPUT_SERVICE_PROFILE_LOSSLESS UINT32_C(0x1)
15443         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15444         #define HWRM_QUEUE_QCFG_OUTPUT_SERVICE_PROFILE_UNKNOWN  UINT32_C(0xff)
15445         #define HWRM_QUEUE_QCFG_OUTPUT_SERVICE_PROFILE_LAST \
15446                 HWRM_QUEUE_QCFG_OUTPUT_SERVICE_PROFILE_UNKNOWN
15447         /* Information about queue configuration. */
15448         uint8_t queue_cfg_info;
15449         /*
15450          * If this flag is set to '1', then the queue is
15451          * configured asymmetrically on TX and RX sides.
15452          * If this flag is set to '0', then this queue is
15453          * configured symmetrically on TX and RX sides.
15454          */
15455         #define HWRM_QUEUE_QCFG_OUTPUT_QUEUE_CFG_INFO_ASYM_CFG \
15456                 UINT32_C(0x1)
15457         uint8_t unused_0;
15458         /*
15459          * This field is used in Output records to indicate that the output
15460          * is completely written to RAM.  This field should be read as '1'
15461          * to indicate that the output has been completely written.
15462          * When writing a command completion or response to an internal processor,
15463          * the order of writes has to be such that this field is written last.
15464          */
15465         uint8_t valid;
15466 } __attribute__((packed));
15467
15468 /******************
15469  * hwrm_queue_cfg *
15470  ******************/
15471
15472
15473 /* hwrm_queue_cfg_input (size:320b/40B) */
15474 struct hwrm_queue_cfg_input {
15475         /* The HWRM command request type. */
15476         uint16_t        req_type;
15477         /*
15478          * The completion ring to send the completion event on. This should
15479          * be the NQ ID returned from the `nq_alloc` HWRM command.
15480          */
15481         uint16_t        cmpl_ring;
15482         /*
15483          * The sequence ID is used by the driver for tracking multiple
15484          * commands. This ID is treated as opaque data by the firmware and
15485          * the value is returned in the `hwrm_resp_hdr` upon completion.
15486          */
15487         uint16_t        seq_id;
15488         /*
15489          * The target ID of the command:
15490          * * 0x0-0xFFF8 - The function ID
15491          * * 0xFFF8-0xFFFE - Reserved for internal processors
15492          * * 0xFFFF - HWRM
15493          */
15494         uint16_t        target_id;
15495         /*
15496          * A physical address pointer pointing to a host buffer that the
15497          * command's response data will be written. This can be either a host
15498          * physical address (HPA) or a guest physical address (GPA) and must
15499          * point to a physically contiguous block of memory.
15500          */
15501         uint64_t        resp_addr;
15502         uint32_t        flags;
15503         /*
15504          * Enumeration denoting the RX, TX, or both directions applicable to the resource.
15505          * This enumeration is used for resources that are similar for both
15506          * TX and RX paths of the chip.
15507          */
15508         #define HWRM_QUEUE_CFG_INPUT_FLAGS_PATH_MASK UINT32_C(0x3)
15509         #define HWRM_QUEUE_CFG_INPUT_FLAGS_PATH_SFT  0
15510         /* tx path */
15511         #define HWRM_QUEUE_CFG_INPUT_FLAGS_PATH_TX     UINT32_C(0x0)
15512         /* rx path */
15513         #define HWRM_QUEUE_CFG_INPUT_FLAGS_PATH_RX     UINT32_C(0x1)
15514         /* Bi-directional (Symmetrically applicable to TX and RX paths) */
15515         #define HWRM_QUEUE_CFG_INPUT_FLAGS_PATH_BIDIR  UINT32_C(0x2)
15516         #define HWRM_QUEUE_CFG_INPUT_FLAGS_PATH_LAST \
15517                 HWRM_QUEUE_CFG_INPUT_FLAGS_PATH_BIDIR
15518         uint32_t        enables;
15519         /*
15520          * This bit must be '1' for the dflt_len field to be
15521          * configured.
15522          */
15523         #define HWRM_QUEUE_CFG_INPUT_ENABLES_DFLT_LEN            UINT32_C(0x1)
15524         /*
15525          * This bit must be '1' for the service_profile field to be
15526          * configured.
15527          */
15528         #define HWRM_QUEUE_CFG_INPUT_ENABLES_SERVICE_PROFILE     UINT32_C(0x2)
15529         /* Queue ID of queue that is to be configured by this function. */
15530         uint32_t        queue_id;
15531         /*
15532          * This value is a the estimate packet length used in the
15533          * TX arbiter.
15534          * Set to 0xFF... (All Fs) to not adjust this value.
15535          */
15536         uint32_t        dflt_len;
15537         /* This value is applicable to CoS queues only. */
15538         uint8_t service_profile;
15539         /* Lossy (best-effort) */
15540         #define HWRM_QUEUE_CFG_INPUT_SERVICE_PROFILE_LOSSY    UINT32_C(0x0)
15541         /* Lossless */
15542         #define HWRM_QUEUE_CFG_INPUT_SERVICE_PROFILE_LOSSLESS UINT32_C(0x1)
15543         /* Set to 0xFF... (All Fs) if there is no service profile specified */
15544         #define HWRM_QUEUE_CFG_INPUT_SERVICE_PROFILE_UNKNOWN  UINT32_C(0xff)
15545         #define HWRM_QUEUE_CFG_INPUT_SERVICE_PROFILE_LAST \
15546                 HWRM_QUEUE_CFG_INPUT_SERVICE_PROFILE_UNKNOWN
15547         uint8_t unused_0[7];
15548 } __attribute__((packed));
15549
15550 /* hwrm_queue_cfg_output (size:128b/16B) */
15551 struct hwrm_queue_cfg_output {
15552         /* The specific error status for the command. */
15553         uint16_t        error_code;
15554         /* The HWRM command request type. */
15555         uint16_t        req_type;
15556         /* The sequence ID from the original command. */
15557         uint16_t        seq_id;
15558         /* The length of the response data in number of bytes. */
15559         uint16_t        resp_len;
15560         uint8_t unused_0[7];
15561         /*
15562          * This field is used in Output records to indicate that the output
15563          * is completely written to RAM.  This field should be read as '1'
15564          * to indicate that the output has been completely written.
15565          * When writing a command completion or response to an internal processor,
15566          * the order of writes has to be such that this field is written last.
15567          */
15568         uint8_t valid;
15569 } __attribute__((packed));
15570
15571 /*****************************
15572  * hwrm_queue_pfcenable_qcfg *
15573  *****************************/
15574
15575
15576 /* hwrm_queue_pfcenable_qcfg_input (size:192b/24B) */
15577 struct hwrm_queue_pfcenable_qcfg_input {
15578         /* The HWRM command request type. */
15579         uint16_t        req_type;
15580         /*
15581          * The completion ring to send the completion event on. This should
15582          * be the NQ ID returned from the `nq_alloc` HWRM command.
15583          */
15584         uint16_t        cmpl_ring;
15585         /*
15586          * The sequence ID is used by the driver for tracking multiple
15587          * commands. This ID is treated as opaque data by the firmware and
15588          * the value is returned in the `hwrm_resp_hdr` upon completion.
15589          */
15590         uint16_t        seq_id;
15591         /*
15592          * The target ID of the command:
15593          * * 0x0-0xFFF8 - The function ID
15594          * * 0xFFF8-0xFFFE - Reserved for internal processors
15595          * * 0xFFFF - HWRM
15596          */
15597         uint16_t        target_id;
15598         /*
15599          * A physical address pointer pointing to a host buffer that the
15600          * command's response data will be written. This can be either a host
15601          * physical address (HPA) or a guest physical address (GPA) and must
15602          * point to a physically contiguous block of memory.
15603          */
15604         uint64_t        resp_addr;
15605         /*
15606          * Port ID of port for which the table is being configured.
15607          * The HWRM needs to check whether this function is allowed
15608          * to configure pri2cos mapping on this port.
15609          */
15610         uint16_t        port_id;
15611         uint8_t unused_0[6];
15612 } __attribute__((packed));
15613
15614 /* hwrm_queue_pfcenable_qcfg_output (size:128b/16B) */
15615 struct hwrm_queue_pfcenable_qcfg_output {
15616         /* The specific error status for the command. */
15617         uint16_t        error_code;
15618         /* The HWRM command request type. */
15619         uint16_t        req_type;
15620         /* The sequence ID from the original command. */
15621         uint16_t        seq_id;
15622         /* The length of the response data in number of bytes. */
15623         uint16_t        resp_len;
15624         uint32_t        flags;
15625         /* If set to 1, then PFC is enabled on PRI 0. */
15626         #define HWRM_QUEUE_PFCENABLE_QCFG_OUTPUT_FLAGS_PRI0_PFC_ENABLED \
15627                 UINT32_C(0x1)
15628         /* If set to 1, then PFC is enabled on PRI 1. */
15629         #define HWRM_QUEUE_PFCENABLE_QCFG_OUTPUT_FLAGS_PRI1_PFC_ENABLED \
15630                 UINT32_C(0x2)
15631         /* If set to 1, then PFC is enabled on PRI 2. */
15632         #define HWRM_QUEUE_PFCENABLE_QCFG_OUTPUT_FLAGS_PRI2_PFC_ENABLED \
15633                 UINT32_C(0x4)
15634         /* If set to 1, then PFC is enabled on PRI 3. */
15635         #define HWRM_QUEUE_PFCENABLE_QCFG_OUTPUT_FLAGS_PRI3_PFC_ENABLED \
15636                 UINT32_C(0x8)
15637         /* If set to 1, then PFC is enabled on PRI 4. */
15638         #define HWRM_QUEUE_PFCENABLE_QCFG_OUTPUT_FLAGS_PRI4_PFC_ENABLED \
15639                 UINT32_C(0x10)
15640         /* If set to 1, then PFC is enabled on PRI 5. */
15641         #define HWRM_QUEUE_PFCENABLE_QCFG_OUTPUT_FLAGS_PRI5_PFC_ENABLED \
15642                 UINT32_C(0x20)
15643         /* If set to 1, then PFC is enabled on PRI 6. */
15644         #define HWRM_QUEUE_PFCENABLE_QCFG_OUTPUT_FLAGS_PRI6_PFC_ENABLED \
15645                 UINT32_C(0x40)
15646         /* If set to 1, then PFC is enabled on PRI 7. */
15647         #define HWRM_QUEUE_PFCENABLE_QCFG_OUTPUT_FLAGS_PRI7_PFC_ENABLED \
15648                 UINT32_C(0x80)
15649         uint8_t unused_0[3];
15650         /*
15651          * This field is used in Output records to indicate that the output
15652          * is completely written to RAM.  This field should be read as '1'
15653          * to indicate that the output has been completely written.
15654          * When writing a command completion or response to an internal processor,
15655          * the order of writes has to be such that this field is written last.
15656          */
15657         uint8_t valid;
15658 } __attribute__((packed));
15659
15660 /****************************
15661  * hwrm_queue_pfcenable_cfg *
15662  ****************************/
15663
15664
15665 /* hwrm_queue_pfcenable_cfg_input (size:192b/24B) */
15666 struct hwrm_queue_pfcenable_cfg_input {
15667         /* The HWRM command request type. */
15668         uint16_t        req_type;
15669         /*
15670          * The completion ring to send the completion event on. This should
15671          * be the NQ ID returned from the `nq_alloc` HWRM command.
15672          */
15673         uint16_t        cmpl_ring;
15674         /*
15675          * The sequence ID is used by the driver for tracking multiple
15676          * commands. This ID is treated as opaque data by the firmware and
15677          * the value is returned in the `hwrm_resp_hdr` upon completion.
15678          */
15679         uint16_t        seq_id;
15680         /*
15681          * The target ID of the command:
15682          * * 0x0-0xFFF8 - The function ID
15683          * * 0xFFF8-0xFFFE - Reserved for internal processors
15684          * * 0xFFFF - HWRM
15685          */
15686         uint16_t        target_id;
15687         /*
15688          * A physical address pointer pointing to a host buffer that the
15689          * command's response data will be written. This can be either a host
15690          * physical address (HPA) or a guest physical address (GPA) and must
15691          * point to a physically contiguous block of memory.
15692          */
15693         uint64_t        resp_addr;
15694         uint32_t        flags;
15695         /* If set to 1, then PFC is requested to be enabled on PRI 0. */
15696         #define HWRM_QUEUE_PFCENABLE_CFG_INPUT_FLAGS_PRI0_PFC_ENABLED \
15697                 UINT32_C(0x1)
15698         /* If set to 1, then PFC is requested to be enabled on PRI 1. */
15699         #define HWRM_QUEUE_PFCENABLE_CFG_INPUT_FLAGS_PRI1_PFC_ENABLED \
15700                 UINT32_C(0x2)
15701         /* If set to 1, then PFC is requested to  be enabled on PRI 2. */
15702         #define HWRM_QUEUE_PFCENABLE_CFG_INPUT_FLAGS_PRI2_PFC_ENABLED \
15703                 UINT32_C(0x4)
15704         /* If set to 1, then PFC is requested to  be enabled on PRI 3. */
15705         #define HWRM_QUEUE_PFCENABLE_CFG_INPUT_FLAGS_PRI3_PFC_ENABLED \
15706                 UINT32_C(0x8)
15707         /* If set to 1, then PFC is requested to  be enabled on PRI 4. */
15708         #define HWRM_QUEUE_PFCENABLE_CFG_INPUT_FLAGS_PRI4_PFC_ENABLED \
15709                 UINT32_C(0x10)
15710         /* If set to 1, then PFC is requested to  be enabled on PRI 5. */
15711         #define HWRM_QUEUE_PFCENABLE_CFG_INPUT_FLAGS_PRI5_PFC_ENABLED \
15712                 UINT32_C(0x20)
15713         /* If set to 1, then PFC is requested to  be enabled on PRI 6. */
15714         #define HWRM_QUEUE_PFCENABLE_CFG_INPUT_FLAGS_PRI6_PFC_ENABLED \
15715                 UINT32_C(0x40)
15716         /* If set to 1, then PFC is requested to  be enabled on PRI 7. */
15717         #define HWRM_QUEUE_PFCENABLE_CFG_INPUT_FLAGS_PRI7_PFC_ENABLED \
15718                 UINT32_C(0x80)
15719         /*
15720          * Port ID of port for which the table is being configured.
15721          * The HWRM needs to check whether this function is allowed
15722          * to configure pri2cos mapping on this port.
15723          */
15724         uint16_t        port_id;
15725         uint8_t unused_0[2];
15726 } __attribute__((packed));
15727
15728 /* hwrm_queue_pfcenable_cfg_output (size:128b/16B) */
15729 struct hwrm_queue_pfcenable_cfg_output {
15730         /* The specific error status for the command. */
15731         uint16_t        error_code;
15732         /* The HWRM command request type. */
15733         uint16_t        req_type;
15734         /* The sequence ID from the original command. */
15735         uint16_t        seq_id;
15736         /* The length of the response data in number of bytes. */
15737         uint16_t        resp_len;
15738         uint8_t unused_0[7];
15739         /*
15740          * This field is used in Output records to indicate that the output
15741          * is completely written to RAM.  This field should be read as '1'
15742          * to indicate that the output has been completely written.
15743          * When writing a command completion or response to an internal processor,
15744          * the order of writes has to be such that this field is written last.
15745          */
15746         uint8_t valid;
15747 } __attribute__((packed));
15748
15749 /***************************
15750  * hwrm_queue_pri2cos_qcfg *
15751  ***************************/
15752
15753
15754 /* hwrm_queue_pri2cos_qcfg_input (size:192b/24B) */
15755 struct hwrm_queue_pri2cos_qcfg_input {
15756         /* The HWRM command request type. */
15757         uint16_t        req_type;
15758         /*
15759          * The completion ring to send the completion event on. This should
15760          * be the NQ ID returned from the `nq_alloc` HWRM command.
15761          */
15762         uint16_t        cmpl_ring;
15763         /*
15764          * The sequence ID is used by the driver for tracking multiple
15765          * commands. This ID is treated as opaque data by the firmware and
15766          * the value is returned in the `hwrm_resp_hdr` upon completion.
15767          */
15768         uint16_t        seq_id;
15769         /*
15770          * The target ID of the command:
15771          * * 0x0-0xFFF8 - The function ID
15772          * * 0xFFF8-0xFFFE - Reserved for internal processors
15773          * * 0xFFFF - HWRM
15774          */
15775         uint16_t        target_id;
15776         /*
15777          * A physical address pointer pointing to a host buffer that the
15778          * command's response data will be written. This can be either a host
15779          * physical address (HPA) or a guest physical address (GPA) and must
15780          * point to a physically contiguous block of memory.
15781          */
15782         uint64_t        resp_addr;
15783         uint32_t        flags;
15784         /*
15785          * Enumeration denoting the RX, TX type of the resource.
15786          * This enumeration is used for resources that are similar for both
15787          * TX and RX paths of the chip.
15788          */
15789         #define HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_PATH      UINT32_C(0x1)
15790         /* tx path */
15791         #define HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_PATH_TX     UINT32_C(0x0)
15792         /* rx path */
15793         #define HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_PATH_RX     UINT32_C(0x1)
15794         #define HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_PATH_LAST \
15795                 HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_PATH_RX
15796         /*
15797          * When this bit is set to '0', the query is
15798          * for VLAN PRI field in tunnel headers.
15799          * When this bit is set to '1', the query is
15800          * for VLAN PRI field in inner packet headers.
15801          */
15802         #define HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_IVLAN     UINT32_C(0x2)
15803         /*
15804          * Port ID of port for which the table is being configured.
15805          * The HWRM needs to check whether this function is allowed
15806          * to configure pri2cos mapping on this port.
15807          */
15808         uint8_t port_id;
15809         uint8_t unused_0[3];
15810 } __attribute__((packed));
15811
15812 /* hwrm_queue_pri2cos_qcfg_output (size:192b/24B) */
15813 struct hwrm_queue_pri2cos_qcfg_output {
15814         /* The specific error status for the command. */
15815         uint16_t        error_code;
15816         /* The HWRM command request type. */
15817         uint16_t        req_type;
15818         /* The sequence ID from the original command. */
15819         uint16_t        seq_id;
15820         /* The length of the response data in number of bytes. */
15821         uint16_t        resp_len;
15822         /*
15823          * CoS Queue assigned to priority 0.  This value can only
15824          * be changed before traffic has started.
15825          * A value of 0xff indicates that no CoS queue is assigned to the
15826          * specified priority.
15827          */
15828         uint8_t pri0_cos_queue_id;
15829         /*
15830          * CoS Queue assigned to priority 1.  This value can only
15831          * be changed before traffic has started.
15832          * A value of 0xff indicates that no CoS queue is assigned to the
15833          * specified priority.
15834          */
15835         uint8_t pri1_cos_queue_id;
15836         /*
15837          * CoS Queue assigned to priority 2  This value can only
15838          * be changed before traffic has started.
15839          * A value of 0xff indicates that no CoS queue is assigned to the
15840          * specified priority.
15841          */
15842         uint8_t pri2_cos_queue_id;
15843         /*
15844          * CoS Queue assigned to priority 3.  This value can only
15845          * be changed before traffic has started.
15846          * A value of 0xff indicates that no CoS queue is assigned to the
15847          * specified priority.
15848          */
15849         uint8_t pri3_cos_queue_id;
15850         /*
15851          * CoS Queue assigned to priority 4.  This value can only
15852          * be changed before traffic has started.
15853          * A value of 0xff indicates that no CoS queue is assigned to the
15854          * specified priority.
15855          */
15856         uint8_t pri4_cos_queue_id;
15857         /*
15858          * CoS Queue assigned to priority 5.  This value can only
15859          * be changed before traffic has started.
15860          * A value of 0xff indicates that no CoS queue is assigned to the
15861          * specified priority.
15862          */
15863         uint8_t pri5_cos_queue_id;
15864         /*
15865          * CoS Queue assigned to priority 6.  This value can only
15866          * be changed before traffic has started.
15867          * A value of 0xff indicates that no CoS queue is assigned to the
15868          * specified priority.
15869          */
15870         uint8_t pri6_cos_queue_id;
15871         /*
15872          * CoS Queue assigned to priority 7.  This value can only
15873          * be changed before traffic has started.
15874          * A value of 0xff indicates that no CoS queue is assigned to the
15875          * specified priority.
15876          */
15877         uint8_t pri7_cos_queue_id;
15878         /* Information about queue configuration. */
15879         uint8_t queue_cfg_info;
15880         /*
15881          * If this flag is set to '1', then the PRI to CoS
15882          * configuration is asymmetric on TX and RX sides.
15883          * If this flag is set to '0', then PRI to CoS configuration
15884          * is symmetric on TX and RX sides.
15885          */
15886         #define HWRM_QUEUE_PRI2COS_QCFG_OUTPUT_QUEUE_CFG_INFO_ASYM_CFG \
15887                 UINT32_C(0x1)
15888         uint8_t unused_0[6];
15889         /*
15890          * This field is used in Output records to indicate that the output
15891          * is completely written to RAM.  This field should be read as '1'
15892          * to indicate that the output has been completely written.
15893          * When writing a command completion or response to an internal processor,
15894          * the order of writes has to be such that this field is written last.
15895          */
15896         uint8_t valid;
15897 } __attribute__((packed));
15898
15899 /**************************
15900  * hwrm_queue_pri2cos_cfg *
15901  **************************/
15902
15903
15904 /* hwrm_queue_pri2cos_cfg_input (size:320b/40B) */
15905 struct hwrm_queue_pri2cos_cfg_input {
15906         /* The HWRM command request type. */
15907         uint16_t        req_type;
15908         /*
15909          * The completion ring to send the completion event on. This should
15910          * be the NQ ID returned from the `nq_alloc` HWRM command.
15911          */
15912         uint16_t        cmpl_ring;
15913         /*
15914          * The sequence ID is used by the driver for tracking multiple
15915          * commands. This ID is treated as opaque data by the firmware and
15916          * the value is returned in the `hwrm_resp_hdr` upon completion.
15917          */
15918         uint16_t        seq_id;
15919         /*
15920          * The target ID of the command:
15921          * * 0x0-0xFFF8 - The function ID
15922          * * 0xFFF8-0xFFFE - Reserved for internal processors
15923          * * 0xFFFF - HWRM
15924          */
15925         uint16_t        target_id;
15926         /*
15927          * A physical address pointer pointing to a host buffer that the
15928          * command's response data will be written. This can be either a host
15929          * physical address (HPA) or a guest physical address (GPA) and must
15930          * point to a physically contiguous block of memory.
15931          */
15932         uint64_t        resp_addr;
15933         uint32_t        flags;
15934         /*
15935          * Enumeration denoting the RX, TX, or both directions applicable to the resource.
15936          * This enumeration is used for resources that are similar for both
15937          * TX and RX paths of the chip.
15938          */
15939         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_FLAGS_PATH_MASK UINT32_C(0x3)
15940         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_FLAGS_PATH_SFT  0
15941         /* tx path */
15942         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_FLAGS_PATH_TX     UINT32_C(0x0)
15943         /* rx path */
15944         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_FLAGS_PATH_RX     UINT32_C(0x1)
15945         /* Bi-directional (Symmetrically applicable to TX and RX paths) */
15946         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_FLAGS_PATH_BIDIR  UINT32_C(0x2)
15947         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_FLAGS_PATH_LAST \
15948                 HWRM_QUEUE_PRI2COS_CFG_INPUT_FLAGS_PATH_BIDIR
15949         /*
15950          * When this bit is set to '0', the mapping is requested
15951          * for VLAN PRI field in tunnel headers.
15952          * When this bit is set to '1', the mapping is requested
15953          * for VLAN PRI field in inner packet headers.
15954          */
15955         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_FLAGS_IVLAN     UINT32_C(0x4)
15956         uint32_t        enables;
15957         /*
15958          * This bit must be '1' for the pri0_cos_queue_id field to be
15959          * configured.
15960          */
15961         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_ENABLES_PRI0_COS_QUEUE_ID \
15962                 UINT32_C(0x1)
15963         /*
15964          * This bit must be '1' for the pri1_cos_queue_id field to be
15965          * configured.
15966          */
15967         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_ENABLES_PRI1_COS_QUEUE_ID \
15968                 UINT32_C(0x2)
15969         /*
15970          * This bit must be '1' for the pri2_cos_queue_id field to be
15971          * configured.
15972          */
15973         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_ENABLES_PRI2_COS_QUEUE_ID \
15974                 UINT32_C(0x4)
15975         /*
15976          * This bit must be '1' for the pri3_cos_queue_id field to be
15977          * configured.
15978          */
15979         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_ENABLES_PRI3_COS_QUEUE_ID \
15980                 UINT32_C(0x8)
15981         /*
15982          * This bit must be '1' for the pri4_cos_queue_id field to be
15983          * configured.
15984          */
15985         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_ENABLES_PRI4_COS_QUEUE_ID \
15986                 UINT32_C(0x10)
15987         /*
15988          * This bit must be '1' for the pri5_cos_queue_id field to be
15989          * configured.
15990          */
15991         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_ENABLES_PRI5_COS_QUEUE_ID \
15992                 UINT32_C(0x20)
15993         /*
15994          * This bit must be '1' for the pri6_cos_queue_id field to be
15995          * configured.
15996          */
15997         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_ENABLES_PRI6_COS_QUEUE_ID \
15998                 UINT32_C(0x40)
15999         /*
16000          * This bit must be '1' for the pri7_cos_queue_id field to be
16001          * configured.
16002          */
16003         #define HWRM_QUEUE_PRI2COS_CFG_INPUT_ENABLES_PRI7_COS_QUEUE_ID \
16004                 UINT32_C(0x80)
16005         /*
16006          * Port ID of port for which the table is being configured.
16007          * The HWRM needs to check whether this function is allowed
16008          * to configure pri2cos mapping on this port.
16009          */
16010         uint8_t port_id;
16011         /*
16012          * CoS Queue assigned to priority 0.  This value can only
16013          * be changed before traffic has started.
16014          */
16015         uint8_t pri0_cos_queue_id;
16016         /*
16017          * CoS Queue assigned to priority 1.  This value can only
16018          * be changed before traffic has started.
16019          */
16020         uint8_t pri1_cos_queue_id;
16021         /*
16022          * CoS Queue assigned to priority 2  This value can only
16023          * be changed before traffic has started.
16024          */
16025         uint8_t pri2_cos_queue_id;
16026         /*
16027          * CoS Queue assigned to priority 3.  This value can only
16028          * be changed before traffic has started.
16029          */
16030         uint8_t pri3_cos_queue_id;
16031         /*
16032          * CoS Queue assigned to priority 4.  This value can only
16033          * be changed before traffic has started.
16034          */
16035         uint8_t pri4_cos_queue_id;
16036         /*
16037          * CoS Queue assigned to priority 5.  This value can only
16038          * be changed before traffic has started.
16039          */
16040         uint8_t pri5_cos_queue_id;
16041         /*
16042          * CoS Queue assigned to priority 6.  This value can only
16043          * be changed before traffic has started.
16044          */
16045         uint8_t pri6_cos_queue_id;
16046         /*
16047          * CoS Queue assigned to priority 7.  This value can only
16048          * be changed before traffic has started.
16049          */
16050         uint8_t pri7_cos_queue_id;
16051         uint8_t unused_0[7];
16052 } __attribute__((packed));
16053
16054 /* hwrm_queue_pri2cos_cfg_output (size:128b/16B) */
16055 struct hwrm_queue_pri2cos_cfg_output {
16056         /* The specific error status for the command. */
16057         uint16_t        error_code;
16058         /* The HWRM command request type. */
16059         uint16_t        req_type;
16060         /* The sequence ID from the original command. */
16061         uint16_t        seq_id;
16062         /* The length of the response data in number of bytes. */
16063         uint16_t        resp_len;
16064         uint8_t unused_0[7];
16065         /*
16066          * This field is used in Output records to indicate that the output
16067          * is completely written to RAM.  This field should be read as '1'
16068          * to indicate that the output has been completely written.
16069          * When writing a command completion or response to an internal processor,
16070          * the order of writes has to be such that this field is written last.
16071          */
16072         uint8_t valid;
16073 } __attribute__((packed));
16074
16075 /**************************
16076  * hwrm_queue_cos2bw_qcfg *
16077  **************************/
16078
16079
16080 /* hwrm_queue_cos2bw_qcfg_input (size:192b/24B) */
16081 struct hwrm_queue_cos2bw_qcfg_input {
16082         /* The HWRM command request type. */
16083         uint16_t        req_type;
16084         /*
16085          * The completion ring to send the completion event on. This should
16086          * be the NQ ID returned from the `nq_alloc` HWRM command.
16087          */
16088         uint16_t        cmpl_ring;
16089         /*
16090          * The sequence ID is used by the driver for tracking multiple
16091          * commands. This ID is treated as opaque data by the firmware and
16092          * the value is returned in the `hwrm_resp_hdr` upon completion.
16093          */
16094         uint16_t        seq_id;
16095         /*
16096          * The target ID of the command:
16097          * * 0x0-0xFFF8 - The function ID
16098          * * 0xFFF8-0xFFFE - Reserved for internal processors
16099          * * 0xFFFF - HWRM
16100          */
16101         uint16_t        target_id;
16102         /*
16103          * A physical address pointer pointing to a host buffer that the
16104          * command's response data will be written. This can be either a host
16105          * physical address (HPA) or a guest physical address (GPA) and must
16106          * point to a physically contiguous block of memory.
16107          */
16108         uint64_t        resp_addr;
16109         /*
16110          * Port ID of port for which the table is being configured.
16111          * The HWRM needs to check whether this function is allowed
16112          * to configure TC BW assignment on this port.
16113          */
16114         uint16_t        port_id;
16115         uint8_t unused_0[6];
16116 } __attribute__((packed));
16117
16118 /* hwrm_queue_cos2bw_qcfg_output (size:896b/112B) */
16119 struct hwrm_queue_cos2bw_qcfg_output {
16120         /* The specific error status for the command. */
16121         uint16_t        error_code;
16122         /* The HWRM command request type. */
16123         uint16_t        req_type;
16124         /* The sequence ID from the original command. */
16125         uint16_t        seq_id;
16126         /* The length of the response data in number of bytes. */
16127         uint16_t        resp_len;
16128         /* ID of CoS Queue 0. */
16129         uint8_t queue_id0;
16130         uint8_t unused_0;
16131         uint16_t        unused_1;
16132         /*
16133          * Minimum BW allocated to CoS Queue.
16134          * The HWRM will translate this value into byte counter and
16135          * time interval used for this COS inside the device.
16136          */
16137         uint32_t        queue_id0_min_bw;
16138         /* The bandwidth value. */
16139         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_MASK \
16140                 UINT32_C(0xfffffff)
16141         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_SFT \
16142                 0
16143         /* The granularity of the value (bits or bytes). */
16144         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_SCALE \
16145                 UINT32_C(0x10000000)
16146         /* Value is in bits. */
16147         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_SCALE_BITS \
16148                 (UINT32_C(0x0) << 28)
16149         /* Value is in bytes. */
16150         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_SCALE_BYTES \
16151                 (UINT32_C(0x1) << 28)
16152         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_SCALE_LAST \
16153                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_SCALE_BYTES
16154         /* bw_value_unit is 3 b */
16155         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_MASK \
16156                 UINT32_C(0xe0000000)
16157         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_SFT \
16158                 29
16159         /* Value is in Mb or MB (base 10). */
16160         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_MEGA \
16161                 (UINT32_C(0x0) << 29)
16162         /* Value is in Kb or KB (base 10). */
16163         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_KILO \
16164                 (UINT32_C(0x2) << 29)
16165         /* Value is in bits or bytes. */
16166         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_BASE \
16167                 (UINT32_C(0x4) << 29)
16168         /* Value is in Gb or GB (base 10). */
16169         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_GIGA \
16170                 (UINT32_C(0x6) << 29)
16171         /* Value is in 1/100th of a percentage of total bandwidth. */
16172         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
16173                 (UINT32_C(0x1) << 29)
16174         /* Invalid unit */
16175         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_INVALID \
16176                 (UINT32_C(0x7) << 29)
16177         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_LAST \
16178                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_INVALID
16179         /*
16180          * Maximum BW allocated to CoS Queue.
16181          * The HWRM will translate this value into byte counter and
16182          * time interval used for this COS inside the device.
16183          */
16184         uint32_t        queue_id0_max_bw;
16185         /* The bandwidth value. */
16186         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_MASK \
16187                 UINT32_C(0xfffffff)
16188         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_SFT \
16189                 0
16190         /* The granularity of the value (bits or bytes). */
16191         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_SCALE \
16192                 UINT32_C(0x10000000)
16193         /* Value is in bits. */
16194         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_SCALE_BITS \
16195                 (UINT32_C(0x0) << 28)
16196         /* Value is in bytes. */
16197         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_SCALE_BYTES \
16198                 (UINT32_C(0x1) << 28)
16199         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_SCALE_LAST \
16200                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_SCALE_BYTES
16201         /* bw_value_unit is 3 b */
16202         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_MASK \
16203                 UINT32_C(0xe0000000)
16204         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_SFT \
16205                 29
16206         /* Value is in Mb or MB (base 10). */
16207         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_MEGA \
16208                 (UINT32_C(0x0) << 29)
16209         /* Value is in Kb or KB (base 10). */
16210         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_KILO \
16211                 (UINT32_C(0x2) << 29)
16212         /* Value is in bits or bytes. */
16213         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_BASE \
16214                 (UINT32_C(0x4) << 29)
16215         /* Value is in Gb or GB (base 10). */
16216         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_GIGA \
16217                 (UINT32_C(0x6) << 29)
16218         /* Value is in 1/100th of a percentage of total bandwidth. */
16219         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
16220                 (UINT32_C(0x1) << 29)
16221         /* Invalid unit */
16222         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_INVALID \
16223                 (UINT32_C(0x7) << 29)
16224         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_LAST \
16225                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_INVALID
16226         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
16227         uint8_t queue_id0_tsa_assign;
16228         /* Strict Priority */
16229         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_TSA_ASSIGN_SP \
16230                 UINT32_C(0x0)
16231         /* Enhanced Transmission Selection */
16232         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_TSA_ASSIGN_ETS \
16233                 UINT32_C(0x1)
16234         /* reserved. */
16235         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_TSA_ASSIGN_RESERVED_FIRST \
16236                 UINT32_C(0x2)
16237         /* reserved. */
16238         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID0_TSA_ASSIGN_RESERVED_LAST \
16239                 UINT32_C(0xff)
16240         /*
16241          * Priority level for strict priority. Valid only when the
16242          * tsa_assign is 0 - Strict Priority (SP)
16243          * 0..7 - Valid values.
16244          * 8..255 - Reserved.
16245          */
16246         uint8_t queue_id0_pri_lvl;
16247         /*
16248          * Weight used to allocate remaining BW for this COS after
16249          * servicing guaranteed bandwidths for all COS.
16250          */
16251         uint8_t queue_id0_bw_weight;
16252         /* ID of CoS Queue 1. */
16253         uint8_t queue_id1;
16254         /*
16255          * Minimum BW allocated to CoS Queue.
16256          * The HWRM will translate this value into byte counter and
16257          * time interval used for this COS inside the device.
16258          */
16259         uint32_t        queue_id1_min_bw;
16260         /* The bandwidth value. */
16261         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_MASK \
16262                 UINT32_C(0xfffffff)
16263         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_SFT \
16264                 0
16265         /* The granularity of the value (bits or bytes). */
16266         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_SCALE \
16267                 UINT32_C(0x10000000)
16268         /* Value is in bits. */
16269         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_SCALE_BITS \
16270                 (UINT32_C(0x0) << 28)
16271         /* Value is in bytes. */
16272         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_SCALE_BYTES \
16273                 (UINT32_C(0x1) << 28)
16274         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_SCALE_LAST \
16275                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_SCALE_BYTES
16276         /* bw_value_unit is 3 b */
16277         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_MASK \
16278                 UINT32_C(0xe0000000)
16279         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_SFT \
16280                 29
16281         /* Value is in Mb or MB (base 10). */
16282         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_MEGA \
16283                 (UINT32_C(0x0) << 29)
16284         /* Value is in Kb or KB (base 10). */
16285         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_KILO \
16286                 (UINT32_C(0x2) << 29)
16287         /* Value is in bits or bytes. */
16288         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_BASE \
16289                 (UINT32_C(0x4) << 29)
16290         /* Value is in Gb or GB (base 10). */
16291         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_GIGA \
16292                 (UINT32_C(0x6) << 29)
16293         /* Value is in 1/100th of a percentage of total bandwidth. */
16294         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
16295                 (UINT32_C(0x1) << 29)
16296         /* Invalid unit */
16297         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_INVALID \
16298                 (UINT32_C(0x7) << 29)
16299         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_LAST \
16300                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_INVALID
16301         /*
16302          * Maximum BW allocated to CoS queue.
16303          * The HWRM will translate this value into byte counter and
16304          * time interval used for this COS inside the device.
16305          */
16306         uint32_t        queue_id1_max_bw;
16307         /* The bandwidth value. */
16308         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_MASK \
16309                 UINT32_C(0xfffffff)
16310         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_SFT \
16311                 0
16312         /* The granularity of the value (bits or bytes). */
16313         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_SCALE \
16314                 UINT32_C(0x10000000)
16315         /* Value is in bits. */
16316         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_SCALE_BITS \
16317                 (UINT32_C(0x0) << 28)
16318         /* Value is in bytes. */
16319         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_SCALE_BYTES \
16320                 (UINT32_C(0x1) << 28)
16321         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_SCALE_LAST \
16322                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_SCALE_BYTES
16323         /* bw_value_unit is 3 b */
16324         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_MASK \
16325                 UINT32_C(0xe0000000)
16326         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_SFT \
16327                 29
16328         /* Value is in Mb or MB (base 10). */
16329         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_MEGA \
16330                 (UINT32_C(0x0) << 29)
16331         /* Value is in Kb or KB (base 10). */
16332         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_KILO \
16333                 (UINT32_C(0x2) << 29)
16334         /* Value is in bits or bytes. */
16335         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_BASE \
16336                 (UINT32_C(0x4) << 29)
16337         /* Value is in Gb or GB (base 10). */
16338         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_GIGA \
16339                 (UINT32_C(0x6) << 29)
16340         /* Value is in 1/100th of a percentage of total bandwidth. */
16341         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
16342                 (UINT32_C(0x1) << 29)
16343         /* Invalid unit */
16344         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_INVALID \
16345                 (UINT32_C(0x7) << 29)
16346         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_LAST \
16347                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_INVALID
16348         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
16349         uint8_t queue_id1_tsa_assign;
16350         /* Strict Priority */
16351         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_TSA_ASSIGN_SP \
16352                 UINT32_C(0x0)
16353         /* Enhanced Transmission Selection */
16354         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_TSA_ASSIGN_ETS \
16355                 UINT32_C(0x1)
16356         /* reserved. */
16357         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_TSA_ASSIGN_RESERVED_FIRST \
16358                 UINT32_C(0x2)
16359         /* reserved. */
16360         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID1_TSA_ASSIGN_RESERVED_LAST \
16361                 UINT32_C(0xff)
16362         /*
16363          * Priority level for strict priority. Valid only when the
16364          * tsa_assign is 0 - Strict Priority (SP)
16365          * 0..7 - Valid values.
16366          * 8..255 - Reserved.
16367          */
16368         uint8_t queue_id1_pri_lvl;
16369         /*
16370          * Weight used to allocate remaining BW for this COS after
16371          * servicing guaranteed bandwidths for all COS.
16372          */
16373         uint8_t queue_id1_bw_weight;
16374         /* ID of CoS Queue 2. */
16375         uint8_t queue_id2;
16376         /*
16377          * Minimum BW allocated to CoS Queue.
16378          * The HWRM will translate this value into byte counter and
16379          * time interval used for this COS inside the device.
16380          */
16381         uint32_t        queue_id2_min_bw;
16382         /* The bandwidth value. */
16383         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_MASK \
16384                 UINT32_C(0xfffffff)
16385         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_SFT \
16386                 0
16387         /* The granularity of the value (bits or bytes). */
16388         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_SCALE \
16389                 UINT32_C(0x10000000)
16390         /* Value is in bits. */
16391         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_SCALE_BITS \
16392                 (UINT32_C(0x0) << 28)
16393         /* Value is in bytes. */
16394         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_SCALE_BYTES \
16395                 (UINT32_C(0x1) << 28)
16396         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_SCALE_LAST \
16397                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_SCALE_BYTES
16398         /* bw_value_unit is 3 b */
16399         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_MASK \
16400                 UINT32_C(0xe0000000)
16401         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_SFT \
16402                 29
16403         /* Value is in Mb or MB (base 10). */
16404         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_MEGA \
16405                 (UINT32_C(0x0) << 29)
16406         /* Value is in Kb or KB (base 10). */
16407         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_KILO \
16408                 (UINT32_C(0x2) << 29)
16409         /* Value is in bits or bytes. */
16410         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_BASE \
16411                 (UINT32_C(0x4) << 29)
16412         /* Value is in Gb or GB (base 10). */
16413         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_GIGA \
16414                 (UINT32_C(0x6) << 29)
16415         /* Value is in 1/100th of a percentage of total bandwidth. */
16416         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
16417                 (UINT32_C(0x1) << 29)
16418         /* Invalid unit */
16419         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_INVALID \
16420                 (UINT32_C(0x7) << 29)
16421         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_LAST \
16422                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_INVALID
16423         /*
16424          * Maximum BW allocated to CoS queue.
16425          * The HWRM will translate this value into byte counter and
16426          * time interval used for this COS inside the device.
16427          */
16428         uint32_t        queue_id2_max_bw;
16429         /* The bandwidth value. */
16430         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_MASK \
16431                 UINT32_C(0xfffffff)
16432         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_SFT \
16433                 0
16434         /* The granularity of the value (bits or bytes). */
16435         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_SCALE \
16436                 UINT32_C(0x10000000)
16437         /* Value is in bits. */
16438         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_SCALE_BITS \
16439                 (UINT32_C(0x0) << 28)
16440         /* Value is in bytes. */
16441         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_SCALE_BYTES \
16442                 (UINT32_C(0x1) << 28)
16443         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_SCALE_LAST \
16444                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_SCALE_BYTES
16445         /* bw_value_unit is 3 b */
16446         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_MASK \
16447                 UINT32_C(0xe0000000)
16448         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_SFT \
16449                 29
16450         /* Value is in Mb or MB (base 10). */
16451         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_MEGA \
16452                 (UINT32_C(0x0) << 29)
16453         /* Value is in Kb or KB (base 10). */
16454         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_KILO \
16455                 (UINT32_C(0x2) << 29)
16456         /* Value is in bits or bytes. */
16457         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_BASE \
16458                 (UINT32_C(0x4) << 29)
16459         /* Value is in Gb or GB (base 10). */
16460         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_GIGA \
16461                 (UINT32_C(0x6) << 29)
16462         /* Value is in 1/100th of a percentage of total bandwidth. */
16463         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
16464                 (UINT32_C(0x1) << 29)
16465         /* Invalid unit */
16466         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_INVALID \
16467                 (UINT32_C(0x7) << 29)
16468         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_LAST \
16469                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_INVALID
16470         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
16471         uint8_t queue_id2_tsa_assign;
16472         /* Strict Priority */
16473         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_TSA_ASSIGN_SP \
16474                 UINT32_C(0x0)
16475         /* Enhanced Transmission Selection */
16476         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_TSA_ASSIGN_ETS \
16477                 UINT32_C(0x1)
16478         /* reserved. */
16479         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_TSA_ASSIGN_RESERVED_FIRST \
16480                 UINT32_C(0x2)
16481         /* reserved. */
16482         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID2_TSA_ASSIGN_RESERVED_LAST \
16483                 UINT32_C(0xff)
16484         /*
16485          * Priority level for strict priority. Valid only when the
16486          * tsa_assign is 0 - Strict Priority (SP)
16487          * 0..7 - Valid values.
16488          * 8..255 - Reserved.
16489          */
16490         uint8_t queue_id2_pri_lvl;
16491         /*
16492          * Weight used to allocate remaining BW for this COS after
16493          * servicing guaranteed bandwidths for all COS.
16494          */
16495         uint8_t queue_id2_bw_weight;
16496         /* ID of CoS Queue 3. */
16497         uint8_t queue_id3;
16498         /*
16499          * Minimum BW allocated to CoS Queue.
16500          * The HWRM will translate this value into byte counter and
16501          * time interval used for this COS inside the device.
16502          */
16503         uint32_t        queue_id3_min_bw;
16504         /* The bandwidth value. */
16505         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_MASK \
16506                 UINT32_C(0xfffffff)
16507         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_SFT \
16508                 0
16509         /* The granularity of the value (bits or bytes). */
16510         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_SCALE \
16511                 UINT32_C(0x10000000)
16512         /* Value is in bits. */
16513         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_SCALE_BITS \
16514                 (UINT32_C(0x0) << 28)
16515         /* Value is in bytes. */
16516         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_SCALE_BYTES \
16517                 (UINT32_C(0x1) << 28)
16518         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_SCALE_LAST \
16519                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_SCALE_BYTES
16520         /* bw_value_unit is 3 b */
16521         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_MASK \
16522                 UINT32_C(0xe0000000)
16523         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_SFT \
16524                 29
16525         /* Value is in Mb or MB (base 10). */
16526         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_MEGA \
16527                 (UINT32_C(0x0) << 29)
16528         /* Value is in Kb or KB (base 10). */
16529         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_KILO \
16530                 (UINT32_C(0x2) << 29)
16531         /* Value is in bits or bytes. */
16532         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_BASE \
16533                 (UINT32_C(0x4) << 29)
16534         /* Value is in Gb or GB (base 10). */
16535         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_GIGA \
16536                 (UINT32_C(0x6) << 29)
16537         /* Value is in 1/100th of a percentage of total bandwidth. */
16538         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
16539                 (UINT32_C(0x1) << 29)
16540         /* Invalid unit */
16541         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_INVALID \
16542                 (UINT32_C(0x7) << 29)
16543         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_LAST \
16544                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_INVALID
16545         /*
16546          * Maximum BW allocated to CoS queue.
16547          * The HWRM will translate this value into byte counter and
16548          * time interval used for this COS inside the device.
16549          */
16550         uint32_t        queue_id3_max_bw;
16551         /* The bandwidth value. */
16552         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_MASK \
16553                 UINT32_C(0xfffffff)
16554         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_SFT \
16555                 0
16556         /* The granularity of the value (bits or bytes). */
16557         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_SCALE \
16558                 UINT32_C(0x10000000)
16559         /* Value is in bits. */
16560         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_SCALE_BITS \
16561                 (UINT32_C(0x0) << 28)
16562         /* Value is in bytes. */
16563         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_SCALE_BYTES \
16564                 (UINT32_C(0x1) << 28)
16565         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_SCALE_LAST \
16566                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_SCALE_BYTES
16567         /* bw_value_unit is 3 b */
16568         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_MASK \
16569                 UINT32_C(0xe0000000)
16570         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_SFT \
16571                 29
16572         /* Value is in Mb or MB (base 10). */
16573         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_MEGA \
16574                 (UINT32_C(0x0) << 29)
16575         /* Value is in Kb or KB (base 10). */
16576         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_KILO \
16577                 (UINT32_C(0x2) << 29)
16578         /* Value is in bits or bytes. */
16579         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_BASE \
16580                 (UINT32_C(0x4) << 29)
16581         /* Value is in Gb or GB (base 10). */
16582         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_GIGA \
16583                 (UINT32_C(0x6) << 29)
16584         /* Value is in 1/100th of a percentage of total bandwidth. */
16585         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
16586                 (UINT32_C(0x1) << 29)
16587         /* Invalid unit */
16588         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_INVALID \
16589                 (UINT32_C(0x7) << 29)
16590         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_LAST \
16591                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_INVALID
16592         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
16593         uint8_t queue_id3_tsa_assign;
16594         /* Strict Priority */
16595         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_TSA_ASSIGN_SP \
16596                 UINT32_C(0x0)
16597         /* Enhanced Transmission Selection */
16598         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_TSA_ASSIGN_ETS \
16599                 UINT32_C(0x1)
16600         /* reserved. */
16601         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_TSA_ASSIGN_RESERVED_FIRST \
16602                 UINT32_C(0x2)
16603         /* reserved. */
16604         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID3_TSA_ASSIGN_RESERVED_LAST \
16605                 UINT32_C(0xff)
16606         /*
16607          * Priority level for strict priority. Valid only when the
16608          * tsa_assign is 0 - Strict Priority (SP)
16609          * 0..7 - Valid values.
16610          * 8..255 - Reserved.
16611          */
16612         uint8_t queue_id3_pri_lvl;
16613         /*
16614          * Weight used to allocate remaining BW for this COS after
16615          * servicing guaranteed bandwidths for all COS.
16616          */
16617         uint8_t queue_id3_bw_weight;
16618         /* ID of CoS Queue 4. */
16619         uint8_t queue_id4;
16620         /*
16621          * Minimum BW allocated to CoS Queue.
16622          * The HWRM will translate this value into byte counter and
16623          * time interval used for this COS inside the device.
16624          */
16625         uint32_t        queue_id4_min_bw;
16626         /* The bandwidth value. */
16627         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_MASK \
16628                 UINT32_C(0xfffffff)
16629         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_SFT \
16630                 0
16631         /* The granularity of the value (bits or bytes). */
16632         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_SCALE \
16633                 UINT32_C(0x10000000)
16634         /* Value is in bits. */
16635         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_SCALE_BITS \
16636                 (UINT32_C(0x0) << 28)
16637         /* Value is in bytes. */
16638         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_SCALE_BYTES \
16639                 (UINT32_C(0x1) << 28)
16640         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_SCALE_LAST \
16641                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_SCALE_BYTES
16642         /* bw_value_unit is 3 b */
16643         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_MASK \
16644                 UINT32_C(0xe0000000)
16645         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_SFT \
16646                 29
16647         /* Value is in Mb or MB (base 10). */
16648         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_MEGA \
16649                 (UINT32_C(0x0) << 29)
16650         /* Value is in Kb or KB (base 10). */
16651         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_KILO \
16652                 (UINT32_C(0x2) << 29)
16653         /* Value is in bits or bytes. */
16654         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_BASE \
16655                 (UINT32_C(0x4) << 29)
16656         /* Value is in Gb or GB (base 10). */
16657         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_GIGA \
16658                 (UINT32_C(0x6) << 29)
16659         /* Value is in 1/100th of a percentage of total bandwidth. */
16660         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
16661                 (UINT32_C(0x1) << 29)
16662         /* Invalid unit */
16663         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_INVALID \
16664                 (UINT32_C(0x7) << 29)
16665         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_LAST \
16666                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_INVALID
16667         /*
16668          * Maximum BW allocated to CoS queue.
16669          * The HWRM will translate this value into byte counter and
16670          * time interval used for this COS inside the device.
16671          */
16672         uint32_t        queue_id4_max_bw;
16673         /* The bandwidth value. */
16674         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_MASK \
16675                 UINT32_C(0xfffffff)
16676         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_SFT \
16677                 0
16678         /* The granularity of the value (bits or bytes). */
16679         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_SCALE \
16680                 UINT32_C(0x10000000)
16681         /* Value is in bits. */
16682         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_SCALE_BITS \
16683                 (UINT32_C(0x0) << 28)
16684         /* Value is in bytes. */
16685         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_SCALE_BYTES \
16686                 (UINT32_C(0x1) << 28)
16687         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_SCALE_LAST \
16688                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_SCALE_BYTES
16689         /* bw_value_unit is 3 b */
16690         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_MASK \
16691                 UINT32_C(0xe0000000)
16692         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_SFT \
16693                 29
16694         /* Value is in Mb or MB (base 10). */
16695         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_MEGA \
16696                 (UINT32_C(0x0) << 29)
16697         /* Value is in Kb or KB (base 10). */
16698         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_KILO \
16699                 (UINT32_C(0x2) << 29)
16700         /* Value is in bits or bytes. */
16701         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_BASE \
16702                 (UINT32_C(0x4) << 29)
16703         /* Value is in Gb or GB (base 10). */
16704         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_GIGA \
16705                 (UINT32_C(0x6) << 29)
16706         /* Value is in 1/100th of a percentage of total bandwidth. */
16707         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
16708                 (UINT32_C(0x1) << 29)
16709         /* Invalid unit */
16710         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_INVALID \
16711                 (UINT32_C(0x7) << 29)
16712         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_LAST \
16713                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_INVALID
16714         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
16715         uint8_t queue_id4_tsa_assign;
16716         /* Strict Priority */
16717         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_TSA_ASSIGN_SP \
16718                 UINT32_C(0x0)
16719         /* Enhanced Transmission Selection */
16720         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_TSA_ASSIGN_ETS \
16721                 UINT32_C(0x1)
16722         /* reserved. */
16723         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_TSA_ASSIGN_RESERVED_FIRST \
16724                 UINT32_C(0x2)
16725         /* reserved. */
16726         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID4_TSA_ASSIGN_RESERVED_LAST \
16727                 UINT32_C(0xff)
16728         /*
16729          * Priority level for strict priority. Valid only when the
16730          * tsa_assign is 0 - Strict Priority (SP)
16731          * 0..7 - Valid values.
16732          * 8..255 - Reserved.
16733          */
16734         uint8_t queue_id4_pri_lvl;
16735         /*
16736          * Weight used to allocate remaining BW for this COS after
16737          * servicing guaranteed bandwidths for all COS.
16738          */
16739         uint8_t queue_id4_bw_weight;
16740         /* ID of CoS Queue 5. */
16741         uint8_t queue_id5;
16742         /*
16743          * Minimum BW allocated to CoS Queue.
16744          * The HWRM will translate this value into byte counter and
16745          * time interval used for this COS inside the device.
16746          */
16747         uint32_t        queue_id5_min_bw;
16748         /* The bandwidth value. */
16749         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_MASK \
16750                 UINT32_C(0xfffffff)
16751         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_SFT \
16752                 0
16753         /* The granularity of the value (bits or bytes). */
16754         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_SCALE \
16755                 UINT32_C(0x10000000)
16756         /* Value is in bits. */
16757         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_SCALE_BITS \
16758                 (UINT32_C(0x0) << 28)
16759         /* Value is in bytes. */
16760         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_SCALE_BYTES \
16761                 (UINT32_C(0x1) << 28)
16762         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_SCALE_LAST \
16763                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_SCALE_BYTES
16764         /* bw_value_unit is 3 b */
16765         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_MASK \
16766                 UINT32_C(0xe0000000)
16767         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_SFT \
16768                 29
16769         /* Value is in Mb or MB (base 10). */
16770         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_MEGA \
16771                 (UINT32_C(0x0) << 29)
16772         /* Value is in Kb or KB (base 10). */
16773         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_KILO \
16774                 (UINT32_C(0x2) << 29)
16775         /* Value is in bits or bytes. */
16776         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_BASE \
16777                 (UINT32_C(0x4) << 29)
16778         /* Value is in Gb or GB (base 10). */
16779         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_GIGA \
16780                 (UINT32_C(0x6) << 29)
16781         /* Value is in 1/100th of a percentage of total bandwidth. */
16782         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
16783                 (UINT32_C(0x1) << 29)
16784         /* Invalid unit */
16785         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_INVALID \
16786                 (UINT32_C(0x7) << 29)
16787         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_LAST \
16788                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_INVALID
16789         /*
16790          * Maximum BW allocated to CoS queue.
16791          * The HWRM will translate this value into byte counter and
16792          * time interval used for this COS inside the device.
16793          */
16794         uint32_t        queue_id5_max_bw;
16795         /* The bandwidth value. */
16796         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_MASK \
16797                 UINT32_C(0xfffffff)
16798         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_SFT \
16799                 0
16800         /* The granularity of the value (bits or bytes). */
16801         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_SCALE \
16802                 UINT32_C(0x10000000)
16803         /* Value is in bits. */
16804         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_SCALE_BITS \
16805                 (UINT32_C(0x0) << 28)
16806         /* Value is in bytes. */
16807         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_SCALE_BYTES \
16808                 (UINT32_C(0x1) << 28)
16809         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_SCALE_LAST \
16810                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_SCALE_BYTES
16811         /* bw_value_unit is 3 b */
16812         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_MASK \
16813                 UINT32_C(0xe0000000)
16814         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_SFT \
16815                 29
16816         /* Value is in Mb or MB (base 10). */
16817         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_MEGA \
16818                 (UINT32_C(0x0) << 29)
16819         /* Value is in Kb or KB (base 10). */
16820         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_KILO \
16821                 (UINT32_C(0x2) << 29)
16822         /* Value is in bits or bytes. */
16823         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_BASE \
16824                 (UINT32_C(0x4) << 29)
16825         /* Value is in Gb or GB (base 10). */
16826         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_GIGA \
16827                 (UINT32_C(0x6) << 29)
16828         /* Value is in 1/100th of a percentage of total bandwidth. */
16829         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
16830                 (UINT32_C(0x1) << 29)
16831         /* Invalid unit */
16832         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_INVALID \
16833                 (UINT32_C(0x7) << 29)
16834         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_LAST \
16835                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_INVALID
16836         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
16837         uint8_t queue_id5_tsa_assign;
16838         /* Strict Priority */
16839         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_TSA_ASSIGN_SP \
16840                 UINT32_C(0x0)
16841         /* Enhanced Transmission Selection */
16842         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_TSA_ASSIGN_ETS \
16843                 UINT32_C(0x1)
16844         /* reserved. */
16845         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_TSA_ASSIGN_RESERVED_FIRST \
16846                 UINT32_C(0x2)
16847         /* reserved. */
16848         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID5_TSA_ASSIGN_RESERVED_LAST \
16849                 UINT32_C(0xff)
16850         /*
16851          * Priority level for strict priority. Valid only when the
16852          * tsa_assign is 0 - Strict Priority (SP)
16853          * 0..7 - Valid values.
16854          * 8..255 - Reserved.
16855          */
16856         uint8_t queue_id5_pri_lvl;
16857         /*
16858          * Weight used to allocate remaining BW for this COS after
16859          * servicing guaranteed bandwidths for all COS.
16860          */
16861         uint8_t queue_id5_bw_weight;
16862         /* ID of CoS Queue 6. */
16863         uint8_t queue_id6;
16864         /*
16865          * Minimum BW allocated to CoS Queue.
16866          * The HWRM will translate this value into byte counter and
16867          * time interval used for this COS inside the device.
16868          */
16869         uint32_t        queue_id6_min_bw;
16870         /* The bandwidth value. */
16871         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_MASK \
16872                 UINT32_C(0xfffffff)
16873         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_SFT \
16874                 0
16875         /* The granularity of the value (bits or bytes). */
16876         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_SCALE \
16877                 UINT32_C(0x10000000)
16878         /* Value is in bits. */
16879         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_SCALE_BITS \
16880                 (UINT32_C(0x0) << 28)
16881         /* Value is in bytes. */
16882         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_SCALE_BYTES \
16883                 (UINT32_C(0x1) << 28)
16884         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_SCALE_LAST \
16885                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_SCALE_BYTES
16886         /* bw_value_unit is 3 b */
16887         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_MASK \
16888                 UINT32_C(0xe0000000)
16889         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_SFT \
16890                 29
16891         /* Value is in Mb or MB (base 10). */
16892         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_MEGA \
16893                 (UINT32_C(0x0) << 29)
16894         /* Value is in Kb or KB (base 10). */
16895         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_KILO \
16896                 (UINT32_C(0x2) << 29)
16897         /* Value is in bits or bytes. */
16898         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_BASE \
16899                 (UINT32_C(0x4) << 29)
16900         /* Value is in Gb or GB (base 10). */
16901         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_GIGA \
16902                 (UINT32_C(0x6) << 29)
16903         /* Value is in 1/100th of a percentage of total bandwidth. */
16904         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
16905                 (UINT32_C(0x1) << 29)
16906         /* Invalid unit */
16907         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_INVALID \
16908                 (UINT32_C(0x7) << 29)
16909         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_LAST \
16910                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_INVALID
16911         /*
16912          * Maximum BW allocated to CoS queue.
16913          * The HWRM will translate this value into byte counter and
16914          * time interval used for this COS inside the device.
16915          */
16916         uint32_t        queue_id6_max_bw;
16917         /* The bandwidth value. */
16918         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_MASK \
16919                 UINT32_C(0xfffffff)
16920         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_SFT \
16921                 0
16922         /* The granularity of the value (bits or bytes). */
16923         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_SCALE \
16924                 UINT32_C(0x10000000)
16925         /* Value is in bits. */
16926         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_SCALE_BITS \
16927                 (UINT32_C(0x0) << 28)
16928         /* Value is in bytes. */
16929         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_SCALE_BYTES \
16930                 (UINT32_C(0x1) << 28)
16931         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_SCALE_LAST \
16932                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_SCALE_BYTES
16933         /* bw_value_unit is 3 b */
16934         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_MASK \
16935                 UINT32_C(0xe0000000)
16936         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_SFT \
16937                 29
16938         /* Value is in Mb or MB (base 10). */
16939         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_MEGA \
16940                 (UINT32_C(0x0) << 29)
16941         /* Value is in Kb or KB (base 10). */
16942         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_KILO \
16943                 (UINT32_C(0x2) << 29)
16944         /* Value is in bits or bytes. */
16945         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_BASE \
16946                 (UINT32_C(0x4) << 29)
16947         /* Value is in Gb or GB (base 10). */
16948         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_GIGA \
16949                 (UINT32_C(0x6) << 29)
16950         /* Value is in 1/100th of a percentage of total bandwidth. */
16951         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
16952                 (UINT32_C(0x1) << 29)
16953         /* Invalid unit */
16954         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_INVALID \
16955                 (UINT32_C(0x7) << 29)
16956         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_LAST \
16957                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_INVALID
16958         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
16959         uint8_t queue_id6_tsa_assign;
16960         /* Strict Priority */
16961         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_TSA_ASSIGN_SP \
16962                 UINT32_C(0x0)
16963         /* Enhanced Transmission Selection */
16964         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_TSA_ASSIGN_ETS \
16965                 UINT32_C(0x1)
16966         /* reserved. */
16967         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_TSA_ASSIGN_RESERVED_FIRST \
16968                 UINT32_C(0x2)
16969         /* reserved. */
16970         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID6_TSA_ASSIGN_RESERVED_LAST \
16971                 UINT32_C(0xff)
16972         /*
16973          * Priority level for strict priority. Valid only when the
16974          * tsa_assign is 0 - Strict Priority (SP)
16975          * 0..7 - Valid values.
16976          * 8..255 - Reserved.
16977          */
16978         uint8_t queue_id6_pri_lvl;
16979         /*
16980          * Weight used to allocate remaining BW for this COS after
16981          * servicing guaranteed bandwidths for all COS.
16982          */
16983         uint8_t queue_id6_bw_weight;
16984         /* ID of CoS Queue 7. */
16985         uint8_t queue_id7;
16986         /*
16987          * Minimum BW allocated to CoS Queue.
16988          * The HWRM will translate this value into byte counter and
16989          * time interval used for this COS inside the device.
16990          */
16991         uint32_t        queue_id7_min_bw;
16992         /* The bandwidth value. */
16993         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_MASK \
16994                 UINT32_C(0xfffffff)
16995         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_SFT \
16996                 0
16997         /* The granularity of the value (bits or bytes). */
16998         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_SCALE \
16999                 UINT32_C(0x10000000)
17000         /* Value is in bits. */
17001         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_SCALE_BITS \
17002                 (UINT32_C(0x0) << 28)
17003         /* Value is in bytes. */
17004         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_SCALE_BYTES \
17005                 (UINT32_C(0x1) << 28)
17006         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_SCALE_LAST \
17007                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_SCALE_BYTES
17008         /* bw_value_unit is 3 b */
17009         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_MASK \
17010                 UINT32_C(0xe0000000)
17011         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_SFT \
17012                 29
17013         /* Value is in Mb or MB (base 10). */
17014         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_MEGA \
17015                 (UINT32_C(0x0) << 29)
17016         /* Value is in Kb or KB (base 10). */
17017         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_KILO \
17018                 (UINT32_C(0x2) << 29)
17019         /* Value is in bits or bytes. */
17020         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_BASE \
17021                 (UINT32_C(0x4) << 29)
17022         /* Value is in Gb or GB (base 10). */
17023         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_GIGA \
17024                 (UINT32_C(0x6) << 29)
17025         /* Value is in 1/100th of a percentage of total bandwidth. */
17026         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
17027                 (UINT32_C(0x1) << 29)
17028         /* Invalid unit */
17029         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_INVALID \
17030                 (UINT32_C(0x7) << 29)
17031         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_LAST \
17032                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_INVALID
17033         /*
17034          * Maximum BW allocated to CoS queue.
17035          * The HWRM will translate this value into byte counter and
17036          * time interval used for this COS inside the device.
17037          */
17038         uint32_t        queue_id7_max_bw;
17039         /* The bandwidth value. */
17040         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_MASK \
17041                 UINT32_C(0xfffffff)
17042         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_SFT \
17043                 0
17044         /* The granularity of the value (bits or bytes). */
17045         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_SCALE \
17046                 UINT32_C(0x10000000)
17047         /* Value is in bits. */
17048         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_SCALE_BITS \
17049                 (UINT32_C(0x0) << 28)
17050         /* Value is in bytes. */
17051         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_SCALE_BYTES \
17052                 (UINT32_C(0x1) << 28)
17053         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_SCALE_LAST \
17054                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_SCALE_BYTES
17055         /* bw_value_unit is 3 b */
17056         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_MASK \
17057                 UINT32_C(0xe0000000)
17058         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_SFT \
17059                 29
17060         /* Value is in Mb or MB (base 10). */
17061         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_MEGA \
17062                 (UINT32_C(0x0) << 29)
17063         /* Value is in Kb or KB (base 10). */
17064         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_KILO \
17065                 (UINT32_C(0x2) << 29)
17066         /* Value is in bits or bytes. */
17067         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_BASE \
17068                 (UINT32_C(0x4) << 29)
17069         /* Value is in Gb or GB (base 10). */
17070         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_GIGA \
17071                 (UINT32_C(0x6) << 29)
17072         /* Value is in 1/100th of a percentage of total bandwidth. */
17073         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
17074                 (UINT32_C(0x1) << 29)
17075         /* Invalid unit */
17076         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_INVALID \
17077                 (UINT32_C(0x7) << 29)
17078         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_LAST \
17079                 HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_INVALID
17080         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
17081         uint8_t queue_id7_tsa_assign;
17082         /* Strict Priority */
17083         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_TSA_ASSIGN_SP \
17084                 UINT32_C(0x0)
17085         /* Enhanced Transmission Selection */
17086         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_TSA_ASSIGN_ETS \
17087                 UINT32_C(0x1)
17088         /* reserved. */
17089         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_TSA_ASSIGN_RESERVED_FIRST \
17090                 UINT32_C(0x2)
17091         /* reserved. */
17092         #define HWRM_QUEUE_COS2BW_QCFG_OUTPUT_QUEUE_ID7_TSA_ASSIGN_RESERVED_LAST \
17093                 UINT32_C(0xff)
17094         /*
17095          * Priority level for strict priority. Valid only when the
17096          * tsa_assign is 0 - Strict Priority (SP)
17097          * 0..7 - Valid values.
17098          * 8..255 - Reserved.
17099          */
17100         uint8_t queue_id7_pri_lvl;
17101         /*
17102          * Weight used to allocate remaining BW for this COS after
17103          * servicing guaranteed bandwidths for all COS.
17104          */
17105         uint8_t queue_id7_bw_weight;
17106         uint8_t unused_2[4];
17107         /*
17108          * This field is used in Output records to indicate that the output
17109          * is completely written to RAM.  This field should be read as '1'
17110          * to indicate that the output has been completely written.
17111          * When writing a command completion or response to an internal processor,
17112          * the order of writes has to be such that this field is written last.
17113          */
17114         uint8_t valid;
17115 } __attribute__((packed));
17116
17117 /*************************
17118  * hwrm_queue_cos2bw_cfg *
17119  *************************/
17120
17121
17122 /* hwrm_queue_cos2bw_cfg_input (size:1024b/128B) */
17123 struct hwrm_queue_cos2bw_cfg_input {
17124         /* The HWRM command request type. */
17125         uint16_t        req_type;
17126         /*
17127          * The completion ring to send the completion event on. This should
17128          * be the NQ ID returned from the `nq_alloc` HWRM command.
17129          */
17130         uint16_t        cmpl_ring;
17131         /*
17132          * The sequence ID is used by the driver for tracking multiple
17133          * commands. This ID is treated as opaque data by the firmware and
17134          * the value is returned in the `hwrm_resp_hdr` upon completion.
17135          */
17136         uint16_t        seq_id;
17137         /*
17138          * The target ID of the command:
17139          * * 0x0-0xFFF8 - The function ID
17140          * * 0xFFF8-0xFFFE - Reserved for internal processors
17141          * * 0xFFFF - HWRM
17142          */
17143         uint16_t        target_id;
17144         /*
17145          * A physical address pointer pointing to a host buffer that the
17146          * command's response data will be written. This can be either a host
17147          * physical address (HPA) or a guest physical address (GPA) and must
17148          * point to a physically contiguous block of memory.
17149          */
17150         uint64_t        resp_addr;
17151         uint32_t        flags;
17152         uint32_t        enables;
17153         /*
17154          * If this bit is set to 1, then all queue_id0 related
17155          * parameters in this command are valid.
17156          */
17157         #define HWRM_QUEUE_COS2BW_CFG_INPUT_ENABLES_COS_QUEUE_ID0_VALID \
17158                 UINT32_C(0x1)
17159         /*
17160          * If this bit is set to 1, then all queue_id1 related
17161          * parameters in this command are valid.
17162          */
17163         #define HWRM_QUEUE_COS2BW_CFG_INPUT_ENABLES_COS_QUEUE_ID1_VALID \
17164                 UINT32_C(0x2)
17165         /*
17166          * If this bit is set to 1, then all queue_id2 related
17167          * parameters in this command are valid.
17168          */
17169         #define HWRM_QUEUE_COS2BW_CFG_INPUT_ENABLES_COS_QUEUE_ID2_VALID \
17170                 UINT32_C(0x4)
17171         /*
17172          * If this bit is set to 1, then all queue_id3 related
17173          * parameters in this command are valid.
17174          */
17175         #define HWRM_QUEUE_COS2BW_CFG_INPUT_ENABLES_COS_QUEUE_ID3_VALID \
17176                 UINT32_C(0x8)
17177         /*
17178          * If this bit is set to 1, then all queue_id4 related
17179          * parameters in this command are valid.
17180          */
17181         #define HWRM_QUEUE_COS2BW_CFG_INPUT_ENABLES_COS_QUEUE_ID4_VALID \
17182                 UINT32_C(0x10)
17183         /*
17184          * If this bit is set to 1, then all queue_id5 related
17185          * parameters in this command are valid.
17186          */
17187         #define HWRM_QUEUE_COS2BW_CFG_INPUT_ENABLES_COS_QUEUE_ID5_VALID \
17188                 UINT32_C(0x20)
17189         /*
17190          * If this bit is set to 1, then all queue_id6 related
17191          * parameters in this command are valid.
17192          */
17193         #define HWRM_QUEUE_COS2BW_CFG_INPUT_ENABLES_COS_QUEUE_ID6_VALID \
17194                 UINT32_C(0x40)
17195         /*
17196          * If this bit is set to 1, then all queue_id7 related
17197          * parameters in this command are valid.
17198          */
17199         #define HWRM_QUEUE_COS2BW_CFG_INPUT_ENABLES_COS_QUEUE_ID7_VALID \
17200                 UINT32_C(0x80)
17201         /*
17202          * Port ID of port for which the table is being configured.
17203          * The HWRM needs to check whether this function is allowed
17204          * to configure TC BW assignment on this port.
17205          */
17206         uint16_t        port_id;
17207         /* ID of CoS Queue 0. */
17208         uint8_t queue_id0;
17209         uint8_t unused_0;
17210         /*
17211          * Minimum BW allocated to CoS Queue.
17212          * The HWRM will translate this value into byte counter and
17213          * time interval used for this COS inside the device.
17214          */
17215         uint32_t        queue_id0_min_bw;
17216         /* The bandwidth value. */
17217         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_MASK \
17218                 UINT32_C(0xfffffff)
17219         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_SFT \
17220                 0
17221         /* The granularity of the value (bits or bytes). */
17222         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_SCALE \
17223                 UINT32_C(0x10000000)
17224         /* Value is in bits. */
17225         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_SCALE_BITS \
17226                 (UINT32_C(0x0) << 28)
17227         /* Value is in bytes. */
17228         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_SCALE_BYTES \
17229                 (UINT32_C(0x1) << 28)
17230         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_SCALE_LAST \
17231                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_SCALE_BYTES
17232         /* bw_value_unit is 3 b */
17233         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_MASK \
17234                 UINT32_C(0xe0000000)
17235         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_SFT \
17236                 29
17237         /* Value is in Mb or MB (base 10). */
17238         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_MEGA \
17239                 (UINT32_C(0x0) << 29)
17240         /* Value is in Kb or KB (base 10). */
17241         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_KILO \
17242                 (UINT32_C(0x2) << 29)
17243         /* Value is in bits or bytes. */
17244         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_BASE \
17245                 (UINT32_C(0x4) << 29)
17246         /* Value is in Gb or GB (base 10). */
17247         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_GIGA \
17248                 (UINT32_C(0x6) << 29)
17249         /* Value is in 1/100th of a percentage of total bandwidth. */
17250         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
17251                 (UINT32_C(0x1) << 29)
17252         /* Invalid unit */
17253         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_INVALID \
17254                 (UINT32_C(0x7) << 29)
17255         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_LAST \
17256                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MIN_BW_BW_VALUE_UNIT_INVALID
17257         /*
17258          * Maximum BW allocated to CoS Queue.
17259          * The HWRM will translate this value into byte counter and
17260          * time interval used for this COS inside the device.
17261          */
17262         uint32_t        queue_id0_max_bw;
17263         /* The bandwidth value. */
17264         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_MASK \
17265                 UINT32_C(0xfffffff)
17266         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_SFT \
17267                 0
17268         /* The granularity of the value (bits or bytes). */
17269         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_SCALE \
17270                 UINT32_C(0x10000000)
17271         /* Value is in bits. */
17272         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_SCALE_BITS \
17273                 (UINT32_C(0x0) << 28)
17274         /* Value is in bytes. */
17275         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_SCALE_BYTES \
17276                 (UINT32_C(0x1) << 28)
17277         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_SCALE_LAST \
17278                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_SCALE_BYTES
17279         /* bw_value_unit is 3 b */
17280         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_MASK \
17281                 UINT32_C(0xe0000000)
17282         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_SFT \
17283                 29
17284         /* Value is in Mb or MB (base 10). */
17285         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_MEGA \
17286                 (UINT32_C(0x0) << 29)
17287         /* Value is in Kb or KB (base 10). */
17288         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_KILO \
17289                 (UINT32_C(0x2) << 29)
17290         /* Value is in bits or bytes. */
17291         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_BASE \
17292                 (UINT32_C(0x4) << 29)
17293         /* Value is in Gb or GB (base 10). */
17294         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_GIGA \
17295                 (UINT32_C(0x6) << 29)
17296         /* Value is in 1/100th of a percentage of total bandwidth. */
17297         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
17298                 (UINT32_C(0x1) << 29)
17299         /* Invalid unit */
17300         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_INVALID \
17301                 (UINT32_C(0x7) << 29)
17302         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_LAST \
17303                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_MAX_BW_BW_VALUE_UNIT_INVALID
17304         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
17305         uint8_t queue_id0_tsa_assign;
17306         /* Strict Priority */
17307         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_TSA_ASSIGN_SP \
17308                 UINT32_C(0x0)
17309         /* Enhanced Transmission Selection */
17310         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_TSA_ASSIGN_ETS \
17311                 UINT32_C(0x1)
17312         /* reserved. */
17313         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_TSA_ASSIGN_RESERVED_FIRST \
17314                 UINT32_C(0x2)
17315         /* reserved. */
17316         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID0_TSA_ASSIGN_RESERVED_LAST \
17317                 UINT32_C(0xff)
17318         /*
17319          * Priority level for strict priority. Valid only when the
17320          * tsa_assign is 0 - Strict Priority (SP)
17321          * 0..7 - Valid values.
17322          * 8..255 - Reserved.
17323          */
17324         uint8_t queue_id0_pri_lvl;
17325         /*
17326          * Weight used to allocate remaining BW for this COS after
17327          * servicing guaranteed bandwidths for all COS.
17328          */
17329         uint8_t queue_id0_bw_weight;
17330         /* ID of CoS Queue 1. */
17331         uint8_t queue_id1;
17332         /*
17333          * Minimum BW allocated to CoS Queue.
17334          * The HWRM will translate this value into byte counter and
17335          * time interval used for this COS inside the device.
17336          */
17337         uint32_t        queue_id1_min_bw;
17338         /* The bandwidth value. */
17339         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_MASK \
17340                 UINT32_C(0xfffffff)
17341         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_SFT \
17342                 0
17343         /* The granularity of the value (bits or bytes). */
17344         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_SCALE \
17345                 UINT32_C(0x10000000)
17346         /* Value is in bits. */
17347         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_SCALE_BITS \
17348                 (UINT32_C(0x0) << 28)
17349         /* Value is in bytes. */
17350         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_SCALE_BYTES \
17351                 (UINT32_C(0x1) << 28)
17352         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_SCALE_LAST \
17353                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_SCALE_BYTES
17354         /* bw_value_unit is 3 b */
17355         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_MASK \
17356                 UINT32_C(0xe0000000)
17357         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_SFT \
17358                 29
17359         /* Value is in Mb or MB (base 10). */
17360         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_MEGA \
17361                 (UINT32_C(0x0) << 29)
17362         /* Value is in Kb or KB (base 10). */
17363         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_KILO \
17364                 (UINT32_C(0x2) << 29)
17365         /* Value is in bits or bytes. */
17366         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_BASE \
17367                 (UINT32_C(0x4) << 29)
17368         /* Value is in Gb or GB (base 10). */
17369         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_GIGA \
17370                 (UINT32_C(0x6) << 29)
17371         /* Value is in 1/100th of a percentage of total bandwidth. */
17372         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
17373                 (UINT32_C(0x1) << 29)
17374         /* Invalid unit */
17375         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_INVALID \
17376                 (UINT32_C(0x7) << 29)
17377         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_LAST \
17378                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MIN_BW_BW_VALUE_UNIT_INVALID
17379         /*
17380          * Maximum BW allocated to CoS queue.
17381          * The HWRM will translate this value into byte counter and
17382          * time interval used for this COS inside the device.
17383          */
17384         uint32_t        queue_id1_max_bw;
17385         /* The bandwidth value. */
17386         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_MASK \
17387                 UINT32_C(0xfffffff)
17388         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_SFT \
17389                 0
17390         /* The granularity of the value (bits or bytes). */
17391         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_SCALE \
17392                 UINT32_C(0x10000000)
17393         /* Value is in bits. */
17394         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_SCALE_BITS \
17395                 (UINT32_C(0x0) << 28)
17396         /* Value is in bytes. */
17397         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_SCALE_BYTES \
17398                 (UINT32_C(0x1) << 28)
17399         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_SCALE_LAST \
17400                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_SCALE_BYTES
17401         /* bw_value_unit is 3 b */
17402         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_MASK \
17403                 UINT32_C(0xe0000000)
17404         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_SFT \
17405                 29
17406         /* Value is in Mb or MB (base 10). */
17407         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_MEGA \
17408                 (UINT32_C(0x0) << 29)
17409         /* Value is in Kb or KB (base 10). */
17410         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_KILO \
17411                 (UINT32_C(0x2) << 29)
17412         /* Value is in bits or bytes. */
17413         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_BASE \
17414                 (UINT32_C(0x4) << 29)
17415         /* Value is in Gb or GB (base 10). */
17416         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_GIGA \
17417                 (UINT32_C(0x6) << 29)
17418         /* Value is in 1/100th of a percentage of total bandwidth. */
17419         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
17420                 (UINT32_C(0x1) << 29)
17421         /* Invalid unit */
17422         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_INVALID \
17423                 (UINT32_C(0x7) << 29)
17424         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_LAST \
17425                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_MAX_BW_BW_VALUE_UNIT_INVALID
17426         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
17427         uint8_t queue_id1_tsa_assign;
17428         /* Strict Priority */
17429         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_TSA_ASSIGN_SP \
17430                 UINT32_C(0x0)
17431         /* Enhanced Transmission Selection */
17432         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_TSA_ASSIGN_ETS \
17433                 UINT32_C(0x1)
17434         /* reserved. */
17435         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_TSA_ASSIGN_RESERVED_FIRST \
17436                 UINT32_C(0x2)
17437         /* reserved. */
17438         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID1_TSA_ASSIGN_RESERVED_LAST \
17439                 UINT32_C(0xff)
17440         /*
17441          * Priority level for strict priority. Valid only when the
17442          * tsa_assign is 0 - Strict Priority (SP)
17443          * 0..7 - Valid values.
17444          * 8..255 - Reserved.
17445          */
17446         uint8_t queue_id1_pri_lvl;
17447         /*
17448          * Weight used to allocate remaining BW for this COS after
17449          * servicing guaranteed bandwidths for all COS.
17450          */
17451         uint8_t queue_id1_bw_weight;
17452         /* ID of CoS Queue 2. */
17453         uint8_t queue_id2;
17454         /*
17455          * Minimum BW allocated to CoS Queue.
17456          * The HWRM will translate this value into byte counter and
17457          * time interval used for this COS inside the device.
17458          */
17459         uint32_t        queue_id2_min_bw;
17460         /* The bandwidth value. */
17461         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_MASK \
17462                 UINT32_C(0xfffffff)
17463         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_SFT \
17464                 0
17465         /* The granularity of the value (bits or bytes). */
17466         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_SCALE \
17467                 UINT32_C(0x10000000)
17468         /* Value is in bits. */
17469         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_SCALE_BITS \
17470                 (UINT32_C(0x0) << 28)
17471         /* Value is in bytes. */
17472         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_SCALE_BYTES \
17473                 (UINT32_C(0x1) << 28)
17474         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_SCALE_LAST \
17475                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_SCALE_BYTES
17476         /* bw_value_unit is 3 b */
17477         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_MASK \
17478                 UINT32_C(0xe0000000)
17479         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_SFT \
17480                 29
17481         /* Value is in Mb or MB (base 10). */
17482         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_MEGA \
17483                 (UINT32_C(0x0) << 29)
17484         /* Value is in Kb or KB (base 10). */
17485         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_KILO \
17486                 (UINT32_C(0x2) << 29)
17487         /* Value is in bits or bytes. */
17488         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_BASE \
17489                 (UINT32_C(0x4) << 29)
17490         /* Value is in Gb or GB (base 10). */
17491         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_GIGA \
17492                 (UINT32_C(0x6) << 29)
17493         /* Value is in 1/100th of a percentage of total bandwidth. */
17494         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
17495                 (UINT32_C(0x1) << 29)
17496         /* Invalid unit */
17497         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_INVALID \
17498                 (UINT32_C(0x7) << 29)
17499         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_LAST \
17500                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MIN_BW_BW_VALUE_UNIT_INVALID
17501         /*
17502          * Maximum BW allocated to CoS queue.
17503          * The HWRM will translate this value into byte counter and
17504          * time interval used for this COS inside the device.
17505          */
17506         uint32_t        queue_id2_max_bw;
17507         /* The bandwidth value. */
17508         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_MASK \
17509                 UINT32_C(0xfffffff)
17510         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_SFT \
17511                 0
17512         /* The granularity of the value (bits or bytes). */
17513         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_SCALE \
17514                 UINT32_C(0x10000000)
17515         /* Value is in bits. */
17516         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_SCALE_BITS \
17517                 (UINT32_C(0x0) << 28)
17518         /* Value is in bytes. */
17519         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_SCALE_BYTES \
17520                 (UINT32_C(0x1) << 28)
17521         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_SCALE_LAST \
17522                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_SCALE_BYTES
17523         /* bw_value_unit is 3 b */
17524         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_MASK \
17525                 UINT32_C(0xe0000000)
17526         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_SFT \
17527                 29
17528         /* Value is in Mb or MB (base 10). */
17529         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_MEGA \
17530                 (UINT32_C(0x0) << 29)
17531         /* Value is in Kb or KB (base 10). */
17532         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_KILO \
17533                 (UINT32_C(0x2) << 29)
17534         /* Value is in bits or bytes. */
17535         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_BASE \
17536                 (UINT32_C(0x4) << 29)
17537         /* Value is in Gb or GB (base 10). */
17538         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_GIGA \
17539                 (UINT32_C(0x6) << 29)
17540         /* Value is in 1/100th of a percentage of total bandwidth. */
17541         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
17542                 (UINT32_C(0x1) << 29)
17543         /* Invalid unit */
17544         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_INVALID \
17545                 (UINT32_C(0x7) << 29)
17546         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_LAST \
17547                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_MAX_BW_BW_VALUE_UNIT_INVALID
17548         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
17549         uint8_t queue_id2_tsa_assign;
17550         /* Strict Priority */
17551         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_TSA_ASSIGN_SP \
17552                 UINT32_C(0x0)
17553         /* Enhanced Transmission Selection */
17554         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_TSA_ASSIGN_ETS \
17555                 UINT32_C(0x1)
17556         /* reserved. */
17557         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_TSA_ASSIGN_RESERVED_FIRST \
17558                 UINT32_C(0x2)
17559         /* reserved. */
17560         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID2_TSA_ASSIGN_RESERVED_LAST \
17561                 UINT32_C(0xff)
17562         /*
17563          * Priority level for strict priority. Valid only when the
17564          * tsa_assign is 0 - Strict Priority (SP)
17565          * 0..7 - Valid values.
17566          * 8..255 - Reserved.
17567          */
17568         uint8_t queue_id2_pri_lvl;
17569         /*
17570          * Weight used to allocate remaining BW for this COS after
17571          * servicing guaranteed bandwidths for all COS.
17572          */
17573         uint8_t queue_id2_bw_weight;
17574         /* ID of CoS Queue 3. */
17575         uint8_t queue_id3;
17576         /*
17577          * Minimum BW allocated to CoS Queue.
17578          * The HWRM will translate this value into byte counter and
17579          * time interval used for this COS inside the device.
17580          */
17581         uint32_t        queue_id3_min_bw;
17582         /* The bandwidth value. */
17583         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_MASK \
17584                 UINT32_C(0xfffffff)
17585         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_SFT \
17586                 0
17587         /* The granularity of the value (bits or bytes). */
17588         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_SCALE \
17589                 UINT32_C(0x10000000)
17590         /* Value is in bits. */
17591         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_SCALE_BITS \
17592                 (UINT32_C(0x0) << 28)
17593         /* Value is in bytes. */
17594         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_SCALE_BYTES \
17595                 (UINT32_C(0x1) << 28)
17596         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_SCALE_LAST \
17597                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_SCALE_BYTES
17598         /* bw_value_unit is 3 b */
17599         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_MASK \
17600                 UINT32_C(0xe0000000)
17601         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_SFT \
17602                 29
17603         /* Value is in Mb or MB (base 10). */
17604         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_MEGA \
17605                 (UINT32_C(0x0) << 29)
17606         /* Value is in Kb or KB (base 10). */
17607         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_KILO \
17608                 (UINT32_C(0x2) << 29)
17609         /* Value is in bits or bytes. */
17610         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_BASE \
17611                 (UINT32_C(0x4) << 29)
17612         /* Value is in Gb or GB (base 10). */
17613         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_GIGA \
17614                 (UINT32_C(0x6) << 29)
17615         /* Value is in 1/100th of a percentage of total bandwidth. */
17616         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
17617                 (UINT32_C(0x1) << 29)
17618         /* Invalid unit */
17619         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_INVALID \
17620                 (UINT32_C(0x7) << 29)
17621         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_LAST \
17622                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MIN_BW_BW_VALUE_UNIT_INVALID
17623         /*
17624          * Maximum BW allocated to CoS queue.
17625          * The HWRM will translate this value into byte counter and
17626          * time interval used for this COS inside the device.
17627          */
17628         uint32_t        queue_id3_max_bw;
17629         /* The bandwidth value. */
17630         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_MASK \
17631                 UINT32_C(0xfffffff)
17632         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_SFT \
17633                 0
17634         /* The granularity of the value (bits or bytes). */
17635         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_SCALE \
17636                 UINT32_C(0x10000000)
17637         /* Value is in bits. */
17638         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_SCALE_BITS \
17639                 (UINT32_C(0x0) << 28)
17640         /* Value is in bytes. */
17641         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_SCALE_BYTES \
17642                 (UINT32_C(0x1) << 28)
17643         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_SCALE_LAST \
17644                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_SCALE_BYTES
17645         /* bw_value_unit is 3 b */
17646         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_MASK \
17647                 UINT32_C(0xe0000000)
17648         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_SFT \
17649                 29
17650         /* Value is in Mb or MB (base 10). */
17651         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_MEGA \
17652                 (UINT32_C(0x0) << 29)
17653         /* Value is in Kb or KB (base 10). */
17654         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_KILO \
17655                 (UINT32_C(0x2) << 29)
17656         /* Value is in bits or bytes. */
17657         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_BASE \
17658                 (UINT32_C(0x4) << 29)
17659         /* Value is in Gb or GB (base 10). */
17660         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_GIGA \
17661                 (UINT32_C(0x6) << 29)
17662         /* Value is in 1/100th of a percentage of total bandwidth. */
17663         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
17664                 (UINT32_C(0x1) << 29)
17665         /* Invalid unit */
17666         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_INVALID \
17667                 (UINT32_C(0x7) << 29)
17668         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_LAST \
17669                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_MAX_BW_BW_VALUE_UNIT_INVALID
17670         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
17671         uint8_t queue_id3_tsa_assign;
17672         /* Strict Priority */
17673         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_TSA_ASSIGN_SP \
17674                 UINT32_C(0x0)
17675         /* Enhanced Transmission Selection */
17676         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_TSA_ASSIGN_ETS \
17677                 UINT32_C(0x1)
17678         /* reserved. */
17679         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_TSA_ASSIGN_RESERVED_FIRST \
17680                 UINT32_C(0x2)
17681         /* reserved. */
17682         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID3_TSA_ASSIGN_RESERVED_LAST \
17683                 UINT32_C(0xff)
17684         /*
17685          * Priority level for strict priority. Valid only when the
17686          * tsa_assign is 0 - Strict Priority (SP)
17687          * 0..7 - Valid values.
17688          * 8..255 - Reserved.
17689          */
17690         uint8_t queue_id3_pri_lvl;
17691         /*
17692          * Weight used to allocate remaining BW for this COS after
17693          * servicing guaranteed bandwidths for all COS.
17694          */
17695         uint8_t queue_id3_bw_weight;
17696         /* ID of CoS Queue 4. */
17697         uint8_t queue_id4;
17698         /*
17699          * Minimum BW allocated to CoS Queue.
17700          * The HWRM will translate this value into byte counter and
17701          * time interval used for this COS inside the device.
17702          */
17703         uint32_t        queue_id4_min_bw;
17704         /* The bandwidth value. */
17705         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_MASK \
17706                 UINT32_C(0xfffffff)
17707         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_SFT \
17708                 0
17709         /* The granularity of the value (bits or bytes). */
17710         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_SCALE \
17711                 UINT32_C(0x10000000)
17712         /* Value is in bits. */
17713         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_SCALE_BITS \
17714                 (UINT32_C(0x0) << 28)
17715         /* Value is in bytes. */
17716         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_SCALE_BYTES \
17717                 (UINT32_C(0x1) << 28)
17718         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_SCALE_LAST \
17719                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_SCALE_BYTES
17720         /* bw_value_unit is 3 b */
17721         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_MASK \
17722                 UINT32_C(0xe0000000)
17723         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_SFT \
17724                 29
17725         /* Value is in Mb or MB (base 10). */
17726         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_MEGA \
17727                 (UINT32_C(0x0) << 29)
17728         /* Value is in Kb or KB (base 10). */
17729         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_KILO \
17730                 (UINT32_C(0x2) << 29)
17731         /* Value is in bits or bytes. */
17732         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_BASE \
17733                 (UINT32_C(0x4) << 29)
17734         /* Value is in Gb or GB (base 10). */
17735         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_GIGA \
17736                 (UINT32_C(0x6) << 29)
17737         /* Value is in 1/100th of a percentage of total bandwidth. */
17738         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
17739                 (UINT32_C(0x1) << 29)
17740         /* Invalid unit */
17741         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_INVALID \
17742                 (UINT32_C(0x7) << 29)
17743         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_LAST \
17744                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MIN_BW_BW_VALUE_UNIT_INVALID
17745         /*
17746          * Maximum BW allocated to CoS queue.
17747          * The HWRM will translate this value into byte counter and
17748          * time interval used for this COS inside the device.
17749          */
17750         uint32_t        queue_id4_max_bw;
17751         /* The bandwidth value. */
17752         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_MASK \
17753                 UINT32_C(0xfffffff)
17754         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_SFT \
17755                 0
17756         /* The granularity of the value (bits or bytes). */
17757         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_SCALE \
17758                 UINT32_C(0x10000000)
17759         /* Value is in bits. */
17760         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_SCALE_BITS \
17761                 (UINT32_C(0x0) << 28)
17762         /* Value is in bytes. */
17763         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_SCALE_BYTES \
17764                 (UINT32_C(0x1) << 28)
17765         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_SCALE_LAST \
17766                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_SCALE_BYTES
17767         /* bw_value_unit is 3 b */
17768         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_MASK \
17769                 UINT32_C(0xe0000000)
17770         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_SFT \
17771                 29
17772         /* Value is in Mb or MB (base 10). */
17773         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_MEGA \
17774                 (UINT32_C(0x0) << 29)
17775         /* Value is in Kb or KB (base 10). */
17776         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_KILO \
17777                 (UINT32_C(0x2) << 29)
17778         /* Value is in bits or bytes. */
17779         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_BASE \
17780                 (UINT32_C(0x4) << 29)
17781         /* Value is in Gb or GB (base 10). */
17782         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_GIGA \
17783                 (UINT32_C(0x6) << 29)
17784         /* Value is in 1/100th of a percentage of total bandwidth. */
17785         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
17786                 (UINT32_C(0x1) << 29)
17787         /* Invalid unit */
17788         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_INVALID \
17789                 (UINT32_C(0x7) << 29)
17790         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_LAST \
17791                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_MAX_BW_BW_VALUE_UNIT_INVALID
17792         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
17793         uint8_t queue_id4_tsa_assign;
17794         /* Strict Priority */
17795         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_TSA_ASSIGN_SP \
17796                 UINT32_C(0x0)
17797         /* Enhanced Transmission Selection */
17798         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_TSA_ASSIGN_ETS \
17799                 UINT32_C(0x1)
17800         /* reserved. */
17801         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_TSA_ASSIGN_RESERVED_FIRST \
17802                 UINT32_C(0x2)
17803         /* reserved. */
17804         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID4_TSA_ASSIGN_RESERVED_LAST \
17805                 UINT32_C(0xff)
17806         /*
17807          * Priority level for strict priority. Valid only when the
17808          * tsa_assign is 0 - Strict Priority (SP)
17809          * 0..7 - Valid values.
17810          * 8..255 - Reserved.
17811          */
17812         uint8_t queue_id4_pri_lvl;
17813         /*
17814          * Weight used to allocate remaining BW for this COS after
17815          * servicing guaranteed bandwidths for all COS.
17816          */
17817         uint8_t queue_id4_bw_weight;
17818         /* ID of CoS Queue 5. */
17819         uint8_t queue_id5;
17820         /*
17821          * Minimum BW allocated to CoS Queue.
17822          * The HWRM will translate this value into byte counter and
17823          * time interval used for this COS inside the device.
17824          */
17825         uint32_t        queue_id5_min_bw;
17826         /* The bandwidth value. */
17827         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_MASK \
17828                 UINT32_C(0xfffffff)
17829         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_SFT \
17830                 0
17831         /* The granularity of the value (bits or bytes). */
17832         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_SCALE \
17833                 UINT32_C(0x10000000)
17834         /* Value is in bits. */
17835         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_SCALE_BITS \
17836                 (UINT32_C(0x0) << 28)
17837         /* Value is in bytes. */
17838         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_SCALE_BYTES \
17839                 (UINT32_C(0x1) << 28)
17840         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_SCALE_LAST \
17841                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_SCALE_BYTES
17842         /* bw_value_unit is 3 b */
17843         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_MASK \
17844                 UINT32_C(0xe0000000)
17845         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_SFT \
17846                 29
17847         /* Value is in Mb or MB (base 10). */
17848         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_MEGA \
17849                 (UINT32_C(0x0) << 29)
17850         /* Value is in Kb or KB (base 10). */
17851         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_KILO \
17852                 (UINT32_C(0x2) << 29)
17853         /* Value is in bits or bytes. */
17854         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_BASE \
17855                 (UINT32_C(0x4) << 29)
17856         /* Value is in Gb or GB (base 10). */
17857         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_GIGA \
17858                 (UINT32_C(0x6) << 29)
17859         /* Value is in 1/100th of a percentage of total bandwidth. */
17860         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
17861                 (UINT32_C(0x1) << 29)
17862         /* Invalid unit */
17863         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_INVALID \
17864                 (UINT32_C(0x7) << 29)
17865         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_LAST \
17866                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MIN_BW_BW_VALUE_UNIT_INVALID
17867         /*
17868          * Maximum BW allocated to CoS queue.
17869          * The HWRM will translate this value into byte counter and
17870          * time interval used for this COS inside the device.
17871          */
17872         uint32_t        queue_id5_max_bw;
17873         /* The bandwidth value. */
17874         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_MASK \
17875                 UINT32_C(0xfffffff)
17876         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_SFT \
17877                 0
17878         /* The granularity of the value (bits or bytes). */
17879         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_SCALE \
17880                 UINT32_C(0x10000000)
17881         /* Value is in bits. */
17882         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_SCALE_BITS \
17883                 (UINT32_C(0x0) << 28)
17884         /* Value is in bytes. */
17885         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_SCALE_BYTES \
17886                 (UINT32_C(0x1) << 28)
17887         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_SCALE_LAST \
17888                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_SCALE_BYTES
17889         /* bw_value_unit is 3 b */
17890         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_MASK \
17891                 UINT32_C(0xe0000000)
17892         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_SFT \
17893                 29
17894         /* Value is in Mb or MB (base 10). */
17895         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_MEGA \
17896                 (UINT32_C(0x0) << 29)
17897         /* Value is in Kb or KB (base 10). */
17898         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_KILO \
17899                 (UINT32_C(0x2) << 29)
17900         /* Value is in bits or bytes. */
17901         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_BASE \
17902                 (UINT32_C(0x4) << 29)
17903         /* Value is in Gb or GB (base 10). */
17904         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_GIGA \
17905                 (UINT32_C(0x6) << 29)
17906         /* Value is in 1/100th of a percentage of total bandwidth. */
17907         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
17908                 (UINT32_C(0x1) << 29)
17909         /* Invalid unit */
17910         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_INVALID \
17911                 (UINT32_C(0x7) << 29)
17912         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_LAST \
17913                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_MAX_BW_BW_VALUE_UNIT_INVALID
17914         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
17915         uint8_t queue_id5_tsa_assign;
17916         /* Strict Priority */
17917         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_TSA_ASSIGN_SP \
17918                 UINT32_C(0x0)
17919         /* Enhanced Transmission Selection */
17920         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_TSA_ASSIGN_ETS \
17921                 UINT32_C(0x1)
17922         /* reserved. */
17923         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_TSA_ASSIGN_RESERVED_FIRST \
17924                 UINT32_C(0x2)
17925         /* reserved. */
17926         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID5_TSA_ASSIGN_RESERVED_LAST \
17927                 UINT32_C(0xff)
17928         /*
17929          * Priority level for strict priority. Valid only when the
17930          * tsa_assign is 0 - Strict Priority (SP)
17931          * 0..7 - Valid values.
17932          * 8..255 - Reserved.
17933          */
17934         uint8_t queue_id5_pri_lvl;
17935         /*
17936          * Weight used to allocate remaining BW for this COS after
17937          * servicing guaranteed bandwidths for all COS.
17938          */
17939         uint8_t queue_id5_bw_weight;
17940         /* ID of CoS Queue 6. */
17941         uint8_t queue_id6;
17942         /*
17943          * Minimum BW allocated to CoS Queue.
17944          * The HWRM will translate this value into byte counter and
17945          * time interval used for this COS inside the device.
17946          */
17947         uint32_t        queue_id6_min_bw;
17948         /* The bandwidth value. */
17949         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_MASK \
17950                 UINT32_C(0xfffffff)
17951         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_SFT \
17952                 0
17953         /* The granularity of the value (bits or bytes). */
17954         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_SCALE \
17955                 UINT32_C(0x10000000)
17956         /* Value is in bits. */
17957         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_SCALE_BITS \
17958                 (UINT32_C(0x0) << 28)
17959         /* Value is in bytes. */
17960         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_SCALE_BYTES \
17961                 (UINT32_C(0x1) << 28)
17962         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_SCALE_LAST \
17963                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_SCALE_BYTES
17964         /* bw_value_unit is 3 b */
17965         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_MASK \
17966                 UINT32_C(0xe0000000)
17967         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_SFT \
17968                 29
17969         /* Value is in Mb or MB (base 10). */
17970         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_MEGA \
17971                 (UINT32_C(0x0) << 29)
17972         /* Value is in Kb or KB (base 10). */
17973         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_KILO \
17974                 (UINT32_C(0x2) << 29)
17975         /* Value is in bits or bytes. */
17976         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_BASE \
17977                 (UINT32_C(0x4) << 29)
17978         /* Value is in Gb or GB (base 10). */
17979         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_GIGA \
17980                 (UINT32_C(0x6) << 29)
17981         /* Value is in 1/100th of a percentage of total bandwidth. */
17982         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
17983                 (UINT32_C(0x1) << 29)
17984         /* Invalid unit */
17985         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_INVALID \
17986                 (UINT32_C(0x7) << 29)
17987         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_LAST \
17988                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MIN_BW_BW_VALUE_UNIT_INVALID
17989         /*
17990          * Maximum BW allocated to CoS queue.
17991          * The HWRM will translate this value into byte counter and
17992          * time interval used for this COS inside the device.
17993          */
17994         uint32_t        queue_id6_max_bw;
17995         /* The bandwidth value. */
17996         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_MASK \
17997                 UINT32_C(0xfffffff)
17998         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_SFT \
17999                 0
18000         /* The granularity of the value (bits or bytes). */
18001         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_SCALE \
18002                 UINT32_C(0x10000000)
18003         /* Value is in bits. */
18004         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_SCALE_BITS \
18005                 (UINT32_C(0x0) << 28)
18006         /* Value is in bytes. */
18007         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_SCALE_BYTES \
18008                 (UINT32_C(0x1) << 28)
18009         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_SCALE_LAST \
18010                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_SCALE_BYTES
18011         /* bw_value_unit is 3 b */
18012         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_MASK \
18013                 UINT32_C(0xe0000000)
18014         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_SFT \
18015                 29
18016         /* Value is in Mb or MB (base 10). */
18017         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_MEGA \
18018                 (UINT32_C(0x0) << 29)
18019         /* Value is in Kb or KB (base 10). */
18020         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_KILO \
18021                 (UINT32_C(0x2) << 29)
18022         /* Value is in bits or bytes. */
18023         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_BASE \
18024                 (UINT32_C(0x4) << 29)
18025         /* Value is in Gb or GB (base 10). */
18026         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_GIGA \
18027                 (UINT32_C(0x6) << 29)
18028         /* Value is in 1/100th of a percentage of total bandwidth. */
18029         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
18030                 (UINT32_C(0x1) << 29)
18031         /* Invalid unit */
18032         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_INVALID \
18033                 (UINT32_C(0x7) << 29)
18034         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_LAST \
18035                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_MAX_BW_BW_VALUE_UNIT_INVALID
18036         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
18037         uint8_t queue_id6_tsa_assign;
18038         /* Strict Priority */
18039         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_TSA_ASSIGN_SP \
18040                 UINT32_C(0x0)
18041         /* Enhanced Transmission Selection */
18042         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_TSA_ASSIGN_ETS \
18043                 UINT32_C(0x1)
18044         /* reserved. */
18045         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_TSA_ASSIGN_RESERVED_FIRST \
18046                 UINT32_C(0x2)
18047         /* reserved. */
18048         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID6_TSA_ASSIGN_RESERVED_LAST \
18049                 UINT32_C(0xff)
18050         /*
18051          * Priority level for strict priority. Valid only when the
18052          * tsa_assign is 0 - Strict Priority (SP)
18053          * 0..7 - Valid values.
18054          * 8..255 - Reserved.
18055          */
18056         uint8_t queue_id6_pri_lvl;
18057         /*
18058          * Weight used to allocate remaining BW for this COS after
18059          * servicing guaranteed bandwidths for all COS.
18060          */
18061         uint8_t queue_id6_bw_weight;
18062         /* ID of CoS Queue 7. */
18063         uint8_t queue_id7;
18064         /*
18065          * Minimum BW allocated to CoS Queue.
18066          * The HWRM will translate this value into byte counter and
18067          * time interval used for this COS inside the device.
18068          */
18069         uint32_t        queue_id7_min_bw;
18070         /* The bandwidth value. */
18071         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_MASK \
18072                 UINT32_C(0xfffffff)
18073         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_SFT \
18074                 0
18075         /* The granularity of the value (bits or bytes). */
18076         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_SCALE \
18077                 UINT32_C(0x10000000)
18078         /* Value is in bits. */
18079         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_SCALE_BITS \
18080                 (UINT32_C(0x0) << 28)
18081         /* Value is in bytes. */
18082         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_SCALE_BYTES \
18083                 (UINT32_C(0x1) << 28)
18084         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_SCALE_LAST \
18085                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_SCALE_BYTES
18086         /* bw_value_unit is 3 b */
18087         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_MASK \
18088                 UINT32_C(0xe0000000)
18089         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_SFT \
18090                 29
18091         /* Value is in Mb or MB (base 10). */
18092         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_MEGA \
18093                 (UINT32_C(0x0) << 29)
18094         /* Value is in Kb or KB (base 10). */
18095         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_KILO \
18096                 (UINT32_C(0x2) << 29)
18097         /* Value is in bits or bytes. */
18098         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_BASE \
18099                 (UINT32_C(0x4) << 29)
18100         /* Value is in Gb or GB (base 10). */
18101         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_GIGA \
18102                 (UINT32_C(0x6) << 29)
18103         /* Value is in 1/100th of a percentage of total bandwidth. */
18104         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_PERCENT1_100 \
18105                 (UINT32_C(0x1) << 29)
18106         /* Invalid unit */
18107         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_INVALID \
18108                 (UINT32_C(0x7) << 29)
18109         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_LAST \
18110                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MIN_BW_BW_VALUE_UNIT_INVALID
18111         /*
18112          * Maximum BW allocated to CoS queue.
18113          * The HWRM will translate this value into byte counter and
18114          * time interval used for this COS inside the device.
18115          */
18116         uint32_t        queue_id7_max_bw;
18117         /* The bandwidth value. */
18118         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_MASK \
18119                 UINT32_C(0xfffffff)
18120         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_SFT \
18121                 0
18122         /* The granularity of the value (bits or bytes). */
18123         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_SCALE \
18124                 UINT32_C(0x10000000)
18125         /* Value is in bits. */
18126         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_SCALE_BITS \
18127                 (UINT32_C(0x0) << 28)
18128         /* Value is in bytes. */
18129         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_SCALE_BYTES \
18130                 (UINT32_C(0x1) << 28)
18131         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_SCALE_LAST \
18132                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_SCALE_BYTES
18133         /* bw_value_unit is 3 b */
18134         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_MASK \
18135                 UINT32_C(0xe0000000)
18136         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_SFT \
18137                 29
18138         /* Value is in Mb or MB (base 10). */
18139         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_MEGA \
18140                 (UINT32_C(0x0) << 29)
18141         /* Value is in Kb or KB (base 10). */
18142         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_KILO \
18143                 (UINT32_C(0x2) << 29)
18144         /* Value is in bits or bytes. */
18145         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_BASE \
18146                 (UINT32_C(0x4) << 29)
18147         /* Value is in Gb or GB (base 10). */
18148         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_GIGA \
18149                 (UINT32_C(0x6) << 29)
18150         /* Value is in 1/100th of a percentage of total bandwidth. */
18151         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
18152                 (UINT32_C(0x1) << 29)
18153         /* Invalid unit */
18154         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_INVALID \
18155                 (UINT32_C(0x7) << 29)
18156         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_LAST \
18157                 HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_MAX_BW_BW_VALUE_UNIT_INVALID
18158         /* Transmission Selection Algorithm (TSA) for CoS Queue. */
18159         uint8_t queue_id7_tsa_assign;
18160         /* Strict Priority */
18161         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_TSA_ASSIGN_SP \
18162                 UINT32_C(0x0)
18163         /* Enhanced Transmission Selection */
18164         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_TSA_ASSIGN_ETS \
18165                 UINT32_C(0x1)
18166         /* reserved. */
18167         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_TSA_ASSIGN_RESERVED_FIRST \
18168                 UINT32_C(0x2)
18169         /* reserved. */
18170         #define HWRM_QUEUE_COS2BW_CFG_INPUT_QUEUE_ID7_TSA_ASSIGN_RESERVED_LAST \
18171                 UINT32_C(0xff)
18172         /*
18173          * Priority level for strict priority. Valid only when the
18174          * tsa_assign is 0 - Strict Priority (SP)
18175          * 0..7 - Valid values.
18176          * 8..255 - Reserved.
18177          */
18178         uint8_t queue_id7_pri_lvl;
18179         /*
18180          * Weight used to allocate remaining BW for this COS after
18181          * servicing guaranteed bandwidths for all COS.
18182          */
18183         uint8_t queue_id7_bw_weight;
18184         uint8_t unused_1[5];
18185 } __attribute__((packed));
18186
18187 /* hwrm_queue_cos2bw_cfg_output (size:128b/16B) */
18188 struct hwrm_queue_cos2bw_cfg_output {
18189         /* The specific error status for the command. */
18190         uint16_t        error_code;
18191         /* The HWRM command request type. */
18192         uint16_t        req_type;
18193         /* The sequence ID from the original command. */
18194         uint16_t        seq_id;
18195         /* The length of the response data in number of bytes. */
18196         uint16_t        resp_len;
18197         uint8_t unused_0[7];
18198         /*
18199          * This field is used in Output records to indicate that the output
18200          * is completely written to RAM.  This field should be read as '1'
18201          * to indicate that the output has been completely written.
18202          * When writing a command completion or response to an internal processor,
18203          * the order of writes has to be such that this field is written last.
18204          */
18205         uint8_t valid;
18206 } __attribute__((packed));
18207
18208 /*******************
18209  * hwrm_vnic_alloc *
18210  *******************/
18211
18212
18213 /* hwrm_vnic_alloc_input (size:192b/24B) */
18214 struct hwrm_vnic_alloc_input {
18215         /* The HWRM command request type. */
18216         uint16_t        req_type;
18217         /*
18218          * The completion ring to send the completion event on. This should
18219          * be the NQ ID returned from the `nq_alloc` HWRM command.
18220          */
18221         uint16_t        cmpl_ring;
18222         /*
18223          * The sequence ID is used by the driver for tracking multiple
18224          * commands. This ID is treated as opaque data by the firmware and
18225          * the value is returned in the `hwrm_resp_hdr` upon completion.
18226          */
18227         uint16_t        seq_id;
18228         /*
18229          * The target ID of the command:
18230          * * 0x0-0xFFF8 - The function ID
18231          * * 0xFFF8-0xFFFE - Reserved for internal processors
18232          * * 0xFFFF - HWRM
18233          */
18234         uint16_t        target_id;
18235         /*
18236          * A physical address pointer pointing to a host buffer that the
18237          * command's response data will be written. This can be either a host
18238          * physical address (HPA) or a guest physical address (GPA) and must
18239          * point to a physically contiguous block of memory.
18240          */
18241         uint64_t        resp_addr;
18242         uint32_t        flags;
18243         /*
18244          * When this bit is '1', this VNIC is requested to
18245          * be the default VNIC for this function.
18246          */
18247         #define HWRM_VNIC_ALLOC_INPUT_FLAGS_DEFAULT     UINT32_C(0x1)
18248         uint8_t unused_0[4];
18249 } __attribute__((packed));
18250
18251 /* hwrm_vnic_alloc_output (size:128b/16B) */
18252 struct hwrm_vnic_alloc_output {
18253         /* The specific error status for the command. */
18254         uint16_t        error_code;
18255         /* The HWRM command request type. */
18256         uint16_t        req_type;
18257         /* The sequence ID from the original command. */
18258         uint16_t        seq_id;
18259         /* The length of the response data in number of bytes. */
18260         uint16_t        resp_len;
18261         /* Logical vnic ID */
18262         uint32_t        vnic_id;
18263         uint8_t unused_0[3];
18264         /*
18265          * This field is used in Output records to indicate that the output
18266          * is completely written to RAM.  This field should be read as '1'
18267          * to indicate that the output has been completely written.
18268          * When writing a command completion or response to an internal processor,
18269          * the order of writes has to be such that this field is written last.
18270          */
18271         uint8_t valid;
18272 } __attribute__((packed));
18273
18274 /******************
18275  * hwrm_vnic_free *
18276  ******************/
18277
18278
18279 /* hwrm_vnic_free_input (size:192b/24B) */
18280 struct hwrm_vnic_free_input {
18281         /* The HWRM command request type. */
18282         uint16_t        req_type;
18283         /*
18284          * The completion ring to send the completion event on. This should
18285          * be the NQ ID returned from the `nq_alloc` HWRM command.
18286          */
18287         uint16_t        cmpl_ring;
18288         /*
18289          * The sequence ID is used by the driver for tracking multiple
18290          * commands. This ID is treated as opaque data by the firmware and
18291          * the value is returned in the `hwrm_resp_hdr` upon completion.
18292          */
18293         uint16_t        seq_id;
18294         /*
18295          * The target ID of the command:
18296          * * 0x0-0xFFF8 - The function ID
18297          * * 0xFFF8-0xFFFE - Reserved for internal processors
18298          * * 0xFFFF - HWRM
18299          */
18300         uint16_t        target_id;
18301         /*
18302          * A physical address pointer pointing to a host buffer that the
18303          * command's response data will be written. This can be either a host
18304          * physical address (HPA) or a guest physical address (GPA) and must
18305          * point to a physically contiguous block of memory.
18306          */
18307         uint64_t        resp_addr;
18308         /* Logical vnic ID */
18309         uint32_t        vnic_id;
18310         uint8_t unused_0[4];
18311 } __attribute__((packed));
18312
18313 /* hwrm_vnic_free_output (size:128b/16B) */
18314 struct hwrm_vnic_free_output {
18315         /* The specific error status for the command. */
18316         uint16_t        error_code;
18317         /* The HWRM command request type. */
18318         uint16_t        req_type;
18319         /* The sequence ID from the original command. */
18320         uint16_t        seq_id;
18321         /* The length of the response data in number of bytes. */
18322         uint16_t        resp_len;
18323         uint8_t unused_0[7];
18324         /*
18325          * This field is used in Output records to indicate that the output
18326          * is completely written to RAM.  This field should be read as '1'
18327          * to indicate that the output has been completely written.
18328          * When writing a command completion or response to an internal processor,
18329          * the order of writes has to be such that this field is written last.
18330          */
18331         uint8_t valid;
18332 } __attribute__((packed));
18333
18334 /*****************
18335  * hwrm_vnic_cfg *
18336  *****************/
18337
18338
18339 /* hwrm_vnic_cfg_input (size:320b/40B) */
18340 struct hwrm_vnic_cfg_input {
18341         /* The HWRM command request type. */
18342         uint16_t        req_type;
18343         /*
18344          * The completion ring to send the completion event on. This should
18345          * be the NQ ID returned from the `nq_alloc` HWRM command.
18346          */
18347         uint16_t        cmpl_ring;
18348         /*
18349          * The sequence ID is used by the driver for tracking multiple
18350          * commands. This ID is treated as opaque data by the firmware and
18351          * the value is returned in the `hwrm_resp_hdr` upon completion.
18352          */
18353         uint16_t        seq_id;
18354         /*
18355          * The target ID of the command:
18356          * * 0x0-0xFFF8 - The function ID
18357          * * 0xFFF8-0xFFFE - Reserved for internal processors
18358          * * 0xFFFF - HWRM
18359          */
18360         uint16_t        target_id;
18361         /*
18362          * A physical address pointer pointing to a host buffer that the
18363          * command's response data will be written. This can be either a host
18364          * physical address (HPA) or a guest physical address (GPA) and must
18365          * point to a physically contiguous block of memory.
18366          */
18367         uint64_t        resp_addr;
18368         uint32_t        flags;
18369         /*
18370          * When this bit is '1', the VNIC is requested to
18371          * be the default VNIC for the function.
18372          */
18373         #define HWRM_VNIC_CFG_INPUT_FLAGS_DEFAULT \
18374                 UINT32_C(0x1)
18375         /*
18376          * When this bit is '1', the VNIC is being configured to
18377          * strip VLAN in the RX path.
18378          * If set to '0', then VLAN stripping is disabled on
18379          * this VNIC.
18380          */
18381         #define HWRM_VNIC_CFG_INPUT_FLAGS_VLAN_STRIP_MODE \
18382                 UINT32_C(0x2)
18383         /*
18384          * When this bit is '1', the VNIC is being configured to
18385          * buffer receive packets in the hardware until the host
18386          * posts new receive buffers.
18387          * If set to '0', then bd_stall is being configured to be
18388          * disabled on this VNIC.
18389          */
18390         #define HWRM_VNIC_CFG_INPUT_FLAGS_BD_STALL_MODE \
18391                 UINT32_C(0x4)
18392         /*
18393          * When this bit is '1', the VNIC is being configured to
18394          * receive both RoCE and non-RoCE traffic.
18395          * If set to '0', then this VNIC is not configured to be
18396          * operating in dual VNIC mode.
18397          */
18398         #define HWRM_VNIC_CFG_INPUT_FLAGS_ROCE_DUAL_VNIC_MODE \
18399                 UINT32_C(0x8)
18400         /*
18401          * When this flag is set to '1', the VNIC is requested to
18402          * be configured to receive only RoCE traffic.
18403          * If this flag is set to '0', then this flag shall be
18404          * ignored by the HWRM.
18405          * If roce_dual_vnic_mode flag is set to '1'
18406          * or roce_mirroring_capable_vnic_mode flag to 1,
18407          * then the HWRM client shall not set this flag to '1'.
18408          */
18409         #define HWRM_VNIC_CFG_INPUT_FLAGS_ROCE_ONLY_VNIC_MODE \
18410                 UINT32_C(0x10)
18411         /*
18412          * When a VNIC uses one destination ring group for certain
18413          * application (e.g. Receive Flow Steering) where
18414          * exact match is used to direct packets to a VNIC with one
18415          * destination ring group only, there is no need to configure
18416          * RSS indirection table for that VNIC as only one destination
18417          * ring group is used.
18418          *
18419          * This flag is used to enable a mode where
18420          * RSS is enabled in the VNIC using a RSS context
18421          * for computing RSS hash but the RSS indirection table is
18422          * not configured using hwrm_vnic_rss_cfg.
18423          *
18424          * If this mode is enabled, then the driver should not program
18425          * RSS indirection table for the RSS context that is used for
18426          * computing RSS hash only.
18427          */
18428         #define HWRM_VNIC_CFG_INPUT_FLAGS_RSS_DFLT_CR_MODE \
18429                 UINT32_C(0x20)
18430         /*
18431          * When this bit is '1', the VNIC is being configured to
18432          * receive both RoCE and non-RoCE traffic, but forward only the
18433          * RoCE traffic further. Also, RoCE traffic can be mirrored to
18434          * L2 driver.
18435          */
18436         #define HWRM_VNIC_CFG_INPUT_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_MODE \
18437                 UINT32_C(0x40)
18438         uint32_t        enables;
18439         /*
18440          * This bit must be '1' for the dflt_ring_grp field to be
18441          * configured.
18442          */
18443         #define HWRM_VNIC_CFG_INPUT_ENABLES_DFLT_RING_GRP \
18444                 UINT32_C(0x1)
18445         /*
18446          * This bit must be '1' for the rss_rule field to be
18447          * configured.
18448          */
18449         #define HWRM_VNIC_CFG_INPUT_ENABLES_RSS_RULE \
18450                 UINT32_C(0x2)
18451         /*
18452          * This bit must be '1' for the cos_rule field to be
18453          * configured.
18454          */
18455         #define HWRM_VNIC_CFG_INPUT_ENABLES_COS_RULE \
18456                 UINT32_C(0x4)
18457         /*
18458          * This bit must be '1' for the lb_rule field to be
18459          * configured.
18460          */
18461         #define HWRM_VNIC_CFG_INPUT_ENABLES_LB_RULE \
18462                 UINT32_C(0x8)
18463         /*
18464          * This bit must be '1' for the mru field to be
18465          * configured.
18466          */
18467         #define HWRM_VNIC_CFG_INPUT_ENABLES_MRU \
18468                 UINT32_C(0x10)
18469         /*
18470          * This bit must be '1' for the default_rx_ring_id field to be
18471          * configured.
18472          */
18473         #define HWRM_VNIC_CFG_INPUT_ENABLES_DEFAULT_RX_RING_ID \
18474                 UINT32_C(0x20)
18475         /*
18476          * This bit must be '1' for the default_cmpl_ring_id field to be
18477          * configured.
18478          */
18479         #define HWRM_VNIC_CFG_INPUT_ENABLES_DEFAULT_CMPL_RING_ID \
18480                 UINT32_C(0x40)
18481         /* Logical vnic ID */
18482         uint16_t        vnic_id;
18483         /*
18484          * Default Completion ring for the VNIC.  This ring will
18485          * be chosen if packet does not match any RSS rules and if
18486          * there is no COS rule.
18487          */
18488         uint16_t        dflt_ring_grp;
18489         /*
18490          * RSS ID for RSS rule/table structure.  0xFF... (All Fs) if
18491          * there is no RSS rule.
18492          */
18493         uint16_t        rss_rule;
18494         /*
18495          * RSS ID for COS rule/table structure.  0xFF... (All Fs) if
18496          * there is no COS rule.
18497          */
18498         uint16_t        cos_rule;
18499         /*
18500          * RSS ID for load balancing rule/table structure.
18501          * 0xFF... (All Fs) if there is no LB rule.
18502          */
18503         uint16_t        lb_rule;
18504         /*
18505          * The maximum receive unit of the vnic.
18506          * Each vnic is associated with a function.
18507          * The vnic mru value overwrites the mru setting of the
18508          * associated function.
18509          * The HWRM shall make sure that vnic mru does not exceed
18510          * the mru of the port the function is associated with.
18511          */
18512         uint16_t        mru;
18513         /*
18514          * Default Rx ring for the VNIC.  This ring will
18515          * be chosen if packet does not match any RSS rules.
18516          * The aggregation ring associated with the Rx ring is
18517          * implied based on the Rx ring specified when the
18518          * aggregation ring was allocated.
18519          */
18520         uint16_t        default_rx_ring_id;
18521         /*
18522          * Default completion ring for the VNIC.  This ring will
18523          * be chosen if packet does not match any RSS rules.
18524          */
18525         uint16_t        default_cmpl_ring_id;
18526 } __attribute__((packed));
18527
18528 /* hwrm_vnic_cfg_output (size:128b/16B) */
18529 struct hwrm_vnic_cfg_output {
18530         /* The specific error status for the command. */
18531         uint16_t        error_code;
18532         /* The HWRM command request type. */
18533         uint16_t        req_type;
18534         /* The sequence ID from the original command. */
18535         uint16_t        seq_id;
18536         /* The length of the response data in number of bytes. */
18537         uint16_t        resp_len;
18538         uint8_t unused_0[7];
18539         /*
18540          * This field is used in Output records to indicate that the output
18541          * is completely written to RAM.  This field should be read as '1'
18542          * to indicate that the output has been completely written.
18543          * When writing a command completion or response to an internal processor,
18544          * the order of writes has to be such that this field is written last.
18545          */
18546         uint8_t valid;
18547 } __attribute__((packed));
18548
18549 /******************
18550  * hwrm_vnic_qcfg *
18551  ******************/
18552
18553
18554 /* hwrm_vnic_qcfg_input (size:256b/32B) */
18555 struct hwrm_vnic_qcfg_input {
18556         /* The HWRM command request type. */
18557         uint16_t        req_type;
18558         /*
18559          * The completion ring to send the completion event on. This should
18560          * be the NQ ID returned from the `nq_alloc` HWRM command.
18561          */
18562         uint16_t        cmpl_ring;
18563         /*
18564          * The sequence ID is used by the driver for tracking multiple
18565          * commands. This ID is treated as opaque data by the firmware and
18566          * the value is returned in the `hwrm_resp_hdr` upon completion.
18567          */
18568         uint16_t        seq_id;
18569         /*
18570          * The target ID of the command:
18571          * * 0x0-0xFFF8 - The function ID
18572          * * 0xFFF8-0xFFFE - Reserved for internal processors
18573          * * 0xFFFF - HWRM
18574          */
18575         uint16_t        target_id;
18576         /*
18577          * A physical address pointer pointing to a host buffer that the
18578          * command's response data will be written. This can be either a host
18579          * physical address (HPA) or a guest physical address (GPA) and must
18580          * point to a physically contiguous block of memory.
18581          */
18582         uint64_t        resp_addr;
18583         uint32_t        enables;
18584         /*
18585          * This bit must be '1' for the vf_id_valid field to be
18586          * configured.
18587          */
18588         #define HWRM_VNIC_QCFG_INPUT_ENABLES_VF_ID_VALID     UINT32_C(0x1)
18589         /* Logical vnic ID */
18590         uint32_t        vnic_id;
18591         /* ID of Virtual Function whose VNIC resource is being queried. */
18592         uint16_t        vf_id;
18593         uint8_t unused_0[6];
18594 } __attribute__((packed));
18595
18596 /* hwrm_vnic_qcfg_output (size:256b/32B) */
18597 struct hwrm_vnic_qcfg_output {
18598         /* The specific error status for the command. */
18599         uint16_t        error_code;
18600         /* The HWRM command request type. */
18601         uint16_t        req_type;
18602         /* The sequence ID from the original command. */
18603         uint16_t        seq_id;
18604         /* The length of the response data in number of bytes. */
18605         uint16_t        resp_len;
18606         /* Default Completion ring for the VNIC. */
18607         uint16_t        dflt_ring_grp;
18608         /*
18609          * RSS ID for RSS rule/table structure.  0xFF... (All Fs) if
18610          * there is no RSS rule.
18611          */
18612         uint16_t        rss_rule;
18613         /*
18614          * RSS ID for COS rule/table structure.  0xFF... (All Fs) if
18615          * there is no COS rule.
18616          */
18617         uint16_t        cos_rule;
18618         /*
18619          * RSS ID for load balancing rule/table structure.
18620          * 0xFF... (All Fs) if there is no LB rule.
18621          */
18622         uint16_t        lb_rule;
18623         /* The maximum receive unit of the vnic. */
18624         uint16_t        mru;
18625         uint8_t unused_0[2];
18626         uint32_t        flags;
18627         /*
18628          * When this bit is '1', the VNIC is the default VNIC for
18629          * the function.
18630          */
18631         #define HWRM_VNIC_QCFG_OUTPUT_FLAGS_DEFAULT \
18632                 UINT32_C(0x1)
18633         /*
18634          * When this bit is '1', the VNIC is configured to
18635          * strip VLAN in the RX path.
18636          * If set to '0', then VLAN stripping is disabled on
18637          * this VNIC.
18638          */
18639         #define HWRM_VNIC_QCFG_OUTPUT_FLAGS_VLAN_STRIP_MODE \
18640                 UINT32_C(0x2)
18641         /*
18642          * When this bit is '1', the VNIC is configured to
18643          * buffer receive packets in the hardware until the host
18644          * posts new receive buffers.
18645          * If set to '0', then bd_stall is disabled on
18646          * this VNIC.
18647          */
18648         #define HWRM_VNIC_QCFG_OUTPUT_FLAGS_BD_STALL_MODE \
18649                 UINT32_C(0x4)
18650         /*
18651          * When this bit is '1', the VNIC is configured to
18652          * receive both RoCE and non-RoCE traffic.
18653          * If set to '0', then this VNIC is not configured to
18654          * operate in dual VNIC mode.
18655          */
18656         #define HWRM_VNIC_QCFG_OUTPUT_FLAGS_ROCE_DUAL_VNIC_MODE \
18657                 UINT32_C(0x8)
18658         /*
18659          * When this flag is set to '1', the VNIC is configured to
18660          * receive only RoCE traffic.
18661          * When this flag is set to '0', the VNIC is not configured
18662          * to receive only RoCE traffic.
18663          * If roce_dual_vnic_mode flag and this flag both are set
18664          * to '1', then it is an invalid configuration of the
18665          * VNIC. The HWRM should not allow that type of
18666          * mis-configuration by HWRM clients.
18667          */
18668         #define HWRM_VNIC_QCFG_OUTPUT_FLAGS_ROCE_ONLY_VNIC_MODE \
18669                 UINT32_C(0x10)
18670         /*
18671          * When a VNIC uses one destination ring group for certain
18672          * application (e.g. Receive Flow Steering) where
18673          * exact match is used to direct packets to a VNIC with one
18674          * destination ring group only, there is no need to configure
18675          * RSS indirection table for that VNIC as only one destination
18676          * ring group is used.
18677          *
18678          * When this bit is set to '1', then the VNIC is enabled in a
18679          * mode where RSS is enabled in the VNIC using a RSS context
18680          * for computing RSS hash but the RSS indirection table is
18681          * not configured.
18682          */
18683         #define HWRM_VNIC_QCFG_OUTPUT_FLAGS_RSS_DFLT_CR_MODE \
18684                 UINT32_C(0x20)
18685         /*
18686          * When this bit is '1', the VNIC is configured to
18687          * receive both RoCE and non-RoCE traffic, but forward only
18688          * RoCE traffic further. Also RoCE traffic can be mirrored to
18689          * L2 driver.
18690          */
18691         #define HWRM_VNIC_QCFG_OUTPUT_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_MODE \
18692                 UINT32_C(0x40)
18693         uint8_t unused_1[7];
18694         /*
18695          * This field is used in Output records to indicate that the output
18696          * is completely written to RAM.  This field should be read as '1'
18697          * to indicate that the output has been completely written.
18698          * When writing a command completion or response to an internal processor,
18699          * the order of writes has to be such that this field is written last.
18700          */
18701         uint8_t valid;
18702 } __attribute__((packed));
18703
18704 /*******************
18705  * hwrm_vnic_qcaps *
18706  *******************/
18707
18708
18709 /* hwrm_vnic_qcaps_input (size:192b/24B) */
18710 struct hwrm_vnic_qcaps_input {
18711         /* The HWRM command request type. */
18712         uint16_t        req_type;
18713         /*
18714          * The completion ring to send the completion event on. This should
18715          * be the NQ ID returned from the `nq_alloc` HWRM command.
18716          */
18717         uint16_t        cmpl_ring;
18718         /*
18719          * The sequence ID is used by the driver for tracking multiple
18720          * commands. This ID is treated as opaque data by the firmware and
18721          * the value is returned in the `hwrm_resp_hdr` upon completion.
18722          */
18723         uint16_t        seq_id;
18724         /*
18725          * The target ID of the command:
18726          * * 0x0-0xFFF8 - The function ID
18727          * * 0xFFF8-0xFFFE - Reserved for internal processors
18728          * * 0xFFFF - HWRM
18729          */
18730         uint16_t        target_id;
18731         /*
18732          * A physical address pointer pointing to a host buffer that the
18733          * command's response data will be written. This can be either a host
18734          * physical address (HPA) or a guest physical address (GPA) and must
18735          * point to a physically contiguous block of memory.
18736          */
18737         uint64_t        resp_addr;
18738         uint32_t        enables;
18739         uint8_t unused_0[4];
18740 } __attribute__((packed));
18741
18742 /* hwrm_vnic_qcaps_output (size:192b/24B) */
18743 struct hwrm_vnic_qcaps_output {
18744         /* The specific error status for the command. */
18745         uint16_t        error_code;
18746         /* The HWRM command request type. */
18747         uint16_t        req_type;
18748         /* The sequence ID from the original command. */
18749         uint16_t        seq_id;
18750         /* The length of the response data in number of bytes. */
18751         uint16_t        resp_len;
18752         /* The maximum receive unit that is settable on a vnic. */
18753         uint16_t        mru;
18754         uint8_t unused_0[2];
18755         uint32_t        flags;
18756         /* Unused. */
18757         #define HWRM_VNIC_QCAPS_OUTPUT_FLAGS_UNUSED \
18758                 UINT32_C(0x1)
18759         /*
18760          * When this bit is '1', the capability of stripping VLAN in
18761          * the RX path is supported on VNIC(s).
18762          * If set to '0', then VLAN stripping capability is
18763          * not supported on VNIC(s).
18764          */
18765         #define HWRM_VNIC_QCAPS_OUTPUT_FLAGS_VLAN_STRIP_CAP \
18766                 UINT32_C(0x2)
18767         /*
18768          * When this bit is '1', the capability to buffer receive
18769          * packets in the hardware until the host posts new receive buffers
18770          * is supported on VNIC(s).
18771          * If set to '0', then bd_stall capability is not supported
18772          * on VNIC(s).
18773          */
18774         #define HWRM_VNIC_QCAPS_OUTPUT_FLAGS_BD_STALL_CAP \
18775                 UINT32_C(0x4)
18776         /*
18777          * When this bit is '1', the capability to
18778          * receive both RoCE and non-RoCE traffic on VNIC(s) is
18779          * supported.
18780          * If set to '0', then the capability to receive
18781          * both RoCE and non-RoCE traffic on VNIC(s) is
18782          * not supported.
18783          */
18784         #define HWRM_VNIC_QCAPS_OUTPUT_FLAGS_ROCE_DUAL_VNIC_CAP \
18785                 UINT32_C(0x8)
18786         /*
18787          * When this bit is set to '1', the capability to configure
18788          * a VNIC to receive only RoCE traffic is supported.
18789          * When this flag is set to '0', the VNIC capability to
18790          * configure to receive only RoCE traffic is not supported.
18791          */
18792         #define HWRM_VNIC_QCAPS_OUTPUT_FLAGS_ROCE_ONLY_VNIC_CAP \
18793                 UINT32_C(0x10)
18794         /*
18795          * When this bit is set to '1', then the capability to enable
18796          * a VNIC in a mode where RSS context without configuring
18797          * RSS indirection table is supported (for RSS hash computation).
18798          * When this bit is set to '0', then a VNIC can not be configured
18799          * with a mode to enable RSS context without configuring RSS
18800          * indirection table.
18801          */
18802         #define HWRM_VNIC_QCAPS_OUTPUT_FLAGS_RSS_DFLT_CR_CAP \
18803                 UINT32_C(0x20)
18804         /*
18805          * When this bit is '1', the capability to
18806          * mirror the the RoCE traffic is supported.
18807          * If set to '0', then the capability to mirror the
18808          * RoCE traffic is not supported.
18809          */
18810         #define HWRM_VNIC_QCAPS_OUTPUT_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_CAP \
18811                 UINT32_C(0x40)
18812         /*
18813          * When this bit is '1', the outermost RSS hashing capability
18814          * is supported. If set to '0', then the outermost RSS hashing
18815          * capability is not supported.
18816          */
18817         #define HWRM_VNIC_QCAPS_OUTPUT_FLAGS_OUTERMOST_RSS_CAP \
18818                 UINT32_C(0x80)
18819         uint8_t unused_1[7];
18820         /*
18821          * This field is used in Output records to indicate that the output
18822          * is completely written to RAM.  This field should be read as '1'
18823          * to indicate that the output has been completely written.
18824          * When writing a command completion or response to an internal processor,
18825          * the order of writes has to be such that this field is written last.
18826          */
18827         uint8_t valid;
18828 } __attribute__((packed));
18829
18830 /*********************
18831  * hwrm_vnic_tpa_cfg *
18832  *********************/
18833
18834
18835 /* hwrm_vnic_tpa_cfg_input (size:320b/40B) */
18836 struct hwrm_vnic_tpa_cfg_input {
18837         /* The HWRM command request type. */
18838         uint16_t        req_type;
18839         /*
18840          * The completion ring to send the completion event on. This should
18841          * be the NQ ID returned from the `nq_alloc` HWRM command.
18842          */
18843         uint16_t        cmpl_ring;
18844         /*
18845          * The sequence ID is used by the driver for tracking multiple
18846          * commands. This ID is treated as opaque data by the firmware and
18847          * the value is returned in the `hwrm_resp_hdr` upon completion.
18848          */
18849         uint16_t        seq_id;
18850         /*
18851          * The target ID of the command:
18852          * * 0x0-0xFFF8 - The function ID
18853          * * 0xFFF8-0xFFFE - Reserved for internal processors
18854          * * 0xFFFF - HWRM
18855          */
18856         uint16_t        target_id;
18857         /*
18858          * A physical address pointer pointing to a host buffer that the
18859          * command's response data will be written. This can be either a host
18860          * physical address (HPA) or a guest physical address (GPA) and must
18861          * point to a physically contiguous block of memory.
18862          */
18863         uint64_t        resp_addr;
18864         uint32_t        flags;
18865         /*
18866          * When this bit is '1', the VNIC shall be configured to
18867          * perform transparent packet aggregation (TPA) of
18868          * non-tunneled TCP packets.
18869          */
18870         #define HWRM_VNIC_TPA_CFG_INPUT_FLAGS_TPA \
18871                 UINT32_C(0x1)
18872         /*
18873          * When this bit is '1', the VNIC shall be configured to
18874          * perform transparent packet aggregation (TPA) of
18875          * tunneled TCP packets.
18876          */
18877         #define HWRM_VNIC_TPA_CFG_INPUT_FLAGS_ENCAP_TPA \
18878                 UINT32_C(0x2)
18879         /*
18880          * When this bit is '1', the VNIC shall be configured to
18881          * perform transparent packet aggregation (TPA) according
18882          * to Windows Receive Segment Coalescing (RSC) rules.
18883          */
18884         #define HWRM_VNIC_TPA_CFG_INPUT_FLAGS_RSC_WND_UPDATE \
18885                 UINT32_C(0x4)
18886         /*
18887          * When this bit is '1', the VNIC shall be configured to
18888          * perform transparent packet aggregation (TPA) according
18889          * to Linux Generic Receive Offload (GRO) rules.
18890          */
18891         #define HWRM_VNIC_TPA_CFG_INPUT_FLAGS_GRO \
18892                 UINT32_C(0x8)
18893         /*
18894          * When this bit is '1', the VNIC shall be configured to
18895          * perform transparent packet aggregation (TPA) for TCP
18896          * packets with IP ECN set to non-zero.
18897          */
18898         #define HWRM_VNIC_TPA_CFG_INPUT_FLAGS_AGG_WITH_ECN \
18899                 UINT32_C(0x10)
18900         /*
18901          * When this bit is '1', the VNIC shall be configured to
18902          * perform transparent packet aggregation (TPA) for
18903          * GRE tunneled TCP packets only if all packets have the
18904          * same GRE sequence.
18905          */
18906         #define HWRM_VNIC_TPA_CFG_INPUT_FLAGS_AGG_WITH_SAME_GRE_SEQ \
18907                 UINT32_C(0x20)
18908         /*
18909          * When this bit is '1' and the GRO mode is enabled,
18910          * the VNIC shall be configured to
18911          * perform transparent packet aggregation (TPA) for
18912          * TCP/IPv4 packets with consecutively increasing IPIDs.
18913          * In other words, the last packet that is being
18914          * aggregated to an already existing aggregation context
18915          * shall have IPID 1 more than the IPID of the last packet
18916          * that was aggregated in that aggregation context.
18917          */
18918         #define HWRM_VNIC_TPA_CFG_INPUT_FLAGS_GRO_IPID_CHECK \
18919                 UINT32_C(0x40)
18920         /*
18921          * When this bit is '1' and the GRO mode is enabled,
18922          * the VNIC shall be configured to
18923          * perform transparent packet aggregation (TPA) for
18924          * TCP packets with the same TTL (IPv4) or Hop limit (IPv6)
18925          * value.
18926          */
18927         #define HWRM_VNIC_TPA_CFG_INPUT_FLAGS_GRO_TTL_CHECK \
18928                 UINT32_C(0x80)
18929         uint32_t        enables;
18930         /*
18931          * This bit must be '1' for the max_agg_segs field to be
18932          * configured.
18933          */
18934         #define HWRM_VNIC_TPA_CFG_INPUT_ENABLES_MAX_AGG_SEGS      UINT32_C(0x1)
18935         /*
18936          * This bit must be '1' for the max_aggs field to be
18937          * configured.
18938          */
18939         #define HWRM_VNIC_TPA_CFG_INPUT_ENABLES_MAX_AGGS          UINT32_C(0x2)
18940         /*
18941          * This bit must be '1' for the max_agg_timer field to be
18942          * configured.
18943          */
18944         #define HWRM_VNIC_TPA_CFG_INPUT_ENABLES_MAX_AGG_TIMER     UINT32_C(0x4)
18945         /*
18946          * This bit must be '1' for the min_agg_len field to be
18947          * configured.
18948          */
18949         #define HWRM_VNIC_TPA_CFG_INPUT_ENABLES_MIN_AGG_LEN       UINT32_C(0x8)
18950         /* Logical vnic ID */
18951         uint16_t        vnic_id;
18952         /*
18953          * This is the maximum number of TCP segments that can
18954          * be aggregated (unit is Log2). Max value is 31.
18955          */
18956         uint16_t        max_agg_segs;
18957         /* 1 segment */
18958         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGG_SEGS_1   UINT32_C(0x0)
18959         /* 2 segments */
18960         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGG_SEGS_2   UINT32_C(0x1)
18961         /* 4 segments */
18962         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGG_SEGS_4   UINT32_C(0x2)
18963         /* 8 segments */
18964         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGG_SEGS_8   UINT32_C(0x3)
18965         /* Any segment size larger than this is not valid */
18966         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGG_SEGS_MAX UINT32_C(0x1f)
18967         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGG_SEGS_LAST \
18968                 HWRM_VNIC_TPA_CFG_INPUT_MAX_AGG_SEGS_MAX
18969         /*
18970          * This is the maximum number of aggregations this VNIC is
18971          * allowed (unit is Log2). Max value is 7
18972          */
18973         uint16_t        max_aggs;
18974         /* 1 aggregation */
18975         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_1   UINT32_C(0x0)
18976         /* 2 aggregations */
18977         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_2   UINT32_C(0x1)
18978         /* 4 aggregations */
18979         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_4   UINT32_C(0x2)
18980         /* 8 aggregations */
18981         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_8   UINT32_C(0x3)
18982         /* 16 aggregations */
18983         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_16  UINT32_C(0x4)
18984         /* Any aggregation size larger than this is not valid */
18985         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_MAX UINT32_C(0x7)
18986         #define HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_LAST \
18987                 HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_MAX
18988         uint8_t unused_0[2];
18989         /*
18990          * This is the maximum amount of time allowed for
18991          * an aggregation context to complete after it was initiated.
18992          */
18993         uint32_t        max_agg_timer;
18994         /*
18995          * This is the minimum amount of payload length required to
18996          * start an aggregation context.
18997          */
18998         uint32_t        min_agg_len;
18999 } __attribute__((packed));
19000
19001 /* hwrm_vnic_tpa_cfg_output (size:128b/16B) */
19002 struct hwrm_vnic_tpa_cfg_output {
19003         /* The specific error status for the command. */
19004         uint16_t        error_code;
19005         /* The HWRM command request type. */
19006         uint16_t        req_type;
19007         /* The sequence ID from the original command. */
19008         uint16_t        seq_id;
19009         /* The length of the response data in number of bytes. */
19010         uint16_t        resp_len;
19011         uint8_t unused_0[7];
19012         /*
19013          * This field is used in Output records to indicate that the output
19014          * is completely written to RAM.  This field should be read as '1'
19015          * to indicate that the output has been completely written.
19016          * When writing a command completion or response to an internal processor,
19017          * the order of writes has to be such that this field is written last.
19018          */
19019         uint8_t valid;
19020 } __attribute__((packed));
19021
19022 /*********************
19023  * hwrm_vnic_rss_cfg *
19024  *********************/
19025
19026
19027 /* hwrm_vnic_rss_cfg_input (size:384b/48B) */
19028 struct hwrm_vnic_rss_cfg_input {
19029         /* The HWRM command request type. */
19030         uint16_t        req_type;
19031         /*
19032          * The completion ring to send the completion event on. This should
19033          * be the NQ ID returned from the `nq_alloc` HWRM command.
19034          */
19035         uint16_t        cmpl_ring;
19036         /*
19037          * The sequence ID is used by the driver for tracking multiple
19038          * commands. This ID is treated as opaque data by the firmware and
19039          * the value is returned in the `hwrm_resp_hdr` upon completion.
19040          */
19041         uint16_t        seq_id;
19042         /*
19043          * The target ID of the command:
19044          * * 0x0-0xFFF8 - The function ID
19045          * * 0xFFF8-0xFFFE - Reserved for internal processors
19046          * * 0xFFFF - HWRM
19047          */
19048         uint16_t        target_id;
19049         /*
19050          * A physical address pointer pointing to a host buffer that the
19051          * command's response data will be written. This can be either a host
19052          * physical address (HPA) or a guest physical address (GPA) and must
19053          * point to a physically contiguous block of memory.
19054          */
19055         uint64_t        resp_addr;
19056         uint32_t        hash_type;
19057         /*
19058          * When this bit is '1', the RSS hash shall be computed
19059          * over source and destination IPv4 addresses of IPv4
19060          * packets.
19061          */
19062         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4         UINT32_C(0x1)
19063         /*
19064          * When this bit is '1', the RSS hash shall be computed
19065          * over source/destination IPv4 addresses and
19066          * source/destination ports of TCP/IPv4 packets.
19067          */
19068         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV4     UINT32_C(0x2)
19069         /*
19070          * When this bit is '1', the RSS hash shall be computed
19071          * over source/destination IPv4 addresses and
19072          * source/destination ports of UDP/IPv4 packets.
19073          */
19074         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV4     UINT32_C(0x4)
19075         /*
19076          * When this bit is '1', the RSS hash shall be computed
19077          * over source and destination IPv4 addresses of IPv6
19078          * packets.
19079          */
19080         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV6         UINT32_C(0x8)
19081         /*
19082          * When this bit is '1', the RSS hash shall be computed
19083          * over source/destination IPv6 addresses and
19084          * source/destination ports of TCP/IPv6 packets.
19085          */
19086         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV6     UINT32_C(0x10)
19087         /*
19088          * When this bit is '1', the RSS hash shall be computed
19089          * over source/destination IPv6 addresses and
19090          * source/destination ports of UDP/IPv6 packets.
19091          */
19092         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV6     UINT32_C(0x20)
19093         /* VNIC ID of VNIC associated with RSS table being configured. */
19094         uint16_t        vnic_id;
19095         /*
19096          * Specifies which VNIC ring table pair to configure.
19097          * Valid values range from 0 to 7.
19098          */
19099         uint8_t ring_table_pair_index;
19100         /* Flags to specify different RSS hash modes. */
19101         uint8_t hash_mode_flags;
19102         /*
19103          * When this bit is '1', it indicates using current RSS
19104          * hash mode setting configured in the device.
19105          */
19106         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_MODE_FLAGS_DEFAULT \
19107                 UINT32_C(0x1)
19108         /*
19109          * When this bit is '1', it indicates requesting support of
19110          * RSS hashing over innermost 4 tuples {l3.src, l3.dest,
19111          * l4.src, l4.dest} for tunnel packets. For none-tunnel
19112          * packets, the RSS hash is computed over the normal
19113          * src/dest l3 and src/dest l4 headers.
19114          */
19115         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_MODE_FLAGS_INNERMOST_4 \
19116                 UINT32_C(0x2)
19117         /*
19118          * When this bit is '1', it indicates requesting support of
19119          * RSS hashing over innermost 2 tuples {l3.src, l3.dest} for
19120          * tunnel packets. For none-tunnel packets, the RSS hash is
19121          * computed over the normal src/dest l3 headers.
19122          */
19123         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_MODE_FLAGS_INNERMOST_2 \
19124                 UINT32_C(0x4)
19125         /*
19126          * When this bit is '1', it indicates requesting support of
19127          * RSS hashing over outermost 4 tuples {t_l3.src, t_l3.dest,
19128          * t_l4.src, t_l4.dest} for tunnel packets. For none-tunnel
19129          * packets, the RSS hash is computed over the normal
19130          * src/dest l3 and src/dest l4 headers.
19131          */
19132         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_MODE_FLAGS_OUTERMOST_4 \
19133                 UINT32_C(0x8)
19134         /*
19135          * When this bit is '1', it indicates requesting support of
19136          * RSS hashing over outermost 2 tuples {t_l3.src, t_l3.dest} for
19137          * tunnel packets. For none-tunnel packets, the RSS hash is
19138          * computed over the normal src/dest l3 headers.
19139          */
19140         #define HWRM_VNIC_RSS_CFG_INPUT_HASH_MODE_FLAGS_OUTERMOST_2 \
19141                 UINT32_C(0x10)
19142         /* This is the address for rss ring group table */
19143         uint64_t        ring_grp_tbl_addr;
19144         /* This is the address for rss hash key table */
19145         uint64_t        hash_key_tbl_addr;
19146         /* Index to the rss indirection table. */
19147         uint16_t        rss_ctx_idx;
19148         uint8_t unused_1[6];
19149 } __attribute__((packed));
19150
19151 /* hwrm_vnic_rss_cfg_output (size:128b/16B) */
19152 struct hwrm_vnic_rss_cfg_output {
19153         /* The specific error status for the command. */
19154         uint16_t        error_code;
19155         /* The HWRM command request type. */
19156         uint16_t        req_type;
19157         /* The sequence ID from the original command. */
19158         uint16_t        seq_id;
19159         /* The length of the response data in number of bytes. */
19160         uint16_t        resp_len;
19161         uint8_t unused_0[7];
19162         /*
19163          * This field is used in Output records to indicate that the output
19164          * is completely written to RAM.  This field should be read as '1'
19165          * to indicate that the output has been completely written.
19166          * When writing a command completion or response to an internal processor,
19167          * the order of writes has to be such that this field is written last.
19168          */
19169         uint8_t valid;
19170 } __attribute__((packed));
19171
19172 /**********************
19173  * hwrm_vnic_rss_qcfg *
19174  **********************/
19175
19176
19177 /* hwrm_vnic_rss_qcfg_input (size:192b/24B) */
19178 struct hwrm_vnic_rss_qcfg_input {
19179         /* The HWRM command request type. */
19180         uint16_t        req_type;
19181         /*
19182          * The completion ring to send the completion event on. This should
19183          * be the NQ ID returned from the `nq_alloc` HWRM command.
19184          */
19185         uint16_t        cmpl_ring;
19186         /*
19187          * The sequence ID is used by the driver for tracking multiple
19188          * commands. This ID is treated as opaque data by the firmware and
19189          * the value is returned in the `hwrm_resp_hdr` upon completion.
19190          */
19191         uint16_t        seq_id;
19192         /*
19193          * The target ID of the command:
19194          * * 0x0-0xFFF8 - The function ID
19195          * * 0xFFF8-0xFFFE - Reserved for internal processors
19196          * * 0xFFFF - HWRM
19197          */
19198         uint16_t        target_id;
19199         /*
19200          * A physical address pointer pointing to a host buffer that the
19201          * command's response data will be written. This can be either a host
19202          * physical address (HPA) or a guest physical address (GPA) and must
19203          * point to a physically contiguous block of memory.
19204          */
19205         uint64_t        resp_addr;
19206         /* Index to the rss indirection table. */
19207         uint16_t        rss_ctx_idx;
19208         uint8_t unused_0[6];
19209 } __attribute__((packed));
19210
19211 /* hwrm_vnic_rss_qcfg_output (size:512b/64B) */
19212 struct hwrm_vnic_rss_qcfg_output {
19213         /* The specific error status for the command. */
19214         uint16_t        error_code;
19215         /* The HWRM command request type. */
19216         uint16_t        req_type;
19217         /* The sequence ID from the original command. */
19218         uint16_t        seq_id;
19219         /* The length of the response data in number of bytes. */
19220         uint16_t        resp_len;
19221         uint32_t        hash_type;
19222         /*
19223          * When this bit is '1', the RSS hash shall be computed
19224          * over source and destination IPv4 addresses of IPv4
19225          * packets.
19226          */
19227         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_TYPE_IPV4         UINT32_C(0x1)
19228         /*
19229          * When this bit is '1', the RSS hash shall be computed
19230          * over source/destination IPv4 addresses and
19231          * source/destination ports of TCP/IPv4 packets.
19232          */
19233         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_TYPE_TCP_IPV4     UINT32_C(0x2)
19234         /*
19235          * When this bit is '1', the RSS hash shall be computed
19236          * over source/destination IPv4 addresses and
19237          * source/destination ports of UDP/IPv4 packets.
19238          */
19239         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_TYPE_UDP_IPV4     UINT32_C(0x4)
19240         /*
19241          * When this bit is '1', the RSS hash shall be computed
19242          * over source and destination IPv4 addresses of IPv6
19243          * packets.
19244          */
19245         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_TYPE_IPV6         UINT32_C(0x8)
19246         /*
19247          * When this bit is '1', the RSS hash shall be computed
19248          * over source/destination IPv6 addresses and
19249          * source/destination ports of TCP/IPv6 packets.
19250          */
19251         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_TYPE_TCP_IPV6     UINT32_C(0x10)
19252         /*
19253          * When this bit is '1', the RSS hash shall be computed
19254          * over source/destination IPv6 addresses and
19255          * source/destination ports of UDP/IPv6 packets.
19256          */
19257         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_TYPE_UDP_IPV6     UINT32_C(0x20)
19258         uint8_t unused_0[4];
19259         /* This is the value of rss hash key */
19260         uint32_t        hash_key[10];
19261         /* Flags to specify different RSS hash modes. */
19262         uint8_t hash_mode_flags;
19263         /*
19264          * When this bit is '1', it indicates using current RSS
19265          * hash mode setting configured in the device.
19266          */
19267         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_MODE_FLAGS_DEFAULT \
19268                 UINT32_C(0x1)
19269         /*
19270          * When this bit is '1', it indicates requesting support of
19271          * RSS hashing over innermost 4 tuples {l3.src, l3.dest,
19272          * l4.src, l4.dest} for tunnel packets. For none-tunnel
19273          * packets, the RSS hash is computed over the normal
19274          * src/dest l3 and src/dest l4 headers.
19275          */
19276         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_MODE_FLAGS_INNERMOST_4 \
19277                 UINT32_C(0x2)
19278         /*
19279          * When this bit is '1', it indicates requesting support of
19280          * RSS hashing over innermost 2 tuples {l3.src, l3.dest} for
19281          * tunnel packets. For none-tunnel packets, the RSS hash is
19282          * computed over the normal src/dest l3 headers.
19283          */
19284         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_MODE_FLAGS_INNERMOST_2 \
19285                 UINT32_C(0x4)
19286         /*
19287          * When this bit is '1', it indicates requesting support of
19288          * RSS hashing over outermost 4 tuples {t_l3.src, t_l3.dest,
19289          * t_l4.src, t_l4.dest} for tunnel packets. For none-tunnel
19290          * packets, the RSS hash is computed over the normal
19291          * src/dest l3 and src/dest l4 headers.
19292          */
19293         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_MODE_FLAGS_OUTERMOST_4 \
19294                 UINT32_C(0x8)
19295         /*
19296          * When this bit is '1', it indicates requesting support of
19297          * RSS hashing over outermost 2 tuples {t_l3.src, t_l3.dest} for
19298          * tunnel packets. For none-tunnel packets, the RSS hash is
19299          * computed over the normal src/dest l3 headers.
19300          */
19301         #define HWRM_VNIC_RSS_QCFG_OUTPUT_HASH_MODE_FLAGS_OUTERMOST_2 \
19302                 UINT32_C(0x10)
19303         uint8_t unused_1[6];
19304         /*
19305          * This field is used in Output records to indicate that the output
19306          * is completely written to RAM.  This field should be read as '1'
19307          * to indicate that the output has been completely written.
19308          * When writing a command completion or response to an internal processor,
19309          * the order of writes has to be such that this field is written last.
19310          */
19311         uint8_t valid;
19312 } __attribute__((packed));
19313
19314 /**************************
19315  * hwrm_vnic_plcmodes_cfg *
19316  **************************/
19317
19318
19319 /* hwrm_vnic_plcmodes_cfg_input (size:320b/40B) */
19320 struct hwrm_vnic_plcmodes_cfg_input {
19321         /* The HWRM command request type. */
19322         uint16_t        req_type;
19323         /*
19324          * The completion ring to send the completion event on. This should
19325          * be the NQ ID returned from the `nq_alloc` HWRM command.
19326          */
19327         uint16_t        cmpl_ring;
19328         /*
19329          * The sequence ID is used by the driver for tracking multiple
19330          * commands. This ID is treated as opaque data by the firmware and
19331          * the value is returned in the `hwrm_resp_hdr` upon completion.
19332          */
19333         uint16_t        seq_id;
19334         /*
19335          * The target ID of the command:
19336          * * 0x0-0xFFF8 - The function ID
19337          * * 0xFFF8-0xFFFE - Reserved for internal processors
19338          * * 0xFFFF - HWRM
19339          */
19340         uint16_t        target_id;
19341         /*
19342          * A physical address pointer pointing to a host buffer that the
19343          * command's response data will be written. This can be either a host
19344          * physical address (HPA) or a guest physical address (GPA) and must
19345          * point to a physically contiguous block of memory.
19346          */
19347         uint64_t        resp_addr;
19348         uint32_t        flags;
19349         /*
19350          * When this bit is '1', the VNIC shall be configured to
19351          * use regular placement algorithm.
19352          * By default, the regular placement algorithm shall be
19353          * enabled on the VNIC.
19354          */
19355         #define HWRM_VNIC_PLCMODES_CFG_INPUT_FLAGS_REGULAR_PLACEMENT \
19356                 UINT32_C(0x1)
19357         /*
19358          * When this bit is '1', the VNIC shall be configured
19359          * use the jumbo placement algorithm.
19360          */
19361         #define HWRM_VNIC_PLCMODES_CFG_INPUT_FLAGS_JUMBO_PLACEMENT \
19362                 UINT32_C(0x2)
19363         /*
19364          * When this bit is '1', the VNIC shall be configured
19365          * to enable Header-Data split for IPv4 packets according
19366          * to the following rules:
19367          * # If the packet is identified as TCP/IPv4, then the
19368          * packet is split at the beginning of the TCP payload.
19369          * # If the packet is identified as UDP/IPv4, then the
19370          * packet is split at the beginning of UDP payload.
19371          * # If the packet is identified as non-TCP and non-UDP
19372          * IPv4 packet, then the packet is split at the beginning
19373          * of the upper layer protocol header carried in the IPv4
19374          * packet.
19375          */
19376         #define HWRM_VNIC_PLCMODES_CFG_INPUT_FLAGS_HDS_IPV4 \
19377                 UINT32_C(0x4)
19378         /*
19379          * When this bit is '1', the VNIC shall be configured
19380          * to enable Header-Data split for IPv6 packets according
19381          * to the following rules:
19382          * # If the packet is identified as TCP/IPv6, then the
19383          * packet is split at the beginning of the TCP payload.
19384          * # If the packet is identified as UDP/IPv6, then the
19385          * packet is split at the beginning of UDP payload.
19386          * # If the packet is identified as non-TCP and non-UDP
19387          * IPv6 packet, then the packet is split at the beginning
19388          * of the upper layer protocol header carried in the IPv6
19389          * packet.
19390          */
19391         #define HWRM_VNIC_PLCMODES_CFG_INPUT_FLAGS_HDS_IPV6 \
19392                 UINT32_C(0x8)
19393         /*
19394          * When this bit is '1', the VNIC shall be configured
19395          * to enable Header-Data split for FCoE packets at the
19396          * beginning of FC payload.
19397          */
19398         #define HWRM_VNIC_PLCMODES_CFG_INPUT_FLAGS_HDS_FCOE \
19399                 UINT32_C(0x10)
19400         /*
19401          * When this bit is '1', the VNIC shall be configured
19402          * to enable Header-Data split for RoCE packets at the
19403          * beginning of RoCE payload (after BTH/GRH headers).
19404          */
19405         #define HWRM_VNIC_PLCMODES_CFG_INPUT_FLAGS_HDS_ROCE \
19406                 UINT32_C(0x20)
19407         uint32_t        enables;
19408         /*
19409          * This bit must be '1' for the jumbo_thresh_valid field to be
19410          * configured.
19411          */
19412         #define HWRM_VNIC_PLCMODES_CFG_INPUT_ENABLES_JUMBO_THRESH_VALID \
19413                 UINT32_C(0x1)
19414         /*
19415          * This bit must be '1' for the hds_offset_valid field to be
19416          * configured.
19417          */
19418         #define HWRM_VNIC_PLCMODES_CFG_INPUT_ENABLES_HDS_OFFSET_VALID \
19419                 UINT32_C(0x2)
19420         /*
19421          * This bit must be '1' for the hds_threshold_valid field to be
19422          * configured.
19423          */
19424         #define HWRM_VNIC_PLCMODES_CFG_INPUT_ENABLES_HDS_THRESHOLD_VALID \
19425                 UINT32_C(0x4)
19426         /* Logical vnic ID */
19427         uint32_t        vnic_id;
19428         /*
19429          * When jumbo placement algorithm is enabled, this value
19430          * is used to determine the threshold for jumbo placement.
19431          * Packets with length larger than this value will be
19432          * placed according to the jumbo placement algorithm.
19433          */
19434         uint16_t        jumbo_thresh;
19435         /*
19436          * This value is used to determine the offset into
19437          * packet buffer where the split data (payload) will be
19438          * placed according to one of of HDS placement algorithm.
19439          *
19440          * The lengths of packet buffers provided for split data
19441          * shall be larger than this value.
19442          */
19443         uint16_t        hds_offset;
19444         /*
19445          * When one of the HDS placement algorithm is enabled, this
19446          * value is used to determine the threshold for HDS
19447          * placement.
19448          * Packets with length larger than this value will be
19449          * placed according to the HDS placement algorithm.
19450          * This value shall be in multiple of 4 bytes.
19451          */
19452         uint16_t        hds_threshold;
19453         uint8_t unused_0[6];
19454 } __attribute__((packed));
19455
19456 /* hwrm_vnic_plcmodes_cfg_output (size:128b/16B) */
19457 struct hwrm_vnic_plcmodes_cfg_output {
19458         /* The specific error status for the command. */
19459         uint16_t        error_code;
19460         /* The HWRM command request type. */
19461         uint16_t        req_type;
19462         /* The sequence ID from the original command. */
19463         uint16_t        seq_id;
19464         /* The length of the response data in number of bytes. */
19465         uint16_t        resp_len;
19466         uint8_t unused_0[7];
19467         /*
19468          * This field is used in Output records to indicate that the output
19469          * is completely written to RAM.  This field should be read as '1'
19470          * to indicate that the output has been completely written.
19471          * When writing a command completion or response to an internal processor,
19472          * the order of writes has to be such that this field is written last.
19473          */
19474         uint8_t valid;
19475 } __attribute__((packed));
19476
19477 /***************************
19478  * hwrm_vnic_plcmodes_qcfg *
19479  ***************************/
19480
19481
19482 /* hwrm_vnic_plcmodes_qcfg_input (size:192b/24B) */
19483 struct hwrm_vnic_plcmodes_qcfg_input {
19484         /* The HWRM command request type. */
19485         uint16_t        req_type;
19486         /*
19487          * The completion ring to send the completion event on. This should
19488          * be the NQ ID returned from the `nq_alloc` HWRM command.
19489          */
19490         uint16_t        cmpl_ring;
19491         /*
19492          * The sequence ID is used by the driver for tracking multiple
19493          * commands. This ID is treated as opaque data by the firmware and
19494          * the value is returned in the `hwrm_resp_hdr` upon completion.
19495          */
19496         uint16_t        seq_id;
19497         /*
19498          * The target ID of the command:
19499          * * 0x0-0xFFF8 - The function ID
19500          * * 0xFFF8-0xFFFE - Reserved for internal processors
19501          * * 0xFFFF - HWRM
19502          */
19503         uint16_t        target_id;
19504         /*
19505          * A physical address pointer pointing to a host buffer that the
19506          * command's response data will be written. This can be either a host
19507          * physical address (HPA) or a guest physical address (GPA) and must
19508          * point to a physically contiguous block of memory.
19509          */
19510         uint64_t        resp_addr;
19511         /* Logical vnic ID */
19512         uint32_t        vnic_id;
19513         uint8_t unused_0[4];
19514 } __attribute__((packed));
19515
19516 /* hwrm_vnic_plcmodes_qcfg_output (size:192b/24B) */
19517 struct hwrm_vnic_plcmodes_qcfg_output {
19518         /* The specific error status for the command. */
19519         uint16_t        error_code;
19520         /* The HWRM command request type. */
19521         uint16_t        req_type;
19522         /* The sequence ID from the original command. */
19523         uint16_t        seq_id;
19524         /* The length of the response data in number of bytes. */
19525         uint16_t        resp_len;
19526         uint32_t        flags;
19527         /*
19528          * When this bit is '1', the VNIC is configured to
19529          * use regular placement algorithm.
19530          */
19531         #define HWRM_VNIC_PLCMODES_QCFG_OUTPUT_FLAGS_REGULAR_PLACEMENT \
19532                 UINT32_C(0x1)
19533         /*
19534          * When this bit is '1', the VNIC is configured to
19535          * use the jumbo placement algorithm.
19536          */
19537         #define HWRM_VNIC_PLCMODES_QCFG_OUTPUT_FLAGS_JUMBO_PLACEMENT \
19538                 UINT32_C(0x2)
19539         /*
19540          * When this bit is '1', the VNIC is configured
19541          * to enable Header-Data split for IPv4 packets.
19542          */
19543         #define HWRM_VNIC_PLCMODES_QCFG_OUTPUT_FLAGS_HDS_IPV4 \
19544                 UINT32_C(0x4)
19545         /*
19546          * When this bit is '1', the VNIC is configured
19547          * to enable Header-Data split for IPv6 packets.
19548          */
19549         #define HWRM_VNIC_PLCMODES_QCFG_OUTPUT_FLAGS_HDS_IPV6 \
19550                 UINT32_C(0x8)
19551         /*
19552          * When this bit is '1', the VNIC is configured
19553          * to enable Header-Data split for FCoE packets.
19554          */
19555         #define HWRM_VNIC_PLCMODES_QCFG_OUTPUT_FLAGS_HDS_FCOE \
19556                 UINT32_C(0x10)
19557         /*
19558          * When this bit is '1', the VNIC is configured
19559          * to enable Header-Data split for RoCE packets.
19560          */
19561         #define HWRM_VNIC_PLCMODES_QCFG_OUTPUT_FLAGS_HDS_ROCE \
19562                 UINT32_C(0x20)
19563         /*
19564          * When this bit is '1', the VNIC is configured
19565          * to be the default VNIC of the requesting function.
19566          */
19567         #define HWRM_VNIC_PLCMODES_QCFG_OUTPUT_FLAGS_DFLT_VNIC \
19568                 UINT32_C(0x40)
19569         /*
19570          * When jumbo placement algorithm is enabled, this value
19571          * is used to determine the threshold for jumbo placement.
19572          * Packets with length larger than this value will be
19573          * placed according to the jumbo placement algorithm.
19574          */
19575         uint16_t        jumbo_thresh;
19576         /*
19577          * This value is used to determine the offset into
19578          * packet buffer where the split data (payload) will be
19579          * placed according to one of of HDS placement algorithm.
19580          *
19581          * The lengths of packet buffers provided for split data
19582          * shall be larger than this value.
19583          */
19584         uint16_t        hds_offset;
19585         /*
19586          * When one of the HDS placement algorithm is enabled, this
19587          * value is used to determine the threshold for HDS
19588          * placement.
19589          * Packets with length larger than this value will be
19590          * placed according to the HDS placement algorithm.
19591          * This value shall be in multiple of 4 bytes.
19592          */
19593         uint16_t        hds_threshold;
19594         uint8_t unused_0[5];
19595         /*
19596          * This field is used in Output records to indicate that the output
19597          * is completely written to RAM.  This field should be read as '1'
19598          * to indicate that the output has been completely written.
19599          * When writing a command completion or response to an internal processor,
19600          * the order of writes has to be such that this field is written last.
19601          */
19602         uint8_t valid;
19603 } __attribute__((packed));
19604
19605 /**********************************
19606  * hwrm_vnic_rss_cos_lb_ctx_alloc *
19607  **********************************/
19608
19609
19610 /* hwrm_vnic_rss_cos_lb_ctx_alloc_input (size:128b/16B) */
19611 struct hwrm_vnic_rss_cos_lb_ctx_alloc_input {
19612         /* The HWRM command request type. */
19613         uint16_t        req_type;
19614         /*
19615          * The completion ring to send the completion event on. This should
19616          * be the NQ ID returned from the `nq_alloc` HWRM command.
19617          */
19618         uint16_t        cmpl_ring;
19619         /*
19620          * The sequence ID is used by the driver for tracking multiple
19621          * commands. This ID is treated as opaque data by the firmware and
19622          * the value is returned in the `hwrm_resp_hdr` upon completion.
19623          */
19624         uint16_t        seq_id;
19625         /*
19626          * The target ID of the command:
19627          * * 0x0-0xFFF8 - The function ID
19628          * * 0xFFF8-0xFFFE - Reserved for internal processors
19629          * * 0xFFFF - HWRM
19630          */
19631         uint16_t        target_id;
19632         /*
19633          * A physical address pointer pointing to a host buffer that the
19634          * command's response data will be written. This can be either a host
19635          * physical address (HPA) or a guest physical address (GPA) and must
19636          * point to a physically contiguous block of memory.
19637          */
19638         uint64_t        resp_addr;
19639 } __attribute__((packed));
19640
19641 /* hwrm_vnic_rss_cos_lb_ctx_alloc_output (size:128b/16B) */
19642 struct hwrm_vnic_rss_cos_lb_ctx_alloc_output {
19643         /* The specific error status for the command. */
19644         uint16_t        error_code;
19645         /* The HWRM command request type. */
19646         uint16_t        req_type;
19647         /* The sequence ID from the original command. */
19648         uint16_t        seq_id;
19649         /* The length of the response data in number of bytes. */
19650         uint16_t        resp_len;
19651         /* rss_cos_lb_ctx_id is 16 b */
19652         uint16_t        rss_cos_lb_ctx_id;
19653         uint8_t unused_0[5];
19654         /*
19655          * This field is used in Output records to indicate that the output
19656          * is completely written to RAM.  This field should be read as '1'
19657          * to indicate that the output has been completely written.
19658          * When writing a command completion or response to an internal processor,
19659          * the order of writes has to be such that this field is written last.
19660          */
19661         uint8_t valid;
19662 } __attribute__((packed));
19663
19664 /*********************************
19665  * hwrm_vnic_rss_cos_lb_ctx_free *
19666  *********************************/
19667
19668
19669 /* hwrm_vnic_rss_cos_lb_ctx_free_input (size:192b/24B) */
19670 struct hwrm_vnic_rss_cos_lb_ctx_free_input {
19671         /* The HWRM command request type. */
19672         uint16_t        req_type;
19673         /*
19674          * The completion ring to send the completion event on. This should
19675          * be the NQ ID returned from the `nq_alloc` HWRM command.
19676          */
19677         uint16_t        cmpl_ring;
19678         /*
19679          * The sequence ID is used by the driver for tracking multiple
19680          * commands. This ID is treated as opaque data by the firmware and
19681          * the value is returned in the `hwrm_resp_hdr` upon completion.
19682          */
19683         uint16_t        seq_id;
19684         /*
19685          * The target ID of the command:
19686          * * 0x0-0xFFF8 - The function ID
19687          * * 0xFFF8-0xFFFE - Reserved for internal processors
19688          * * 0xFFFF - HWRM
19689          */
19690         uint16_t        target_id;
19691         /*
19692          * A physical address pointer pointing to a host buffer that the
19693          * command's response data will be written. This can be either a host
19694          * physical address (HPA) or a guest physical address (GPA) and must
19695          * point to a physically contiguous block of memory.
19696          */
19697         uint64_t        resp_addr;
19698         /* rss_cos_lb_ctx_id is 16 b */
19699         uint16_t        rss_cos_lb_ctx_id;
19700         uint8_t unused_0[6];
19701 } __attribute__((packed));
19702
19703 /* hwrm_vnic_rss_cos_lb_ctx_free_output (size:128b/16B) */
19704 struct hwrm_vnic_rss_cos_lb_ctx_free_output {
19705         /* The specific error status for the command. */
19706         uint16_t        error_code;
19707         /* The HWRM command request type. */
19708         uint16_t        req_type;
19709         /* The sequence ID from the original command. */
19710         uint16_t        seq_id;
19711         /* The length of the response data in number of bytes. */
19712         uint16_t        resp_len;
19713         uint8_t unused_0[7];
19714         /*
19715          * This field is used in Output records to indicate that the output
19716          * is completely written to RAM.  This field should be read as '1'
19717          * to indicate that the output has been completely written.
19718          * When writing a command completion or response to an internal processor,
19719          * the order of writes has to be such that this field is written last.
19720          */
19721         uint8_t valid;
19722 } __attribute__((packed));
19723
19724 /*******************
19725  * hwrm_ring_alloc *
19726  *******************/
19727
19728
19729 /* hwrm_ring_alloc_input (size:704b/88B) */
19730 struct hwrm_ring_alloc_input {
19731         /* The HWRM command request type. */
19732         uint16_t        req_type;
19733         /*
19734          * The completion ring to send the completion event on. This should
19735          * be the NQ ID returned from the `nq_alloc` HWRM command.
19736          */
19737         uint16_t        cmpl_ring;
19738         /*
19739          * The sequence ID is used by the driver for tracking multiple
19740          * commands. This ID is treated as opaque data by the firmware and
19741          * the value is returned in the `hwrm_resp_hdr` upon completion.
19742          */
19743         uint16_t        seq_id;
19744         /*
19745          * The target ID of the command:
19746          * * 0x0-0xFFF8 - The function ID
19747          * * 0xFFF8-0xFFFE - Reserved for internal processors
19748          * * 0xFFFF - HWRM
19749          */
19750         uint16_t        target_id;
19751         /*
19752          * A physical address pointer pointing to a host buffer that the
19753          * command's response data will be written. This can be either a host
19754          * physical address (HPA) or a guest physical address (GPA) and must
19755          * point to a physically contiguous block of memory.
19756          */
19757         uint64_t        resp_addr;
19758         uint32_t        enables;
19759         /*
19760          * This bit must be '1' for the ring_arb_cfg field to be
19761          * configured.
19762          */
19763         #define HWRM_RING_ALLOC_INPUT_ENABLES_RING_ARB_CFG \
19764                 UINT32_C(0x2)
19765         /*
19766          * This bit must be '1' for the stat_ctx_id_valid field to be
19767          * configured.
19768          */
19769         #define HWRM_RING_ALLOC_INPUT_ENABLES_STAT_CTX_ID_VALID \
19770                 UINT32_C(0x8)
19771         /*
19772          * This bit must be '1' for the max_bw_valid field to be
19773          * configured.
19774          */
19775         #define HWRM_RING_ALLOC_INPUT_ENABLES_MAX_BW_VALID \
19776                 UINT32_C(0x20)
19777         /*
19778          * This bit must be '1' for the rx_ring_id field to be
19779          * configured.
19780          */
19781         #define HWRM_RING_ALLOC_INPUT_ENABLES_RX_RING_ID_VALID \
19782                 UINT32_C(0x40)
19783         /*
19784          * This bit must be '1' for the nq_ring_id field to be
19785          * configured.
19786          */
19787         #define HWRM_RING_ALLOC_INPUT_ENABLES_NQ_RING_ID_VALID \
19788                 UINT32_C(0x80)
19789         /*
19790          * This bit must be '1' for the rx_buf_size field to be
19791          * configured.
19792          */
19793         #define HWRM_RING_ALLOC_INPUT_ENABLES_RX_BUF_SIZE_VALID \
19794                 UINT32_C(0x100)
19795         /* Ring Type. */
19796         uint8_t ring_type;
19797         /* L2 Completion Ring (CR) */
19798         #define HWRM_RING_ALLOC_INPUT_RING_TYPE_L2_CMPL   UINT32_C(0x0)
19799         /* TX Ring (TR) */
19800         #define HWRM_RING_ALLOC_INPUT_RING_TYPE_TX        UINT32_C(0x1)
19801         /* RX Ring (RR) */
19802         #define HWRM_RING_ALLOC_INPUT_RING_TYPE_RX        UINT32_C(0x2)
19803         /* RoCE Notification Completion Ring (ROCE_CR) */
19804         #define HWRM_RING_ALLOC_INPUT_RING_TYPE_ROCE_CMPL UINT32_C(0x3)
19805         /* RX Aggregation Ring */
19806         #define HWRM_RING_ALLOC_INPUT_RING_TYPE_RX_AGG    UINT32_C(0x4)
19807         /* Notification Queue */
19808         #define HWRM_RING_ALLOC_INPUT_RING_TYPE_NQ        UINT32_C(0x5)
19809         #define HWRM_RING_ALLOC_INPUT_RING_TYPE_LAST \
19810                 HWRM_RING_ALLOC_INPUT_RING_TYPE_NQ
19811         uint8_t unused_0;
19812         /* Ring allocation flags. */
19813         uint16_t        flags;
19814         /*
19815          * For Rx rings, the incoming packet data can be placed at either
19816          * a 0B or 2B offset from the start of the Rx packet buffer. When
19817          * '1', the received packet will be padded with 2B of zeros at the
19818          * front of the packet. Note that this flag is only used for
19819          * Rx rings and is ignored for all other rings included Rx
19820          * Aggregation rings.
19821          */
19822         #define HWRM_RING_ALLOC_INPUT_FLAGS_RX_SOP_PAD     UINT32_C(0x1)
19823         /*
19824          * This value is a pointer to the page table for the
19825          * Ring.
19826          */
19827         uint64_t        page_tbl_addr;
19828         /* First Byte Offset of the first entry in the first page. */
19829         uint32_t        fbo;
19830         /*
19831          * Actual page size in 2^page_size. The supported range is increments
19832          * in powers of 2 from 16 bytes to 1GB.
19833          * - 4 = 16 B
19834          *     Page size is 16 B.
19835          * - 12 = 4 KB
19836          *     Page size is 4 KB.
19837          * - 13 = 8 KB
19838          *     Page size is 8 KB.
19839          * - 16 = 64 KB
19840          *     Page size is 64 KB.
19841          * - 21 = 2 MB
19842          *     Page size is 2 MB.
19843          * - 22 = 4 MB
19844          *     Page size is 4 MB.
19845          * - 30 = 1 GB
19846          *     Page size is 1 GB.
19847          */
19848         uint8_t page_size;
19849         /*
19850          * This value indicates the depth of page table.
19851          * For this version of the specification, value other than 0 or
19852          * 1 shall be considered as an invalid value.
19853          * When the page_tbl_depth = 0, then it is treated as a
19854          * special case with the following.
19855          * 1. FBO and page size fields are not valid.
19856          * 2. page_tbl_addr is the physical address of the first
19857          *    element of the ring.
19858          */
19859         uint8_t page_tbl_depth;
19860         uint8_t unused_1[2];
19861         /*
19862          * Number of 16B units in the ring.  Minimum size for
19863          * a ring is 16 16B entries.
19864          */
19865         uint32_t        length;
19866         /*
19867          * Logical ring number for the ring to be allocated.
19868          * This value determines the position in the doorbell
19869          * area where the update to the ring will be made.
19870          *
19871          * For completion rings, this value is also the MSI-X
19872          * vector number for the function the completion ring is
19873          * associated with.
19874          */
19875         uint16_t        logical_id;
19876         /*
19877          * This field is used only when ring_type is a TX ring.
19878          * This value indicates what completion ring the TX ring
19879          * is associated with.
19880          */
19881         uint16_t        cmpl_ring_id;
19882         /*
19883          * This field is used only when ring_type is a TX ring.
19884          * This value indicates what CoS queue the TX ring
19885          * is associated with.
19886          */
19887         uint16_t        queue_id;
19888         /*
19889          * When allocating a Rx ring or Rx aggregation ring, this field
19890          * specifies the size of the buffer descriptors posted to the ring.
19891          */
19892         uint16_t        rx_buf_size;
19893         /*
19894          * When allocating an Rx aggregation ring, this field
19895          * specifies the associated Rx ring ID.
19896          */
19897         uint16_t        rx_ring_id;
19898         /*
19899          * When allocating a completion ring, this field
19900          * specifies the associated NQ ring ID.
19901          */
19902         uint16_t        nq_ring_id;
19903         /*
19904          * This field is used only when ring_type is a TX ring.
19905          * This field is used to configure arbitration related
19906          * parameters for a TX ring.
19907          */
19908         uint16_t        ring_arb_cfg;
19909         /* Arbitration policy used for the ring. */
19910         #define HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_ARB_POLICY_MASK \
19911                 UINT32_C(0xf)
19912         #define HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_ARB_POLICY_SFT       0
19913         /*
19914          * Use strict priority for the TX ring.
19915          * Priority value is specified in arb_policy_param
19916          */
19917         #define HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_ARB_POLICY_SP \
19918                 UINT32_C(0x1)
19919         /*
19920          * Use weighted fair queue arbitration for the TX ring.
19921          * Weight is specified in arb_policy_param
19922          */
19923         #define HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_ARB_POLICY_WFQ \
19924                 UINT32_C(0x2)
19925         #define HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_ARB_POLICY_LAST \
19926                 HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_ARB_POLICY_WFQ
19927         /* Reserved field. */
19928         #define HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_RSVD_MASK \
19929                 UINT32_C(0xf0)
19930         #define HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_RSVD_SFT             4
19931         /*
19932          * Arbitration policy specific parameter.
19933          * # For strict priority arbitration policy, this field
19934          * represents a priority value. If set to 0, then the priority
19935          * is not specified and the HWRM is allowed to select
19936          * any priority for this TX ring.
19937          * # For weighted fair queue arbitration policy, this field
19938          * represents a weight value. If set to 0, then the weight
19939          * is not specified and the HWRM is allowed to select
19940          * any weight for this TX ring.
19941          */
19942         #define HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_ARB_POLICY_PARAM_MASK \
19943                 UINT32_C(0xff00)
19944         #define HWRM_RING_ALLOC_INPUT_RING_ARB_CFG_ARB_POLICY_PARAM_SFT 8
19945         uint16_t        unused_3;
19946         /*
19947          * This field is reserved for the future use.
19948          * It shall be set to 0.
19949          */
19950         uint32_t        reserved3;
19951         /*
19952          * This field is used only when ring_type is a TX ring.
19953          * This input indicates what statistics context this ring
19954          * should be associated with.
19955          */
19956         uint32_t        stat_ctx_id;
19957         /*
19958          * This field is reserved for the future use.
19959          * It shall be set to 0.
19960          */
19961         uint32_t        reserved4;
19962         /*
19963          * This field is used only when ring_type is a TX ring
19964          * to specify maximum BW allocated to the TX ring.
19965          * The HWRM will translate this value into byte counter and
19966          * time interval used for this ring inside the device.
19967          */
19968         uint32_t        max_bw;
19969         /* The bandwidth value. */
19970         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_MASK \
19971                 UINT32_C(0xfffffff)
19972         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_SFT              0
19973         /* The granularity of the value (bits or bytes). */
19974         #define HWRM_RING_ALLOC_INPUT_MAX_BW_SCALE \
19975                 UINT32_C(0x10000000)
19976         /* Value is in bits. */
19977         #define HWRM_RING_ALLOC_INPUT_MAX_BW_SCALE_BITS \
19978                 (UINT32_C(0x0) << 28)
19979         /* Value is in bytes. */
19980         #define HWRM_RING_ALLOC_INPUT_MAX_BW_SCALE_BYTES \
19981                 (UINT32_C(0x1) << 28)
19982         #define HWRM_RING_ALLOC_INPUT_MAX_BW_SCALE_LAST \
19983                 HWRM_RING_ALLOC_INPUT_MAX_BW_SCALE_BYTES
19984         /* bw_value_unit is 3 b */
19985         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_MASK \
19986                 UINT32_C(0xe0000000)
19987         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_SFT         29
19988         /* Value is in Mb or MB (base 10). */
19989         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_MEGA \
19990                 (UINT32_C(0x0) << 29)
19991         /* Value is in Kb or KB (base 10). */
19992         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_KILO \
19993                 (UINT32_C(0x2) << 29)
19994         /* Value is in bits or bytes. */
19995         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_BASE \
19996                 (UINT32_C(0x4) << 29)
19997         /* Value is in Gb or GB (base 10). */
19998         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_GIGA \
19999                 (UINT32_C(0x6) << 29)
20000         /* Value is in 1/100th of a percentage of total bandwidth. */
20001         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_PERCENT1_100 \
20002                 (UINT32_C(0x1) << 29)
20003         /* Invalid unit */
20004         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_INVALID \
20005                 (UINT32_C(0x7) << 29)
20006         #define HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_LAST \
20007                 HWRM_RING_ALLOC_INPUT_MAX_BW_BW_VALUE_UNIT_INVALID
20008         /*
20009          * This field is used only when ring_type is a Completion ring.
20010          * This value indicates what interrupt mode should be used
20011          * on this completion ring.
20012          * Note: In the legacy interrupt mode, no more than 16
20013          * completion rings are allowed.
20014          */
20015         uint8_t int_mode;
20016         /* Legacy INTA */
20017         #define HWRM_RING_ALLOC_INPUT_INT_MODE_LEGACY UINT32_C(0x0)
20018         /* Reserved */
20019         #define HWRM_RING_ALLOC_INPUT_INT_MODE_RSVD   UINT32_C(0x1)
20020         /* MSI-X */
20021         #define HWRM_RING_ALLOC_INPUT_INT_MODE_MSIX   UINT32_C(0x2)
20022         /* No Interrupt - Polled mode */
20023         #define HWRM_RING_ALLOC_INPUT_INT_MODE_POLL   UINT32_C(0x3)
20024         #define HWRM_RING_ALLOC_INPUT_INT_MODE_LAST \
20025                 HWRM_RING_ALLOC_INPUT_INT_MODE_POLL
20026         uint8_t unused_4[3];
20027         /*
20028          * The cq_handle is specified when allocating a completion ring. For
20029          * devices that support NQs, this cq_handle will be included in the
20030          * NQE to specify which CQ should be read to retrieve the completion
20031          * record.
20032          */
20033         uint64_t        cq_handle;
20034 } __attribute__((packed));
20035
20036 /* hwrm_ring_alloc_output (size:128b/16B) */
20037 struct hwrm_ring_alloc_output {
20038         /* The specific error status for the command. */
20039         uint16_t        error_code;
20040         /* The HWRM command request type. */
20041         uint16_t        req_type;
20042         /* The sequence ID from the original command. */
20043         uint16_t        seq_id;
20044         /* The length of the response data in number of bytes. */
20045         uint16_t        resp_len;
20046         /*
20047          * Physical number of ring allocated.
20048          * This value shall be unique for a ring type.
20049          */
20050         uint16_t        ring_id;
20051         /* Logical number of ring allocated. */
20052         uint16_t        logical_ring_id;
20053         uint8_t unused_0[3];
20054         /*
20055          * This field is used in Output records to indicate that the output
20056          * is completely written to RAM.  This field should be read as '1'
20057          * to indicate that the output has been completely written.
20058          * When writing a command completion or response to an internal processor,
20059          * the order of writes has to be such that this field is written last.
20060          */
20061         uint8_t valid;
20062 } __attribute__((packed));
20063
20064 /******************
20065  * hwrm_ring_free *
20066  ******************/
20067
20068
20069 /* hwrm_ring_free_input (size:192b/24B) */
20070 struct hwrm_ring_free_input {
20071         /* The HWRM command request type. */
20072         uint16_t        req_type;
20073         /*
20074          * The completion ring to send the completion event on. This should
20075          * be the NQ ID returned from the `nq_alloc` HWRM command.
20076          */
20077         uint16_t        cmpl_ring;
20078         /*
20079          * The sequence ID is used by the driver for tracking multiple
20080          * commands. This ID is treated as opaque data by the firmware and
20081          * the value is returned in the `hwrm_resp_hdr` upon completion.
20082          */
20083         uint16_t        seq_id;
20084         /*
20085          * The target ID of the command:
20086          * * 0x0-0xFFF8 - The function ID
20087          * * 0xFFF8-0xFFFE - Reserved for internal processors
20088          * * 0xFFFF - HWRM
20089          */
20090         uint16_t        target_id;
20091         /*
20092          * A physical address pointer pointing to a host buffer that the
20093          * command's response data will be written. This can be either a host
20094          * physical address (HPA) or a guest physical address (GPA) and must
20095          * point to a physically contiguous block of memory.
20096          */
20097         uint64_t        resp_addr;
20098         /* Ring Type. */
20099         uint8_t ring_type;
20100         /* L2 Completion Ring (CR) */
20101         #define HWRM_RING_FREE_INPUT_RING_TYPE_L2_CMPL   UINT32_C(0x0)
20102         /* TX Ring (TR) */
20103         #define HWRM_RING_FREE_INPUT_RING_TYPE_TX        UINT32_C(0x1)
20104         /* RX Ring (RR) */
20105         #define HWRM_RING_FREE_INPUT_RING_TYPE_RX        UINT32_C(0x2)
20106         /* RoCE Notification Completion Ring (ROCE_CR) */
20107         #define HWRM_RING_FREE_INPUT_RING_TYPE_ROCE_CMPL UINT32_C(0x3)
20108         /* RX Aggregation Ring */
20109         #define HWRM_RING_FREE_INPUT_RING_TYPE_RX_AGG    UINT32_C(0x4)
20110         /* Notification Queue */
20111         #define HWRM_RING_FREE_INPUT_RING_TYPE_NQ        UINT32_C(0x5)
20112         #define HWRM_RING_FREE_INPUT_RING_TYPE_LAST \
20113                 HWRM_RING_FREE_INPUT_RING_TYPE_NQ
20114         uint8_t unused_0;
20115         /* Physical number of ring allocated. */
20116         uint16_t        ring_id;
20117         uint8_t unused_1[4];
20118 } __attribute__((packed));
20119
20120 /* hwrm_ring_free_output (size:128b/16B) */
20121 struct hwrm_ring_free_output {
20122         /* The specific error status for the command. */
20123         uint16_t        error_code;
20124         /* The HWRM command request type. */
20125         uint16_t        req_type;
20126         /* The sequence ID from the original command. */
20127         uint16_t        seq_id;
20128         /* The length of the response data in number of bytes. */
20129         uint16_t        resp_len;
20130         uint8_t unused_0[7];
20131         /*
20132          * This field is used in Output records to indicate that the output
20133          * is completely written to RAM.  This field should be read as '1'
20134          * to indicate that the output has been completely written.
20135          * When writing a command completion or response to an internal processor,
20136          * the order of writes has to be such that this field is written last.
20137          */
20138         uint8_t valid;
20139 } __attribute__((packed));
20140
20141 /*******************
20142  * hwrm_ring_reset *
20143  *******************/
20144
20145
20146 /* hwrm_ring_reset_input (size:192b/24B) */
20147 struct hwrm_ring_reset_input {
20148         /* The HWRM command request type. */
20149         uint16_t        req_type;
20150         /*
20151          * The completion ring to send the completion event on. This should
20152          * be the NQ ID returned from the `nq_alloc` HWRM command.
20153          */
20154         uint16_t        cmpl_ring;
20155         /*
20156          * The sequence ID is used by the driver for tracking multiple
20157          * commands. This ID is treated as opaque data by the firmware and
20158          * the value is returned in the `hwrm_resp_hdr` upon completion.
20159          */
20160         uint16_t        seq_id;
20161         /*
20162          * The target ID of the command:
20163          * * 0x0-0xFFF8 - The function ID
20164          * * 0xFFF8-0xFFFE - Reserved for internal processors
20165          * * 0xFFFF - HWRM
20166          */
20167         uint16_t        target_id;
20168         /*
20169          * A physical address pointer pointing to a host buffer that the
20170          * command's response data will be written. This can be either a host
20171          * physical address (HPA) or a guest physical address (GPA) and must
20172          * point to a physically contiguous block of memory.
20173          */
20174         uint64_t        resp_addr;
20175         /* Ring Type. */
20176         uint8_t ring_type;
20177         /* L2 Completion Ring (CR) */
20178         #define HWRM_RING_RESET_INPUT_RING_TYPE_L2_CMPL   UINT32_C(0x0)
20179         /* TX Ring (TR) */
20180         #define HWRM_RING_RESET_INPUT_RING_TYPE_TX        UINT32_C(0x1)
20181         /* RX Ring (RR) */
20182         #define HWRM_RING_RESET_INPUT_RING_TYPE_RX        UINT32_C(0x2)
20183         /* RoCE Notification Completion Ring (ROCE_CR) */
20184         #define HWRM_RING_RESET_INPUT_RING_TYPE_ROCE_CMPL UINT32_C(0x3)
20185         #define HWRM_RING_RESET_INPUT_RING_TYPE_LAST \
20186                 HWRM_RING_RESET_INPUT_RING_TYPE_ROCE_CMPL
20187         uint8_t unused_0;
20188         /* Physical number of the ring. */
20189         uint16_t        ring_id;
20190         uint8_t unused_1[4];
20191 } __attribute__((packed));
20192
20193 /* hwrm_ring_reset_output (size:128b/16B) */
20194 struct hwrm_ring_reset_output {
20195         /* The specific error status for the command. */
20196         uint16_t        error_code;
20197         /* The HWRM command request type. */
20198         uint16_t        req_type;
20199         /* The sequence ID from the original command. */
20200         uint16_t        seq_id;
20201         /* The length of the response data in number of bytes. */
20202         uint16_t        resp_len;
20203         uint8_t unused_0[7];
20204         /*
20205          * This field is used in Output records to indicate that the output
20206          * is completely written to RAM.  This field should be read as '1'
20207          * to indicate that the output has been completely written.
20208          * When writing a command completion or response to an internal processor,
20209          * the order of writes has to be such that this field is written last.
20210          */
20211         uint8_t valid;
20212 } __attribute__((packed));
20213
20214 /**************************
20215  * hwrm_ring_aggint_qcaps *
20216  **************************/
20217
20218
20219 /* hwrm_ring_aggint_qcaps_input (size:128b/16B) */
20220 struct hwrm_ring_aggint_qcaps_input {
20221         /* The HWRM command request type. */
20222         uint16_t        req_type;
20223         /*
20224          * The completion ring to send the completion event on. This should
20225          * be the NQ ID returned from the `nq_alloc` HWRM command.
20226          */
20227         uint16_t        cmpl_ring;
20228         /*
20229          * The sequence ID is used by the driver for tracking multiple
20230          * commands. This ID is treated as opaque data by the firmware and
20231          * the value is returned in the `hwrm_resp_hdr` upon completion.
20232          */
20233         uint16_t        seq_id;
20234         /*
20235          * The target ID of the command:
20236          * * 0x0-0xFFF8 - The function ID
20237          * * 0xFFF8-0xFFFE - Reserved for internal processors
20238          * * 0xFFFF - HWRM
20239          */
20240         uint16_t        target_id;
20241         /*
20242          * A physical address pointer pointing to a host buffer that the
20243          * command's response data will be written. This can be either a host
20244          * physical address (HPA) or a guest physical address (GPA) and must
20245          * point to a physically contiguous block of memory.
20246          */
20247         uint64_t        resp_addr;
20248 } __attribute__((packed));
20249
20250 /* hwrm_ring_aggint_qcaps_output (size:384b/48B) */
20251 struct hwrm_ring_aggint_qcaps_output {
20252         /* The specific error status for the command. */
20253         uint16_t        error_code;
20254         /* The HWRM command request type. */
20255         uint16_t        req_type;
20256         /* The sequence ID from the original command. */
20257         uint16_t        seq_id;
20258         /* The length of the response data in number of bytes. */
20259         uint16_t        resp_len;
20260         uint32_t        cmpl_params;
20261         /*
20262          * When this bit is set to '1', int_lat_tmr_min can be configured
20263          * on completion rings.
20264          */
20265         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_CMPL_PARAMS_INT_LAT_TMR_MIN \
20266                 UINT32_C(0x1)
20267         /*
20268          * When this bit is set to '1', int_lat_tmr_max can be configured
20269          * on completion rings.
20270          */
20271         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_CMPL_PARAMS_INT_LAT_TMR_MAX \
20272                 UINT32_C(0x2)
20273         /*
20274          * When this bit is set to '1', timer_reset can be enabled
20275          * on completion rings.
20276          */
20277         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_CMPL_PARAMS_TIMER_RESET \
20278                 UINT32_C(0x4)
20279         /*
20280          * When this bit is set to '1', ring_idle can be enabled
20281          * on completion rings.
20282          */
20283         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_CMPL_PARAMS_RING_IDLE \
20284                 UINT32_C(0x8)
20285         /*
20286          * When this bit is set to '1', num_cmpl_dma_aggr can be configured
20287          * on completion rings.
20288          */
20289         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_CMPL_PARAMS_NUM_CMPL_DMA_AGGR \
20290                 UINT32_C(0x10)
20291         /*
20292          * When this bit is set to '1', num_cmpl_dma_aggr_during_int can be configured
20293          * on completion rings.
20294          */
20295         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_CMPL_PARAMS_NUM_CMPL_DMA_AGGR_DURING_INT \
20296                 UINT32_C(0x20)
20297         /*
20298          * When this bit is set to '1', cmpl_aggr_dma_tmr can be configured
20299          * on completion rings.
20300          */
20301         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_CMPL_PARAMS_CMPL_AGGR_DMA_TMR \
20302                 UINT32_C(0x40)
20303         /*
20304          * When this bit is set to '1', cmpl_aggr_dma_tmr_during_int can be configured
20305          * on completion rings.
20306          */
20307         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_CMPL_PARAMS_CMPL_AGGR_DMA_TMR_DURING_INT \
20308                 UINT32_C(0x80)
20309         /*
20310          * When this bit is set to '1', num_cmpl_aggr_int can be configured
20311          * on completion rings.
20312          */
20313         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_CMPL_PARAMS_NUM_CMPL_AGGR_INT \
20314                 UINT32_C(0x100)
20315         uint32_t        nq_params;
20316         /*
20317          * When this bit is set to '1', int_lat_tmr_min can be configured
20318          * on notification queues.
20319          */
20320         #define HWRM_RING_AGGINT_QCAPS_OUTPUT_NQ_PARAMS_INT_LAT_TMR_MIN \
20321                 UINT32_C(0x1)
20322         /* Minimum value for num_cmpl_dma_aggr */
20323         uint16_t        num_cmpl_dma_aggr_min;
20324         /* Maximum value for num_cmpl_dma_aggr */
20325         uint16_t        num_cmpl_dma_aggr_max;
20326         /* Minimum value for num_cmpl_dma_aggr_during_int */
20327         uint16_t        num_cmpl_dma_aggr_during_int_min;
20328         /* Maximum value for num_cmpl_dma_aggr_during_int */
20329         uint16_t        num_cmpl_dma_aggr_during_int_max;
20330         /* Minimum value for cmpl_aggr_dma_tmr */
20331         uint16_t        cmpl_aggr_dma_tmr_min;
20332         /* Maximum value for cmpl_aggr_dma_tmr */
20333         uint16_t        cmpl_aggr_dma_tmr_max;
20334         /* Minimum value for cmpl_aggr_dma_tmr_during_int */
20335         uint16_t        cmpl_aggr_dma_tmr_during_int_min;
20336         /* Maximum value for cmpl_aggr_dma_tmr_during_int */
20337         uint16_t        cmpl_aggr_dma_tmr_during_int_max;
20338         /* Minimum value for int_lat_tmr_min */
20339         uint16_t        int_lat_tmr_min_min;
20340         /* Maximum value for int_lat_tmr_min */
20341         uint16_t        int_lat_tmr_min_max;
20342         /* Minimum value for int_lat_tmr_max */
20343         uint16_t        int_lat_tmr_max_min;
20344         /* Maximum value for int_lat_tmr_max */
20345         uint16_t        int_lat_tmr_max_max;
20346         /* Minimum value for num_cmpl_aggr_int */
20347         uint16_t        num_cmpl_aggr_int_min;
20348         /* Maximum value for num_cmpl_aggr_int */
20349         uint16_t        num_cmpl_aggr_int_max;
20350         /* The units for timer parameters, in nanoseconds. */
20351         uint16_t        timer_units;
20352         uint8_t unused_0[1];
20353         /*
20354          * This field is used in Output records to indicate that the output
20355          * is completely written to RAM.  This field should be read as '1'
20356          * to indicate that the output has been completely written.
20357          * When writing a command completion or response to an internal processor,
20358          * the order of writes has to be such that this field is written last.
20359          */
20360         uint8_t valid;
20361 } __attribute__((packed));
20362
20363 /**************************************
20364  * hwrm_ring_cmpl_ring_qaggint_params *
20365  **************************************/
20366
20367
20368 /* hwrm_ring_cmpl_ring_qaggint_params_input (size:192b/24B) */
20369 struct hwrm_ring_cmpl_ring_qaggint_params_input {
20370         /* The HWRM command request type. */
20371         uint16_t        req_type;
20372         /*
20373          * The completion ring to send the completion event on. This should
20374          * be the NQ ID returned from the `nq_alloc` HWRM command.
20375          */
20376         uint16_t        cmpl_ring;
20377         /*
20378          * The sequence ID is used by the driver for tracking multiple
20379          * commands. This ID is treated as opaque data by the firmware and
20380          * the value is returned in the `hwrm_resp_hdr` upon completion.
20381          */
20382         uint16_t        seq_id;
20383         /*
20384          * The target ID of the command:
20385          * * 0x0-0xFFF8 - The function ID
20386          * * 0xFFF8-0xFFFE - Reserved for internal processors
20387          * * 0xFFFF - HWRM
20388          */
20389         uint16_t        target_id;
20390         /*
20391          * A physical address pointer pointing to a host buffer that the
20392          * command's response data will be written. This can be either a host
20393          * physical address (HPA) or a guest physical address (GPA) and must
20394          * point to a physically contiguous block of memory.
20395          */
20396         uint64_t        resp_addr;
20397         /* Physical number of completion ring. */
20398         uint16_t        ring_id;
20399         uint8_t unused_0[6];
20400 } __attribute__((packed));
20401
20402 /* hwrm_ring_cmpl_ring_qaggint_params_output (size:256b/32B) */
20403 struct hwrm_ring_cmpl_ring_qaggint_params_output {
20404         /* The specific error status for the command. */
20405         uint16_t        error_code;
20406         /* The HWRM command request type. */
20407         uint16_t        req_type;
20408         /* The sequence ID from the original command. */
20409         uint16_t        seq_id;
20410         /* The length of the response data in number of bytes. */
20411         uint16_t        resp_len;
20412         uint16_t        flags;
20413         /*
20414          * When this bit is set to '1', interrupt max
20415          * timer is reset whenever a completion is received.
20416          */
20417         #define HWRM_RING_CMPL_RING_QAGGINT_PARAMS_OUTPUT_FLAGS_TIMER_RESET \
20418                 UINT32_C(0x1)
20419         /*
20420          * When this bit is set to '1', ring idle mode
20421          * aggregation will be enabled.
20422          */
20423         #define HWRM_RING_CMPL_RING_QAGGINT_PARAMS_OUTPUT_FLAGS_RING_IDLE \
20424                 UINT32_C(0x2)
20425         /*
20426          * Number of completions to aggregate before DMA
20427          * during the normal mode.
20428          */
20429         uint16_t        num_cmpl_dma_aggr;
20430         /*
20431          * Number of completions to aggregate before DMA
20432          * during the interrupt mode.
20433          */
20434         uint16_t        num_cmpl_dma_aggr_during_int;
20435         /*
20436          * Timer in unit of 80-nsec used to aggregate completions before
20437          * DMA during the normal mode (not in interrupt mode).
20438          */
20439         uint16_t        cmpl_aggr_dma_tmr;
20440         /*
20441          * Timer in unit of 80-nsec used to aggregate completions before
20442          * DMA during the interrupt mode.
20443          */
20444         uint16_t        cmpl_aggr_dma_tmr_during_int;
20445         /* Minimum time (in unit of 80-nsec) between two interrupts. */
20446         uint16_t        int_lat_tmr_min;
20447         /*
20448          * Maximum wait time (in unit of 80-nsec) spent aggregating
20449          * completions before signaling the interrupt after the
20450          * interrupt is enabled.
20451          */
20452         uint16_t        int_lat_tmr_max;
20453         /*
20454          * Minimum number of completions aggregated before signaling
20455          * an interrupt.
20456          */
20457         uint16_t        num_cmpl_aggr_int;
20458         uint8_t unused_0[7];
20459         /*
20460          * This field is used in Output records to indicate that the output
20461          * is completely written to RAM.  This field should be read as '1'
20462          * to indicate that the output has been completely written.
20463          * When writing a command completion or response to an internal processor,
20464          * the order of writes has to be such that this field is written last.
20465          */
20466         uint8_t valid;
20467 } __attribute__((packed));
20468
20469 /*****************************************
20470  * hwrm_ring_cmpl_ring_cfg_aggint_params *
20471  *****************************************/
20472
20473
20474 /* hwrm_ring_cmpl_ring_cfg_aggint_params_input (size:320b/40B) */
20475 struct hwrm_ring_cmpl_ring_cfg_aggint_params_input {
20476         /* The HWRM command request type. */
20477         uint16_t        req_type;
20478         /*
20479          * The completion ring to send the completion event on. This should
20480          * be the NQ ID returned from the `nq_alloc` HWRM command.
20481          */
20482         uint16_t        cmpl_ring;
20483         /*
20484          * The sequence ID is used by the driver for tracking multiple
20485          * commands. This ID is treated as opaque data by the firmware and
20486          * the value is returned in the `hwrm_resp_hdr` upon completion.
20487          */
20488         uint16_t        seq_id;
20489         /*
20490          * The target ID of the command:
20491          * * 0x0-0xFFF8 - The function ID
20492          * * 0xFFF8-0xFFFE - Reserved for internal processors
20493          * * 0xFFFF - HWRM
20494          */
20495         uint16_t        target_id;
20496         /*
20497          * A physical address pointer pointing to a host buffer that the
20498          * command's response data will be written. This can be either a host
20499          * physical address (HPA) or a guest physical address (GPA) and must
20500          * point to a physically contiguous block of memory.
20501          */
20502         uint64_t        resp_addr;
20503         /* Physical number of completion ring. */
20504         uint16_t        ring_id;
20505         uint16_t        flags;
20506         /*
20507          * When this bit is set to '1', interrupt latency max
20508          * timer is reset whenever a completion is received.
20509          */
20510         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_FLAGS_TIMER_RESET \
20511                 UINT32_C(0x1)
20512         /*
20513          * When this bit is set to '1', ring idle mode
20514          * aggregation will be enabled.
20515          */
20516         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_FLAGS_RING_IDLE \
20517                 UINT32_C(0x2)
20518         /*
20519          * Set this flag to 1 when configuring parameters on a
20520          * notification queue. Set this flag to 0 when configuring
20521          * parameters on a completion queue.
20522          */
20523         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_FLAGS_IS_NQ \
20524                 UINT32_C(0x4)
20525         /*
20526          * Number of completions to aggregate before DMA
20527          * during the normal mode.
20528          */
20529         uint16_t        num_cmpl_dma_aggr;
20530         /*
20531          * Number of completions to aggregate before DMA
20532          * during the interrupt mode.
20533          */
20534         uint16_t        num_cmpl_dma_aggr_during_int;
20535         /*
20536          * Timer in unit of 80-nsec used to aggregate completions before
20537          * DMA during the normal mode (not in interrupt mode).
20538          */
20539         uint16_t        cmpl_aggr_dma_tmr;
20540         /*
20541          * Timer in unit of 80-nsec used to aggregate completions before
20542          * DMA during the interrupt mode.
20543          */
20544         uint16_t        cmpl_aggr_dma_tmr_during_int;
20545         /* Minimum time (in unit of 80-nsec) between two interrupts. */
20546         uint16_t        int_lat_tmr_min;
20547         /*
20548          * Maximum wait time (in unit of 80-nsec) spent aggregating
20549          * cmpls before signaling the interrupt after the
20550          * interrupt is enabled.
20551          */
20552         uint16_t        int_lat_tmr_max;
20553         /*
20554          * Minimum number of completions aggregated before signaling
20555          * an interrupt.
20556          */
20557         uint16_t        num_cmpl_aggr_int;
20558         /*
20559          * Bitfield that indicates which parameters are to be applied. Only
20560          * required when configuring devices with notification queues, and
20561          * used in that case to set certain parameters on completion queues
20562          * and others on notification queues.
20563          */
20564         uint16_t        enables;
20565         /*
20566          * This bit must be '1' for the num_cmpl_dma_aggr field to be
20567          * configured.
20568          */
20569         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_ENABLES_NUM_CMPL_DMA_AGGR \
20570                 UINT32_C(0x1)
20571         /*
20572          * This bit must be '1' for the num_cmpl_dma_aggr_during_int field to be
20573          * configured.
20574          */
20575         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_ENABLES_NUM_CMPL_DMA_AGGR_DURING_INT \
20576                 UINT32_C(0x2)
20577         /*
20578          * This bit must be '1' for the cmpl_aggr_dma_tmr field to be
20579          * configured.
20580          */
20581         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_ENABLES_CMPL_AGGR_DMA_TMR \
20582                 UINT32_C(0x4)
20583         /*
20584          * This bit must be '1' for the int_lat_tmr_min field to be
20585          * configured.
20586          */
20587         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_ENABLES_INT_LAT_TMR_MIN \
20588                 UINT32_C(0x8)
20589         /*
20590          * This bit must be '1' for the int_lat_tmr_max field to be
20591          * configured.
20592          */
20593         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_ENABLES_INT_LAT_TMR_MAX \
20594                 UINT32_C(0x10)
20595         /*
20596          * This bit must be '1' for the num_cmpl_aggr_int field to be
20597          * configured.
20598          */
20599         #define HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_ENABLES_NUM_CMPL_AGGR_INT \
20600                 UINT32_C(0x20)
20601         uint8_t unused_0[4];
20602 } __attribute__((packed));
20603
20604 /* hwrm_ring_cmpl_ring_cfg_aggint_params_output (size:128b/16B) */
20605 struct hwrm_ring_cmpl_ring_cfg_aggint_params_output {
20606         /* The specific error status for the command. */
20607         uint16_t        error_code;
20608         /* The HWRM command request type. */
20609         uint16_t        req_type;
20610         /* The sequence ID from the original command. */
20611         uint16_t        seq_id;
20612         /* The length of the response data in number of bytes. */
20613         uint16_t        resp_len;
20614         uint8_t unused_0[7];
20615         /*
20616          * This field is used in Output records to indicate that the output
20617          * is completely written to RAM.  This field should be read as '1'
20618          * to indicate that the output has been completely written.
20619          * When writing a command completion or response to an internal processor,
20620          * the order of writes has to be such that this field is written last.
20621          */
20622         uint8_t valid;
20623 } __attribute__((packed));
20624
20625 /***********************
20626  * hwrm_ring_grp_alloc *
20627  ***********************/
20628
20629
20630 /* hwrm_ring_grp_alloc_input (size:192b/24B) */
20631 struct hwrm_ring_grp_alloc_input {
20632         /* The HWRM command request type. */
20633         uint16_t        req_type;
20634         /*
20635          * The completion ring to send the completion event on. This should
20636          * be the NQ ID returned from the `nq_alloc` HWRM command.
20637          */
20638         uint16_t        cmpl_ring;
20639         /*
20640          * The sequence ID is used by the driver for tracking multiple
20641          * commands. This ID is treated as opaque data by the firmware and
20642          * the value is returned in the `hwrm_resp_hdr` upon completion.
20643          */
20644         uint16_t        seq_id;
20645         /*
20646          * The target ID of the command:
20647          * * 0x0-0xFFF8 - The function ID
20648          * * 0xFFF8-0xFFFE - Reserved for internal processors
20649          * * 0xFFFF - HWRM
20650          */
20651         uint16_t        target_id;
20652         /*
20653          * A physical address pointer pointing to a host buffer that the
20654          * command's response data will be written. This can be either a host
20655          * physical address (HPA) or a guest physical address (GPA) and must
20656          * point to a physically contiguous block of memory.
20657          */
20658         uint64_t        resp_addr;
20659         /*
20660          * This value identifies the CR associated with the ring
20661          * group.
20662          */
20663         uint16_t        cr;
20664         /*
20665          * This value identifies the main RR associated with the ring
20666          * group.
20667          */
20668         uint16_t        rr;
20669         /*
20670          * This value identifies the aggregation RR associated with
20671          * the ring group.  If this value is 0xFF... (All Fs), then no
20672          * Aggregation ring will be set.
20673          */
20674         uint16_t        ar;
20675         /*
20676          * This value identifies the statistics context associated
20677          * with the ring group.
20678          */
20679         uint16_t        sc;
20680 } __attribute__((packed));
20681
20682 /* hwrm_ring_grp_alloc_output (size:128b/16B) */
20683 struct hwrm_ring_grp_alloc_output {
20684         /* The specific error status for the command. */
20685         uint16_t        error_code;
20686         /* The HWRM command request type. */
20687         uint16_t        req_type;
20688         /* The sequence ID from the original command. */
20689         uint16_t        seq_id;
20690         /* The length of the response data in number of bytes. */
20691         uint16_t        resp_len;
20692         /*
20693          * This is the ring group ID value.  Use this value to program
20694          * the default ring group for the VNIC or as table entries
20695          * in an RSS/COS context.
20696          */
20697         uint32_t        ring_group_id;
20698         uint8_t unused_0[3];
20699         /*
20700          * This field is used in Output records to indicate that the output
20701          * is completely written to RAM.  This field should be read as '1'
20702          * to indicate that the output has been completely written.
20703          * When writing a command completion or response to an internal processor,
20704          * the order of writes has to be such that this field is written last.
20705          */
20706         uint8_t valid;
20707 } __attribute__((packed));
20708
20709 /**********************
20710  * hwrm_ring_grp_free *
20711  **********************/
20712
20713
20714 /* hwrm_ring_grp_free_input (size:192b/24B) */
20715 struct hwrm_ring_grp_free_input {
20716         /* The HWRM command request type. */
20717         uint16_t        req_type;
20718         /*
20719          * The completion ring to send the completion event on. This should
20720          * be the NQ ID returned from the `nq_alloc` HWRM command.
20721          */
20722         uint16_t        cmpl_ring;
20723         /*
20724          * The sequence ID is used by the driver for tracking multiple
20725          * commands. This ID is treated as opaque data by the firmware and
20726          * the value is returned in the `hwrm_resp_hdr` upon completion.
20727          */
20728         uint16_t        seq_id;
20729         /*
20730          * The target ID of the command:
20731          * * 0x0-0xFFF8 - The function ID
20732          * * 0xFFF8-0xFFFE - Reserved for internal processors
20733          * * 0xFFFF - HWRM
20734          */
20735         uint16_t        target_id;
20736         /*
20737          * A physical address pointer pointing to a host buffer that the
20738          * command's response data will be written. This can be either a host
20739          * physical address (HPA) or a guest physical address (GPA) and must
20740          * point to a physically contiguous block of memory.
20741          */
20742         uint64_t        resp_addr;
20743         /* This is the ring group ID value. */
20744         uint32_t        ring_group_id;
20745         uint8_t unused_0[4];
20746 } __attribute__((packed));
20747
20748 /* hwrm_ring_grp_free_output (size:128b/16B) */
20749 struct hwrm_ring_grp_free_output {
20750         /* The specific error status for the command. */
20751         uint16_t        error_code;
20752         /* The HWRM command request type. */
20753         uint16_t        req_type;
20754         /* The sequence ID from the original command. */
20755         uint16_t        seq_id;
20756         /* The length of the response data in number of bytes. */
20757         uint16_t        resp_len;
20758         uint8_t unused_0[7];
20759         /*
20760          * This field is used in Output records to indicate that the output
20761          * is completely written to RAM.  This field should be read as '1'
20762          * to indicate that the output has been completely written.
20763          * When writing a command completion or response to an internal processor,
20764          * the order of writes has to be such that this field is written last.
20765          */
20766         uint8_t valid;
20767 } __attribute__((packed));
20768
20769 /****************************
20770  * hwrm_cfa_l2_filter_alloc *
20771  ****************************/
20772
20773
20774 /* hwrm_cfa_l2_filter_alloc_input (size:768b/96B) */
20775 struct hwrm_cfa_l2_filter_alloc_input {
20776         /* The HWRM command request type. */
20777         uint16_t        req_type;
20778         /*
20779          * The completion ring to send the completion event on. This should
20780          * be the NQ ID returned from the `nq_alloc` HWRM command.
20781          */
20782         uint16_t        cmpl_ring;
20783         /*
20784          * The sequence ID is used by the driver for tracking multiple
20785          * commands. This ID is treated as opaque data by the firmware and
20786          * the value is returned in the `hwrm_resp_hdr` upon completion.
20787          */
20788         uint16_t        seq_id;
20789         /*
20790          * The target ID of the command:
20791          * * 0x0-0xFFF8 - The function ID
20792          * * 0xFFF8-0xFFFE - Reserved for internal processors
20793          * * 0xFFFF - HWRM
20794          */
20795         uint16_t        target_id;
20796         /*
20797          * A physical address pointer pointing to a host buffer that the
20798          * command's response data will be written. This can be either a host
20799          * physical address (HPA) or a guest physical address (GPA) and must
20800          * point to a physically contiguous block of memory.
20801          */
20802         uint64_t        resp_addr;
20803         uint32_t        flags;
20804         /*
20805          * Enumeration denoting the RX, TX type of the resource.
20806          * This enumeration is used for resources that are similar for both
20807          * TX and RX paths of the chip.
20808          */
20809         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH \
20810                 UINT32_C(0x1)
20811         /* tx path */
20812         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_TX \
20813                 UINT32_C(0x0)
20814         /* rx path */
20815         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX \
20816                 UINT32_C(0x1)
20817         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_LAST \
20818                 HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX
20819         /* Setting of this flag indicates the applicability to the loopback path. */
20820         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_LOOPBACK \
20821                 UINT32_C(0x2)
20822         /*
20823          * Setting of this flag indicates drop action. If this flag is not set,
20824          * then it should be considered accept action.
20825          */
20826         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_DROP \
20827                 UINT32_C(0x4)
20828         /*
20829          * If this flag is set, all t_l2_* fields are invalid
20830          * and they should not be specified.
20831          * If this flag is set, then l2_* fields refer to
20832          * fields of outermost L2 header.
20833          */
20834         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST \
20835                 UINT32_C(0x8)
20836         /*
20837          * Enumeration denoting NO_ROCE_L2 to support old drivers.
20838          * New driver L2 for only L2 traffic, ROCE for roce and l2 traffic
20839          */
20840         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_TRAFFIC_MASK \
20841                 UINT32_C(0x30)
20842         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_TRAFFIC_SFT       4
20843         /* To support old drivers */
20844         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_TRAFFIC_NO_ROCE_L2 \
20845                 (UINT32_C(0x0) << 4)
20846         /* Only L2 traffic */
20847         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_TRAFFIC_L2 \
20848                 (UINT32_C(0x1) << 4)
20849         /* Roce & L2 traffic */
20850         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_TRAFFIC_ROCE \
20851                 (UINT32_C(0x2) << 4)
20852         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_TRAFFIC_LAST \
20853                 HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_TRAFFIC_ROCE
20854         uint32_t        enables;
20855         /*
20856          * This bit must be '1' for the l2_addr field to be
20857          * configured.
20858          */
20859         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR \
20860                 UINT32_C(0x1)
20861         /*
20862          * This bit must be '1' for the l2_addr_mask field to be
20863          * configured.
20864          */
20865         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR_MASK \
20866                 UINT32_C(0x2)
20867         /*
20868          * This bit must be '1' for the l2_ovlan field to be
20869          * configured.
20870          */
20871         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_OVLAN \
20872                 UINT32_C(0x4)
20873         /*
20874          * This bit must be '1' for the l2_ovlan_mask field to be
20875          * configured.
20876          */
20877         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_OVLAN_MASK \
20878                 UINT32_C(0x8)
20879         /*
20880          * This bit must be '1' for the l2_ivlan field to be
20881          * configured.
20882          */
20883         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_IVLAN \
20884                 UINT32_C(0x10)
20885         /*
20886          * This bit must be '1' for the l2_ivlan_mask field to be
20887          * configured.
20888          */
20889         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_IVLAN_MASK \
20890                 UINT32_C(0x20)
20891         /*
20892          * This bit must be '1' for the t_l2_addr field to be
20893          * configured.
20894          */
20895         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_T_L2_ADDR \
20896                 UINT32_C(0x40)
20897         /*
20898          * This bit must be '1' for the t_l2_addr_mask field to be
20899          * configured.
20900          */
20901         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_T_L2_ADDR_MASK \
20902                 UINT32_C(0x80)
20903         /*
20904          * This bit must be '1' for the t_l2_ovlan field to be
20905          * configured.
20906          */
20907         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_T_L2_OVLAN \
20908                 UINT32_C(0x100)
20909         /*
20910          * This bit must be '1' for the t_l2_ovlan_mask field to be
20911          * configured.
20912          */
20913         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_T_L2_OVLAN_MASK \
20914                 UINT32_C(0x200)
20915         /*
20916          * This bit must be '1' for the t_l2_ivlan field to be
20917          * configured.
20918          */
20919         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_T_L2_IVLAN \
20920                 UINT32_C(0x400)
20921         /*
20922          * This bit must be '1' for the t_l2_ivlan_mask field to be
20923          * configured.
20924          */
20925         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_T_L2_IVLAN_MASK \
20926                 UINT32_C(0x800)
20927         /*
20928          * This bit must be '1' for the src_type field to be
20929          * configured.
20930          */
20931         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_SRC_TYPE \
20932                 UINT32_C(0x1000)
20933         /*
20934          * This bit must be '1' for the src_id field to be
20935          * configured.
20936          */
20937         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_SRC_ID \
20938                 UINT32_C(0x2000)
20939         /*
20940          * This bit must be '1' for the tunnel_type field to be
20941          * configured.
20942          */
20943         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_TUNNEL_TYPE \
20944                 UINT32_C(0x4000)
20945         /*
20946          * This bit must be '1' for the dst_id field to be
20947          * configured.
20948          */
20949         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_DST_ID \
20950                 UINT32_C(0x8000)
20951         /*
20952          * This bit must be '1' for the mirror_vnic_id field to be
20953          * configured.
20954          */
20955         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_MIRROR_VNIC_ID \
20956                 UINT32_C(0x10000)
20957         /*
20958          * This value sets the match value for the L2 MAC address.
20959          * Destination MAC address for RX path.
20960          * Source MAC address for TX path.
20961          */
20962         uint8_t l2_addr[6];
20963         uint8_t unused_0[2];
20964         /*
20965          * This value sets the mask value for the L2 address.
20966          * A value of 0 will mask the corresponding bit from
20967          * compare.
20968          */
20969         uint8_t l2_addr_mask[6];
20970         /* This value sets VLAN ID value for outer VLAN. */
20971         uint16_t        l2_ovlan;
20972         /*
20973          * This value sets the mask value for the ovlan id.
20974          * A value of 0 will mask the corresponding bit from
20975          * compare.
20976          */
20977         uint16_t        l2_ovlan_mask;
20978         /* This value sets VLAN ID value for inner VLAN. */
20979         uint16_t        l2_ivlan;
20980         /*
20981          * This value sets the mask value for the ivlan id.
20982          * A value of 0 will mask the corresponding bit from
20983          * compare.
20984          */
20985         uint16_t        l2_ivlan_mask;
20986         uint8_t unused_1[2];
20987         /*
20988          * This value sets the match value for the tunnel
20989          * L2 MAC address.
20990          * Destination MAC address for RX path.
20991          * Source MAC address for TX path.
20992          */
20993         uint8_t t_l2_addr[6];
20994         uint8_t unused_2[2];
20995         /*
20996          * This value sets the mask value for the tunnel L2
20997          * address.
20998          * A value of 0 will mask the corresponding bit from
20999          * compare.
21000          */
21001         uint8_t t_l2_addr_mask[6];
21002         /* This value sets VLAN ID value for tunnel outer VLAN. */
21003         uint16_t        t_l2_ovlan;
21004         /*
21005          * This value sets the mask value for the tunnel ovlan id.
21006          * A value of 0 will mask the corresponding bit from
21007          * compare.
21008          */
21009         uint16_t        t_l2_ovlan_mask;
21010         /* This value sets VLAN ID value for tunnel inner VLAN. */
21011         uint16_t        t_l2_ivlan;
21012         /*
21013          * This value sets the mask value for the tunnel ivlan id.
21014          * A value of 0 will mask the corresponding bit from
21015          * compare.
21016          */
21017         uint16_t        t_l2_ivlan_mask;
21018         /* This value identifies the type of source of the packet. */
21019         uint8_t src_type;
21020         /* Network port */
21021         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_NPORT UINT32_C(0x0)
21022         /* Physical function */
21023         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_PF    UINT32_C(0x1)
21024         /* Virtual function */
21025         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_VF    UINT32_C(0x2)
21026         /* Virtual NIC of a function */
21027         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_VNIC  UINT32_C(0x3)
21028         /* Embedded processor for CFA management */
21029         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_KONG  UINT32_C(0x4)
21030         /* Embedded processor for OOB management */
21031         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_APE   UINT32_C(0x5)
21032         /* Embedded processor for RoCE */
21033         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_BONO  UINT32_C(0x6)
21034         /* Embedded processor for network proxy functions */
21035         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_TANG  UINT32_C(0x7)
21036         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_LAST \
21037                 HWRM_CFA_L2_FILTER_ALLOC_INPUT_SRC_TYPE_TANG
21038         uint8_t unused_3;
21039         /*
21040          * This value is the id of the source.
21041          * For a network port, it represents port_id.
21042          * For a physical function, it represents fid.
21043          * For a virtual function, it represents vf_id.
21044          * For a vnic, it represents vnic_id.
21045          * For embedded processors, this id is not valid.
21046          *
21047          * Notes:
21048          * 1. The function ID is implied if it src_id is
21049          *    not provided for a src_type that is either
21050          */
21051         uint32_t        src_id;
21052         /* Tunnel Type. */
21053         uint8_t tunnel_type;
21054         /* Non-tunnel */
21055         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_NONTUNNEL \
21056                 UINT32_C(0x0)
21057         /* Virtual eXtensible Local Area Network (VXLAN) */
21058         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_VXLAN \
21059                 UINT32_C(0x1)
21060         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
21061         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_NVGRE \
21062                 UINT32_C(0x2)
21063         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
21064         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_L2GRE \
21065                 UINT32_C(0x3)
21066         /* IP in IP */
21067         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_IPIP \
21068                 UINT32_C(0x4)
21069         /* Generic Network Virtualization Encapsulation (Geneve) */
21070         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_GENEVE \
21071                 UINT32_C(0x5)
21072         /* Multi-Protocol Lable Switching (MPLS) */
21073         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_MPLS \
21074                 UINT32_C(0x6)
21075         /* Stateless Transport Tunnel (STT) */
21076         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_STT \
21077                 UINT32_C(0x7)
21078         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
21079         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_IPGRE \
21080                 UINT32_C(0x8)
21081         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
21082         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_VXLAN_V4 \
21083                 UINT32_C(0x9)
21084         /* Any tunneled traffic */
21085         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL \
21086                 UINT32_C(0xff)
21087         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_LAST \
21088                 HWRM_CFA_L2_FILTER_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL
21089         uint8_t unused_4;
21090         /*
21091          * If set, this value shall represent the
21092          * Logical VNIC ID of the destination VNIC for the RX
21093          * path and network port id of the destination port for
21094          * the TX path.
21095          */
21096         uint16_t        dst_id;
21097         /*
21098          * Logical VNIC ID of the VNIC where traffic is
21099          * mirrored.
21100          */
21101         uint16_t        mirror_vnic_id;
21102         /*
21103          * This hint is provided to help in placing
21104          * the filter in the filter table.
21105          */
21106         uint8_t pri_hint;
21107         /* No preference */
21108         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_PRI_HINT_NO_PREFER \
21109                 UINT32_C(0x0)
21110         /* Above the given filter */
21111         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_PRI_HINT_ABOVE_FILTER \
21112                 UINT32_C(0x1)
21113         /* Below the given filter */
21114         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_PRI_HINT_BELOW_FILTER \
21115                 UINT32_C(0x2)
21116         /* As high as possible */
21117         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_PRI_HINT_MAX \
21118                 UINT32_C(0x3)
21119         /* As low as possible */
21120         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_PRI_HINT_MIN \
21121                 UINT32_C(0x4)
21122         #define HWRM_CFA_L2_FILTER_ALLOC_INPUT_PRI_HINT_LAST \
21123                 HWRM_CFA_L2_FILTER_ALLOC_INPUT_PRI_HINT_MIN
21124         uint8_t unused_5;
21125         uint32_t        unused_6;
21126         /*
21127          * This is the ID of the filter that goes along with
21128          * the pri_hint.
21129          *
21130          * This field is valid only for the following values.
21131          * 1 - Above the given filter
21132          * 2 - Below the given filter
21133          */
21134         uint64_t        l2_filter_id_hint;
21135 } __attribute__((packed));
21136
21137 /* hwrm_cfa_l2_filter_alloc_output (size:192b/24B) */
21138 struct hwrm_cfa_l2_filter_alloc_output {
21139         /* The specific error status for the command. */
21140         uint16_t        error_code;
21141         /* The HWRM command request type. */
21142         uint16_t        req_type;
21143         /* The sequence ID from the original command. */
21144         uint16_t        seq_id;
21145         /* The length of the response data in number of bytes. */
21146         uint16_t        resp_len;
21147         /*
21148          * This value identifies a set of CFA data structures used for an L2
21149          * context.
21150          */
21151         uint64_t        l2_filter_id;
21152         /*
21153          * This is the ID of the flow associated with this
21154          * filter.
21155          * This value shall be used to match and associate the
21156          * flow identifier returned in completion records.
21157          * A value of 0xFFFFFFFF shall indicate no flow id.
21158          */
21159         uint32_t        flow_id;
21160         uint8_t unused_0[3];
21161         /*
21162          * This field is used in Output records to indicate that the output
21163          * is completely written to RAM.  This field should be read as '1'
21164          * to indicate that the output has been completely written.
21165          * When writing a command completion or response to an internal processor,
21166          * the order of writes has to be such that this field is written last.
21167          */
21168         uint8_t valid;
21169 } __attribute__((packed));
21170
21171 /***************************
21172  * hwrm_cfa_l2_filter_free *
21173  ***************************/
21174
21175
21176 /* hwrm_cfa_l2_filter_free_input (size:192b/24B) */
21177 struct hwrm_cfa_l2_filter_free_input {
21178         /* The HWRM command request type. */
21179         uint16_t        req_type;
21180         /*
21181          * The completion ring to send the completion event on. This should
21182          * be the NQ ID returned from the `nq_alloc` HWRM command.
21183          */
21184         uint16_t        cmpl_ring;
21185         /*
21186          * The sequence ID is used by the driver for tracking multiple
21187          * commands. This ID is treated as opaque data by the firmware and
21188          * the value is returned in the `hwrm_resp_hdr` upon completion.
21189          */
21190         uint16_t        seq_id;
21191         /*
21192          * The target ID of the command:
21193          * * 0x0-0xFFF8 - The function ID
21194          * * 0xFFF8-0xFFFE - Reserved for internal processors
21195          * * 0xFFFF - HWRM
21196          */
21197         uint16_t        target_id;
21198         /*
21199          * A physical address pointer pointing to a host buffer that the
21200          * command's response data will be written. This can be either a host
21201          * physical address (HPA) or a guest physical address (GPA) and must
21202          * point to a physically contiguous block of memory.
21203          */
21204         uint64_t        resp_addr;
21205         /*
21206          * This value identifies a set of CFA data structures used for an L2
21207          * context.
21208          */
21209         uint64_t        l2_filter_id;
21210 } __attribute__((packed));
21211
21212 /* hwrm_cfa_l2_filter_free_output (size:128b/16B) */
21213 struct hwrm_cfa_l2_filter_free_output {
21214         /* The specific error status for the command. */
21215         uint16_t        error_code;
21216         /* The HWRM command request type. */
21217         uint16_t        req_type;
21218         /* The sequence ID from the original command. */
21219         uint16_t        seq_id;
21220         /* The length of the response data in number of bytes. */
21221         uint16_t        resp_len;
21222         uint8_t unused_0[7];
21223         /*
21224          * This field is used in Output records to indicate that the output
21225          * is completely written to RAM.  This field should be read as '1'
21226          * to indicate that the output has been completely written.
21227          * When writing a command completion or response to an internal processor,
21228          * the order of writes has to be such that this field is written last.
21229          */
21230         uint8_t valid;
21231 } __attribute__((packed));
21232
21233 /**************************
21234  * hwrm_cfa_l2_filter_cfg *
21235  **************************/
21236
21237
21238 /* hwrm_cfa_l2_filter_cfg_input (size:320b/40B) */
21239 struct hwrm_cfa_l2_filter_cfg_input {
21240         /* The HWRM command request type. */
21241         uint16_t        req_type;
21242         /*
21243          * The completion ring to send the completion event on. This should
21244          * be the NQ ID returned from the `nq_alloc` HWRM command.
21245          */
21246         uint16_t        cmpl_ring;
21247         /*
21248          * The sequence ID is used by the driver for tracking multiple
21249          * commands. This ID is treated as opaque data by the firmware and
21250          * the value is returned in the `hwrm_resp_hdr` upon completion.
21251          */
21252         uint16_t        seq_id;
21253         /*
21254          * The target ID of the command:
21255          * * 0x0-0xFFF8 - The function ID
21256          * * 0xFFF8-0xFFFE - Reserved for internal processors
21257          * * 0xFFFF - HWRM
21258          */
21259         uint16_t        target_id;
21260         /*
21261          * A physical address pointer pointing to a host buffer that the
21262          * command's response data will be written. This can be either a host
21263          * physical address (HPA) or a guest physical address (GPA) and must
21264          * point to a physically contiguous block of memory.
21265          */
21266         uint64_t        resp_addr;
21267         uint32_t        flags;
21268         /*
21269          * Enumeration denoting the RX, TX type of the resource.
21270          * This enumeration is used for resources that are similar for both
21271          * TX and RX paths of the chip.
21272          */
21273         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_PATH \
21274                 UINT32_C(0x1)
21275         /* tx path */
21276         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_PATH_TX \
21277                 UINT32_C(0x0)
21278         /* rx path */
21279         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_PATH_RX \
21280                 UINT32_C(0x1)
21281         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_PATH_LAST \
21282                 HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_PATH_RX
21283         /*
21284          * Setting of this flag indicates drop action. If this flag is not set,
21285          * then it should be considered accept action.
21286          */
21287         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_DROP \
21288                 UINT32_C(0x2)
21289         /*
21290          * Enumeration denoting NO_ROCE_L2 to support old drivers.
21291          * New driver L2 for only L2 traffic, ROCE for roce and l2 traffic
21292          */
21293         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_TRAFFIC_MASK \
21294                 UINT32_C(0xc)
21295         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_TRAFFIC_SFT       2
21296         /* To support old drivers */
21297         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_TRAFFIC_NO_ROCE_L2 \
21298                 (UINT32_C(0x0) << 2)
21299         /* Only L2 traffic */
21300         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_TRAFFIC_L2 \
21301                 (UINT32_C(0x1) << 2)
21302         /* Roce & L2 traffic */
21303         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_TRAFFIC_ROCE \
21304                 (UINT32_C(0x2) << 2)
21305         #define HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_TRAFFIC_LAST \
21306                 HWRM_CFA_L2_FILTER_CFG_INPUT_FLAGS_TRAFFIC_ROCE
21307         uint32_t        enables;
21308         /*
21309          * This bit must be '1' for the dst_id field to be
21310          * configured.
21311          */
21312         #define HWRM_CFA_L2_FILTER_CFG_INPUT_ENABLES_DST_ID \
21313                 UINT32_C(0x1)
21314         /*
21315          * This bit must be '1' for the new_mirror_vnic_id field to be
21316          * configured.
21317          */
21318         #define HWRM_CFA_L2_FILTER_CFG_INPUT_ENABLES_NEW_MIRROR_VNIC_ID \
21319                 UINT32_C(0x2)
21320         /*
21321          * This value identifies a set of CFA data structures used for an L2
21322          * context.
21323          */
21324         uint64_t        l2_filter_id;
21325         /*
21326          * If set, this value shall represent the
21327          * Logical VNIC ID of the destination VNIC for the RX
21328          * path and network port id of the destination port for
21329          * the TX path.
21330          */
21331         uint32_t        dst_id;
21332         /*
21333          * New Logical VNIC ID of the VNIC where traffic is
21334          * mirrored.
21335          */
21336         uint32_t        new_mirror_vnic_id;
21337 } __attribute__((packed));
21338
21339 /* hwrm_cfa_l2_filter_cfg_output (size:128b/16B) */
21340 struct hwrm_cfa_l2_filter_cfg_output {
21341         /* The specific error status for the command. */
21342         uint16_t        error_code;
21343         /* The HWRM command request type. */
21344         uint16_t        req_type;
21345         /* The sequence ID from the original command. */
21346         uint16_t        seq_id;
21347         /* The length of the response data in number of bytes. */
21348         uint16_t        resp_len;
21349         uint8_t unused_0[7];
21350         /*
21351          * This field is used in Output records to indicate that the output
21352          * is completely written to RAM.  This field should be read as '1'
21353          * to indicate that the output has been completely written.
21354          * When writing a command completion or response to an internal processor,
21355          * the order of writes has to be such that this field is written last.
21356          */
21357         uint8_t valid;
21358 } __attribute__((packed));
21359
21360 /***************************
21361  * hwrm_cfa_l2_set_rx_mask *
21362  ***************************/
21363
21364
21365 /* hwrm_cfa_l2_set_rx_mask_input (size:448b/56B) */
21366 struct hwrm_cfa_l2_set_rx_mask_input {
21367         /* The HWRM command request type. */
21368         uint16_t        req_type;
21369         /*
21370          * The completion ring to send the completion event on. This should
21371          * be the NQ ID returned from the `nq_alloc` HWRM command.
21372          */
21373         uint16_t        cmpl_ring;
21374         /*
21375          * The sequence ID is used by the driver for tracking multiple
21376          * commands. This ID is treated as opaque data by the firmware and
21377          * the value is returned in the `hwrm_resp_hdr` upon completion.
21378          */
21379         uint16_t        seq_id;
21380         /*
21381          * The target ID of the command:
21382          * * 0x0-0xFFF8 - The function ID
21383          * * 0xFFF8-0xFFFE - Reserved for internal processors
21384          * * 0xFFFF - HWRM
21385          */
21386         uint16_t        target_id;
21387         /*
21388          * A physical address pointer pointing to a host buffer that the
21389          * command's response data will be written. This can be either a host
21390          * physical address (HPA) or a guest physical address (GPA) and must
21391          * point to a physically contiguous block of memory.
21392          */
21393         uint64_t        resp_addr;
21394         /* VNIC ID */
21395         uint32_t        vnic_id;
21396         uint32_t        mask;
21397         /*
21398          * When this bit is '1', the function is requested to accept
21399          * multi-cast packets specified by the multicast addr table.
21400          */
21401         #define HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_MCAST \
21402                 UINT32_C(0x2)
21403         /*
21404          * When this bit is '1', the function is requested to accept
21405          * all multi-cast packets.
21406          */
21407         #define HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ALL_MCAST \
21408                 UINT32_C(0x4)
21409         /*
21410          * When this bit is '1', the function is requested to accept
21411          * broadcast packets.
21412          */
21413         #define HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_BCAST \
21414                 UINT32_C(0x8)
21415         /*
21416          * When this bit is '1', the function is requested to be
21417          * put in the promiscuous mode.
21418          *
21419          * The HWRM should accept any function to set up
21420          * promiscuous mode.
21421          *
21422          * The HWRM shall follow the semantics below for the
21423          * promiscuous mode support.
21424          * # When partitioning is not enabled on a port
21425          * (i.e. single PF on the port), then the PF shall
21426          * be allowed to be in the promiscuous mode. When the
21427          * PF is in the promiscuous mode, then it shall
21428          * receive all host bound traffic on that port.
21429          * # When partitioning is enabled on a port
21430          * (i.e. multiple PFs per port) and a PF on that
21431          * port is in the promiscuous mode, then the PF
21432          * receives all traffic within that partition as
21433          * identified by a unique identifier for the
21434          * PF (e.g. S-Tag). If a unique outer VLAN
21435          * for the PF is specified, then the setting of
21436          * promiscuous mode on that PF shall result in the
21437          * PF receiving all host bound traffic with matching
21438          * outer VLAN.
21439          * # A VF shall can be set in the promiscuous mode.
21440          * In the promiscuous mode, the VF does not receive any
21441          * traffic unless a unique outer VLAN for the
21442          * VF is specified. If a unique outer VLAN
21443          * for the VF is specified, then the setting of
21444          * promiscuous mode on that VF shall result in the
21445          * VF receiving all host bound traffic with the
21446          * matching outer VLAN.
21447          * # The HWRM shall allow the setting of promiscuous
21448          * mode on a function independently from the
21449          * promiscuous mode settings on other functions.
21450          */
21451         #define HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_PROMISCUOUS \
21452                 UINT32_C(0x10)
21453         /*
21454          * If this flag is set, the corresponding RX
21455          * filters shall be set up to cover multicast/broadcast
21456          * filters for the outermost Layer 2 destination MAC
21457          * address field.
21458          */
21459         #define HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_OUTERMOST \
21460                 UINT32_C(0x20)
21461         /*
21462          * If this flag is set, the corresponding RX
21463          * filters shall be set up to cover multicast/broadcast
21464          * filters for the VLAN-tagged packets that match the
21465          * TPID and VID fields of VLAN tags in the VLAN tag
21466          * table specified in this command.
21467          */
21468         #define HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_VLANONLY \
21469                 UINT32_C(0x40)
21470         /*
21471          * If this flag is set, the corresponding RX
21472          * filters shall be set up to cover multicast/broadcast
21473          * filters for non-VLAN tagged packets and VLAN-tagged
21474          * packets that match the TPID and VID fields of VLAN
21475          * tags in the VLAN tag table specified in this command.
21476          */
21477         #define HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_VLAN_NONVLAN \
21478                 UINT32_C(0x80)
21479         /*
21480          * If this flag is set, the corresponding RX
21481          * filters shall be set up to cover multicast/broadcast
21482          * filters for non-VLAN tagged packets and VLAN-tagged
21483          * packets matching any VLAN tag.
21484          *
21485          * If this flag is set, then the HWRM shall ignore
21486          * VLAN tags specified in vlan_tag_tbl.
21487          *
21488          * If none of vlanonly, vlan_nonvlan, and anyvlan_nonvlan
21489          * flags is set, then the HWRM shall ignore
21490          * VLAN tags specified in vlan_tag_tbl.
21491          *
21492          * The HWRM client shall set at most one flag out of
21493          * vlanonly, vlan_nonvlan, and anyvlan_nonvlan.
21494          */
21495         #define HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ANYVLAN_NONVLAN \
21496                 UINT32_C(0x100)
21497         /* This is the address for mcast address tbl. */
21498         uint64_t        mc_tbl_addr;
21499         /*
21500          * This value indicates how many entries in mc_tbl are valid.
21501          * Each entry is 6 bytes.
21502          */
21503         uint32_t        num_mc_entries;
21504         uint8_t unused_0[4];
21505         /*
21506          * This is the address for VLAN tag table.
21507          * Each VLAN entry in the table is 4 bytes of a VLAN tag
21508          * including TPID, PCP, DEI, and VID fields in network byte
21509          * order.
21510          */
21511         uint64_t        vlan_tag_tbl_addr;
21512         /*
21513          * This value indicates how many entries in vlan_tag_tbl are
21514          * valid. Each entry is 4 bytes.
21515          */
21516         uint32_t        num_vlan_tags;
21517         uint8_t unused_1[4];
21518 } __attribute__((packed));
21519
21520 /* hwrm_cfa_l2_set_rx_mask_output (size:128b/16B) */
21521 struct hwrm_cfa_l2_set_rx_mask_output {
21522         /* The specific error status for the command. */
21523         uint16_t        error_code;
21524         /* The HWRM command request type. */
21525         uint16_t        req_type;
21526         /* The sequence ID from the original command. */
21527         uint16_t        seq_id;
21528         /* The length of the response data in number of bytes. */
21529         uint16_t        resp_len;
21530         uint8_t unused_0[7];
21531         /*
21532          * This field is used in Output records to indicate that the output
21533          * is completely written to RAM.  This field should be read as '1'
21534          * to indicate that the output has been completely written.
21535          * When writing a command completion or response to an internal processor,
21536          * the order of writes has to be such that this field is written last.
21537          */
21538         uint8_t valid;
21539 } __attribute__((packed));
21540
21541 /* hwrm_cfa_l2_set_rx_mask_cmd_err (size:64b/8B) */
21542 struct hwrm_cfa_l2_set_rx_mask_cmd_err {
21543         /*
21544          * command specific error codes that goes to
21545          * the cmd_err field in Common HWRM Error Response.
21546          */
21547         uint8_t code;
21548         /* Unknown error */
21549         #define HWRM_CFA_L2_SET_RX_MASK_CMD_ERR_CODE_UNKNOWN \
21550                 UINT32_C(0x0)
21551         /* Unable to complete operation due to conflict with Ntuple Filter */
21552         #define HWRM_CFA_L2_SET_RX_MASK_CMD_ERR_CODE_NTUPLE_FILTER_CONFLICT_ERR \
21553                 UINT32_C(0x1)
21554         #define HWRM_CFA_L2_SET_RX_MASK_CMD_ERR_CODE_LAST \
21555                 HWRM_CFA_L2_SET_RX_MASK_CMD_ERR_CODE_NTUPLE_FILTER_CONFLICT_ERR
21556         uint8_t unused_0[7];
21557 } __attribute__((packed));
21558
21559 /*******************************
21560  * hwrm_cfa_vlan_antispoof_cfg *
21561  *******************************/
21562
21563
21564 /* hwrm_cfa_vlan_antispoof_cfg_input (size:256b/32B) */
21565 struct hwrm_cfa_vlan_antispoof_cfg_input {
21566         /* The HWRM command request type. */
21567         uint16_t        req_type;
21568         /*
21569          * The completion ring to send the completion event on. This should
21570          * be the NQ ID returned from the `nq_alloc` HWRM command.
21571          */
21572         uint16_t        cmpl_ring;
21573         /*
21574          * The sequence ID is used by the driver for tracking multiple
21575          * commands. This ID is treated as opaque data by the firmware and
21576          * the value is returned in the `hwrm_resp_hdr` upon completion.
21577          */
21578         uint16_t        seq_id;
21579         /*
21580          * The target ID of the command:
21581          * * 0x0-0xFFF8 - The function ID
21582          * * 0xFFF8-0xFFFE - Reserved for internal processors
21583          * * 0xFFFF - HWRM
21584          */
21585         uint16_t        target_id;
21586         /*
21587          * A physical address pointer pointing to a host buffer that the
21588          * command's response data will be written. This can be either a host
21589          * physical address (HPA) or a guest physical address (GPA) and must
21590          * point to a physically contiguous block of memory.
21591          */
21592         uint64_t        resp_addr;
21593         /*
21594          * Function ID of the function that is being configured.
21595          * Only valid for a VF FID configured by the PF.
21596          */
21597         uint16_t        fid;
21598         uint8_t unused_0[2];
21599         /* Number of VLAN entries in the vlan_tag_mask_tbl. */
21600         uint32_t        num_vlan_entries;
21601         /*
21602          * The vlan_tag_mask_tbl_addr is the DMA address of the VLAN
21603          * antispoof table. Each table entry contains the 16-bit TPID
21604          * (0x8100 or 0x88a8 only), 16-bit VLAN ID, and a 16-bit mask,
21605          * all in network order to match hwrm_cfa_l2_set_rx_mask.
21606          * For an individual VLAN entry, the mask value should be 0xfff
21607          * for the 12-bit VLAN ID.
21608          */
21609         uint64_t        vlan_tag_mask_tbl_addr;
21610 } __attribute__((packed));
21611
21612 /* hwrm_cfa_vlan_antispoof_cfg_output (size:128b/16B) */
21613 struct hwrm_cfa_vlan_antispoof_cfg_output {
21614         /* The specific error status for the command. */
21615         uint16_t        error_code;
21616         /* The HWRM command request type. */
21617         uint16_t        req_type;
21618         /* The sequence ID from the original command. */
21619         uint16_t        seq_id;
21620         /* The length of the response data in number of bytes. */
21621         uint16_t        resp_len;
21622         uint8_t unused_0[7];
21623         /*
21624          * This field is used in Output records to indicate that the output
21625          * is completely written to RAM.  This field should be read as '1'
21626          * to indicate that the output has been completely written.
21627          * When writing a command completion or response to an internal processor,
21628          * the order of writes has to be such that this field is written last.
21629          */
21630         uint8_t valid;
21631 } __attribute__((packed));
21632
21633 /********************************
21634  * hwrm_cfa_vlan_antispoof_qcfg *
21635  ********************************/
21636
21637
21638 /* hwrm_cfa_vlan_antispoof_qcfg_input (size:256b/32B) */
21639 struct hwrm_cfa_vlan_antispoof_qcfg_input {
21640         /* The HWRM command request type. */
21641         uint16_t        req_type;
21642         /*
21643          * The completion ring to send the completion event on. This should
21644          * be the NQ ID returned from the `nq_alloc` HWRM command.
21645          */
21646         uint16_t        cmpl_ring;
21647         /*
21648          * The sequence ID is used by the driver for tracking multiple
21649          * commands. This ID is treated as opaque data by the firmware and
21650          * the value is returned in the `hwrm_resp_hdr` upon completion.
21651          */
21652         uint16_t        seq_id;
21653         /*
21654          * The target ID of the command:
21655          * * 0x0-0xFFF8 - The function ID
21656          * * 0xFFF8-0xFFFE - Reserved for internal processors
21657          * * 0xFFFF - HWRM
21658          */
21659         uint16_t        target_id;
21660         /*
21661          * A physical address pointer pointing to a host buffer that the
21662          * command's response data will be written. This can be either a host
21663          * physical address (HPA) or a guest physical address (GPA) and must
21664          * point to a physically contiguous block of memory.
21665          */
21666         uint64_t        resp_addr;
21667         /*
21668          * Function ID of the function that is being queried.
21669          * Only valid for a VF FID queried by the PF.
21670          */
21671         uint16_t        fid;
21672         uint8_t unused_0[2];
21673         /*
21674          * Maximum number of VLAN entries the firmware is allowed to DMA
21675          * to vlan_tag_mask_tbl.
21676          */
21677         uint32_t        max_vlan_entries;
21678         /*
21679          * The vlan_tag_mask_tbl_addr is the DMA address of the VLAN
21680          * antispoof table to which firmware will DMA to. Each table
21681          * entry will contain the 16-bit TPID (0x8100 or 0x88a8 only),
21682          * 16-bit VLAN ID, and a 16-bit mask, all in network order to
21683          * match hwrm_cfa_l2_set_rx_mask. For an individual VLAN entry,
21684          * the mask value should be 0xfff for the 12-bit VLAN ID.
21685          */
21686         uint64_t        vlan_tag_mask_tbl_addr;
21687 } __attribute__((packed));
21688
21689 /* hwrm_cfa_vlan_antispoof_qcfg_output (size:128b/16B) */
21690 struct hwrm_cfa_vlan_antispoof_qcfg_output {
21691         /* The specific error status for the command. */
21692         uint16_t        error_code;
21693         /* The HWRM command request type. */
21694         uint16_t        req_type;
21695         /* The sequence ID from the original command. */
21696         uint16_t        seq_id;
21697         /* The length of the response data in number of bytes. */
21698         uint16_t        resp_len;
21699         /* Number of valid entries DMAd by firmware to vlan_tag_mask_tbl. */
21700         uint32_t        num_vlan_entries;
21701         uint8_t unused_0[3];
21702         /*
21703          * This field is used in Output records to indicate that the output
21704          * is completely written to RAM.  This field should be read as '1'
21705          * to indicate that the output has been completely written.
21706          * When writing a command completion or response to an internal processor,
21707          * the order of writes has to be such that this field is written last.
21708          */
21709         uint8_t valid;
21710 } __attribute__((packed));
21711
21712 /********************************
21713  * hwrm_cfa_tunnel_filter_alloc *
21714  ********************************/
21715
21716
21717 /* hwrm_cfa_tunnel_filter_alloc_input (size:704b/88B) */
21718 struct hwrm_cfa_tunnel_filter_alloc_input {
21719         /* The HWRM command request type. */
21720         uint16_t        req_type;
21721         /*
21722          * The completion ring to send the completion event on. This should
21723          * be the NQ ID returned from the `nq_alloc` HWRM command.
21724          */
21725         uint16_t        cmpl_ring;
21726         /*
21727          * The sequence ID is used by the driver for tracking multiple
21728          * commands. This ID is treated as opaque data by the firmware and
21729          * the value is returned in the `hwrm_resp_hdr` upon completion.
21730          */
21731         uint16_t        seq_id;
21732         /*
21733          * The target ID of the command:
21734          * * 0x0-0xFFF8 - The function ID
21735          * * 0xFFF8-0xFFFE - Reserved for internal processors
21736          * * 0xFFFF - HWRM
21737          */
21738         uint16_t        target_id;
21739         /*
21740          * A physical address pointer pointing to a host buffer that the
21741          * command's response data will be written. This can be either a host
21742          * physical address (HPA) or a guest physical address (GPA) and must
21743          * point to a physically contiguous block of memory.
21744          */
21745         uint64_t        resp_addr;
21746         uint32_t        flags;
21747         /* Setting of this flag indicates the applicability to the loopback path. */
21748         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_FLAGS_LOOPBACK \
21749                 UINT32_C(0x1)
21750         uint32_t        enables;
21751         /*
21752          * This bit must be '1' for the l2_filter_id field to be
21753          * configured.
21754          */
21755         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_L2_FILTER_ID \
21756                 UINT32_C(0x1)
21757         /*
21758          * This bit must be '1' for the l2_addr field to be
21759          * configured.
21760          */
21761         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR \
21762                 UINT32_C(0x2)
21763         /*
21764          * This bit must be '1' for the l2_ivlan field to be
21765          * configured.
21766          */
21767         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_L2_IVLAN \
21768                 UINT32_C(0x4)
21769         /*
21770          * This bit must be '1' for the l3_addr field to be
21771          * configured.
21772          */
21773         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_L3_ADDR \
21774                 UINT32_C(0x8)
21775         /*
21776          * This bit must be '1' for the l3_addr_type field to be
21777          * configured.
21778          */
21779         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_L3_ADDR_TYPE \
21780                 UINT32_C(0x10)
21781         /*
21782          * This bit must be '1' for the t_l3_addr_type field to be
21783          * configured.
21784          */
21785         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_T_L3_ADDR_TYPE \
21786                 UINT32_C(0x20)
21787         /*
21788          * This bit must be '1' for the t_l3_addr field to be
21789          * configured.
21790          */
21791         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_T_L3_ADDR \
21792                 UINT32_C(0x40)
21793         /*
21794          * This bit must be '1' for the tunnel_type field to be
21795          * configured.
21796          */
21797         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_TUNNEL_TYPE \
21798                 UINT32_C(0x80)
21799         /*
21800          * This bit must be '1' for the vni field to be
21801          * configured.
21802          */
21803         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_VNI \
21804                 UINT32_C(0x100)
21805         /*
21806          * This bit must be '1' for the dst_vnic_id field to be
21807          * configured.
21808          */
21809         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_DST_VNIC_ID \
21810                 UINT32_C(0x200)
21811         /*
21812          * This bit must be '1' for the mirror_vnic_id field to be
21813          * configured.
21814          */
21815         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_ENABLES_MIRROR_VNIC_ID \
21816                 UINT32_C(0x400)
21817         /*
21818          * This value identifies a set of CFA data structures used for an L2
21819          * context.
21820          */
21821         uint64_t        l2_filter_id;
21822         /*
21823          * This value sets the match value for the inner L2
21824          * MAC address.
21825          * Destination MAC address for RX path.
21826          * Source MAC address for TX path.
21827          */
21828         uint8_t l2_addr[6];
21829         /*
21830          * This value sets VLAN ID value for inner VLAN.
21831          * Only 12-bits of VLAN ID are used in setting the filter.
21832          */
21833         uint16_t        l2_ivlan;
21834         /*
21835          * The value of inner destination IP address to be used in filtering.
21836          * For IPv4, first four bytes represent the IP address.
21837          */
21838         uint32_t        l3_addr[4];
21839         /*
21840          * The value of tunnel destination IP address to be used in filtering.
21841          * For IPv4, first four bytes represent the IP address.
21842          */
21843         uint32_t        t_l3_addr[4];
21844         /*
21845          * This value indicates the type of inner IP address.
21846          * 4 - IPv4
21847          * 6 - IPv6
21848          * All others are invalid.
21849          */
21850         uint8_t l3_addr_type;
21851         /*
21852          * This value indicates the type of tunnel IP address.
21853          * 4 - IPv4
21854          * 6 - IPv6
21855          * All others are invalid.
21856          */
21857         uint8_t t_l3_addr_type;
21858         /* Tunnel Type. */
21859         uint8_t tunnel_type;
21860         /* Non-tunnel */
21861         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_NONTUNNEL \
21862                 UINT32_C(0x0)
21863         /* Virtual eXtensible Local Area Network (VXLAN) */
21864         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_VXLAN \
21865                 UINT32_C(0x1)
21866         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
21867         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_NVGRE \
21868                 UINT32_C(0x2)
21869         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
21870         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_L2GRE \
21871                 UINT32_C(0x3)
21872         /* IP in IP */
21873         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_IPIP \
21874                 UINT32_C(0x4)
21875         /* Generic Network Virtualization Encapsulation (Geneve) */
21876         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_GENEVE \
21877                 UINT32_C(0x5)
21878         /* Multi-Protocol Lable Switching (MPLS) */
21879         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_MPLS \
21880                 UINT32_C(0x6)
21881         /* Stateless Transport Tunnel (STT) */
21882         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_STT \
21883                 UINT32_C(0x7)
21884         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
21885         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_IPGRE \
21886                 UINT32_C(0x8)
21887         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
21888         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_VXLAN_V4 \
21889                 UINT32_C(0x9)
21890         /* Any tunneled traffic */
21891         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL \
21892                 UINT32_C(0xff)
21893         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_LAST \
21894                 HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL
21895         /*
21896          * tunnel_flags allows the user to indicate the tunnel tag detection
21897          * for the tunnel type specified in tunnel_type.
21898          */
21899         uint8_t tunnel_flags;
21900         /*
21901          * If the tunnel_type is geneve, then this bit indicates if we
21902          * need to match the geneve OAM packet.
21903          * If the tunnel_type is nvgre or gre, then this bit indicates if
21904          * we need to detect checksum present bit in geneve header.
21905          * If the tunnel_type is mpls, then this bit indicates if we need
21906          * to match mpls packet with explicit IPV4/IPV6 null header.
21907          */
21908         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_FLAGS_TUN_FLAGS_OAM_CHECKSUM_EXPLHDR \
21909                 UINT32_C(0x1)
21910         /*
21911          * If the tunnel_type is geneve, then this bit indicates if we
21912          * need to detect the critical option bit set in the oam packet.
21913          * If the tunnel_type is nvgre or gre, then this bit indicates
21914          * if we need to match nvgre packets with key present bit set in
21915          * gre header.
21916          * If the tunnel_type is mpls, then this bit indicates if we
21917          * need to match mpls packet with S bit from inner/second label.
21918          */
21919         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_FLAGS_TUN_FLAGS_CRITICAL_OPT_S1 \
21920                 UINT32_C(0x2)
21921         /*
21922          * If the tunnel_type is geneve, then this bit indicates if we
21923          * need to match geneve packet with extended header bit set in
21924          * geneve header.
21925          * If the tunnel_type is nvgre or gre, then this bit indicates
21926          * if we need to match nvgre packets with sequence number
21927          * present bit set in gre header.
21928          * If the tunnel_type is mpls, then this bit indicates if we
21929          * need to match mpls packet with S bit from out/first label.
21930          */
21931         #define HWRM_CFA_TUNNEL_FILTER_ALLOC_INPUT_TUNNEL_FLAGS_TUN_FLAGS_EXTHDR_SEQNUM_S0 \
21932                 UINT32_C(0x4)
21933         /*
21934          * Virtual Network Identifier (VNI). Only valid with
21935          * tunnel_types VXLAN, NVGRE, and Geneve.
21936          * Only lower 24-bits of VNI field are used
21937          * in setting up the filter.
21938          */
21939         uint32_t        vni;
21940         /* Logical VNIC ID of the destination VNIC. */
21941         uint32_t        dst_vnic_id;
21942         /*
21943          * Logical VNIC ID of the VNIC where traffic is
21944          * mirrored.
21945          */
21946         uint32_t        mirror_vnic_id;
21947 } __attribute__((packed));
21948
21949 /* hwrm_cfa_tunnel_filter_alloc_output (size:192b/24B) */
21950 struct hwrm_cfa_tunnel_filter_alloc_output {
21951         /* The specific error status for the command. */
21952         uint16_t        error_code;
21953         /* The HWRM command request type. */
21954         uint16_t        req_type;
21955         /* The sequence ID from the original command. */
21956         uint16_t        seq_id;
21957         /* The length of the response data in number of bytes. */
21958         uint16_t        resp_len;
21959         /* This value is an opaque id into CFA data structures. */
21960         uint64_t        tunnel_filter_id;
21961         /*
21962          * This is the ID of the flow associated with this
21963          * filter.
21964          * This value shall be used to match and associate the
21965          * flow identifier returned in completion records.
21966          * A value of 0xFFFFFFFF shall indicate no flow id.
21967          */
21968         uint32_t        flow_id;
21969         uint8_t unused_0[3];
21970         /*
21971          * This field is used in Output records to indicate that the output
21972          * is completely written to RAM.  This field should be read as '1'
21973          * to indicate that the output has been completely written.
21974          * When writing a command completion or response to an internal processor,
21975          * the order of writes has to be such that this field is written last.
21976          */
21977         uint8_t valid;
21978 } __attribute__((packed));
21979
21980 /*******************************
21981  * hwrm_cfa_tunnel_filter_free *
21982  *******************************/
21983
21984
21985 /* hwrm_cfa_tunnel_filter_free_input (size:192b/24B) */
21986 struct hwrm_cfa_tunnel_filter_free_input {
21987         /* The HWRM command request type. */
21988         uint16_t        req_type;
21989         /*
21990          * The completion ring to send the completion event on. This should
21991          * be the NQ ID returned from the `nq_alloc` HWRM command.
21992          */
21993         uint16_t        cmpl_ring;
21994         /*
21995          * The sequence ID is used by the driver for tracking multiple
21996          * commands. This ID is treated as opaque data by the firmware and
21997          * the value is returned in the `hwrm_resp_hdr` upon completion.
21998          */
21999         uint16_t        seq_id;
22000         /*
22001          * The target ID of the command:
22002          * * 0x0-0xFFF8 - The function ID
22003          * * 0xFFF8-0xFFFE - Reserved for internal processors
22004          * * 0xFFFF - HWRM
22005          */
22006         uint16_t        target_id;
22007         /*
22008          * A physical address pointer pointing to a host buffer that the
22009          * command's response data will be written. This can be either a host
22010          * physical address (HPA) or a guest physical address (GPA) and must
22011          * point to a physically contiguous block of memory.
22012          */
22013         uint64_t        resp_addr;
22014         /* This value is an opaque id into CFA data structures. */
22015         uint64_t        tunnel_filter_id;
22016 } __attribute__((packed));
22017
22018 /* hwrm_cfa_tunnel_filter_free_output (size:128b/16B) */
22019 struct hwrm_cfa_tunnel_filter_free_output {
22020         /* The specific error status for the command. */
22021         uint16_t        error_code;
22022         /* The HWRM command request type. */
22023         uint16_t        req_type;
22024         /* The sequence ID from the original command. */
22025         uint16_t        seq_id;
22026         /* The length of the response data in number of bytes. */
22027         uint16_t        resp_len;
22028         uint8_t unused_0[7];
22029         /*
22030          * This field is used in Output records to indicate that the output
22031          * is completely written to RAM.  This field should be read as '1'
22032          * to indicate that the output has been completely written.
22033          * When writing a command completion or response to an internal processor,
22034          * the order of writes has to be such that this field is written last.
22035          */
22036         uint8_t valid;
22037 } __attribute__((packed));
22038
22039 /***************************************
22040  * hwrm_cfa_redirect_tunnel_type_alloc *
22041  ***************************************/
22042
22043
22044 /* hwrm_cfa_redirect_tunnel_type_alloc_input (size:192b/24B) */
22045 struct hwrm_cfa_redirect_tunnel_type_alloc_input {
22046         /* The HWRM command request type. */
22047         uint16_t        req_type;
22048         /*
22049          * The completion ring to send the completion event on. This should
22050          * be the NQ ID returned from the `nq_alloc` HWRM command.
22051          */
22052         uint16_t        cmpl_ring;
22053         /*
22054          * The sequence ID is used by the driver for tracking multiple
22055          * commands. This ID is treated as opaque data by the firmware and
22056          * the value is returned in the `hwrm_resp_hdr` upon completion.
22057          */
22058         uint16_t        seq_id;
22059         /*
22060          * The target ID of the command:
22061          * * 0x0-0xFFF8 - The function ID
22062          * * 0xFFF8-0xFFFE - Reserved for internal processors
22063          * * 0xFFFF - HWRM
22064          */
22065         uint16_t        target_id;
22066         /*
22067          * A physical address pointer pointing to a host buffer that the
22068          * command's response data will be written. This can be either a host
22069          * physical address (HPA) or a guest physical address (GPA) and must
22070          * point to a physically contiguous block of memory.
22071          */
22072         uint64_t        resp_addr;
22073         /* The destination function id, to whom the traffic is redirected. */
22074         uint16_t        dest_fid;
22075         /* Tunnel Type. */
22076         uint8_t tunnel_type;
22077         /* Non-tunnel */
22078         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_NONTUNNEL \
22079                 UINT32_C(0x0)
22080         /* Virtual eXtensible Local Area Network (VXLAN) */
22081         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_VXLAN \
22082                 UINT32_C(0x1)
22083         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
22084         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_NVGRE \
22085                 UINT32_C(0x2)
22086         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
22087         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_L2GRE \
22088                 UINT32_C(0x3)
22089         /* IP in IP */
22090         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_IPIP \
22091                 UINT32_C(0x4)
22092         /* Generic Network Virtualization Encapsulation (Geneve) */
22093         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_GENEVE \
22094                 UINT32_C(0x5)
22095         /* Multi-Protocol Lable Switching (MPLS) */
22096         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_MPLS \
22097                 UINT32_C(0x6)
22098         /* Stateless Transport Tunnel (STT) */
22099         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_STT \
22100                 UINT32_C(0x7)
22101         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
22102         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_IPGRE \
22103                 UINT32_C(0x8)
22104         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
22105         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_VXLAN_V4 \
22106                 UINT32_C(0x9)
22107         /* Enhance Generic Routing Encapsulation (GRE version 1) inside IP datagram payload */
22108         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_IPGRE_V1 \
22109                 UINT32_C(0xa)
22110         /* Any tunneled traffic */
22111         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL \
22112                 UINT32_C(0xff)
22113         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_LAST \
22114                 HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL
22115         /* Tunnel alloc flags. */
22116         uint8_t flags;
22117         /* Setting of this flag indicates modify existing redirect tunnel to new destination function ID. */
22118         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_ALLOC_INPUT_FLAGS_MODIFY_DST \
22119                 UINT32_C(0x1)
22120         uint8_t unused_0[4];
22121 } __attribute__((packed));
22122
22123 /* hwrm_cfa_redirect_tunnel_type_alloc_output (size:128b/16B) */
22124 struct hwrm_cfa_redirect_tunnel_type_alloc_output {
22125         /* The specific error status for the command. */
22126         uint16_t        error_code;
22127         /* The HWRM command request type. */
22128         uint16_t        req_type;
22129         /* The sequence ID from the original command. */
22130         uint16_t        seq_id;
22131         /* The length of the response data in number of bytes. */
22132         uint16_t        resp_len;
22133         uint8_t unused_0[7];
22134         /*
22135          * This field is used in Output records to indicate that the output
22136          * is completely written to RAM.  This field should be read as '1'
22137          * to indicate that the output has been completely written.
22138          * When writing a command completion or response to an internal processor,
22139          * the order of writes has to be such that this field is written last.
22140          */
22141         uint8_t valid;
22142 } __attribute__((packed));
22143
22144 /**************************************
22145  * hwrm_cfa_redirect_tunnel_type_free *
22146  **************************************/
22147
22148
22149 /* hwrm_cfa_redirect_tunnel_type_free_input (size:192b/24B) */
22150 struct hwrm_cfa_redirect_tunnel_type_free_input {
22151         /* The HWRM command request type. */
22152         uint16_t        req_type;
22153         /*
22154          * The completion ring to send the completion event on. This should
22155          * be the NQ ID returned from the `nq_alloc` HWRM command.
22156          */
22157         uint16_t        cmpl_ring;
22158         /*
22159          * The sequence ID is used by the driver for tracking multiple
22160          * commands. This ID is treated as opaque data by the firmware and
22161          * the value is returned in the `hwrm_resp_hdr` upon completion.
22162          */
22163         uint16_t        seq_id;
22164         /*
22165          * The target ID of the command:
22166          * * 0x0-0xFFF8 - The function ID
22167          * * 0xFFF8-0xFFFE - Reserved for internal processors
22168          * * 0xFFFF - HWRM
22169          */
22170         uint16_t        target_id;
22171         /*
22172          * A physical address pointer pointing to a host buffer that the
22173          * command's response data will be written. This can be either a host
22174          * physical address (HPA) or a guest physical address (GPA) and must
22175          * point to a physically contiguous block of memory.
22176          */
22177         uint64_t        resp_addr;
22178         /* The destination function id, to whom the traffic is redirected. */
22179         uint16_t        dest_fid;
22180         /* Tunnel Type. */
22181         uint8_t tunnel_type;
22182         /* Non-tunnel */
22183         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_NONTUNNEL \
22184                 UINT32_C(0x0)
22185         /* Virtual eXtensible Local Area Network (VXLAN) */
22186         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_VXLAN \
22187                 UINT32_C(0x1)
22188         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
22189         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_NVGRE \
22190                 UINT32_C(0x2)
22191         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
22192         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_L2GRE \
22193                 UINT32_C(0x3)
22194         /* IP in IP */
22195         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_IPIP \
22196                 UINT32_C(0x4)
22197         /* Generic Network Virtualization Encapsulation (Geneve) */
22198         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_GENEVE \
22199                 UINT32_C(0x5)
22200         /* Multi-Protocol Lable Switching (MPLS) */
22201         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_MPLS \
22202                 UINT32_C(0x6)
22203         /* Stateless Transport Tunnel (STT) */
22204         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_STT \
22205                 UINT32_C(0x7)
22206         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
22207         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_IPGRE \
22208                 UINT32_C(0x8)
22209         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
22210         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_VXLAN_V4 \
22211                 UINT32_C(0x9)
22212         /* Enhance Generic Routing Encapsulation (GRE version 1) inside IP datagram payload */
22213         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_IPGRE_V1 \
22214                 UINT32_C(0xa)
22215         /* Any tunneled traffic */
22216         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_ANYTUNNEL \
22217                 UINT32_C(0xff)
22218         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_LAST \
22219                 HWRM_CFA_REDIRECT_TUNNEL_TYPE_FREE_INPUT_TUNNEL_TYPE_ANYTUNNEL
22220         uint8_t unused_0[5];
22221 } __attribute__((packed));
22222
22223 /* hwrm_cfa_redirect_tunnel_type_free_output (size:128b/16B) */
22224 struct hwrm_cfa_redirect_tunnel_type_free_output {
22225         /* The specific error status for the command. */
22226         uint16_t        error_code;
22227         /* The HWRM command request type. */
22228         uint16_t        req_type;
22229         /* The sequence ID from the original command. */
22230         uint16_t        seq_id;
22231         /* The length of the response data in number of bytes. */
22232         uint16_t        resp_len;
22233         uint8_t unused_0[7];
22234         /*
22235          * This field is used in Output records to indicate that the output
22236          * is completely written to RAM.  This field should be read as '1'
22237          * to indicate that the output has been completely written.
22238          * When writing a command completion or response to an internal processor,
22239          * the order of writes has to be such that this field is written last.
22240          */
22241         uint8_t valid;
22242 } __attribute__((packed));
22243
22244 /**************************************
22245  * hwrm_cfa_redirect_tunnel_type_info *
22246  **************************************/
22247
22248
22249 /* hwrm_cfa_redirect_tunnel_type_info_input (size:192b/24B) */
22250 struct hwrm_cfa_redirect_tunnel_type_info_input {
22251         /* The HWRM command request type. */
22252         uint16_t        req_type;
22253         /*
22254          * The completion ring to send the completion event on. This should
22255          * be the NQ ID returned from the `nq_alloc` HWRM command.
22256          */
22257         uint16_t        cmpl_ring;
22258         /*
22259          * The sequence ID is used by the driver for tracking multiple
22260          * commands. This ID is treated as opaque data by the firmware and
22261          * the value is returned in the `hwrm_resp_hdr` upon completion.
22262          */
22263         uint16_t        seq_id;
22264         /*
22265          * The target ID of the command:
22266          * * 0x0-0xFFF8 - The function ID
22267          * * 0xFFF8-0xFFFE - Reserved for internal processors
22268          * * 0xFFFF - HWRM
22269          */
22270         uint16_t        target_id;
22271         /*
22272          * A physical address pointer pointing to a host buffer that the
22273          * command's response data will be written. This can be either a host
22274          * physical address (HPA) or a guest physical address (GPA) and must
22275          * point to a physically contiguous block of memory.
22276          */
22277         uint64_t        resp_addr;
22278         /* The source function id. */
22279         uint16_t        src_fid;
22280         /* Tunnel Type. */
22281         uint8_t tunnel_type;
22282         /* Non-tunnel */
22283         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_NONTUNNEL \
22284                 UINT32_C(0x0)
22285         /* Virtual eXtensible Local Area Network (VXLAN) */
22286         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_VXLAN \
22287                 UINT32_C(0x1)
22288         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
22289         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_NVGRE \
22290                 UINT32_C(0x2)
22291         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
22292         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_L2GRE \
22293                 UINT32_C(0x3)
22294         /* IP in IP */
22295         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_IPIP \
22296                 UINT32_C(0x4)
22297         /* Generic Network Virtualization Encapsulation (Geneve) */
22298         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_GENEVE \
22299                 UINT32_C(0x5)
22300         /* Multi-Protocol Lable Switching (MPLS) */
22301         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_MPLS \
22302                 UINT32_C(0x6)
22303         /* Stateless Transport Tunnel (STT) */
22304         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_STT \
22305                 UINT32_C(0x7)
22306         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
22307         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_IPGRE \
22308                 UINT32_C(0x8)
22309         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
22310         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_VXLAN_V4 \
22311                 UINT32_C(0x9)
22312         /* Enhance Generic Routing Encapsulation (GRE version 1) inside IP datagram payload */
22313         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_IPGRE_V1 \
22314                 UINT32_C(0xa)
22315         /* Any tunneled traffic */
22316         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_ANYTUNNEL \
22317                 UINT32_C(0xff)
22318         #define HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_LAST \
22319                 HWRM_CFA_REDIRECT_TUNNEL_TYPE_INFO_INPUT_TUNNEL_TYPE_ANYTUNNEL
22320         uint8_t unused_0[5];
22321 } __attribute__((packed));
22322
22323 /* hwrm_cfa_redirect_tunnel_type_info_output (size:128b/16B) */
22324 struct hwrm_cfa_redirect_tunnel_type_info_output {
22325         /* The specific error status for the command. */
22326         uint16_t        error_code;
22327         /* The HWRM command request type. */
22328         uint16_t        req_type;
22329         /* The sequence ID from the original command. */
22330         uint16_t        seq_id;
22331         /* The length of the response data in number of bytes. */
22332         uint16_t        resp_len;
22333         /* The destination function id, to whom the traffic is redirected. */
22334         uint16_t        dest_fid;
22335         uint8_t unused_0[5];
22336         /*
22337          * This field is used in Output records to indicate that the output
22338          * is completely written to RAM.  This field should be read as '1'
22339          * to indicate that the output has been completely written.
22340          * When writing a command completion or response to an internal processor,
22341          * the order of writes has to be such that this field is written last.
22342          */
22343         uint8_t valid;
22344 } __attribute__((packed));
22345
22346 /* hwrm_vxlan_ipv4_hdr (size:128b/16B) */
22347 struct hwrm_vxlan_ipv4_hdr {
22348         /* IPv4 version and header length. */
22349         uint8_t ver_hlen;
22350         /* IPv4 header length */
22351         #define HWRM_VXLAN_IPV4_HDR_VER_HLEN_HEADER_LENGTH_MASK UINT32_C(0xf)
22352         #define HWRM_VXLAN_IPV4_HDR_VER_HLEN_HEADER_LENGTH_SFT 0
22353         /* Version */
22354         #define HWRM_VXLAN_IPV4_HDR_VER_HLEN_VERSION_MASK      UINT32_C(0xf0)
22355         #define HWRM_VXLAN_IPV4_HDR_VER_HLEN_VERSION_SFT       4
22356         /* IPv4 type of service. */
22357         uint8_t tos;
22358         /* IPv4 identification. */
22359         uint16_t        ip_id;
22360         /* IPv4 flags and offset. */
22361         uint16_t        flags_frag_offset;
22362         /* IPv4 TTL. */
22363         uint8_t ttl;
22364         /* IPv4 protocol. */
22365         uint8_t protocol;
22366         /* IPv4 source address. */
22367         uint32_t        src_ip_addr;
22368         /* IPv4 destination address. */
22369         uint32_t        dest_ip_addr;
22370 } __attribute__((packed));
22371
22372 /* hwrm_vxlan_ipv6_hdr (size:320b/40B) */
22373 struct hwrm_vxlan_ipv6_hdr {
22374         /* IPv6 version, traffic class and flow label. */
22375         uint32_t        ver_tc_flow_label;
22376         /* IPv6 version shift */
22377         #define HWRM_VXLAN_IPV6_HDR_VER_TC_FLOW_LABEL_VER_SFT \
22378                 UINT32_C(0x1c)
22379         /* IPv6 version mask */
22380         #define HWRM_VXLAN_IPV6_HDR_VER_TC_FLOW_LABEL_VER_MASK \
22381                 UINT32_C(0xf0000000)
22382         /* IPv6 TC shift */
22383         #define HWRM_VXLAN_IPV6_HDR_VER_TC_FLOW_LABEL_TC_SFT \
22384                 UINT32_C(0x14)
22385         /* IPv6 TC mask */
22386         #define HWRM_VXLAN_IPV6_HDR_VER_TC_FLOW_LABEL_TC_MASK \
22387                 UINT32_C(0xff00000)
22388         /* IPv6 flow label shift */
22389         #define HWRM_VXLAN_IPV6_HDR_VER_TC_FLOW_LABEL_FLOW_LABEL_SFT \
22390                 UINT32_C(0x0)
22391         /* IPv6 flow label mask */
22392         #define HWRM_VXLAN_IPV6_HDR_VER_TC_FLOW_LABEL_FLOW_LABEL_MASK \
22393                 UINT32_C(0xfffff)
22394         #define HWRM_VXLAN_IPV6_HDR_VER_TC_FLOW_LABEL_LAST \
22395                 HWRM_VXLAN_IPV6_HDR_VER_TC_FLOW_LABEL_FLOW_LABEL_MASK
22396         /* IPv6 payload length. */
22397         uint16_t        payload_len;
22398         /* IPv6 next header. */
22399         uint8_t next_hdr;
22400         /* IPv6 TTL. */
22401         uint8_t ttl;
22402         /* IPv6 source address. */
22403         uint32_t        src_ip_addr[4];
22404         /* IPv6 destination address. */
22405         uint32_t        dest_ip_addr[4];
22406 } __attribute__((packed));
22407
22408 /* hwrm_cfa_encap_data_vxlan (size:640b/80B) */
22409 struct hwrm_cfa_encap_data_vxlan {
22410         /* Source MAC address. */
22411         uint8_t src_mac_addr[6];
22412         /* reserved. */
22413         uint16_t        unused_0;
22414         /* Destination MAC address. */
22415         uint8_t dst_mac_addr[6];
22416         /* Number of VLAN tags. */
22417         uint8_t num_vlan_tags;
22418         /* reserved. */
22419         uint8_t unused_1;
22420         /* Outer VLAN TPID. */
22421         uint16_t        ovlan_tpid;
22422         /* Outer VLAN TCI. */
22423         uint16_t        ovlan_tci;
22424         /* Inner VLAN TPID. */
22425         uint16_t        ivlan_tpid;
22426         /* Inner VLAN TCI. */
22427         uint16_t        ivlan_tci;
22428         /* L3 header fields. */
22429         uint32_t        l3[10];
22430         /* IP version mask. */
22431         #define HWRM_CFA_ENCAP_DATA_VXLAN_L3_VER_MASK UINT32_C(0xf)
22432         /* IP version 4. */
22433         #define HWRM_CFA_ENCAP_DATA_VXLAN_L3_VER_IPV4 UINT32_C(0x4)
22434         /* IP version 6. */
22435         #define HWRM_CFA_ENCAP_DATA_VXLAN_L3_VER_IPV6 UINT32_C(0x6)
22436         #define HWRM_CFA_ENCAP_DATA_VXLAN_L3_LAST \
22437                 HWRM_CFA_ENCAP_DATA_VXLAN_L3_VER_IPV6
22438         /* UDP source port. */
22439         uint16_t        src_port;
22440         /* UDP destination port. */
22441         uint16_t        dst_port;
22442         /* VXLAN Network Identifier. */
22443         uint32_t        vni;
22444         /* 3 bytes VXLAN header reserve fields from 1st dword of the VXLAN header. */
22445         uint8_t hdr_rsvd0[3];
22446         /* 1 byte VXLAN header reserve field from 2nd dword of the VXLAN header. */
22447         uint8_t hdr_rsvd1;
22448         /* VXLAN header flags field. */
22449         uint8_t hdr_flags;
22450         uint8_t unused[3];
22451 } __attribute__((packed));
22452
22453 /*******************************
22454  * hwrm_cfa_encap_record_alloc *
22455  *******************************/
22456
22457
22458 /* hwrm_cfa_encap_record_alloc_input (size:832b/104B) */
22459 struct hwrm_cfa_encap_record_alloc_input {
22460         /* The HWRM command request type. */
22461         uint16_t        req_type;
22462         /*
22463          * The completion ring to send the completion event on. This should
22464          * be the NQ ID returned from the `nq_alloc` HWRM command.
22465          */
22466         uint16_t        cmpl_ring;
22467         /*
22468          * The sequence ID is used by the driver for tracking multiple
22469          * commands. This ID is treated as opaque data by the firmware and
22470          * the value is returned in the `hwrm_resp_hdr` upon completion.
22471          */
22472         uint16_t        seq_id;
22473         /*
22474          * The target ID of the command:
22475          * * 0x0-0xFFF8 - The function ID
22476          * * 0xFFF8-0xFFFE - Reserved for internal processors
22477          * * 0xFFFF - HWRM
22478          */
22479         uint16_t        target_id;
22480         /*
22481          * A physical address pointer pointing to a host buffer that the
22482          * command's response data will be written. This can be either a host
22483          * physical address (HPA) or a guest physical address (GPA) and must
22484          * point to a physically contiguous block of memory.
22485          */
22486         uint64_t        resp_addr;
22487         uint32_t        flags;
22488         /* Setting of this flag indicates the applicability to the loopback path. */
22489         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_FLAGS_LOOPBACK \
22490                 UINT32_C(0x1)
22491         /* Encapsulation Type. */
22492         uint8_t encap_type;
22493         /* Virtual eXtensible Local Area Network (VXLAN) */
22494         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_VXLAN \
22495                 UINT32_C(0x1)
22496         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
22497         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_NVGRE \
22498                 UINT32_C(0x2)
22499         /* Generic Routing Encapsulation (GRE) after inside Ethernet payload */
22500         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_L2GRE \
22501                 UINT32_C(0x3)
22502         /* IP in IP */
22503         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_IPIP \
22504                 UINT32_C(0x4)
22505         /* Generic Network Virtualization Encapsulation (Geneve) */
22506         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_GENEVE \
22507                 UINT32_C(0x5)
22508         /* Multi-Protocol Lable Switching (MPLS) */
22509         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_MPLS \
22510                 UINT32_C(0x6)
22511         /* VLAN */
22512         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_VLAN \
22513                 UINT32_C(0x7)
22514         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
22515         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_IPGRE \
22516                 UINT32_C(0x8)
22517         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
22518         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_VXLAN_V4 \
22519                 UINT32_C(0x9)
22520         #define HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_LAST \
22521                 HWRM_CFA_ENCAP_RECORD_ALLOC_INPUT_ENCAP_TYPE_VXLAN_V4
22522         uint8_t unused_0[3];
22523         /* This value is encap data used for the given encap type. */
22524         uint32_t        encap_data[20];
22525 } __attribute__((packed));
22526
22527 /* hwrm_cfa_encap_record_alloc_output (size:128b/16B) */
22528 struct hwrm_cfa_encap_record_alloc_output {
22529         /* The specific error status for the command. */
22530         uint16_t        error_code;
22531         /* The HWRM command request type. */
22532         uint16_t        req_type;
22533         /* The sequence ID from the original command. */
22534         uint16_t        seq_id;
22535         /* The length of the response data in number of bytes. */
22536         uint16_t        resp_len;
22537         /* This value is an opaque id into CFA data structures. */
22538         uint32_t        encap_record_id;
22539         uint8_t unused_0[3];
22540         /*
22541          * This field is used in Output records to indicate that the output
22542          * is completely written to RAM.  This field should be read as '1'
22543          * to indicate that the output has been completely written.
22544          * When writing a command completion or response to an internal processor,
22545          * the order of writes has to be such that this field is written last.
22546          */
22547         uint8_t valid;
22548 } __attribute__((packed));
22549
22550 /******************************
22551  * hwrm_cfa_encap_record_free *
22552  ******************************/
22553
22554
22555 /* hwrm_cfa_encap_record_free_input (size:192b/24B) */
22556 struct hwrm_cfa_encap_record_free_input {
22557         /* The HWRM command request type. */
22558         uint16_t        req_type;
22559         /*
22560          * The completion ring to send the completion event on. This should
22561          * be the NQ ID returned from the `nq_alloc` HWRM command.
22562          */
22563         uint16_t        cmpl_ring;
22564         /*
22565          * The sequence ID is used by the driver for tracking multiple
22566          * commands. This ID is treated as opaque data by the firmware and
22567          * the value is returned in the `hwrm_resp_hdr` upon completion.
22568          */
22569         uint16_t        seq_id;
22570         /*
22571          * The target ID of the command:
22572          * * 0x0-0xFFF8 - The function ID
22573          * * 0xFFF8-0xFFFE - Reserved for internal processors
22574          * * 0xFFFF - HWRM
22575          */
22576         uint16_t        target_id;
22577         /*
22578          * A physical address pointer pointing to a host buffer that the
22579          * command's response data will be written. This can be either a host
22580          * physical address (HPA) or a guest physical address (GPA) and must
22581          * point to a physically contiguous block of memory.
22582          */
22583         uint64_t        resp_addr;
22584         /* This value is an opaque id into CFA data structures. */
22585         uint32_t        encap_record_id;
22586         uint8_t unused_0[4];
22587 } __attribute__((packed));
22588
22589 /* hwrm_cfa_encap_record_free_output (size:128b/16B) */
22590 struct hwrm_cfa_encap_record_free_output {
22591         /* The specific error status for the command. */
22592         uint16_t        error_code;
22593         /* The HWRM command request type. */
22594         uint16_t        req_type;
22595         /* The sequence ID from the original command. */
22596         uint16_t        seq_id;
22597         /* The length of the response data in number of bytes. */
22598         uint16_t        resp_len;
22599         uint8_t unused_0[7];
22600         /*
22601          * This field is used in Output records to indicate that the output
22602          * is completely written to RAM.  This field should be read as '1'
22603          * to indicate that the output has been completely written.
22604          * When writing a command completion or response to an internal processor,
22605          * the order of writes has to be such that this field is written last.
22606          */
22607         uint8_t valid;
22608 } __attribute__((packed));
22609
22610 /********************************
22611  * hwrm_cfa_ntuple_filter_alloc *
22612  ********************************/
22613
22614
22615 /* hwrm_cfa_ntuple_filter_alloc_input (size:1024b/128B) */
22616 struct hwrm_cfa_ntuple_filter_alloc_input {
22617         /* The HWRM command request type. */
22618         uint16_t        req_type;
22619         /*
22620          * The completion ring to send the completion event on. This should
22621          * be the NQ ID returned from the `nq_alloc` HWRM command.
22622          */
22623         uint16_t        cmpl_ring;
22624         /*
22625          * The sequence ID is used by the driver for tracking multiple
22626          * commands. This ID is treated as opaque data by the firmware and
22627          * the value is returned in the `hwrm_resp_hdr` upon completion.
22628          */
22629         uint16_t        seq_id;
22630         /*
22631          * The target ID of the command:
22632          * * 0x0-0xFFF8 - The function ID
22633          * * 0xFFF8-0xFFFE - Reserved for internal processors
22634          * * 0xFFFF - HWRM
22635          */
22636         uint16_t        target_id;
22637         /*
22638          * A physical address pointer pointing to a host buffer that the
22639          * command's response data will be written. This can be either a host
22640          * physical address (HPA) or a guest physical address (GPA) and must
22641          * point to a physically contiguous block of memory.
22642          */
22643         uint64_t        resp_addr;
22644         uint32_t        flags;
22645         /* Setting of this flag indicates the applicability to the loopback path. */
22646         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_FLAGS_LOOPBACK \
22647                 UINT32_C(0x1)
22648         /*
22649          * Setting of this flag indicates drop action. If this flag is not set,
22650          * then it should be considered accept action.
22651          */
22652         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_FLAGS_DROP \
22653                 UINT32_C(0x2)
22654         /*
22655          * Setting of this flag indicates that a meter is expected to be attached
22656          * to this flow. This hint can be used when choosing the action record
22657          * format required for the flow.
22658          */
22659         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_FLAGS_METER \
22660                 UINT32_C(0x4)
22661         uint32_t        enables;
22662         /*
22663          * This bit must be '1' for the l2_filter_id field to be
22664          * configured.
22665          */
22666         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_L2_FILTER_ID \
22667                 UINT32_C(0x1)
22668         /*
22669          * This bit must be '1' for the ethertype field to be
22670          * configured.
22671          */
22672         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_ETHERTYPE \
22673                 UINT32_C(0x2)
22674         /*
22675          * This bit must be '1' for the tunnel_type field to be
22676          * configured.
22677          */
22678         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_TUNNEL_TYPE \
22679                 UINT32_C(0x4)
22680         /*
22681          * This bit must be '1' for the src_macaddr field to be
22682          * configured.
22683          */
22684         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_MACADDR \
22685                 UINT32_C(0x8)
22686         /*
22687          * This bit must be '1' for the ipaddr_type field to be
22688          * configured.
22689          */
22690         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_IPADDR_TYPE \
22691                 UINT32_C(0x10)
22692         /*
22693          * This bit must be '1' for the src_ipaddr field to be
22694          * configured.
22695          */
22696         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_IPADDR \
22697                 UINT32_C(0x20)
22698         /*
22699          * This bit must be '1' for the src_ipaddr_mask field to be
22700          * configured.
22701          */
22702         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_IPADDR_MASK \
22703                 UINT32_C(0x40)
22704         /*
22705          * This bit must be '1' for the dst_ipaddr field to be
22706          * configured.
22707          */
22708         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_IPADDR \
22709                 UINT32_C(0x80)
22710         /*
22711          * This bit must be '1' for the dst_ipaddr_mask field to be
22712          * configured.
22713          */
22714         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_IPADDR_MASK \
22715                 UINT32_C(0x100)
22716         /*
22717          * This bit must be '1' for the ip_protocol field to be
22718          * configured.
22719          */
22720         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_IP_PROTOCOL \
22721                 UINT32_C(0x200)
22722         /*
22723          * This bit must be '1' for the src_port field to be
22724          * configured.
22725          */
22726         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_PORT \
22727                 UINT32_C(0x400)
22728         /*
22729          * This bit must be '1' for the src_port_mask field to be
22730          * configured.
22731          */
22732         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_PORT_MASK \
22733                 UINT32_C(0x800)
22734         /*
22735          * This bit must be '1' for the dst_port field to be
22736          * configured.
22737          */
22738         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_PORT \
22739                 UINT32_C(0x1000)
22740         /*
22741          * This bit must be '1' for the dst_port_mask field to be
22742          * configured.
22743          */
22744         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_PORT_MASK \
22745                 UINT32_C(0x2000)
22746         /*
22747          * This bit must be '1' for the pri_hint field to be
22748          * configured.
22749          */
22750         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_PRI_HINT \
22751                 UINT32_C(0x4000)
22752         /*
22753          * This bit must be '1' for the ntuple_filter_id field to be
22754          * configured.
22755          */
22756         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_NTUPLE_FILTER_ID \
22757                 UINT32_C(0x8000)
22758         /*
22759          * This bit must be '1' for the dst_id field to be
22760          * configured.
22761          */
22762         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_ID \
22763                 UINT32_C(0x10000)
22764         /*
22765          * This bit must be '1' for the mirror_vnic_id field to be
22766          * configured.
22767          */
22768         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_MIRROR_VNIC_ID \
22769                 UINT32_C(0x20000)
22770         /*
22771          * This bit must be '1' for the dst_macaddr field to be
22772          * configured.
22773          */
22774         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_MACADDR \
22775                 UINT32_C(0x40000)
22776         /*
22777          * This value identifies a set of CFA data structures used for an L2
22778          * context.
22779          */
22780         uint64_t        l2_filter_id;
22781         /*
22782          * This value indicates the source MAC address in
22783          * the Ethernet header.
22784          */
22785         uint8_t src_macaddr[6];
22786         /* This value indicates the ethertype in the Ethernet header. */
22787         uint16_t        ethertype;
22788         /*
22789          * This value indicates the type of IP address.
22790          * 4 - IPv4
22791          * 6 - IPv6
22792          * All others are invalid.
22793          */
22794         uint8_t ip_addr_type;
22795         /* invalid */
22796         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_UNKNOWN \
22797                 UINT32_C(0x0)
22798         /* IPv4 */
22799         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_IPV4 \
22800                 UINT32_C(0x4)
22801         /* IPv6 */
22802         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_IPV6 \
22803                 UINT32_C(0x6)
22804         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_LAST \
22805                 HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_IPV6
22806         /*
22807          * The value of protocol filed in IP header.
22808          * Applies to UDP and TCP traffic.
22809          * 6 - TCP
22810          * 17 - UDP
22811          */
22812         uint8_t ip_protocol;
22813         /* invalid */
22814         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_PROTOCOL_UNKNOWN \
22815                 UINT32_C(0x0)
22816         /* TCP */
22817         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_PROTOCOL_TCP \
22818                 UINT32_C(0x6)
22819         /* UDP */
22820         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_PROTOCOL_UDP \
22821                 UINT32_C(0x11)
22822         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_PROTOCOL_LAST \
22823                 HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_PROTOCOL_UDP
22824         /*
22825          * If set, this value shall represent the
22826          * Logical VNIC ID of the destination VNIC for the RX
22827          * path and network port id of the destination port for
22828          * the TX path.
22829          */
22830         uint16_t        dst_id;
22831         /*
22832          * Logical VNIC ID of the VNIC where traffic is
22833          * mirrored.
22834          */
22835         uint16_t        mirror_vnic_id;
22836         /*
22837          * This value indicates the tunnel type for this filter.
22838          * If this field is not specified, then the filter shall
22839          * apply to both non-tunneled and tunneled packets.
22840          * If this field conflicts with the tunnel_type specified
22841          * in the l2_filter_id, then the HWRM shall return an
22842          * error for this command.
22843          */
22844         uint8_t tunnel_type;
22845         /* Non-tunnel */
22846         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_NONTUNNEL \
22847                 UINT32_C(0x0)
22848         /* Virtual eXtensible Local Area Network (VXLAN) */
22849         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_VXLAN \
22850                 UINT32_C(0x1)
22851         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
22852         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_NVGRE \
22853                 UINT32_C(0x2)
22854         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
22855         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_L2GRE \
22856                 UINT32_C(0x3)
22857         /* IP in IP */
22858         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_IPIP \
22859                 UINT32_C(0x4)
22860         /* Generic Network Virtualization Encapsulation (Geneve) */
22861         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_GENEVE \
22862                 UINT32_C(0x5)
22863         /* Multi-Protocol Lable Switching (MPLS) */
22864         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_MPLS \
22865                 UINT32_C(0x6)
22866         /* Stateless Transport Tunnel (STT) */
22867         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_STT \
22868                 UINT32_C(0x7)
22869         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
22870         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_IPGRE \
22871                 UINT32_C(0x8)
22872         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
22873         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_VXLAN_V4 \
22874                 UINT32_C(0x9)
22875         /* Any tunneled traffic */
22876         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL \
22877                 UINT32_C(0xff)
22878         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_LAST \
22879                 HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL
22880         /*
22881          * This hint is provided to help in placing
22882          * the filter in the filter table.
22883          */
22884         uint8_t pri_hint;
22885         /* No preference */
22886         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_PRI_HINT_NO_PREFER \
22887                 UINT32_C(0x0)
22888         /* Above the given filter */
22889         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_PRI_HINT_ABOVE \
22890                 UINT32_C(0x1)
22891         /* Below the given filter */
22892         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_PRI_HINT_BELOW \
22893                 UINT32_C(0x2)
22894         /* As high as possible */
22895         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_PRI_HINT_HIGHEST \
22896                 UINT32_C(0x3)
22897         /* As low as possible */
22898         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_PRI_HINT_LOWEST \
22899                 UINT32_C(0x4)
22900         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_PRI_HINT_LAST \
22901                 HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_PRI_HINT_LOWEST
22902         /*
22903          * The value of source IP address to be used in filtering.
22904          * For IPv4, first four bytes represent the IP address.
22905          */
22906         uint32_t        src_ipaddr[4];
22907         /*
22908          * The value of source IP address mask to be used in
22909          * filtering.
22910          * For IPv4, first four bytes represent the IP address mask.
22911          */
22912         uint32_t        src_ipaddr_mask[4];
22913         /*
22914          * The value of destination IP address to be used in filtering.
22915          * For IPv4, first four bytes represent the IP address.
22916          */
22917         uint32_t        dst_ipaddr[4];
22918         /*
22919          * The value of destination IP address mask to be used in
22920          * filtering.
22921          * For IPv4, first four bytes represent the IP address mask.
22922          */
22923         uint32_t        dst_ipaddr_mask[4];
22924         /*
22925          * The value of source port to be used in filtering.
22926          * Applies to UDP and TCP traffic.
22927          */
22928         uint16_t        src_port;
22929         /*
22930          * The value of source port mask to be used in filtering.
22931          * Applies to UDP and TCP traffic.
22932          */
22933         uint16_t        src_port_mask;
22934         /*
22935          * The value of destination port to be used in filtering.
22936          * Applies to UDP and TCP traffic.
22937          */
22938         uint16_t        dst_port;
22939         /*
22940          * The value of destination port mask to be used in
22941          * filtering.
22942          * Applies to UDP and TCP traffic.
22943          */
22944         uint16_t        dst_port_mask;
22945         /*
22946          * This is the ID of the filter that goes along with
22947          * the pri_hint.
22948          */
22949         uint64_t        ntuple_filter_id_hint;
22950 } __attribute__((packed));
22951
22952 /* hwrm_cfa_ntuple_filter_alloc_output (size:192b/24B) */
22953 struct hwrm_cfa_ntuple_filter_alloc_output {
22954         /* The specific error status for the command. */
22955         uint16_t        error_code;
22956         /* The HWRM command request type. */
22957         uint16_t        req_type;
22958         /* The sequence ID from the original command. */
22959         uint16_t        seq_id;
22960         /* The length of the response data in number of bytes. */
22961         uint16_t        resp_len;
22962         /* This value is an opaque id into CFA data structures. */
22963         uint64_t        ntuple_filter_id;
22964         /*
22965          * This is the ID of the flow associated with this
22966          * filter.
22967          * This value shall be used to match and associate the
22968          * flow identifier returned in completion records.
22969          * A value of 0xFFFFFFFF shall indicate no flow id.
22970          */
22971         uint32_t        flow_id;
22972         uint8_t unused_0[3];
22973         /*
22974          * This field is used in Output records to indicate that the output
22975          * is completely written to RAM.  This field should be read as '1'
22976          * to indicate that the output has been completely written.
22977          * When writing a command completion or response to an internal processor,
22978          * the order of writes has to be such that this field is written last.
22979          */
22980         uint8_t valid;
22981 } __attribute__((packed));
22982
22983 /* hwrm_cfa_ntuple_filter_alloc_cmd_err (size:64b/8B) */
22984 struct hwrm_cfa_ntuple_filter_alloc_cmd_err {
22985         /*
22986          * command specific error codes that goes to
22987          * the cmd_err field in Common HWRM Error Response.
22988          */
22989         uint8_t code;
22990         /* Unknown error */
22991         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_CMD_ERR_CODE_UNKNOWN \
22992                 UINT32_C(0x0)
22993         /* Unable to complete operation due to conflict with Rx Mask VLAN */
22994         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_CMD_ERR_CODE_RX_MASK_VLAN_CONFLICT_ERR \
22995                 UINT32_C(0x1)
22996         #define HWRM_CFA_NTUPLE_FILTER_ALLOC_CMD_ERR_CODE_LAST \
22997                 HWRM_CFA_NTUPLE_FILTER_ALLOC_CMD_ERR_CODE_RX_MASK_VLAN_CONFLICT_ERR
22998         uint8_t unused_0[7];
22999 } __attribute__((packed));
23000
23001 /*******************************
23002  * hwrm_cfa_ntuple_filter_free *
23003  *******************************/
23004
23005
23006 /* hwrm_cfa_ntuple_filter_free_input (size:192b/24B) */
23007 struct hwrm_cfa_ntuple_filter_free_input {
23008         /* The HWRM command request type. */
23009         uint16_t        req_type;
23010         /*
23011          * The completion ring to send the completion event on. This should
23012          * be the NQ ID returned from the `nq_alloc` HWRM command.
23013          */
23014         uint16_t        cmpl_ring;
23015         /*
23016          * The sequence ID is used by the driver for tracking multiple
23017          * commands. This ID is treated as opaque data by the firmware and
23018          * the value is returned in the `hwrm_resp_hdr` upon completion.
23019          */
23020         uint16_t        seq_id;
23021         /*
23022          * The target ID of the command:
23023          * * 0x0-0xFFF8 - The function ID
23024          * * 0xFFF8-0xFFFE - Reserved for internal processors
23025          * * 0xFFFF - HWRM
23026          */
23027         uint16_t        target_id;
23028         /*
23029          * A physical address pointer pointing to a host buffer that the
23030          * command's response data will be written. This can be either a host
23031          * physical address (HPA) or a guest physical address (GPA) and must
23032          * point to a physically contiguous block of memory.
23033          */
23034         uint64_t        resp_addr;
23035         /* This value is an opaque id into CFA data structures. */
23036         uint64_t        ntuple_filter_id;
23037 } __attribute__((packed));
23038
23039 /* hwrm_cfa_ntuple_filter_free_output (size:128b/16B) */
23040 struct hwrm_cfa_ntuple_filter_free_output {
23041         /* The specific error status for the command. */
23042         uint16_t        error_code;
23043         /* The HWRM command request type. */
23044         uint16_t        req_type;
23045         /* The sequence ID from the original command. */
23046         uint16_t        seq_id;
23047         /* The length of the response data in number of bytes. */
23048         uint16_t        resp_len;
23049         uint8_t unused_0[7];
23050         /*
23051          * This field is used in Output records to indicate that the output
23052          * is completely written to RAM.  This field should be read as '1'
23053          * to indicate that the output has been completely written.
23054          * When writing a command completion or response to an internal processor,
23055          * the order of writes has to be such that this field is written last.
23056          */
23057         uint8_t valid;
23058 } __attribute__((packed));
23059
23060 /******************************
23061  * hwrm_cfa_ntuple_filter_cfg *
23062  ******************************/
23063
23064
23065 /* hwrm_cfa_ntuple_filter_cfg_input (size:384b/48B) */
23066 struct hwrm_cfa_ntuple_filter_cfg_input {
23067         /* The HWRM command request type. */
23068         uint16_t        req_type;
23069         /*
23070          * The completion ring to send the completion event on. This should
23071          * be the NQ ID returned from the `nq_alloc` HWRM command.
23072          */
23073         uint16_t        cmpl_ring;
23074         /*
23075          * The sequence ID is used by the driver for tracking multiple
23076          * commands. This ID is treated as opaque data by the firmware and
23077          * the value is returned in the `hwrm_resp_hdr` upon completion.
23078          */
23079         uint16_t        seq_id;
23080         /*
23081          * The target ID of the command:
23082          * * 0x0-0xFFF8 - The function ID
23083          * * 0xFFF8-0xFFFE - Reserved for internal processors
23084          * * 0xFFFF - HWRM
23085          */
23086         uint16_t        target_id;
23087         /*
23088          * A physical address pointer pointing to a host buffer that the
23089          * command's response data will be written. This can be either a host
23090          * physical address (HPA) or a guest physical address (GPA) and must
23091          * point to a physically contiguous block of memory.
23092          */
23093         uint64_t        resp_addr;
23094         uint32_t        enables;
23095         /*
23096          * This bit must be '1' for the new_dst_id field to be
23097          * configured.
23098          */
23099         #define HWRM_CFA_NTUPLE_FILTER_CFG_INPUT_ENABLES_NEW_DST_ID \
23100                 UINT32_C(0x1)
23101         /*
23102          * This bit must be '1' for the new_mirror_vnic_id field to be
23103          * configured.
23104          */
23105         #define HWRM_CFA_NTUPLE_FILTER_CFG_INPUT_ENABLES_NEW_MIRROR_VNIC_ID \
23106                 UINT32_C(0x2)
23107         /*
23108          * This bit must be '1' for the new_meter_instance_id field to be
23109          * configured.
23110          */
23111         #define HWRM_CFA_NTUPLE_FILTER_CFG_INPUT_ENABLES_NEW_METER_INSTANCE_ID \
23112                 UINT32_C(0x4)
23113         uint8_t unused_0[4];
23114         /* This value is an opaque id into CFA data structures. */
23115         uint64_t        ntuple_filter_id;
23116         /*
23117          * If set, this value shall represent the new
23118          * Logical VNIC ID of the destination VNIC for the RX
23119          * path and new network port id of the destination port for
23120          * the TX path.
23121          */
23122         uint32_t        new_dst_id;
23123         /*
23124          * New Logical VNIC ID of the VNIC where traffic is
23125          * mirrored.
23126          */
23127         uint32_t        new_mirror_vnic_id;
23128         /*
23129          * New meter to attach to the flow. Specifying the
23130          * invalid instance ID is used to remove any existing
23131          * meter from the flow.
23132          */
23133         uint16_t        new_meter_instance_id;
23134         /*
23135          * A value of 0xfff is considered invalid and implies the
23136          * instance is not configured.
23137          */
23138         #define HWRM_CFA_NTUPLE_FILTER_CFG_INPUT_NEW_METER_INSTANCE_ID_INVALID \
23139                 UINT32_C(0xffff)
23140         #define HWRM_CFA_NTUPLE_FILTER_CFG_INPUT_NEW_METER_INSTANCE_ID_LAST \
23141                 HWRM_CFA_NTUPLE_FILTER_CFG_INPUT_NEW_METER_INSTANCE_ID_INVALID
23142         uint8_t unused_1[6];
23143 } __attribute__((packed));
23144
23145 /* hwrm_cfa_ntuple_filter_cfg_output (size:128b/16B) */
23146 struct hwrm_cfa_ntuple_filter_cfg_output {
23147         /* The specific error status for the command. */
23148         uint16_t        error_code;
23149         /* The HWRM command request type. */
23150         uint16_t        req_type;
23151         /* The sequence ID from the original command. */
23152         uint16_t        seq_id;
23153         /* The length of the response data in number of bytes. */
23154         uint16_t        resp_len;
23155         uint8_t unused_0[7];
23156         /*
23157          * This field is used in Output records to indicate that the output
23158          * is completely written to RAM.  This field should be read as '1'
23159          * to indicate that the output has been completely written.
23160          * When writing a command completion or response to an internal processor,
23161          * the order of writes has to be such that this field is written last.
23162          */
23163         uint8_t valid;
23164 } __attribute__((packed));
23165
23166 /**************************
23167  * hwrm_cfa_em_flow_alloc *
23168  **************************/
23169
23170
23171 /* hwrm_cfa_em_flow_alloc_input (size:896b/112B) */
23172 struct hwrm_cfa_em_flow_alloc_input {
23173         /* The HWRM command request type. */
23174         uint16_t        req_type;
23175         /*
23176          * The completion ring to send the completion event on. This should
23177          * be the NQ ID returned from the `nq_alloc` HWRM command.
23178          */
23179         uint16_t        cmpl_ring;
23180         /*
23181          * The sequence ID is used by the driver for tracking multiple
23182          * commands. This ID is treated as opaque data by the firmware and
23183          * the value is returned in the `hwrm_resp_hdr` upon completion.
23184          */
23185         uint16_t        seq_id;
23186         /*
23187          * The target ID of the command:
23188          * * 0x0-0xFFF8 - The function ID
23189          * * 0xFFF8-0xFFFE - Reserved for internal processors
23190          * * 0xFFFF - HWRM
23191          */
23192         uint16_t        target_id;
23193         /*
23194          * A physical address pointer pointing to a host buffer that the
23195          * command's response data will be written. This can be either a host
23196          * physical address (HPA) or a guest physical address (GPA) and must
23197          * point to a physically contiguous block of memory.
23198          */
23199         uint64_t        resp_addr;
23200         uint32_t        flags;
23201         /*
23202          * Enumeration denoting the RX, TX type of the resource.
23203          * This enumeration is used for resources that are similar for both
23204          * TX and RX paths of the chip.
23205          */
23206         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_PATH         UINT32_C(0x1)
23207         /* tx path */
23208         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_PATH_TX        UINT32_C(0x0)
23209         /* rx path */
23210         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_PATH_RX        UINT32_C(0x1)
23211         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_PATH_LAST \
23212                 HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_PATH_RX
23213         /*
23214          * Setting of this flag indicates enabling of a byte counter for a given
23215          * flow.
23216          */
23217         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_BYTE_CTR     UINT32_C(0x2)
23218         /*
23219          * Setting of this flag indicates enabling of a packet counter for a given
23220          * flow.
23221          */
23222         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_PKT_CTR      UINT32_C(0x4)
23223         /* Setting of this flag indicates de-capsulation action for the given flow. */
23224         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_DECAP        UINT32_C(0x8)
23225         /* Setting of this flag indicates encapsulation action for the given flow. */
23226         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_ENCAP        UINT32_C(0x10)
23227         /*
23228          * Setting of this flag indicates drop action. If this flag is not set,
23229          * then it should be considered accept action.
23230          */
23231         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_DROP         UINT32_C(0x20)
23232         /*
23233          * Setting of this flag indicates that a meter is expected to be attached
23234          * to this flow. This hint can be used when choosing the action record
23235          * format required for the flow.
23236          */
23237         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_FLAGS_METER        UINT32_C(0x40)
23238         uint32_t        enables;
23239         /*
23240          * This bit must be '1' for the l2_filter_id field to be
23241          * configured.
23242          */
23243         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_L2_FILTER_ID \
23244                 UINT32_C(0x1)
23245         /*
23246          * This bit must be '1' for the tunnel_type field to be
23247          * configured.
23248          */
23249         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_TUNNEL_TYPE \
23250                 UINT32_C(0x2)
23251         /*
23252          * This bit must be '1' for the tunnel_id field to be
23253          * configured.
23254          */
23255         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_TUNNEL_ID \
23256                 UINT32_C(0x4)
23257         /*
23258          * This bit must be '1' for the src_macaddr field to be
23259          * configured.
23260          */
23261         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_SRC_MACADDR \
23262                 UINT32_C(0x8)
23263         /*
23264          * This bit must be '1' for the dst_macaddr field to be
23265          * configured.
23266          */
23267         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_DST_MACADDR \
23268                 UINT32_C(0x10)
23269         /*
23270          * This bit must be '1' for the ovlan_vid field to be
23271          * configured.
23272          */
23273         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_OVLAN_VID \
23274                 UINT32_C(0x20)
23275         /*
23276          * This bit must be '1' for the ivlan_vid field to be
23277          * configured.
23278          */
23279         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_IVLAN_VID \
23280                 UINT32_C(0x40)
23281         /*
23282          * This bit must be '1' for the ethertype field to be
23283          * configured.
23284          */
23285         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_ETHERTYPE \
23286                 UINT32_C(0x80)
23287         /*
23288          * This bit must be '1' for the src_ipaddr field to be
23289          * configured.
23290          */
23291         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_SRC_IPADDR \
23292                 UINT32_C(0x100)
23293         /*
23294          * This bit must be '1' for the dst_ipaddr field to be
23295          * configured.
23296          */
23297         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_DST_IPADDR \
23298                 UINT32_C(0x200)
23299         /*
23300          * This bit must be '1' for the ipaddr_type field to be
23301          * configured.
23302          */
23303         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_IPADDR_TYPE \
23304                 UINT32_C(0x400)
23305         /*
23306          * This bit must be '1' for the ip_protocol field to be
23307          * configured.
23308          */
23309         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_IP_PROTOCOL \
23310                 UINT32_C(0x800)
23311         /*
23312          * This bit must be '1' for the src_port field to be
23313          * configured.
23314          */
23315         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_SRC_PORT \
23316                 UINT32_C(0x1000)
23317         /*
23318          * This bit must be '1' for the dst_port field to be
23319          * configured.
23320          */
23321         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_DST_PORT \
23322                 UINT32_C(0x2000)
23323         /*
23324          * This bit must be '1' for the dst_id field to be
23325          * configured.
23326          */
23327         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_DST_ID \
23328                 UINT32_C(0x4000)
23329         /*
23330          * This bit must be '1' for the mirror_vnic_id field to be
23331          * configured.
23332          */
23333         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_MIRROR_VNIC_ID \
23334                 UINT32_C(0x8000)
23335         /*
23336          * This bit must be '1' for the encap_record_id field to be
23337          * configured.
23338          */
23339         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_ENCAP_RECORD_ID \
23340                 UINT32_C(0x10000)
23341         /*
23342          * This bit must be '1' for the meter_instance_id field to be
23343          * configured.
23344          */
23345         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_METER_INSTANCE_ID \
23346                 UINT32_C(0x20000)
23347         /*
23348          * This value identifies a set of CFA data structures used for an L2
23349          * context.
23350          */
23351         uint64_t        l2_filter_id;
23352         /* Tunnel Type. */
23353         uint8_t tunnel_type;
23354         /* Non-tunnel */
23355         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_NONTUNNEL \
23356                 UINT32_C(0x0)
23357         /* Virtual eXtensible Local Area Network (VXLAN) */
23358         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_VXLAN \
23359                 UINT32_C(0x1)
23360         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
23361         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_NVGRE \
23362                 UINT32_C(0x2)
23363         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
23364         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_L2GRE \
23365                 UINT32_C(0x3)
23366         /* IP in IP */
23367         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_IPIP \
23368                 UINT32_C(0x4)
23369         /* Generic Network Virtualization Encapsulation (Geneve) */
23370         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_GENEVE \
23371                 UINT32_C(0x5)
23372         /* Multi-Protocol Lable Switching (MPLS) */
23373         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_MPLS \
23374                 UINT32_C(0x6)
23375         /* Stateless Transport Tunnel (STT) */
23376         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_STT \
23377                 UINT32_C(0x7)
23378         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
23379         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_IPGRE \
23380                 UINT32_C(0x8)
23381         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
23382         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_VXLAN_V4 \
23383                 UINT32_C(0x9)
23384         /* Any tunneled traffic */
23385         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL \
23386                 UINT32_C(0xff)
23387         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_LAST \
23388                 HWRM_CFA_EM_FLOW_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL
23389         uint8_t unused_0[3];
23390         /*
23391          * Tunnel identifier.
23392          * Virtual Network Identifier (VNI). Only valid with
23393          * tunnel_types VXLAN, NVGRE, and Geneve.
23394          * Only lower 24-bits of VNI field are used
23395          * in setting up the filter.
23396          */
23397         uint32_t        tunnel_id;
23398         /*
23399          * This value indicates the source MAC address in
23400          * the Ethernet header.
23401          */
23402         uint8_t src_macaddr[6];
23403         /* The meter instance to attach to the flow. */
23404         uint16_t        meter_instance_id;
23405         /*
23406          * A value of 0xfff is considered invalid and implies the
23407          * instance is not configured.
23408          */
23409         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_METER_INSTANCE_ID_INVALID \
23410                 UINT32_C(0xffff)
23411         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_METER_INSTANCE_ID_LAST \
23412                 HWRM_CFA_EM_FLOW_ALLOC_INPUT_METER_INSTANCE_ID_INVALID
23413         /*
23414          * This value indicates the destination MAC address in
23415          * the Ethernet header.
23416          */
23417         uint8_t dst_macaddr[6];
23418         /*
23419          * This value indicates the VLAN ID of the outer VLAN tag
23420          * in the Ethernet header.
23421          */
23422         uint16_t        ovlan_vid;
23423         /*
23424          * This value indicates the VLAN ID of the inner VLAN tag
23425          * in the Ethernet header.
23426          */
23427         uint16_t        ivlan_vid;
23428         /* This value indicates the ethertype in the Ethernet header. */
23429         uint16_t        ethertype;
23430         /*
23431          * This value indicates the type of IP address.
23432          * 4 - IPv4
23433          * 6 - IPv6
23434          * All others are invalid.
23435          */
23436         uint8_t ip_addr_type;
23437         /* invalid */
23438         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_ADDR_TYPE_UNKNOWN UINT32_C(0x0)
23439         /* IPv4 */
23440         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_ADDR_TYPE_IPV4    UINT32_C(0x4)
23441         /* IPv6 */
23442         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_ADDR_TYPE_IPV6    UINT32_C(0x6)
23443         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_ADDR_TYPE_LAST \
23444                 HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_ADDR_TYPE_IPV6
23445         /*
23446          * The value of protocol filed in IP header.
23447          * Applies to UDP and TCP traffic.
23448          * 6 - TCP
23449          * 17 - UDP
23450          */
23451         uint8_t ip_protocol;
23452         /* invalid */
23453         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_PROTOCOL_UNKNOWN UINT32_C(0x0)
23454         /* TCP */
23455         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_PROTOCOL_TCP     UINT32_C(0x6)
23456         /* UDP */
23457         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_PROTOCOL_UDP     UINT32_C(0x11)
23458         #define HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_PROTOCOL_LAST \
23459                 HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_PROTOCOL_UDP
23460         uint8_t unused_1[2];
23461         /*
23462          * The value of source IP address to be used in filtering.
23463          * For IPv4, first four bytes represent the IP address.
23464          */
23465         uint32_t        src_ipaddr[4];
23466         /*
23467          * big_endian = True
23468          *     The value of destination IP address to be used in filtering.
23469          *     For IPv4, first four bytes represent the IP address.
23470          */
23471         uint32_t        dst_ipaddr[4];
23472         /*
23473          * The value of source port to be used in filtering.
23474          * Applies to UDP and TCP traffic.
23475          */
23476         uint16_t        src_port;
23477         /*
23478          * The value of destination port to be used in filtering.
23479          * Applies to UDP and TCP traffic.
23480          */
23481         uint16_t        dst_port;
23482         /*
23483          * If set, this value shall represent the
23484          * Logical VNIC ID of the destination VNIC for the RX
23485          * path and network port id of the destination port for
23486          * the TX path.
23487          */
23488         uint16_t        dst_id;
23489         /*
23490          * Logical VNIC ID of the VNIC where traffic is
23491          * mirrored.
23492          */
23493         uint16_t        mirror_vnic_id;
23494         /* Logical ID of the encapsulation record. */
23495         uint32_t        encap_record_id;
23496         uint8_t unused_2[4];
23497 } __attribute__((packed));
23498
23499 /* hwrm_cfa_em_flow_alloc_output (size:192b/24B) */
23500 struct hwrm_cfa_em_flow_alloc_output {
23501         /* The specific error status for the command. */
23502         uint16_t        error_code;
23503         /* The HWRM command request type. */
23504         uint16_t        req_type;
23505         /* The sequence ID from the original command. */
23506         uint16_t        seq_id;
23507         /* The length of the response data in number of bytes. */
23508         uint16_t        resp_len;
23509         /* This value is an opaque id into CFA data structures. */
23510         uint64_t        em_filter_id;
23511         /*
23512          * This is the ID of the flow associated with this
23513          * filter.
23514          * This value shall be used to match and associate the
23515          * flow identifier returned in completion records.
23516          * A value of 0xFFFFFFFF shall indicate no flow id.
23517          */
23518         uint32_t        flow_id;
23519         uint8_t unused_0[3];
23520         /*
23521          * This field is used in Output records to indicate that the output
23522          * is completely written to RAM.  This field should be read as '1'
23523          * to indicate that the output has been completely written.
23524          * When writing a command completion or response to an internal processor,
23525          * the order of writes has to be such that this field is written last.
23526          */
23527         uint8_t valid;
23528 } __attribute__((packed));
23529
23530 /*************************
23531  * hwrm_cfa_em_flow_free *
23532  *************************/
23533
23534
23535 /* hwrm_cfa_em_flow_free_input (size:192b/24B) */
23536 struct hwrm_cfa_em_flow_free_input {
23537         /* The HWRM command request type. */
23538         uint16_t        req_type;
23539         /*
23540          * The completion ring to send the completion event on. This should
23541          * be the NQ ID returned from the `nq_alloc` HWRM command.
23542          */
23543         uint16_t        cmpl_ring;
23544         /*
23545          * The sequence ID is used by the driver for tracking multiple
23546          * commands. This ID is treated as opaque data by the firmware and
23547          * the value is returned in the `hwrm_resp_hdr` upon completion.
23548          */
23549         uint16_t        seq_id;
23550         /*
23551          * The target ID of the command:
23552          * * 0x0-0xFFF8 - The function ID
23553          * * 0xFFF8-0xFFFE - Reserved for internal processors
23554          * * 0xFFFF - HWRM
23555          */
23556         uint16_t        target_id;
23557         /*
23558          * A physical address pointer pointing to a host buffer that the
23559          * command's response data will be written. This can be either a host
23560          * physical address (HPA) or a guest physical address (GPA) and must
23561          * point to a physically contiguous block of memory.
23562          */
23563         uint64_t        resp_addr;
23564         /* This value is an opaque id into CFA data structures. */
23565         uint64_t        em_filter_id;
23566 } __attribute__((packed));
23567
23568 /* hwrm_cfa_em_flow_free_output (size:128b/16B) */
23569 struct hwrm_cfa_em_flow_free_output {
23570         /* The specific error status for the command. */
23571         uint16_t        error_code;
23572         /* The HWRM command request type. */
23573         uint16_t        req_type;
23574         /* The sequence ID from the original command. */
23575         uint16_t        seq_id;
23576         /* The length of the response data in number of bytes. */
23577         uint16_t        resp_len;
23578         uint8_t unused_0[7];
23579         /*
23580          * This field is used in Output records to indicate that the output
23581          * is completely written to RAM.  This field should be read as '1'
23582          * to indicate that the output has been completely written.
23583          * When writing a command completion or response to an internal processor,
23584          * the order of writes has to be such that this field is written last.
23585          */
23586         uint8_t valid;
23587 } __attribute__((packed));
23588
23589 /*******************************
23590  * hwrm_cfa_decap_filter_alloc *
23591  *******************************/
23592
23593
23594 /* hwrm_cfa_decap_filter_alloc_input (size:832b/104B) */
23595 struct hwrm_cfa_decap_filter_alloc_input {
23596         /* The HWRM command request type. */
23597         uint16_t        req_type;
23598         /*
23599          * The completion ring to send the completion event on. This should
23600          * be the NQ ID returned from the `nq_alloc` HWRM command.
23601          */
23602         uint16_t        cmpl_ring;
23603         /*
23604          * The sequence ID is used by the driver for tracking multiple
23605          * commands. This ID is treated as opaque data by the firmware and
23606          * the value is returned in the `hwrm_resp_hdr` upon completion.
23607          */
23608         uint16_t        seq_id;
23609         /*
23610          * The target ID of the command:
23611          * * 0x0-0xFFF8 - The function ID
23612          * * 0xFFF8-0xFFFE - Reserved for internal processors
23613          * * 0xFFFF - HWRM
23614          */
23615         uint16_t        target_id;
23616         /*
23617          * A physical address pointer pointing to a host buffer that the
23618          * command's response data will be written. This can be either a host
23619          * physical address (HPA) or a guest physical address (GPA) and must
23620          * point to a physically contiguous block of memory.
23621          */
23622         uint64_t        resp_addr;
23623         uint32_t        flags;
23624         /* ovs_tunnel is 1 b */
23625         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_FLAGS_OVS_TUNNEL \
23626                 UINT32_C(0x1)
23627         uint32_t        enables;
23628         /*
23629          * This bit must be '1' for the tunnel_type field to be
23630          * configured.
23631          */
23632         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_TUNNEL_TYPE \
23633                 UINT32_C(0x1)
23634         /*
23635          * This bit must be '1' for the tunnel_id field to be
23636          * configured.
23637          */
23638         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_TUNNEL_ID \
23639                 UINT32_C(0x2)
23640         /*
23641          * This bit must be '1' for the src_macaddr field to be
23642          * configured.
23643          */
23644         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_SRC_MACADDR \
23645                 UINT32_C(0x4)
23646         /*
23647          * This bit must be '1' for the dst_macaddr field to be
23648          * configured.
23649          */
23650         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_DST_MACADDR \
23651                 UINT32_C(0x8)
23652         /*
23653          * This bit must be '1' for the ovlan_vid field to be
23654          * configured.
23655          */
23656         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_OVLAN_VID \
23657                 UINT32_C(0x10)
23658         /*
23659          * This bit must be '1' for the ivlan_vid field to be
23660          * configured.
23661          */
23662         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_IVLAN_VID \
23663                 UINT32_C(0x20)
23664         /*
23665          * This bit must be '1' for the t_ovlan_vid field to be
23666          * configured.
23667          */
23668         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_T_OVLAN_VID \
23669                 UINT32_C(0x40)
23670         /*
23671          * This bit must be '1' for the t_ivlan_vid field to be
23672          * configured.
23673          */
23674         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_T_IVLAN_VID \
23675                 UINT32_C(0x80)
23676         /*
23677          * This bit must be '1' for the ethertype field to be
23678          * configured.
23679          */
23680         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_ETHERTYPE \
23681                 UINT32_C(0x100)
23682         /*
23683          * This bit must be '1' for the src_ipaddr field to be
23684          * configured.
23685          */
23686         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_SRC_IPADDR \
23687                 UINT32_C(0x200)
23688         /*
23689          * This bit must be '1' for the dst_ipaddr field to be
23690          * configured.
23691          */
23692         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_DST_IPADDR \
23693                 UINT32_C(0x400)
23694         /*
23695          * This bit must be '1' for the ipaddr_type field to be
23696          * configured.
23697          */
23698         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_IPADDR_TYPE \
23699                 UINT32_C(0x800)
23700         /*
23701          * This bit must be '1' for the ip_protocol field to be
23702          * configured.
23703          */
23704         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_IP_PROTOCOL \
23705                 UINT32_C(0x1000)
23706         /*
23707          * This bit must be '1' for the src_port field to be
23708          * configured.
23709          */
23710         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_SRC_PORT \
23711                 UINT32_C(0x2000)
23712         /*
23713          * This bit must be '1' for the dst_port field to be
23714          * configured.
23715          */
23716         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_DST_PORT \
23717                 UINT32_C(0x4000)
23718         /*
23719          * This bit must be '1' for the dst_id field to be
23720          * configured.
23721          */
23722         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_DST_ID \
23723                 UINT32_C(0x8000)
23724         /*
23725          * This bit must be '1' for the mirror_vnic_id field to be
23726          * configured.
23727          */
23728         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_ENABLES_MIRROR_VNIC_ID \
23729                 UINT32_C(0x10000)
23730         /*
23731          * Tunnel identifier.
23732          * Virtual Network Identifier (VNI). Only valid with
23733          * tunnel_types VXLAN, NVGRE, and Geneve.
23734          * Only lower 24-bits of VNI field are used
23735          * in setting up the filter.
23736          */
23737         uint32_t        tunnel_id;
23738         /* Tunnel Type. */
23739         uint8_t tunnel_type;
23740         /* Non-tunnel */
23741         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_NONTUNNEL \
23742                 UINT32_C(0x0)
23743         /* Virtual eXtensible Local Area Network (VXLAN) */
23744         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_VXLAN \
23745                 UINT32_C(0x1)
23746         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
23747         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_NVGRE \
23748                 UINT32_C(0x2)
23749         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
23750         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_L2GRE \
23751                 UINT32_C(0x3)
23752         /* IP in IP */
23753         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_IPIP \
23754                 UINT32_C(0x4)
23755         /* Generic Network Virtualization Encapsulation (Geneve) */
23756         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_GENEVE \
23757                 UINT32_C(0x5)
23758         /* Multi-Protocol Lable Switching (MPLS) */
23759         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_MPLS \
23760                 UINT32_C(0x6)
23761         /* Stateless Transport Tunnel (STT) */
23762         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_STT \
23763                 UINT32_C(0x7)
23764         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
23765         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_IPGRE \
23766                 UINT32_C(0x8)
23767         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
23768         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_VXLAN_V4 \
23769                 UINT32_C(0x9)
23770         /* Any tunneled traffic */
23771         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL \
23772                 UINT32_C(0xff)
23773         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_LAST \
23774                 HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL
23775         uint8_t unused_0;
23776         uint16_t        unused_1;
23777         /*
23778          * This value indicates the source MAC address in
23779          * the Ethernet header.
23780          */
23781         uint8_t src_macaddr[6];
23782         uint8_t unused_2[2];
23783         /*
23784          * This value indicates the destination MAC address in
23785          * the Ethernet header.
23786          */
23787         uint8_t dst_macaddr[6];
23788         /*
23789          * This value indicates the VLAN ID of the outer VLAN tag
23790          * in the Ethernet header.
23791          */
23792         uint16_t        ovlan_vid;
23793         /*
23794          * This value indicates the VLAN ID of the inner VLAN tag
23795          * in the Ethernet header.
23796          */
23797         uint16_t        ivlan_vid;
23798         /*
23799          * This value indicates the VLAN ID of the outer VLAN tag
23800          * in the tunnel Ethernet header.
23801          */
23802         uint16_t        t_ovlan_vid;
23803         /*
23804          * This value indicates the VLAN ID of the inner VLAN tag
23805          * in the tunnel Ethernet header.
23806          */
23807         uint16_t        t_ivlan_vid;
23808         /* This value indicates the ethertype in the Ethernet header. */
23809         uint16_t        ethertype;
23810         /*
23811          * This value indicates the type of IP address.
23812          * 4 - IPv4
23813          * 6 - IPv6
23814          * All others are invalid.
23815          */
23816         uint8_t ip_addr_type;
23817         /* invalid */
23818         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_UNKNOWN \
23819                 UINT32_C(0x0)
23820         /* IPv4 */
23821         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_IPV4 \
23822                 UINT32_C(0x4)
23823         /* IPv6 */
23824         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_IPV6 \
23825                 UINT32_C(0x6)
23826         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_LAST \
23827                 HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_IPV6
23828         /*
23829          * The value of protocol filed in IP header.
23830          * Applies to UDP and TCP traffic.
23831          * 6 - TCP
23832          * 17 - UDP
23833          */
23834         uint8_t ip_protocol;
23835         /* invalid */
23836         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_PROTOCOL_UNKNOWN \
23837                 UINT32_C(0x0)
23838         /* TCP */
23839         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_PROTOCOL_TCP \
23840                 UINT32_C(0x6)
23841         /* UDP */
23842         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_PROTOCOL_UDP \
23843                 UINT32_C(0x11)
23844         #define HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_PROTOCOL_LAST \
23845                 HWRM_CFA_DECAP_FILTER_ALLOC_INPUT_IP_PROTOCOL_UDP
23846         uint16_t        unused_3;
23847         uint32_t        unused_4;
23848         /*
23849          * The value of source IP address to be used in filtering.
23850          * For IPv4, first four bytes represent the IP address.
23851          */
23852         uint32_t        src_ipaddr[4];
23853         /*
23854          * The value of destination IP address to be used in filtering.
23855          * For IPv4, first four bytes represent the IP address.
23856          */
23857         uint32_t        dst_ipaddr[4];
23858         /*
23859          * The value of source port to be used in filtering.
23860          * Applies to UDP and TCP traffic.
23861          */
23862         uint16_t        src_port;
23863         /*
23864          * The value of destination port to be used in filtering.
23865          * Applies to UDP and TCP traffic.
23866          */
23867         uint16_t        dst_port;
23868         /*
23869          * If set, this value shall represent the
23870          * Logical VNIC ID of the destination VNIC for the RX
23871          * path.
23872          */
23873         uint16_t        dst_id;
23874         /*
23875          * If set, this value shall represent the L2 context that matches the L2
23876          * information of the decap filter.
23877          */
23878         uint16_t        l2_ctxt_ref_id;
23879 } __attribute__((packed));
23880
23881 /* hwrm_cfa_decap_filter_alloc_output (size:128b/16B) */
23882 struct hwrm_cfa_decap_filter_alloc_output {
23883         /* The specific error status for the command. */
23884         uint16_t        error_code;
23885         /* The HWRM command request type. */
23886         uint16_t        req_type;
23887         /* The sequence ID from the original command. */
23888         uint16_t        seq_id;
23889         /* The length of the response data in number of bytes. */
23890         uint16_t        resp_len;
23891         /* This value is an opaque id into CFA data structures. */
23892         uint32_t        decap_filter_id;
23893         uint8_t unused_0[3];
23894         /*
23895          * This field is used in Output records to indicate that the output
23896          * is completely written to RAM.  This field should be read as '1'
23897          * to indicate that the output has been completely written.
23898          * When writing a command completion or response to an internal processor,
23899          * the order of writes has to be such that this field is written last.
23900          */
23901         uint8_t valid;
23902 } __attribute__((packed));
23903
23904 /******************************
23905  * hwrm_cfa_decap_filter_free *
23906  ******************************/
23907
23908
23909 /* hwrm_cfa_decap_filter_free_input (size:192b/24B) */
23910 struct hwrm_cfa_decap_filter_free_input {
23911         /* The HWRM command request type. */
23912         uint16_t        req_type;
23913         /*
23914          * The completion ring to send the completion event on. This should
23915          * be the NQ ID returned from the `nq_alloc` HWRM command.
23916          */
23917         uint16_t        cmpl_ring;
23918         /*
23919          * The sequence ID is used by the driver for tracking multiple
23920          * commands. This ID is treated as opaque data by the firmware and
23921          * the value is returned in the `hwrm_resp_hdr` upon completion.
23922          */
23923         uint16_t        seq_id;
23924         /*
23925          * The target ID of the command:
23926          * * 0x0-0xFFF8 - The function ID
23927          * * 0xFFF8-0xFFFE - Reserved for internal processors
23928          * * 0xFFFF - HWRM
23929          */
23930         uint16_t        target_id;
23931         /*
23932          * A physical address pointer pointing to a host buffer that the
23933          * command's response data will be written. This can be either a host
23934          * physical address (HPA) or a guest physical address (GPA) and must
23935          * point to a physically contiguous block of memory.
23936          */
23937         uint64_t        resp_addr;
23938         /* This value is an opaque id into CFA data structures. */
23939         uint32_t        decap_filter_id;
23940         uint8_t unused_0[4];
23941 } __attribute__((packed));
23942
23943 /* hwrm_cfa_decap_filter_free_output (size:128b/16B) */
23944 struct hwrm_cfa_decap_filter_free_output {
23945         /* The specific error status for the command. */
23946         uint16_t        error_code;
23947         /* The HWRM command request type. */
23948         uint16_t        req_type;
23949         /* The sequence ID from the original command. */
23950         uint16_t        seq_id;
23951         /* The length of the response data in number of bytes. */
23952         uint16_t        resp_len;
23953         uint8_t unused_0[7];
23954         /*
23955          * This field is used in Output records to indicate that the output
23956          * is completely written to RAM.  This field should be read as '1'
23957          * to indicate that the output has been completely written.
23958          * When writing a command completion or response to an internal processor,
23959          * the order of writes has to be such that this field is written last.
23960          */
23961         uint8_t valid;
23962 } __attribute__((packed));
23963
23964 /***********************
23965  * hwrm_cfa_flow_alloc *
23966  ***********************/
23967
23968
23969 /* hwrm_cfa_flow_alloc_input (size:1024b/128B) */
23970 struct hwrm_cfa_flow_alloc_input {
23971         /* The HWRM command request type. */
23972         uint16_t        req_type;
23973         /*
23974          * The completion ring to send the completion event on. This should
23975          * be the NQ ID returned from the `nq_alloc` HWRM command.
23976          */
23977         uint16_t        cmpl_ring;
23978         /*
23979          * The sequence ID is used by the driver for tracking multiple
23980          * commands. This ID is treated as opaque data by the firmware and
23981          * the value is returned in the `hwrm_resp_hdr` upon completion.
23982          */
23983         uint16_t        seq_id;
23984         /*
23985          * The target ID of the command:
23986          * * 0x0-0xFFF8 - The function ID
23987          * * 0xFFF8-0xFFFE - Reserved for internal processors
23988          * * 0xFFFF - HWRM
23989          */
23990         uint16_t        target_id;
23991         /*
23992          * A physical address pointer pointing to a host buffer that the
23993          * command's response data will be written. This can be either a host
23994          * physical address (HPA) or a guest physical address (GPA) and must
23995          * point to a physically contiguous block of memory.
23996          */
23997         uint64_t        resp_addr;
23998         uint16_t        flags;
23999         /* tunnel is 1 b */
24000         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_TUNNEL \
24001                 UINT32_C(0x1)
24002         /* num_vlan is 2 b */
24003         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_NUM_VLAN_MASK \
24004                 UINT32_C(0x6)
24005         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_NUM_VLAN_SFT           1
24006         /* no tags */
24007         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_NUM_VLAN_NONE \
24008                 (UINT32_C(0x0) << 1)
24009         /* 1 tag */
24010         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_NUM_VLAN_ONE \
24011                 (UINT32_C(0x1) << 1)
24012         /* 2 tags */
24013         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_NUM_VLAN_TWO \
24014                 (UINT32_C(0x2) << 1)
24015         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_NUM_VLAN_LAST \
24016                 HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_NUM_VLAN_TWO
24017         /* Enumeration denoting the Flow Type. */
24018         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_FLOWTYPE_MASK \
24019                 UINT32_C(0x38)
24020         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_FLOWTYPE_SFT           3
24021         /* L2 flow */
24022         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_FLOWTYPE_L2 \
24023                 (UINT32_C(0x0) << 3)
24024         /* IPV4 flow */
24025         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_FLOWTYPE_IPV4 \
24026                 (UINT32_C(0x1) << 3)
24027         /* IPV6 flow */
24028         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_FLOWTYPE_IPV6 \
24029                 (UINT32_C(0x2) << 3)
24030         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_FLOWTYPE_LAST \
24031                 HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_FLOWTYPE_IPV6
24032         /*
24033          * when set to 1, indicates TX flow offload for function specified in src_fid and
24034          * the dst_fid should be set to invalid value. To indicate a VM to VM flow, both
24035          * of the path_tx and path_rx flags need to be set. For virtio vSwitch offload
24036          * case, the src_fid and dst_fid is set to the same fid value. For the SRIOV
24037          * vSwitch offload case, the src_fid and dst_fid must be set to the same VF FID
24038          * belong to the children VFs of the same PF to indicate VM to VM flow.
24039          */
24040         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_PATH_TX \
24041                 UINT32_C(0x40)
24042         /*
24043          * when set to 1, indicates RX flow offload for function specified in dst_fid and
24044          * the src_fid should be set to invalid value.
24045          */
24046         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_PATH_RX \
24047                 UINT32_C(0x80)
24048         /*
24049          * Set to 1 to indicate matching of VXLAN VNI from the custom vxlan header is
24050          * required and the VXLAN VNI value is stored in the first 24 bits of the dmac field.
24051          * This flag is only valid when the flow direction is RX.
24052          */
24053         #define HWRM_CFA_FLOW_ALLOC_INPUT_FLAGS_MATCH_VXLAN_IP_VNI \
24054                 UINT32_C(0x100)
24055         /*
24056          * Tx Flow: vf fid.
24057          * Rx Flow: pf fid.
24058          */
24059         uint16_t        src_fid;
24060         /* Tunnel handle valid when tunnel flag is set. */
24061         uint32_t        tunnel_handle;
24062         uint16_t        action_flags;
24063         /*
24064          * Setting of this flag indicates drop action. If this flag is not set,
24065          * then it should be considered accept action.
24066          */
24067         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_FWD \
24068                 UINT32_C(0x1)
24069         /* recycle is 1 b */
24070         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_RECYCLE \
24071                 UINT32_C(0x2)
24072         /*
24073          * Setting of this flag indicates drop action. If this flag is not set,
24074          * then it should be considered accept action.
24075          */
24076         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_DROP \
24077                 UINT32_C(0x4)
24078         /* meter is 1 b */
24079         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_METER \
24080                 UINT32_C(0x8)
24081         /* tunnel is 1 b */
24082         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_TUNNEL \
24083                 UINT32_C(0x10)
24084         /* nat_src is 1 b */
24085         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_NAT_SRC \
24086                 UINT32_C(0x20)
24087         /* nat_dest is 1 b */
24088         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_NAT_DEST \
24089                 UINT32_C(0x40)
24090         /* nat_ipv4_address is 1 b */
24091         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_NAT_IPV4_ADDRESS \
24092                 UINT32_C(0x80)
24093         /* l2_header_rewrite is 1 b */
24094         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_L2_HEADER_REWRITE \
24095                 UINT32_C(0x100)
24096         /* ttl_decrement is 1 b */
24097         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_TTL_DECREMENT \
24098                 UINT32_C(0x200)
24099         /*
24100          * If set to 1 and flow direction is TX, it indicates decap of L2 header
24101          * and encap of tunnel header. If set to 1 and flow direction is RX, it
24102          * indicates decap of tunnel header and encap L2 header. The type of tunnel
24103          * is specified in the tunnel_type field.
24104          */
24105         #define HWRM_CFA_FLOW_ALLOC_INPUT_ACTION_FLAGS_TUNNEL_IP \
24106                 UINT32_C(0x400)
24107         /*
24108          * Tx Flow: pf or vf fid.
24109          * Rx Flow: vf fid.
24110          */
24111         uint16_t        dst_fid;
24112         /* VLAN tpid, valid when push_vlan flag is set. */
24113         uint16_t        l2_rewrite_vlan_tpid;
24114         /* VLAN tci, valid when push_vlan flag is set. */
24115         uint16_t        l2_rewrite_vlan_tci;
24116         /* Meter id, valid when meter flag is set. */
24117         uint16_t        act_meter_id;
24118         /* Flow with the same l2 context tcam key. */
24119         uint16_t        ref_flow_handle;
24120         /* This value sets the match value for the ethertype. */
24121         uint16_t        ethertype;
24122         /* valid when num tags is 1 or 2. */
24123         uint16_t        outer_vlan_tci;
24124         /* This value sets the match value for the Destination MAC address. */
24125         uint16_t        dmac[3];
24126         /* valid when num tags is 2. */
24127         uint16_t        inner_vlan_tci;
24128         /* This value sets the match value for the Source MAC address. */
24129         uint16_t        smac[3];
24130         /* The bit length of destination IP address mask. */
24131         uint8_t ip_dst_mask_len;
24132         /* The bit length of source IP address mask. */
24133         uint8_t ip_src_mask_len;
24134         /* The value of destination IPv4/IPv6 address. */
24135         uint32_t        ip_dst[4];
24136         /* The source IPv4/IPv6 address. */
24137         uint32_t        ip_src[4];
24138         /*
24139          * The value of source port.
24140          * Applies to UDP and TCP traffic.
24141          */
24142         uint16_t        l4_src_port;
24143         /*
24144          * The value of source port mask.
24145          * Applies to UDP and TCP traffic.
24146          */
24147         uint16_t        l4_src_port_mask;
24148         /*
24149          * The value of destination port.
24150          * Applies to UDP and TCP traffic.
24151          */
24152         uint16_t        l4_dst_port;
24153         /*
24154          * The value of destination port mask.
24155          * Applies to UDP and TCP traffic.
24156          */
24157         uint16_t        l4_dst_port_mask;
24158         /*
24159          * NAT IPv4/6 address based on address type flag.
24160          * 0 values are ignored.
24161          */
24162         uint32_t        nat_ip_address[4];
24163         /* L2 header re-write Destination MAC address. */
24164         uint16_t        l2_rewrite_dmac[3];
24165         /*
24166          * The NAT source/destination port based on direction flag.
24167          * Applies to UDP and TCP traffic.
24168          * 0 values are ignored.
24169          */
24170         uint16_t        nat_port;
24171         /* L2 header re-write Source MAC address. */
24172         uint16_t        l2_rewrite_smac[3];
24173         /* The value of ip protocol. */
24174         uint8_t ip_proto;
24175         /* Tunnel Type. */
24176         uint8_t tunnel_type;
24177         /* Non-tunnel */
24178         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_NONTUNNEL UINT32_C(0x0)
24179         /* Virtual eXtensible Local Area Network (VXLAN) */
24180         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_VXLAN     UINT32_C(0x1)
24181         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
24182         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_NVGRE     UINT32_C(0x2)
24183         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
24184         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_L2GRE     UINT32_C(0x3)
24185         /* IP in IP */
24186         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_IPIP      UINT32_C(0x4)
24187         /* Generic Network Virtualization Encapsulation (Geneve) */
24188         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_GENEVE    UINT32_C(0x5)
24189         /* Multi-Protocol Lable Switching (MPLS) */
24190         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_MPLS      UINT32_C(0x6)
24191         /* Stateless Transport Tunnel (STT) */
24192         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_STT       UINT32_C(0x7)
24193         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
24194         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_IPGRE     UINT32_C(0x8)
24195         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
24196         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_VXLAN_V4  UINT32_C(0x9)
24197         /* Any tunneled traffic */
24198         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL UINT32_C(0xff)
24199         #define HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_LAST \
24200                 HWRM_CFA_FLOW_ALLOC_INPUT_TUNNEL_TYPE_ANYTUNNEL
24201 } __attribute__((packed));
24202
24203 /* hwrm_cfa_flow_alloc_output (size:256b/32B) */
24204 struct hwrm_cfa_flow_alloc_output {
24205         /* The specific error status for the command. */
24206         uint16_t        error_code;
24207         /* The HWRM command request type. */
24208         uint16_t        req_type;
24209         /* The sequence ID from the original command. */
24210         uint16_t        seq_id;
24211         /* The length of the response data in number of bytes. */
24212         uint16_t        resp_len;
24213         /* Flow record index. */
24214         uint16_t        flow_handle;
24215         uint8_t unused_0[2];
24216         /*
24217          * This is the ID of the flow associated with this
24218          * filter.
24219          * This value shall be used to match and associate the
24220          * flow identifier returned in completion records.
24221          * A value of 0xFFFFFFFF shall indicate no flow id.
24222          */
24223         uint32_t        flow_id;
24224         /* This value identifies a set of CFA data structures used for a flow. */
24225         uint64_t        ext_flow_handle;
24226         uint8_t unused_1[7];
24227         /*
24228          * This field is used in Output records to indicate that the output
24229          * is completely written to RAM.  This field should be read as '1'
24230          * to indicate that the output has been completely written.
24231          * When writing a command completion or response to an internal processor,
24232          * the order of writes has to be such that this field is written last.
24233          */
24234         uint8_t valid;
24235 } __attribute__((packed));
24236
24237 /**********************
24238  * hwrm_cfa_flow_free *
24239  **********************/
24240
24241
24242 /* hwrm_cfa_flow_free_input (size:256b/32B) */
24243 struct hwrm_cfa_flow_free_input {
24244         /* The HWRM command request type. */
24245         uint16_t        req_type;
24246         /*
24247          * The completion ring to send the completion event on. This should
24248          * be the NQ ID returned from the `nq_alloc` HWRM command.
24249          */
24250         uint16_t        cmpl_ring;
24251         /*
24252          * The sequence ID is used by the driver for tracking multiple
24253          * commands. This ID is treated as opaque data by the firmware and
24254          * the value is returned in the `hwrm_resp_hdr` upon completion.
24255          */
24256         uint16_t        seq_id;
24257         /*
24258          * The target ID of the command:
24259          * * 0x0-0xFFF8 - The function ID
24260          * * 0xFFF8-0xFFFE - Reserved for internal processors
24261          * * 0xFFFF - HWRM
24262          */
24263         uint16_t        target_id;
24264         /*
24265          * A physical address pointer pointing to a host buffer that the
24266          * command's response data will be written. This can be either a host
24267          * physical address (HPA) or a guest physical address (GPA) and must
24268          * point to a physically contiguous block of memory.
24269          */
24270         uint64_t        resp_addr;
24271         /* Flow record index. */
24272         uint16_t        flow_handle;
24273         uint8_t unused_0[6];
24274         /* This value identifies a set of CFA data structures used for a flow. */
24275         uint64_t        ext_flow_handle;
24276 } __attribute__((packed));
24277
24278 /* hwrm_cfa_flow_free_output (size:256b/32B) */
24279 struct hwrm_cfa_flow_free_output {
24280         /* The specific error status for the command. */
24281         uint16_t        error_code;
24282         /* The HWRM command request type. */
24283         uint16_t        req_type;
24284         /* The sequence ID from the original command. */
24285         uint16_t        seq_id;
24286         /* The length of the response data in number of bytes. */
24287         uint16_t        resp_len;
24288         /* packet is 64 b */
24289         uint64_t        packet;
24290         /* byte is 64 b */
24291         uint64_t        byte;
24292         uint8_t unused_0[7];
24293         /*
24294          * This field is used in Output records to indicate that the output
24295          * is completely written to RAM.  This field should be read as '1'
24296          * to indicate that the output has been completely written.
24297          * When writing a command completion or response to an internal processor,
24298          * the order of writes has to be such that this field is written last.
24299          */
24300         uint8_t valid;
24301 } __attribute__((packed));
24302
24303 /***********************
24304  * hwrm_cfa_flow_flush *
24305  ***********************/
24306
24307
24308 /* hwrm_cfa_flow_flush_input (size:192b/24B) */
24309 struct hwrm_cfa_flow_flush_input {
24310         /* The HWRM command request type. */
24311         uint16_t        req_type;
24312         /*
24313          * The completion ring to send the completion event on. This should
24314          * be the NQ ID returned from the `nq_alloc` HWRM command.
24315          */
24316         uint16_t        cmpl_ring;
24317         /*
24318          * The sequence ID is used by the driver for tracking multiple
24319          * commands. This ID is treated as opaque data by the firmware and
24320          * the value is returned in the `hwrm_resp_hdr` upon completion.
24321          */
24322         uint16_t        seq_id;
24323         /*
24324          * The target ID of the command:
24325          * * 0x0-0xFFF8 - The function ID
24326          * * 0xFFF8-0xFFFE - Reserved for internal processors
24327          * * 0xFFFF - HWRM
24328          */
24329         uint16_t        target_id;
24330         /*
24331          * A physical address pointer pointing to a host buffer that the
24332          * command's response data will be written. This can be either a host
24333          * physical address (HPA) or a guest physical address (GPA) and must
24334          * point to a physically contiguous block of memory.
24335          */
24336         uint64_t        resp_addr;
24337         uint32_t        flags;
24338         uint8_t unused_0[4];
24339 } __attribute__((packed));
24340
24341 /* hwrm_cfa_flow_flush_output (size:128b/16B) */
24342 struct hwrm_cfa_flow_flush_output {
24343         /* The specific error status for the command. */
24344         uint16_t        error_code;
24345         /* The HWRM command request type. */
24346         uint16_t        req_type;
24347         /* The sequence ID from the original command. */
24348         uint16_t        seq_id;
24349         /* The length of the response data in number of bytes. */
24350         uint16_t        resp_len;
24351         uint8_t unused_0[7];
24352         /*
24353          * This field is used in Output records to indicate that the output
24354          * is completely written to RAM.  This field should be read as '1'
24355          * to indicate that the output has been completely written.
24356          * When writing a command completion or response to an internal processor,
24357          * the order of writes has to be such that this field is written last.
24358          */
24359         uint8_t valid;
24360 } __attribute__((packed));
24361
24362 /***********************
24363  * hwrm_cfa_flow_stats *
24364  ***********************/
24365
24366
24367 /* hwrm_cfa_flow_stats_input (size:640b/80B) */
24368 struct hwrm_cfa_flow_stats_input {
24369         /* The HWRM command request type. */
24370         uint16_t        req_type;
24371         /*
24372          * The completion ring to send the completion event on. This should
24373          * be the NQ ID returned from the `nq_alloc` HWRM command.
24374          */
24375         uint16_t        cmpl_ring;
24376         /*
24377          * The sequence ID is used by the driver for tracking multiple
24378          * commands. This ID is treated as opaque data by the firmware and
24379          * the value is returned in the `hwrm_resp_hdr` upon completion.
24380          */
24381         uint16_t        seq_id;
24382         /*
24383          * The target ID of the command:
24384          * * 0x0-0xFFF8 - The function ID
24385          * * 0xFFF8-0xFFFE - Reserved for internal processors
24386          * * 0xFFFF - HWRM
24387          */
24388         uint16_t        target_id;
24389         /*
24390          * A physical address pointer pointing to a host buffer that the
24391          * command's response data will be written. This can be either a host
24392          * physical address (HPA) or a guest physical address (GPA) and must
24393          * point to a physically contiguous block of memory.
24394          */
24395         uint64_t        resp_addr;
24396         /* Flow handle. */
24397         uint16_t        num_flows;
24398         /* Flow handle. */
24399         uint16_t        flow_handle_0;
24400         /* Flow handle. */
24401         uint16_t        flow_handle_1;
24402         /* Flow handle. */
24403         uint16_t        flow_handle_2;
24404         /* Flow handle. */
24405         uint16_t        flow_handle_3;
24406         /* Flow handle. */
24407         uint16_t        flow_handle_4;
24408         /* Flow handle. */
24409         uint16_t        flow_handle_5;
24410         /* Flow handle. */
24411         uint16_t        flow_handle_6;
24412         /* Flow handle. */
24413         uint16_t        flow_handle_7;
24414         /* Flow handle. */
24415         uint16_t        flow_handle_8;
24416         /* Flow handle. */
24417         uint16_t        flow_handle_9;
24418         uint8_t unused_0[2];
24419         /* Flow ID of a flow. */
24420         uint32_t        flow_id_0;
24421         /* Flow ID of a flow. */
24422         uint32_t        flow_id_1;
24423         /* Flow ID of a flow. */
24424         uint32_t        flow_id_2;
24425         /* Flow ID of a flow. */
24426         uint32_t        flow_id_3;
24427         /* Flow ID of a flow. */
24428         uint32_t        flow_id_4;
24429         /* Flow ID of a flow. */
24430         uint32_t        flow_id_5;
24431         /* Flow ID of a flow. */
24432         uint32_t        flow_id_6;
24433         /* Flow ID of a flow. */
24434         uint32_t        flow_id_7;
24435         /* Flow ID of a flow. */
24436         uint32_t        flow_id_8;
24437         /* Flow ID of a flow. */
24438         uint32_t        flow_id_9;
24439 } __attribute__((packed));
24440
24441 /* hwrm_cfa_flow_stats_output (size:1408b/176B) */
24442 struct hwrm_cfa_flow_stats_output {
24443         /* The specific error status for the command. */
24444         uint16_t        error_code;
24445         /* The HWRM command request type. */
24446         uint16_t        req_type;
24447         /* The sequence ID from the original command. */
24448         uint16_t        seq_id;
24449         /* The length of the response data in number of bytes. */
24450         uint16_t        resp_len;
24451         /* packet_0 is 64 b */
24452         uint64_t        packet_0;
24453         /* packet_1 is 64 b */
24454         uint64_t        packet_1;
24455         /* packet_2 is 64 b */
24456         uint64_t        packet_2;
24457         /* packet_3 is 64 b */
24458         uint64_t        packet_3;
24459         /* packet_4 is 64 b */
24460         uint64_t        packet_4;
24461         /* packet_5 is 64 b */
24462         uint64_t        packet_5;
24463         /* packet_6 is 64 b */
24464         uint64_t        packet_6;
24465         /* packet_7 is 64 b */
24466         uint64_t        packet_7;
24467         /* packet_8 is 64 b */
24468         uint64_t        packet_8;
24469         /* packet_9 is 64 b */
24470         uint64_t        packet_9;
24471         /* byte_0 is 64 b */
24472         uint64_t        byte_0;
24473         /* byte_1 is 64 b */
24474         uint64_t        byte_1;
24475         /* byte_2 is 64 b */
24476         uint64_t        byte_2;
24477         /* byte_3 is 64 b */
24478         uint64_t        byte_3;
24479         /* byte_4 is 64 b */
24480         uint64_t        byte_4;
24481         /* byte_5 is 64 b */
24482         uint64_t        byte_5;
24483         /* byte_6 is 64 b */
24484         uint64_t        byte_6;
24485         /* byte_7 is 64 b */
24486         uint64_t        byte_7;
24487         /* byte_8 is 64 b */
24488         uint64_t        byte_8;
24489         /* byte_9 is 64 b */
24490         uint64_t        byte_9;
24491         uint8_t unused_0[7];
24492         /*
24493          * This field is used in Output records to indicate that the output
24494          * is completely written to RAM.  This field should be read as '1'
24495          * to indicate that the output has been completely written.
24496          * When writing a command completion or response to an internal processor,
24497          * the order of writes has to be such that this field is written last.
24498          */
24499         uint8_t valid;
24500 } __attribute__((packed));
24501
24502 /**********************
24503  * hwrm_cfa_pair_info *
24504  **********************/
24505
24506
24507 /* hwrm_cfa_pair_info_input (size:448b/56B) */
24508 struct hwrm_cfa_pair_info_input {
24509         /* The HWRM command request type. */
24510         uint16_t        req_type;
24511         /*
24512          * The completion ring to send the completion event on. This should
24513          * be the NQ ID returned from the `nq_alloc` HWRM command.
24514          */
24515         uint16_t        cmpl_ring;
24516         /*
24517          * The sequence ID is used by the driver for tracking multiple
24518          * commands. This ID is treated as opaque data by the firmware and
24519          * the value is returned in the `hwrm_resp_hdr` upon completion.
24520          */
24521         uint16_t        seq_id;
24522         /*
24523          * The target ID of the command:
24524          * * 0x0-0xFFF8 - The function ID
24525          * * 0xFFF8-0xFFFE - Reserved for internal processors
24526          * * 0xFFFF - HWRM
24527          */
24528         uint16_t        target_id;
24529         /*
24530          * A physical address pointer pointing to a host buffer that the
24531          * command's response data will be written. This can be either a host
24532          * physical address (HPA) or a guest physical address (GPA) and must
24533          * point to a physically contiguous block of memory.
24534          */
24535         uint64_t        resp_addr;
24536         uint32_t        flags;
24537         /* If this flag is set, lookup by name else lookup by index. */
24538         #define HWRM_CFA_PAIR_INFO_INPUT_FLAGS_LOOKUP_TYPE      UINT32_C(0x1)
24539         /* If this flag is set, lookup by PF id and VF id. */
24540         #define HWRM_CFA_PAIR_INFO_INPUT_FLAGS_LOOKUP_REPRE     UINT32_C(0x2)
24541         /* Pair table index. */
24542         uint16_t        pair_index;
24543         /* Pair pf index. */
24544         uint8_t pair_pfid;
24545         /* Pair vf index. */
24546         uint8_t pair_vfid;
24547         /* Pair name (32 byte string). */
24548         char    pair_name[32];
24549 } __attribute__((packed));
24550
24551 /* hwrm_cfa_pair_info_output (size:576b/72B) */
24552 struct hwrm_cfa_pair_info_output {
24553         /* The specific error status for the command. */
24554         uint16_t        error_code;
24555         /* The HWRM command request type. */
24556         uint16_t        req_type;
24557         /* The sequence ID from the original command. */
24558         uint16_t        seq_id;
24559         /* The length of the response data in number of bytes. */
24560         uint16_t        resp_len;
24561         /* Pair table index. */
24562         uint16_t        next_pair_index;
24563         /* Pair member a's fid. */
24564         uint16_t        a_fid;
24565         /* Logical host number. */
24566         uint8_t host_a_index;
24567         /* Logical PF number. */
24568         uint8_t pf_a_index;
24569         /* Pair member a's Linux logical VF number. */
24570         uint16_t        vf_a_index;
24571         /* Rx CFA code. */
24572         uint16_t        rx_cfa_code_a;
24573         /* Tx CFA action. */
24574         uint16_t        tx_cfa_action_a;
24575         /* Pair member b's fid. */
24576         uint16_t        b_fid;
24577         /* Logical host number. */
24578         uint8_t host_b_index;
24579         /* Logical PF number. */
24580         uint8_t pf_b_index;
24581         /* Pair member a's Linux logical VF number. */
24582         uint16_t        vf_b_index;
24583         /* Rx CFA code. */
24584         uint16_t        rx_cfa_code_b;
24585         /* Tx CFA action. */
24586         uint16_t        tx_cfa_action_b;
24587         /* Pair mode (0-vf2fn, 1-rep2fn, 2-rep2rep, 3-proxy, 4-pfpair). */
24588         uint8_t pair_mode;
24589         /* Pair between VF on local host with PF or VF on specified host. */
24590         #define HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_MODE_VF2FN   UINT32_C(0x0)
24591         /* Pair between REP on local host with PF or VF on specified host. */
24592         #define HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_MODE_REP2FN  UINT32_C(0x1)
24593         /* Pair between REP on local host with REP on specified host. */
24594         #define HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_MODE_REP2REP UINT32_C(0x2)
24595         /* Pair for the proxy interface. */
24596         #define HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_MODE_PROXY   UINT32_C(0x3)
24597         /* Pair for the PF interface. */
24598         #define HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_MODE_PFPAIR  UINT32_C(0x4)
24599         #define HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_MODE_LAST \
24600                 HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_MODE_PFPAIR
24601         /* Pair state. */
24602         uint8_t pair_state;
24603         /* Pair has been allocated */
24604         #define HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_STATE_ALLOCATED UINT32_C(0x1)
24605         /* Both pair members are active */
24606         #define HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_STATE_ACTIVE    UINT32_C(0x2)
24607         #define HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_STATE_LAST \
24608                 HWRM_CFA_PAIR_INFO_OUTPUT_PAIR_STATE_ACTIVE
24609         /* Pair name (32 byte string). */
24610         char    pair_name[32];
24611         uint8_t unused_0[7];
24612         /*
24613          * This field is used in Output records to indicate that the output
24614          * is completely written to RAM.  This field should be read as '1'
24615          * to indicate that the output has been completely written.
24616          * When writing a command completion or response to an internal processor,
24617          * the order of writes has to be such that this field is written last.
24618          */
24619         uint8_t valid;
24620 } __attribute__((packed));
24621
24622 /***************************************
24623  * hwrm_cfa_redirect_query_tunnel_type *
24624  ***************************************/
24625
24626
24627 /* hwrm_cfa_redirect_query_tunnel_type_input (size:192b/24B) */
24628 struct hwrm_cfa_redirect_query_tunnel_type_input {
24629         /* The HWRM command request type. */
24630         uint16_t        req_type;
24631         /*
24632          * The completion ring to send the completion event on. This should
24633          * be the NQ ID returned from the `nq_alloc` HWRM command.
24634          */
24635         uint16_t        cmpl_ring;
24636         /*
24637          * The sequence ID is used by the driver for tracking multiple
24638          * commands. This ID is treated as opaque data by the firmware and
24639          * the value is returned in the `hwrm_resp_hdr` upon completion.
24640          */
24641         uint16_t        seq_id;
24642         /*
24643          * The target ID of the command:
24644          * * 0x0-0xFFF8 - The function ID
24645          * * 0xFFF8-0xFFFE - Reserved for internal processors
24646          * * 0xFFFF - HWRM
24647          */
24648         uint16_t        target_id;
24649         /*
24650          * A physical address pointer pointing to a host buffer that the
24651          * command's response data will be written. This can be either a host
24652          * physical address (HPA) or a guest physical address (GPA) and must
24653          * point to a physically contiguous block of memory.
24654          */
24655         uint64_t        resp_addr;
24656         /* The source function id. */
24657         uint16_t        src_fid;
24658         uint8_t unused_0[6];
24659 } __attribute__((packed));
24660
24661 /* hwrm_cfa_redirect_query_tunnel_type_output (size:128b/16B) */
24662 struct hwrm_cfa_redirect_query_tunnel_type_output {
24663         /* The specific error status for the command. */
24664         uint16_t        error_code;
24665         /* The HWRM command request type. */
24666         uint16_t        req_type;
24667         /* The sequence ID from the original command. */
24668         uint16_t        seq_id;
24669         /* The length of the response data in number of bytes. */
24670         uint16_t        resp_len;
24671         /* Tunnel Mask. */
24672         uint32_t        tunnel_mask;
24673         /* Non-tunnel */
24674         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_NONTUNNEL \
24675                 UINT32_C(0x1)
24676         /* Virtual eXtensible Local Area Network (VXLAN) */
24677         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_VXLAN \
24678                 UINT32_C(0x2)
24679         /* Network Virtualization Generic Routing Encapsulation (NVGRE) */
24680         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_NVGRE \
24681                 UINT32_C(0x4)
24682         /* Generic Routing Encapsulation (GRE) inside Ethernet payload */
24683         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_L2GRE \
24684                 UINT32_C(0x8)
24685         /* IP in IP */
24686         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_IPIP \
24687                 UINT32_C(0x10)
24688         /* Generic Network Virtualization Encapsulation (Geneve) */
24689         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_GENEVE \
24690                 UINT32_C(0x20)
24691         /* Multi-Protocol Lable Switching (MPLS) */
24692         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_MPLS \
24693                 UINT32_C(0x40)
24694         /* Stateless Transport Tunnel (STT) */
24695         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_STT \
24696                 UINT32_C(0x80)
24697         /* Generic Routing Encapsulation (GRE) inside IP datagram payload */
24698         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_IPGRE \
24699                 UINT32_C(0x100)
24700         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
24701         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_VXLAN_V4 \
24702                 UINT32_C(0x200)
24703         /* Enhance Generic Routing Encapsulation (GRE version 1) inside IP datagram payload */
24704         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_IPGRE_V1 \
24705                 UINT32_C(0x400)
24706         /* Any tunneled traffic */
24707         #define HWRM_CFA_REDIRECT_QUERY_TUNNEL_TYPE_OUTPUT_TUNNEL_MASK_ANYTUNNEL \
24708                 UINT32_C(0x800)
24709         uint8_t unused_0[3];
24710         /*
24711          * This field is used in Output records to indicate that the output
24712          * is completely written to RAM.  This field should be read as '1'
24713          * to indicate that the output has been completely written.
24714          * When writing a command completion or response to an internal processor,
24715          * the order of writes has to be such that this field is written last.
24716          */
24717         uint8_t valid;
24718 } __attribute__((packed));
24719
24720 /******************************
24721  * hwrm_tunnel_dst_port_query *
24722  ******************************/
24723
24724
24725 /* hwrm_tunnel_dst_port_query_input (size:192b/24B) */
24726 struct hwrm_tunnel_dst_port_query_input {
24727         /* The HWRM command request type. */
24728         uint16_t        req_type;
24729         /*
24730          * The completion ring to send the completion event on. This should
24731          * be the NQ ID returned from the `nq_alloc` HWRM command.
24732          */
24733         uint16_t        cmpl_ring;
24734         /*
24735          * The sequence ID is used by the driver for tracking multiple
24736          * commands. This ID is treated as opaque data by the firmware and
24737          * the value is returned in the `hwrm_resp_hdr` upon completion.
24738          */
24739         uint16_t        seq_id;
24740         /*
24741          * The target ID of the command:
24742          * * 0x0-0xFFF8 - The function ID
24743          * * 0xFFF8-0xFFFE - Reserved for internal processors
24744          * * 0xFFFF - HWRM
24745          */
24746         uint16_t        target_id;
24747         /*
24748          * A physical address pointer pointing to a host buffer that the
24749          * command's response data will be written. This can be either a host
24750          * physical address (HPA) or a guest physical address (GPA) and must
24751          * point to a physically contiguous block of memory.
24752          */
24753         uint64_t        resp_addr;
24754         /* Tunnel Type. */
24755         uint8_t tunnel_type;
24756         /* Virtual eXtensible Local Area Network (VXLAN) */
24757         #define HWRM_TUNNEL_DST_PORT_QUERY_INPUT_TUNNEL_TYPE_VXLAN \
24758                 UINT32_C(0x1)
24759         /* Generic Network Virtualization Encapsulation (Geneve) */
24760         #define HWRM_TUNNEL_DST_PORT_QUERY_INPUT_TUNNEL_TYPE_GENEVE \
24761                 UINT32_C(0x5)
24762         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
24763         #define HWRM_TUNNEL_DST_PORT_QUERY_INPUT_TUNNEL_TYPE_VXLAN_V4 \
24764                 UINT32_C(0x9)
24765         /* Enhance Generic Routing Encapsulation (GRE version 1) inside IP datagram payload */
24766         #define HWRM_TUNNEL_DST_PORT_QUERY_INPUT_TUNNEL_TYPE_IPGRE_V1 \
24767                 UINT32_C(0xa)
24768         #define HWRM_TUNNEL_DST_PORT_QUERY_INPUT_TUNNEL_TYPE_LAST \
24769                 HWRM_TUNNEL_DST_PORT_QUERY_INPUT_TUNNEL_TYPE_IPGRE_V1
24770         uint8_t unused_0[7];
24771 } __attribute__((packed));
24772
24773 /* hwrm_tunnel_dst_port_query_output (size:128b/16B) */
24774 struct hwrm_tunnel_dst_port_query_output {
24775         /* The specific error status for the command. */
24776         uint16_t        error_code;
24777         /* The HWRM command request type. */
24778         uint16_t        req_type;
24779         /* The sequence ID from the original command. */
24780         uint16_t        seq_id;
24781         /* The length of the response data in number of bytes. */
24782         uint16_t        resp_len;
24783         /*
24784          * This field represents the identifier of L4 destination port
24785          * used for the given tunnel type. This field is valid for
24786          * specific tunnel types that use layer 4 (e.g. UDP)
24787          * transports for tunneling.
24788          */
24789         uint16_t        tunnel_dst_port_id;
24790         /*
24791          * This field represents the value of L4 destination port
24792          * identified by tunnel_dst_port_id. This field is valid for
24793          * specific tunnel types that use layer 4 (e.g. UDP)
24794          * transports for tunneling.
24795          * This field is in network byte order.
24796          *
24797          * A value of 0 means that the destination port is not
24798          * configured.
24799          */
24800         uint16_t        tunnel_dst_port_val;
24801         uint8_t unused_0[3];
24802         /*
24803          * This field is used in Output records to indicate that the output
24804          * is completely written to RAM.  This field should be read as '1'
24805          * to indicate that the output has been completely written.
24806          * When writing a command completion or response to an internal processor,
24807          * the order of writes has to be such that this field is written last.
24808          */
24809         uint8_t valid;
24810 } __attribute__((packed));
24811
24812 /******************************
24813  * hwrm_tunnel_dst_port_alloc *
24814  ******************************/
24815
24816
24817 /* hwrm_tunnel_dst_port_alloc_input (size:192b/24B) */
24818 struct hwrm_tunnel_dst_port_alloc_input {
24819         /* The HWRM command request type. */
24820         uint16_t        req_type;
24821         /*
24822          * The completion ring to send the completion event on. This should
24823          * be the NQ ID returned from the `nq_alloc` HWRM command.
24824          */
24825         uint16_t        cmpl_ring;
24826         /*
24827          * The sequence ID is used by the driver for tracking multiple
24828          * commands. This ID is treated as opaque data by the firmware and
24829          * the value is returned in the `hwrm_resp_hdr` upon completion.
24830          */
24831         uint16_t        seq_id;
24832         /*
24833          * The target ID of the command:
24834          * * 0x0-0xFFF8 - The function ID
24835          * * 0xFFF8-0xFFFE - Reserved for internal processors
24836          * * 0xFFFF - HWRM
24837          */
24838         uint16_t        target_id;
24839         /*
24840          * A physical address pointer pointing to a host buffer that the
24841          * command's response data will be written. This can be either a host
24842          * physical address (HPA) or a guest physical address (GPA) and must
24843          * point to a physically contiguous block of memory.
24844          */
24845         uint64_t        resp_addr;
24846         /* Tunnel Type. */
24847         uint8_t tunnel_type;
24848         /* Virtual eXtensible Local Area Network (VXLAN) */
24849         #define HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_VXLAN \
24850                 UINT32_C(0x1)
24851         /* Generic Network Virtualization Encapsulation (Geneve) */
24852         #define HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_GENEVE \
24853                 UINT32_C(0x5)
24854         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
24855         #define HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_VXLAN_V4 \
24856                 UINT32_C(0x9)
24857         /* Enhance Generic Routing Encapsulation (GRE version 1) inside IP datagram payload */
24858         #define HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_IPGRE_V1 \
24859                 UINT32_C(0xa)
24860         #define HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_LAST \
24861                 HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_IPGRE_V1
24862         uint8_t unused_0;
24863         /*
24864          * This field represents the value of L4 destination port used
24865          * for the given tunnel type. This field is valid for
24866          * specific tunnel types that use layer 4 (e.g. UDP)
24867          * transports for tunneling.
24868          *
24869          * This field is in network byte order.
24870          *
24871          * A value of 0 shall fail the command.
24872          */
24873         uint16_t        tunnel_dst_port_val;
24874         uint8_t unused_1[4];
24875 } __attribute__((packed));
24876
24877 /* hwrm_tunnel_dst_port_alloc_output (size:128b/16B) */
24878 struct hwrm_tunnel_dst_port_alloc_output {
24879         /* The specific error status for the command. */
24880         uint16_t        error_code;
24881         /* The HWRM command request type. */
24882         uint16_t        req_type;
24883         /* The sequence ID from the original command. */
24884         uint16_t        seq_id;
24885         /* The length of the response data in number of bytes. */
24886         uint16_t        resp_len;
24887         /*
24888          * Identifier of a tunnel L4 destination port value. Only applies to tunnel
24889          * types that has l4 destination port parameters.
24890          */
24891         uint16_t        tunnel_dst_port_id;
24892         uint8_t unused_0[5];
24893         /*
24894          * This field is used in Output records to indicate that the output
24895          * is completely written to RAM.  This field should be read as '1'
24896          * to indicate that the output has been completely written.
24897          * When writing a command completion or response to an internal processor,
24898          * the order of writes has to be such that this field is written last.
24899          */
24900         uint8_t valid;
24901 } __attribute__((packed));
24902
24903 /*****************************
24904  * hwrm_tunnel_dst_port_free *
24905  *****************************/
24906
24907
24908 /* hwrm_tunnel_dst_port_free_input (size:192b/24B) */
24909 struct hwrm_tunnel_dst_port_free_input {
24910         /* The HWRM command request type. */
24911         uint16_t        req_type;
24912         /*
24913          * The completion ring to send the completion event on. This should
24914          * be the NQ ID returned from the `nq_alloc` HWRM command.
24915          */
24916         uint16_t        cmpl_ring;
24917         /*
24918          * The sequence ID is used by the driver for tracking multiple
24919          * commands. This ID is treated as opaque data by the firmware and
24920          * the value is returned in the `hwrm_resp_hdr` upon completion.
24921          */
24922         uint16_t        seq_id;
24923         /*
24924          * The target ID of the command:
24925          * * 0x0-0xFFF8 - The function ID
24926          * * 0xFFF8-0xFFFE - Reserved for internal processors
24927          * * 0xFFFF - HWRM
24928          */
24929         uint16_t        target_id;
24930         /*
24931          * A physical address pointer pointing to a host buffer that the
24932          * command's response data will be written. This can be either a host
24933          * physical address (HPA) or a guest physical address (GPA) and must
24934          * point to a physically contiguous block of memory.
24935          */
24936         uint64_t        resp_addr;
24937         /* Tunnel Type. */
24938         uint8_t tunnel_type;
24939         /* Virtual eXtensible Local Area Network (VXLAN) */
24940         #define HWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_VXLAN \
24941                 UINT32_C(0x1)
24942         /* Generic Network Virtualization Encapsulation (Geneve) */
24943         #define HWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_GENEVE \
24944                 UINT32_C(0x5)
24945         /* IPV4 over virtual eXtensible Local Area Network (IPV4oVXLAN) */
24946         #define HWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_VXLAN_V4 \
24947                 UINT32_C(0x9)
24948         /* Enhance Generic Routing Encapsulation (GRE version 1) inside IP datagram payload */
24949         #define HWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_IPGRE_V1 \
24950                 UINT32_C(0xa)
24951         #define HWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_LAST \
24952                 HWRM_TUNNEL_DST_PORT_FREE_INPUT_TUNNEL_TYPE_IPGRE_V1
24953         uint8_t unused_0;
24954         /*
24955          * Identifier of a tunnel L4 destination port value. Only applies to tunnel
24956          * types that has l4 destination port parameters.
24957          */
24958         uint16_t        tunnel_dst_port_id;
24959         uint8_t unused_1[4];
24960 } __attribute__((packed));
24961
24962 /* hwrm_tunnel_dst_port_free_output (size:128b/16B) */
24963 struct hwrm_tunnel_dst_port_free_output {
24964         /* The specific error status for the command. */
24965         uint16_t        error_code;
24966         /* The HWRM command request type. */
24967         uint16_t        req_type;
24968         /* The sequence ID from the original command. */
24969         uint16_t        seq_id;
24970         /* The length of the response data in number of bytes. */
24971         uint16_t        resp_len;
24972         uint8_t unused_1[7];
24973         /*
24974          * This field is used in Output records to indicate that the output
24975          * is completely written to RAM.  This field should be read as '1'
24976          * to indicate that the output has been completely written.
24977          * When writing a command completion or response to an internal processor,
24978          * the order of writes has to be such that this field is written last.
24979          */
24980         uint8_t valid;
24981 } __attribute__((packed));
24982
24983 /* Periodic statistics context DMA to host. */
24984 /* ctx_hw_stats (size:1280b/160B) */
24985 struct ctx_hw_stats {
24986         /* Number of received unicast packets */
24987         uint64_t        rx_ucast_pkts;
24988         /* Number of received multicast packets */
24989         uint64_t        rx_mcast_pkts;
24990         /* Number of received broadcast packets */
24991         uint64_t        rx_bcast_pkts;
24992         /* Number of discarded packets on received path */
24993         uint64_t        rx_discard_pkts;
24994         /* Number of dropped packets on received path */
24995         uint64_t        rx_drop_pkts;
24996         /* Number of received bytes for unicast traffic */
24997         uint64_t        rx_ucast_bytes;
24998         /* Number of received bytes for multicast traffic */
24999         uint64_t        rx_mcast_bytes;
25000         /* Number of received bytes for broadcast traffic */
25001         uint64_t        rx_bcast_bytes;
25002         /* Number of transmitted unicast packets */
25003         uint64_t        tx_ucast_pkts;
25004         /* Number of transmitted multicast packets */
25005         uint64_t        tx_mcast_pkts;
25006         /* Number of transmitted broadcast packets */
25007         uint64_t        tx_bcast_pkts;
25008         /* Number of discarded packets on transmit path */
25009         uint64_t        tx_discard_pkts;
25010         /* Number of dropped packets on transmit path */
25011         uint64_t        tx_drop_pkts;
25012         /* Number of transmitted bytes for unicast traffic */
25013         uint64_t        tx_ucast_bytes;
25014         /* Number of transmitted bytes for multicast traffic */
25015         uint64_t        tx_mcast_bytes;
25016         /* Number of transmitted bytes for broadcast traffic */
25017         uint64_t        tx_bcast_bytes;
25018         /* Number of TPA packets */
25019         uint64_t        tpa_pkts;
25020         /* Number of TPA bytes */
25021         uint64_t        tpa_bytes;
25022         /* Number of TPA events */
25023         uint64_t        tpa_events;
25024         /* Number of TPA aborts */
25025         uint64_t        tpa_aborts;
25026 } __attribute__((packed));
25027
25028 /***********************
25029  * hwrm_stat_ctx_alloc *
25030  ***********************/
25031
25032
25033 /* hwrm_stat_ctx_alloc_input (size:256b/32B) */
25034 struct hwrm_stat_ctx_alloc_input {
25035         /* The HWRM command request type. */
25036         uint16_t        req_type;
25037         /*
25038          * The completion ring to send the completion event on. This should
25039          * be the NQ ID returned from the `nq_alloc` HWRM command.
25040          */
25041         uint16_t        cmpl_ring;
25042         /*
25043          * The sequence ID is used by the driver for tracking multiple
25044          * commands. This ID is treated as opaque data by the firmware and
25045          * the value is returned in the `hwrm_resp_hdr` upon completion.
25046          */
25047         uint16_t        seq_id;
25048         /*
25049          * The target ID of the command:
25050          * * 0x0-0xFFF8 - The function ID
25051          * * 0xFFF8-0xFFFE - Reserved for internal processors
25052          * * 0xFFFF - HWRM
25053          */
25054         uint16_t        target_id;
25055         /*
25056          * A physical address pointer pointing to a host buffer that the
25057          * command's response data will be written. This can be either a host
25058          * physical address (HPA) or a guest physical address (GPA) and must
25059          * point to a physically contiguous block of memory.
25060          */
25061         uint64_t        resp_addr;
25062         /* This is the address for statistic block. */
25063         uint64_t        stats_dma_addr;
25064         /*
25065          * The statistic block update period in ms.
25066          * e.g. 250ms, 500ms, 750ms, 1000ms.
25067          * If update_period_ms is 0, then the stats update
25068          * shall be never done and the DMA address shall not be used.
25069          * In this case, the stat block can only be read by
25070          * hwrm_stat_ctx_query command.
25071          */
25072         uint32_t        update_period_ms;
25073         /*
25074          * This field is used to specify statistics context specific
25075          * configuration flags.
25076          */
25077         uint8_t stat_ctx_flags;
25078         /*
25079          * When this bit is set to '1', the statistics context shall be
25080          * allocated for RoCE traffic only. In this case, traffic other
25081          * than offloaded RoCE traffic shall not be included in this
25082          * statistic context.
25083          * When this bit is set to '0', the statistics context shall be
25084          * used for the network traffic other than offloaded RoCE traffic.
25085          */
25086         #define HWRM_STAT_CTX_ALLOC_INPUT_STAT_CTX_FLAGS_ROCE     UINT32_C(0x1)
25087         uint8_t unused_0[3];
25088 } __attribute__((packed));
25089
25090 /* hwrm_stat_ctx_alloc_output (size:128b/16B) */
25091 struct hwrm_stat_ctx_alloc_output {
25092         /* The specific error status for the command. */
25093         uint16_t        error_code;
25094         /* The HWRM command request type. */
25095         uint16_t        req_type;
25096         /* The sequence ID from the original command. */
25097         uint16_t        seq_id;
25098         /* The length of the response data in number of bytes. */
25099         uint16_t        resp_len;
25100         /* This is the statistics context ID value. */
25101         uint32_t        stat_ctx_id;
25102         uint8_t unused_0[3];
25103         /*
25104          * This field is used in Output records to indicate that the output
25105          * is completely written to RAM.  This field should be read as '1'
25106          * to indicate that the output has been completely written.
25107          * When writing a command completion or response to an internal processor,
25108          * the order of writes has to be such that this field is written last.
25109          */
25110         uint8_t valid;
25111 } __attribute__((packed));
25112
25113 /**********************
25114  * hwrm_stat_ctx_free *
25115  **********************/
25116
25117
25118 /* hwrm_stat_ctx_free_input (size:192b/24B) */
25119 struct hwrm_stat_ctx_free_input {
25120         /* The HWRM command request type. */
25121         uint16_t        req_type;
25122         /*
25123          * The completion ring to send the completion event on. This should
25124          * be the NQ ID returned from the `nq_alloc` HWRM command.
25125          */
25126         uint16_t        cmpl_ring;
25127         /*
25128          * The sequence ID is used by the driver for tracking multiple
25129          * commands. This ID is treated as opaque data by the firmware and
25130          * the value is returned in the `hwrm_resp_hdr` upon completion.
25131          */
25132         uint16_t        seq_id;
25133         /*
25134          * The target ID of the command:
25135          * * 0x0-0xFFF8 - The function ID
25136          * * 0xFFF8-0xFFFE - Reserved for internal processors
25137          * * 0xFFFF - HWRM
25138          */
25139         uint16_t        target_id;
25140         /*
25141          * A physical address pointer pointing to a host buffer that the
25142          * command's response data will be written. This can be either a host
25143          * physical address (HPA) or a guest physical address (GPA) and must
25144          * point to a physically contiguous block of memory.
25145          */
25146         uint64_t        resp_addr;
25147         /* ID of the statistics context that is being queried. */
25148         uint32_t        stat_ctx_id;
25149         uint8_t unused_0[4];
25150 } __attribute__((packed));
25151
25152 /* hwrm_stat_ctx_free_output (size:128b/16B) */
25153 struct hwrm_stat_ctx_free_output {
25154         /* The specific error status for the command. */
25155         uint16_t        error_code;
25156         /* The HWRM command request type. */
25157         uint16_t        req_type;
25158         /* The sequence ID from the original command. */
25159         uint16_t        seq_id;
25160         /* The length of the response data in number of bytes. */
25161         uint16_t        resp_len;
25162         /* This is the statistics context ID value. */
25163         uint32_t        stat_ctx_id;
25164         uint8_t unused_0[3];
25165         /*
25166          * This field is used in Output records to indicate that the output
25167          * is completely written to RAM.  This field should be read as '1'
25168          * to indicate that the output has been completely written.
25169          * When writing a command completion or response to an internal processor,
25170          * the order of writes has to be such that this field is written last.
25171          */
25172         uint8_t valid;
25173 } __attribute__((packed));
25174
25175 /***********************
25176  * hwrm_stat_ctx_query *
25177  ***********************/
25178
25179
25180 /* hwrm_stat_ctx_query_input (size:192b/24B) */
25181 struct hwrm_stat_ctx_query_input {
25182         /* The HWRM command request type. */
25183         uint16_t        req_type;
25184         /*
25185          * The completion ring to send the completion event on. This should
25186          * be the NQ ID returned from the `nq_alloc` HWRM command.
25187          */
25188         uint16_t        cmpl_ring;
25189         /*
25190          * The sequence ID is used by the driver for tracking multiple
25191          * commands. This ID is treated as opaque data by the firmware and
25192          * the value is returned in the `hwrm_resp_hdr` upon completion.
25193          */
25194         uint16_t        seq_id;
25195         /*
25196          * The target ID of the command:
25197          * * 0x0-0xFFF8 - The function ID
25198          * * 0xFFF8-0xFFFE - Reserved for internal processors
25199          * * 0xFFFF - HWRM
25200          */
25201         uint16_t        target_id;
25202         /*
25203          * A physical address pointer pointing to a host buffer that the
25204          * command's response data will be written. This can be either a host
25205          * physical address (HPA) or a guest physical address (GPA) and must
25206          * point to a physically contiguous block of memory.
25207          */
25208         uint64_t        resp_addr;
25209         /* ID of the statistics context that is being queried. */
25210         uint32_t        stat_ctx_id;
25211         uint8_t unused_0[4];
25212 } __attribute__((packed));
25213
25214 /* hwrm_stat_ctx_query_output (size:1408b/176B) */
25215 struct hwrm_stat_ctx_query_output {
25216         /* The specific error status for the command. */
25217         uint16_t        error_code;
25218         /* The HWRM command request type. */
25219         uint16_t        req_type;
25220         /* The sequence ID from the original command. */
25221         uint16_t        seq_id;
25222         /* The length of the response data in number of bytes. */
25223         uint16_t        resp_len;
25224         /* Number of transmitted unicast packets */
25225         uint64_t        tx_ucast_pkts;
25226         /* Number of transmitted multicast packets */
25227         uint64_t        tx_mcast_pkts;
25228         /* Number of transmitted broadcast packets */
25229         uint64_t        tx_bcast_pkts;
25230         /* Number of transmitted packets with error */
25231         uint64_t        tx_err_pkts;
25232         /* Number of dropped packets on transmit path */
25233         uint64_t        tx_drop_pkts;
25234         /* Number of transmitted bytes for unicast traffic */
25235         uint64_t        tx_ucast_bytes;
25236         /* Number of transmitted bytes for multicast traffic */
25237         uint64_t        tx_mcast_bytes;
25238         /* Number of transmitted bytes for broadcast traffic */
25239         uint64_t        tx_bcast_bytes;
25240         /* Number of received unicast packets */
25241         uint64_t        rx_ucast_pkts;
25242         /* Number of received multicast packets */
25243         uint64_t        rx_mcast_pkts;
25244         /* Number of received broadcast packets */
25245         uint64_t        rx_bcast_pkts;
25246         /* Number of received packets with error */
25247         uint64_t        rx_err_pkts;
25248         /* Number of dropped packets on received path */
25249         uint64_t        rx_drop_pkts;
25250         /* Number of received bytes for unicast traffic */
25251         uint64_t        rx_ucast_bytes;
25252         /* Number of received bytes for multicast traffic */
25253         uint64_t        rx_mcast_bytes;
25254         /* Number of received bytes for broadcast traffic */
25255         uint64_t        rx_bcast_bytes;
25256         /* Number of aggregated unicast packets */
25257         uint64_t        rx_agg_pkts;
25258         /* Number of aggregated unicast bytes */
25259         uint64_t        rx_agg_bytes;
25260         /* Number of aggregation events */
25261         uint64_t        rx_agg_events;
25262         /* Number of aborted aggregations */
25263         uint64_t        rx_agg_aborts;
25264         uint8_t unused_0[7];
25265         /*
25266          * This field is used in Output records to indicate that the output
25267          * is completely written to RAM.  This field should be read as '1'
25268          * to indicate that the output has been completely written.
25269          * When writing a command completion or response to an internal processor,
25270          * the order of writes has to be such that this field is written last.
25271          */
25272         uint8_t valid;
25273 } __attribute__((packed));
25274
25275 /***************************
25276  * hwrm_stat_ctx_clr_stats *
25277  ***************************/
25278
25279
25280 /* hwrm_stat_ctx_clr_stats_input (size:192b/24B) */
25281 struct hwrm_stat_ctx_clr_stats_input {
25282         /* The HWRM command request type. */
25283         uint16_t        req_type;
25284         /*
25285          * The completion ring to send the completion event on. This should
25286          * be the NQ ID returned from the `nq_alloc` HWRM command.
25287          */
25288         uint16_t        cmpl_ring;
25289         /*
25290          * The sequence ID is used by the driver for tracking multiple
25291          * commands. This ID is treated as opaque data by the firmware and
25292          * the value is returned in the `hwrm_resp_hdr` upon completion.
25293          */
25294         uint16_t        seq_id;
25295         /*
25296          * The target ID of the command:
25297          * * 0x0-0xFFF8 - The function ID
25298          * * 0xFFF8-0xFFFE - Reserved for internal processors
25299          * * 0xFFFF - HWRM
25300          */
25301         uint16_t        target_id;
25302         /*
25303          * A physical address pointer pointing to a host buffer that the
25304          * command's response data will be written. This can be either a host
25305          * physical address (HPA) or a guest physical address (GPA) and must
25306          * point to a physically contiguous block of memory.
25307          */
25308         uint64_t        resp_addr;
25309         /* ID of the statistics context that is being queried. */
25310         uint32_t        stat_ctx_id;
25311         uint8_t unused_0[4];
25312 } __attribute__((packed));
25313
25314 /* hwrm_stat_ctx_clr_stats_output (size:128b/16B) */
25315 struct hwrm_stat_ctx_clr_stats_output {
25316         /* The specific error status for the command. */
25317         uint16_t        error_code;
25318         /* The HWRM command request type. */
25319         uint16_t        req_type;
25320         /* The sequence ID from the original command. */
25321         uint16_t        seq_id;
25322         /* The length of the response data in number of bytes. */
25323         uint16_t        resp_len;
25324         uint8_t unused_0[7];
25325         /*
25326          * This field is used in Output records to indicate that the output
25327          * is completely written to RAM.  This field should be read as '1'
25328          * to indicate that the output has been completely written.
25329          * When writing a command completion or response to an internal processor,
25330          * the order of writes has to be such that this field is written last.
25331          */
25332         uint8_t valid;
25333 } __attribute__((packed));
25334
25335 /********************
25336  * hwrm_pcie_qstats *
25337  ********************/
25338
25339
25340 /* hwrm_pcie_qstats_input (size:256b/32B) */
25341 struct hwrm_pcie_qstats_input {
25342         /* The HWRM command request type. */
25343         uint16_t        req_type;
25344         /*
25345          * The completion ring to send the completion event on. This should
25346          * be the NQ ID returned from the `nq_alloc` HWRM command.
25347          */
25348         uint16_t        cmpl_ring;
25349         /*
25350          * The sequence ID is used by the driver for tracking multiple
25351          * commands. This ID is treated as opaque data by the firmware and
25352          * the value is returned in the `hwrm_resp_hdr` upon completion.
25353          */
25354         uint16_t        seq_id;
25355         /*
25356          * The target ID of the command:
25357          * * 0x0-0xFFF8 - The function ID
25358          * * 0xFFF8-0xFFFE - Reserved for internal processors
25359          * * 0xFFFF - HWRM
25360          */
25361         uint16_t        target_id;
25362         /*
25363          * A physical address pointer pointing to a host buffer that the
25364          * command's response data will be written. This can be either a host
25365          * physical address (HPA) or a guest physical address (GPA) and must
25366          * point to a physically contiguous block of memory.
25367          */
25368         uint64_t        resp_addr;
25369         /*
25370          * The size of PCIe statistics block in bytes.
25371          * Firmware will DMA the PCIe statistics to
25372          * the host with this field size in the response.
25373          */
25374         uint16_t        pcie_stat_size;
25375         uint8_t unused_0[6];
25376         /*
25377          * This is the host address where
25378          * PCIe statistics will be stored
25379          */
25380         uint64_t        pcie_stat_host_addr;
25381 } __attribute__((packed));
25382
25383 /* hwrm_pcie_qstats_output (size:128b/16B) */
25384 struct hwrm_pcie_qstats_output {
25385         /* The specific error status for the command. */
25386         uint16_t        error_code;
25387         /* The HWRM command request type. */
25388         uint16_t        req_type;
25389         /* The sequence ID from the original command. */
25390         uint16_t        seq_id;
25391         /* The length of the response data in number of bytes. */
25392         uint16_t        resp_len;
25393         /* The size of PCIe statistics block in bytes. */
25394         uint16_t        pcie_stat_size;
25395         uint8_t unused_0[5];
25396         /*
25397          * This field is used in Output records to indicate that the output
25398          * is completely written to RAM.  This field should be read as '1'
25399          * to indicate that the output has been completely written.
25400          * When writing a command completion or response to an internal processor,
25401          * the order of writes has to be such that this field is written last.
25402          */
25403         uint8_t valid;
25404 } __attribute__((packed));
25405
25406 /* PCIe Statistics Formats */
25407 /* pcie_ctx_hw_stats (size:768b/96B) */
25408 struct pcie_ctx_hw_stats {
25409         /* Number of physical layer receiver errors */
25410         uint64_t        pcie_pl_signal_integrity;
25411         /* Number of DLLP CRC errors detected by Data Link Layer */
25412         uint64_t        pcie_dl_signal_integrity;
25413         /*
25414          * Number of TLP LCRC and sequence number errors detected
25415          * by Data Link Layer
25416          */
25417         uint64_t        pcie_tl_signal_integrity;
25418         /* Number of times LTSSM entered Recovery state */
25419         uint64_t        pcie_link_integrity;
25420         /* Number of TLP bytes that have been trasmitted */
25421         uint64_t        pcie_tx_traffic_rate;
25422         /* Number of TLP bytes that have been received */
25423         uint64_t        pcie_rx_traffic_rate;
25424         /* Number of DLLP bytes that have been trasmitted */
25425         uint64_t        pcie_tx_dllp_statistics;
25426         /* Number of DLLP bytes that have been received */
25427         uint64_t        pcie_rx_dllp_statistics;
25428         /*
25429          * Number of times spent in each phase of gen3
25430          * equalization
25431          */
25432         uint64_t        pcie_equalization_time;
25433         /* Records the last 16 transitions of the LTSSM */
25434         uint32_t        pcie_ltssm_histogram[4];
25435         /*
25436          * Record the last 8 reasons on why LTSSM transitioned
25437          * to Recovery
25438          */
25439         uint64_t        pcie_recovery_histogram;
25440 } __attribute__((packed));
25441
25442 /**********************
25443  * hwrm_exec_fwd_resp *
25444  **********************/
25445
25446
25447 /* hwrm_exec_fwd_resp_input (size:1024b/128B) */
25448 struct hwrm_exec_fwd_resp_input {
25449         /* The HWRM command request type. */
25450         uint16_t        req_type;
25451         /*
25452          * The completion ring to send the completion event on. This should
25453          * be the NQ ID returned from the `nq_alloc` HWRM command.
25454          */
25455         uint16_t        cmpl_ring;
25456         /*
25457          * The sequence ID is used by the driver for tracking multiple
25458          * commands. This ID is treated as opaque data by the firmware and
25459          * the value is returned in the `hwrm_resp_hdr` upon completion.
25460          */
25461         uint16_t        seq_id;
25462         /*
25463          * The target ID of the command:
25464          * * 0x0-0xFFF8 - The function ID
25465          * * 0xFFF8-0xFFFE - Reserved for internal processors
25466          * * 0xFFFF - HWRM
25467          */
25468         uint16_t        target_id;
25469         /*
25470          * A physical address pointer pointing to a host buffer that the
25471          * command's response data will be written. This can be either a host
25472          * physical address (HPA) or a guest physical address (GPA) and must
25473          * point to a physically contiguous block of memory.
25474          */
25475         uint64_t        resp_addr;
25476         /*
25477          * This is an encapsulated request. This request should
25478          * be executed by the HWRM and the response should be
25479          * provided in the response buffer inside the encapsulated
25480          * request.
25481          */
25482         uint32_t        encap_request[26];
25483         /*
25484          * This value indicates the target id of the response to
25485          * the encapsulated request.
25486          * 0x0 - 0xFFF8 - Used for function ids
25487          * 0xFFF8 - 0xFFFE - Reserved for internal processors
25488          * 0xFFFF - HWRM
25489          */
25490         uint16_t        encap_resp_target_id;
25491         uint8_t unused_0[6];
25492 } __attribute__((packed));
25493
25494 /* hwrm_exec_fwd_resp_output (size:128b/16B) */
25495 struct hwrm_exec_fwd_resp_output {
25496         /* The specific error status for the command. */
25497         uint16_t        error_code;
25498         /* The HWRM command request type. */
25499         uint16_t        req_type;
25500         /* The sequence ID from the original command. */
25501         uint16_t        seq_id;
25502         /* The length of the response data in number of bytes. */
25503         uint16_t        resp_len;
25504         uint8_t unused_0[7];
25505         /*
25506          * This field is used in Output records to indicate that the output
25507          * is completely written to RAM.  This field should be read as '1'
25508          * to indicate that the output has been completely written.
25509          * When writing a command completion or response to an internal processor,
25510          * the order of writes has to be such that this field is written last.
25511          */
25512         uint8_t valid;
25513 } __attribute__((packed));
25514
25515 /************************
25516  * hwrm_reject_fwd_resp *
25517  ************************/
25518
25519
25520 /* hwrm_reject_fwd_resp_input (size:1024b/128B) */
25521 struct hwrm_reject_fwd_resp_input {
25522         /* The HWRM command request type. */
25523         uint16_t        req_type;
25524         /*
25525          * The completion ring to send the completion event on. This should
25526          * be the NQ ID returned from the `nq_alloc` HWRM command.
25527          */
25528         uint16_t        cmpl_ring;
25529         /*
25530          * The sequence ID is used by the driver for tracking multiple
25531          * commands. This ID is treated as opaque data by the firmware and
25532          * the value is returned in the `hwrm_resp_hdr` upon completion.
25533          */
25534         uint16_t        seq_id;
25535         /*
25536          * The target ID of the command:
25537          * * 0x0-0xFFF8 - The function ID
25538          * * 0xFFF8-0xFFFE - Reserved for internal processors
25539          * * 0xFFFF - HWRM
25540          */
25541         uint16_t        target_id;
25542         /*
25543          * A physical address pointer pointing to a host buffer that the
25544          * command's response data will be written. This can be either a host
25545          * physical address (HPA) or a guest physical address (GPA) and must
25546          * point to a physically contiguous block of memory.
25547          */
25548         uint64_t        resp_addr;
25549         /*
25550          * This is an encapsulated request. This request should
25551          * be rejected by the HWRM and the error response should be
25552          * provided in the response buffer inside the encapsulated
25553          * request.
25554          */
25555         uint32_t        encap_request[26];
25556         /*
25557          * This value indicates the target id of the response to
25558          * the encapsulated request.
25559          * 0x0 - 0xFFF8 - Used for function ids
25560          * 0xFFF8 - 0xFFFE - Reserved for internal processors
25561          * 0xFFFF - HWRM
25562          */
25563         uint16_t        encap_resp_target_id;
25564         uint8_t unused_0[6];
25565 } __attribute__((packed));
25566
25567 /* hwrm_reject_fwd_resp_output (size:128b/16B) */
25568 struct hwrm_reject_fwd_resp_output {
25569         /* The specific error status for the command. */
25570         uint16_t        error_code;
25571         /* The HWRM command request type. */
25572         uint16_t        req_type;
25573         /* The sequence ID from the original command. */
25574         uint16_t        seq_id;
25575         /* The length of the response data in number of bytes. */
25576         uint16_t        resp_len;
25577         uint8_t unused_0[7];
25578         /*
25579          * This field is used in Output records to indicate that the output
25580          * is completely written to RAM.  This field should be read as '1'
25581          * to indicate that the output has been completely written.
25582          * When writing a command completion or response to an internal processor,
25583          * the order of writes has to be such that this field is written last.
25584          */
25585         uint8_t valid;
25586 } __attribute__((packed));
25587
25588 /*****************
25589  * hwrm_fwd_resp *
25590  *****************/
25591
25592
25593 /* hwrm_fwd_resp_input (size:1024b/128B) */
25594 struct hwrm_fwd_resp_input {
25595         /* The HWRM command request type. */
25596         uint16_t        req_type;
25597         /*
25598          * The completion ring to send the completion event on. This should
25599          * be the NQ ID returned from the `nq_alloc` HWRM command.
25600          */
25601         uint16_t        cmpl_ring;
25602         /*
25603          * The sequence ID is used by the driver for tracking multiple
25604          * commands. This ID is treated as opaque data by the firmware and
25605          * the value is returned in the `hwrm_resp_hdr` upon completion.
25606          */
25607         uint16_t        seq_id;
25608         /*
25609          * The target ID of the command:
25610          * * 0x0-0xFFF8 - The function ID
25611          * * 0xFFF8-0xFFFE - Reserved for internal processors
25612          * * 0xFFFF - HWRM
25613          */
25614         uint16_t        target_id;
25615         /*
25616          * A physical address pointer pointing to a host buffer that the
25617          * command's response data will be written. This can be either a host
25618          * physical address (HPA) or a guest physical address (GPA) and must
25619          * point to a physically contiguous block of memory.
25620          */
25621         uint64_t        resp_addr;
25622         /*
25623          * This value indicates the target id of the encapsulated
25624          * response.
25625          * 0x0 - 0xFFF8 - Used for function ids
25626          * 0xFFF8 - 0xFFFE - Reserved for internal processors
25627          * 0xFFFF - HWRM
25628          */
25629         uint16_t        encap_resp_target_id;
25630         /*
25631          * This value indicates the completion ring the encapsulated
25632          * response will be optionally completed on.  If the value is
25633          * -1, then no CR completion shall be generated for the
25634          * encapsulated response. Any other value must be a
25635          * valid CR ring_id value. If a valid encap_resp_cmpl_ring
25636          * is provided, then a CR completion shall be generated for
25637          * the encapsulated response.
25638          */
25639         uint16_t        encap_resp_cmpl_ring;
25640         /* This field indicates the length of encapsulated response. */
25641         uint16_t        encap_resp_len;
25642         uint8_t unused_0;
25643         uint8_t unused_1;
25644         /*
25645          * This is the host address where the encapsulated response
25646          * will be written.
25647          * This area must be 16B aligned and must be cleared to zero
25648          * before the original request is made.
25649          */
25650         uint64_t        encap_resp_addr;
25651         /* This is an encapsulated response. */
25652         uint32_t        encap_resp[24];
25653 } __attribute__((packed));
25654
25655 /* hwrm_fwd_resp_output (size:128b/16B) */
25656 struct hwrm_fwd_resp_output {
25657         /* The specific error status for the command. */
25658         uint16_t        error_code;
25659         /* The HWRM command request type. */
25660         uint16_t        req_type;
25661         /* The sequence ID from the original command. */
25662         uint16_t        seq_id;
25663         /* The length of the response data in number of bytes. */
25664         uint16_t        resp_len;
25665         uint8_t unused_0[7];
25666         /*
25667          * This field is used in Output records to indicate that the output
25668          * is completely written to RAM.  This field should be read as '1'
25669          * to indicate that the output has been completely written.
25670          * When writing a command completion or response to an internal processor,
25671          * the order of writes has to be such that this field is written last.
25672          */
25673         uint8_t valid;
25674 } __attribute__((packed));
25675
25676 /*****************************
25677  * hwrm_fwd_async_event_cmpl *
25678  *****************************/
25679
25680
25681 /* hwrm_fwd_async_event_cmpl_input (size:320b/40B) */
25682 struct hwrm_fwd_async_event_cmpl_input {
25683         /* The HWRM command request type. */
25684         uint16_t        req_type;
25685         /*
25686          * The completion ring to send the completion event on. This should
25687          * be the NQ ID returned from the `nq_alloc` HWRM command.
25688          */
25689         uint16_t        cmpl_ring;
25690         /*
25691          * The sequence ID is used by the driver for tracking multiple
25692          * commands. This ID is treated as opaque data by the firmware and
25693          * the value is returned in the `hwrm_resp_hdr` upon completion.
25694          */
25695         uint16_t        seq_id;
25696         /*
25697          * The target ID of the command:
25698          * * 0x0-0xFFF8 - The function ID
25699          * * 0xFFF8-0xFFFE - Reserved for internal processors
25700          * * 0xFFFF - HWRM
25701          */
25702         uint16_t        target_id;
25703         /*
25704          * A physical address pointer pointing to a host buffer that the
25705          * command's response data will be written. This can be either a host
25706          * physical address (HPA) or a guest physical address (GPA) and must
25707          * point to a physically contiguous block of memory.
25708          */
25709         uint64_t        resp_addr;
25710         /*
25711          * This value indicates the target id of the encapsulated
25712          * asynchronous event.
25713          * 0x0 - 0xFFF8 - Used for function ids
25714          * 0xFFF8 - 0xFFFE - Reserved for internal processors
25715          * 0xFFFF - Broadcast to all children VFs (only applicable when
25716          * a PF is the requester)
25717          */
25718         uint16_t        encap_async_event_target_id;
25719         uint8_t unused_0[6];
25720         /* This is an encapsulated asynchronous event completion. */
25721         uint32_t        encap_async_event_cmpl[4];
25722 } __attribute__((packed));
25723
25724 /* hwrm_fwd_async_event_cmpl_output (size:128b/16B) */
25725 struct hwrm_fwd_async_event_cmpl_output {
25726         /* The specific error status for the command. */
25727         uint16_t        error_code;
25728         /* The HWRM command request type. */
25729         uint16_t        req_type;
25730         /* The sequence ID from the original command. */
25731         uint16_t        seq_id;
25732         /* The length of the response data in number of bytes. */
25733         uint16_t        resp_len;
25734         uint8_t unused_0[7];
25735         /*
25736          * This field is used in Output records to indicate that the output
25737          * is completely written to RAM.  This field should be read as '1'
25738          * to indicate that the output has been completely written.
25739          * When writing a command completion or response to an internal processor,
25740          * the order of writes has to be such that this field is written last.
25741          */
25742         uint8_t valid;
25743 } __attribute__((packed));
25744
25745 /**************************
25746  * hwrm_nvm_raw_write_blk *
25747  **************************/
25748
25749
25750 /* hwrm_nvm_raw_write_blk_input (size:256b/32B) */
25751 struct hwrm_nvm_raw_write_blk_input {
25752         /* The HWRM command request type. */
25753         uint16_t        req_type;
25754         /*
25755          * The completion ring to send the completion event on. This should
25756          * be the NQ ID returned from the `nq_alloc` HWRM command.
25757          */
25758         uint16_t        cmpl_ring;
25759         /*
25760          * The sequence ID is used by the driver for tracking multiple
25761          * commands. This ID is treated as opaque data by the firmware and
25762          * the value is returned in the `hwrm_resp_hdr` upon completion.
25763          */
25764         uint16_t        seq_id;
25765         /*
25766          * The target ID of the command:
25767          * * 0x0-0xFFF8 - The function ID
25768          * * 0xFFF8-0xFFFE - Reserved for internal processors
25769          * * 0xFFFF - HWRM
25770          */
25771         uint16_t        target_id;
25772         /*
25773          * A physical address pointer pointing to a host buffer that the
25774          * command's response data will be written. This can be either a host
25775          * physical address (HPA) or a guest physical address (GPA) and must
25776          * point to a physically contiguous block of memory.
25777          */
25778         uint64_t        resp_addr;
25779         /*
25780          * 64-bit Host Source Address.
25781          * This is the loation of the source data to be written.
25782          */
25783         uint64_t        host_src_addr;
25784         /*
25785          * 32-bit Destination Address.
25786          * This is the NVRAM byte-offset where the source data will be written to.
25787          */
25788         uint32_t        dest_addr;
25789         /* Length of data to be written, in bytes. */
25790         uint32_t        len;
25791 } __attribute__((packed));
25792
25793 /* hwrm_nvm_raw_write_blk_output (size:128b/16B) */
25794 struct hwrm_nvm_raw_write_blk_output {
25795         /* The specific error status for the command. */
25796         uint16_t        error_code;
25797         /* The HWRM command request type. */
25798         uint16_t        req_type;
25799         /* The sequence ID from the original command. */
25800         uint16_t        seq_id;
25801         /* The length of the response data in number of bytes. */
25802         uint16_t        resp_len;
25803         uint8_t unused_0[7];
25804         /*
25805          * This field is used in Output records to indicate that the output
25806          * is completely written to RAM.  This field should be read as '1'
25807          * to indicate that the output has been completely written.
25808          * When writing a command completion or response to an internal processor,
25809          * the order of writes has to be such that this field is written last.
25810          */
25811         uint8_t valid;
25812 } __attribute__((packed));
25813
25814 /*****************
25815  * hwrm_nvm_read *
25816  *****************/
25817
25818
25819 /* hwrm_nvm_read_input (size:320b/40B) */
25820 struct hwrm_nvm_read_input {
25821         /* The HWRM command request type. */
25822         uint16_t        req_type;
25823         /*
25824          * The completion ring to send the completion event on. This should
25825          * be the NQ ID returned from the `nq_alloc` HWRM command.
25826          */
25827         uint16_t        cmpl_ring;
25828         /*
25829          * The sequence ID is used by the driver for tracking multiple
25830          * commands. This ID is treated as opaque data by the firmware and
25831          * the value is returned in the `hwrm_resp_hdr` upon completion.
25832          */
25833         uint16_t        seq_id;
25834         /*
25835          * The target ID of the command:
25836          * * 0x0-0xFFF8 - The function ID
25837          * * 0xFFF8-0xFFFE - Reserved for internal processors
25838          * * 0xFFFF - HWRM
25839          */
25840         uint16_t        target_id;
25841         /*
25842          * A physical address pointer pointing to a host buffer that the
25843          * command's response data will be written. This can be either a host
25844          * physical address (HPA) or a guest physical address (GPA) and must
25845          * point to a physically contiguous block of memory.
25846          */
25847         uint64_t        resp_addr;
25848         /*
25849          * 64-bit Host Destination Address.
25850          * This is the host address where the data will be written to.
25851          */
25852         uint64_t        host_dest_addr;
25853         /* The 0-based index of the directory entry. */
25854         uint16_t        dir_idx;
25855         uint8_t unused_0[2];
25856         /* The NVRAM byte-offset to read from. */
25857         uint32_t        offset;
25858         /* The length of the data to be read, in bytes. */
25859         uint32_t        len;
25860         uint8_t unused_1[4];
25861 } __attribute__((packed));
25862
25863 /* hwrm_nvm_read_output (size:128b/16B) */
25864 struct hwrm_nvm_read_output {
25865         /* The specific error status for the command. */
25866         uint16_t        error_code;
25867         /* The HWRM command request type. */
25868         uint16_t        req_type;
25869         /* The sequence ID from the original command. */
25870         uint16_t        seq_id;
25871         /* The length of the response data in number of bytes. */
25872         uint16_t        resp_len;
25873         uint8_t unused_0[7];
25874         /*
25875          * This field is used in Output records to indicate that the output
25876          * is completely written to RAM.  This field should be read as '1'
25877          * to indicate that the output has been completely written.
25878          * When writing a command completion or response to an internal processor,
25879          * the order of writes has to be such that this field is written last.
25880          */
25881         uint8_t valid;
25882 } __attribute__((packed));
25883
25884 /*********************
25885  * hwrm_nvm_raw_dump *
25886  *********************/
25887
25888
25889 /* hwrm_nvm_raw_dump_input (size:256b/32B) */
25890 struct hwrm_nvm_raw_dump_input {
25891         /* The HWRM command request type. */
25892         uint16_t        req_type;
25893         /*
25894          * The completion ring to send the completion event on. This should
25895          * be the NQ ID returned from the `nq_alloc` HWRM command.
25896          */
25897         uint16_t        cmpl_ring;
25898         /*
25899          * The sequence ID is used by the driver for tracking multiple
25900          * commands. This ID is treated as opaque data by the firmware and
25901          * the value is returned in the `hwrm_resp_hdr` upon completion.
25902          */
25903         uint16_t        seq_id;
25904         /*
25905          * The target ID of the command:
25906          * * 0x0-0xFFF8 - The function ID
25907          * * 0xFFF8-0xFFFE - Reserved for internal processors
25908          * * 0xFFFF - HWRM
25909          */
25910         uint16_t        target_id;
25911         /*
25912          * A physical address pointer pointing to a host buffer that the
25913          * command's response data will be written. This can be either a host
25914          * physical address (HPA) or a guest physical address (GPA) and must
25915          * point to a physically contiguous block of memory.
25916          */
25917         uint64_t        resp_addr;
25918         /*
25919          * 64-bit Host Destination Address.
25920          * This is the host address where the data will be written to.
25921          */
25922         uint64_t        host_dest_addr;
25923         /* 32-bit NVRAM byte-offset to read from. */
25924         uint32_t        offset;
25925         /* Total length of NVRAM contents to be read, in bytes. */
25926         uint32_t        len;
25927 } __attribute__((packed));
25928
25929 /* hwrm_nvm_raw_dump_output (size:128b/16B) */
25930 struct hwrm_nvm_raw_dump_output {
25931         /* The specific error status for the command. */
25932         uint16_t        error_code;
25933         /* The HWRM command request type. */
25934         uint16_t        req_type;
25935         /* The sequence ID from the original command. */
25936         uint16_t        seq_id;
25937         /* The length of the response data in number of bytes. */
25938         uint16_t        resp_len;
25939         uint8_t unused_0[7];
25940         /*
25941          * This field is used in Output records to indicate that the output
25942          * is completely written to RAM.  This field should be read as '1'
25943          * to indicate that the output has been completely written.
25944          * When writing a command completion or response to an internal processor,
25945          * the order of writes has to be such that this field is written last.
25946          */
25947         uint8_t valid;
25948 } __attribute__((packed));
25949
25950 /****************************
25951  * hwrm_nvm_get_dir_entries *
25952  ****************************/
25953
25954
25955 /* hwrm_nvm_get_dir_entries_input (size:192b/24B) */
25956 struct hwrm_nvm_get_dir_entries_input {
25957         /* The HWRM command request type. */
25958         uint16_t        req_type;
25959         /*
25960          * The completion ring to send the completion event on. This should
25961          * be the NQ ID returned from the `nq_alloc` HWRM command.
25962          */
25963         uint16_t        cmpl_ring;
25964         /*
25965          * The sequence ID is used by the driver for tracking multiple
25966          * commands. This ID is treated as opaque data by the firmware and
25967          * the value is returned in the `hwrm_resp_hdr` upon completion.
25968          */
25969         uint16_t        seq_id;
25970         /*
25971          * The target ID of the command:
25972          * * 0x0-0xFFF8 - The function ID
25973          * * 0xFFF8-0xFFFE - Reserved for internal processors
25974          * * 0xFFFF - HWRM
25975          */
25976         uint16_t        target_id;
25977         /*
25978          * A physical address pointer pointing to a host buffer that the
25979          * command's response data will be written. This can be either a host
25980          * physical address (HPA) or a guest physical address (GPA) and must
25981          * point to a physically contiguous block of memory.
25982          */
25983         uint64_t        resp_addr;
25984         /*
25985          * 64-bit Host Destination Address.
25986          * This is the host address where the directory will be written.
25987          */
25988         uint64_t        host_dest_addr;
25989 } __attribute__((packed));
25990
25991 /* hwrm_nvm_get_dir_entries_output (size:128b/16B) */
25992 struct hwrm_nvm_get_dir_entries_output {
25993         /* The specific error status for the command. */
25994         uint16_t        error_code;
25995         /* The HWRM command request type. */
25996         uint16_t        req_type;
25997         /* The sequence ID from the original command. */
25998         uint16_t        seq_id;
25999         /* The length of the response data in number of bytes. */
26000         uint16_t        resp_len;
26001         uint8_t unused_0[7];
26002         /*
26003          * This field is used in Output records to indicate that the output
26004          * is completely written to RAM.  This field should be read as '1'
26005          * to indicate that the output has been completely written.
26006          * When writing a command completion or response to an internal processor,
26007          * the order of writes has to be such that this field is written last.
26008          */
26009         uint8_t valid;
26010 } __attribute__((packed));
26011
26012 /*************************
26013  * hwrm_nvm_get_dir_info *
26014  *************************/
26015
26016
26017 /* hwrm_nvm_get_dir_info_input (size:128b/16B) */
26018 struct hwrm_nvm_get_dir_info_input {
26019         /* The HWRM command request type. */
26020         uint16_t        req_type;
26021         /*
26022          * The completion ring to send the completion event on. This should
26023          * be the NQ ID returned from the `nq_alloc` HWRM command.
26024          */
26025         uint16_t        cmpl_ring;
26026         /*
26027          * The sequence ID is used by the driver for tracking multiple
26028          * commands. This ID is treated as opaque data by the firmware and
26029          * the value is returned in the `hwrm_resp_hdr` upon completion.
26030          */
26031         uint16_t        seq_id;
26032         /*
26033          * The target ID of the command:
26034          * * 0x0-0xFFF8 - The function ID
26035          * * 0xFFF8-0xFFFE - Reserved for internal processors
26036          * * 0xFFFF - HWRM
26037          */
26038         uint16_t        target_id;
26039         /*
26040          * A physical address pointer pointing to a host buffer that the
26041          * command's response data will be written. This can be either a host
26042          * physical address (HPA) or a guest physical address (GPA) and must
26043          * point to a physically contiguous block of memory.
26044          */
26045         uint64_t        resp_addr;
26046 } __attribute__((packed));
26047
26048 /* hwrm_nvm_get_dir_info_output (size:192b/24B) */
26049 struct hwrm_nvm_get_dir_info_output {
26050         /* The specific error status for the command. */
26051         uint16_t        error_code;
26052         /* The HWRM command request type. */
26053         uint16_t        req_type;
26054         /* The sequence ID from the original command. */
26055         uint16_t        seq_id;
26056         /* The length of the response data in number of bytes. */
26057         uint16_t        resp_len;
26058         /* Number of directory entries in the directory. */
26059         uint32_t        entries;
26060         /* Size of each directory entry, in bytes. */
26061         uint32_t        entry_length;
26062         uint8_t unused_0[7];
26063         /*
26064          * This field is used in Output records to indicate that the output
26065          * is completely written to RAM.  This field should be read as '1'
26066          * to indicate that the output has been completely written.
26067          * When writing a command completion or response to an internal processor,
26068          * the order of writes has to be such that this field is written last.
26069          */
26070         uint8_t valid;
26071 } __attribute__((packed));
26072
26073 /******************
26074  * hwrm_nvm_write *
26075  ******************/
26076
26077
26078 /* hwrm_nvm_write_input (size:384b/48B) */
26079 struct hwrm_nvm_write_input {
26080         /* The HWRM command request type. */
26081         uint16_t        req_type;
26082         /*
26083          * The completion ring to send the completion event on. This should
26084          * be the NQ ID returned from the `nq_alloc` HWRM command.
26085          */
26086         uint16_t        cmpl_ring;
26087         /*
26088          * The sequence ID is used by the driver for tracking multiple
26089          * commands. This ID is treated as opaque data by the firmware and
26090          * the value is returned in the `hwrm_resp_hdr` upon completion.
26091          */
26092         uint16_t        seq_id;
26093         /*
26094          * The target ID of the command:
26095          * * 0x0-0xFFF8 - The function ID
26096          * * 0xFFF8-0xFFFE - Reserved for internal processors
26097          * * 0xFFFF - HWRM
26098          */
26099         uint16_t        target_id;
26100         /*
26101          * A physical address pointer pointing to a host buffer that the
26102          * command's response data will be written. This can be either a host
26103          * physical address (HPA) or a guest physical address (GPA) and must
26104          * point to a physically contiguous block of memory.
26105          */
26106         uint64_t        resp_addr;
26107         /*
26108          * 64-bit Host Source Address.
26109          * This is where the source data is.
26110          */
26111         uint64_t        host_src_addr;
26112         /* The Directory Entry Type (valid values are defined in the bnxnvm_directory_type enum defined in the file bnxnvm_defs.h). */
26113         uint16_t        dir_type;
26114         /*
26115          * Directory ordinal.
26116          * The 0-based instance of the combined Directory Entry Type and Extension.
26117          */
26118         uint16_t        dir_ordinal;
26119         /* The Directory Entry Extension flags (see BNX_DIR_EXT_* in the file bnxnvm_defs.h). */
26120         uint16_t        dir_ext;
26121         /* Directory Entry Attribute flags (see BNX_DIR_ATTR_* in the file bnxnvm_defs.h). */
26122         uint16_t        dir_attr;
26123         /*
26124          * Length of data to write, in bytes. May be less than or equal to the allocated size for the directory entry.
26125          * The data length stored in the directory entry will be updated to reflect this value once the write is complete.
26126          */
26127         uint32_t        dir_data_length;
26128         /* Option. */
26129         uint16_t        option;
26130         uint16_t        flags;
26131         /*
26132          * When this bit is '1', the original active image
26133          * will not be removed. TBD: what purpose is this?
26134          */
26135         #define HWRM_NVM_WRITE_INPUT_FLAGS_KEEP_ORIG_ACTIVE_IMG \
26136                 UINT32_C(0x1)
26137         /*
26138          * The requested length of the allocated NVM for the item, in bytes. This value may be greater than or equal to the specified data length (dir_data_length).
26139          * If this value is less than the specified data length, it will be ignored.
26140          * The response will contain the actual allocated item length, which may be greater than the requested item length.
26141          * The purpose for allocating more than the required number of bytes for an item's data is to pre-allocate extra storage (padding) to accomodate
26142          * the potential future growth of an item (e.g. upgraded firmware with a size increase, log growth, expanded configuration data).
26143          */
26144         uint32_t        dir_item_length;
26145         uint32_t        unused_0;
26146 } __attribute__((packed));
26147
26148 /* hwrm_nvm_write_output (size:128b/16B) */
26149 struct hwrm_nvm_write_output {
26150         /* The specific error status for the command. */
26151         uint16_t        error_code;
26152         /* The HWRM command request type. */
26153         uint16_t        req_type;
26154         /* The sequence ID from the original command. */
26155         uint16_t        seq_id;
26156         /* The length of the response data in number of bytes. */
26157         uint16_t        resp_len;
26158         /*
26159          * Length of the allocated NVM for the item, in bytes. The value may be greater than or equal to the specified data length or the requested item length.
26160          * The actual item length used when creating a new directory entry will be a multiple of an NVM block size.
26161          */
26162         uint32_t        dir_item_length;
26163         /* The directory index of the created or modified item. */
26164         uint16_t        dir_idx;
26165         uint8_t unused_0;
26166         /*
26167          * This field is used in Output records to indicate that the output
26168          * is completely written to RAM.  This field should be read as '1'
26169          * to indicate that the output has been completely written.
26170          * When writing a command completion or response to an internal processor,
26171          * the order of writes has to be such that this field is written last.
26172          */
26173         uint8_t valid;
26174 } __attribute__((packed));
26175
26176 /* hwrm_nvm_write_cmd_err (size:64b/8B) */
26177 struct hwrm_nvm_write_cmd_err {
26178         /*
26179          * command specific error codes that goes to
26180          * the cmd_err field in Common HWRM Error Response.
26181          */
26182         uint8_t code;
26183         /* Unknown error */
26184         #define HWRM_NVM_WRITE_CMD_ERR_CODE_UNKNOWN  UINT32_C(0x0)
26185         /* Unable to complete operation due to fragmentation */
26186         #define HWRM_NVM_WRITE_CMD_ERR_CODE_FRAG_ERR UINT32_C(0x1)
26187         /* nvm is completely full. */
26188         #define HWRM_NVM_WRITE_CMD_ERR_CODE_NO_SPACE UINT32_C(0x2)
26189         #define HWRM_NVM_WRITE_CMD_ERR_CODE_LAST \
26190                 HWRM_NVM_WRITE_CMD_ERR_CODE_NO_SPACE
26191         uint8_t unused_0[7];
26192 } __attribute__((packed));
26193
26194 /*******************
26195  * hwrm_nvm_modify *
26196  *******************/
26197
26198
26199 /* hwrm_nvm_modify_input (size:320b/40B) */
26200 struct hwrm_nvm_modify_input {
26201         /* The HWRM command request type. */
26202         uint16_t        req_type;
26203         /*
26204          * The completion ring to send the completion event on. This should
26205          * be the NQ ID returned from the `nq_alloc` HWRM command.
26206          */
26207         uint16_t        cmpl_ring;
26208         /*
26209          * The sequence ID is used by the driver for tracking multiple
26210          * commands. This ID is treated as opaque data by the firmware and
26211          * the value is returned in the `hwrm_resp_hdr` upon completion.
26212          */
26213         uint16_t        seq_id;
26214         /*
26215          * The target ID of the command:
26216          * * 0x0-0xFFF8 - The function ID
26217          * * 0xFFF8-0xFFFE - Reserved for internal processors
26218          * * 0xFFFF - HWRM
26219          */
26220         uint16_t        target_id;
26221         /*
26222          * A physical address pointer pointing to a host buffer that the
26223          * command's response data will be written. This can be either a host
26224          * physical address (HPA) or a guest physical address (GPA) and must
26225          * point to a physically contiguous block of memory.
26226          */
26227         uint64_t        resp_addr;
26228         /*
26229          * 64-bit Host Source Address.
26230          * This is where the modified data is.
26231          */
26232         uint64_t        host_src_addr;
26233         /* 16-bit directory entry index. */
26234         uint16_t        dir_idx;
26235         uint8_t unused_0[2];
26236         /* 32-bit NVRAM byte-offset to modify content from. */
26237         uint32_t        offset;
26238         /*
26239          * Length of data to be modified, in bytes. The length shall
26240          * be non-zero.
26241          */
26242         uint32_t        len;
26243         uint8_t unused_1[4];
26244 } __attribute__((packed));
26245
26246 /* hwrm_nvm_modify_output (size:128b/16B) */
26247 struct hwrm_nvm_modify_output {
26248         /* The specific error status for the command. */
26249         uint16_t        error_code;
26250         /* The HWRM command request type. */
26251         uint16_t        req_type;
26252         /* The sequence ID from the original command. */
26253         uint16_t        seq_id;
26254         /* The length of the response data in number of bytes. */
26255         uint16_t        resp_len;
26256         uint8_t unused_0[7];
26257         /*
26258          * This field is used in Output records to indicate that the output
26259          * is completely written to RAM.  This field should be read as '1'
26260          * to indicate that the output has been completely written.
26261          * When writing a command completion or response to an internal processor,
26262          * the order of writes has to be such that this field is written last.
26263          */
26264         uint8_t valid;
26265 } __attribute__((packed));
26266
26267 /***************************
26268  * hwrm_nvm_find_dir_entry *
26269  ***************************/
26270
26271
26272 /* hwrm_nvm_find_dir_entry_input (size:256b/32B) */
26273 struct hwrm_nvm_find_dir_entry_input {
26274         /* The HWRM command request type. */
26275         uint16_t        req_type;
26276         /*
26277          * The completion ring to send the completion event on. This should
26278          * be the NQ ID returned from the `nq_alloc` HWRM command.
26279          */
26280         uint16_t        cmpl_ring;
26281         /*
26282          * The sequence ID is used by the driver for tracking multiple
26283          * commands. This ID is treated as opaque data by the firmware and
26284          * the value is returned in the `hwrm_resp_hdr` upon completion.
26285          */
26286         uint16_t        seq_id;
26287         /*
26288          * The target ID of the command:
26289          * * 0x0-0xFFF8 - The function ID
26290          * * 0xFFF8-0xFFFE - Reserved for internal processors
26291          * * 0xFFFF - HWRM
26292          */
26293         uint16_t        target_id;
26294         /*
26295          * A physical address pointer pointing to a host buffer that the
26296          * command's response data will be written. This can be either a host
26297          * physical address (HPA) or a guest physical address (GPA) and must
26298          * point to a physically contiguous block of memory.
26299          */
26300         uint64_t        resp_addr;
26301         uint32_t        enables;
26302         /*
26303          * This bit must be '1' for the dir_idx_valid field to be
26304          * configured.
26305          */
26306         #define HWRM_NVM_FIND_DIR_ENTRY_INPUT_ENABLES_DIR_IDX_VALID \
26307                 UINT32_C(0x1)
26308         /* Directory Entry Index */
26309         uint16_t        dir_idx;
26310         /* Directory Entry (Image) Type */
26311         uint16_t        dir_type;
26312         /*
26313          * Directory ordinal.
26314          * The instance of this Directory Type
26315          */
26316         uint16_t        dir_ordinal;
26317         /* The Directory Entry Extension flags. */
26318         uint16_t        dir_ext;
26319         /* This value indicates the search option using dir_ordinal. */
26320         uint8_t opt_ordinal;
26321         /* This value indicates the search option using dir_ordinal. */
26322         #define HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_MASK UINT32_C(0x3)
26323         #define HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_SFT 0
26324         /* Equal to specified ordinal value. */
26325         #define HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_EQ    UINT32_C(0x0)
26326         /* Greater than or equal to specified ordinal value */
26327         #define HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_GE    UINT32_C(0x1)
26328         /* Greater than specified ordinal value */
26329         #define HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_GT    UINT32_C(0x2)
26330         #define HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_LAST \
26331                 HWRM_NVM_FIND_DIR_ENTRY_INPUT_OPT_ORDINAL_GT
26332         uint8_t unused_0[3];
26333 } __attribute__((packed));
26334
26335 /* hwrm_nvm_find_dir_entry_output (size:256b/32B) */
26336 struct hwrm_nvm_find_dir_entry_output {
26337         /* The specific error status for the command. */
26338         uint16_t        error_code;
26339         /* The HWRM command request type. */
26340         uint16_t        req_type;
26341         /* The sequence ID from the original command. */
26342         uint16_t        seq_id;
26343         /* The length of the response data in number of bytes. */
26344         uint16_t        resp_len;
26345         /* Allocated NVRAM for this directory entry, in bytes. */
26346         uint32_t        dir_item_length;
26347         /* Size of the stored data for this directory entry, in bytes. */
26348         uint32_t        dir_data_length;
26349         /*
26350          * Firmware version.
26351          * Only valid if the directory entry is for embedded firmware stored in APE_BIN Format.
26352          */
26353         uint32_t        fw_ver;
26354         /* Directory ordinal. */
26355         uint16_t        dir_ordinal;
26356         /* Directory Entry Index */
26357         uint16_t        dir_idx;
26358         uint8_t unused_0[7];
26359         /*
26360          * This field is used in Output records to indicate that the output
26361          * is completely written to RAM.  This field should be read as '1'
26362          * to indicate that the output has been completely written.
26363          * When writing a command completion or response to an internal processor,
26364          * the order of writes has to be such that this field is written last.
26365          */
26366         uint8_t valid;
26367 } __attribute__((packed));
26368
26369 /****************************
26370  * hwrm_nvm_erase_dir_entry *
26371  ****************************/
26372
26373
26374 /* hwrm_nvm_erase_dir_entry_input (size:192b/24B) */
26375 struct hwrm_nvm_erase_dir_entry_input {
26376         /* The HWRM command request type. */
26377         uint16_t        req_type;
26378         /*
26379          * The completion ring to send the completion event on. This should
26380          * be the NQ ID returned from the `nq_alloc` HWRM command.
26381          */
26382         uint16_t        cmpl_ring;
26383         /*
26384          * The sequence ID is used by the driver for tracking multiple
26385          * commands. This ID is treated as opaque data by the firmware and
26386          * the value is returned in the `hwrm_resp_hdr` upon completion.
26387          */
26388         uint16_t        seq_id;
26389         /*
26390          * The target ID of the command:
26391          * * 0x0-0xFFF8 - The function ID
26392          * * 0xFFF8-0xFFFE - Reserved for internal processors
26393          * * 0xFFFF - HWRM
26394          */
26395         uint16_t        target_id;
26396         /*
26397          * A physical address pointer pointing to a host buffer that the
26398          * command's response data will be written. This can be either a host
26399          * physical address (HPA) or a guest physical address (GPA) and must
26400          * point to a physically contiguous block of memory.
26401          */
26402         uint64_t        resp_addr;
26403         /* Directory Entry Index */
26404         uint16_t        dir_idx;
26405         uint8_t unused_0[6];
26406 } __attribute__((packed));
26407
26408 /* hwrm_nvm_erase_dir_entry_output (size:128b/16B) */
26409 struct hwrm_nvm_erase_dir_entry_output {
26410         /* The specific error status for the command. */
26411         uint16_t        error_code;
26412         /* The HWRM command request type. */
26413         uint16_t        req_type;
26414         /* The sequence ID from the original command. */
26415         uint16_t        seq_id;
26416         /* The length of the response data in number of bytes. */
26417         uint16_t        resp_len;
26418         uint8_t unused_0[7];
26419         /*
26420          * This field is used in Output records to indicate that the output
26421          * is completely written to RAM.  This field should be read as '1'
26422          * to indicate that the output has been completely written.
26423          * When writing a command completion or response to an internal processor,
26424          * the order of writes has to be such that this field is written last.
26425          */
26426         uint8_t valid;
26427 } __attribute__((packed));
26428
26429 /*************************
26430  * hwrm_nvm_get_dev_info *
26431  *************************/
26432
26433
26434 /* hwrm_nvm_get_dev_info_input (size:128b/16B) */
26435 struct hwrm_nvm_get_dev_info_input {
26436         /* The HWRM command request type. */
26437         uint16_t        req_type;
26438         /*
26439          * The completion ring to send the completion event on. This should
26440          * be the NQ ID returned from the `nq_alloc` HWRM command.
26441          */
26442         uint16_t        cmpl_ring;
26443         /*
26444          * The sequence ID is used by the driver for tracking multiple
26445          * commands. This ID is treated as opaque data by the firmware and
26446          * the value is returned in the `hwrm_resp_hdr` upon completion.
26447          */
26448         uint16_t        seq_id;
26449         /*
26450          * The target ID of the command:
26451          * * 0x0-0xFFF8 - The function ID
26452          * * 0xFFF8-0xFFFE - Reserved for internal processors
26453          * * 0xFFFF - HWRM
26454          */
26455         uint16_t        target_id;
26456         /*
26457          * A physical address pointer pointing to a host buffer that the
26458          * command's response data will be written. This can be either a host
26459          * physical address (HPA) or a guest physical address (GPA) and must
26460          * point to a physically contiguous block of memory.
26461          */
26462         uint64_t        resp_addr;
26463 } __attribute__((packed));
26464
26465 /* hwrm_nvm_get_dev_info_output (size:256b/32B) */
26466 struct hwrm_nvm_get_dev_info_output {
26467         /* The specific error status for the command. */
26468         uint16_t        error_code;
26469         /* The HWRM command request type. */
26470         uint16_t        req_type;
26471         /* The sequence ID from the original command. */
26472         uint16_t        seq_id;
26473         /* The length of the response data in number of bytes. */
26474         uint16_t        resp_len;
26475         /* Manufacturer ID. */
26476         uint16_t        manufacturer_id;
26477         /* Device ID. */
26478         uint16_t        device_id;
26479         /* Sector size of the NVRAM device. */
26480         uint32_t        sector_size;
26481         /* Total size, in bytes of the NVRAM device. */
26482         uint32_t        nvram_size;
26483         uint32_t        reserved_size;
26484         /* Available size that can be used, in bytes.  Available size is the NVRAM size take away the used size and reserved size. */
26485         uint32_t        available_size;
26486         uint8_t unused_0[3];
26487         /*
26488          * This field is used in Output records to indicate that the output
26489          * is completely written to RAM.  This field should be read as '1'
26490          * to indicate that the output has been completely written.
26491          * When writing a command completion or response to an internal processor,
26492          * the order of writes has to be such that this field is written last.
26493          */
26494         uint8_t valid;
26495 } __attribute__((packed));
26496
26497 /**************************
26498  * hwrm_nvm_mod_dir_entry *
26499  **************************/
26500
26501
26502 /* hwrm_nvm_mod_dir_entry_input (size:256b/32B) */
26503 struct hwrm_nvm_mod_dir_entry_input {
26504         /* The HWRM command request type. */
26505         uint16_t        req_type;
26506         /*
26507          * The completion ring to send the completion event on. This should
26508          * be the NQ ID returned from the `nq_alloc` HWRM command.
26509          */
26510         uint16_t        cmpl_ring;
26511         /*
26512          * The sequence ID is used by the driver for tracking multiple
26513          * commands. This ID is treated as opaque data by the firmware and
26514          * the value is returned in the `hwrm_resp_hdr` upon completion.
26515          */
26516         uint16_t        seq_id;
26517         /*
26518          * The target ID of the command:
26519          * * 0x0-0xFFF8 - The function ID
26520          * * 0xFFF8-0xFFFE - Reserved for internal processors
26521          * * 0xFFFF - HWRM
26522          */
26523         uint16_t        target_id;
26524         /*
26525          * A physical address pointer pointing to a host buffer that the
26526          * command's response data will be written. This can be either a host
26527          * physical address (HPA) or a guest physical address (GPA) and must
26528          * point to a physically contiguous block of memory.
26529          */
26530         uint64_t        resp_addr;
26531         uint32_t        enables;
26532         /*
26533          * This bit must be '1' for the checksum field to be
26534          * configured.
26535          */
26536         #define HWRM_NVM_MOD_DIR_ENTRY_INPUT_ENABLES_CHECKSUM     UINT32_C(0x1)
26537         /* Directory Entry Index */
26538         uint16_t        dir_idx;
26539         /*
26540          * Directory ordinal.
26541          * The (0-based) instance of this Directory Type.
26542          */
26543         uint16_t        dir_ordinal;
26544         /* The Directory Entry Extension flags (see BNX_DIR_EXT_* for extension flag definitions). */
26545         uint16_t        dir_ext;
26546         /* Directory Entry Attribute flags (see BNX_DIR_ATTR_* for attribute flag definitions). */
26547         uint16_t        dir_attr;
26548         /*
26549          * If valid, then this field updates the checksum
26550          * value of the content in the directory entry.
26551          */
26552         uint32_t        checksum;
26553 } __attribute__((packed));
26554
26555 /* hwrm_nvm_mod_dir_entry_output (size:128b/16B) */
26556 struct hwrm_nvm_mod_dir_entry_output {
26557         /* The specific error status for the command. */
26558         uint16_t        error_code;
26559         /* The HWRM command request type. */
26560         uint16_t        req_type;
26561         /* The sequence ID from the original command. */
26562         uint16_t        seq_id;
26563         /* The length of the response data in number of bytes. */
26564         uint16_t        resp_len;
26565         uint8_t unused_0[7];
26566         /*
26567          * This field is used in Output records to indicate that the output
26568          * is completely written to RAM.  This field should be read as '1'
26569          * to indicate that the output has been completely written.
26570          * When writing a command completion or response to an internal processor,
26571          * the order of writes has to be such that this field is written last.
26572          */
26573         uint8_t valid;
26574 } __attribute__((packed));
26575
26576 /**************************
26577  * hwrm_nvm_verify_update *
26578  **************************/
26579
26580
26581 /* hwrm_nvm_verify_update_input (size:192b/24B) */
26582 struct hwrm_nvm_verify_update_input {
26583         /* The HWRM command request type. */
26584         uint16_t        req_type;
26585         /*
26586          * The completion ring to send the completion event on. This should
26587          * be the NQ ID returned from the `nq_alloc` HWRM command.
26588          */
26589         uint16_t        cmpl_ring;
26590         /*
26591          * The sequence ID is used by the driver for tracking multiple
26592          * commands. This ID is treated as opaque data by the firmware and
26593          * the value is returned in the `hwrm_resp_hdr` upon completion.
26594          */
26595         uint16_t        seq_id;
26596         /*
26597          * The target ID of the command:
26598          * * 0x0-0xFFF8 - The function ID
26599          * * 0xFFF8-0xFFFE - Reserved for internal processors
26600          * * 0xFFFF - HWRM
26601          */
26602         uint16_t        target_id;
26603         /*
26604          * A physical address pointer pointing to a host buffer that the
26605          * command's response data will be written. This can be either a host
26606          * physical address (HPA) or a guest physical address (GPA) and must
26607          * point to a physically contiguous block of memory.
26608          */
26609         uint64_t        resp_addr;
26610         /* Directory Entry Type, to be verified. */
26611         uint16_t        dir_type;
26612         /*
26613          * Directory ordinal.
26614          * The instance of the Directory Type to be verified.
26615          */
26616         uint16_t        dir_ordinal;
26617         /*
26618          * The Directory Entry Extension flags.
26619          * The "UPDATE" extension flag must be set in this value.
26620          * A corresponding directory entry with the same type and ordinal values but *without*
26621          * the "UPDATE" extension flag must also exist. The other flags of the extension must
26622          * be identical between the active and update entries.
26623          */
26624         uint16_t        dir_ext;
26625         uint8_t unused_0[2];
26626 } __attribute__((packed));
26627
26628 /* hwrm_nvm_verify_update_output (size:128b/16B) */
26629 struct hwrm_nvm_verify_update_output {
26630         /* The specific error status for the command. */
26631         uint16_t        error_code;
26632         /* The HWRM command request type. */
26633         uint16_t        req_type;
26634         /* The sequence ID from the original command. */
26635         uint16_t        seq_id;
26636         /* The length of the response data in number of bytes. */
26637         uint16_t        resp_len;
26638         uint8_t unused_0[7];
26639         /*
26640          * This field is used in Output records to indicate that the output
26641          * is completely written to RAM.  This field should be read as '1'
26642          * to indicate that the output has been completely written.
26643          * When writing a command completion or response to an internal processor,
26644          * the order of writes has to be such that this field is written last.
26645          */
26646         uint8_t valid;
26647 } __attribute__((packed));
26648
26649 /***************************
26650  * hwrm_nvm_install_update *
26651  ***************************/
26652
26653
26654 /* hwrm_nvm_install_update_input (size:192b/24B) */
26655 struct hwrm_nvm_install_update_input {
26656         /* The HWRM command request type. */
26657         uint16_t        req_type;
26658         /*
26659          * The completion ring to send the completion event on. This should
26660          * be the NQ ID returned from the `nq_alloc` HWRM command.
26661          */
26662         uint16_t        cmpl_ring;
26663         /*
26664          * The sequence ID is used by the driver for tracking multiple
26665          * commands. This ID is treated as opaque data by the firmware and
26666          * the value is returned in the `hwrm_resp_hdr` upon completion.
26667          */
26668         uint16_t        seq_id;
26669         /*
26670          * The target ID of the command:
26671          * * 0x0-0xFFF8 - The function ID
26672          * * 0xFFF8-0xFFFE - Reserved for internal processors
26673          * * 0xFFFF - HWRM
26674          */
26675         uint16_t        target_id;
26676         /*
26677          * A physical address pointer pointing to a host buffer that the
26678          * command's response data will be written. This can be either a host
26679          * physical address (HPA) or a guest physical address (GPA) and must
26680          * point to a physically contiguous block of memory.
26681          */
26682         uint64_t        resp_addr;
26683         /*
26684          * Installation type. If the value 3 through 0xffff is used,
26685          * only packaged items with that type value will be installed and
26686          * conditional installation directives for those packaged items
26687          * will be over-ridden (i.e. 'create' or 'replace' will be treated
26688          * as 'install').
26689          */
26690         uint32_t        install_type;
26691         /*
26692          * Perform a normal package installation. Conditional installation
26693          * directives (e.g. 'create' and 'replace') of packaged items
26694          * will be followed.
26695          */
26696         #define HWRM_NVM_INSTALL_UPDATE_INPUT_INSTALL_TYPE_NORMAL UINT32_C(0x0)
26697         /*
26698          * Install all packaged items regardless of installation directive
26699          * (i.e. treat all packaged items as though they have an installation
26700          * directive of 'install').
26701          */
26702         #define HWRM_NVM_INSTALL_UPDATE_INPUT_INSTALL_TYPE_ALL \
26703                 UINT32_C(0xffffffff)
26704         #define HWRM_NVM_INSTALL_UPDATE_INPUT_INSTALL_TYPE_LAST \
26705                 HWRM_NVM_INSTALL_UPDATE_INPUT_INSTALL_TYPE_ALL
26706         uint16_t        flags;
26707         /* If set to 1, then securely erase all unused locations in persistent storage. */
26708         #define HWRM_NVM_INSTALL_UPDATE_INPUT_FLAGS_ERASE_UNUSED_SPACE \
26709                 UINT32_C(0x1)
26710         /*
26711          * If set to 1, then unspecifed images, images not in the package file, will be safely deleted.
26712          * When combined with erase_unused_space then unspecified images will be securely erased.
26713          */
26714         #define HWRM_NVM_INSTALL_UPDATE_INPUT_FLAGS_REMOVE_UNUSED_PKG \
26715                 UINT32_C(0x2)
26716         /*
26717          * If set to 1, FW will defragment the NVM if defragmentation is required for the update.
26718          * Allow additional time for this command to complete if this bit is set to 1.
26719          */
26720         #define HWRM_NVM_INSTALL_UPDATE_INPUT_FLAGS_ALLOWED_TO_DEFRAG \
26721                 UINT32_C(0x4)
26722         uint8_t unused_0[2];
26723 } __attribute__((packed));
26724
26725 /* hwrm_nvm_install_update_output (size:192b/24B) */
26726 struct hwrm_nvm_install_update_output {
26727         /* The specific error status for the command. */
26728         uint16_t        error_code;
26729         /* The HWRM command request type. */
26730         uint16_t        req_type;
26731         /* The sequence ID from the original command. */
26732         uint16_t        seq_id;
26733         /* The length of the response data in number of bytes. */
26734         uint16_t        resp_len;
26735         /*
26736          * Bit-mask of successfully installed items.
26737          * Bit-0 corresponding to the first packaged item, Bit-1 for the second item, etc.
26738          * A value of 0 indicates that no items were successfully installed.
26739          */
26740         uint64_t        installed_items;
26741         /* result is 8 b */
26742         uint8_t result;
26743         /* There was no problem with the package installation. */
26744         #define HWRM_NVM_INSTALL_UPDATE_OUTPUT_RESULT_SUCCESS UINT32_C(0x0)
26745         #define HWRM_NVM_INSTALL_UPDATE_OUTPUT_RESULT_LAST \
26746                 HWRM_NVM_INSTALL_UPDATE_OUTPUT_RESULT_SUCCESS
26747         /* problem_item is 8 b */
26748         uint8_t problem_item;
26749         /* There was no problem with any packaged items. */
26750         #define HWRM_NVM_INSTALL_UPDATE_OUTPUT_PROBLEM_ITEM_NONE \
26751                 UINT32_C(0x0)
26752         /* There was a problem with the NVM package itself. */
26753         #define HWRM_NVM_INSTALL_UPDATE_OUTPUT_PROBLEM_ITEM_PACKAGE \
26754                 UINT32_C(0xff)
26755         #define HWRM_NVM_INSTALL_UPDATE_OUTPUT_PROBLEM_ITEM_LAST \
26756                 HWRM_NVM_INSTALL_UPDATE_OUTPUT_PROBLEM_ITEM_PACKAGE
26757         /* reset_required is 8 b */
26758         uint8_t reset_required;
26759         /*
26760          * No reset is required for installed/updated firmware or
26761          * microcode to take effect.
26762          */
26763         #define HWRM_NVM_INSTALL_UPDATE_OUTPUT_RESET_REQUIRED_NONE \
26764                 UINT32_C(0x0)
26765         /*
26766          * A PCIe reset (e.g. system reboot) is
26767          * required for newly installed/updated firmware or
26768          * microcode to take effect.
26769          */
26770         #define HWRM_NVM_INSTALL_UPDATE_OUTPUT_RESET_REQUIRED_PCI \
26771                 UINT32_C(0x1)
26772         /*
26773          * A controller power reset (e.g. system power-cycle) is
26774          * required for newly installed/updated firmware or
26775          * microcode to take effect. Some newly installed/updated
26776          * firmware or microcode may still take effect upon the
26777          * next PCIe reset.
26778          */
26779         #define HWRM_NVM_INSTALL_UPDATE_OUTPUT_RESET_REQUIRED_POWER \
26780                 UINT32_C(0x2)
26781         #define HWRM_NVM_INSTALL_UPDATE_OUTPUT_RESET_REQUIRED_LAST \
26782                 HWRM_NVM_INSTALL_UPDATE_OUTPUT_RESET_REQUIRED_POWER
26783         uint8_t unused_0[4];
26784         /*
26785          * This field is used in Output records to indicate that the output
26786          * is completely written to RAM.  This field should be read as '1'
26787          * to indicate that the output has been completely written.
26788          * When writing a command completion or response to an internal processor,
26789          * the order of writes has to be such that this field is written last.
26790          */
26791         uint8_t valid;
26792 } __attribute__((packed));
26793
26794 /* hwrm_nvm_install_update_cmd_err (size:64b/8B) */
26795 struct hwrm_nvm_install_update_cmd_err {
26796         /*
26797          * command specific error codes that goes to
26798          * the cmd_err field in Common HWRM Error Response.
26799          */
26800         uint8_t code;
26801         /* Unknown error */
26802         #define HWRM_NVM_INSTALL_UPDATE_CMD_ERR_CODE_UNKNOWN  UINT32_C(0x0)
26803         /* Unable to complete operation due to fragmentation */
26804         #define HWRM_NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR UINT32_C(0x1)
26805         /* nvm is completely full. */
26806         #define HWRM_NVM_INSTALL_UPDATE_CMD_ERR_CODE_NO_SPACE UINT32_C(0x2)
26807         #define HWRM_NVM_INSTALL_UPDATE_CMD_ERR_CODE_LAST \
26808                 HWRM_NVM_INSTALL_UPDATE_CMD_ERR_CODE_NO_SPACE
26809         uint8_t unused_0[7];
26810 } __attribute__((packed));
26811
26812 /******************
26813  * hwrm_nvm_flush *
26814  ******************/
26815
26816
26817 /* hwrm_nvm_flush_input (size:128b/16B) */
26818 struct hwrm_nvm_flush_input {
26819         /* The HWRM command request type. */
26820         uint16_t        req_type;
26821         /*
26822          * The completion ring to send the completion event on. This should
26823          * be the NQ ID returned from the `nq_alloc` HWRM command.
26824          */
26825         uint16_t        cmpl_ring;
26826         /*
26827          * The sequence ID is used by the driver for tracking multiple
26828          * commands. This ID is treated as opaque data by the firmware and
26829          * the value is returned in the `hwrm_resp_hdr` upon completion.
26830          */
26831         uint16_t        seq_id;
26832         /*
26833          * The target ID of the command:
26834          * * 0x0-0xFFF8 - The function ID
26835          * * 0xFFF8-0xFFFE - Reserved for internal processors
26836          * * 0xFFFF - HWRM
26837          */
26838         uint16_t        target_id;
26839         /*
26840          * A physical address pointer pointing to a host buffer that the
26841          * command's response data will be written. This can be either a host
26842          * physical address (HPA) or a guest physical address (GPA) and must
26843          * point to a physically contiguous block of memory.
26844          */
26845         uint64_t        resp_addr;
26846 } __attribute__((packed));
26847
26848 /* hwrm_nvm_flush_output (size:128b/16B) */
26849 struct hwrm_nvm_flush_output {
26850         /* The specific error status for the command. */
26851         uint16_t        error_code;
26852         /* The HWRM command request type. */
26853         uint16_t        req_type;
26854         /* The sequence ID from the original command. */
26855         uint16_t        seq_id;
26856         /* The length of the response data in number of bytes. */
26857         uint16_t        resp_len;
26858         uint8_t unused_0[7];
26859         /*
26860          * This field is used in Output records to indicate that the output
26861          * is completely written to RAM.  This field should be read as '1'
26862          * to indicate that the output has been completely written.
26863          * When writing a command completion or response to an internal processor,
26864          * the order of writes has to be such that this field is written last.
26865          */
26866         uint8_t valid;
26867 } __attribute__((packed));
26868
26869 /* hwrm_nvm_flush_cmd_err (size:64b/8B) */
26870 struct hwrm_nvm_flush_cmd_err {
26871         /*
26872          * command specific error codes that goes to
26873          * the cmd_err field in Common HWRM Error Response.
26874          */
26875         uint8_t code;
26876         /* Unknown error */
26877         #define HWRM_NVM_FLUSH_CMD_ERR_CODE_UNKNOWN UINT32_C(0x0)
26878         /* flush could not be performed */
26879         #define HWRM_NVM_FLUSH_CMD_ERR_CODE_FAIL    UINT32_C(0x1)
26880         #define HWRM_NVM_FLUSH_CMD_ERR_CODE_LAST \
26881                 HWRM_NVM_FLUSH_CMD_ERR_CODE_FAIL
26882         uint8_t unused_0[7];
26883 } __attribute__((packed));
26884
26885 /*************************
26886  * hwrm_nvm_get_variable *
26887  *************************/
26888
26889
26890 /* hwrm_nvm_get_variable_input (size:320b/40B) */
26891 struct hwrm_nvm_get_variable_input {
26892         /* The HWRM command request type. */
26893         uint16_t        req_type;
26894         /*
26895          * The completion ring to send the completion event on. This should
26896          * be the NQ ID returned from the `nq_alloc` HWRM command.
26897          */
26898         uint16_t        cmpl_ring;
26899         /*
26900          * The sequence ID is used by the driver for tracking multiple
26901          * commands. This ID is treated as opaque data by the firmware and
26902          * the value is returned in the `hwrm_resp_hdr` upon completion.
26903          */
26904         uint16_t        seq_id;
26905         /*
26906          * The target ID of the command:
26907          * * 0x0-0xFFF8 - The function ID
26908          * * 0xFFF8-0xFFFE - Reserved for internal processors
26909          * * 0xFFFF - HWRM
26910          */
26911         uint16_t        target_id;
26912         /*
26913          * A physical address pointer pointing to a host buffer that the
26914          * command's response data will be written. This can be either a host
26915          * physical address (HPA) or a guest physical address (GPA) and must
26916          * point to a physically contiguous block of memory.
26917          */
26918         uint64_t        resp_addr;
26919         /*
26920          * This is the host address where
26921          * nvm variable will be stored
26922          */
26923         uint64_t        dest_data_addr;
26924         /* size of data in bits */
26925         uint16_t        data_len;
26926         /* nvm cfg option number */
26927         uint16_t        option_num;
26928         /* reserved. */
26929         #define HWRM_NVM_GET_VARIABLE_INPUT_OPTION_NUM_RSVD_0    UINT32_C(0x0)
26930         /* reserved. */
26931         #define HWRM_NVM_GET_VARIABLE_INPUT_OPTION_NUM_RSVD_FFFF \
26932                 UINT32_C(0xffff)
26933         #define HWRM_NVM_GET_VARIABLE_INPUT_OPTION_NUM_LAST \
26934                 HWRM_NVM_GET_VARIABLE_INPUT_OPTION_NUM_RSVD_FFFF
26935         /*
26936          * Number of dimensions for this nvm configuration variable.
26937          * This value indicates how many of the indexN values to use.
26938          * A value of 0 means that none of the indexN values are valid.
26939          * A value of 1 requires at index0 is valued, a value of 2
26940          * requires that index0 and index1 are valid, and so forth
26941          */
26942         uint16_t        dimensions;
26943         /* index for the 1st dimensions */
26944         uint16_t        index_0;
26945         /* index for the 2nd dimensions */
26946         uint16_t        index_1;
26947         /* index for the 3rd dimensions */
26948         uint16_t        index_2;
26949         /* index for the 4th dimensions */
26950         uint16_t        index_3;
26951         uint8_t flags;
26952         /*
26953          * When this bit is set to 1, the factory default value will be returned,
26954          * 0 returns the operational value.
26955          */
26956         #define HWRM_NVM_GET_VARIABLE_INPUT_FLAGS_FACTORY_DFLT \
26957                 UINT32_C(0x1)
26958         uint8_t unused_0;
26959 } __attribute__((packed));
26960
26961 /* hwrm_nvm_get_variable_output (size:128b/16B) */
26962 struct hwrm_nvm_get_variable_output {
26963         /* The specific error status for the command. */
26964         uint16_t        error_code;
26965         /* The HWRM command request type. */
26966         uint16_t        req_type;
26967         /* The sequence ID from the original command. */
26968         uint16_t        seq_id;
26969         /* The length of the response data in number of bytes. */
26970         uint16_t        resp_len;
26971         /* size of data of the actual variable retrieved in bits */
26972         uint16_t        data_len;
26973         /*
26974          * option_num is the option number for the data retrieved.  It is possible in the
26975          * future that the option number returned would be different than requested.  This
26976          * condition could occur if an option is deprecated and a new option id is defined
26977          * with similar characteristics, but has a slightly different definition.  This
26978          * also makes it convenient for the caller to identify the variable result with
26979          * the option id from the response.
26980          */
26981         uint16_t        option_num;
26982         /* reserved. */
26983         #define HWRM_NVM_GET_VARIABLE_OUTPUT_OPTION_NUM_RSVD_0    UINT32_C(0x0)
26984         /* reserved. */
26985         #define HWRM_NVM_GET_VARIABLE_OUTPUT_OPTION_NUM_RSVD_FFFF \
26986                 UINT32_C(0xffff)
26987         #define HWRM_NVM_GET_VARIABLE_OUTPUT_OPTION_NUM_LAST \
26988                 HWRM_NVM_GET_VARIABLE_OUTPUT_OPTION_NUM_RSVD_FFFF
26989         uint8_t unused_0[3];
26990         /*
26991          * This field is used in Output records to indicate that the output
26992          * is completely written to RAM.  This field should be read as '1'
26993          * to indicate that the output has been completely written.
26994          * When writing a command completion or response to an internal processor,
26995          * the order of writes has to be such that this field is written last.
26996          */
26997         uint8_t valid;
26998 } __attribute__((packed));
26999
27000 /* hwrm_nvm_get_variable_cmd_err (size:64b/8B) */
27001 struct hwrm_nvm_get_variable_cmd_err {
27002         /*
27003          * command specific error codes that goes to
27004          * the cmd_err field in Common HWRM Error Response.
27005          */
27006         uint8_t code;
27007         /* Unknown error */
27008         #define HWRM_NVM_GET_VARIABLE_CMD_ERR_CODE_UNKNOWN       UINT32_C(0x0)
27009         /* variable does not exist */
27010         #define HWRM_NVM_GET_VARIABLE_CMD_ERR_CODE_VAR_NOT_EXIST UINT32_C(0x1)
27011         /* configuration is corrupted and the variable cannot be saved */
27012         #define HWRM_NVM_GET_VARIABLE_CMD_ERR_CODE_CORRUPT_VAR   UINT32_C(0x2)
27013         /* length specified is too small */
27014         #define HWRM_NVM_GET_VARIABLE_CMD_ERR_CODE_LEN_TOO_SHORT UINT32_C(0x3)
27015         #define HWRM_NVM_GET_VARIABLE_CMD_ERR_CODE_LAST \
27016                 HWRM_NVM_GET_VARIABLE_CMD_ERR_CODE_LEN_TOO_SHORT
27017         uint8_t unused_0[7];
27018 } __attribute__((packed));
27019
27020 /*************************
27021  * hwrm_nvm_set_variable *
27022  *************************/
27023
27024
27025 /* hwrm_nvm_set_variable_input (size:320b/40B) */
27026 struct hwrm_nvm_set_variable_input {
27027         /* The HWRM command request type. */
27028         uint16_t        req_type;
27029         /*
27030          * The completion ring to send the completion event on. This should
27031          * be the NQ ID returned from the `nq_alloc` HWRM command.
27032          */
27033         uint16_t        cmpl_ring;
27034         /*
27035          * The sequence ID is used by the driver for tracking multiple
27036          * commands. This ID is treated as opaque data by the firmware and
27037          * the value is returned in the `hwrm_resp_hdr` upon completion.
27038          */
27039         uint16_t        seq_id;
27040         /*
27041          * The target ID of the command:
27042          * * 0x0-0xFFF8 - The function ID
27043          * * 0xFFF8-0xFFFE - Reserved for internal processors
27044          * * 0xFFFF - HWRM
27045          */
27046         uint16_t        target_id;
27047         /*
27048          * A physical address pointer pointing to a host buffer that the
27049          * command's response data will be written. This can be either a host
27050          * physical address (HPA) or a guest physical address (GPA) and must
27051          * point to a physically contiguous block of memory.
27052          */
27053         uint64_t        resp_addr;
27054         /*
27055          * This is the host address where
27056          * nvm variable will be copied from
27057          */
27058         uint64_t        src_data_addr;
27059         /* size of data in bits */
27060         uint16_t        data_len;
27061         /* nvm cfg option number */
27062         uint16_t        option_num;
27063         /* reserved. */
27064         #define HWRM_NVM_SET_VARIABLE_INPUT_OPTION_NUM_RSVD_0    UINT32_C(0x0)
27065         /* reserved. */
27066         #define HWRM_NVM_SET_VARIABLE_INPUT_OPTION_NUM_RSVD_FFFF \
27067                 UINT32_C(0xffff)
27068         #define HWRM_NVM_SET_VARIABLE_INPUT_OPTION_NUM_LAST \
27069                 HWRM_NVM_SET_VARIABLE_INPUT_OPTION_NUM_RSVD_FFFF
27070         /*
27071          * Number of dimensions for this nvm configuration variable.
27072          * This value indicates how many of the indexN values to use.
27073          * A value of 0 means that none of the indexN values are valid.
27074          * A value of 1 requires at index0 is valued, a value of 2
27075          * requires that index0 and index1 are valid, and so forth
27076          */
27077         uint16_t        dimensions;
27078         /* index for the 1st dimensions */
27079         uint16_t        index_0;
27080         /* index for the 2nd dimensions */
27081         uint16_t        index_1;
27082         /* index for the 3rd dimensions */
27083         uint16_t        index_2;
27084         /* index for the 4th dimensions */
27085         uint16_t        index_3;
27086         uint8_t flags;
27087         /* When this bit is 1, flush internal cache after this write operation (see hwrm_nvm_flush command.) */
27088         #define HWRM_NVM_SET_VARIABLE_INPUT_FLAGS_FORCE_FLUSH \
27089                 UINT32_C(0x1)
27090         /* encryption method */
27091         #define HWRM_NVM_SET_VARIABLE_INPUT_FLAGS_ENCRYPT_MODE_MASK \
27092                 UINT32_C(0xe)
27093         #define HWRM_NVM_SET_VARIABLE_INPUT_FLAGS_ENCRYPT_MODE_SFT           1
27094         /* No encryption. */
27095         #define HWRM_NVM_SET_VARIABLE_INPUT_FLAGS_ENCRYPT_MODE_NONE \
27096                 (UINT32_C(0x0) << 1)
27097         /* one-way encryption. */
27098         #define HWRM_NVM_SET_VARIABLE_INPUT_FLAGS_ENCRYPT_MODE_HMAC_SHA1 \
27099                 (UINT32_C(0x1) << 1)
27100         /* symmetric AES256 encryption. */
27101         #define HWRM_NVM_SET_VARIABLE_INPUT_FLAGS_ENCRYPT_MODE_AES256 \
27102                 (UINT32_C(0x2) << 1)
27103         /* SHA1 digest appended to plaintext contents, for authentication */
27104         #define HWRM_NVM_SET_VARIABLE_INPUT_FLAGS_ENCRYPT_MODE_HMAC_SHA1_AUTH \
27105                 (UINT32_C(0x3) << 1)
27106         #define HWRM_NVM_SET_VARIABLE_INPUT_FLAGS_ENCRYPT_MODE_LAST \
27107                 HWRM_NVM_SET_VARIABLE_INPUT_FLAGS_ENCRYPT_MODE_HMAC_SHA1_AUTH
27108         uint8_t unused_0;
27109 } __attribute__((packed));
27110
27111 /* hwrm_nvm_set_variable_output (size:128b/16B) */
27112 struct hwrm_nvm_set_variable_output {
27113         /* The specific error status for the command. */
27114         uint16_t        error_code;
27115         /* The HWRM command request type. */
27116         uint16_t        req_type;
27117         /* The sequence ID from the original command. */
27118         uint16_t        seq_id;
27119         /* The length of the response data in number of bytes. */
27120         uint16_t        resp_len;
27121         uint8_t unused_0[7];
27122         /*
27123          * This field is used in Output records to indicate that the output
27124          * is completely written to RAM.  This field should be read as '1'
27125          * to indicate that the output has been completely written.
27126          * When writing a command completion or response to an internal processor,
27127          * the order of writes has to be such that this field is written last.
27128          */
27129         uint8_t valid;
27130 } __attribute__((packed));
27131
27132 /* hwrm_nvm_set_variable_cmd_err (size:64b/8B) */
27133 struct hwrm_nvm_set_variable_cmd_err {
27134         /*
27135          * command specific error codes that goes to
27136          * the cmd_err field in Common HWRM Error Response.
27137          */
27138         uint8_t code;
27139         /* Unknown error */
27140         #define HWRM_NVM_SET_VARIABLE_CMD_ERR_CODE_UNKNOWN       UINT32_C(0x0)
27141         /* variable does not exist */
27142         #define HWRM_NVM_SET_VARIABLE_CMD_ERR_CODE_VAR_NOT_EXIST UINT32_C(0x1)
27143         /* configuration is corrupted and the variable cannot be saved */
27144         #define HWRM_NVM_SET_VARIABLE_CMD_ERR_CODE_CORRUPT_VAR   UINT32_C(0x2)
27145         #define HWRM_NVM_SET_VARIABLE_CMD_ERR_CODE_LAST \
27146                 HWRM_NVM_SET_VARIABLE_CMD_ERR_CODE_CORRUPT_VAR
27147         uint8_t unused_0[7];
27148 } __attribute__((packed));
27149
27150 /****************************
27151  * hwrm_nvm_validate_option *
27152  ****************************/
27153
27154
27155 /* hwrm_nvm_validate_option_input (size:320b/40B) */
27156 struct hwrm_nvm_validate_option_input {
27157         /* The HWRM command request type. */
27158         uint16_t        req_type;
27159         /*
27160          * The completion ring to send the completion event on. This should
27161          * be the NQ ID returned from the `nq_alloc` HWRM command.
27162          */
27163         uint16_t        cmpl_ring;
27164         /*
27165          * The sequence ID is used by the driver for tracking multiple
27166          * commands. This ID is treated as opaque data by the firmware and
27167          * the value is returned in the `hwrm_resp_hdr` upon completion.
27168          */
27169         uint16_t        seq_id;
27170         /*
27171          * The target ID of the command:
27172          * * 0x0-0xFFF8 - The function ID
27173          * * 0xFFF8-0xFFFE - Reserved for internal processors
27174          * * 0xFFFF - HWRM
27175          */
27176         uint16_t        target_id;
27177         /*
27178          * A physical address pointer pointing to a host buffer that the
27179          * command's response data will be written. This can be either a host
27180          * physical address (HPA) or a guest physical address (GPA) and must
27181          * point to a physically contiguous block of memory.
27182          */
27183         uint64_t        resp_addr;
27184         /*
27185          * This is the host address where
27186          * nvm variable will be copied from
27187          */
27188         uint64_t        src_data_addr;
27189         /* size of data in bits */
27190         uint16_t        data_len;
27191         /* nvm cfg option number */
27192         uint16_t        option_num;
27193         /* reserved. */
27194         #define HWRM_NVM_VALIDATE_OPTION_INPUT_OPTION_NUM_RSVD_0 \
27195                 UINT32_C(0x0)
27196         /* reserved. */
27197         #define HWRM_NVM_VALIDATE_OPTION_INPUT_OPTION_NUM_RSVD_FFFF \
27198                 UINT32_C(0xffff)
27199         #define HWRM_NVM_VALIDATE_OPTION_INPUT_OPTION_NUM_LAST \
27200                 HWRM_NVM_VALIDATE_OPTION_INPUT_OPTION_NUM_RSVD_FFFF
27201         /*
27202          * Number of dimensions for this nvm configuration variable.
27203          * This value indicates how many of the indexN values to use.
27204          * A value of 0 means that none of the indexN values are valid.
27205          * A value of 1 requires at index0 is valued, a value of 2
27206          * requires that index0 and index1 are valid, and so forth
27207          */
27208         uint16_t        dimensions;
27209         /* index for the 1st dimensions */
27210         uint16_t        index_0;
27211         /* index for the 2nd dimensions */
27212         uint16_t        index_1;
27213         /* index for the 3rd dimensions */
27214         uint16_t        index_2;
27215         /* index for the 4th dimensions */
27216         uint16_t        index_3;
27217         uint8_t unused_0[2];
27218 } __attribute__((packed));
27219
27220 /* hwrm_nvm_validate_option_output (size:128b/16B) */
27221 struct hwrm_nvm_validate_option_output {
27222         /* The specific error status for the command. */
27223         uint16_t        error_code;
27224         /* The HWRM command request type. */
27225         uint16_t        req_type;
27226         /* The sequence ID from the original command. */
27227         uint16_t        seq_id;
27228         /* The length of the response data in number of bytes. */
27229         uint16_t        resp_len;
27230         uint8_t result;
27231         /* indicates that the value provided for the option is not matching with the saved data. */
27232         #define HWRM_NVM_VALIDATE_OPTION_OUTPUT_RESULT_NOT_MATCH UINT32_C(0x0)
27233         /* indicates that the value provided for the option is matching the saved data. */
27234         #define HWRM_NVM_VALIDATE_OPTION_OUTPUT_RESULT_MATCH     UINT32_C(0x1)
27235         #define HWRM_NVM_VALIDATE_OPTION_OUTPUT_RESULT_LAST \
27236                 HWRM_NVM_VALIDATE_OPTION_OUTPUT_RESULT_MATCH
27237         uint8_t unused_0[6];
27238         /*
27239          * This field is used in Output records to indicate that the output
27240          * is completely written to RAM.  This field should be read as '1'
27241          * to indicate that the output has been completely written.
27242          * When writing a command completion or response to an internal processor,
27243          * the order of writes has to be such that this field is written last.
27244          */
27245         uint8_t valid;
27246 } __attribute__((packed));
27247
27248 /* hwrm_nvm_validate_option_cmd_err (size:64b/8B) */
27249 struct hwrm_nvm_validate_option_cmd_err {
27250         /*
27251          * command specific error codes that goes to
27252          * the cmd_err field in Common HWRM Error Response.
27253          */
27254         uint8_t code;
27255         /* Unknown error */
27256         #define HWRM_NVM_VALIDATE_OPTION_CMD_ERR_CODE_UNKNOWN UINT32_C(0x0)
27257         #define HWRM_NVM_VALIDATE_OPTION_CMD_ERR_CODE_LAST \
27258                 HWRM_NVM_VALIDATE_OPTION_CMD_ERR_CODE_UNKNOWN
27259         uint8_t unused_0[7];
27260 } __attribute__((packed));
27261
27262 #endif /* _HSI_STRUCT_DEF_DPDK_H_ */