xref: /dpdk/drivers/net/hinic/base/hinic_pmd_nicio.h (revision ee2cf75e1be583f22b7614b56e1df73845e96bac)
1828d3e15SZiyang Xuan /* SPDX-License-Identifier: BSD-3-Clause
2828d3e15SZiyang Xuan  * Copyright(c) 2017 Huawei Technologies Co., Ltd
3828d3e15SZiyang Xuan  */
4828d3e15SZiyang Xuan 
5828d3e15SZiyang Xuan #ifndef _HINIC_PMD_NICIO_H_
6828d3e15SZiyang Xuan #define _HINIC_PMD_NICIO_H_
7828d3e15SZiyang Xuan 
8828d3e15SZiyang Xuan #define RX_BUF_LEN_16K			16384
9828d3e15SZiyang Xuan #define RX_BUF_LEN_1_5K			1536
10828d3e15SZiyang Xuan 
11*ee2cf75eSXiaoyun Wang /* vhd type */
12*ee2cf75eSXiaoyun Wang #define HINIC_VHD_TYPE_0B		2
13*ee2cf75eSXiaoyun Wang #define HINIC_VHD_TYPE_10B		1
14*ee2cf75eSXiaoyun Wang #define HINIC_VHD_TYPE_12B		0
15*ee2cf75eSXiaoyun Wang 
16828d3e15SZiyang Xuan #define HINIC_Q_CTXT_MAX		42
17828d3e15SZiyang Xuan 
18828d3e15SZiyang Xuan /* performance: ci addr RTE_CACHE_SIZE(64B) alignment */
19828d3e15SZiyang Xuan #define HINIC_CI_Q_ADDR_SIZE		64
20828d3e15SZiyang Xuan 
21828d3e15SZiyang Xuan #define CI_TABLE_SIZE(num_qps, pg_sz)	\
22828d3e15SZiyang Xuan 	(ALIGN((num_qps) * HINIC_CI_Q_ADDR_SIZE, pg_sz))
23828d3e15SZiyang Xuan 
24828d3e15SZiyang Xuan #define HINIC_CI_VADDR(base_addr, q_id)		\
25828d3e15SZiyang Xuan 	((u8 *)(base_addr) + (q_id) * HINIC_CI_Q_ADDR_SIZE)
26828d3e15SZiyang Xuan 
27828d3e15SZiyang Xuan #define HINIC_CI_PADDR(base_paddr, q_id)	\
28828d3e15SZiyang Xuan 	((base_paddr) + (q_id) * HINIC_CI_Q_ADDR_SIZE)
29828d3e15SZiyang Xuan 
30828d3e15SZiyang Xuan #define Q_CTXT_SIZE				48
31828d3e15SZiyang Xuan #define TSO_LRO_CTXT_SIZE			240
32828d3e15SZiyang Xuan 
33828d3e15SZiyang Xuan #define SQ_CTXT_OFFSET(max_sqs, max_rqs, q_id)	\
34828d3e15SZiyang Xuan 	(((max_rqs) + (max_sqs)) * TSO_LRO_CTXT_SIZE +	\
35828d3e15SZiyang Xuan 		(q_id) * Q_CTXT_SIZE)
36828d3e15SZiyang Xuan 
37828d3e15SZiyang Xuan #define RQ_CTXT_OFFSET(max_sqs, max_rqs, q_id)	\
38828d3e15SZiyang Xuan 	(((max_rqs) + (max_sqs)) * TSO_LRO_CTXT_SIZE +	\
39828d3e15SZiyang Xuan 		(max_sqs) * Q_CTXT_SIZE + (q_id) * Q_CTXT_SIZE)
40828d3e15SZiyang Xuan 
41828d3e15SZiyang Xuan #define SQ_CTXT_SIZE(num_sqs)		\
42828d3e15SZiyang Xuan 	((u16)(sizeof(struct hinic_qp_ctxt_header) +	\
43828d3e15SZiyang Xuan 		(num_sqs) * sizeof(struct hinic_sq_ctxt)))
44828d3e15SZiyang Xuan 
45828d3e15SZiyang Xuan #define RQ_CTXT_SIZE(num_rqs)		\
46828d3e15SZiyang Xuan 	((u16)(sizeof(struct hinic_qp_ctxt_header) +	\
47828d3e15SZiyang Xuan 		(num_rqs) * sizeof(struct hinic_rq_ctxt)))
48828d3e15SZiyang Xuan 
49828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_CEQ_ID_SHIFT			8
50828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_GLOBAL_SQ_ID_SHIFT		13
51828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_EN_SHIFT			23
52828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_ARM_SHIFT			31
53828d3e15SZiyang Xuan 
54828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_CEQ_ID_MASK			0x1FU
55828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_GLOBAL_SQ_ID_MASK		0x3FFU
56828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_EN_MASK			0x1U
57828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_ARM_MASK			0x1U
58828d3e15SZiyang Xuan 
59828d3e15SZiyang Xuan #define SQ_CTXT_CEQ_ATTR_SET(val, member)	\
60828d3e15SZiyang Xuan 	(((val) & SQ_CTXT_CEQ_ATTR_##member##_MASK) <<	\
61828d3e15SZiyang Xuan 		SQ_CTXT_CEQ_ATTR_##member##_SHIFT)
62828d3e15SZiyang Xuan 
63828d3e15SZiyang Xuan #define SQ_CTXT_CI_IDX_SHIFT				11
64828d3e15SZiyang Xuan #define SQ_CTXT_CI_OWNER_SHIFT				23
65828d3e15SZiyang Xuan 
66828d3e15SZiyang Xuan #define SQ_CTXT_CI_IDX_MASK				0xFFFU
67828d3e15SZiyang Xuan #define SQ_CTXT_CI_OWNER_MASK				0x1U
68828d3e15SZiyang Xuan 
69828d3e15SZiyang Xuan #define SQ_CTXT_CI_SET(val, member)		\
70828d3e15SZiyang Xuan 	(((val) & SQ_CTXT_CI_##member##_MASK) << SQ_CTXT_CI_##member##_SHIFT)
71828d3e15SZiyang Xuan 
72828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_HI_PFN_SHIFT			0
73828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_PI_SHIFT			20
74828d3e15SZiyang Xuan 
75828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_HI_PFN_MASK			0xFFFFFU
76828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_PI_MASK				0xFFFU
77828d3e15SZiyang Xuan 
78828d3e15SZiyang Xuan #define SQ_CTXT_WQ_PAGE_SET(val, member)	\
79828d3e15SZiyang Xuan 	(((val) & SQ_CTXT_WQ_PAGE_##member##_MASK) <<	\
80828d3e15SZiyang Xuan 		SQ_CTXT_WQ_PAGE_##member##_SHIFT)
81828d3e15SZiyang Xuan 
82828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_THRESHOLD_SHIFT		0
83828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_MAX_SHIFT			14
84828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_MIN_SHIFT			25
85828d3e15SZiyang Xuan 
86828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_THRESHOLD_MASK		0x3FFFU
87828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_MAX_MASK			0x7FFU
88828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CACHE_MIN_MASK			0x7FU
89828d3e15SZiyang Xuan 
90828d3e15SZiyang Xuan #define SQ_CTXT_PREF_WQ_PFN_HI_SHIFT			0
91828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CI_SHIFT				20
92828d3e15SZiyang Xuan 
93828d3e15SZiyang Xuan #define SQ_CTXT_PREF_WQ_PFN_HI_MASK			0xFFFFFU
94828d3e15SZiyang Xuan #define SQ_CTXT_PREF_CI_MASK				0xFFFU
95828d3e15SZiyang Xuan 
96828d3e15SZiyang Xuan #define SQ_CTXT_PREF_SET(val, member)		\
97828d3e15SZiyang Xuan 	(((val) & SQ_CTXT_PREF_##member##_MASK) <<	\
98828d3e15SZiyang Xuan 		SQ_CTXT_PREF_##member##_SHIFT)
99828d3e15SZiyang Xuan 
100828d3e15SZiyang Xuan #define SQ_CTXT_WQ_BLOCK_PFN_HI_SHIFT			0
101828d3e15SZiyang Xuan 
102828d3e15SZiyang Xuan #define SQ_CTXT_WQ_BLOCK_PFN_HI_MASK			0x7FFFFFU
103828d3e15SZiyang Xuan 
104828d3e15SZiyang Xuan #define SQ_CTXT_WQ_BLOCK_SET(val, member)	\
105828d3e15SZiyang Xuan 	(((val) & SQ_CTXT_WQ_BLOCK_##member##_MASK) <<	\
106828d3e15SZiyang Xuan 		SQ_CTXT_WQ_BLOCK_##member##_SHIFT)
107828d3e15SZiyang Xuan 
108828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_EN_SHIFT			0
109828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_OWNER_SHIFT			1
110828d3e15SZiyang Xuan 
111828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_EN_MASK			0x1U
112828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_OWNER_MASK			0x1U
113828d3e15SZiyang Xuan 
114828d3e15SZiyang Xuan #define RQ_CTXT_CEQ_ATTR_SET(val, member)	\
115828d3e15SZiyang Xuan 	(((val) & RQ_CTXT_CEQ_ATTR_##member##_MASK) <<	\
116828d3e15SZiyang Xuan 		RQ_CTXT_CEQ_ATTR_##member##_SHIFT)
117828d3e15SZiyang Xuan 
118828d3e15SZiyang Xuan #define RQ_CTXT_PI_IDX_SHIFT				0
119828d3e15SZiyang Xuan #define RQ_CTXT_PI_INTR_SHIFT				22
120828d3e15SZiyang Xuan #define RQ_CTXT_PI_CEQ_ARM_SHIFT			31
121828d3e15SZiyang Xuan 
122828d3e15SZiyang Xuan #define RQ_CTXT_PI_IDX_MASK				0xFFFU
123828d3e15SZiyang Xuan #define RQ_CTXT_PI_INTR_MASK				0x3FFU
124828d3e15SZiyang Xuan #define RQ_CTXT_PI_CEQ_ARM_MASK				0x1U
125828d3e15SZiyang Xuan 
126828d3e15SZiyang Xuan #define RQ_CTXT_PI_SET(val, member)		\
127828d3e15SZiyang Xuan 	(((val) & RQ_CTXT_PI_##member##_MASK) << RQ_CTXT_PI_##member##_SHIFT)
128828d3e15SZiyang Xuan 
129828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_HI_PFN_SHIFT			0
130828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_CI_SHIFT			20
131828d3e15SZiyang Xuan 
132828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_HI_PFN_MASK			0xFFFFFU
133828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_CI_MASK				0xFFFU
134828d3e15SZiyang Xuan 
135828d3e15SZiyang Xuan #define RQ_CTXT_WQ_PAGE_SET(val, member)	\
136828d3e15SZiyang Xuan 	(((val) & RQ_CTXT_WQ_PAGE_##member##_MASK) << \
137828d3e15SZiyang Xuan 		RQ_CTXT_WQ_PAGE_##member##_SHIFT)
138828d3e15SZiyang Xuan 
139828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_THRESHOLD_SHIFT		0
140828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_MAX_SHIFT			14
141828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_MIN_SHIFT			25
142828d3e15SZiyang Xuan 
143828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_THRESHOLD_MASK		0x3FFFU
144828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_MAX_MASK			0x7FFU
145828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CACHE_MIN_MASK			0x7FU
146828d3e15SZiyang Xuan 
147828d3e15SZiyang Xuan #define RQ_CTXT_PREF_WQ_PFN_HI_SHIFT			0
148828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CI_SHIFT				20
149828d3e15SZiyang Xuan 
150828d3e15SZiyang Xuan #define RQ_CTXT_PREF_WQ_PFN_HI_MASK			0xFFFFFU
151828d3e15SZiyang Xuan #define RQ_CTXT_PREF_CI_MASK				0xFFFU
152828d3e15SZiyang Xuan 
153828d3e15SZiyang Xuan #define RQ_CTXT_PREF_SET(val, member)		\
154828d3e15SZiyang Xuan 	(((val) & RQ_CTXT_PREF_##member##_MASK) <<	\
155828d3e15SZiyang Xuan 		RQ_CTXT_PREF_##member##_SHIFT)
156828d3e15SZiyang Xuan 
157828d3e15SZiyang Xuan #define RQ_CTXT_WQ_BLOCK_PFN_HI_SHIFT			0
158828d3e15SZiyang Xuan 
159828d3e15SZiyang Xuan #define RQ_CTXT_WQ_BLOCK_PFN_HI_MASK			0x7FFFFFU
160828d3e15SZiyang Xuan 
161828d3e15SZiyang Xuan #define RQ_CTXT_WQ_BLOCK_SET(val, member)	\
162828d3e15SZiyang Xuan 	(((val) & RQ_CTXT_WQ_BLOCK_##member##_MASK) <<	\
163828d3e15SZiyang Xuan 		RQ_CTXT_WQ_BLOCK_##member##_SHIFT)
164828d3e15SZiyang Xuan 
165828d3e15SZiyang Xuan #define SIZE_16BYTES(size)		(ALIGN((size), 16) >> 4)
166828d3e15SZiyang Xuan 
167828d3e15SZiyang Xuan enum hinic_qp_ctxt_type {
168828d3e15SZiyang Xuan 	HINIC_QP_CTXT_TYPE_SQ,
169828d3e15SZiyang Xuan 	HINIC_QP_CTXT_TYPE_RQ,
170828d3e15SZiyang Xuan };
171828d3e15SZiyang Xuan 
172828d3e15SZiyang Xuan struct hinic_sq {
173828d3e15SZiyang Xuan 	struct hinic_wq		*wq;
174828d3e15SZiyang Xuan 	volatile u16		*cons_idx_addr;
175828d3e15SZiyang Xuan 	void __iomem		*db_addr;
176828d3e15SZiyang Xuan 
177828d3e15SZiyang Xuan 	u16	q_id;
178828d3e15SZiyang Xuan 	u16	owner;
179828d3e15SZiyang Xuan 	u16	sq_depth;
180828d3e15SZiyang Xuan };
181828d3e15SZiyang Xuan 
182828d3e15SZiyang Xuan struct hinic_rq {
183828d3e15SZiyang Xuan 	struct hinic_wq		*wq;
184828d3e15SZiyang Xuan 	volatile u16		*pi_virt_addr;
185828d3e15SZiyang Xuan 	dma_addr_t		pi_dma_addr;
186828d3e15SZiyang Xuan 
187828d3e15SZiyang Xuan 	u16			irq_id;
188828d3e15SZiyang Xuan 	u16			msix_entry_idx;
189828d3e15SZiyang Xuan 	u16			q_id;
190828d3e15SZiyang Xuan 	u16			rq_depth;
191828d3e15SZiyang Xuan };
192828d3e15SZiyang Xuan 
193828d3e15SZiyang Xuan struct hinic_qp {
194828d3e15SZiyang Xuan 	struct hinic_sq		sq;
195828d3e15SZiyang Xuan 	struct hinic_rq		rq;
196828d3e15SZiyang Xuan };
197828d3e15SZiyang Xuan 
198828d3e15SZiyang Xuan struct hinic_event {
199828d3e15SZiyang Xuan 	void (*tx_ack)(void *handle, u16 q_id);
200828d3e15SZiyang Xuan 	/* status: 0 - link down; 1 - link up */
201828d3e15SZiyang Xuan 	void (*link_change)(void *handle, int status);
202828d3e15SZiyang Xuan };
203828d3e15SZiyang Xuan 
204828d3e15SZiyang Xuan struct hinic_nic_io {
205828d3e15SZiyang Xuan 	struct hinic_hwdev	*hwdev;
206828d3e15SZiyang Xuan 
207828d3e15SZiyang Xuan 	u16			global_qpn;
208828d3e15SZiyang Xuan 
209828d3e15SZiyang Xuan 	struct hinic_wq		*sq_wq;
210828d3e15SZiyang Xuan 	struct hinic_wq		*rq_wq;
211828d3e15SZiyang Xuan 
212828d3e15SZiyang Xuan 	u16			max_qps;
213828d3e15SZiyang Xuan 	u16			num_qps;
214828d3e15SZiyang Xuan 
215828d3e15SZiyang Xuan 	u16			num_sqs;
216828d3e15SZiyang Xuan 	u16			num_rqs;
217828d3e15SZiyang Xuan 
218828d3e15SZiyang Xuan 	u16			sq_depth;
219828d3e15SZiyang Xuan 	u16			rq_depth;
220828d3e15SZiyang Xuan 
221828d3e15SZiyang Xuan 	u16			rq_buf_size;
222828d3e15SZiyang Xuan 	u16			vhd_mode;
223828d3e15SZiyang Xuan 
224828d3e15SZiyang Xuan 	struct hinic_qp		*qps;
225828d3e15SZiyang Xuan 	/* sq ci mem base addr of the function */
226828d3e15SZiyang Xuan 	void			*ci_vaddr_base;
227828d3e15SZiyang Xuan 	dma_addr_t		ci_dma_base;
228828d3e15SZiyang Xuan 
229828d3e15SZiyang Xuan 	struct hinic_event	event;
230828d3e15SZiyang Xuan 	void			*event_handle;
231828d3e15SZiyang Xuan };
232828d3e15SZiyang Xuan 
233828d3e15SZiyang Xuan struct hinic_sq_db {
234828d3e15SZiyang Xuan 	u32	db_info;
235828d3e15SZiyang Xuan };
236828d3e15SZiyang Xuan 
237828d3e15SZiyang Xuan int hinic_init_qp_ctxts(struct hinic_hwdev *hwdev);
238828d3e15SZiyang Xuan 
239828d3e15SZiyang Xuan void hinic_free_qp_ctxts(struct hinic_hwdev *hwdev);
240828d3e15SZiyang Xuan 
241828d3e15SZiyang Xuan int hinic_rx_tx_flush(struct hinic_hwdev *hwdev);
242828d3e15SZiyang Xuan 
243828d3e15SZiyang Xuan int hinic_get_sq_free_wqebbs(struct hinic_hwdev *hwdev, u16 q_id);
244828d3e15SZiyang Xuan 
245828d3e15SZiyang Xuan u16 hinic_get_sq_local_ci(struct hinic_hwdev *hwdev, u16 q_id);
246828d3e15SZiyang Xuan 
247828d3e15SZiyang Xuan void hinic_update_sq_local_ci(struct hinic_hwdev *hwdev, u16 q_id,
248828d3e15SZiyang Xuan 			      int wqebb_cnt);
249828d3e15SZiyang Xuan 
250828d3e15SZiyang Xuan void hinic_return_sq_wqe(struct hinic_hwdev *hwdev, u16 q_id,
251828d3e15SZiyang Xuan 			 int num_wqebbs, u16 owner);
252828d3e15SZiyang Xuan 
253828d3e15SZiyang Xuan int hinic_get_rq_free_wqebbs(struct hinic_hwdev *hwdev, u16 q_id);
254828d3e15SZiyang Xuan 
255828d3e15SZiyang Xuan void *hinic_get_rq_wqe(struct hinic_hwdev *hwdev, u16 q_id, u16 *pi);
256828d3e15SZiyang Xuan 
257828d3e15SZiyang Xuan void hinic_return_rq_wqe(struct hinic_hwdev *hwdev, u16 q_id, int num_wqebbs);
258828d3e15SZiyang Xuan 
259828d3e15SZiyang Xuan u16 hinic_get_rq_local_ci(struct hinic_hwdev *hwdev, u16 q_id);
260828d3e15SZiyang Xuan 
261828d3e15SZiyang Xuan void hinic_update_rq_local_ci(struct hinic_hwdev *hwdev, u16 q_id, int wqe_cnt);
262828d3e15SZiyang Xuan 
263828d3e15SZiyang Xuan int hinic_init_nicio(struct hinic_hwdev *hwdev);
264828d3e15SZiyang Xuan 
265828d3e15SZiyang Xuan void hinic_deinit_nicio(struct hinic_hwdev *hwdev);
266828d3e15SZiyang Xuan 
267828d3e15SZiyang Xuan int hinic_convert_rx_buf_size(u32 rx_buf_sz, u32 *match_sz);
268828d3e15SZiyang Xuan 
269828d3e15SZiyang Xuan #endif /* _HINIC_PMD_NICIO_H_ */
270