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