xref: /openbmc/linux/drivers/infiniband/hw/efa/efa_io_defs.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1  /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
2  /*
3   * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved.
4   */
5  
6  #ifndef _EFA_IO_H_
7  #define _EFA_IO_H_
8  
9  #define EFA_IO_TX_DESC_NUM_BUFS              2
10  #define EFA_IO_TX_DESC_NUM_RDMA_BUFS         1
11  #define EFA_IO_TX_DESC_INLINE_MAX_SIZE       32
12  #define EFA_IO_TX_DESC_IMM_DATA_SIZE         4
13  
14  enum efa_io_queue_type {
15  	/* send queue (of a QP) */
16  	EFA_IO_SEND_QUEUE                           = 1,
17  	/* recv queue (of a QP) */
18  	EFA_IO_RECV_QUEUE                           = 2,
19  };
20  
21  enum efa_io_send_op_type {
22  	/* send message */
23  	EFA_IO_SEND                                 = 0,
24  	/* RDMA read */
25  	EFA_IO_RDMA_READ                            = 1,
26  	/* RDMA write */
27  	EFA_IO_RDMA_WRITE                           = 2,
28  };
29  
30  enum efa_io_comp_status {
31  	/* Successful completion */
32  	EFA_IO_COMP_STATUS_OK                       = 0,
33  	/* Flushed during QP destroy */
34  	EFA_IO_COMP_STATUS_FLUSHED                  = 1,
35  	/* Internal QP error */
36  	EFA_IO_COMP_STATUS_LOCAL_ERROR_QP_INTERNAL_ERROR = 2,
37  	/* Bad operation type */
38  	EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_OP_TYPE = 3,
39  	/* Bad AH */
40  	EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_AH   = 4,
41  	/* LKEY not registered or does not match IOVA */
42  	EFA_IO_COMP_STATUS_LOCAL_ERROR_INVALID_LKEY = 5,
43  	/* Message too long */
44  	EFA_IO_COMP_STATUS_LOCAL_ERROR_BAD_LENGTH   = 6,
45  	/* Destination ENI is down or does not run EFA */
46  	EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_ADDRESS = 7,
47  	/* Connection was reset by remote side */
48  	EFA_IO_COMP_STATUS_REMOTE_ERROR_ABORT       = 8,
49  	/* Bad dest QP number (QP does not exist or is in error state) */
50  	EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_DEST_QPN = 9,
51  	/* Destination resource not ready (no WQEs posted on RQ) */
52  	EFA_IO_COMP_STATUS_REMOTE_ERROR_RNR         = 10,
53  	/* Receiver SGL too short */
54  	EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_LENGTH  = 11,
55  	/* Unexpected status returned by responder */
56  	EFA_IO_COMP_STATUS_REMOTE_ERROR_BAD_STATUS  = 12,
57  	/* Unresponsive remote - detected locally */
58  	EFA_IO_COMP_STATUS_LOCAL_ERROR_UNRESP_REMOTE = 13,
59  };
60  
61  struct efa_io_tx_meta_desc {
62  	/* Verbs-generated Request ID */
63  	u16 req_id;
64  
65  	/*
66  	 * control flags
67  	 * 3:0 : op_type - enum efa_io_send_op_type
68  	 * 4 : has_imm - immediate_data field carries valid
69  	 *    data.
70  	 * 5 : inline_msg - inline mode - inline message data
71  	 *    follows this descriptor (no buffer descriptors).
72  	 *    Note that it is different from immediate data
73  	 * 6 : meta_extension - Extended metadata. MBZ
74  	 * 7 : meta_desc - Indicates metadata descriptor.
75  	 *    Must be set.
76  	 */
77  	u8 ctrl1;
78  
79  	/*
80  	 * control flags
81  	 * 0 : phase
82  	 * 1 : reserved25 - MBZ
83  	 * 2 : first - Indicates first descriptor in
84  	 *    transaction. Must be set.
85  	 * 3 : last - Indicates last descriptor in
86  	 *    transaction. Must be set.
87  	 * 4 : comp_req - Indicates whether completion should
88  	 *    be posted, after packet is transmitted. Valid only
89  	 *    for the first descriptor
90  	 * 7:5 : reserved29 - MBZ
91  	 */
92  	u8 ctrl2;
93  
94  	u16 dest_qp_num;
95  
96  	/*
97  	 * If inline_msg bit is set, length of inline message in bytes,
98  	 *    otherwise length of SGL (number of buffers).
99  	 */
100  	u16 length;
101  
102  	/*
103  	 * immediate data: if has_imm is set, then this field is included
104  	 *    within Tx message and reported in remote Rx completion.
105  	 */
106  	u32 immediate_data;
107  
108  	u16 ah;
109  
110  	u16 reserved;
111  
112  	/* Queue key */
113  	u32 qkey;
114  
115  	u8 reserved2[12];
116  };
117  
118  /*
119   * Tx queue buffer descriptor, for any transport type. Preceded by metadata
120   * descriptor.
121   */
122  struct efa_io_tx_buf_desc {
123  	/* length in bytes */
124  	u32 length;
125  
126  	/*
127  	 * 23:0 : lkey - local memory translation key
128  	 * 31:24 : reserved - MBZ
129  	 */
130  	u32 lkey;
131  
132  	/* Buffer address bits[31:0] */
133  	u32 buf_addr_lo;
134  
135  	/* Buffer address bits[63:32] */
136  	u32 buf_addr_hi;
137  };
138  
139  struct efa_io_remote_mem_addr {
140  	/* length in bytes */
141  	u32 length;
142  
143  	/* remote memory translation key */
144  	u32 rkey;
145  
146  	/* Buffer address bits[31:0] */
147  	u32 buf_addr_lo;
148  
149  	/* Buffer address bits[63:32] */
150  	u32 buf_addr_hi;
151  };
152  
153  struct efa_io_rdma_req {
154  	/* Remote memory address */
155  	struct efa_io_remote_mem_addr remote_mem;
156  
157  	/* Local memory address */
158  	struct efa_io_tx_buf_desc local_mem[1];
159  };
160  
161  /*
162   * Tx WQE, composed of tx meta descriptors followed by either tx buffer
163   * descriptors or inline data
164   */
165  struct efa_io_tx_wqe {
166  	/* TX meta */
167  	struct efa_io_tx_meta_desc meta;
168  
169  	union {
170  		/* Send buffer descriptors */
171  		struct efa_io_tx_buf_desc sgl[2];
172  
173  		u8 inline_data[32];
174  
175  		/* RDMA local and remote memory addresses */
176  		struct efa_io_rdma_req rdma_req;
177  	} data;
178  };
179  
180  /*
181   * Rx buffer descriptor; RX WQE is composed of one or more RX buffer
182   * descriptors.
183   */
184  struct efa_io_rx_desc {
185  	/* Buffer address bits[31:0] */
186  	u32 buf_addr_lo;
187  
188  	/* Buffer Pointer[63:32] */
189  	u32 buf_addr_hi;
190  
191  	/* Verbs-generated request id. */
192  	u16 req_id;
193  
194  	/* Length in bytes. */
195  	u16 length;
196  
197  	/*
198  	 * LKey and control flags
199  	 * 23:0 : lkey
200  	 * 29:24 : reserved - MBZ
201  	 * 30 : first - Indicates first descriptor in WQE
202  	 * 31 : last - Indicates last descriptor in WQE
203  	 */
204  	u32 lkey_ctrl;
205  };
206  
207  /* Common IO completion descriptor */
208  struct efa_io_cdesc_common {
209  	/*
210  	 * verbs-generated request ID, as provided in the completed tx or rx
211  	 *    descriptor.
212  	 */
213  	u16 req_id;
214  
215  	u8 status;
216  
217  	/*
218  	 * flags
219  	 * 0 : phase - Phase bit
220  	 * 2:1 : q_type - enum efa_io_queue_type: send/recv
221  	 * 3 : has_imm - indicates that immediate data is
222  	 *    present - for RX completions only
223  	 * 6:4 : op_type - enum efa_io_send_op_type
224  	 * 7 : reserved31 - MBZ
225  	 */
226  	u8 flags;
227  
228  	/* local QP number */
229  	u16 qp_num;
230  };
231  
232  /* Tx completion descriptor */
233  struct efa_io_tx_cdesc {
234  	/* Common completion info */
235  	struct efa_io_cdesc_common common;
236  
237  	/* MBZ */
238  	u16 reserved16;
239  };
240  
241  /* Rx Completion Descriptor */
242  struct efa_io_rx_cdesc {
243  	/* Common completion info */
244  	struct efa_io_cdesc_common common;
245  
246  	/* Transferred length bits[15:0] */
247  	u16 length;
248  
249  	/* Remote Address Handle FW index, 0xFFFF indicates invalid ah */
250  	u16 ah;
251  
252  	u16 src_qp_num;
253  
254  	/* Immediate data */
255  	u32 imm;
256  };
257  
258  /* Rx Completion Descriptor RDMA write info */
259  struct efa_io_rx_cdesc_rdma_write {
260  	/* Transferred length bits[31:16] */
261  	u16 length_hi;
262  };
263  
264  /* Extended Rx Completion Descriptor */
265  struct efa_io_rx_cdesc_ex {
266  	/* Base RX completion info */
267  	struct efa_io_rx_cdesc base;
268  
269  	union {
270  		struct efa_io_rx_cdesc_rdma_write rdma_write;
271  
272  		/*
273  		 * Valid only in case of unknown AH (0xFFFF) and CQ
274  		 * set_src_addr is enabled.
275  		 */
276  		u8 src_addr[16];
277  	} u;
278  };
279  
280  /* tx_meta_desc */
281  #define EFA_IO_TX_META_DESC_OP_TYPE_MASK                    GENMASK(3, 0)
282  #define EFA_IO_TX_META_DESC_HAS_IMM_MASK                    BIT(4)
283  #define EFA_IO_TX_META_DESC_INLINE_MSG_MASK                 BIT(5)
284  #define EFA_IO_TX_META_DESC_META_EXTENSION_MASK             BIT(6)
285  #define EFA_IO_TX_META_DESC_META_DESC_MASK                  BIT(7)
286  #define EFA_IO_TX_META_DESC_PHASE_MASK                      BIT(0)
287  #define EFA_IO_TX_META_DESC_FIRST_MASK                      BIT(2)
288  #define EFA_IO_TX_META_DESC_LAST_MASK                       BIT(3)
289  #define EFA_IO_TX_META_DESC_COMP_REQ_MASK                   BIT(4)
290  
291  /* tx_buf_desc */
292  #define EFA_IO_TX_BUF_DESC_LKEY_MASK                        GENMASK(23, 0)
293  
294  /* rx_desc */
295  #define EFA_IO_RX_DESC_LKEY_MASK                            GENMASK(23, 0)
296  #define EFA_IO_RX_DESC_FIRST_MASK                           BIT(30)
297  #define EFA_IO_RX_DESC_LAST_MASK                            BIT(31)
298  
299  /* cdesc_common */
300  #define EFA_IO_CDESC_COMMON_PHASE_MASK                      BIT(0)
301  #define EFA_IO_CDESC_COMMON_Q_TYPE_MASK                     GENMASK(2, 1)
302  #define EFA_IO_CDESC_COMMON_HAS_IMM_MASK                    BIT(3)
303  #define EFA_IO_CDESC_COMMON_OP_TYPE_MASK                    GENMASK(6, 4)
304  
305  #endif /* _EFA_IO_H_ */
306