xref: /linux/drivers/infiniband/hw/bng_re/bng_res.h (revision 4f830cd8d7fe3e98fc12d25f347ed461e11fc1de)
174506577SSiva Reddy Kallam /* SPDX-License-Identifier: GPL-2.0 */
274506577SSiva Reddy Kallam // Copyright (c) 2025 Broadcom.
374506577SSiva Reddy Kallam 
474506577SSiva Reddy Kallam #ifndef __BNG_RES_H__
574506577SSiva Reddy Kallam #define __BNG_RES_H__
674506577SSiva Reddy Kallam 
7*4f830cd8SSiva Reddy Kallam #include "roce_hsi.h"
8*4f830cd8SSiva Reddy Kallam 
974506577SSiva Reddy Kallam #define BNG_ROCE_FW_MAX_TIMEOUT	60
1074506577SSiva Reddy Kallam 
1153310b69SSiva Reddy Kallam #define PTR_CNT_PER_PG		(PAGE_SIZE / sizeof(void *))
1253310b69SSiva Reddy Kallam #define PTR_MAX_IDX_PER_PG	(PTR_CNT_PER_PG - 1)
1353310b69SSiva Reddy Kallam #define PTR_PG(x)		(((x) & ~PTR_MAX_IDX_PER_PG) / PTR_CNT_PER_PG)
1453310b69SSiva Reddy Kallam #define PTR_IDX(x)		((x) & PTR_MAX_IDX_PER_PG)
1553310b69SSiva Reddy Kallam 
16*4f830cd8SSiva Reddy Kallam #define HWQ_CMP(idx, hwq)	((idx) & ((hwq)->max_elements - 1))
17*4f830cd8SSiva Reddy Kallam #define HWQ_FREE_SLOTS(hwq)	(hwq->max_elements - \
18*4f830cd8SSiva Reddy Kallam 				((HWQ_CMP(hwq->prod, hwq)\
19*4f830cd8SSiva Reddy Kallam 				- HWQ_CMP(hwq->cons, hwq))\
20*4f830cd8SSiva Reddy Kallam 				& (hwq->max_elements - 1)))
21*4f830cd8SSiva Reddy Kallam 
2253310b69SSiva Reddy Kallam #define MAX_PBL_LVL_0_PGS		1
2353310b69SSiva Reddy Kallam #define MAX_PBL_LVL_1_PGS		512
2453310b69SSiva Reddy Kallam #define MAX_PBL_LVL_1_PGS_SHIFT		9
2553310b69SSiva Reddy Kallam #define MAX_PBL_LVL_1_PGS_FOR_LVL_2	256
2653310b69SSiva Reddy Kallam #define MAX_PBL_LVL_2_PGS		(256 * 512)
2753310b69SSiva Reddy Kallam #define MAX_PDL_LVL_SHIFT               9
2853310b69SSiva Reddy Kallam 
29*4f830cd8SSiva Reddy Kallam #define BNG_RE_DBR_VALID		(0x1UL << 26)
30*4f830cd8SSiva Reddy Kallam #define BNG_RE_DBR_EPOCH_SHIFT	24
31*4f830cd8SSiva Reddy Kallam #define BNG_RE_DBR_TOGGLE_SHIFT	25
32*4f830cd8SSiva Reddy Kallam 
33*4f830cd8SSiva Reddy Kallam 
34*4f830cd8SSiva Reddy Kallam struct bng_re_reg_desc {
35*4f830cd8SSiva Reddy Kallam 	u8		bar_id;
36*4f830cd8SSiva Reddy Kallam 	resource_size_t	bar_base;
37*4f830cd8SSiva Reddy Kallam 	unsigned long	offset;
38*4f830cd8SSiva Reddy Kallam 	void __iomem	*bar_reg;
39*4f830cd8SSiva Reddy Kallam 	size_t		len;
40*4f830cd8SSiva Reddy Kallam };
41*4f830cd8SSiva Reddy Kallam 
42*4f830cd8SSiva Reddy Kallam struct bng_re_db_info {
43*4f830cd8SSiva Reddy Kallam 	void __iomem		*db;
44*4f830cd8SSiva Reddy Kallam 	void __iomem		*priv_db;
45*4f830cd8SSiva Reddy Kallam 	struct bng_re_hwq	*hwq;
46*4f830cd8SSiva Reddy Kallam 	u32			xid;
47*4f830cd8SSiva Reddy Kallam 	u32			max_slot;
48*4f830cd8SSiva Reddy Kallam 	u32                     flags;
49*4f830cd8SSiva Reddy Kallam 	u8			toggle;
50*4f830cd8SSiva Reddy Kallam };
51*4f830cd8SSiva Reddy Kallam 
52*4f830cd8SSiva Reddy Kallam enum bng_re_db_info_flags_mask {
53*4f830cd8SSiva Reddy Kallam 	BNG_RE_FLAG_EPOCH_CONS_SHIFT        = 0x0UL,
54*4f830cd8SSiva Reddy Kallam 	BNG_RE_FLAG_EPOCH_PROD_SHIFT        = 0x1UL,
55*4f830cd8SSiva Reddy Kallam 	BNG_RE_FLAG_EPOCH_CONS_MASK         = 0x1UL,
56*4f830cd8SSiva Reddy Kallam 	BNG_RE_FLAG_EPOCH_PROD_MASK         = 0x2UL,
57*4f830cd8SSiva Reddy Kallam };
58*4f830cd8SSiva Reddy Kallam 
59*4f830cd8SSiva Reddy Kallam enum bng_re_db_epoch_flag_shift {
60*4f830cd8SSiva Reddy Kallam 	BNG_RE_DB_EPOCH_CONS_SHIFT  = BNG_RE_DBR_EPOCH_SHIFT,
61*4f830cd8SSiva Reddy Kallam 	BNG_RE_DB_EPOCH_PROD_SHIFT  = (BNG_RE_DBR_EPOCH_SHIFT - 1),
62*4f830cd8SSiva Reddy Kallam };
63*4f830cd8SSiva Reddy Kallam 
6474506577SSiva Reddy Kallam struct bng_re_chip_ctx {
6574506577SSiva Reddy Kallam 	u16	chip_num;
6674506577SSiva Reddy Kallam 	u16	hw_stats_size;
6774506577SSiva Reddy Kallam 	u64	hwrm_intf_ver;
6874506577SSiva Reddy Kallam 	u16	hwrm_cmd_max_timeout;
6974506577SSiva Reddy Kallam };
7074506577SSiva Reddy Kallam 
7153310b69SSiva Reddy Kallam struct bng_re_pbl {
7253310b69SSiva Reddy Kallam 	u32		pg_count;
7353310b69SSiva Reddy Kallam 	u32		pg_size;
7453310b69SSiva Reddy Kallam 	void		**pg_arr;
7553310b69SSiva Reddy Kallam 	dma_addr_t	*pg_map_arr;
7653310b69SSiva Reddy Kallam };
7753310b69SSiva Reddy Kallam 
7853310b69SSiva Reddy Kallam enum bng_re_pbl_lvl {
7953310b69SSiva Reddy Kallam 	BNG_PBL_LVL_0,
8053310b69SSiva Reddy Kallam 	BNG_PBL_LVL_1,
8153310b69SSiva Reddy Kallam 	BNG_PBL_LVL_2,
8253310b69SSiva Reddy Kallam 	BNG_PBL_LVL_MAX
8353310b69SSiva Reddy Kallam };
8453310b69SSiva Reddy Kallam 
8553310b69SSiva Reddy Kallam enum bng_re_hwq_type {
8653310b69SSiva Reddy Kallam 	BNG_HWQ_TYPE_CTX,
8753310b69SSiva Reddy Kallam 	BNG_HWQ_TYPE_QUEUE
8853310b69SSiva Reddy Kallam };
8953310b69SSiva Reddy Kallam 
9053310b69SSiva Reddy Kallam struct bng_re_sg_info {
9153310b69SSiva Reddy Kallam 	u32	npages;
9253310b69SSiva Reddy Kallam 	u32	pgshft;
9353310b69SSiva Reddy Kallam 	u32	pgsize;
9453310b69SSiva Reddy Kallam 	bool	nopte;
9553310b69SSiva Reddy Kallam };
9653310b69SSiva Reddy Kallam 
9753310b69SSiva Reddy Kallam struct bng_re_hwq_attr {
9853310b69SSiva Reddy Kallam 	struct bng_re_res		*res;
9953310b69SSiva Reddy Kallam 	struct bng_re_sg_info		*sginfo;
10053310b69SSiva Reddy Kallam 	enum bng_re_hwq_type		type;
10153310b69SSiva Reddy Kallam 	u32				depth;
10253310b69SSiva Reddy Kallam 	u32				stride;
10353310b69SSiva Reddy Kallam 	u32				aux_stride;
10453310b69SSiva Reddy Kallam 	u32				aux_depth;
10553310b69SSiva Reddy Kallam };
10653310b69SSiva Reddy Kallam 
10753310b69SSiva Reddy Kallam struct bng_re_hwq {
10853310b69SSiva Reddy Kallam 	struct pci_dev			*pdev;
10953310b69SSiva Reddy Kallam 	/* lock to protect hwq */
11053310b69SSiva Reddy Kallam 	spinlock_t			lock;
11153310b69SSiva Reddy Kallam 	struct bng_re_pbl		pbl[BNG_PBL_LVL_MAX + 1];
11253310b69SSiva Reddy Kallam 	/* Valid values: 0, 1, 2 */
11353310b69SSiva Reddy Kallam 	enum bng_re_pbl_lvl		level;
11453310b69SSiva Reddy Kallam 	/* PBL entries */
11553310b69SSiva Reddy Kallam 	void				**pbl_ptr;
11653310b69SSiva Reddy Kallam 	/* PBL  dma_addr */
11753310b69SSiva Reddy Kallam 	dma_addr_t			*pbl_dma_ptr;
11853310b69SSiva Reddy Kallam 	u32				max_elements;
11953310b69SSiva Reddy Kallam 	u32				depth;
12053310b69SSiva Reddy Kallam 	u16				element_size;
12153310b69SSiva Reddy Kallam 	u32				prod;
12253310b69SSiva Reddy Kallam 	u32				cons;
123*4f830cd8SSiva Reddy Kallam 	/* queue entry per page */
124*4f830cd8SSiva Reddy Kallam 	u16				qe_ppg;
12553310b69SSiva Reddy Kallam };
12653310b69SSiva Reddy Kallam 
12753310b69SSiva Reddy Kallam struct bng_re_res {
12853310b69SSiva Reddy Kallam 	struct pci_dev			*pdev;
12953310b69SSiva Reddy Kallam 	struct bng_re_chip_ctx		*cctx;
13053310b69SSiva Reddy Kallam };
13153310b69SSiva Reddy Kallam 
132*4f830cd8SSiva Reddy Kallam static inline void *bng_re_get_qe(struct bng_re_hwq *hwq,
133*4f830cd8SSiva Reddy Kallam 				  u32 indx, u64 *pg)
134*4f830cd8SSiva Reddy Kallam {
135*4f830cd8SSiva Reddy Kallam 	u32 pg_num, pg_idx;
136*4f830cd8SSiva Reddy Kallam 
137*4f830cd8SSiva Reddy Kallam 	pg_num = (indx / hwq->qe_ppg);
138*4f830cd8SSiva Reddy Kallam 	pg_idx = (indx % hwq->qe_ppg);
139*4f830cd8SSiva Reddy Kallam 	if (pg)
140*4f830cd8SSiva Reddy Kallam 		*pg = (u64)&hwq->pbl_ptr[pg_num];
141*4f830cd8SSiva Reddy Kallam 	return (void *)(hwq->pbl_ptr[pg_num] + hwq->element_size * pg_idx);
142*4f830cd8SSiva Reddy Kallam }
143*4f830cd8SSiva Reddy Kallam 
144*4f830cd8SSiva Reddy Kallam #define BNG_RE_INIT_DBHDR(xid, type, indx, toggle) \
145*4f830cd8SSiva Reddy Kallam 	(((u64)(((xid) & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE |  \
146*4f830cd8SSiva Reddy Kallam 		(type) | BNG_RE_DBR_VALID) << 32) | (indx) |  \
147*4f830cd8SSiva Reddy Kallam 	 (((u32)(toggle)) << (BNG_RE_DBR_TOGGLE_SHIFT)))
148*4f830cd8SSiva Reddy Kallam 
149*4f830cd8SSiva Reddy Kallam static inline void bng_re_ring_db(struct bng_re_db_info *info,
150*4f830cd8SSiva Reddy Kallam 				  u32 type)
151*4f830cd8SSiva Reddy Kallam {
152*4f830cd8SSiva Reddy Kallam 	u64 key = 0;
153*4f830cd8SSiva Reddy Kallam 	u32 indx;
154*4f830cd8SSiva Reddy Kallam 	u8 toggle = 0;
155*4f830cd8SSiva Reddy Kallam 
156*4f830cd8SSiva Reddy Kallam 	if (type == DBC_DBC_TYPE_CQ_ARMALL ||
157*4f830cd8SSiva Reddy Kallam 	    type == DBC_DBC_TYPE_CQ_ARMSE)
158*4f830cd8SSiva Reddy Kallam 		toggle = info->toggle;
159*4f830cd8SSiva Reddy Kallam 
160*4f830cd8SSiva Reddy Kallam 	indx = (info->hwq->cons & DBC_DBC_INDEX_MASK) |
161*4f830cd8SSiva Reddy Kallam 	       ((info->flags & BNG_RE_FLAG_EPOCH_CONS_MASK) <<
162*4f830cd8SSiva Reddy Kallam 		 BNG_RE_DB_EPOCH_CONS_SHIFT);
163*4f830cd8SSiva Reddy Kallam 
164*4f830cd8SSiva Reddy Kallam 	key =  BNG_RE_INIT_DBHDR(info->xid, type, indx, toggle);
165*4f830cd8SSiva Reddy Kallam 	writeq(key, info->db);
166*4f830cd8SSiva Reddy Kallam }
167*4f830cd8SSiva Reddy Kallam 
168*4f830cd8SSiva Reddy Kallam static inline void bng_re_ring_nq_db(struct bng_re_db_info *info,
169*4f830cd8SSiva Reddy Kallam 				     struct bng_re_chip_ctx *cctx,
170*4f830cd8SSiva Reddy Kallam 				     bool arm)
171*4f830cd8SSiva Reddy Kallam {
172*4f830cd8SSiva Reddy Kallam 	u32 type;
173*4f830cd8SSiva Reddy Kallam 
174*4f830cd8SSiva Reddy Kallam 	type = arm ? DBC_DBC_TYPE_NQ_ARM : DBC_DBC_TYPE_NQ;
175*4f830cd8SSiva Reddy Kallam 	bng_re_ring_db(info, type);
176*4f830cd8SSiva Reddy Kallam }
177*4f830cd8SSiva Reddy Kallam 
178*4f830cd8SSiva Reddy Kallam static inline void bng_re_hwq_incr_cons(u32 max_elements, u32 *cons, u32 cnt,
179*4f830cd8SSiva Reddy Kallam 					u32 *dbinfo_flags)
180*4f830cd8SSiva Reddy Kallam {
181*4f830cd8SSiva Reddy Kallam 	/* move cons and update toggle/epoch if wrap around */
182*4f830cd8SSiva Reddy Kallam 	*cons += cnt;
183*4f830cd8SSiva Reddy Kallam 	if (*cons >= max_elements) {
184*4f830cd8SSiva Reddy Kallam 		*cons %= max_elements;
185*4f830cd8SSiva Reddy Kallam 		*dbinfo_flags ^= 1UL << BNG_RE_FLAG_EPOCH_CONS_SHIFT;
186*4f830cd8SSiva Reddy Kallam 	}
187*4f830cd8SSiva Reddy Kallam }
188*4f830cd8SSiva Reddy Kallam 
18953310b69SSiva Reddy Kallam void bng_re_free_hwq(struct bng_re_res *res,
19053310b69SSiva Reddy Kallam 		     struct bng_re_hwq *hwq);
19153310b69SSiva Reddy Kallam 
19253310b69SSiva Reddy Kallam int bng_re_alloc_init_hwq(struct bng_re_hwq *hwq,
19353310b69SSiva Reddy Kallam 			  struct bng_re_hwq_attr *hwq_attr);
19474506577SSiva Reddy Kallam #endif
195