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