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