xref: /openbmc/linux/drivers/infiniband/hw/irdma/puda.h (revision 2c4b14ea)
1a3a06db5SMustafa Ismail /* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB */
2a3a06db5SMustafa Ismail /* Copyright (c) 2015 - 2020 Intel Corporation */
3a3a06db5SMustafa Ismail #ifndef IRDMA_PUDA_H
4a3a06db5SMustafa Ismail #define IRDMA_PUDA_H
5a3a06db5SMustafa Ismail 
6a3a06db5SMustafa Ismail #define IRDMA_IEQ_MPA_FRAMING	6
7a3a06db5SMustafa Ismail #define IRDMA_TCP_OFFSET	40
8a3a06db5SMustafa Ismail #define IRDMA_IPV4_PAD		20
9a3a06db5SMustafa Ismail #define IRDMA_MRK_BLK_SZ	512
10a3a06db5SMustafa Ismail 
11a3a06db5SMustafa Ismail enum puda_rsrc_type {
12a3a06db5SMustafa Ismail 	IRDMA_PUDA_RSRC_TYPE_ILQ = 1,
13a3a06db5SMustafa Ismail 	IRDMA_PUDA_RSRC_TYPE_IEQ,
14a3a06db5SMustafa Ismail 	IRDMA_PUDA_RSRC_TYPE_MAX, /* Must be last entry */
15a3a06db5SMustafa Ismail };
16a3a06db5SMustafa Ismail 
17a3a06db5SMustafa Ismail enum puda_rsrc_complete {
18a3a06db5SMustafa Ismail 	PUDA_CQ_CREATED = 1,
19a3a06db5SMustafa Ismail 	PUDA_QP_CREATED,
20a3a06db5SMustafa Ismail 	PUDA_TX_COMPLETE,
21a3a06db5SMustafa Ismail 	PUDA_RX_COMPLETE,
22a3a06db5SMustafa Ismail 	PUDA_HASH_CRC_COMPLETE,
23a3a06db5SMustafa Ismail };
24a3a06db5SMustafa Ismail 
25a3a06db5SMustafa Ismail struct irdma_sc_dev;
26a3a06db5SMustafa Ismail struct irdma_sc_qp;
27a3a06db5SMustafa Ismail struct irdma_sc_cq;
28a3a06db5SMustafa Ismail 
29a3a06db5SMustafa Ismail struct irdma_puda_cmpl_info {
30a3a06db5SMustafa Ismail 	struct irdma_qp_uk *qp;
31a3a06db5SMustafa Ismail 	u8 q_type;
32a3a06db5SMustafa Ismail 	u8 l3proto;
33a3a06db5SMustafa Ismail 	u8 l4proto;
34a3a06db5SMustafa Ismail 	u16 vlan;
35a3a06db5SMustafa Ismail 	u32 payload_len;
36a3a06db5SMustafa Ismail 	u32 compl_error; /* No_err=0, else major and minor err code */
37a3a06db5SMustafa Ismail 	u32 qp_id;
38a3a06db5SMustafa Ismail 	u32 wqe_idx;
39a3a06db5SMustafa Ismail 	bool ipv4:1;
40a3a06db5SMustafa Ismail 	bool smac_valid:1;
41a3a06db5SMustafa Ismail 	bool vlan_valid:1;
42a3a06db5SMustafa Ismail 	u8 smac[ETH_ALEN];
43a3a06db5SMustafa Ismail };
44a3a06db5SMustafa Ismail 
45a3a06db5SMustafa Ismail struct irdma_puda_send_info {
46a3a06db5SMustafa Ismail 	u64 paddr; /* Physical address */
47a3a06db5SMustafa Ismail 	u32 len;
48a3a06db5SMustafa Ismail 	u32 ah_id;
49a3a06db5SMustafa Ismail 	u8 tcplen;
50a3a06db5SMustafa Ismail 	u8 maclen;
51a3a06db5SMustafa Ismail 	bool ipv4:1;
52a3a06db5SMustafa Ismail 	bool do_lpb:1;
53a3a06db5SMustafa Ismail 	void *scratch;
54a3a06db5SMustafa Ismail };
55a3a06db5SMustafa Ismail 
56a3a06db5SMustafa Ismail struct irdma_puda_buf {
57a3a06db5SMustafa Ismail 	struct list_head list; /* MUST be first entry */
58a3a06db5SMustafa Ismail 	struct irdma_dma_mem mem; /* DMA memory for the buffer */
59a3a06db5SMustafa Ismail 	struct irdma_puda_buf *next; /* for alloclist in rsrc struct */
60a3a06db5SMustafa Ismail 	struct irdma_virt_mem buf_mem; /* Buffer memory for this buffer */
61a3a06db5SMustafa Ismail 	void *scratch;
62a3a06db5SMustafa Ismail 	u8 *iph;
63a3a06db5SMustafa Ismail 	u8 *tcph;
64a3a06db5SMustafa Ismail 	u8 *data;
65a3a06db5SMustafa Ismail 	u16 datalen;
66a3a06db5SMustafa Ismail 	u16 vlan_id;
67a3a06db5SMustafa Ismail 	u8 tcphlen; /* tcp length in bytes */
68a3a06db5SMustafa Ismail 	u8 maclen; /* mac length in bytes */
69a3a06db5SMustafa Ismail 	u32 totallen; /* machlen+iphlen+tcphlen+datalen */
70a3a06db5SMustafa Ismail 	refcount_t refcount;
71a3a06db5SMustafa Ismail 	u8 hdrlen;
72a3a06db5SMustafa Ismail 	bool ipv4:1;
73a3a06db5SMustafa Ismail 	bool vlan_valid:1;
74a3a06db5SMustafa Ismail 	bool do_lpb:1; /* Loopback buffer */
75a3a06db5SMustafa Ismail 	bool smac_valid:1;
76a3a06db5SMustafa Ismail 	u32 seqnum;
77a3a06db5SMustafa Ismail 	u32 ah_id;
78a3a06db5SMustafa Ismail 	u8 smac[ETH_ALEN];
79a3a06db5SMustafa Ismail 	struct irdma_sc_vsi *vsi;
80a3a06db5SMustafa Ismail };
81a3a06db5SMustafa Ismail 
82a3a06db5SMustafa Ismail struct irdma_puda_rsrc_info {
83a3a06db5SMustafa Ismail 	void (*receive)(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *buf);
84a3a06db5SMustafa Ismail 	void (*xmit_complete)(struct irdma_sc_vsi *vsi, void *sqwrid);
85a3a06db5SMustafa Ismail 	enum puda_rsrc_type type; /* ILQ or IEQ */
86a3a06db5SMustafa Ismail 	u32 count;
87a3a06db5SMustafa Ismail 	u32 pd_id;
88a3a06db5SMustafa Ismail 	u32 cq_id;
89a3a06db5SMustafa Ismail 	u32 qp_id;
90a3a06db5SMustafa Ismail 	u32 sq_size;
91a3a06db5SMustafa Ismail 	u32 rq_size;
92a3a06db5SMustafa Ismail 	u32 tx_buf_cnt; /* total bufs allocated will be rq_size + tx_buf_cnt */
93a3a06db5SMustafa Ismail 	u16 buf_size;
94a3a06db5SMustafa Ismail 	u8 stats_idx;
95a3a06db5SMustafa Ismail 	bool stats_idx_valid:1;
96a3a06db5SMustafa Ismail 	int abi_ver;
97a3a06db5SMustafa Ismail };
98a3a06db5SMustafa Ismail 
99a3a06db5SMustafa Ismail struct irdma_puda_rsrc {
100a3a06db5SMustafa Ismail 	struct irdma_sc_cq cq;
101a3a06db5SMustafa Ismail 	struct irdma_sc_qp qp;
102a3a06db5SMustafa Ismail 	struct irdma_sc_pd sc_pd;
103a3a06db5SMustafa Ismail 	struct irdma_sc_dev *dev;
104a3a06db5SMustafa Ismail 	struct irdma_sc_vsi *vsi;
105a3a06db5SMustafa Ismail 	struct irdma_dma_mem cqmem;
106a3a06db5SMustafa Ismail 	struct irdma_dma_mem qpmem;
107a3a06db5SMustafa Ismail 	struct irdma_virt_mem ilq_mem;
108a3a06db5SMustafa Ismail 	enum puda_rsrc_complete cmpl;
109a3a06db5SMustafa Ismail 	enum puda_rsrc_type type;
110a3a06db5SMustafa Ismail 	u16 buf_size; /*buf must be max datalen + tcpip hdr + mac */
111a3a06db5SMustafa Ismail 	u32 cq_id;
112a3a06db5SMustafa Ismail 	u32 qp_id;
113a3a06db5SMustafa Ismail 	u32 sq_size;
114a3a06db5SMustafa Ismail 	u32 rq_size;
115a3a06db5SMustafa Ismail 	u32 cq_size;
116a3a06db5SMustafa Ismail 	struct irdma_sq_uk_wr_trk_info *sq_wrtrk_array;
117a3a06db5SMustafa Ismail 	u64 *rq_wrid_array;
118a3a06db5SMustafa Ismail 	u32 compl_rxwqe_idx;
119a3a06db5SMustafa Ismail 	u32 rx_wqe_idx;
120a3a06db5SMustafa Ismail 	u32 rxq_invalid_cnt;
121a3a06db5SMustafa Ismail 	u32 tx_wqe_avail_cnt;
122a3a06db5SMustafa Ismail 	struct shash_desc *hash_desc;
123a3a06db5SMustafa Ismail 	struct list_head txpend;
124a3a06db5SMustafa Ismail 	struct list_head bufpool; /* free buffers pool list for recv and xmit */
125a3a06db5SMustafa Ismail 	u32 alloc_buf_count;
126a3a06db5SMustafa Ismail 	u32 avail_buf_count; /* snapshot of currently available buffers */
127a3a06db5SMustafa Ismail 	spinlock_t bufpool_lock;
128a3a06db5SMustafa Ismail 	struct irdma_puda_buf *alloclist;
129a3a06db5SMustafa Ismail 	void (*receive)(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *buf);
130a3a06db5SMustafa Ismail 	void (*xmit_complete)(struct irdma_sc_vsi *vsi, void *sqwrid);
131a3a06db5SMustafa Ismail 	/* puda stats */
132a3a06db5SMustafa Ismail 	u64 stats_buf_alloc_fail;
133a3a06db5SMustafa Ismail 	u64 stats_pkt_rcvd;
134a3a06db5SMustafa Ismail 	u64 stats_pkt_sent;
135a3a06db5SMustafa Ismail 	u64 stats_rcvd_pkt_err;
136a3a06db5SMustafa Ismail 	u64 stats_sent_pkt_q;
137a3a06db5SMustafa Ismail 	u64 stats_bad_qp_id;
138a3a06db5SMustafa Ismail 	/* IEQ stats */
139a3a06db5SMustafa Ismail 	u64 fpdu_processed;
140a3a06db5SMustafa Ismail 	u64 bad_seq_num;
141a3a06db5SMustafa Ismail 	u64 crc_err;
142a3a06db5SMustafa Ismail 	u64 pmode_count;
143a3a06db5SMustafa Ismail 	u64 partials_handled;
144a3a06db5SMustafa Ismail 	u8 stats_idx;
145a3a06db5SMustafa Ismail 	bool check_crc:1;
146a3a06db5SMustafa Ismail 	bool stats_idx_valid:1;
147a3a06db5SMustafa Ismail };
148a3a06db5SMustafa Ismail 
149a3a06db5SMustafa Ismail struct irdma_puda_buf *irdma_puda_get_bufpool(struct irdma_puda_rsrc *rsrc);
150a3a06db5SMustafa Ismail void irdma_puda_ret_bufpool(struct irdma_puda_rsrc *rsrc,
151a3a06db5SMustafa Ismail 			    struct irdma_puda_buf *buf);
152a3a06db5SMustafa Ismail void irdma_puda_send_buf(struct irdma_puda_rsrc *rsrc,
153a3a06db5SMustafa Ismail 			 struct irdma_puda_buf *buf);
154*2c4b14eaSShiraz Saleem int irdma_puda_send(struct irdma_sc_qp *qp, struct irdma_puda_send_info *info);
155*2c4b14eaSShiraz Saleem int irdma_puda_create_rsrc(struct irdma_sc_vsi *vsi,
156a3a06db5SMustafa Ismail 			   struct irdma_puda_rsrc_info *info);
157a3a06db5SMustafa Ismail void irdma_puda_dele_rsrc(struct irdma_sc_vsi *vsi, enum puda_rsrc_type type,
158a3a06db5SMustafa Ismail 			  bool reset);
159*2c4b14eaSShiraz Saleem int irdma_puda_poll_cmpl(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq,
160a3a06db5SMustafa Ismail 			 u32 *compl_err);
161a3a06db5SMustafa Ismail 
162a3a06db5SMustafa Ismail struct irdma_sc_qp *irdma_ieq_get_qp(struct irdma_sc_dev *dev,
163a3a06db5SMustafa Ismail 				     struct irdma_puda_buf *buf);
164*2c4b14eaSShiraz Saleem int irdma_puda_get_tcpip_info(struct irdma_puda_cmpl_info *info,
165a3a06db5SMustafa Ismail 			      struct irdma_puda_buf *buf);
166*2c4b14eaSShiraz Saleem int irdma_ieq_check_mpacrc(struct shash_desc *desc, void *addr, u32 len, u32 val);
167*2c4b14eaSShiraz Saleem int irdma_init_hash_desc(struct shash_desc **desc);
168a3a06db5SMustafa Ismail void irdma_ieq_mpa_crc_ae(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp);
169a3a06db5SMustafa Ismail void irdma_free_hash_desc(struct shash_desc *desc);
170*2c4b14eaSShiraz Saleem void irdma_ieq_update_tcpip_info(struct irdma_puda_buf *buf, u16 len, u32 seqnum);
171*2c4b14eaSShiraz Saleem int irdma_cqp_qp_create_cmd(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp);
172*2c4b14eaSShiraz Saleem int irdma_cqp_cq_create_cmd(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq);
173*2c4b14eaSShiraz Saleem int irdma_cqp_qp_destroy_cmd(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp);
174a3a06db5SMustafa Ismail void irdma_cqp_cq_destroy_cmd(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq);
175a3a06db5SMustafa Ismail void irdma_puda_ieq_get_ah_info(struct irdma_sc_qp *qp,
176a3a06db5SMustafa Ismail 				struct irdma_ah_info *ah_info);
177*2c4b14eaSShiraz Saleem int irdma_puda_create_ah(struct irdma_sc_dev *dev,
178*2c4b14eaSShiraz Saleem 			 struct irdma_ah_info *ah_info, bool wait,
179*2c4b14eaSShiraz Saleem 			 enum puda_rsrc_type type, void *cb_param,
180a3a06db5SMustafa Ismail 			 struct irdma_sc_ah **ah);
181a3a06db5SMustafa Ismail void irdma_puda_free_ah(struct irdma_sc_dev *dev, struct irdma_sc_ah *ah);
182a3a06db5SMustafa Ismail void irdma_ieq_process_fpdus(struct irdma_sc_qp *qp,
183a3a06db5SMustafa Ismail 			     struct irdma_puda_rsrc *ieq);
184a3a06db5SMustafa Ismail void irdma_ieq_cleanup_qp(struct irdma_puda_rsrc *ieq, struct irdma_sc_qp *qp);
185a3a06db5SMustafa Ismail #endif /*IRDMA_PROTOS_H */
186