162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _EFA_IO_H_ 762306a36Sopenharmony_ci#define _EFA_IO_H_ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#define EFA_IO_TX_DESC_NUM_BUFS 2 1062306a36Sopenharmony_ci#define EFA_IO_TX_DESC_NUM_RDMA_BUFS 1 1162306a36Sopenharmony_ci#define EFA_IO_TX_DESC_INLINE_MAX_SIZE 32 1262306a36Sopenharmony_ci#define EFA_IO_TX_DESC_IMM_DATA_SIZE 4 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cienum efa_io_queue_type { 1562306a36Sopenharmony_ci /* send queue (of a QP) */ 1662306a36Sopenharmony_ci EFA_IO_SEND_QUEUE = 1, 1762306a36Sopenharmony_ci /* recv queue (of a QP) */ 1862306a36Sopenharmony_ci EFA_IO_RECV_QUEUE = 2, 1962306a36Sopenharmony_ci}; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cienum efa_io_send_op_type { 2262306a36Sopenharmony_ci /* send message */ 2362306a36Sopenharmony_ci EFA_IO_SEND = 0, 2462306a36Sopenharmony_ci /* RDMA read */ 2562306a36Sopenharmony_ci EFA_IO_RDMA_READ = 1, 2662306a36Sopenharmony_ci /* RDMA write */ 2762306a36Sopenharmony_ci EFA_IO_RDMA_WRITE = 2, 2862306a36Sopenharmony_ci}; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cienum efa_io_comp_status { 3162306a36Sopenharmony_ci /* Successful completion */ 3262306a36Sopenharmony_ci EFA_IO_COMP_STATUS_OK = 0, 3362306a36Sopenharmony_ci /* Flushed during QP destroy */ 3462306a36Sopenharmony_ci EFA_IO_COMP_STATUS_FLUSHED = 1, 3562306a36Sopenharmony_ci /* Internal QP error */ 3662306a36Sopenharmony_ci EFA_IO_COMP_STATUS_LOCAL_ERROR_QP_INTERNAL_ERROR = 2, 3762306a36Sopenharmony_ci /* Bad operation type */ 3862306a36Sopenharmony_ci EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_OP_TYPE = 3, 3962306a36Sopenharmony_ci /* Bad AH */ 4062306a36Sopenharmony_ci EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_AH = 4, 4162306a36Sopenharmony_ci /* LKEY not registered or does not match IOVA */ 4262306a36Sopenharmony_ci EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_LKEY = 5, 4362306a36Sopenharmony_ci /* Message too long */ 4462306a36Sopenharmony_ci EFA_IO_COMP_STATUS_LOCAL_ERROR_BAD_LENGTH = 6, 4562306a36Sopenharmony_ci /* Destination ENI is down or does not run EFA */ 4662306a36Sopenharmony_ci EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_ADDRESS = 7, 4762306a36Sopenharmony_ci /* Connection was reset by remote side */ 4862306a36Sopenharmony_ci EFA_IO_COMP_STATUS_REMOTE_ERROR_ABORT = 8, 4962306a36Sopenharmony_ci /* Bad dest QP number (QP does not exist or is in error state) */ 5062306a36Sopenharmony_ci EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_DEST_QPN = 9, 5162306a36Sopenharmony_ci /* Destination resource not ready (no WQEs posted on RQ) */ 5262306a36Sopenharmony_ci EFA_IO_COMP_STATUS_REMOTE_ERROR_RNR = 10, 5362306a36Sopenharmony_ci /* Receiver SGL too short */ 5462306a36Sopenharmony_ci EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_LENGTH = 11, 5562306a36Sopenharmony_ci /* Unexpected status returned by responder */ 5662306a36Sopenharmony_ci EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_STATUS = 12, 5762306a36Sopenharmony_ci /* Unresponsive remote - detected locally */ 5862306a36Sopenharmony_ci EFA_IO_COMP_STATUS_LOCAL_ERROR_UNRESP_REMOTE = 13, 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistruct efa_io_tx_meta_desc { 6262306a36Sopenharmony_ci /* Verbs-generated Request ID */ 6362306a36Sopenharmony_ci u16 req_id; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci /* 6662306a36Sopenharmony_ci * control flags 6762306a36Sopenharmony_ci * 3:0 : op_type - enum efa_io_send_op_type 6862306a36Sopenharmony_ci * 4 : has_imm - immediate_data field carries valid 6962306a36Sopenharmony_ci * data. 7062306a36Sopenharmony_ci * 5 : inline_msg - inline mode - inline message data 7162306a36Sopenharmony_ci * follows this descriptor (no buffer descriptors). 7262306a36Sopenharmony_ci * Note that it is different from immediate data 7362306a36Sopenharmony_ci * 6 : meta_extension - Extended metadata. MBZ 7462306a36Sopenharmony_ci * 7 : meta_desc - Indicates metadata descriptor. 7562306a36Sopenharmony_ci * Must be set. 7662306a36Sopenharmony_ci */ 7762306a36Sopenharmony_ci u8 ctrl1; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci /* 8062306a36Sopenharmony_ci * control flags 8162306a36Sopenharmony_ci * 0 : phase 8262306a36Sopenharmony_ci * 1 : reserved25 - MBZ 8362306a36Sopenharmony_ci * 2 : first - Indicates first descriptor in 8462306a36Sopenharmony_ci * transaction. Must be set. 8562306a36Sopenharmony_ci * 3 : last - Indicates last descriptor in 8662306a36Sopenharmony_ci * transaction. Must be set. 8762306a36Sopenharmony_ci * 4 : comp_req - Indicates whether completion should 8862306a36Sopenharmony_ci * be posted, after packet is transmitted. Valid only 8962306a36Sopenharmony_ci * for the first descriptor 9062306a36Sopenharmony_ci * 7:5 : reserved29 - MBZ 9162306a36Sopenharmony_ci */ 9262306a36Sopenharmony_ci u8 ctrl2; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci u16 dest_qp_num; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci /* 9762306a36Sopenharmony_ci * If inline_msg bit is set, length of inline message in bytes, 9862306a36Sopenharmony_ci * otherwise length of SGL (number of buffers). 9962306a36Sopenharmony_ci */ 10062306a36Sopenharmony_ci u16 length; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci /* 10362306a36Sopenharmony_ci * immediate data: if has_imm is set, then this field is included 10462306a36Sopenharmony_ci * within Tx message and reported in remote Rx completion. 10562306a36Sopenharmony_ci */ 10662306a36Sopenharmony_ci u32 immediate_data; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci u16 ah; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci u16 reserved; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci /* Queue key */ 11362306a36Sopenharmony_ci u32 qkey; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci u8 reserved2[12]; 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/* 11962306a36Sopenharmony_ci * Tx queue buffer descriptor, for any transport type. Preceded by metadata 12062306a36Sopenharmony_ci * descriptor. 12162306a36Sopenharmony_ci */ 12262306a36Sopenharmony_cistruct efa_io_tx_buf_desc { 12362306a36Sopenharmony_ci /* length in bytes */ 12462306a36Sopenharmony_ci u32 length; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci /* 12762306a36Sopenharmony_ci * 23:0 : lkey - local memory translation key 12862306a36Sopenharmony_ci * 31:24 : reserved - MBZ 12962306a36Sopenharmony_ci */ 13062306a36Sopenharmony_ci u32 lkey; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci /* Buffer address bits[31:0] */ 13362306a36Sopenharmony_ci u32 buf_addr_lo; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci /* Buffer address bits[63:32] */ 13662306a36Sopenharmony_ci u32 buf_addr_hi; 13762306a36Sopenharmony_ci}; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistruct efa_io_remote_mem_addr { 14062306a36Sopenharmony_ci /* length in bytes */ 14162306a36Sopenharmony_ci u32 length; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci /* remote memory translation key */ 14462306a36Sopenharmony_ci u32 rkey; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci /* Buffer address bits[31:0] */ 14762306a36Sopenharmony_ci u32 buf_addr_lo; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci /* Buffer address bits[63:32] */ 15062306a36Sopenharmony_ci u32 buf_addr_hi; 15162306a36Sopenharmony_ci}; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistruct efa_io_rdma_req { 15462306a36Sopenharmony_ci /* Remote memory address */ 15562306a36Sopenharmony_ci struct efa_io_remote_mem_addr remote_mem; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci /* Local memory address */ 15862306a36Sopenharmony_ci struct efa_io_tx_buf_desc local_mem[1]; 15962306a36Sopenharmony_ci}; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci/* 16262306a36Sopenharmony_ci * Tx WQE, composed of tx meta descriptors followed by either tx buffer 16362306a36Sopenharmony_ci * descriptors or inline data 16462306a36Sopenharmony_ci */ 16562306a36Sopenharmony_cistruct efa_io_tx_wqe { 16662306a36Sopenharmony_ci /* TX meta */ 16762306a36Sopenharmony_ci struct efa_io_tx_meta_desc meta; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci union { 17062306a36Sopenharmony_ci /* Send buffer descriptors */ 17162306a36Sopenharmony_ci struct efa_io_tx_buf_desc sgl[2]; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci u8 inline_data[32]; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci /* RDMA local and remote memory addresses */ 17662306a36Sopenharmony_ci struct efa_io_rdma_req rdma_req; 17762306a36Sopenharmony_ci } data; 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci/* 18162306a36Sopenharmony_ci * Rx buffer descriptor; RX WQE is composed of one or more RX buffer 18262306a36Sopenharmony_ci * descriptors. 18362306a36Sopenharmony_ci */ 18462306a36Sopenharmony_cistruct efa_io_rx_desc { 18562306a36Sopenharmony_ci /* Buffer address bits[31:0] */ 18662306a36Sopenharmony_ci u32 buf_addr_lo; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci /* Buffer Pointer[63:32] */ 18962306a36Sopenharmony_ci u32 buf_addr_hi; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci /* Verbs-generated request id. */ 19262306a36Sopenharmony_ci u16 req_id; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci /* Length in bytes. */ 19562306a36Sopenharmony_ci u16 length; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci /* 19862306a36Sopenharmony_ci * LKey and control flags 19962306a36Sopenharmony_ci * 23:0 : lkey 20062306a36Sopenharmony_ci * 29:24 : reserved - MBZ 20162306a36Sopenharmony_ci * 30 : first - Indicates first descriptor in WQE 20262306a36Sopenharmony_ci * 31 : last - Indicates last descriptor in WQE 20362306a36Sopenharmony_ci */ 20462306a36Sopenharmony_ci u32 lkey_ctrl; 20562306a36Sopenharmony_ci}; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci/* Common IO completion descriptor */ 20862306a36Sopenharmony_cistruct efa_io_cdesc_common { 20962306a36Sopenharmony_ci /* 21062306a36Sopenharmony_ci * verbs-generated request ID, as provided in the completed tx or rx 21162306a36Sopenharmony_ci * descriptor. 21262306a36Sopenharmony_ci */ 21362306a36Sopenharmony_ci u16 req_id; 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci u8 status; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci /* 21862306a36Sopenharmony_ci * flags 21962306a36Sopenharmony_ci * 0 : phase - Phase bit 22062306a36Sopenharmony_ci * 2:1 : q_type - enum efa_io_queue_type: send/recv 22162306a36Sopenharmony_ci * 3 : has_imm - indicates that immediate data is 22262306a36Sopenharmony_ci * present - for RX completions only 22362306a36Sopenharmony_ci * 6:4 : op_type - enum efa_io_send_op_type 22462306a36Sopenharmony_ci * 7 : reserved31 - MBZ 22562306a36Sopenharmony_ci */ 22662306a36Sopenharmony_ci u8 flags; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci /* local QP number */ 22962306a36Sopenharmony_ci u16 qp_num; 23062306a36Sopenharmony_ci}; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci/* Tx completion descriptor */ 23362306a36Sopenharmony_cistruct efa_io_tx_cdesc { 23462306a36Sopenharmony_ci /* Common completion info */ 23562306a36Sopenharmony_ci struct efa_io_cdesc_common common; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci /* MBZ */ 23862306a36Sopenharmony_ci u16 reserved16; 23962306a36Sopenharmony_ci}; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci/* Rx Completion Descriptor */ 24262306a36Sopenharmony_cistruct efa_io_rx_cdesc { 24362306a36Sopenharmony_ci /* Common completion info */ 24462306a36Sopenharmony_ci struct efa_io_cdesc_common common; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci /* Transferred length bits[15:0] */ 24762306a36Sopenharmony_ci u16 length; 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci /* Remote Address Handle FW index, 0xFFFF indicates invalid ah */ 25062306a36Sopenharmony_ci u16 ah; 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci u16 src_qp_num; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci /* Immediate data */ 25562306a36Sopenharmony_ci u32 imm; 25662306a36Sopenharmony_ci}; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci/* Rx Completion Descriptor RDMA write info */ 25962306a36Sopenharmony_cistruct efa_io_rx_cdesc_rdma_write { 26062306a36Sopenharmony_ci /* Transferred length bits[31:16] */ 26162306a36Sopenharmony_ci u16 length_hi; 26262306a36Sopenharmony_ci}; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci/* Extended Rx Completion Descriptor */ 26562306a36Sopenharmony_cistruct efa_io_rx_cdesc_ex { 26662306a36Sopenharmony_ci /* Base RX completion info */ 26762306a36Sopenharmony_ci struct efa_io_rx_cdesc base; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci union { 27062306a36Sopenharmony_ci struct efa_io_rx_cdesc_rdma_write rdma_write; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci /* 27362306a36Sopenharmony_ci * Valid only in case of unknown AH (0xFFFF) and CQ 27462306a36Sopenharmony_ci * set_src_addr is enabled. 27562306a36Sopenharmony_ci */ 27662306a36Sopenharmony_ci u8 src_addr[16]; 27762306a36Sopenharmony_ci } u; 27862306a36Sopenharmony_ci}; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci/* tx_meta_desc */ 28162306a36Sopenharmony_ci#define EFA_IO_TX_META_DESC_OP_TYPE_MASK GENMASK(3, 0) 28262306a36Sopenharmony_ci#define EFA_IO_TX_META_DESC_HAS_IMM_MASK BIT(4) 28362306a36Sopenharmony_ci#define EFA_IO_TX_META_DESC_INLINE_MSG_MASK BIT(5) 28462306a36Sopenharmony_ci#define EFA_IO_TX_META_DESC_META_EXTENSION_MASK BIT(6) 28562306a36Sopenharmony_ci#define EFA_IO_TX_META_DESC_META_DESC_MASK BIT(7) 28662306a36Sopenharmony_ci#define EFA_IO_TX_META_DESC_PHASE_MASK BIT(0) 28762306a36Sopenharmony_ci#define EFA_IO_TX_META_DESC_FIRST_MASK BIT(2) 28862306a36Sopenharmony_ci#define EFA_IO_TX_META_DESC_LAST_MASK BIT(3) 28962306a36Sopenharmony_ci#define EFA_IO_TX_META_DESC_COMP_REQ_MASK BIT(4) 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci/* tx_buf_desc */ 29262306a36Sopenharmony_ci#define EFA_IO_TX_BUF_DESC_LKEY_MASK GENMASK(23, 0) 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci/* rx_desc */ 29562306a36Sopenharmony_ci#define EFA_IO_RX_DESC_LKEY_MASK GENMASK(23, 0) 29662306a36Sopenharmony_ci#define EFA_IO_RX_DESC_FIRST_MASK BIT(30) 29762306a36Sopenharmony_ci#define EFA_IO_RX_DESC_LAST_MASK BIT(31) 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci/* cdesc_common */ 30062306a36Sopenharmony_ci#define EFA_IO_CDESC_COMMON_PHASE_MASK BIT(0) 30162306a36Sopenharmony_ci#define EFA_IO_CDESC_COMMON_Q_TYPE_MASK GENMASK(2, 1) 30262306a36Sopenharmony_ci#define EFA_IO_CDESC_COMMON_HAS_IMM_MASK BIT(3) 30362306a36Sopenharmony_ci#define EFA_IO_CDESC_COMMON_OP_TYPE_MASK GENMASK(6, 4) 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci#endif /* _EFA_IO_H_ */ 306