306 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			306 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
 | |
| /*
 | |
|  * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
 | |
|  */
 | |
| 
 | |
| #ifndef _EFA_IO_H_
 | |
| #define _EFA_IO_H_
 | |
| 
 | |
| #define EFA_IO_TX_DESC_NUM_BUFS              2
 | |
| #define EFA_IO_TX_DESC_NUM_RDMA_BUFS         1
 | |
| #define EFA_IO_TX_DESC_INLINE_MAX_SIZE       32
 | |
| #define EFA_IO_TX_DESC_IMM_DATA_SIZE         4
 | |
| 
 | |
| enum efa_io_queue_type {
 | |
| 	/* send queue (of a QP) */
 | |
| 	EFA_IO_SEND_QUEUE                           = 1,
 | |
| 	/* recv queue (of a QP) */
 | |
| 	EFA_IO_RECV_QUEUE                           = 2,
 | |
| };
 | |
| 
 | |
| enum efa_io_send_op_type {
 | |
| 	/* send message */
 | |
| 	EFA_IO_SEND                                 = 0,
 | |
| 	/* RDMA read */
 | |
| 	EFA_IO_RDMA_READ                            = 1,
 | |
| 	/* RDMA write */
 | |
| 	EFA_IO_RDMA_WRITE                           = 2,
 | |
| };
 | |
| 
 | |
| enum efa_io_comp_status {
 | |
| 	/* Successful completion */
 | |
| 	EFA_IO_COMP_STATUS_OK                       = 0,
 | |
| 	/* Flushed during QP destroy */
 | |
| 	EFA_IO_COMP_STATUS_FLUSHED                  = 1,
 | |
| 	/* Internal QP error */
 | |
| 	EFA_IO_COMP_STATUS_LOCAL_ERROR_QP_INTERNAL_ERROR = 2,
 | |
| 	/* Bad operation type */
 | |
| 	EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_OP_TYPE = 3,
 | |
| 	/* Bad AH */
 | |
| 	EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_AH   = 4,
 | |
| 	/* LKEY not registered or does not match IOVA */
 | |
| 	EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_LKEY = 5,
 | |
| 	/* Message too long */
 | |
| 	EFA_IO_COMP_STATUS_LOCAL_ERROR_BAD_LENGTH   = 6,
 | |
| 	/* Destination ENI is down or does not run EFA */
 | |
| 	EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_ADDRESS = 7,
 | |
| 	/* Connection was reset by remote side */
 | |
| 	EFA_IO_COMP_STATUS_REMOTE_ERROR_ABORT       = 8,
 | |
| 	/* Bad dest QP number (QP does not exist or is in error state) */
 | |
| 	EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_DEST_QPN = 9,
 | |
| 	/* Destination resource not ready (no WQEs posted on RQ) */
 | |
| 	EFA_IO_COMP_STATUS_REMOTE_ERROR_RNR         = 10,
 | |
| 	/* Receiver SGL too short */
 | |
| 	EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_LENGTH  = 11,
 | |
| 	/* Unexpected status returned by responder */
 | |
| 	EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_STATUS  = 12,
 | |
| 	/* Unresponsive remote - detected locally */
 | |
| 	EFA_IO_COMP_STATUS_LOCAL_ERROR_UNRESP_REMOTE = 13,
 | |
| };
 | |
| 
 | |
