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