1*78ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
2*78ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
3*78ee8d1cSJulian Grajkowski #include "adf_dev_err.h"
4*78ee8d1cSJulian Grajkowski
5*78ee8d1cSJulian Grajkowski struct reg_info {
6*78ee8d1cSJulian Grajkowski size_t offs;
7*78ee8d1cSJulian Grajkowski char *name;
8*78ee8d1cSJulian Grajkowski };
9*78ee8d1cSJulian Grajkowski
10*78ee8d1cSJulian Grajkowski static struct reg_info adf_err_regs[] = {
11*78ee8d1cSJulian Grajkowski { ADF_ERRSOU0, "ERRSOU0" },
12*78ee8d1cSJulian Grajkowski { ADF_ERRSOU1, "ERRSOU1" },
13*78ee8d1cSJulian Grajkowski { ADF_ERRSOU3, "ERRSOU3" },
14*78ee8d1cSJulian Grajkowski { ADF_ERRSOU4, "ERRSOU4" },
15*78ee8d1cSJulian Grajkowski { ADF_ERRSOU5, "ERRSOU5" },
16*78ee8d1cSJulian Grajkowski { ADF_RICPPINTSTS, "RICPPINTSTS" },
17*78ee8d1cSJulian Grajkowski { ADF_RIERRPUSHID, "RIERRPUSHID" },
18*78ee8d1cSJulian Grajkowski { ADF_RIERRPULLID, "RIERRPULLID" },
19*78ee8d1cSJulian Grajkowski { ADF_CPP_CFC_ERR_STATUS, "CPP_CFC_ERR_STATUS" },
20*78ee8d1cSJulian Grajkowski { ADF_CPP_CFC_ERR_PPID, "CPP_CFC_ERR_PPID" },
21*78ee8d1cSJulian Grajkowski { ADF_TICPPINTSTS, "TICPPINTSTS" },
22*78ee8d1cSJulian Grajkowski { ADF_TIERRPUSHID, "TIERRPUSHID" },
23*78ee8d1cSJulian Grajkowski { ADF_TIERRPULLID, "TIERRPULLID" },
24*78ee8d1cSJulian Grajkowski { ADF_SECRAMUERR, "SECRAMUERR" },
25*78ee8d1cSJulian Grajkowski { ADF_SECRAMUERRAD, "SECRAMUERRAD" },
26*78ee8d1cSJulian Grajkowski { ADF_CPPMEMTGTERR, "CPPMEMTGTERR" },
27*78ee8d1cSJulian Grajkowski { ADF_ERRPPID, "ERRPPID" },
28*78ee8d1cSJulian Grajkowski };
29*78ee8d1cSJulian Grajkowski
30*78ee8d1cSJulian Grajkowski static u32
adf_get_intstatsssm(struct resource * pmisc_bar_addr,size_t dev)31*78ee8d1cSJulian Grajkowski adf_get_intstatsssm(struct resource *pmisc_bar_addr, size_t dev)
32*78ee8d1cSJulian Grajkowski {
33*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_INTSTATSSM(dev));
34*78ee8d1cSJulian Grajkowski }
35*78ee8d1cSJulian Grajkowski
36*78ee8d1cSJulian Grajkowski static u32
adf_get_pperr(struct resource * pmisc_bar_addr,size_t dev)37*78ee8d1cSJulian Grajkowski adf_get_pperr(struct resource *pmisc_bar_addr, size_t dev)
38*78ee8d1cSJulian Grajkowski {
39*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_PPERR(dev));
40*78ee8d1cSJulian Grajkowski }
41*78ee8d1cSJulian Grajkowski
42*78ee8d1cSJulian Grajkowski static u32
adf_get_pperrid(struct resource * pmisc_bar_addr,size_t dev)43*78ee8d1cSJulian Grajkowski adf_get_pperrid(struct resource *pmisc_bar_addr, size_t dev)
44*78ee8d1cSJulian Grajkowski {
45*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_PPERRID(dev));
46*78ee8d1cSJulian Grajkowski }
47*78ee8d1cSJulian Grajkowski
48*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmsh(struct resource * pmisc_bar_addr,size_t dev)49*78ee8d1cSJulian Grajkowski adf_get_uerrssmsh(struct resource *pmisc_bar_addr, size_t dev)
50*78ee8d1cSJulian Grajkowski {
51*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMSH(dev));
52*78ee8d1cSJulian Grajkowski }
53*78ee8d1cSJulian Grajkowski
54*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmshad(struct resource * pmisc_bar_addr,size_t dev)55*78ee8d1cSJulian Grajkowski adf_get_uerrssmshad(struct resource *pmisc_bar_addr, size_t dev)
56*78ee8d1cSJulian Grajkowski {
57*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMSHAD(dev));
58*78ee8d1cSJulian Grajkowski }
59*78ee8d1cSJulian Grajkowski
60*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmp0(struct resource * pmisc_bar_addr,size_t dev)61*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmp0(struct resource *pmisc_bar_addr, size_t dev)
62*78ee8d1cSJulian Grajkowski {
63*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMP(dev, 0));
64*78ee8d1cSJulian Grajkowski }
65*78ee8d1cSJulian Grajkowski
66*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmp1(struct resource * pmisc_bar_addr,size_t dev)67*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmp1(struct resource *pmisc_bar_addr, size_t dev)
68*78ee8d1cSJulian Grajkowski {
69*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMP(dev, 1));
70*78ee8d1cSJulian Grajkowski }
71*78ee8d1cSJulian Grajkowski
72*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmp2(struct resource * pmisc_bar_addr,size_t dev)73*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmp2(struct resource *pmisc_bar_addr, size_t dev)
74*78ee8d1cSJulian Grajkowski {
75*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMP(dev, 2));
76*78ee8d1cSJulian Grajkowski }
77*78ee8d1cSJulian Grajkowski
78*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmp3(struct resource * pmisc_bar_addr,size_t dev)79*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmp3(struct resource *pmisc_bar_addr, size_t dev)
80*78ee8d1cSJulian Grajkowski {
81*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMP(dev, 3));
82*78ee8d1cSJulian Grajkowski }
83*78ee8d1cSJulian Grajkowski
84*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmp4(struct resource * pmisc_bar_addr,size_t dev)85*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmp4(struct resource *pmisc_bar_addr, size_t dev)
86*78ee8d1cSJulian Grajkowski {
87*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMP(dev, 4));
88*78ee8d1cSJulian Grajkowski }
89*78ee8d1cSJulian Grajkowski
90*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmpad0(struct resource * pmisc_bar_addr,size_t dev)91*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmpad0(struct resource *pmisc_bar_addr, size_t dev)
92*78ee8d1cSJulian Grajkowski {
93*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMPAD(dev, 0));
94*78ee8d1cSJulian Grajkowski }
95*78ee8d1cSJulian Grajkowski
96*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmpad1(struct resource * pmisc_bar_addr,size_t dev)97*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmpad1(struct resource *pmisc_bar_addr, size_t dev)
98*78ee8d1cSJulian Grajkowski {
99*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMPAD(dev, 1));
100*78ee8d1cSJulian Grajkowski }
101*78ee8d1cSJulian Grajkowski
102*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmpad2(struct resource * pmisc_bar_addr,size_t dev)103*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmpad2(struct resource *pmisc_bar_addr, size_t dev)
104*78ee8d1cSJulian Grajkowski {
105*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMPAD(dev, 2));
106*78ee8d1cSJulian Grajkowski }
107*78ee8d1cSJulian Grajkowski
108*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmpad3(struct resource * pmisc_bar_addr,size_t dev)109*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmpad3(struct resource *pmisc_bar_addr, size_t dev)
110*78ee8d1cSJulian Grajkowski {
111*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMPAD(dev, 3));
112*78ee8d1cSJulian Grajkowski }
113*78ee8d1cSJulian Grajkowski
114*78ee8d1cSJulian Grajkowski static u32
adf_get_uerrssmmmpad4(struct resource * pmisc_bar_addr,size_t dev)115*78ee8d1cSJulian Grajkowski adf_get_uerrssmmmpad4(struct resource *pmisc_bar_addr, size_t dev)
116*78ee8d1cSJulian Grajkowski {
117*78ee8d1cSJulian Grajkowski return ADF_CSR_RD(pmisc_bar_addr, ADF_UERRSSMMMPAD(dev, 4));
118*78ee8d1cSJulian Grajkowski }
119*78ee8d1cSJulian Grajkowski
120*78ee8d1cSJulian Grajkowski struct reg_array_info {
121*78ee8d1cSJulian Grajkowski u32 (*read)(struct resource *pmisc_bar_addr, size_t dev);
122*78ee8d1cSJulian Grajkowski char *name;
123*78ee8d1cSJulian Grajkowski };
124*78ee8d1cSJulian Grajkowski
125*78ee8d1cSJulian Grajkowski static struct reg_array_info adf_accel_err_regs[] = {
126*78ee8d1cSJulian Grajkowski { adf_get_intstatsssm, "INTSTATSSM" },
127*78ee8d1cSJulian Grajkowski { adf_get_pperr, "PPERR" },
128*78ee8d1cSJulian Grajkowski { adf_get_pperrid, "PPERRID" },
129*78ee8d1cSJulian Grajkowski { adf_get_uerrssmsh, "UERRSSMSH" },
130*78ee8d1cSJulian Grajkowski { adf_get_uerrssmshad, "UERRSSMSHAD" },
131*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmp0, "UERRSSMMMP0" },
132*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmp1, "UERRSSMMMP1" },
133*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmp2, "UERRSSMMMP2" },
134*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmp3, "UERRSSMMMP3" },
135*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmp4, "UERRSSMMMP4" },
136*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmpad0, "UERRSSMMMPAD0" },
137*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmpad1, "UERRSSMMMPAD1" },
138*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmpad2, "UERRSSMMMPAD2" },
139*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmpad3, "UERRSSMMMPAD3" },
140*78ee8d1cSJulian Grajkowski { adf_get_uerrssmmmpad4, "UERRSSMMMPAD4" },
141*78ee8d1cSJulian Grajkowski };
142*78ee8d1cSJulian Grajkowski
143*78ee8d1cSJulian Grajkowski static char adf_printf_buf[128] = { 0 };
144*78ee8d1cSJulian Grajkowski static size_t adf_printf_len;
145*78ee8d1cSJulian Grajkowski
146*78ee8d1cSJulian Grajkowski static void
adf_print_flush(struct adf_accel_dev * accel_dev)147*78ee8d1cSJulian Grajkowski adf_print_flush(struct adf_accel_dev *accel_dev)
148*78ee8d1cSJulian Grajkowski {
149*78ee8d1cSJulian Grajkowski if (adf_printf_len > 0) {
150*78ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev), "%.128s\n", adf_printf_buf);
151*78ee8d1cSJulian Grajkowski adf_printf_len = 0;
152*78ee8d1cSJulian Grajkowski }
153*78ee8d1cSJulian Grajkowski }
154*78ee8d1cSJulian Grajkowski
155*78ee8d1cSJulian Grajkowski static void
adf_print_reg(struct adf_accel_dev * accel_dev,const char * name,size_t idx,u32 val)156*78ee8d1cSJulian Grajkowski adf_print_reg(struct adf_accel_dev *accel_dev,
157*78ee8d1cSJulian Grajkowski const char *name,
158*78ee8d1cSJulian Grajkowski size_t idx,
159*78ee8d1cSJulian Grajkowski u32 val)
160*78ee8d1cSJulian Grajkowski {
161*78ee8d1cSJulian Grajkowski adf_printf_len += snprintf(&adf_printf_buf[adf_printf_len],
162*78ee8d1cSJulian Grajkowski sizeof(adf_printf_buf) - adf_printf_len,
163*78ee8d1cSJulian Grajkowski "%s[%zu],%.8x,",
164*78ee8d1cSJulian Grajkowski name,
165*78ee8d1cSJulian Grajkowski idx,
166*78ee8d1cSJulian Grajkowski val);
167*78ee8d1cSJulian Grajkowski
168*78ee8d1cSJulian Grajkowski if (adf_printf_len >= 80)
169*78ee8d1cSJulian Grajkowski adf_print_flush(accel_dev);
170*78ee8d1cSJulian Grajkowski }
171*78ee8d1cSJulian Grajkowski
172*78ee8d1cSJulian Grajkowski void
adf_print_err_registers(struct adf_accel_dev * accel_dev)173*78ee8d1cSJulian Grajkowski adf_print_err_registers(struct adf_accel_dev *accel_dev)
174*78ee8d1cSJulian Grajkowski {
175*78ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_data = accel_dev->hw_device;
176*78ee8d1cSJulian Grajkowski struct adf_bar *misc_bar =
177*78ee8d1cSJulian Grajkowski &GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
178*78ee8d1cSJulian Grajkowski struct resource *csr = misc_bar->virt_addr;
179*78ee8d1cSJulian Grajkowski size_t i;
180*78ee8d1cSJulian Grajkowski unsigned int mask;
181*78ee8d1cSJulian Grajkowski u32 val;
182*78ee8d1cSJulian Grajkowski
183*78ee8d1cSJulian Grajkowski for (i = 0; i < ARRAY_SIZE(adf_err_regs); ++i) {
184*78ee8d1cSJulian Grajkowski val = ADF_CSR_RD(csr, adf_err_regs[i].offs);
185*78ee8d1cSJulian Grajkowski
186*78ee8d1cSJulian Grajkowski adf_print_reg(accel_dev, adf_err_regs[i].name, 0, val);
187*78ee8d1cSJulian Grajkowski }
188*78ee8d1cSJulian Grajkowski
189*78ee8d1cSJulian Grajkowski for (i = 0; i < ARRAY_SIZE(adf_accel_err_regs); ++i) {
190*78ee8d1cSJulian Grajkowski size_t accel;
191*78ee8d1cSJulian Grajkowski
192*78ee8d1cSJulian Grajkowski for (accel = 0, mask = hw_data->accel_mask; mask;
193*78ee8d1cSJulian Grajkowski accel++, mask >>= 1) {
194*78ee8d1cSJulian Grajkowski if (!(mask & 1))
195*78ee8d1cSJulian Grajkowski continue;
196*78ee8d1cSJulian Grajkowski val = adf_accel_err_regs[i].read(csr, accel);
197*78ee8d1cSJulian Grajkowski
198*78ee8d1cSJulian Grajkowski adf_print_reg(accel_dev,
199*78ee8d1cSJulian Grajkowski adf_accel_err_regs[i].name,
200*78ee8d1cSJulian Grajkowski accel,
201*78ee8d1cSJulian Grajkowski val);
202*78ee8d1cSJulian Grajkowski }
203*78ee8d1cSJulian Grajkowski }
204*78ee8d1cSJulian Grajkowski
205*78ee8d1cSJulian Grajkowski adf_print_flush(accel_dev);
206*78ee8d1cSJulian Grajkowski }
207*78ee8d1cSJulian Grajkowski
208*78ee8d1cSJulian Grajkowski static void
adf_log_slice_hang(struct adf_accel_dev * accel_dev,u8 accel_num,char * unit_name,u8 unit_number)209*78ee8d1cSJulian Grajkowski adf_log_slice_hang(struct adf_accel_dev *accel_dev,
210*78ee8d1cSJulian Grajkowski u8 accel_num,
211*78ee8d1cSJulian Grajkowski char *unit_name,
212*78ee8d1cSJulian Grajkowski u8 unit_number)
213*78ee8d1cSJulian Grajkowski {
214*78ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
215*78ee8d1cSJulian Grajkowski "CPM #%x Slice Hang Detected unit: %s%d.\n",
216*78ee8d1cSJulian Grajkowski accel_num,
217*78ee8d1cSJulian Grajkowski unit_name,
218*78ee8d1cSJulian Grajkowski unit_number);
219*78ee8d1cSJulian Grajkowski }
220*78ee8d1cSJulian Grajkowski
221*78ee8d1cSJulian Grajkowski bool
adf_handle_slice_hang(struct adf_accel_dev * accel_dev,u8 accel_num,struct resource * csr,u32 slice_hang_offset)222*78ee8d1cSJulian Grajkowski adf_handle_slice_hang(struct adf_accel_dev *accel_dev,
223*78ee8d1cSJulian Grajkowski u8 accel_num,
224*78ee8d1cSJulian Grajkowski struct resource *csr,
225*78ee8d1cSJulian Grajkowski u32 slice_hang_offset)
226*78ee8d1cSJulian Grajkowski {
227*78ee8d1cSJulian Grajkowski u32 slice_hang = ADF_CSR_RD(csr, slice_hang_offset);
228*78ee8d1cSJulian Grajkowski
229*78ee8d1cSJulian Grajkowski if (!slice_hang)
230*78ee8d1cSJulian Grajkowski return false;
231*78ee8d1cSJulian Grajkowski
232*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_AUTH0_MASK)
233*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Auth", 0);
234*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_AUTH1_MASK)
235*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Auth", 1);
236*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_AUTH2_MASK)
237*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Auth", 2);
238*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_CPHR0_MASK)
239*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Cipher", 0);
240*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_CPHR1_MASK)
241*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Cipher", 1);
242*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_CPHR2_MASK)
243*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Cipher", 2);
244*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_CMP0_MASK)
245*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Comp", 0);
246*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_CMP1_MASK)
247*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Comp", 1);
248*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_XLT0_MASK)
249*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Xlator", 0);
250*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_XLT1_MASK)
251*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "Xlator", 1);
252*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_MMP0_MASK)
253*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "MMP", 0);
254*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_MMP1_MASK)
255*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "MMP", 1);
256*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_MMP2_MASK)
257*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "MMP", 2);
258*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_MMP3_MASK)
259*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "MMP", 3);
260*78ee8d1cSJulian Grajkowski if (slice_hang & ADF_SLICE_HANG_MMP4_MASK)
261*78ee8d1cSJulian Grajkowski adf_log_slice_hang(accel_dev, accel_num, "MMP", 4);
262*78ee8d1cSJulian Grajkowski
263*78ee8d1cSJulian Grajkowski /* Clear the associated interrupt */
264*78ee8d1cSJulian Grajkowski ADF_CSR_WR(csr, slice_hang_offset, slice_hang);
265*78ee8d1cSJulian Grajkowski
266*78ee8d1cSJulian Grajkowski return true;
267*78ee8d1cSJulian Grajkowski }
268*78ee8d1cSJulian Grajkowski
269*78ee8d1cSJulian Grajkowski /**
270*78ee8d1cSJulian Grajkowski * adf_check_slice_hang() - Check slice hang status
271*78ee8d1cSJulian Grajkowski *
272*78ee8d1cSJulian Grajkowski * Return: true if a slice hange interrupt is serviced..
273*78ee8d1cSJulian Grajkowski */
274*78ee8d1cSJulian Grajkowski bool
adf_check_slice_hang(struct adf_accel_dev * accel_dev)275*78ee8d1cSJulian Grajkowski adf_check_slice_hang(struct adf_accel_dev *accel_dev)
276*78ee8d1cSJulian Grajkowski {
277*78ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_data = accel_dev->hw_device;
278*78ee8d1cSJulian Grajkowski struct adf_bar *misc_bar =
279*78ee8d1cSJulian Grajkowski &GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
280*78ee8d1cSJulian Grajkowski struct resource *csr = misc_bar->virt_addr;
281*78ee8d1cSJulian Grajkowski u32 errsou3 = ADF_CSR_RD(csr, ADF_ERRSOU3);
282*78ee8d1cSJulian Grajkowski u32 errsou5 = ADF_CSR_RD(csr, ADF_ERRSOU5);
283*78ee8d1cSJulian Grajkowski u32 offset;
284*78ee8d1cSJulian Grajkowski u32 accel_num;
285*78ee8d1cSJulian Grajkowski bool handled = false;
286*78ee8d1cSJulian Grajkowski u32 errsou[] = { errsou3, errsou3, errsou5, errsou5, errsou5 };
287*78ee8d1cSJulian Grajkowski u32 mask[] = { ADF_EMSK3_CPM0_MASK,
288*78ee8d1cSJulian Grajkowski ADF_EMSK3_CPM1_MASK,
289*78ee8d1cSJulian Grajkowski ADF_EMSK5_CPM2_MASK,
290*78ee8d1cSJulian Grajkowski ADF_EMSK5_CPM3_MASK,
291*78ee8d1cSJulian Grajkowski ADF_EMSK5_CPM4_MASK };
292*78ee8d1cSJulian Grajkowski unsigned int accel_mask;
293*78ee8d1cSJulian Grajkowski
294*78ee8d1cSJulian Grajkowski for (accel_num = 0, accel_mask = hw_data->accel_mask; accel_mask;
295*78ee8d1cSJulian Grajkowski accel_num++, accel_mask >>= 1) {
296*78ee8d1cSJulian Grajkowski if (!(accel_mask & 1))
297*78ee8d1cSJulian Grajkowski continue;
298*78ee8d1cSJulian Grajkowski if (accel_num >= ARRAY_SIZE(errsou)) {
299*78ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
300*78ee8d1cSJulian Grajkowski "Invalid accel_num %d.\n",
301*78ee8d1cSJulian Grajkowski accel_num);
302*78ee8d1cSJulian Grajkowski break;
303*78ee8d1cSJulian Grajkowski }
304*78ee8d1cSJulian Grajkowski
305*78ee8d1cSJulian Grajkowski if (errsou[accel_num] & mask[accel_num]) {
306*78ee8d1cSJulian Grajkowski if (ADF_CSR_RD(csr, ADF_INTSTATSSM(accel_num)) &
307*78ee8d1cSJulian Grajkowski ADF_INTSTATSSM_SHANGERR) {
308*78ee8d1cSJulian Grajkowski offset = ADF_SLICEHANGSTATUS(accel_num);
309*78ee8d1cSJulian Grajkowski handled |= adf_handle_slice_hang(accel_dev,
310*78ee8d1cSJulian Grajkowski accel_num,
311*78ee8d1cSJulian Grajkowski csr,
312*78ee8d1cSJulian Grajkowski offset);
313*78ee8d1cSJulian Grajkowski }
314*78ee8d1cSJulian Grajkowski }
315*78ee8d1cSJulian Grajkowski }
316*78ee8d1cSJulian Grajkowski
317*78ee8d1cSJulian Grajkowski return handled;
318*78ee8d1cSJulian Grajkowski }
319