xref: /dpdk/drivers/net/hinic/base/hinic_pmd_wq.h (revision 1b7b9f170fcebbbd0708fab554dcb5a7badef8cf)
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_WQ_H_
6828d3e15SZiyang Xuan #define _HINIC_PMD_WQ_H_
7828d3e15SZiyang Xuan 
8828d3e15SZiyang Xuan #define WQS_BLOCKS_PER_PAGE		4
9828d3e15SZiyang Xuan 
10828d3e15SZiyang Xuan #define WQ_SIZE(wq)		(u32)((u64)(wq)->q_depth * (wq)->wqebb_size)
11828d3e15SZiyang Xuan 
12828d3e15SZiyang Xuan #define	WQE_PAGE_NUM(wq, idx)	(((idx) >> ((wq)->wqebbs_per_page_shift)) & \
13828d3e15SZiyang Xuan 				((wq)->num_q_pages - 1))
14828d3e15SZiyang Xuan 
15828d3e15SZiyang Xuan #define	WQE_PAGE_OFF(wq, idx)	((u64)((wq)->wqebb_size) * \
16828d3e15SZiyang Xuan 				((idx) & ((wq)->num_wqebbs_per_page - 1)))
17828d3e15SZiyang Xuan 
18828d3e15SZiyang Xuan #define WQ_PAGE_ADDR_SIZE		sizeof(u64)
19828d3e15SZiyang Xuan #define WQ_PAGE_ADDR_SIZE_SHIFT		3
20828d3e15SZiyang Xuan #define WQ_PAGE_ADDR(wq, idx)		\
21828d3e15SZiyang Xuan 		(u8 *)(*(u64 *)((u64)((wq)->shadow_block_vaddr) + \
22828d3e15SZiyang Xuan 		(WQE_PAGE_NUM(wq, idx) << WQ_PAGE_ADDR_SIZE_SHIFT)))
23828d3e15SZiyang Xuan 
24828d3e15SZiyang Xuan #define WQ_BLOCK_SIZE		4096UL
25828d3e15SZiyang Xuan #define WQS_PAGE_SIZE		(WQS_BLOCKS_PER_PAGE * WQ_BLOCK_SIZE)
26828d3e15SZiyang Xuan #define WQ_MAX_PAGES		(WQ_BLOCK_SIZE >> WQ_PAGE_ADDR_SIZE_SHIFT)
27828d3e15SZiyang Xuan 
28828d3e15SZiyang Xuan #define CMDQ_BLOCKS_PER_PAGE		8
29828d3e15SZiyang Xuan #define CMDQ_BLOCK_SIZE			512UL
30828d3e15SZiyang Xuan #define CMDQ_PAGE_SIZE			ALIGN((CMDQ_BLOCKS_PER_PAGE * \
31828d3e15SZiyang Xuan 						CMDQ_BLOCK_SIZE), PAGE_SIZE)
32828d3e15SZiyang Xuan 
33828d3e15SZiyang Xuan #define ADDR_4K_ALIGNED(addr)		(0 == ((addr) & 0xfff))
34828d3e15SZiyang Xuan #define ADDR_256K_ALIGNED(addr)		(0 == ((addr) & 0x3ffff))
35828d3e15SZiyang Xuan 
36828d3e15SZiyang Xuan #define WQ_BASE_VADDR(wqs, wq)		\
37828d3e15SZiyang Xuan 		(u64 *)(((u64)((wqs)->page_vaddr[(wq)->page_idx])) \
38828d3e15SZiyang Xuan 				+ (wq)->block_idx * WQ_BLOCK_SIZE)
39828d3e15SZiyang Xuan 
40828d3e15SZiyang Xuan #define WQ_BASE_PADDR(wqs, wq)	(((wqs)->page_paddr[(wq)->page_idx]) \
41828d3e15SZiyang Xuan 				+ (u64)(wq)->block_idx * WQ_BLOCK_SIZE)
42828d3e15SZiyang Xuan 
43828d3e15SZiyang Xuan #define WQ_BASE_ADDR(wqs, wq)		\
44828d3e15SZiyang Xuan 		(u64 *)(((u64)((wqs)->shadow_page_vaddr[(wq)->page_idx])) \
45828d3e15SZiyang Xuan 				+ (wq)->block_idx * WQ_BLOCK_SIZE)
46828d3e15SZiyang Xuan 
47828d3e15SZiyang Xuan #define CMDQ_BASE_VADDR(cmdq_pages, wq)	\
48828d3e15SZiyang Xuan 			(u64 *)(((u64)((cmdq_pages)->cmdq_page_vaddr)) \
49828d3e15SZiyang Xuan 				+ (wq)->block_idx * CMDQ_BLOCK_SIZE)
50828d3e15SZiyang Xuan 
51828d3e15SZiyang Xuan #define CMDQ_BASE_PADDR(cmdq_pages, wq)	\
52828d3e15SZiyang Xuan 			(((u64)((cmdq_pages)->cmdq_page_paddr)) \
53828d3e15SZiyang Xuan 				+ (u64)(wq)->block_idx * CMDQ_BLOCK_SIZE)
54828d3e15SZiyang Xuan 
55828d3e15SZiyang Xuan #define CMDQ_BASE_ADDR(cmdq_pages, wq)	\
56828d3e15SZiyang Xuan 			(u64 *)(((u64)((cmdq_pages)->cmdq_shadow_page_vaddr)) \
57828d3e15SZiyang Xuan 				+ (wq)->block_idx * CMDQ_BLOCK_SIZE)
58828d3e15SZiyang Xuan 
59828d3e15SZiyang Xuan #define MASKED_WQE_IDX(wq, idx)	((idx) & (wq)->mask)
60828d3e15SZiyang Xuan 
61828d3e15SZiyang Xuan #define WQE_SHADOW_PAGE(wq, wqe)	\
62828d3e15SZiyang Xuan 		(u16)(((unsigned long)(wqe) - (unsigned long)(wq)->shadow_wqe) \
63828d3e15SZiyang Xuan 		/ (wq)->max_wqe_size)
64828d3e15SZiyang Xuan 
65828d3e15SZiyang Xuan #define WQE_IN_RANGE(wqe, start, end)	\
66828d3e15SZiyang Xuan 		(((unsigned long)(wqe) >= (unsigned long)(start)) && \
67828d3e15SZiyang Xuan 		((unsigned long)(wqe) < (unsigned long)(end)))
68828d3e15SZiyang Xuan 
69828d3e15SZiyang Xuan #define WQ_NUM_PAGES(num_wqs)	\
70828d3e15SZiyang Xuan 	(ALIGN((u32)num_wqs, WQS_BLOCKS_PER_PAGE) / WQS_BLOCKS_PER_PAGE)
71828d3e15SZiyang Xuan 
72828d3e15SZiyang Xuan #define	WQ_WQE_ADDR(wq, idx) ((void *)((u64)((wq)->queue_buf_vaddr) + \
73828d3e15SZiyang Xuan 			      ((idx) << (wq)->wqebb_shift)))
74828d3e15SZiyang Xuan 
75828d3e15SZiyang Xuan #define	WQ_PAGE_PFN_SHIFT			12
76828d3e15SZiyang Xuan #define	WQ_BLOCK_PFN_SHIFT			9
77828d3e15SZiyang Xuan 
78828d3e15SZiyang Xuan #define WQ_PAGE_PFN(page_addr)		((page_addr) >> WQ_PAGE_PFN_SHIFT)
79828d3e15SZiyang Xuan #define WQ_BLOCK_PFN(page_addr)		((page_addr) >> WQ_BLOCK_PFN_SHIFT)
80828d3e15SZiyang Xuan 
81828d3e15SZiyang Xuan 
82828d3e15SZiyang Xuan #define HINIC_SQ_WQEBB_SIZE	64
83828d3e15SZiyang Xuan #define HINIC_RQ_WQE_SIZE	32
84828d3e15SZiyang Xuan #define HINIC_SQ_WQEBB_SHIFT	6
85828d3e15SZiyang Xuan #define HINIC_RQ_WQEBB_SHIFT	5
86828d3e15SZiyang Xuan 
87828d3e15SZiyang Xuan struct hinic_sge {
88828d3e15SZiyang Xuan 	u32		hi_addr;
89828d3e15SZiyang Xuan 	u32		lo_addr;
90828d3e15SZiyang Xuan 	u32		len;
91828d3e15SZiyang Xuan };
92828d3e15SZiyang Xuan 
93828d3e15SZiyang Xuan /* Working Queue */
94828d3e15SZiyang Xuan struct hinic_wq {
95828d3e15SZiyang Xuan 	/* The addresses are 64 bit in the HW */
96828d3e15SZiyang Xuan 	u64     queue_buf_vaddr;
97828d3e15SZiyang Xuan 
98828d3e15SZiyang Xuan 	u16		q_depth;
99828d3e15SZiyang Xuan 	u16		mask;
100828d3e15SZiyang Xuan 	u32		delta;
101828d3e15SZiyang Xuan 
102828d3e15SZiyang Xuan 	u32		cons_idx;
103828d3e15SZiyang Xuan 	u32		prod_idx;
104828d3e15SZiyang Xuan 
105828d3e15SZiyang Xuan 	u64     queue_buf_paddr;
106828d3e15SZiyang Xuan 
107828d3e15SZiyang Xuan 	u32		wqebb_size;
108828d3e15SZiyang Xuan 	u32		wqebb_shift;
109828d3e15SZiyang Xuan 
110828d3e15SZiyang Xuan 	u32		wq_buf_size;
111828d3e15SZiyang Xuan 
112828d3e15SZiyang Xuan 	u32		rsvd[5];
113828d3e15SZiyang Xuan };
114828d3e15SZiyang Xuan 
115828d3e15SZiyang Xuan void hinic_wq_wqe_pg_clear(struct hinic_wq *wq);
116828d3e15SZiyang Xuan 
117828d3e15SZiyang Xuan int hinic_cmdq_alloc(struct hinic_wq *wq, struct hinic_hwdev *hwdev,
118828d3e15SZiyang Xuan 		     int cmdq_blocks, u32 wq_buf_size, u32 wqebb_shift,
119828d3e15SZiyang Xuan 		     u16 q_depth);
120828d3e15SZiyang Xuan 
121828d3e15SZiyang Xuan void hinic_cmdq_free(struct hinic_hwdev *hwdev, struct hinic_wq *wq,
122828d3e15SZiyang Xuan 		     int cmdq_blocks);
123828d3e15SZiyang Xuan 
124828d3e15SZiyang Xuan int hinic_wq_allocate(struct hinic_hwdev *hwdev, struct hinic_wq *wq,
125*1b7b9f17SXiaoyun Wang 		      u32 wqebb_shift, u16 q_depth, unsigned int socket_id);
126828d3e15SZiyang Xuan 
127828d3e15SZiyang Xuan void hinic_wq_free(struct hinic_hwdev *hwdev, struct hinic_wq *wq);
128828d3e15SZiyang Xuan 
129828d3e15SZiyang Xuan void *hinic_get_wqe(struct hinic_wq *wq, int num_wqebbs, u16 *prod_idx);
130828d3e15SZiyang Xuan 
131828d3e15SZiyang Xuan void hinic_put_wqe(struct hinic_wq *wq, int num_wqebbs);
132828d3e15SZiyang Xuan 
133828d3e15SZiyang Xuan void *hinic_read_wqe(struct hinic_wq *wq, int num_wqebbs, u16 *cons_idx);
134828d3e15SZiyang Xuan 
135828d3e15SZiyang Xuan void hinic_set_sge(struct hinic_sge *sge, dma_addr_t addr, u32 len);
136828d3e15SZiyang Xuan 
137828d3e15SZiyang Xuan #endif /* _HINIC_PMD_WQ_H_ */
138