xref: /linux/drivers/infiniband/hw/efa/efa_admin_cmds_defs.h (revision 7ce4de1cdaf11c39b507008dfb5a4e59079d4e8a)
101edac3aSGal Pressman /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
201edac3aSGal Pressman /*
3*475ac071SBasel Nassar  * Copyright 2018-2025 Amazon.com, Inc. or its affiliates. All rights reserved.
401edac3aSGal Pressman  */
501edac3aSGal Pressman 
601edac3aSGal Pressman #ifndef _EFA_ADMIN_CMDS_H_
701edac3aSGal Pressman #define _EFA_ADMIN_CMDS_H_
801edac3aSGal Pressman 
901edac3aSGal Pressman #define EFA_ADMIN_API_VERSION_MAJOR          0
1001edac3aSGal Pressman #define EFA_ADMIN_API_VERSION_MINOR          1
1101edac3aSGal Pressman 
1201edac3aSGal Pressman /* EFA admin queue opcodes */
1301edac3aSGal Pressman enum efa_admin_aq_opcode {
1401edac3aSGal Pressman 	EFA_ADMIN_CREATE_QP                         = 1,
1501edac3aSGal Pressman 	EFA_ADMIN_MODIFY_QP                         = 2,
1601edac3aSGal Pressman 	EFA_ADMIN_QUERY_QP                          = 3,
1701edac3aSGal Pressman 	EFA_ADMIN_DESTROY_QP                        = 4,
1801edac3aSGal Pressman 	EFA_ADMIN_CREATE_AH                         = 5,
1901edac3aSGal Pressman 	EFA_ADMIN_DESTROY_AH                        = 6,
2001edac3aSGal Pressman 	EFA_ADMIN_REG_MR                            = 7,
2101edac3aSGal Pressman 	EFA_ADMIN_DEREG_MR                          = 8,
2201edac3aSGal Pressman 	EFA_ADMIN_CREATE_CQ                         = 9,
2301edac3aSGal Pressman 	EFA_ADMIN_DESTROY_CQ                        = 10,
2401edac3aSGal Pressman 	EFA_ADMIN_GET_FEATURE                       = 11,
2501edac3aSGal Pressman 	EFA_ADMIN_SET_FEATURE                       = 12,
2601edac3aSGal Pressman 	EFA_ADMIN_GET_STATS                         = 13,
2701edac3aSGal Pressman 	EFA_ADMIN_ALLOC_PD                          = 14,
2801edac3aSGal Pressman 	EFA_ADMIN_DEALLOC_PD                        = 15,
2901edac3aSGal Pressman 	EFA_ADMIN_ALLOC_UAR                         = 16,
3001edac3aSGal Pressman 	EFA_ADMIN_DEALLOC_UAR                       = 17,
312a152512SGal Pressman 	EFA_ADMIN_CREATE_EQ                         = 18,
322a152512SGal Pressman 	EFA_ADMIN_DESTROY_EQ                        = 19,
331e7b86f1SMichael Margolin 	EFA_ADMIN_ALLOC_MR                          = 20,
341e7b86f1SMichael Margolin 	EFA_ADMIN_MAX_OPCODE                        = 20,
3501edac3aSGal Pressman };
3601edac3aSGal Pressman 
3701edac3aSGal Pressman enum efa_admin_aq_feature_id {
3801edac3aSGal Pressman 	EFA_ADMIN_DEVICE_ATTR                       = 1,
3901edac3aSGal Pressman 	EFA_ADMIN_AENQ_CONFIG                       = 2,
4001edac3aSGal Pressman 	EFA_ADMIN_NETWORK_ATTR                      = 3,
4101edac3aSGal Pressman 	EFA_ADMIN_QUEUE_ATTR                        = 4,
4201edac3aSGal Pressman 	EFA_ADMIN_HW_HINTS                          = 5,
43e1ca01a9SGal Pressman 	EFA_ADMIN_HOST_INFO                         = 6,
442a152512SGal Pressman 	EFA_ADMIN_EVENT_QUEUE_ATTR                  = 7,
4501edac3aSGal Pressman };
4601edac3aSGal Pressman 
4701edac3aSGal Pressman /* QP transport type */
4801edac3aSGal Pressman enum efa_admin_qp_type {
4901edac3aSGal Pressman 	/* Unreliable Datagram */
5001edac3aSGal Pressman 	EFA_ADMIN_QP_TYPE_UD                        = 1,
5101edac3aSGal Pressman 	/* Scalable Reliable Datagram */
5201edac3aSGal Pressman 	EFA_ADMIN_QP_TYPE_SRD                       = 2,
5301edac3aSGal Pressman };
5401edac3aSGal Pressman 
5501edac3aSGal Pressman /* QP state */
5601edac3aSGal Pressman enum efa_admin_qp_state {
5701edac3aSGal Pressman 	EFA_ADMIN_QP_STATE_RESET                    = 0,
5801edac3aSGal Pressman 	EFA_ADMIN_QP_STATE_INIT                     = 1,
5901edac3aSGal Pressman 	EFA_ADMIN_QP_STATE_RTR                      = 2,
6001edac3aSGal Pressman 	EFA_ADMIN_QP_STATE_RTS                      = 3,
6101edac3aSGal Pressman 	EFA_ADMIN_QP_STATE_SQD                      = 4,
6201edac3aSGal Pressman 	EFA_ADMIN_QP_STATE_SQE                      = 5,
6301edac3aSGal Pressman 	EFA_ADMIN_QP_STATE_ERR                      = 6,
6401edac3aSGal Pressman };
6501edac3aSGal Pressman 
6601edac3aSGal Pressman enum efa_admin_get_stats_type {
6701edac3aSGal Pressman 	EFA_ADMIN_GET_STATS_TYPE_BASIC              = 0,
68b0cff387SDaniel Kranzdorf 	EFA_ADMIN_GET_STATS_TYPE_MESSAGES           = 1,
69b0cff387SDaniel Kranzdorf 	EFA_ADMIN_GET_STATS_TYPE_RDMA_READ          = 2,
70113383efSMichael Margolin 	EFA_ADMIN_GET_STATS_TYPE_RDMA_WRITE         = 3,
71*475ac071SBasel Nassar 	EFA_ADMIN_GET_STATS_TYPE_NETWORK            = 4,
7201edac3aSGal Pressman };
7301edac3aSGal Pressman 
7401edac3aSGal Pressman enum efa_admin_get_stats_scope {
7501edac3aSGal Pressman 	EFA_ADMIN_GET_STATS_SCOPE_ALL               = 0,
7601edac3aSGal Pressman 	EFA_ADMIN_GET_STATS_SCOPE_QUEUE             = 1,
7701edac3aSGal Pressman };
7801edac3aSGal Pressman 
7901edac3aSGal Pressman /*
8001edac3aSGal Pressman  * QP allocation sizes, converted by fabric QueuePair (QP) create command
8101edac3aSGal Pressman  * from QP capabilities.
8201edac3aSGal Pressman  */
8301edac3aSGal Pressman struct efa_admin_qp_alloc_size {
8401edac3aSGal Pressman 	/* Send descriptor ring size in bytes */
8501edac3aSGal Pressman 	u32 send_queue_ring_size;
8601edac3aSGal Pressman 
8701edac3aSGal Pressman 	/* Max number of WQEs that can be outstanding on send queue. */
8801edac3aSGal Pressman 	u32 send_queue_depth;
8901edac3aSGal Pressman 
9001edac3aSGal Pressman 	/*
9101edac3aSGal Pressman 	 * Recv descriptor ring size in bytes, sufficient for user-provided
9201edac3aSGal Pressman 	 * number of WQEs
9301edac3aSGal Pressman 	 */
9401edac3aSGal Pressman 	u32 recv_queue_ring_size;
9501edac3aSGal Pressman 
9601edac3aSGal Pressman 	/* Max number of WQEs that can be outstanding on recv queue */
9701edac3aSGal Pressman 	u32 recv_queue_depth;
9801edac3aSGal Pressman };
9901edac3aSGal Pressman 
10001edac3aSGal Pressman struct efa_admin_create_qp_cmd {
10101edac3aSGal Pressman 	/* Common Admin Queue descriptor */
10201edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
10301edac3aSGal Pressman 
10401edac3aSGal Pressman 	/* Protection Domain associated with this QP */
10501edac3aSGal Pressman 	u16 pd;
10601edac3aSGal Pressman 
10701edac3aSGal Pressman 	/* QP type */
10801edac3aSGal Pressman 	u8 qp_type;
10901edac3aSGal Pressman 
11001edac3aSGal Pressman 	/*
11101edac3aSGal Pressman 	 * 0 : sq_virt - If set, SQ ring base address is
11201edac3aSGal Pressman 	 *    virtual (IOVA returned by MR registration)
11301edac3aSGal Pressman 	 * 1 : rq_virt - If set, RQ ring base address is
11401edac3aSGal Pressman 	 *    virtual (IOVA returned by MR registration)
1152b8af500SMichael Margolin 	 * 2 : unsolicited_write_recv - If set, work requests
1162b8af500SMichael Margolin 	 *    will not be consumed for incoming RDMA write with
1172b8af500SMichael Margolin 	 *    immediate
1182b8af500SMichael Margolin 	 * 7:3 : reserved - MBZ
11901edac3aSGal Pressman 	 */
12001edac3aSGal Pressman 	u8 flags;
12101edac3aSGal Pressman 
12201edac3aSGal Pressman 	/*
12301edac3aSGal Pressman 	 * Send queue (SQ) ring base physical address. This field is not
12401edac3aSGal Pressman 	 * used if this is a Low Latency Queue(LLQ).
12501edac3aSGal Pressman 	 */
12601edac3aSGal Pressman 	u64 sq_base_addr;
12701edac3aSGal Pressman 
12801edac3aSGal Pressman 	/* Receive queue (RQ) ring base address. */
12901edac3aSGal Pressman 	u64 rq_base_addr;
13001edac3aSGal Pressman 
13101edac3aSGal Pressman 	/* Index of CQ to be associated with Send Queue completions */
13201edac3aSGal Pressman 	u32 send_cq_idx;
13301edac3aSGal Pressman 
13401edac3aSGal Pressman 	/* Index of CQ to be associated with Recv Queue completions */
13501edac3aSGal Pressman 	u32 recv_cq_idx;
13601edac3aSGal Pressman 
13701edac3aSGal Pressman 	/*
13801edac3aSGal Pressman 	 * Memory registration key for the SQ ring, used only when not in
13901edac3aSGal Pressman 	 * LLQ mode and base address is virtual
14001edac3aSGal Pressman 	 */
14101edac3aSGal Pressman 	u32 sq_l_key;
14201edac3aSGal Pressman 
14301edac3aSGal Pressman 	/*
14401edac3aSGal Pressman 	 * Memory registration key for the RQ ring, used only when base
14501edac3aSGal Pressman 	 * address is virtual
14601edac3aSGal Pressman 	 */
14701edac3aSGal Pressman 	u32 rq_l_key;
14801edac3aSGal Pressman 
14901edac3aSGal Pressman 	/* Requested QP allocation sizes */
15001edac3aSGal Pressman 	struct efa_admin_qp_alloc_size qp_alloc_size;
15101edac3aSGal Pressman 
15201edac3aSGal Pressman 	/* UAR number */
15301edac3aSGal Pressman 	u16 uar;
15401edac3aSGal Pressman 
1551e7b86f1SMichael Margolin 	/* Requested service level for the QP, 0 is the default SL */
1561e7b86f1SMichael Margolin 	u8 sl;
1571e7b86f1SMichael Margolin 
15801edac3aSGal Pressman 	/* MBZ */
1591e7b86f1SMichael Margolin 	u8 reserved;
16001edac3aSGal Pressman 
16101edac3aSGal Pressman 	/* MBZ */
16201edac3aSGal Pressman 	u32 reserved2;
16301edac3aSGal Pressman };
16401edac3aSGal Pressman 
16501edac3aSGal Pressman struct efa_admin_create_qp_resp {
16601edac3aSGal Pressman 	/* Common Admin Queue completion descriptor */
16701edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
16801edac3aSGal Pressman 
16957f63f37SGal Pressman 	/*
17057f63f37SGal Pressman 	 * Opaque handle to be used for consequent admin operations on the
17157f63f37SGal Pressman 	 * QP
17257f63f37SGal Pressman 	 */
17301edac3aSGal Pressman 	u32 qp_handle;
17401edac3aSGal Pressman 
17557f63f37SGal Pressman 	/*
176631b6189SGal Pressman 	 * QP number in the given EFA virtual device. Least-significant bits (as
177631b6189SGal Pressman 	 * needed according to max_qp) carry unique QP ID
17857f63f37SGal Pressman 	 */
17901edac3aSGal Pressman 	u16 qp_num;
18001edac3aSGal Pressman 
18101edac3aSGal Pressman 	/* MBZ */
18201edac3aSGal Pressman 	u16 reserved;
18301edac3aSGal Pressman 
18401edac3aSGal Pressman 	/* Index of sub-CQ for Send Queue completions */
18501edac3aSGal Pressman 	u16 send_sub_cq_idx;
18601edac3aSGal Pressman 
18701edac3aSGal Pressman 	/* Index of sub-CQ for Receive Queue completions */
18801edac3aSGal Pressman 	u16 recv_sub_cq_idx;
18901edac3aSGal Pressman 
19001edac3aSGal Pressman 	/* SQ doorbell address, as offset to PCIe DB BAR */
19101edac3aSGal Pressman 	u32 sq_db_offset;
19201edac3aSGal Pressman 
19301edac3aSGal Pressman 	/* RQ doorbell address, as offset to PCIe DB BAR */
19401edac3aSGal Pressman 	u32 rq_db_offset;
19501edac3aSGal Pressman 
19601edac3aSGal Pressman 	/*
19701edac3aSGal Pressman 	 * low latency send queue ring base address as an offset to PCIe
19801edac3aSGal Pressman 	 * MMIO LLQ_MEM BAR
19901edac3aSGal Pressman 	 */
20001edac3aSGal Pressman 	u32 llq_descriptors_offset;
20101edac3aSGal Pressman };
20201edac3aSGal Pressman 
20301edac3aSGal Pressman struct efa_admin_modify_qp_cmd {
20401edac3aSGal Pressman 	/* Common Admin Queue descriptor */
20501edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
20601edac3aSGal Pressman 
20701edac3aSGal Pressman 	/*
208ab67baddSGal Pressman 	 * Mask indicating which fields should be updated
209ab67baddSGal Pressman 	 * 0 : qp_state
210ab67baddSGal Pressman 	 * 1 : cur_qp_state
211ab67baddSGal Pressman 	 * 2 : qkey
212ab67baddSGal Pressman 	 * 3 : sq_psn
213ab67baddSGal Pressman 	 * 4 : sq_drained_async_notify
214a4e6a1ddSGal Pressman 	 * 5 : rnr_retry
215a4e6a1ddSGal Pressman 	 * 31:6 : reserved
21601edac3aSGal Pressman 	 */
21701edac3aSGal Pressman 	u32 modify_mask;
21801edac3aSGal Pressman 
21901edac3aSGal Pressman 	/* QP handle returned by create_qp command */
22001edac3aSGal Pressman 	u32 qp_handle;
22101edac3aSGal Pressman 
22201edac3aSGal Pressman 	/* QP state */
22301edac3aSGal Pressman 	u32 qp_state;
22401edac3aSGal Pressman 
22501edac3aSGal Pressman 	/* Override current QP state (before applying the transition) */
22601edac3aSGal Pressman 	u32 cur_qp_state;
22701edac3aSGal Pressman 
22801edac3aSGal Pressman 	/* QKey */
22901edac3aSGal Pressman 	u32 qkey;
23001edac3aSGal Pressman 
23101edac3aSGal Pressman 	/* SQ PSN */
23201edac3aSGal Pressman 	u32 sq_psn;
23301edac3aSGal Pressman 
23401edac3aSGal Pressman 	/* Enable async notification when SQ is drained */
23501edac3aSGal Pressman 	u8 sq_drained_async_notify;
23601edac3aSGal Pressman 
237a4e6a1ddSGal Pressman 	/* Number of RNR retries (valid only for SRD QPs) */
238a4e6a1ddSGal Pressman 	u8 rnr_retry;
23901edac3aSGal Pressman 
24001edac3aSGal Pressman 	/* MBZ */
24101edac3aSGal Pressman 	u16 reserved2;
24201edac3aSGal Pressman };
24301edac3aSGal Pressman 
24401edac3aSGal Pressman struct efa_admin_modify_qp_resp {
24501edac3aSGal Pressman 	/* Common Admin Queue completion descriptor */
24601edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
24701edac3aSGal Pressman };
24801edac3aSGal Pressman 
24901edac3aSGal Pressman struct efa_admin_query_qp_cmd {
25001edac3aSGal Pressman 	/* Common Admin Queue descriptor */
25101edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
25201edac3aSGal Pressman 
25301edac3aSGal Pressman 	/* QP handle returned by create_qp command */
25401edac3aSGal Pressman 	u32 qp_handle;
25501edac3aSGal Pressman };
25601edac3aSGal Pressman 
25701edac3aSGal Pressman struct efa_admin_query_qp_resp {
25801edac3aSGal Pressman 	/* Common Admin Queue completion descriptor */
25901edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
26001edac3aSGal Pressman 
26101edac3aSGal Pressman 	/* QP state */
26201edac3aSGal Pressman 	u32 qp_state;
26301edac3aSGal Pressman 
26401edac3aSGal Pressman 	/* QKey */
26501edac3aSGal Pressman 	u32 qkey;
26601edac3aSGal Pressman 
26701edac3aSGal Pressman 	/* SQ PSN */
26801edac3aSGal Pressman 	u32 sq_psn;
26901edac3aSGal Pressman 
27001edac3aSGal Pressman 	/* Indicates that draining is in progress */
27101edac3aSGal Pressman 	u8 sq_draining;
27201edac3aSGal Pressman 
273a4e6a1ddSGal Pressman 	/* Number of RNR retries (valid only for SRD QPs) */
274a4e6a1ddSGal Pressman 	u8 rnr_retry;
27501edac3aSGal Pressman 
27601edac3aSGal Pressman 	/* MBZ */
27701edac3aSGal Pressman 	u16 reserved2;
27801edac3aSGal Pressman };
27901edac3aSGal Pressman 
28001edac3aSGal Pressman struct efa_admin_destroy_qp_cmd {
28101edac3aSGal Pressman 	/* Common Admin Queue descriptor */
28201edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
28301edac3aSGal Pressman 
28401edac3aSGal Pressman 	/* QP handle returned by create_qp command */
28501edac3aSGal Pressman 	u32 qp_handle;
28601edac3aSGal Pressman };
28701edac3aSGal Pressman 
28801edac3aSGal Pressman struct efa_admin_destroy_qp_resp {
28901edac3aSGal Pressman 	/* Common Admin Queue completion descriptor */
29001edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
29101edac3aSGal Pressman };
29201edac3aSGal Pressman 
29301edac3aSGal Pressman /*
29401edac3aSGal Pressman  * Create Address Handle command parameters. Must not be called more than
29501edac3aSGal Pressman  * once for the same destination
29601edac3aSGal Pressman  */
29701edac3aSGal Pressman struct efa_admin_create_ah_cmd {
29801edac3aSGal Pressman 	/* Common Admin Queue descriptor */
29901edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
30001edac3aSGal Pressman 
30101edac3aSGal Pressman 	/* Destination address in network byte order */
30201edac3aSGal Pressman 	u8 dest_addr[16];
30301edac3aSGal Pressman 
30401edac3aSGal Pressman 	/* PD number */
30501edac3aSGal Pressman 	u16 pd;
30601edac3aSGal Pressman 
30757f63f37SGal Pressman 	/* MBZ */
30801edac3aSGal Pressman 	u16 reserved;
30901edac3aSGal Pressman };
31001edac3aSGal Pressman 
31101edac3aSGal Pressman struct efa_admin_create_ah_resp {
31201edac3aSGal Pressman 	/* Common Admin Queue completion descriptor */
31301edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
31401edac3aSGal Pressman 
31501edac3aSGal Pressman 	/* Target interface address handle (opaque) */
31601edac3aSGal Pressman 	u16 ah;
31701edac3aSGal Pressman 
31857f63f37SGal Pressman 	/* MBZ */
31901edac3aSGal Pressman 	u16 reserved;
32001edac3aSGal Pressman };
32101edac3aSGal Pressman 
32201edac3aSGal Pressman struct efa_admin_destroy_ah_cmd {
32301edac3aSGal Pressman 	/* Common Admin Queue descriptor */
32401edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
32501edac3aSGal Pressman 
32601edac3aSGal Pressman 	/* Target interface address handle (opaque) */
32701edac3aSGal Pressman 	u16 ah;
32801edac3aSGal Pressman 
32901edac3aSGal Pressman 	/* PD number */
33001edac3aSGal Pressman 	u16 pd;
33101edac3aSGal Pressman };
33201edac3aSGal Pressman 
33301edac3aSGal Pressman struct efa_admin_destroy_ah_resp {
33401edac3aSGal Pressman 	/* Common Admin Queue completion descriptor */
33501edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
33601edac3aSGal Pressman };
33701edac3aSGal Pressman 
33801edac3aSGal Pressman /*
33901edac3aSGal Pressman  * Registration of MemoryRegion, required for QP working with Virtual
34001edac3aSGal Pressman  * Addresses. In standard verbs semantics, region length is limited to 2GB
34101edac3aSGal Pressman  * space, but EFA offers larger MR support for large memory space, to ease
34201edac3aSGal Pressman  * on users working with very large datasets (i.e. full GPU memory mapping).
34301edac3aSGal Pressman  */
34401edac3aSGal Pressman struct efa_admin_reg_mr_cmd {
34501edac3aSGal Pressman 	/* Common Admin Queue descriptor */
34601edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
34701edac3aSGal Pressman 
34801edac3aSGal Pressman 	/* Protection Domain */
34901edac3aSGal Pressman 	u16 pd;
35001edac3aSGal Pressman 
35101edac3aSGal Pressman 	/* MBZ */
35201edac3aSGal Pressman 	u16 reserved16_w1;
35301edac3aSGal Pressman 
35401edac3aSGal Pressman 	/* Physical Buffer List, each element is page-aligned. */
35501edac3aSGal Pressman 	union {
35601edac3aSGal Pressman 		/*
35701edac3aSGal Pressman 		 * Inline array of guest-physical page addresses of user
35801edac3aSGal Pressman 		 * memory pages (optimization for short region
35901edac3aSGal Pressman 		 * registrations)
36001edac3aSGal Pressman 		 */
36101edac3aSGal Pressman 		u64 inline_pbl_array[4];
36201edac3aSGal Pressman 
36301edac3aSGal Pressman 		/* points to PBL (direct or indirect, chained if needed) */
36401edac3aSGal Pressman 		struct efa_admin_ctrl_buff_info pbl;
36501edac3aSGal Pressman 	} pbl;
36601edac3aSGal Pressman 
36701edac3aSGal Pressman 	/* Memory region length, in bytes. */
36801edac3aSGal Pressman 	u64 mr_length;
36901edac3aSGal Pressman 
37001edac3aSGal Pressman 	/*
37101edac3aSGal Pressman 	 * flags and page size
37201edac3aSGal Pressman 	 * 4:0 : phys_page_size_shift - page size is (1 <<
37301edac3aSGal Pressman 	 *    phys_page_size_shift). Page size is used for
37401edac3aSGal Pressman 	 *    building the Virtual to Physical address mapping
37501edac3aSGal Pressman 	 * 6:5 : reserved - MBZ
37601edac3aSGal Pressman 	 * 7 : mem_addr_phy_mode_en - Enable bit for physical
37701edac3aSGal Pressman 	 *    memory registration (no translation), can be used
37801edac3aSGal Pressman 	 *    only by privileged clients. If set, PBL must
37901edac3aSGal Pressman 	 *    contain a single entry.
38001edac3aSGal Pressman 	 */
38101edac3aSGal Pressman 	u8 flags;
38201edac3aSGal Pressman 
38301edac3aSGal Pressman 	/*
38401edac3aSGal Pressman 	 * permissions
385e6c4f3ffSDaniel Kranzdorf 	 * 0 : local_write_enable - Local write permissions:
386e6c4f3ffSDaniel Kranzdorf 	 *    must be set for RQ buffers and buffers posted for
387e6c4f3ffSDaniel Kranzdorf 	 *    RDMA Read requests
388531094dcSYonatan Nachum 	 * 1 : remote_write_enable - Remote write
389531094dcSYonatan Nachum 	 *    permissions: must be set to enable RDMA write to
390531094dcSYonatan Nachum 	 *    the region
391e6c4f3ffSDaniel Kranzdorf 	 * 2 : remote_read_enable - Remote read permissions:
392e6c4f3ffSDaniel Kranzdorf 	 *    must be set to enable RDMA read from the region
393e6c4f3ffSDaniel Kranzdorf 	 * 7:3 : reserved2 - MBZ
39401edac3aSGal Pressman 	 */
39501edac3aSGal Pressman 	u8 permissions;
39601edac3aSGal Pressman 
39757f63f37SGal Pressman 	/* MBZ */
39801edac3aSGal Pressman 	u16 reserved16_w5;
39901edac3aSGal Pressman 
40001edac3aSGal Pressman 	/* number of pages in PBL (redundant, could be calculated) */
40101edac3aSGal Pressman 	u32 page_num;
40201edac3aSGal Pressman 
40301edac3aSGal Pressman 	/*
40401edac3aSGal Pressman 	 * IO Virtual Address associated with this MR. If
40501edac3aSGal Pressman 	 * mem_addr_phy_mode_en is set, contains the physical address of
40601edac3aSGal Pressman 	 * the region.
40701edac3aSGal Pressman 	 */
40801edac3aSGal Pressman 	u64 iova;
40901edac3aSGal Pressman };
41001edac3aSGal Pressman 
41101edac3aSGal Pressman struct efa_admin_reg_mr_resp {
41201edac3aSGal Pressman 	/* Common Admin Queue completion descriptor */
41301edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
41401edac3aSGal Pressman 
41501edac3aSGal Pressman 	/*
41601edac3aSGal Pressman 	 * L_Key, to be used in conjunction with local buffer references in
41701edac3aSGal Pressman 	 * SQ and RQ WQE, or with virtual RQ/CQ rings
41801edac3aSGal Pressman 	 */
41901edac3aSGal Pressman 	u32 l_key;
42001edac3aSGal Pressman 
42101edac3aSGal Pressman 	/*
42201edac3aSGal Pressman 	 * R_Key, to be used in RDMA messages to refer to remotely accessed
42301edac3aSGal Pressman 	 * memory region
42401edac3aSGal Pressman 	 */
42501edac3aSGal Pressman 	u32 r_key;
4262307157cSMichael Margolin 
4272307157cSMichael Margolin 	/*
4282307157cSMichael Margolin 	 * Mask indicating which fields have valid values
4292307157cSMichael Margolin 	 * 0 : recv_ic_id
4302307157cSMichael Margolin 	 * 1 : rdma_read_ic_id
4312307157cSMichael Margolin 	 * 2 : rdma_recv_ic_id
4322307157cSMichael Margolin 	 */
4332307157cSMichael Margolin 	u8 validity;
4342307157cSMichael Margolin 
4352307157cSMichael Margolin 	/*
4362307157cSMichael Margolin 	 * Physical interconnect used by the device to reach the MR for receive
4372307157cSMichael Margolin 	 * operation
4382307157cSMichael Margolin 	 */
4392307157cSMichael Margolin 	u8 recv_ic_id;
4402307157cSMichael Margolin 
4412307157cSMichael Margolin 	/*
4422307157cSMichael Margolin 	 * Physical interconnect used by the device to reach the MR for RDMA
4432307157cSMichael Margolin 	 * read operation
4442307157cSMichael Margolin 	 */
4452307157cSMichael Margolin 	u8 rdma_read_ic_id;
4462307157cSMichael Margolin 
4472307157cSMichael Margolin 	/*
4482307157cSMichael Margolin 	 * Physical interconnect used by the device to reach the MR for RDMA
4492307157cSMichael Margolin 	 * write receive
4502307157cSMichael Margolin 	 */
4512307157cSMichael Margolin 	u8 rdma_recv_ic_id;
45201edac3aSGal Pressman };
45301edac3aSGal Pressman 
45401edac3aSGal Pressman struct efa_admin_dereg_mr_cmd {
45501edac3aSGal Pressman 	/* Common Admin Queue descriptor */
45601edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
45701edac3aSGal Pressman 
45801edac3aSGal Pressman 	/* L_Key, memory region's l_key */
45901edac3aSGal Pressman 	u32 l_key;
46001edac3aSGal Pressman };
46101edac3aSGal Pressman 
46201edac3aSGal Pressman struct efa_admin_dereg_mr_resp {
46301edac3aSGal Pressman 	/* Common Admin Queue completion descriptor */
46401edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
46501edac3aSGal Pressman };
46601edac3aSGal Pressman 
4671e7b86f1SMichael Margolin /*
4681e7b86f1SMichael Margolin  * Allocation of MemoryRegion, required for QP working with Virtual
4691e7b86f1SMichael Margolin  * Addresses in kernel verbs semantics, ready for fast registration use.
4701e7b86f1SMichael Margolin  */
4711e7b86f1SMichael Margolin struct efa_admin_alloc_mr_cmd {
4721e7b86f1SMichael Margolin 	/* Common Admin Queue descriptor */
4731e7b86f1SMichael Margolin 	struct efa_admin_aq_common_desc aq_common_desc;
4741e7b86f1SMichael Margolin 
4751e7b86f1SMichael Margolin 	/* Protection Domain */
4761e7b86f1SMichael Margolin 	u16 pd;
4771e7b86f1SMichael Margolin 
4781e7b86f1SMichael Margolin 	/* MBZ */
4791e7b86f1SMichael Margolin 	u16 reserved1;
4801e7b86f1SMichael Margolin 
4811e7b86f1SMichael Margolin 	/* Maximum number of pages this MR supports. */
4821e7b86f1SMichael Margolin 	u32 max_pages;
4831e7b86f1SMichael Margolin };
4841e7b86f1SMichael Margolin 
4851e7b86f1SMichael Margolin struct efa_admin_alloc_mr_resp {
4861e7b86f1SMichael Margolin 	/* Common Admin Queue completion descriptor */
4871e7b86f1SMichael Margolin 	struct efa_admin_acq_common_desc acq_common_desc;
4881e7b86f1SMichael Margolin 
4891e7b86f1SMichael Margolin 	/*
4901e7b86f1SMichael Margolin 	 * L_Key, to be used in conjunction with local buffer references in
4911e7b86f1SMichael Margolin 	 * SQ and RQ WQE, or with virtual RQ/CQ rings
4921e7b86f1SMichael Margolin 	 */
4931e7b86f1SMichael Margolin 	u32 l_key;
4941e7b86f1SMichael Margolin 
4951e7b86f1SMichael Margolin 	/*
4961e7b86f1SMichael Margolin 	 * R_Key, to be used in RDMA messages to refer to remotely accessed
4971e7b86f1SMichael Margolin 	 * memory region
4981e7b86f1SMichael Margolin 	 */
4991e7b86f1SMichael Margolin 	u32 r_key;
5001e7b86f1SMichael Margolin };
5011e7b86f1SMichael Margolin 
50201edac3aSGal Pressman struct efa_admin_create_cq_cmd {
50301edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
50401edac3aSGal Pressman 
50501edac3aSGal Pressman 	/*
50657f63f37SGal Pressman 	 * 4:0 : reserved5 - MBZ
50701edac3aSGal Pressman 	 * 5 : interrupt_mode_enabled - if set, cq operates
5082a152512SGal Pressman 	 *    in interrupt mode (i.e. CQ events and EQ elements
5092a152512SGal Pressman 	 *    are generated), otherwise - polling
51001edac3aSGal Pressman 	 * 6 : virt - If set, ring base address is virtual
51101edac3aSGal Pressman 	 *    (IOVA returned by MR registration)
51257f63f37SGal Pressman 	 * 7 : reserved6 - MBZ
51301edac3aSGal Pressman 	 */
51401edac3aSGal Pressman 	u8 cq_caps_1;
51501edac3aSGal Pressman 
51601edac3aSGal Pressman 	/*
51701edac3aSGal Pressman 	 * 4:0 : cq_entry_size_words - size of CQ entry in
51801edac3aSGal Pressman 	 *    32-bit words, valid values: 4, 8.
519dc13fbf7SMichael Margolin 	 * 5 : set_src_addr - If set, source address will be
520dc13fbf7SMichael Margolin 	 *    filled on RX completions from unknown senders.
521dc13fbf7SMichael Margolin 	 *    Requires 8 words CQ entry size.
522dc13fbf7SMichael Margolin 	 * 7:6 : reserved7 - MBZ
52301edac3aSGal Pressman 	 */
52401edac3aSGal Pressman 	u8 cq_caps_2;
52501edac3aSGal Pressman 
5261e7b86f1SMichael Margolin 	/* Sub completion queue depth in # of entries. must be power of 2 */
5271e7b86f1SMichael Margolin 	u16 sub_cq_depth;
52801edac3aSGal Pressman 
5292a152512SGal Pressman 	/* EQ number assigned to this cq */
5302a152512SGal Pressman 	u16 eqn;
5312a152512SGal Pressman 
5322a152512SGal Pressman 	/* MBZ */
5332a152512SGal Pressman 	u16 reserved;
53401edac3aSGal Pressman 
53501edac3aSGal Pressman 	/*
53601edac3aSGal Pressman 	 * CQ ring base address, virtual or physical depending on 'virt'
53701edac3aSGal Pressman 	 * flag
53801edac3aSGal Pressman 	 */
53901edac3aSGal Pressman 	struct efa_common_mem_addr cq_ba;
54001edac3aSGal Pressman 
54101edac3aSGal Pressman 	/*
54201edac3aSGal Pressman 	 * Memory registration key for the ring, used only when base
54301edac3aSGal Pressman 	 * address is virtual
54401edac3aSGal Pressman 	 */
54501edac3aSGal Pressman 	u32 l_key;
54601edac3aSGal Pressman 
54701edac3aSGal Pressman 	/*
54801edac3aSGal Pressman 	 * number of sub cqs - must be equal to sub_cqs_per_cq of queue
54901edac3aSGal Pressman 	 * attributes.
55001edac3aSGal Pressman 	 */
55101edac3aSGal Pressman 	u16 num_sub_cqs;
55201edac3aSGal Pressman 
55301edac3aSGal Pressman 	/* UAR number */
55401edac3aSGal Pressman 	u16 uar;
55501edac3aSGal Pressman };
55601edac3aSGal Pressman 
55701edac3aSGal Pressman struct efa_admin_create_cq_resp {
55801edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
55901edac3aSGal Pressman 
56001edac3aSGal Pressman 	u16 cq_idx;
56101edac3aSGal Pressman 
5621e7b86f1SMichael Margolin 	/* actual sub cq depth in number of entries */
5631e7b86f1SMichael Margolin 	u16 sub_cq_actual_depth;
5642a152512SGal Pressman 
5652a152512SGal Pressman 	/* CQ doorbell address, as offset to PCIe DB BAR */
5662a152512SGal Pressman 	u32 db_offset;
5672a152512SGal Pressman 
5682a152512SGal Pressman 	/*
5692a152512SGal Pressman 	 * 0 : db_valid - If set, doorbell offset is valid.
5702a152512SGal Pressman 	 *    Always set when interrupts are requested.
5712a152512SGal Pressman 	 */
5722a152512SGal Pressman 	u32 flags;
57301edac3aSGal Pressman };
57401edac3aSGal Pressman 
57501edac3aSGal Pressman struct efa_admin_destroy_cq_cmd {
57601edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_desc;
57701edac3aSGal Pressman 
57801edac3aSGal Pressman 	u16 cq_idx;
57901edac3aSGal Pressman 
58057f63f37SGal Pressman 	/* MBZ */
58101edac3aSGal Pressman 	u16 reserved1;
58201edac3aSGal Pressman };
58301edac3aSGal Pressman 
58401edac3aSGal Pressman struct efa_admin_destroy_cq_resp {
58501edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
58601edac3aSGal Pressman };
58701edac3aSGal Pressman 
58801edac3aSGal Pressman /*
58901edac3aSGal Pressman  * EFA AQ Get Statistics command. Extended statistics are placed in control
59001edac3aSGal Pressman  * buffer pointed by AQ entry
59101edac3aSGal Pressman  */
59201edac3aSGal Pressman struct efa_admin_aq_get_stats_cmd {
59301edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
59401edac3aSGal Pressman 
59501edac3aSGal Pressman 	union {
59601edac3aSGal Pressman 		/* command specific inline data */
59701edac3aSGal Pressman 		u32 inline_data_w1[3];
59801edac3aSGal Pressman 
59901edac3aSGal Pressman 		struct efa_admin_ctrl_buff_info control_buffer;
60001edac3aSGal Pressman 	} u;
60101edac3aSGal Pressman 
60201edac3aSGal Pressman 	/* stats type as defined in enum efa_admin_get_stats_type */
60301edac3aSGal Pressman 	u8 type;
60401edac3aSGal Pressman 
60501edac3aSGal Pressman 	/* stats scope defined in enum efa_admin_get_stats_scope */
60601edac3aSGal Pressman 	u8 scope;
60701edac3aSGal Pressman 
60801edac3aSGal Pressman 	u16 scope_modifier;
60901edac3aSGal Pressman };
61001edac3aSGal Pressman 
61101edac3aSGal Pressman struct efa_admin_basic_stats {
61201edac3aSGal Pressman 	u64 tx_bytes;
61301edac3aSGal Pressman 
61401edac3aSGal Pressman 	u64 tx_pkts;
61501edac3aSGal Pressman 
61601edac3aSGal Pressman 	u64 rx_bytes;
61701edac3aSGal Pressman 
61801edac3aSGal Pressman 	u64 rx_pkts;
61901edac3aSGal Pressman 
62001edac3aSGal Pressman 	u64 rx_drops;
6211e7b86f1SMichael Margolin 
6221e7b86f1SMichael Margolin 	u64 qkey_viol;
62301edac3aSGal Pressman };
62401edac3aSGal Pressman 
625b0cff387SDaniel Kranzdorf struct efa_admin_messages_stats {
626b0cff387SDaniel Kranzdorf 	u64 send_bytes;
627b0cff387SDaniel Kranzdorf 
628b0cff387SDaniel Kranzdorf 	u64 send_wrs;
629b0cff387SDaniel Kranzdorf 
630b0cff387SDaniel Kranzdorf 	u64 recv_bytes;
631b0cff387SDaniel Kranzdorf 
632b0cff387SDaniel Kranzdorf 	u64 recv_wrs;
633b0cff387SDaniel Kranzdorf };
634b0cff387SDaniel Kranzdorf 
635b0cff387SDaniel Kranzdorf struct efa_admin_rdma_read_stats {
636b0cff387SDaniel Kranzdorf 	u64 read_wrs;
637b0cff387SDaniel Kranzdorf 
638b0cff387SDaniel Kranzdorf 	u64 read_bytes;
639b0cff387SDaniel Kranzdorf 
640b0cff387SDaniel Kranzdorf 	u64 read_wr_err;
641b0cff387SDaniel Kranzdorf 
642b0cff387SDaniel Kranzdorf 	u64 read_resp_bytes;
643b0cff387SDaniel Kranzdorf };
644b0cff387SDaniel Kranzdorf 
645113383efSMichael Margolin struct efa_admin_rdma_write_stats {
646113383efSMichael Margolin 	u64 write_wrs;
647113383efSMichael Margolin 
648113383efSMichael Margolin 	u64 write_bytes;
649113383efSMichael Margolin 
650113383efSMichael Margolin 	u64 write_wr_err;
651113383efSMichael Margolin 
652113383efSMichael Margolin 	u64 write_recv_bytes;
653113383efSMichael Margolin };
654113383efSMichael Margolin 
655*475ac071SBasel Nassar struct efa_admin_network_stats {
656*475ac071SBasel Nassar 	u64 retrans_bytes;
657*475ac071SBasel Nassar 
658*475ac071SBasel Nassar 	u64 retrans_pkts;
659*475ac071SBasel Nassar 
660*475ac071SBasel Nassar 	u64 retrans_timeout_events;
661*475ac071SBasel Nassar 
662*475ac071SBasel Nassar 	u64 unresponsive_remote_events;
663*475ac071SBasel Nassar 
664*475ac071SBasel Nassar 	u64 impaired_remote_conn_events;
665*475ac071SBasel Nassar };
666*475ac071SBasel Nassar 
66701edac3aSGal Pressman struct efa_admin_acq_get_stats_resp {
66801edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
66901edac3aSGal Pressman 
670b0cff387SDaniel Kranzdorf 	union {
67101edac3aSGal Pressman 		struct efa_admin_basic_stats basic_stats;
672b0cff387SDaniel Kranzdorf 
673b0cff387SDaniel Kranzdorf 		struct efa_admin_messages_stats messages_stats;
674b0cff387SDaniel Kranzdorf 
675b0cff387SDaniel Kranzdorf 		struct efa_admin_rdma_read_stats rdma_read_stats;
676113383efSMichael Margolin 
677113383efSMichael Margolin 		struct efa_admin_rdma_write_stats rdma_write_stats;
678*475ac071SBasel Nassar 
679*475ac071SBasel Nassar 		struct efa_admin_network_stats network_stats;
680b0cff387SDaniel Kranzdorf 	} u;
68101edac3aSGal Pressman };
68201edac3aSGal Pressman 
68301edac3aSGal Pressman struct efa_admin_get_set_feature_common_desc {
6849bf61b8cSGal Pressman 	/* MBZ */
6859bf61b8cSGal Pressman 	u8 reserved0;
68601edac3aSGal Pressman 
68701edac3aSGal Pressman 	/* as appears in efa_admin_aq_feature_id */
68801edac3aSGal Pressman 	u8 feature_id;
68901edac3aSGal Pressman 
69001edac3aSGal Pressman 	/* MBZ */
69101edac3aSGal Pressman 	u16 reserved16;
69201edac3aSGal Pressman };
69301edac3aSGal Pressman 
69401edac3aSGal Pressman struct efa_admin_feature_device_attr_desc {
69501edac3aSGal Pressman 	/* Bitmap of efa_admin_aq_feature_id */
69601edac3aSGal Pressman 	u64 supported_features;
69701edac3aSGal Pressman 
69801edac3aSGal Pressman 	/* Bitmap of supported page sizes in MR registrations */
69901edac3aSGal Pressman 	u64 page_size_cap;
70001edac3aSGal Pressman 
70101edac3aSGal Pressman 	u32 fw_version;
70201edac3aSGal Pressman 
70301edac3aSGal Pressman 	u32 admin_api_version;
70401edac3aSGal Pressman 
70501edac3aSGal Pressman 	u32 device_version;
70601edac3aSGal Pressman 
70701edac3aSGal Pressman 	/* Bar used for SQ and RQ doorbells */
70801edac3aSGal Pressman 	u16 db_bar;
70901edac3aSGal Pressman 
71057f63f37SGal Pressman 	/* Indicates how many bits are used on physical address access */
71101edac3aSGal Pressman 	u8 phys_addr_width;
71201edac3aSGal Pressman 
71357f63f37SGal Pressman 	/* Indicates how many bits are used on virtual address access */
71401edac3aSGal Pressman 	u8 virt_addr_width;
715666e8ff5SDaniel Kranzdorf 
716666e8ff5SDaniel Kranzdorf 	/*
717666e8ff5SDaniel Kranzdorf 	 * 0 : rdma_read - If set, RDMA Read is supported on
718666e8ff5SDaniel Kranzdorf 	 *    TX queues
719a4e6a1ddSGal Pressman 	 * 1 : rnr_retry - If set, RNR retry is supported on
720a4e6a1ddSGal Pressman 	 *    modify QP command
7216dddd939SYonatan Nachum 	 * 2 : data_polling_128 - If set, 128 bytes data
7226dddd939SYonatan Nachum 	 *    polling is supported
723531094dcSYonatan Nachum 	 * 3 : rdma_write - If set, RDMA Write is supported
724531094dcSYonatan Nachum 	 *    on TX queues
7252b8af500SMichael Margolin 	 * 4 : unsolicited_write_recv - If set, unsolicited
7262b8af500SMichael Margolin 	 *    write with imm. receive is supported
7272b8af500SMichael Margolin 	 * 31:5 : reserved - MBZ
728666e8ff5SDaniel Kranzdorf 	 */
729666e8ff5SDaniel Kranzdorf 	u32 device_caps;
730666e8ff5SDaniel Kranzdorf 
731666e8ff5SDaniel Kranzdorf 	/* Max RDMA transfer size in bytes */
732666e8ff5SDaniel Kranzdorf 	u32 max_rdma_size;
73304e36fd2SYehuda Yitschak 
73404e36fd2SYehuda Yitschak 	/* Unique global ID for an EFA device */
73504e36fd2SYehuda Yitschak 	u64 guid;
7361103579dSMichael Margolin 
7371103579dSMichael Margolin 	/* The device maximum link speed in Gbit/sec */
7381103579dSMichael Margolin 	u16 max_link_speed_gbps;
7391103579dSMichael Margolin 
7401103579dSMichael Margolin 	/* MBZ */
7411103579dSMichael Margolin 	u16 reserved0;
7421103579dSMichael Margolin 
7431103579dSMichael Margolin 	/* MBZ */
7441103579dSMichael Margolin 	u32 reserved1;
74501edac3aSGal Pressman };
74601edac3aSGal Pressman 
74701edac3aSGal Pressman struct efa_admin_feature_queue_attr_desc {
74801edac3aSGal Pressman 	/* The maximum number of queue pairs supported */
74901edac3aSGal Pressman 	u32 max_qp;
75001edac3aSGal Pressman 
75157f63f37SGal Pressman 	/* Maximum number of WQEs per Send Queue */
75201edac3aSGal Pressman 	u32 max_sq_depth;
75301edac3aSGal Pressman 
75457f63f37SGal Pressman 	/* Maximum size of data that can be sent inline in a Send WQE */
75501edac3aSGal Pressman 	u32 inline_buf_size;
75601edac3aSGal Pressman 
75757f63f37SGal Pressman 	/* Maximum number of buffer descriptors per Recv Queue */
75801edac3aSGal Pressman 	u32 max_rq_depth;
75901edac3aSGal Pressman 
76001edac3aSGal Pressman 	/* The maximum number of completion queues supported per VF */
76101edac3aSGal Pressman 	u32 max_cq;
76201edac3aSGal Pressman 
76357f63f37SGal Pressman 	/* Maximum number of CQEs per Completion Queue */
76401edac3aSGal Pressman 	u32 max_cq_depth;
76501edac3aSGal Pressman 
76601edac3aSGal Pressman 	/* Number of sub-CQs to be created for each CQ */
76701edac3aSGal Pressman 	u16 sub_cqs_per_cq;
76801edac3aSGal Pressman 
769da2924bdSGal Pressman 	/* Minimum number of WQEs per SQ */
770da2924bdSGal Pressman 	u16 min_sq_depth;
77101edac3aSGal Pressman 
77257f63f37SGal Pressman 	/* Maximum number of SGEs (buffers) allowed for a single send WQE */
77301edac3aSGal Pressman 	u16 max_wr_send_sges;
77401edac3aSGal Pressman 
77501edac3aSGal Pressman 	/* Maximum number of SGEs allowed for a single recv WQE */
77601edac3aSGal Pressman 	u16 max_wr_recv_sges;
77701edac3aSGal Pressman 
77801edac3aSGal Pressman 	/* The maximum number of memory regions supported */
77901edac3aSGal Pressman 	u32 max_mr;
78001edac3aSGal Pressman 
78101edac3aSGal Pressman 	/* The maximum number of pages can be registered */
78201edac3aSGal Pressman 	u32 max_mr_pages;
78301edac3aSGal Pressman 
78401edac3aSGal Pressman 	/* The maximum number of protection domains supported */
78501edac3aSGal Pressman 	u32 max_pd;
78601edac3aSGal Pressman 
78701edac3aSGal Pressman 	/* The maximum number of address handles supported */
78801edac3aSGal Pressman 	u32 max_ah;
78901edac3aSGal Pressman 
79001edac3aSGal Pressman 	/* The maximum size of LLQ in bytes */
79101edac3aSGal Pressman 	u32 max_llq_size;
792666e8ff5SDaniel Kranzdorf 
793531094dcSYonatan Nachum 	/* Maximum number of SGEs for a single RDMA read/write WQE */
794666e8ff5SDaniel Kranzdorf 	u16 max_wr_rdma_sges;
795556c811fSGal Pressman 
796556c811fSGal Pressman 	/*
797556c811fSGal Pressman 	 * Maximum number of bytes that can be written to SQ between two
798556c811fSGal Pressman 	 * consecutive doorbells (in units of 64B). Driver must ensure that only
799556c811fSGal Pressman 	 * complete WQEs are written to queue before issuing a doorbell.
800556c811fSGal Pressman 	 * Examples: max_tx_batch=16 and WQE size = 64B, means up to 16 WQEs can
801556c811fSGal Pressman 	 * be written to SQ between two consecutive doorbells. max_tx_batch=11
802556c811fSGal Pressman 	 * and WQE size = 128B, means up to 5 WQEs can be written to SQ between
803556c811fSGal Pressman 	 * two consecutive doorbells. Zero means unlimited.
804556c811fSGal Pressman 	 */
805556c811fSGal Pressman 	u16 max_tx_batch;
80601edac3aSGal Pressman };
80701edac3aSGal Pressman 
8082a152512SGal Pressman struct efa_admin_event_queue_attr_desc {
8092a152512SGal Pressman 	/* The maximum number of event queues supported */
8102a152512SGal Pressman 	u32 max_eq;
8112a152512SGal Pressman 
8122a152512SGal Pressman 	/* Maximum number of EQEs per Event Queue */
8132a152512SGal Pressman 	u32 max_eq_depth;
8142a152512SGal Pressman 
8152a152512SGal Pressman 	/* Supported events bitmask */
8162a152512SGal Pressman 	u32 event_bitmask;
8172a152512SGal Pressman };
8182a152512SGal Pressman 
81901edac3aSGal Pressman struct efa_admin_feature_aenq_desc {
82001edac3aSGal Pressman 	/* bitmask for AENQ groups the device can report */
82101edac3aSGal Pressman 	u32 supported_groups;
82201edac3aSGal Pressman 
82301edac3aSGal Pressman 	/* bitmask for AENQ groups to report */
82401edac3aSGal Pressman 	u32 enabled_groups;
82501edac3aSGal Pressman };
82601edac3aSGal Pressman 
82701edac3aSGal Pressman struct efa_admin_feature_network_attr_desc {
82801edac3aSGal Pressman 	/* Raw address data in network byte order */
82901edac3aSGal Pressman 	u8 addr[16];
83001edac3aSGal Pressman 
831666e8ff5SDaniel Kranzdorf 	/* max packet payload size in bytes */
83201edac3aSGal Pressman 	u32 mtu;
83301edac3aSGal Pressman };
83401edac3aSGal Pressman 
83501edac3aSGal Pressman /*
83601edac3aSGal Pressman  * When hint value is 0, hints capabilities are not supported or driver
83701edac3aSGal Pressman  * should use its own predefined value
83801edac3aSGal Pressman  */
83901edac3aSGal Pressman struct efa_admin_hw_hints {
84001edac3aSGal Pressman 	/* value in ms */
84101edac3aSGal Pressman 	u16 mmio_read_timeout;
84201edac3aSGal Pressman 
84301edac3aSGal Pressman 	/* value in ms */
84401edac3aSGal Pressman 	u16 driver_watchdog_timeout;
84501edac3aSGal Pressman 
84601edac3aSGal Pressman 	/* value in ms */
84701edac3aSGal Pressman 	u16 admin_completion_timeout;
84801edac3aSGal Pressman 
84901edac3aSGal Pressman 	/* poll interval in ms */
85001edac3aSGal Pressman 	u16 poll_interval;
85101edac3aSGal Pressman };
85201edac3aSGal Pressman 
85301edac3aSGal Pressman struct efa_admin_get_feature_cmd {
85401edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
85501edac3aSGal Pressman 
85601edac3aSGal Pressman 	struct efa_admin_ctrl_buff_info control_buffer;
85701edac3aSGal Pressman 
85801edac3aSGal Pressman 	struct efa_admin_get_set_feature_common_desc feature_common;
85901edac3aSGal Pressman 
86001edac3aSGal Pressman 	u32 raw[11];
86101edac3aSGal Pressman };
86201edac3aSGal Pressman 
86301edac3aSGal Pressman struct efa_admin_get_feature_resp {
86401edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
86501edac3aSGal Pressman 
86601edac3aSGal Pressman 	union {
86701edac3aSGal Pressman 		u32 raw[14];
86801edac3aSGal Pressman 
86901edac3aSGal Pressman 		struct efa_admin_feature_device_attr_desc device_attr;
87001edac3aSGal Pressman 
87101edac3aSGal Pressman 		struct efa_admin_feature_aenq_desc aenq;
87201edac3aSGal Pressman 
87301edac3aSGal Pressman 		struct efa_admin_feature_network_attr_desc network_attr;
87401edac3aSGal Pressman 
87501edac3aSGal Pressman 		struct efa_admin_feature_queue_attr_desc queue_attr;
87601edac3aSGal Pressman 
8772a152512SGal Pressman 		struct efa_admin_event_queue_attr_desc event_queue_attr;
8782a152512SGal Pressman 
87901edac3aSGal Pressman 		struct efa_admin_hw_hints hw_hints;
88001edac3aSGal Pressman 	} u;
88101edac3aSGal Pressman };
88201edac3aSGal Pressman 
88301edac3aSGal Pressman struct efa_admin_set_feature_cmd {
88401edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
88501edac3aSGal Pressman 
88601edac3aSGal Pressman 	struct efa_admin_ctrl_buff_info control_buffer;
88701edac3aSGal Pressman 
88801edac3aSGal Pressman 	struct efa_admin_get_set_feature_common_desc feature_common;
88901edac3aSGal Pressman 
89001edac3aSGal Pressman 	union {
89101edac3aSGal Pressman 		u32 raw[11];
89201edac3aSGal Pressman 
89301edac3aSGal Pressman 		/* AENQ configuration */
89401edac3aSGal Pressman 		struct efa_admin_feature_aenq_desc aenq;
89501edac3aSGal Pressman 	} u;
89601edac3aSGal Pressman };
89701edac3aSGal Pressman 
89801edac3aSGal Pressman struct efa_admin_set_feature_resp {
89901edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
90001edac3aSGal Pressman 
90101edac3aSGal Pressman 	union {
90201edac3aSGal Pressman 		u32 raw[14];
90301edac3aSGal Pressman 	} u;
90401edac3aSGal Pressman };
90501edac3aSGal Pressman 
90601edac3aSGal Pressman struct efa_admin_alloc_pd_cmd {
90701edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
90801edac3aSGal Pressman };
90901edac3aSGal Pressman 
91001edac3aSGal Pressman struct efa_admin_alloc_pd_resp {
91101edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
91201edac3aSGal Pressman 
91301edac3aSGal Pressman 	/* PD number */
91401edac3aSGal Pressman 	u16 pd;
91501edac3aSGal Pressman 
91601edac3aSGal Pressman 	/* MBZ */
91701edac3aSGal Pressman 	u16 reserved;
91801edac3aSGal Pressman };
91901edac3aSGal Pressman 
92001edac3aSGal Pressman struct efa_admin_dealloc_pd_cmd {
92101edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
92201edac3aSGal Pressman 
92301edac3aSGal Pressman 	/* PD number */
92401edac3aSGal Pressman 	u16 pd;
92501edac3aSGal Pressman 
92601edac3aSGal Pressman 	/* MBZ */
92701edac3aSGal Pressman 	u16 reserved;
92801edac3aSGal Pressman };
92901edac3aSGal Pressman 
93001edac3aSGal Pressman struct efa_admin_dealloc_pd_resp {
93101edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
93201edac3aSGal Pressman };
93301edac3aSGal Pressman 
93401edac3aSGal Pressman struct efa_admin_alloc_uar_cmd {
93501edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
93601edac3aSGal Pressman };
93701edac3aSGal Pressman 
93801edac3aSGal Pressman struct efa_admin_alloc_uar_resp {
93901edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
94001edac3aSGal Pressman 
94101edac3aSGal Pressman 	/* UAR number */
94201edac3aSGal Pressman 	u16 uar;
94301edac3aSGal Pressman 
94401edac3aSGal Pressman 	/* MBZ */
94501edac3aSGal Pressman 	u16 reserved;
94601edac3aSGal Pressman };
94701edac3aSGal Pressman 
94801edac3aSGal Pressman struct efa_admin_dealloc_uar_cmd {
94901edac3aSGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
95001edac3aSGal Pressman 
95101edac3aSGal Pressman 	/* UAR number */
95201edac3aSGal Pressman 	u16 uar;
95301edac3aSGal Pressman 
95401edac3aSGal Pressman 	/* MBZ */
95501edac3aSGal Pressman 	u16 reserved;
95601edac3aSGal Pressman };
95701edac3aSGal Pressman 
95801edac3aSGal Pressman struct efa_admin_dealloc_uar_resp {
95901edac3aSGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
96001edac3aSGal Pressman };
96101edac3aSGal Pressman 
9622a152512SGal Pressman struct efa_admin_create_eq_cmd {
9632a152512SGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
9642a152512SGal Pressman 
9652a152512SGal Pressman 	/* Size of the EQ in entries, must be power of 2 */
9662a152512SGal Pressman 	u16 depth;
9672a152512SGal Pressman 
9682a152512SGal Pressman 	/* MSI-X table entry index */
9692a152512SGal Pressman 	u8 msix_vec;
9702a152512SGal Pressman 
9712a152512SGal Pressman 	/*
9722a152512SGal Pressman 	 * 4:0 : entry_size_words - size of EQ entry in
9732a152512SGal Pressman 	 *    32-bit words
9742a152512SGal Pressman 	 * 7:5 : reserved - MBZ
9752a152512SGal Pressman 	 */
9762a152512SGal Pressman 	u8 caps;
9772a152512SGal Pressman 
9782a152512SGal Pressman 	/* EQ ring base address */
9792a152512SGal Pressman 	struct efa_common_mem_addr ba;
9802a152512SGal Pressman 
9812a152512SGal Pressman 	/*
9822a152512SGal Pressman 	 * Enabled events on this EQ
9832a152512SGal Pressman 	 * 0 : completion_events - Enable completion events
9842a152512SGal Pressman 	 * 31:1 : reserved - MBZ
9852a152512SGal Pressman 	 */
9862a152512SGal Pressman 	u32 event_bitmask;
9872a152512SGal Pressman 
9882a152512SGal Pressman 	/* MBZ */
9892a152512SGal Pressman 	u32 reserved;
9902a152512SGal Pressman };
9912a152512SGal Pressman 
9922a152512SGal Pressman struct efa_admin_create_eq_resp {
9932a152512SGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
9942a152512SGal Pressman 
9952a152512SGal Pressman 	/* EQ number */
9962a152512SGal Pressman 	u16 eqn;
9972a152512SGal Pressman 
9982a152512SGal Pressman 	/* MBZ */
9992a152512SGal Pressman 	u16 reserved;
10002a152512SGal Pressman };
10012a152512SGal Pressman 
10022a152512SGal Pressman struct efa_admin_destroy_eq_cmd {
10032a152512SGal Pressman 	struct efa_admin_aq_common_desc aq_common_descriptor;
10042a152512SGal Pressman 
10052a152512SGal Pressman 	/* EQ number */
10062a152512SGal Pressman 	u16 eqn;
10072a152512SGal Pressman 
10082a152512SGal Pressman 	/* MBZ */
10092a152512SGal Pressman 	u16 reserved;
10102a152512SGal Pressman };
10112a152512SGal Pressman 
10122a152512SGal Pressman struct efa_admin_destroy_eq_resp {
10132a152512SGal Pressman 	struct efa_admin_acq_common_desc acq_common_desc;
10142a152512SGal Pressman };
10152a152512SGal Pressman 
101601edac3aSGal Pressman /* asynchronous event notification groups */
101701edac3aSGal Pressman enum efa_admin_aenq_group {
101801edac3aSGal Pressman 	EFA_ADMIN_FATAL_ERROR                       = 1,
101901edac3aSGal Pressman 	EFA_ADMIN_WARNING                           = 2,
102001edac3aSGal Pressman 	EFA_ADMIN_NOTIFICATION                      = 3,
102101edac3aSGal Pressman 	EFA_ADMIN_KEEP_ALIVE                        = 4,
102201edac3aSGal Pressman 	EFA_ADMIN_AENQ_GROUPS_NUM                   = 5,
102301edac3aSGal Pressman };
102401edac3aSGal Pressman 
102501edac3aSGal Pressman struct efa_admin_mmio_req_read_less_resp {
102601edac3aSGal Pressman 	u16 req_id;
102701edac3aSGal Pressman 
102801edac3aSGal Pressman 	u16 reg_off;
102901edac3aSGal Pressman 
103001edac3aSGal Pressman 	/* value is valid when poll is cleared */
103101edac3aSGal Pressman 	u32 reg_val;
103201edac3aSGal Pressman };
103301edac3aSGal Pressman 
1034e1ca01a9SGal Pressman enum efa_admin_os_type {
1035e1ca01a9SGal Pressman 	EFA_ADMIN_OS_LINUX                          = 0,
1036e1ca01a9SGal Pressman };
1037e1ca01a9SGal Pressman 
1038e1ca01a9SGal Pressman struct efa_admin_host_info {
1039e1ca01a9SGal Pressman 	/* OS distribution string format */
1040e1ca01a9SGal Pressman 	u8 os_dist_str[128];
1041e1ca01a9SGal Pressman 
1042e1ca01a9SGal Pressman 	/* Defined in enum efa_admin_os_type */
1043e1ca01a9SGal Pressman 	u32 os_type;
1044e1ca01a9SGal Pressman 
1045e1ca01a9SGal Pressman 	/* Kernel version string format */
1046e1ca01a9SGal Pressman 	u8 kernel_ver_str[32];
1047e1ca01a9SGal Pressman 
1048e1ca01a9SGal Pressman 	/* Kernel version numeric format */
1049e1ca01a9SGal Pressman 	u32 kernel_ver;
1050e1ca01a9SGal Pressman 
1051e1ca01a9SGal Pressman 	/*
1052e1ca01a9SGal Pressman 	 * 7:0 : driver_module_type
1053e1ca01a9SGal Pressman 	 * 15:8 : driver_sub_minor
1054e1ca01a9SGal Pressman 	 * 23:16 : driver_minor
1055e1ca01a9SGal Pressman 	 * 31:24 : driver_major
1056e1ca01a9SGal Pressman 	 */
1057e1ca01a9SGal Pressman 	u32 driver_ver;
1058e1ca01a9SGal Pressman 
1059e1ca01a9SGal Pressman 	/*
1060e1ca01a9SGal Pressman 	 * Device's Bus, Device and Function
1061e1ca01a9SGal Pressman 	 * 2:0 : function
1062e1ca01a9SGal Pressman 	 * 7:3 : device
1063e1ca01a9SGal Pressman 	 * 15:8 : bus
1064e1ca01a9SGal Pressman 	 */
1065e1ca01a9SGal Pressman 	u16 bdf;
1066e1ca01a9SGal Pressman 
1067e1ca01a9SGal Pressman 	/*
1068e1ca01a9SGal Pressman 	 * Spec version
1069e1ca01a9SGal Pressman 	 * 7:0 : spec_minor
1070e1ca01a9SGal Pressman 	 * 15:8 : spec_major
1071e1ca01a9SGal Pressman 	 */
1072e1ca01a9SGal Pressman 	u16 spec_ver;
1073e1ca01a9SGal Pressman 
1074e1ca01a9SGal Pressman 	/*
1075e1ca01a9SGal Pressman 	 * 0 : intree - Intree driver
1076e1ca01a9SGal Pressman 	 * 1 : gdr - GPUDirect RDMA supported
1077e1ca01a9SGal Pressman 	 * 31:2 : reserved2
1078e1ca01a9SGal Pressman 	 */
1079e1ca01a9SGal Pressman 	u32 flags;
1080e1ca01a9SGal Pressman };
1081e1ca01a9SGal Pressman 
108201edac3aSGal Pressman /* create_qp_cmd */
108301edac3aSGal Pressman #define EFA_ADMIN_CREATE_QP_CMD_SQ_VIRT_MASK                BIT(0)
108401edac3aSGal Pressman #define EFA_ADMIN_CREATE_QP_CMD_RQ_VIRT_MASK                BIT(1)
10852b8af500SMichael Margolin #define EFA_ADMIN_CREATE_QP_CMD_UNSOLICITED_WRITE_RECV_MASK BIT(2)
108601edac3aSGal Pressman 
1087ab67baddSGal Pressman /* modify_qp_cmd */
1088ab67baddSGal Pressman #define EFA_ADMIN_MODIFY_QP_CMD_QP_STATE_MASK               BIT(0)
1089ab67baddSGal Pressman #define EFA_ADMIN_MODIFY_QP_CMD_CUR_QP_STATE_MASK           BIT(1)
1090ab67baddSGal Pressman #define EFA_ADMIN_MODIFY_QP_CMD_QKEY_MASK                   BIT(2)
1091ab67baddSGal Pressman #define EFA_ADMIN_MODIFY_QP_CMD_SQ_PSN_MASK                 BIT(3)
1092ab67baddSGal Pressman #define EFA_ADMIN_MODIFY_QP_CMD_SQ_DRAINED_ASYNC_NOTIFY_MASK BIT(4)
1093a4e6a1ddSGal Pressman #define EFA_ADMIN_MODIFY_QP_CMD_RNR_RETRY_MASK              BIT(5)
1094ab67baddSGal Pressman 
109501edac3aSGal Pressman /* reg_mr_cmd */
109601edac3aSGal Pressman #define EFA_ADMIN_REG_MR_CMD_PHYS_PAGE_SIZE_SHIFT_MASK      GENMASK(4, 0)
109701edac3aSGal Pressman #define EFA_ADMIN_REG_MR_CMD_MEM_ADDR_PHY_MODE_EN_MASK      BIT(7)
109801edac3aSGal Pressman #define EFA_ADMIN_REG_MR_CMD_LOCAL_WRITE_ENABLE_MASK        BIT(0)
1099531094dcSYonatan Nachum #define EFA_ADMIN_REG_MR_CMD_REMOTE_WRITE_ENABLE_MASK       BIT(1)
1100e6c4f3ffSDaniel Kranzdorf #define EFA_ADMIN_REG_MR_CMD_REMOTE_READ_ENABLE_MASK        BIT(2)
110101edac3aSGal Pressman 
11022307157cSMichael Margolin /* reg_mr_resp */
11032307157cSMichael Margolin #define EFA_ADMIN_REG_MR_RESP_RECV_IC_ID_MASK               BIT(0)
11042307157cSMichael Margolin #define EFA_ADMIN_REG_MR_RESP_RDMA_READ_IC_ID_MASK          BIT(1)
11052307157cSMichael Margolin #define EFA_ADMIN_REG_MR_RESP_RDMA_RECV_IC_ID_MASK          BIT(2)
11062307157cSMichael Margolin 
110701edac3aSGal Pressman /* create_cq_cmd */
110801edac3aSGal Pressman #define EFA_ADMIN_CREATE_CQ_CMD_INTERRUPT_MODE_ENABLED_MASK BIT(5)
110901edac3aSGal Pressman #define EFA_ADMIN_CREATE_CQ_CMD_VIRT_MASK                   BIT(6)
111001edac3aSGal Pressman #define EFA_ADMIN_CREATE_CQ_CMD_CQ_ENTRY_SIZE_WORDS_MASK    GENMASK(4, 0)
1111dc13fbf7SMichael Margolin #define EFA_ADMIN_CREATE_CQ_CMD_SET_SRC_ADDR_MASK           BIT(5)
111201edac3aSGal Pressman 
11132a152512SGal Pressman /* create_cq_resp */
11142a152512SGal Pressman #define EFA_ADMIN_CREATE_CQ_RESP_DB_VALID_MASK              BIT(0)
11152a152512SGal Pressman 
1116666e8ff5SDaniel Kranzdorf /* feature_device_attr_desc */
1117666e8ff5SDaniel Kranzdorf #define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_RDMA_READ_MASK   BIT(0)
1118a4e6a1ddSGal Pressman #define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_RNR_RETRY_MASK   BIT(1)
11196dddd939SYonatan Nachum #define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_DATA_POLLING_128_MASK BIT(2)
1120531094dcSYonatan Nachum #define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_RDMA_WRITE_MASK  BIT(3)
11212b8af500SMichael Margolin #define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_UNSOLICITED_WRITE_RECV_MASK BIT(4)
1122666e8ff5SDaniel Kranzdorf 
11232a152512SGal Pressman /* create_eq_cmd */
11242a152512SGal Pressman #define EFA_ADMIN_CREATE_EQ_CMD_ENTRY_SIZE_WORDS_MASK       GENMASK(4, 0)
11252a152512SGal Pressman #define EFA_ADMIN_CREATE_EQ_CMD_COMPLETION_EVENTS_MASK      BIT(0)
11262a152512SGal Pressman 
1127e1ca01a9SGal Pressman /* host_info */
1128e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_DRIVER_MODULE_TYPE_MASK         GENMASK(7, 0)
1129e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_DRIVER_SUB_MINOR_MASK           GENMASK(15, 8)
1130e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_DRIVER_MINOR_MASK               GENMASK(23, 16)
1131e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_DRIVER_MAJOR_MASK               GENMASK(31, 24)
1132e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_FUNCTION_MASK                   GENMASK(2, 0)
1133e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_DEVICE_MASK                     GENMASK(7, 3)
1134e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_BUS_MASK                        GENMASK(15, 8)
1135e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_SPEC_MINOR_MASK                 GENMASK(7, 0)
1136e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_SPEC_MAJOR_MASK                 GENMASK(15, 8)
1137e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_INTREE_MASK                     BIT(0)
1138e1ca01a9SGal Pressman #define EFA_ADMIN_HOST_INFO_GDR_MASK                        BIT(1)
1139e1ca01a9SGal Pressman 
114001edac3aSGal Pressman #endif /* _EFA_ADMIN_CMDS_H_ */
1141