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