xref: /dpdk/drivers/net/ionic/ionic_regs.h (revision 1abf69fc)
1*5ef51809SAlfredo Cardigliano /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2*5ef51809SAlfredo Cardigliano  * Copyright(c) 2018-2019 Pensando Systems, Inc. All rights reserved.
3*5ef51809SAlfredo Cardigliano  */
4*5ef51809SAlfredo Cardigliano 
5*5ef51809SAlfredo Cardigliano #ifndef _IONIC_REGS_H_
6*5ef51809SAlfredo Cardigliano #define _IONIC_REGS_H_
7*5ef51809SAlfredo Cardigliano 
8*5ef51809SAlfredo Cardigliano /** struct ionic_intr - interrupt control register set.
9*5ef51809SAlfredo Cardigliano  * @coal_init:			coalesce timer initial value.
10*5ef51809SAlfredo Cardigliano  * @mask:			interrupt mask value.
11*5ef51809SAlfredo Cardigliano  * @credits:			interrupt credit count and return.
12*5ef51809SAlfredo Cardigliano  * @mask_assert:		interrupt mask value on assert.
13*5ef51809SAlfredo Cardigliano  * @coal:			coalesce timer time remaining.
14*5ef51809SAlfredo Cardigliano  */
15*5ef51809SAlfredo Cardigliano struct ionic_intr {
16*5ef51809SAlfredo Cardigliano 	uint32_t coal_init;
17*5ef51809SAlfredo Cardigliano 	uint32_t mask;
18*5ef51809SAlfredo Cardigliano 	uint32_t credits;
19*5ef51809SAlfredo Cardigliano 	uint32_t mask_assert;
20*5ef51809SAlfredo Cardigliano 	uint32_t coal;
21*5ef51809SAlfredo Cardigliano 	uint32_t rsvd[3];
22*5ef51809SAlfredo Cardigliano };
23*5ef51809SAlfredo Cardigliano 
24*5ef51809SAlfredo Cardigliano /** enum ionic_intr_mask_vals - valid values for mask and mask_assert.
25*5ef51809SAlfredo Cardigliano  * @IONIC_INTR_MASK_CLEAR:	unmask interrupt.
26*5ef51809SAlfredo Cardigliano  * @IONIC_INTR_MASK_SET:	mask interrupt.
27*5ef51809SAlfredo Cardigliano  */
28*5ef51809SAlfredo Cardigliano enum ionic_intr_mask_vals {
29*5ef51809SAlfredo Cardigliano 	IONIC_INTR_MASK_CLEAR		= 0,
30*5ef51809SAlfredo Cardigliano 	IONIC_INTR_MASK_SET		= 1,
31*5ef51809SAlfredo Cardigliano };
32*5ef51809SAlfredo Cardigliano 
33*5ef51809SAlfredo Cardigliano /** enum ionic_intr_credits_bits - bitwise composition of credits values.
34*5ef51809SAlfredo Cardigliano  * @IONIC_INTR_CRED_COUNT:	bit mask of credit count, no shift needed.
35*5ef51809SAlfredo Cardigliano  * @IONIC_INTR_CRED_COUNT_SIGNED: bit mask of credit count, including sign bit.
36*5ef51809SAlfredo Cardigliano  * @IONIC_INTR_CRED_UNMASK:	unmask the interrupt.
37*5ef51809SAlfredo Cardigliano  * @IONIC_INTR_CRED_RESET_COALESCE: reset the coalesce timer.
38*5ef51809SAlfredo Cardigliano  * @IONIC_INTR_CRED_REARM:	unmask the and reset the timer.
39*5ef51809SAlfredo Cardigliano  */
40*5ef51809SAlfredo Cardigliano enum ionic_intr_credits_bits {
41*5ef51809SAlfredo Cardigliano 	IONIC_INTR_CRED_COUNT		= 0x7fffu,
42*5ef51809SAlfredo Cardigliano 	IONIC_INTR_CRED_COUNT_SIGNED	= 0xffffu,
43*5ef51809SAlfredo Cardigliano 	IONIC_INTR_CRED_UNMASK		= 0x10000u,
44*5ef51809SAlfredo Cardigliano 	IONIC_INTR_CRED_RESET_COALESCE	= 0x20000u,
45*5ef51809SAlfredo Cardigliano 	IONIC_INTR_CRED_REARM		= (IONIC_INTR_CRED_UNMASK |
46*5ef51809SAlfredo Cardigliano 					   IONIC_INTR_CRED_RESET_COALESCE),
47*5ef51809SAlfredo Cardigliano };
48*5ef51809SAlfredo Cardigliano 
49*5ef51809SAlfredo Cardigliano static inline void
ionic_intr_coal_init(struct ionic_intr __iomem * intr_ctrl,int intr_idx,uint32_t coal)50*5ef51809SAlfredo Cardigliano ionic_intr_coal_init(struct ionic_intr __iomem *intr_ctrl,
51*5ef51809SAlfredo Cardigliano 		int intr_idx, uint32_t coal)
52*5ef51809SAlfredo Cardigliano {
53*5ef51809SAlfredo Cardigliano 	iowrite32(coal, &intr_ctrl[intr_idx].coal_init);
54*5ef51809SAlfredo Cardigliano }
55*5ef51809SAlfredo Cardigliano 
56*5ef51809SAlfredo Cardigliano static inline void
ionic_intr_mask(struct ionic_intr __iomem * intr_ctrl,int intr_idx,uint32_t mask)57*5ef51809SAlfredo Cardigliano ionic_intr_mask(struct ionic_intr __iomem *intr_ctrl,
58*5ef51809SAlfredo Cardigliano 		int intr_idx, uint32_t mask)
59*5ef51809SAlfredo Cardigliano {
60*5ef51809SAlfredo Cardigliano 	iowrite32(mask, &intr_ctrl[intr_idx].mask);
61*5ef51809SAlfredo Cardigliano }
62*5ef51809SAlfredo Cardigliano 
63*5ef51809SAlfredo Cardigliano static inline void
ionic_intr_credits(struct ionic_intr __iomem * intr_ctrl,int intr_idx,uint32_t cred,uint32_t flags)64*5ef51809SAlfredo Cardigliano ionic_intr_credits(struct ionic_intr __iomem *intr_ctrl,
65*5ef51809SAlfredo Cardigliano 		int intr_idx, uint32_t cred, uint32_t flags)
66*5ef51809SAlfredo Cardigliano {
67*5ef51809SAlfredo Cardigliano 	if (cred > IONIC_INTR_CRED_COUNT) {
68*5ef51809SAlfredo Cardigliano 		IONIC_WARN_ON(cred > IONIC_INTR_CRED_COUNT);
69*5ef51809SAlfredo Cardigliano 		cred = ioread32(&intr_ctrl[intr_idx].credits);
70*5ef51809SAlfredo Cardigliano 		cred &= IONIC_INTR_CRED_COUNT_SIGNED;
71*5ef51809SAlfredo Cardigliano 	}
72*5ef51809SAlfredo Cardigliano 
73*5ef51809SAlfredo Cardigliano 	iowrite32(cred | flags, &intr_ctrl[intr_idx].credits);
74*5ef51809SAlfredo Cardigliano }
75*5ef51809SAlfredo Cardigliano 
76*5ef51809SAlfredo Cardigliano static inline void
ionic_intr_clean(struct ionic_intr __iomem * intr_ctrl,int intr_idx)77*5ef51809SAlfredo Cardigliano ionic_intr_clean(struct ionic_intr __iomem *intr_ctrl,
78*5ef51809SAlfredo Cardigliano 		int intr_idx)
79*5ef51809SAlfredo Cardigliano {
80*5ef51809SAlfredo Cardigliano 	uint32_t cred;
81*5ef51809SAlfredo Cardigliano 
82*5ef51809SAlfredo Cardigliano 	cred = ioread32(&intr_ctrl[intr_idx].credits);
83*5ef51809SAlfredo Cardigliano 	cred &= IONIC_INTR_CRED_COUNT_SIGNED;
84*5ef51809SAlfredo Cardigliano 	cred |= IONIC_INTR_CRED_RESET_COALESCE;
85*5ef51809SAlfredo Cardigliano 	iowrite32(cred, &intr_ctrl[intr_idx].credits);
86*5ef51809SAlfredo Cardigliano }
87*5ef51809SAlfredo Cardigliano 
88*5ef51809SAlfredo Cardigliano static inline void
ionic_intr_mask_assert(struct ionic_intr __iomem * intr_ctrl,int intr_idx,uint32_t mask)89*5ef51809SAlfredo Cardigliano ionic_intr_mask_assert(struct ionic_intr __iomem *intr_ctrl,
90*5ef51809SAlfredo Cardigliano 		int intr_idx, uint32_t mask)
91*5ef51809SAlfredo Cardigliano {
92*5ef51809SAlfredo Cardigliano 	iowrite32(mask, &intr_ctrl[intr_idx].mask_assert);
93*5ef51809SAlfredo Cardigliano }
94*5ef51809SAlfredo Cardigliano 
95*5ef51809SAlfredo Cardigliano /** enum ionic_dbell_bits - bitwise composition of dbell values.
96*5ef51809SAlfredo Cardigliano  *
97*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_QID_MASK:	unshifted mask of valid queue id bits.
98*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_QID_SHIFT:	queue id shift amount in dbell value.
99*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_QID:		macro to build QID component of dbell value.
100*5ef51809SAlfredo Cardigliano  *
101*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_RING_MASK:	unshifted mask of valid ring bits.
102*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_RING_SHIFT:	ring shift amount in dbell value.
103*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_RING:		macro to build ring component of dbell value.
104*5ef51809SAlfredo Cardigliano  *
105*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_RING_0:		ring zero dbell component value.
106*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_RING_1:		ring one dbell component value.
107*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_RING_2:		ring two dbell component value.
108*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_RING_3:		ring three dbell component value.
109*5ef51809SAlfredo Cardigliano  *
110*5ef51809SAlfredo Cardigliano  * @IONIC_DBELL_INDEX_MASK:	bit mask of valid index bits, no shift needed.
111*5ef51809SAlfredo Cardigliano  */
112*5ef51809SAlfredo Cardigliano enum ionic_dbell_bits {
113*5ef51809SAlfredo Cardigliano 	IONIC_DBELL_QID_MASK		= 0xffffff,
114*5ef51809SAlfredo Cardigliano 	IONIC_DBELL_QID_SHIFT		= 24,
115*5ef51809SAlfredo Cardigliano 
116*5ef51809SAlfredo Cardigliano #define IONIC_DBELL_QID(n) \
117*5ef51809SAlfredo Cardigliano 	(((u64)(n) & IONIC_DBELL_QID_MASK) << IONIC_DBELL_QID_SHIFT)
118*5ef51809SAlfredo Cardigliano 
119*5ef51809SAlfredo Cardigliano 	IONIC_DBELL_RING_MASK		= 0x7,
120*5ef51809SAlfredo Cardigliano 	IONIC_DBELL_RING_SHIFT		= 16,
121*5ef51809SAlfredo Cardigliano 
122*5ef51809SAlfredo Cardigliano #define IONIC_DBELL_RING(n) \
123*5ef51809SAlfredo Cardigliano 	(((u64)(n) & IONIC_DBELL_RING_MASK) << IONIC_DBELL_RING_SHIFT)
124*5ef51809SAlfredo Cardigliano 
125*5ef51809SAlfredo Cardigliano 	IONIC_DBELL_RING_0		= 0,
126*5ef51809SAlfredo Cardigliano 	IONIC_DBELL_RING_1		= IONIC_DBELL_RING(1),
127*5ef51809SAlfredo Cardigliano 	IONIC_DBELL_RING_2		= IONIC_DBELL_RING(2),
128*5ef51809SAlfredo Cardigliano 	IONIC_DBELL_RING_3		= IONIC_DBELL_RING(3),
129*5ef51809SAlfredo Cardigliano 
130*5ef51809SAlfredo Cardigliano 	IONIC_DBELL_INDEX_MASK		= 0xffff,
131*5ef51809SAlfredo Cardigliano };
132*5ef51809SAlfredo Cardigliano 
133*5ef51809SAlfredo Cardigliano #endif /* _IONIC_REGS_H_ */
134