| struct efa_io_tx_meta_desc {
 | |
| 	/* Verbs-generated Request ID */
 | |
| 	u16 req_id;
 | |
| 
 | |
| 	/*
 | |
| 	 * control flags
 | |
| 	 * 3:0 : op_type - enum efa_io_send_op_type
 | |
| 	 * 4 : has_imm - immediate_data field carries valid
 | |
| 	 *    data.
 | |
| 	 * 5 : inline_msg - inline mode - inline message data
 | |
| 	 *    follows this descriptor (no buffer descriptors).
 | |
| 	 *    Note that it is different from immediate data
 | |
| 	 * 6 : meta_extension - Extended metadata. MBZ
 | |
| 	 * 7 : meta_desc - Indicates metadata descriptor.
 | |
| 	 *    Must be set.
 | |
| 	 */
 | |
| 	u8 ctrl1;
 | |
| 
 | |
| 	/*
 | |
| 	 * control flags
 | |
| 	 * 0 : phase
 | |
| 	 * 1 : reserved25 - MBZ
 | |
| 	 * 2 : first - Indicates first descriptor in
 | |
| 	 *    transaction. Must be set.
 | |
| 	 * 3 : last - Indicates last descriptor in
 | |
| 	 *    transaction. Must be set.
 | |
| 	 * 4 : comp_req - Indicates whether completion should
 | |
| 	 *    be posted, after packet is transmitted. Valid only
 | |
| 	 *    for the first descriptor
 | |
| 	 * 7:5 : reserved29 - MBZ
 | |
| 	 */
 | |
| 	u8 ctrl2;
 | |
| 
 | |
| 	u16 dest_qp_num;
 | |
| 
 | |
| 	/*
 | |
| 	 * If inline_msg bit is set, length of inline message in bytes,
 | |
| 	 *    otherwise length of SGL (number of buffers).
 | |
| 	 */
 | |
| 	u16 length;
 | |
| 
 | |
| 	/*
 | |
| 	 * immediate data: if has_imm is set, then this field is included
 | |
| 	 *    within Tx message and reported in remote Rx completion.
 | |
| 	 */
 | |
| 	u32 immediate_data;
 | |
| 
 | |
| 	u16 ah;
 | |
| 
 | |
| 	u16 reserved;
 | |
| 
 | |
| 	/* Queue key */
 | |
| 	u32 qkey;
 | |
| 
 | |
| 	u8 reserved2[12];
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Tx queue buffer descriptor, for any transport type. Preceded by metadata
 | |
|  * descriptor.
 | |
|  */
 | |
| struct efa_io_tx_buf_desc {
 | |
| 	/* length in bytes */
 | |
| 	u32 length;
 | |
| 
 | |
| 	/*
 | |
| 	 * 23:0 : lkey - local memory translation key
 | |
| 	 * 31:24 : reserved - MBZ
 | |
| 	 */
 | |
| 	u32 lkey;
 | |
| 
 | |
| 	/* Buffer address bits[31:0] */
 | |
| 	u32 buf_addr_lo;
 | |
| 
 | |
| 	/* Buffer address bits[63:32] */
 | |
| 	u32 buf_addr_hi;
 | |
| };
 | |
| 
 | |
| struct efa_io_remote_mem_addr {
 | |
| 	/* length in bytes */
 | |
| 	u32 length;
 | |
| 
 | |
| 	/* remote memory translation key */
 | |
| 	u32 rkey;
 | |
| 
 | |
| 	/* Buffer address bits[31:0] */
 | |
| 	u32 buf_addr_lo;
 | |
| 
 | |
| 	/* Buffer address bits[63:32] */
 | |
| 	u32 buf_addr_hi;
 | |
| };
 | |
| 
 | |
| struct efa_io_rdma_req {
 | |
| 	/* Remote memory address */
 | |
| 	struct efa_io_remote_mem_addr remote_mem;
 | |
| 
 | |
| 	/* Local memory address */
 | |
| 	struct efa_io_tx_buf_desc local_mem[1];
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Tx WQE, composed of tx meta descriptors followed by either tx buffer
 | |
|  * descriptors or inline data
 | |
|  */
 | |
| struct efa_io_tx_wqe {
 | |
| 	/* TX meta */
 | |
| 	struct efa_io_tx_meta_desc meta;
 | |
| 
 | |
| 	union {
 | |
| 		/* Send buffer descriptors */
 | |
| 		struct efa_io_tx_buf_desc sgl[2];
 | |
| 
 | |
| 		u8 inline_data[32];
 | |
| 
 | |
| 		/* RDMA local and remote memory addresses */
 | |
| 		struct efa_io_rdma_req rdma_req;
 | |
| 	} data;
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Rx buffer descriptor; RX WQE is composed of one or more RX buffer
 | |
|  * descriptors.
 | |
|  */
 | |
| struct efa_io_rx_desc {
 | |
| 	/* Buffer address bits[31:0] */
 | |
| 	u32 buf_addr_lo;
 | |
| 
 | |
| 	/* Buffer Pointer[63:32] */
 | |
| 	u32 buf_addr_hi;
 | |
| 
 | |
| 	/* Verbs-generated request id. */
 | |
| 	u16 req_id;
 | |
| 
 | |
| 	/* Length in bytes. */
 | |
| 	u16 length;
 | |
| 
 | |
| 	/*
 | |
| 	 * LKey and control flags
 | |
| 	 * 23:0 : lkey
 | |
| 	 * 29:24 : reserved - MBZ
 | |
| 	 * 30 : first - Indicates first descriptor in WQE
 | |
| 	 * 31 : last - Indicates last descriptor in WQE
 | |
| 	 */
 | |
| 	u32 lkey_ctrl;
 | |
| };
 | |
| 
 | |
| /* Common IO completion descriptor */
 | |
| struct efa_io_cdesc_common {
 | |
| 	/*
 | |
| 	 * verbs-generated request ID, as provided in the completed tx or rx
 | |
| 	 *    descriptor.
 | |
| 	 */
 | |
| 	u16 req_id;
 | |
| 
 | |
| 	u8 status;
 | |
| 
 | |
| 	/*
 | |
| 	 * flags
 | |
| 	 * 0 : phase - Phase bit
 | |
| 	 * 2:1 : q_type - enum efa_io_queue_type: send/recv
 | |
| 	 * 3 : has_imm - indicates that immediate data is
 | |
| 	 *    present - for RX completions only
 | |
| 	 * 6:4 : op_type - enum efa_io_send_op_type
 | |
| 	 * 7 : reserved31 - MBZ
 | |
| 	 */
 | |
| 	u8 flags;
 | |
| 
 | |
| 	/* local QP number */
 | |
| 	u16 qp_num;
 | |
| };
 | |
| 
 | |
| /* Tx completion descriptor */
 | |
| struct efa_io_tx_cdesc {
 | |
| 	/* Common completion info */
 | |
| 	struct efa_io_cdesc_common common;
 | |
| 
 | |
| 	/* MBZ */
 | |
| 	u16 reserved16;
 | |
| };
 | |
| 
 | |
| /* Rx Completion Descriptor */
 | |
| struct efa_io_rx_cdesc {
 | |
| 	/* Common completion info */
 | |
| 	struct efa_io_cdesc_common common;
 | |
| 
 | |
| 	/* Transferred length bits[15:0] */
 | |
| 	u16 length;
 | |
| 
 | |
| 	/* Remote Address Handle FW index, 0xFFFF indicates invalid ah */
 | |
| 	u16 ah;
 | |
| 
 | |
| 	u16 src_qp_num;
 | |
| 
 | |
| 	/* Immediate data */
 | |
| 	u32 imm;
 | |
| };
 | |
| 
 | |
| /* Rx Completion Descriptor RDMA write info */
 | |
| struct efa_io_rx_cdesc_rdma_write {
 | |
| 	/* Transferred length bits[31:16] */
 | |
| 	u16 length_hi;
 | |
| };
 | |
| 
 | |
| /* Extended Rx Completion Descriptor */
 | |
| struct efa_io_rx_cdesc_ex {
 | |
| 	/* Base RX completion info */
 | |
| 	struct efa_io_rx_cdesc base;
 | |
| 
 | |
| 	union {
 | |
| 		struct efa_io_rx_cdesc_rdma_write rdma_write;
 | |
| 
 | |
| 		/*
 | |
| 		 * Valid only in case of unknown AH (0xFFFF) and CQ
 | |
| 		 * set_src_addr is enabled.
 | |
| 		 */
 | |
| 		u8 src_addr[16];
 | |
| 	} u;
 | |
| };
 | |
| 
 | |
| /* tx_meta_desc */
 | |
| #define EFA_IO_TX_META_DESC_OP_TYPE_MASK                    GENMASK(3, 0)
 | |
| #define EFA_IO_TX_META_DESC_HAS_IMM_MASK                    BIT(4)
 | |
| #define EFA_IO_TX_META_DESC_INLINE_MSG_MASK                 BIT(5)
 | |
| #define EFA_IO_TX_META_DESC_META_EXTENSION_MASK             BIT(6)
 | |
| #define EFA_IO_TX_META_DESC_META_DESC_MASK                  BIT(7)
 | |
| #define EFA_IO_TX_META_DESC_PHASE_MASK                      BIT(0)
 | |
| #define EFA_IO_TX_META_DESC_FIRST_MASK                      BIT(2)
 | |
| #define EFA_IO_TX_META_DESC_LAST_MASK                       BIT(3)
 | |
| #define EFA_IO_TX_META_DESC_COMP_REQ_MASK                   BIT(4)
 | |
| 
 | |
| /* tx_buf_desc */
 | |
| #define EFA_IO_TX_BUF_DESC_LKEY_MASK                        GENMASK(23, 0)
 | |
| 
 | |
| /* rx_desc */
 | |
| #define EFA_IO_RX_DESC_LKEY_MASK                            GENMASK(23, 0)
 | |
| #define EFA_IO_RX_DESC_FIRST_MASK                           BIT(30)
 | |
| #define EFA_IO_RX_DESC_LAST_MASK                            BIT(31)
 | |
| 
 | |
| /* cdesc_common */
 | |
| #define EFA_IO_CDESC_COMMON_PHASE_MASK                      BIT(0)
 | |
| #define EFA_IO_CDESC_COMMON_Q_TYPE_MASK                     GENMASK(2, 1)
 | |
| #define EFA_IO_CDESC_COMMON_HAS_IMM_MASK                    BIT(3)
 | |
| #define EFA_IO_CDESC_COMMON_OP_TYPE_MASK                    GENMASK(6, 4)
 | |
| 
 | |
| #endif /* _EFA_IO_H_ */
 |