xref: /linux/drivers/crypto/intel/qat/qat_common/adf_gen6_ras.c (revision 14418ddcc2c2055743ac7ee53d5ac2cf8a8660a7)
1*7f3401d0SSuman Kumar Chakraborty // SPDX-License-Identifier: GPL-2.0-only
2*7f3401d0SSuman Kumar Chakraborty /* Copyright(c) 2025 Intel Corporation */
3*7f3401d0SSuman Kumar Chakraborty #include <linux/bitfield.h>
4*7f3401d0SSuman Kumar Chakraborty #include <linux/types.h>
5*7f3401d0SSuman Kumar Chakraborty 
6*7f3401d0SSuman Kumar Chakraborty #include "adf_common_drv.h"
7*7f3401d0SSuman Kumar Chakraborty #include "adf_gen6_ras.h"
8*7f3401d0SSuman Kumar Chakraborty #include "adf_sysfs_ras_counters.h"
9*7f3401d0SSuman Kumar Chakraborty 
10*7f3401d0SSuman Kumar Chakraborty static void enable_errsou_reporting(void __iomem *csr)
11*7f3401d0SSuman Kumar Chakraborty {
12*7f3401d0SSuman Kumar Chakraborty 	/* Enable correctable error reporting in ERRSOU0 */
13*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_ERRMSK0, 0);
14*7f3401d0SSuman Kumar Chakraborty 
15*7f3401d0SSuman Kumar Chakraborty 	/* Enable uncorrectable error reporting in ERRSOU1 */
16*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_ERRMSK1, 0);
17*7f3401d0SSuman Kumar Chakraborty 
18*7f3401d0SSuman Kumar Chakraborty 	/*
19*7f3401d0SSuman Kumar Chakraborty 	 * Enable uncorrectable error reporting in ERRSOU2
20*7f3401d0SSuman Kumar Chakraborty 	 * but disable PM interrupt by default
21*7f3401d0SSuman Kumar Chakraborty 	 */
22*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_ERRMSK2, ADF_GEN6_ERRSOU2_PM_INT_BIT);
23*7f3401d0SSuman Kumar Chakraborty 
24*7f3401d0SSuman Kumar Chakraborty 	/* Enable uncorrectable error reporting in ERRSOU3 */
25*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_ERRMSK3, 0);
26*7f3401d0SSuman Kumar Chakraborty }
27*7f3401d0SSuman Kumar Chakraborty 
28*7f3401d0SSuman Kumar Chakraborty static void enable_ae_error_reporting(struct adf_accel_dev *accel_dev, void __iomem *csr)
29*7f3401d0SSuman Kumar Chakraborty {
30*7f3401d0SSuman Kumar Chakraborty 	u32 ae_mask = GET_HW_DATA(accel_dev)->ae_mask;
31*7f3401d0SSuman Kumar Chakraborty 
32*7f3401d0SSuman Kumar Chakraborty 	/* Enable acceleration engine correctable error reporting */
33*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_HIAECORERRLOGENABLE_CPP0, ae_mask);
34*7f3401d0SSuman Kumar Chakraborty 
35*7f3401d0SSuman Kumar Chakraborty 	/* Enable acceleration engine uncorrectable error reporting */
36*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_HIAEUNCERRLOGENABLE_CPP0, ae_mask);
37*7f3401d0SSuman Kumar Chakraborty }
38*7f3401d0SSuman Kumar Chakraborty 
39*7f3401d0SSuman Kumar Chakraborty static void enable_cpp_error_reporting(struct adf_accel_dev *accel_dev, void __iomem *csr)
40*7f3401d0SSuman Kumar Chakraborty {
41*7f3401d0SSuman Kumar Chakraborty 	/* Enable HI CPP agents command parity error reporting */
42*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_HICPPAGENTCMDPARERRLOGENABLE,
43*7f3401d0SSuman Kumar Chakraborty 		   ADF_6XXX_HICPPAGENTCMDPARERRLOG_MASK);
44*7f3401d0SSuman Kumar Chakraborty 
45*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_CPP_CFC_ERR_CTRL, ADF_GEN6_CPP_CFC_ERR_CTRL_MASK);
46*7f3401d0SSuman Kumar Chakraborty }
47*7f3401d0SSuman Kumar Chakraborty 
48*7f3401d0SSuman Kumar Chakraborty static void enable_ti_ri_error_reporting(void __iomem *csr)
49*7f3401d0SSuman Kumar Chakraborty {
50*7f3401d0SSuman Kumar Chakraborty 	u32 reg, mask;
51*7f3401d0SSuman Kumar Chakraborty 
52*7f3401d0SSuman Kumar Chakraborty 	/* Enable RI memory error reporting */
53*7f3401d0SSuman Kumar Chakraborty 	mask = ADF_GEN6_RIMEM_PARERR_FATAL_MASK | ADF_GEN6_RIMEM_PARERR_CERR_MASK;
54*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_RI_MEM_PAR_ERR_EN0, mask);
55*7f3401d0SSuman Kumar Chakraborty 
56*7f3401d0SSuman Kumar Chakraborty 	/* Enable IOSF primary command parity error reporting */
57*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_RIMISCCTL, ADF_GEN6_RIMISCSTS_BIT);
58*7f3401d0SSuman Kumar Chakraborty 
59*7f3401d0SSuman Kumar Chakraborty 	/* Enable TI internal memory parity error reporting */
60*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_TI_CI_PAR_ERR_MASK);
61*7f3401d0SSuman Kumar Chakraborty 	reg &= ~ADF_GEN6_TI_CI_PAR_STS_MASK;
62*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_CI_PAR_ERR_MASK, reg);
63*7f3401d0SSuman Kumar Chakraborty 
64*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_TI_PULL0FUB_PAR_ERR_MASK);
65*7f3401d0SSuman Kumar Chakraborty 	reg &= ~ADF_GEN6_TI_PULL0FUB_PAR_STS_MASK;
66*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_PULL0FUB_PAR_ERR_MASK, reg);
67*7f3401d0SSuman Kumar Chakraborty 
68*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_TI_PUSHFUB_PAR_ERR_MASK);
69*7f3401d0SSuman Kumar Chakraborty 	reg &= ~ADF_GEN6_TI_PUSHFUB_PAR_STS_MASK;
70*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_PUSHFUB_PAR_ERR_MASK, reg);
71*7f3401d0SSuman Kumar Chakraborty 
72*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_TI_CD_PAR_ERR_MASK);
73*7f3401d0SSuman Kumar Chakraborty 	reg &= ~ADF_GEN6_TI_CD_PAR_STS_MASK;
74*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_CD_PAR_ERR_MASK, reg);
75*7f3401d0SSuman Kumar Chakraborty 
76*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_TI_TRNSB_PAR_ERR_MASK);
77*7f3401d0SSuman Kumar Chakraborty 	reg &= ~ADF_GEN6_TI_TRNSB_PAR_STS_MASK;
78*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_TRNSB_PAR_ERR_MASK, reg);
79*7f3401d0SSuman Kumar Chakraborty 
80*7f3401d0SSuman Kumar Chakraborty 	/* Enable error handling in RI, TI CPP interface control registers */
81*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_RICPPINTCTL, ADF_GEN6_RICPPINTCTL_MASK);
82*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TICPPINTCTL, ADF_GEN6_TICPPINTCTL_MASK);
83*7f3401d0SSuman Kumar Chakraborty 
84*7f3401d0SSuman Kumar Chakraborty 	/*
85*7f3401d0SSuman Kumar Chakraborty 	 * Enable error detection and reporting in TIMISCSTS
86*7f3401d0SSuman Kumar Chakraborty 	 * with bits 1, 2 and 30 value preserved
87*7f3401d0SSuman Kumar Chakraborty 	 */
88*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_TIMISCCTL);
89*7f3401d0SSuman Kumar Chakraborty 	reg &= ADF_GEN6_TIMSCCTL_RELAY_MASK;
90*7f3401d0SSuman Kumar Chakraborty 	reg |= ADF_GEN6_TIMISCCTL_BIT;
91*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TIMISCCTL, reg);
92*7f3401d0SSuman Kumar Chakraborty }
93*7f3401d0SSuman Kumar Chakraborty 
94*7f3401d0SSuman Kumar Chakraborty static void enable_ssm_error_reporting(struct adf_accel_dev *accel_dev,
95*7f3401d0SSuman Kumar Chakraborty 				       void __iomem *csr)
96*7f3401d0SSuman Kumar Chakraborty {
97*7f3401d0SSuman Kumar Chakraborty 	/* Enable SSM interrupts */
98*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_INTMASKSSM, 0);
99*7f3401d0SSuman Kumar Chakraborty }
100*7f3401d0SSuman Kumar Chakraborty 
101*7f3401d0SSuman Kumar Chakraborty static void adf_gen6_enable_ras(struct adf_accel_dev *accel_dev)
102*7f3401d0SSuman Kumar Chakraborty {
103*7f3401d0SSuman Kumar Chakraborty 	void __iomem *csr = adf_get_pmisc_base(accel_dev);
104*7f3401d0SSuman Kumar Chakraborty 
105*7f3401d0SSuman Kumar Chakraborty 	enable_errsou_reporting(csr);
106*7f3401d0SSuman Kumar Chakraborty 	enable_ae_error_reporting(accel_dev, csr);
107*7f3401d0SSuman Kumar Chakraborty 	enable_cpp_error_reporting(accel_dev, csr);
108*7f3401d0SSuman Kumar Chakraborty 	enable_ti_ri_error_reporting(csr);
109*7f3401d0SSuman Kumar Chakraborty 	enable_ssm_error_reporting(accel_dev, csr);
110*7f3401d0SSuman Kumar Chakraborty }
111*7f3401d0SSuman Kumar Chakraborty 
112*7f3401d0SSuman Kumar Chakraborty static void disable_errsou_reporting(void __iomem *csr)
113*7f3401d0SSuman Kumar Chakraborty {
114*7f3401d0SSuman Kumar Chakraborty 	u32 val;
115*7f3401d0SSuman Kumar Chakraborty 
116*7f3401d0SSuman Kumar Chakraborty 	/* Disable correctable error reporting in ERRSOU0 */
117*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_ERRMSK0, ADF_GEN6_ERRSOU0_MASK);
118*7f3401d0SSuman Kumar Chakraborty 
119*7f3401d0SSuman Kumar Chakraborty 	/* Disable uncorrectable error reporting in ERRSOU1 */
120*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_ERRMSK1, ADF_GEN6_ERRMSK1_MASK);
121*7f3401d0SSuman Kumar Chakraborty 
122*7f3401d0SSuman Kumar Chakraborty 	/* Disable uncorrectable error reporting in ERRSOU2 */
123*7f3401d0SSuman Kumar Chakraborty 	val = ADF_CSR_RD(csr, ADF_GEN6_ERRMSK2);
124*7f3401d0SSuman Kumar Chakraborty 	val |= ADF_GEN6_ERRSOU2_DIS_MASK;
125*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_ERRMSK2, val);
126*7f3401d0SSuman Kumar Chakraborty 
127*7f3401d0SSuman Kumar Chakraborty 	/* Disable uncorrectable error reporting in ERRSOU3 */
128*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_ERRMSK3, ADF_GEN6_ERRSOU3_DIS_MASK);
129*7f3401d0SSuman Kumar Chakraborty }
130*7f3401d0SSuman Kumar Chakraborty 
131*7f3401d0SSuman Kumar Chakraborty static void disable_ae_error_reporting(void __iomem *csr)
132*7f3401d0SSuman Kumar Chakraborty {
133*7f3401d0SSuman Kumar Chakraborty 	/* Disable acceleration engine correctable error reporting */
134*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_HIAECORERRLOGENABLE_CPP0, 0);
135*7f3401d0SSuman Kumar Chakraborty 
136*7f3401d0SSuman Kumar Chakraborty 	/* Disable acceleration engine uncorrectable error reporting */
137*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_HIAEUNCERRLOGENABLE_CPP0, 0);
138*7f3401d0SSuman Kumar Chakraborty }
139*7f3401d0SSuman Kumar Chakraborty 
140*7f3401d0SSuman Kumar Chakraborty static void disable_cpp_error_reporting(void __iomem *csr)
141*7f3401d0SSuman Kumar Chakraborty {
142*7f3401d0SSuman Kumar Chakraborty 	/* Disable HI CPP agents command parity error reporting */
143*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_HICPPAGENTCMDPARERRLOGENABLE, 0);
144*7f3401d0SSuman Kumar Chakraborty 
145*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_CPP_CFC_ERR_CTRL, ADF_GEN6_CPP_CFC_ERR_CTRL_DIS_MASK);
146*7f3401d0SSuman Kumar Chakraborty }
147*7f3401d0SSuman Kumar Chakraborty 
148*7f3401d0SSuman Kumar Chakraborty static void disable_ti_ri_error_reporting(void __iomem *csr)
149*7f3401d0SSuman Kumar Chakraborty {
150*7f3401d0SSuman Kumar Chakraborty 	u32 reg;
151*7f3401d0SSuman Kumar Chakraborty 
152*7f3401d0SSuman Kumar Chakraborty 	/* Disable RI memory error reporting */
153*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_RI_MEM_PAR_ERR_EN0, 0);
154*7f3401d0SSuman Kumar Chakraborty 
155*7f3401d0SSuman Kumar Chakraborty 	/* Disable IOSF primary command parity error reporting */
156*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_RIMISCCTL);
157*7f3401d0SSuman Kumar Chakraborty 	reg &= ~ADF_GEN6_RIMISCSTS_BIT;
158*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_RIMISCCTL, reg);
159*7f3401d0SSuman Kumar Chakraborty 
160*7f3401d0SSuman Kumar Chakraborty 	/* Disable TI internal memory parity error reporting */
161*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_CI_PAR_ERR_MASK, ADF_GEN6_TI_CI_PAR_STS_MASK);
162*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_PULL0FUB_PAR_ERR_MASK, ADF_GEN6_TI_PULL0FUB_PAR_STS_MASK);
163*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_PUSHFUB_PAR_ERR_MASK, ADF_GEN6_TI_PUSHFUB_PAR_STS_MASK);
164*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_CD_PAR_ERR_MASK, ADF_GEN6_TI_CD_PAR_STS_MASK);
165*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TI_TRNSB_PAR_ERR_MASK, ADF_GEN6_TI_TRNSB_PAR_STS_MASK);
166*7f3401d0SSuman Kumar Chakraborty 
167*7f3401d0SSuman Kumar Chakraborty 	/* Disable error handling in RI, TI CPP interface control registers */
168*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_RICPPINTCTL);
169*7f3401d0SSuman Kumar Chakraborty 	reg &= ~ADF_GEN6_RICPPINTCTL_MASK;
170*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_RICPPINTCTL, reg);
171*7f3401d0SSuman Kumar Chakraborty 
172*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_TICPPINTCTL);
173*7f3401d0SSuman Kumar Chakraborty 	reg &= ~ADF_GEN6_TICPPINTCTL_MASK;
174*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TICPPINTCTL, reg);
175*7f3401d0SSuman Kumar Chakraborty 
176*7f3401d0SSuman Kumar Chakraborty 	/*
177*7f3401d0SSuman Kumar Chakraborty 	 * Disable error detection and reporting in TIMISCSTS
178*7f3401d0SSuman Kumar Chakraborty 	 * with bits 1, 2 and 30 value preserved
179*7f3401d0SSuman Kumar Chakraborty 	 */
180*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_TIMISCCTL);
181*7f3401d0SSuman Kumar Chakraborty 	reg &= ADF_GEN6_TIMSCCTL_RELAY_MASK;
182*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_TIMISCCTL, reg);
183*7f3401d0SSuman Kumar Chakraborty }
184*7f3401d0SSuman Kumar Chakraborty 
185*7f3401d0SSuman Kumar Chakraborty static void disable_ssm_error_reporting(void __iomem *csr)
186*7f3401d0SSuman Kumar Chakraborty {
187*7f3401d0SSuman Kumar Chakraborty 	/* Disable SSM interrupts */
188*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_INTMASKSSM, ADF_GEN6_INTMASKSSM_MASK);
189*7f3401d0SSuman Kumar Chakraborty }
190*7f3401d0SSuman Kumar Chakraborty 
191*7f3401d0SSuman Kumar Chakraborty static void adf_gen6_disable_ras(struct adf_accel_dev *accel_dev)
192*7f3401d0SSuman Kumar Chakraborty {
193*7f3401d0SSuman Kumar Chakraborty 	void __iomem *csr = adf_get_pmisc_base(accel_dev);
194*7f3401d0SSuman Kumar Chakraborty 
195*7f3401d0SSuman Kumar Chakraborty 	disable_errsou_reporting(csr);
196*7f3401d0SSuman Kumar Chakraborty 	disable_ae_error_reporting(csr);
197*7f3401d0SSuman Kumar Chakraborty 	disable_cpp_error_reporting(csr);
198*7f3401d0SSuman Kumar Chakraborty 	disable_ti_ri_error_reporting(csr);
199*7f3401d0SSuman Kumar Chakraborty 	disable_ssm_error_reporting(csr);
200*7f3401d0SSuman Kumar Chakraborty }
201*7f3401d0SSuman Kumar Chakraborty 
202*7f3401d0SSuman Kumar Chakraborty static void adf_gen6_process_errsou0(struct adf_accel_dev *accel_dev, void __iomem *csr)
203*7f3401d0SSuman Kumar Chakraborty {
204*7f3401d0SSuman Kumar Chakraborty 	u32 ae, errsou;
205*7f3401d0SSuman Kumar Chakraborty 
206*7f3401d0SSuman Kumar Chakraborty 	ae = ADF_CSR_RD(csr, ADF_GEN6_HIAECORERRLOG_CPP0);
207*7f3401d0SSuman Kumar Chakraborty 	ae &= GET_HW_DATA(accel_dev)->ae_mask;
208*7f3401d0SSuman Kumar Chakraborty 
209*7f3401d0SSuman Kumar Chakraborty 	dev_warn(&GET_DEV(accel_dev), "Correctable error detected: %#x\n", ae);
210*7f3401d0SSuman Kumar Chakraborty 
211*7f3401d0SSuman Kumar Chakraborty 	ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_CORR);
212*7f3401d0SSuman Kumar Chakraborty 
213*7f3401d0SSuman Kumar Chakraborty 	/* Clear interrupt from ERRSOU0 */
214*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_HIAECORERRLOG_CPP0, ae);
215*7f3401d0SSuman Kumar Chakraborty 
216*7f3401d0SSuman Kumar Chakraborty 	errsou = ADF_CSR_RD(csr, ADF_GEN6_ERRSOU0);
217*7f3401d0SSuman Kumar Chakraborty 	if (errsou & ADF_GEN6_ERRSOU0_MASK)
218*7f3401d0SSuman Kumar Chakraborty 		dev_warn(&GET_DEV(accel_dev), "errsou0 still set: %#x\n", errsou);
219*7f3401d0SSuman Kumar Chakraborty }
220*7f3401d0SSuman Kumar Chakraborty 
221*7f3401d0SSuman Kumar Chakraborty static void adf_handle_cpp_ae_unc(struct adf_accel_dev *accel_dev, void __iomem *csr,
222*7f3401d0SSuman Kumar Chakraborty 				  u32 errsou)
223*7f3401d0SSuman Kumar Chakraborty {
224*7f3401d0SSuman Kumar Chakraborty 	u32 ae;
225*7f3401d0SSuman Kumar Chakraborty 
226*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU1_CPP0_MEUNC_BIT))
227*7f3401d0SSuman Kumar Chakraborty 		return;
228*7f3401d0SSuman Kumar Chakraborty 
229*7f3401d0SSuman Kumar Chakraborty 	ae = ADF_CSR_RD(csr, ADF_GEN6_HIAEUNCERRLOG_CPP0);
230*7f3401d0SSuman Kumar Chakraborty 	ae &= GET_HW_DATA(accel_dev)->ae_mask;
231*7f3401d0SSuman Kumar Chakraborty 	if (ae) {
232*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "Uncorrectable error detected: %#x\n", ae);
233*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
234*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_HIAEUNCERRLOG_CPP0, ae);
235*7f3401d0SSuman Kumar Chakraborty 	}
236*7f3401d0SSuman Kumar Chakraborty }
237*7f3401d0SSuman Kumar Chakraborty 
238*7f3401d0SSuman Kumar Chakraborty static void adf_handle_cpp_cmd_par_err(struct adf_accel_dev *accel_dev, void __iomem *csr,
239*7f3401d0SSuman Kumar Chakraborty 				       u32 errsou)
240*7f3401d0SSuman Kumar Chakraborty {
241*7f3401d0SSuman Kumar Chakraborty 	u32 cmd_par_err;
242*7f3401d0SSuman Kumar Chakraborty 
243*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU1_CPP_CMDPARERR_BIT))
244*7f3401d0SSuman Kumar Chakraborty 		return;
245*7f3401d0SSuman Kumar Chakraborty 
246*7f3401d0SSuman Kumar Chakraborty 	cmd_par_err = ADF_CSR_RD(csr, ADF_GEN6_HICPPAGENTCMDPARERRLOG);
247*7f3401d0SSuman Kumar Chakraborty 	cmd_par_err &= ADF_6XXX_HICPPAGENTCMDPARERRLOG_MASK;
248*7f3401d0SSuman Kumar Chakraborty 	if (cmd_par_err) {
249*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "HI CPP agent command parity error: %#x\n",
250*7f3401d0SSuman Kumar Chakraborty 			cmd_par_err);
251*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
252*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_HICPPAGENTCMDPARERRLOG, cmd_par_err);
253*7f3401d0SSuman Kumar Chakraborty 	}
254*7f3401d0SSuman Kumar Chakraborty }
255*7f3401d0SSuman Kumar Chakraborty 
256*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ri_mem_par_err(struct adf_accel_dev *accel_dev, void __iomem *csr,
257*7f3401d0SSuman Kumar Chakraborty 				      u32 errsou)
258*7f3401d0SSuman Kumar Chakraborty {
259*7f3401d0SSuman Kumar Chakraborty 	u32 rimem_parerr_sts;
260*7f3401d0SSuman Kumar Chakraborty 
261*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU1_RIMEM_PARERR_STS_BIT))
262*7f3401d0SSuman Kumar Chakraborty 		return;
263*7f3401d0SSuman Kumar Chakraborty 
264*7f3401d0SSuman Kumar Chakraborty 	rimem_parerr_sts = ADF_CSR_RD(csr, ADF_GEN6_RIMEM_PARERR_STS);
265*7f3401d0SSuman Kumar Chakraborty 	rimem_parerr_sts &= ADF_GEN6_RIMEM_PARERR_CERR_MASK |
266*7f3401d0SSuman Kumar Chakraborty 			    ADF_GEN6_RIMEM_PARERR_FATAL_MASK;
267*7f3401d0SSuman Kumar Chakraborty 	if (rimem_parerr_sts & ADF_GEN6_RIMEM_PARERR_CERR_MASK) {
268*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "RI memory parity correctable error: %#x\n",
269*7f3401d0SSuman Kumar Chakraborty 			rimem_parerr_sts);
270*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_CORR);
271*7f3401d0SSuman Kumar Chakraborty 	}
272*7f3401d0SSuman Kumar Chakraborty 
273*7f3401d0SSuman Kumar Chakraborty 	if (rimem_parerr_sts & ADF_GEN6_RIMEM_PARERR_FATAL_MASK) {
274*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "RI memory parity fatal error: %#x\n",
275*7f3401d0SSuman Kumar Chakraborty 			rimem_parerr_sts);
276*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
277*7f3401d0SSuman Kumar Chakraborty 	}
278*7f3401d0SSuman Kumar Chakraborty 
279*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_RIMEM_PARERR_STS, rimem_parerr_sts);
280*7f3401d0SSuman Kumar Chakraborty }
281*7f3401d0SSuman Kumar Chakraborty 
282*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ti_ci_par_sts(struct adf_accel_dev *accel_dev, void __iomem *csr)
283*7f3401d0SSuman Kumar Chakraborty {
284*7f3401d0SSuman Kumar Chakraborty 	u32 ti_ci_par_sts;
285*7f3401d0SSuman Kumar Chakraborty 
286*7f3401d0SSuman Kumar Chakraborty 	ti_ci_par_sts = ADF_CSR_RD(csr, ADF_GEN6_TI_CI_PAR_STS);
287*7f3401d0SSuman Kumar Chakraborty 	ti_ci_par_sts &= ADF_GEN6_TI_CI_PAR_STS_MASK;
288*7f3401d0SSuman Kumar Chakraborty 	if (ti_ci_par_sts) {
289*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "TI memory parity error: %#x\n", ti_ci_par_sts);
290*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_TI_CI_PAR_STS, ti_ci_par_sts);
291*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
292*7f3401d0SSuman Kumar Chakraborty 	}
293*7f3401d0SSuman Kumar Chakraborty }
294*7f3401d0SSuman Kumar Chakraborty 
295*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ti_pullfub_par_sts(struct adf_accel_dev *accel_dev, void __iomem *csr)
296*7f3401d0SSuman Kumar Chakraborty {
297*7f3401d0SSuman Kumar Chakraborty 	u32 ti_pullfub_par_sts;
298*7f3401d0SSuman Kumar Chakraborty 
299*7f3401d0SSuman Kumar Chakraborty 	ti_pullfub_par_sts = ADF_CSR_RD(csr, ADF_GEN6_TI_PULL0FUB_PAR_STS);
300*7f3401d0SSuman Kumar Chakraborty 	ti_pullfub_par_sts &= ADF_GEN6_TI_PULL0FUB_PAR_STS_MASK;
301*7f3401d0SSuman Kumar Chakraborty 	if (ti_pullfub_par_sts) {
302*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "TI pull parity error: %#x\n", ti_pullfub_par_sts);
303*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_TI_PULL0FUB_PAR_STS, ti_pullfub_par_sts);
304*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
305*7f3401d0SSuman Kumar Chakraborty 	}
306*7f3401d0SSuman Kumar Chakraborty }
307*7f3401d0SSuman Kumar Chakraborty 
308*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ti_pushfub_par_sts(struct adf_accel_dev *accel_dev, void __iomem *csr)
309*7f3401d0SSuman Kumar Chakraborty {
310*7f3401d0SSuman Kumar Chakraborty 	u32 ti_pushfub_par_sts;
311*7f3401d0SSuman Kumar Chakraborty 
312*7f3401d0SSuman Kumar Chakraborty 	ti_pushfub_par_sts = ADF_CSR_RD(csr, ADF_GEN6_TI_PUSHFUB_PAR_STS);
313*7f3401d0SSuman Kumar Chakraborty 	ti_pushfub_par_sts &= ADF_GEN6_TI_PUSHFUB_PAR_STS_MASK;
314*7f3401d0SSuman Kumar Chakraborty 	if (ti_pushfub_par_sts) {
315*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "TI push parity error: %#x\n", ti_pushfub_par_sts);
316*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
317*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_TI_PUSHFUB_PAR_STS, ti_pushfub_par_sts);
318*7f3401d0SSuman Kumar Chakraborty 	}
319*7f3401d0SSuman Kumar Chakraborty }
320*7f3401d0SSuman Kumar Chakraborty 
321*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ti_cd_par_sts(struct adf_accel_dev *accel_dev, void __iomem *csr)
322*7f3401d0SSuman Kumar Chakraborty {
323*7f3401d0SSuman Kumar Chakraborty 	u32 ti_cd_par_sts;
324*7f3401d0SSuman Kumar Chakraborty 
325*7f3401d0SSuman Kumar Chakraborty 	ti_cd_par_sts = ADF_CSR_RD(csr, ADF_GEN6_TI_CD_PAR_STS);
326*7f3401d0SSuman Kumar Chakraborty 	ti_cd_par_sts &= ADF_GEN6_TI_CD_PAR_STS_MASK;
327*7f3401d0SSuman Kumar Chakraborty 	if (ti_cd_par_sts) {
328*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "TI CD parity error: %#x\n", ti_cd_par_sts);
329*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
330*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_TI_CD_PAR_STS, ti_cd_par_sts);
331*7f3401d0SSuman Kumar Chakraborty 	}
332*7f3401d0SSuman Kumar Chakraborty }
333*7f3401d0SSuman Kumar Chakraborty 
334*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ti_trnsb_par_sts(struct adf_accel_dev *accel_dev, void __iomem *csr)
335*7f3401d0SSuman Kumar Chakraborty {
336*7f3401d0SSuman Kumar Chakraborty 	u32 ti_trnsb_par_sts;
337*7f3401d0SSuman Kumar Chakraborty 
338*7f3401d0SSuman Kumar Chakraborty 	ti_trnsb_par_sts = ADF_CSR_RD(csr, ADF_GEN6_TI_TRNSB_PAR_STS);
339*7f3401d0SSuman Kumar Chakraborty 	ti_trnsb_par_sts &= ADF_GEN6_TI_TRNSB_PAR_STS_MASK;
340*7f3401d0SSuman Kumar Chakraborty 	if (ti_trnsb_par_sts) {
341*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "TI TRNSB parity error: %#x\n", ti_trnsb_par_sts);
342*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
343*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_TI_TRNSB_PAR_STS, ti_trnsb_par_sts);
344*7f3401d0SSuman Kumar Chakraborty 	}
345*7f3401d0SSuman Kumar Chakraborty }
346*7f3401d0SSuman Kumar Chakraborty 
347*7f3401d0SSuman Kumar Chakraborty static void adf_handle_iosfp_cmd_parerr(struct adf_accel_dev *accel_dev, void __iomem *csr)
348*7f3401d0SSuman Kumar Chakraborty {
349*7f3401d0SSuman Kumar Chakraborty 	u32 rimiscsts;
350*7f3401d0SSuman Kumar Chakraborty 
351*7f3401d0SSuman Kumar Chakraborty 	rimiscsts = ADF_CSR_RD(csr, ADF_GEN6_RIMISCSTS);
352*7f3401d0SSuman Kumar Chakraborty 	rimiscsts &= ADF_GEN6_RIMISCSTS_BIT;
353*7f3401d0SSuman Kumar Chakraborty 	if (rimiscsts) {
354*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "Command parity error detected on IOSFP: %#x\n",
355*7f3401d0SSuman Kumar Chakraborty 			rimiscsts);
356*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
357*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_RIMISCSTS, rimiscsts);
358*7f3401d0SSuman Kumar Chakraborty 	}
359*7f3401d0SSuman Kumar Chakraborty }
360*7f3401d0SSuman Kumar Chakraborty 
361*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ti_err(struct adf_accel_dev *accel_dev, void __iomem *csr,
362*7f3401d0SSuman Kumar Chakraborty 			      u32 errsou)
363*7f3401d0SSuman Kumar Chakraborty {
364*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU1_TIMEM_PARERR_STS_BIT))
365*7f3401d0SSuman Kumar Chakraborty 		return;
366*7f3401d0SSuman Kumar Chakraborty 
367*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ti_ci_par_sts(accel_dev, csr);
368*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ti_pullfub_par_sts(accel_dev, csr);
369*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ti_pushfub_par_sts(accel_dev, csr);
370*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ti_cd_par_sts(accel_dev, csr);
371*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ti_trnsb_par_sts(accel_dev, csr);
372*7f3401d0SSuman Kumar Chakraborty 	adf_handle_iosfp_cmd_parerr(accel_dev, csr);
373*7f3401d0SSuman Kumar Chakraborty }
374*7f3401d0SSuman Kumar Chakraborty 
375*7f3401d0SSuman Kumar Chakraborty static void adf_handle_sfi_cmd_parerr(struct adf_accel_dev *accel_dev, void __iomem *csr,
376*7f3401d0SSuman Kumar Chakraborty 				      u32 errsou)
377*7f3401d0SSuman Kumar Chakraborty {
378*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU1_SFICMD_PARERR_BIT))
379*7f3401d0SSuman Kumar Chakraborty 		return;
380*7f3401d0SSuman Kumar Chakraborty 
381*7f3401d0SSuman Kumar Chakraborty 	dev_err(&GET_DEV(accel_dev),
382*7f3401d0SSuman Kumar Chakraborty 		"Command parity error detected on streaming fabric interface\n");
383*7f3401d0SSuman Kumar Chakraborty 
384*7f3401d0SSuman Kumar Chakraborty 	ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
385*7f3401d0SSuman Kumar Chakraborty }
386*7f3401d0SSuman Kumar Chakraborty 
387*7f3401d0SSuman Kumar Chakraborty static void adf_gen6_process_errsou1(struct adf_accel_dev *accel_dev, void __iomem *csr,
388*7f3401d0SSuman Kumar Chakraborty 				     u32 errsou)
389*7f3401d0SSuman Kumar Chakraborty {
390*7f3401d0SSuman Kumar Chakraborty 	adf_handle_cpp_ae_unc(accel_dev, csr, errsou);
391*7f3401d0SSuman Kumar Chakraborty 	adf_handle_cpp_cmd_par_err(accel_dev, csr, errsou);
392*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ri_mem_par_err(accel_dev, csr, errsou);
393*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ti_err(accel_dev, csr, errsou);
394*7f3401d0SSuman Kumar Chakraborty 	adf_handle_sfi_cmd_parerr(accel_dev, csr, errsou);
395*7f3401d0SSuman Kumar Chakraborty 
396*7f3401d0SSuman Kumar Chakraborty 	errsou = ADF_CSR_RD(csr, ADF_GEN6_ERRSOU1);
397*7f3401d0SSuman Kumar Chakraborty 	if (errsou & ADF_GEN6_ERRSOU1_MASK)
398*7f3401d0SSuman Kumar Chakraborty 		dev_warn(&GET_DEV(accel_dev), "errsou1 still set: %#x\n", errsou);
399*7f3401d0SSuman Kumar Chakraborty }
400*7f3401d0SSuman Kumar Chakraborty 
401*7f3401d0SSuman Kumar Chakraborty static void adf_handle_cerrssmsh(struct adf_accel_dev *accel_dev, void __iomem *csr)
402*7f3401d0SSuman Kumar Chakraborty {
403*7f3401d0SSuman Kumar Chakraborty 	u32 reg;
404*7f3401d0SSuman Kumar Chakraborty 
405*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_CERRSSMSH);
406*7f3401d0SSuman Kumar Chakraborty 	reg &= ADF_GEN6_CERRSSMSH_ERROR_BIT;
407*7f3401d0SSuman Kumar Chakraborty 	if (reg) {
408*7f3401d0SSuman Kumar Chakraborty 		dev_warn(&GET_DEV(accel_dev),
409*7f3401d0SSuman Kumar Chakraborty 			 "Correctable error on ssm shared memory: %#x\n", reg);
410*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_CORR);
411*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_CERRSSMSH, reg);
412*7f3401d0SSuman Kumar Chakraborty 	}
413*7f3401d0SSuman Kumar Chakraborty }
414*7f3401d0SSuman Kumar Chakraborty 
415*7f3401d0SSuman Kumar Chakraborty static void adf_handle_uerrssmsh(struct adf_accel_dev *accel_dev, void __iomem *csr,
416*7f3401d0SSuman Kumar Chakraborty 				 u32 iastatssm)
417*7f3401d0SSuman Kumar Chakraborty {
418*7f3401d0SSuman Kumar Chakraborty 	u32 reg;
419*7f3401d0SSuman Kumar Chakraborty 
420*7f3401d0SSuman Kumar Chakraborty 	if (!(iastatssm & ADF_GEN6_IAINTSTATSSM_SH_ERR_BIT))
421*7f3401d0SSuman Kumar Chakraborty 		return;
422*7f3401d0SSuman Kumar Chakraborty 
423*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_UERRSSMSH);
424*7f3401d0SSuman Kumar Chakraborty 	reg &= ADF_GEN6_UERRSSMSH_MASK;
425*7f3401d0SSuman Kumar Chakraborty 	if (reg) {
426*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev),
427*7f3401d0SSuman Kumar Chakraborty 			"Fatal error on ssm shared memory: %#x\n", reg);
428*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
429*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_UERRSSMSH, reg);
430*7f3401d0SSuman Kumar Chakraborty 	}
431*7f3401d0SSuman Kumar Chakraborty }
432*7f3401d0SSuman Kumar Chakraborty 
433*7f3401d0SSuman Kumar Chakraborty static void adf_handle_pperr_err(struct adf_accel_dev *accel_dev, void __iomem *csr,
434*7f3401d0SSuman Kumar Chakraborty 				 u32 iastatssm)
435*7f3401d0SSuman Kumar Chakraborty {
436*7f3401d0SSuman Kumar Chakraborty 	u32 reg;
437*7f3401d0SSuman Kumar Chakraborty 
438*7f3401d0SSuman Kumar Chakraborty 	if (!(iastatssm & ADF_GEN6_IAINTSTATSSM_PPERR_BIT))
439*7f3401d0SSuman Kumar Chakraborty 		return;
440*7f3401d0SSuman Kumar Chakraborty 
441*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_PPERR);
442*7f3401d0SSuman Kumar Chakraborty 	reg &= ADF_GEN6_PPERR_MASK;
443*7f3401d0SSuman Kumar Chakraborty 	if (reg) {
444*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev),
445*7f3401d0SSuman Kumar Chakraborty 			"Fatal push or pull data error: %#x\n", reg);
446*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
447*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_PPERR, reg);
448*7f3401d0SSuman Kumar Chakraborty 	}
449*7f3401d0SSuman Kumar Chakraborty }
450*7f3401d0SSuman Kumar Chakraborty 
451*7f3401d0SSuman Kumar Chakraborty static void adf_handle_scmpar_err(struct adf_accel_dev *accel_dev, void __iomem *csr,
452*7f3401d0SSuman Kumar Chakraborty 				  u32 iastatssm)
453*7f3401d0SSuman Kumar Chakraborty {
454*7f3401d0SSuman Kumar Chakraborty 	u32 reg;
455*7f3401d0SSuman Kumar Chakraborty 
456*7f3401d0SSuman Kumar Chakraborty 	if (!(iastatssm & ADF_GEN6_IAINTSTATSSM_SCMPAR_ERR_BIT))
457*7f3401d0SSuman Kumar Chakraborty 		return;
458*7f3401d0SSuman Kumar Chakraborty 
459*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_SSM_FERR_STATUS);
460*7f3401d0SSuman Kumar Chakraborty 	reg &= ADF_GEN6_SCM_PAR_ERR_MASK;
461*7f3401d0SSuman Kumar Chakraborty 	if (reg) {
462*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "Fatal error on SCM: %#x\n", reg);
463*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
464*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_SSM_FERR_STATUS, reg);
465*7f3401d0SSuman Kumar Chakraborty 	}
466*7f3401d0SSuman Kumar Chakraborty }
467*7f3401d0SSuman Kumar Chakraborty 
468*7f3401d0SSuman Kumar Chakraborty static void adf_handle_cpppar_err(struct adf_accel_dev *accel_dev, void __iomem *csr,
469*7f3401d0SSuman Kumar Chakraborty 				  u32 iastatssm)
470*7f3401d0SSuman Kumar Chakraborty {
471*7f3401d0SSuman Kumar Chakraborty 	u32 reg;
472*7f3401d0SSuman Kumar Chakraborty 
473*7f3401d0SSuman Kumar Chakraborty 	if (!(iastatssm & ADF_GEN6_IAINTSTATSSM_CPPPAR_ERR_BIT))
474*7f3401d0SSuman Kumar Chakraborty 		return;
475*7f3401d0SSuman Kumar Chakraborty 
476*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_SSM_FERR_STATUS);
477*7f3401d0SSuman Kumar Chakraborty 	reg &= ADF_GEN6_CPP_PAR_ERR_MASK;
478*7f3401d0SSuman Kumar Chakraborty 	if (reg) {
479*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "Fatal error on CPP: %#x\n", reg);
480*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
481*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_SSM_FERR_STATUS, reg);
482*7f3401d0SSuman Kumar Chakraborty 	}
483*7f3401d0SSuman Kumar Chakraborty }
484*7f3401d0SSuman Kumar Chakraborty 
485*7f3401d0SSuman Kumar Chakraborty static void adf_handle_rfpar_err(struct adf_accel_dev *accel_dev, void __iomem *csr,
486*7f3401d0SSuman Kumar Chakraborty 				 u32 iastatssm)
487*7f3401d0SSuman Kumar Chakraborty {
488*7f3401d0SSuman Kumar Chakraborty 	u32 reg;
489*7f3401d0SSuman Kumar Chakraborty 
490*7f3401d0SSuman Kumar Chakraborty 	if (!(iastatssm & ADF_GEN6_IAINTSTATSSM_RFPAR_ERR_BIT))
491*7f3401d0SSuman Kumar Chakraborty 		return;
492*7f3401d0SSuman Kumar Chakraborty 
493*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_SSM_FERR_STATUS);
494*7f3401d0SSuman Kumar Chakraborty 	reg &= ADF_GEN6_RF_PAR_ERR_MASK;
495*7f3401d0SSuman Kumar Chakraborty 	if (reg) {
496*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "Fatal error on RF Parity: %#x\n", reg);
497*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
498*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_SSM_FERR_STATUS, reg);
499*7f3401d0SSuman Kumar Chakraborty 	}
500*7f3401d0SSuman Kumar Chakraborty }
501*7f3401d0SSuman Kumar Chakraborty 
502*7f3401d0SSuman Kumar Chakraborty static void adf_handle_unexp_cpl_err(struct adf_accel_dev *accel_dev, void __iomem *csr,
503*7f3401d0SSuman Kumar Chakraborty 				     u32 iastatssm)
504*7f3401d0SSuman Kumar Chakraborty {
505*7f3401d0SSuman Kumar Chakraborty 	u32 reg;
506*7f3401d0SSuman Kumar Chakraborty 
507*7f3401d0SSuman Kumar Chakraborty 	if (!(iastatssm & ADF_GEN6_IAINTSTATSSM_UNEXP_CPL_ERR_BIT))
508*7f3401d0SSuman Kumar Chakraborty 		return;
509*7f3401d0SSuman Kumar Chakraborty 
510*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_SSM_FERR_STATUS);
511*7f3401d0SSuman Kumar Chakraborty 	reg &= ADF_GEN6_UNEXP_CPL_ERR_MASK;
512*7f3401d0SSuman Kumar Chakraborty 	if (reg) {
513*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev),
514*7f3401d0SSuman Kumar Chakraborty 			"Fatal error for AXI unexpected tag/length: %#x\n", reg);
515*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
516*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_SSM_FERR_STATUS, reg);
517*7f3401d0SSuman Kumar Chakraborty 	}
518*7f3401d0SSuman Kumar Chakraborty }
519*7f3401d0SSuman Kumar Chakraborty 
520*7f3401d0SSuman Kumar Chakraborty static void adf_handle_iaintstatssm(struct adf_accel_dev *accel_dev, void __iomem *csr)
521*7f3401d0SSuman Kumar Chakraborty {
522*7f3401d0SSuman Kumar Chakraborty 	u32 iastatssm = ADF_CSR_RD(csr, ADF_GEN6_IAINTSTATSSM);
523*7f3401d0SSuman Kumar Chakraborty 
524*7f3401d0SSuman Kumar Chakraborty 	iastatssm &= ADF_GEN6_IAINTSTATSSM_MASK;
525*7f3401d0SSuman Kumar Chakraborty 	if (!iastatssm)
526*7f3401d0SSuman Kumar Chakraborty 		return;
527*7f3401d0SSuman Kumar Chakraborty 
528*7f3401d0SSuman Kumar Chakraborty 	adf_handle_uerrssmsh(accel_dev, csr, iastatssm);
529*7f3401d0SSuman Kumar Chakraborty 	adf_handle_pperr_err(accel_dev, csr, iastatssm);
530*7f3401d0SSuman Kumar Chakraborty 	adf_handle_scmpar_err(accel_dev, csr, iastatssm);
531*7f3401d0SSuman Kumar Chakraborty 	adf_handle_cpppar_err(accel_dev, csr, iastatssm);
532*7f3401d0SSuman Kumar Chakraborty 	adf_handle_rfpar_err(accel_dev, csr, iastatssm);
533*7f3401d0SSuman Kumar Chakraborty 	adf_handle_unexp_cpl_err(accel_dev, csr, iastatssm);
534*7f3401d0SSuman Kumar Chakraborty 
535*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_IAINTSTATSSM, iastatssm);
536*7f3401d0SSuman Kumar Chakraborty }
537*7f3401d0SSuman Kumar Chakraborty 
538*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ssm(struct adf_accel_dev *accel_dev, void __iomem *csr, u32 errsou)
539*7f3401d0SSuman Kumar Chakraborty {
540*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU2_SSM_ERR_BIT))
541*7f3401d0SSuman Kumar Chakraborty 		return;
542*7f3401d0SSuman Kumar Chakraborty 
543*7f3401d0SSuman Kumar Chakraborty 	adf_handle_cerrssmsh(accel_dev, csr);
544*7f3401d0SSuman Kumar Chakraborty 	adf_handle_iaintstatssm(accel_dev, csr);
545*7f3401d0SSuman Kumar Chakraborty }
546*7f3401d0SSuman Kumar Chakraborty 
547*7f3401d0SSuman Kumar Chakraborty static void adf_handle_cpp_cfc_err(struct adf_accel_dev *accel_dev, void __iomem *csr,
548*7f3401d0SSuman Kumar Chakraborty 				   u32 errsou)
549*7f3401d0SSuman Kumar Chakraborty {
550*7f3401d0SSuman Kumar Chakraborty 	u32 reg;
551*7f3401d0SSuman Kumar Chakraborty 
552*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU2_CPP_CFC_ERR_STATUS_BIT))
553*7f3401d0SSuman Kumar Chakraborty 		return;
554*7f3401d0SSuman Kumar Chakraborty 
555*7f3401d0SSuman Kumar Chakraborty 	reg = ADF_CSR_RD(csr, ADF_GEN6_CPP_CFC_ERR_STATUS);
556*7f3401d0SSuman Kumar Chakraborty 	if (reg & ADF_GEN6_CPP_CFC_ERR_STATUS_DATAPAR_BIT) {
557*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "CPP_CFC_ERR: data parity: %#x", reg);
558*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
559*7f3401d0SSuman Kumar Chakraborty 	}
560*7f3401d0SSuman Kumar Chakraborty 
561*7f3401d0SSuman Kumar Chakraborty 	if (reg & ADF_GEN6_CPP_CFC_ERR_STATUS_CMDPAR_BIT) {
562*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "CPP_CFC_ERR: command parity: %#x", reg);
563*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
564*7f3401d0SSuman Kumar Chakraborty 	}
565*7f3401d0SSuman Kumar Chakraborty 
566*7f3401d0SSuman Kumar Chakraborty 	if (reg & ADF_GEN6_CPP_CFC_FATAL_ERR_BIT) {
567*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "CPP_CFC_ERR: errors: %#x", reg);
568*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
569*7f3401d0SSuman Kumar Chakraborty 	}
570*7f3401d0SSuman Kumar Chakraborty 
571*7f3401d0SSuman Kumar Chakraborty 	ADF_CSR_WR(csr, ADF_GEN6_CPP_CFC_ERR_STATUS_CLR,
572*7f3401d0SSuman Kumar Chakraborty 		   ADF_GEN6_CPP_CFC_ERR_STATUS_CLR_MASK);
573*7f3401d0SSuman Kumar Chakraborty }
574*7f3401d0SSuman Kumar Chakraborty 
575*7f3401d0SSuman Kumar Chakraborty static void adf_gen6_process_errsou2(struct adf_accel_dev *accel_dev, void __iomem *csr,
576*7f3401d0SSuman Kumar Chakraborty 				     u32 errsou)
577*7f3401d0SSuman Kumar Chakraborty {
578*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ssm(accel_dev, csr, errsou);
579*7f3401d0SSuman Kumar Chakraborty 	adf_handle_cpp_cfc_err(accel_dev, csr, errsou);
580*7f3401d0SSuman Kumar Chakraborty 
581*7f3401d0SSuman Kumar Chakraborty 	errsou = ADF_CSR_RD(csr, ADF_GEN6_ERRSOU2);
582*7f3401d0SSuman Kumar Chakraborty 	if (errsou & ADF_GEN6_ERRSOU2_MASK)
583*7f3401d0SSuman Kumar Chakraborty 		dev_warn(&GET_DEV(accel_dev), "errsou2 still set: %#x\n", errsou);
584*7f3401d0SSuman Kumar Chakraborty }
585*7f3401d0SSuman Kumar Chakraborty 
586*7f3401d0SSuman Kumar Chakraborty static void adf_handle_timiscsts(struct adf_accel_dev *accel_dev, void __iomem *csr,
587*7f3401d0SSuman Kumar Chakraborty 				 u32 errsou)
588*7f3401d0SSuman Kumar Chakraborty {
589*7f3401d0SSuman Kumar Chakraborty 	u32 timiscsts;
590*7f3401d0SSuman Kumar Chakraborty 
591*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_TIMISCSTS_BIT))
592*7f3401d0SSuman Kumar Chakraborty 		return;
593*7f3401d0SSuman Kumar Chakraborty 
594*7f3401d0SSuman Kumar Chakraborty 	timiscsts = ADF_CSR_RD(csr, ADF_GEN6_TIMISCSTS);
595*7f3401d0SSuman Kumar Chakraborty 	if (timiscsts) {
596*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "Fatal error in transmit interface: %#x\n",
597*7f3401d0SSuman Kumar Chakraborty 			timiscsts);
598*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
599*7f3401d0SSuman Kumar Chakraborty 	}
600*7f3401d0SSuman Kumar Chakraborty }
601*7f3401d0SSuman Kumar Chakraborty 
602*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ricppintsts(struct adf_accel_dev *accel_dev, void __iomem *csr,
603*7f3401d0SSuman Kumar Chakraborty 				   u32 errsou)
604*7f3401d0SSuman Kumar Chakraborty {
605*7f3401d0SSuman Kumar Chakraborty 	u32 ricppintsts;
606*7f3401d0SSuman Kumar Chakraborty 
607*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_RICPPINTSTS_MASK))
608*7f3401d0SSuman Kumar Chakraborty 		return;
609*7f3401d0SSuman Kumar Chakraborty 
610*7f3401d0SSuman Kumar Chakraborty 	ricppintsts = ADF_CSR_RD(csr, ADF_GEN6_RICPPINTSTS);
611*7f3401d0SSuman Kumar Chakraborty 	ricppintsts &= ADF_GEN6_RICPPINTSTS_MASK;
612*7f3401d0SSuman Kumar Chakraborty 	if (ricppintsts) {
613*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "RI push pull error: %#x\n", ricppintsts);
614*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
615*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_RICPPINTSTS, ricppintsts);
616*7f3401d0SSuman Kumar Chakraborty 	}
617*7f3401d0SSuman Kumar Chakraborty }
618*7f3401d0SSuman Kumar Chakraborty 
619*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ticppintsts(struct adf_accel_dev *accel_dev, void __iomem *csr,
620*7f3401d0SSuman Kumar Chakraborty 				   u32 errsou)
621*7f3401d0SSuman Kumar Chakraborty {
622*7f3401d0SSuman Kumar Chakraborty 	u32 ticppintsts;
623*7f3401d0SSuman Kumar Chakraborty 
624*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_TICPPINTSTS_MASK))
625*7f3401d0SSuman Kumar Chakraborty 		return;
626*7f3401d0SSuman Kumar Chakraborty 
627*7f3401d0SSuman Kumar Chakraborty 	ticppintsts = ADF_CSR_RD(csr, ADF_GEN6_TICPPINTSTS);
628*7f3401d0SSuman Kumar Chakraborty 	ticppintsts &= ADF_GEN6_TICPPINTSTS_MASK;
629*7f3401d0SSuman Kumar Chakraborty 	if (ticppintsts) {
630*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "TI push pull error: %#x\n", ticppintsts);
631*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
632*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_TICPPINTSTS, ticppintsts);
633*7f3401d0SSuman Kumar Chakraborty 	}
634*7f3401d0SSuman Kumar Chakraborty }
635*7f3401d0SSuman Kumar Chakraborty 
636*7f3401d0SSuman Kumar Chakraborty static void adf_handle_atufaultstatus(struct adf_accel_dev *accel_dev, void __iomem *csr,
637*7f3401d0SSuman Kumar Chakraborty 				      u32 errsou)
638*7f3401d0SSuman Kumar Chakraborty {
639*7f3401d0SSuman Kumar Chakraborty 	u32 max_rp_num = GET_HW_DATA(accel_dev)->num_banks;
640*7f3401d0SSuman Kumar Chakraborty 	u32 atufaultstatus;
641*7f3401d0SSuman Kumar Chakraborty 	u32 i;
642*7f3401d0SSuman Kumar Chakraborty 
643*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_ATUFAULTSTATUS_BIT))
644*7f3401d0SSuman Kumar Chakraborty 		return;
645*7f3401d0SSuman Kumar Chakraborty 
646*7f3401d0SSuman Kumar Chakraborty 	for (i = 0; i < max_rp_num; i++) {
647*7f3401d0SSuman Kumar Chakraborty 		atufaultstatus = ADF_CSR_RD(csr, ADF_GEN6_ATUFAULTSTATUS(i));
648*7f3401d0SSuman Kumar Chakraborty 
649*7f3401d0SSuman Kumar Chakraborty 		atufaultstatus &= ADF_GEN6_ATUFAULTSTATUS_BIT;
650*7f3401d0SSuman Kumar Chakraborty 		if (atufaultstatus) {
651*7f3401d0SSuman Kumar Chakraborty 			dev_err(&GET_DEV(accel_dev), "Ring pair (%u) ATU detected fault: %#x\n", i,
652*7f3401d0SSuman Kumar Chakraborty 				atufaultstatus);
653*7f3401d0SSuman Kumar Chakraborty 			ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
654*7f3401d0SSuman Kumar Chakraborty 			ADF_CSR_WR(csr, ADF_GEN6_ATUFAULTSTATUS(i), atufaultstatus);
655*7f3401d0SSuman Kumar Chakraborty 		}
656*7f3401d0SSuman Kumar Chakraborty 	}
657*7f3401d0SSuman Kumar Chakraborty }
658*7f3401d0SSuman Kumar Chakraborty 
659*7f3401d0SSuman Kumar Chakraborty static void adf_handle_rlterror(struct adf_accel_dev *accel_dev, void __iomem *csr,
660*7f3401d0SSuman Kumar Chakraborty 				u32 errsou)
661*7f3401d0SSuman Kumar Chakraborty {
662*7f3401d0SSuman Kumar Chakraborty 	u32 rlterror;
663*7f3401d0SSuman Kumar Chakraborty 
664*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_RLTERROR_BIT))
665*7f3401d0SSuman Kumar Chakraborty 		return;
666*7f3401d0SSuman Kumar Chakraborty 
667*7f3401d0SSuman Kumar Chakraborty 	rlterror = ADF_CSR_RD(csr, ADF_GEN6_RLT_ERRLOG);
668*7f3401d0SSuman Kumar Chakraborty 	rlterror &= ADF_GEN6_RLT_ERRLOG_MASK;
669*7f3401d0SSuman Kumar Chakraborty 	if (rlterror) {
670*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "Error in rate limiting block: %#x\n", rlterror);
671*7f3401d0SSuman Kumar Chakraborty 		ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
672*7f3401d0SSuman Kumar Chakraborty 		ADF_CSR_WR(csr, ADF_GEN6_RLT_ERRLOG, rlterror);
673*7f3401d0SSuman Kumar Chakraborty 	}
674*7f3401d0SSuman Kumar Chakraborty }
675*7f3401d0SSuman Kumar Chakraborty 
676*7f3401d0SSuman Kumar Chakraborty static void adf_handle_vflr(struct adf_accel_dev *accel_dev, void __iomem *csr, u32 errsou)
677*7f3401d0SSuman Kumar Chakraborty {
678*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_VFLRNOTIFY_BIT))
679*7f3401d0SSuman Kumar Chakraborty 		return;
680*7f3401d0SSuman Kumar Chakraborty 
681*7f3401d0SSuman Kumar Chakraborty 	dev_err(&GET_DEV(accel_dev), "Uncorrectable error in VF\n");
682*7f3401d0SSuman Kumar Chakraborty 	ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
683*7f3401d0SSuman Kumar Chakraborty }
684*7f3401d0SSuman Kumar Chakraborty 
685*7f3401d0SSuman Kumar Chakraborty static void adf_handle_tc_vc_map_error(struct adf_accel_dev *accel_dev, void __iomem *csr,
686*7f3401d0SSuman Kumar Chakraborty 				       u32 errsou)
687*7f3401d0SSuman Kumar Chakraborty {
688*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_TC_VC_MAP_ERROR_BIT))
689*7f3401d0SSuman Kumar Chakraborty 		return;
690*7f3401d0SSuman Kumar Chakraborty 
691*7f3401d0SSuman Kumar Chakraborty 	dev_err(&GET_DEV(accel_dev), "Violation of PCIe TC VC mapping\n");
692*7f3401d0SSuman Kumar Chakraborty 	ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
693*7f3401d0SSuman Kumar Chakraborty }
694*7f3401d0SSuman Kumar Chakraborty 
695*7f3401d0SSuman Kumar Chakraborty static void adf_handle_pcie_devhalt(struct adf_accel_dev *accel_dev, void __iomem *csr,
696*7f3401d0SSuman Kumar Chakraborty 				    u32 errsou)
697*7f3401d0SSuman Kumar Chakraborty {
698*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_PCIE_DEVHALT_BIT))
699*7f3401d0SSuman Kumar Chakraborty 		return;
700*7f3401d0SSuman Kumar Chakraborty 
701*7f3401d0SSuman Kumar Chakraborty 	dev_err(&GET_DEV(accel_dev),
702*7f3401d0SSuman Kumar Chakraborty 		"DEVHALT due to an error in an incoming transaction\n");
703*7f3401d0SSuman Kumar Chakraborty 	ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
704*7f3401d0SSuman Kumar Chakraborty }
705*7f3401d0SSuman Kumar Chakraborty 
706*7f3401d0SSuman Kumar Chakraborty static void adf_handle_pg_req_devhalt(struct adf_accel_dev *accel_dev, void __iomem *csr,
707*7f3401d0SSuman Kumar Chakraborty 				      u32 errsou)
708*7f3401d0SSuman Kumar Chakraborty {
709*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_PG_REQ_DEVHALT_BIT))
710*7f3401d0SSuman Kumar Chakraborty 		return;
711*7f3401d0SSuman Kumar Chakraborty 
712*7f3401d0SSuman Kumar Chakraborty 	dev_err(&GET_DEV(accel_dev),
713*7f3401d0SSuman Kumar Chakraborty 		"Error due to response failure in response to a page request\n");
714*7f3401d0SSuman Kumar Chakraborty 	ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
715*7f3401d0SSuman Kumar Chakraborty }
716*7f3401d0SSuman Kumar Chakraborty 
717*7f3401d0SSuman Kumar Chakraborty static void adf_handle_xlt_cpl_devhalt(struct adf_accel_dev *accel_dev, void __iomem *csr,
718*7f3401d0SSuman Kumar Chakraborty 				       u32 errsou)
719*7f3401d0SSuman Kumar Chakraborty {
720*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_XLT_CPL_DEVHALT_BIT))
721*7f3401d0SSuman Kumar Chakraborty 		return;
722*7f3401d0SSuman Kumar Chakraborty 
723*7f3401d0SSuman Kumar Chakraborty 	dev_err(&GET_DEV(accel_dev), "Error status for a address translation request\n");
724*7f3401d0SSuman Kumar Chakraborty 	ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
725*7f3401d0SSuman Kumar Chakraborty }
726*7f3401d0SSuman Kumar Chakraborty 
727*7f3401d0SSuman Kumar Chakraborty static void adf_handle_ti_int_err_devhalt(struct adf_accel_dev *accel_dev, void __iomem *csr,
728*7f3401d0SSuman Kumar Chakraborty 					  u32 errsou)
729*7f3401d0SSuman Kumar Chakraborty {
730*7f3401d0SSuman Kumar Chakraborty 	if (!(errsou & ADF_GEN6_ERRSOU3_TI_INT_ERR_DEVHALT_BIT))
731*7f3401d0SSuman Kumar Chakraborty 		return;
732*7f3401d0SSuman Kumar Chakraborty 
733*7f3401d0SSuman Kumar Chakraborty 	dev_err(&GET_DEV(accel_dev), "DEVHALT due to a TI internal memory error\n");
734*7f3401d0SSuman Kumar Chakraborty 	ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_FATAL);
735*7f3401d0SSuman Kumar Chakraborty }
736*7f3401d0SSuman Kumar Chakraborty 
737*7f3401d0SSuman Kumar Chakraborty static void adf_gen6_process_errsou3(struct adf_accel_dev *accel_dev, void __iomem *csr,
738*7f3401d0SSuman Kumar Chakraborty 				     u32 errsou)
739*7f3401d0SSuman Kumar Chakraborty {
740*7f3401d0SSuman Kumar Chakraborty 	adf_handle_timiscsts(accel_dev, csr, errsou);
741*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ricppintsts(accel_dev, csr, errsou);
742*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ticppintsts(accel_dev, csr, errsou);
743*7f3401d0SSuman Kumar Chakraborty 	adf_handle_atufaultstatus(accel_dev, csr, errsou);
744*7f3401d0SSuman Kumar Chakraborty 	adf_handle_rlterror(accel_dev, csr, errsou);
745*7f3401d0SSuman Kumar Chakraborty 	adf_handle_vflr(accel_dev, csr, errsou);
746*7f3401d0SSuman Kumar Chakraborty 	adf_handle_tc_vc_map_error(accel_dev, csr, errsou);
747*7f3401d0SSuman Kumar Chakraborty 	adf_handle_pcie_devhalt(accel_dev, csr, errsou);
748*7f3401d0SSuman Kumar Chakraborty 	adf_handle_pg_req_devhalt(accel_dev, csr, errsou);
749*7f3401d0SSuman Kumar Chakraborty 	adf_handle_xlt_cpl_devhalt(accel_dev, csr, errsou);
750*7f3401d0SSuman Kumar Chakraborty 	adf_handle_ti_int_err_devhalt(accel_dev, csr, errsou);
751*7f3401d0SSuman Kumar Chakraborty 
752*7f3401d0SSuman Kumar Chakraborty 	errsou = ADF_CSR_RD(csr, ADF_GEN6_ERRSOU3);
753*7f3401d0SSuman Kumar Chakraborty 	if (errsou & ADF_GEN6_ERRSOU3_MASK)
754*7f3401d0SSuman Kumar Chakraborty 		dev_warn(&GET_DEV(accel_dev), "errsou3 still set: %#x\n", errsou);
755*7f3401d0SSuman Kumar Chakraborty }
756*7f3401d0SSuman Kumar Chakraborty 
757*7f3401d0SSuman Kumar Chakraborty static void adf_gen6_is_reset_required(struct adf_accel_dev *accel_dev, void __iomem *csr,
758*7f3401d0SSuman Kumar Chakraborty 				       bool *reset_required)
759*7f3401d0SSuman Kumar Chakraborty {
760*7f3401d0SSuman Kumar Chakraborty 	u8 reset, dev_state;
761*7f3401d0SSuman Kumar Chakraborty 	u32 gensts;
762*7f3401d0SSuman Kumar Chakraborty 
763*7f3401d0SSuman Kumar Chakraborty 	gensts = ADF_CSR_RD(csr, ADF_GEN6_GENSTS);
764*7f3401d0SSuman Kumar Chakraborty 	dev_state = FIELD_GET(ADF_GEN6_GENSTS_DEVICE_STATE_MASK, gensts);
765*7f3401d0SSuman Kumar Chakraborty 	reset = FIELD_GET(ADF_GEN6_GENSTS_RESET_TYPE_MASK, gensts);
766*7f3401d0SSuman Kumar Chakraborty 	if (dev_state == ADF_GEN6_GENSTS_DEVHALT && reset == ADF_GEN6_GENSTS_PFLR) {
767*7f3401d0SSuman Kumar Chakraborty 		*reset_required = true;
768*7f3401d0SSuman Kumar Chakraborty 		return;
769*7f3401d0SSuman Kumar Chakraborty 	}
770*7f3401d0SSuman Kumar Chakraborty 
771*7f3401d0SSuman Kumar Chakraborty 	if (reset == ADF_GEN6_GENSTS_COLD_RESET)
772*7f3401d0SSuman Kumar Chakraborty 		dev_err(&GET_DEV(accel_dev), "Fatal error, cold reset required\n");
773*7f3401d0SSuman Kumar Chakraborty 
774*7f3401d0SSuman Kumar Chakraborty 	*reset_required = false;
775*7f3401d0SSuman Kumar Chakraborty }
776*7f3401d0SSuman Kumar Chakraborty 
777*7f3401d0SSuman Kumar Chakraborty static bool adf_gen6_handle_interrupt(struct adf_accel_dev *accel_dev, bool *reset_required)
778*7f3401d0SSuman Kumar Chakraborty {
779*7f3401d0SSuman Kumar Chakraborty 	void __iomem *csr = adf_get_pmisc_base(accel_dev);
780*7f3401d0SSuman Kumar Chakraborty 	bool handled = false;
781*7f3401d0SSuman Kumar Chakraborty 	u32 errsou;
782*7f3401d0SSuman Kumar Chakraborty 
783*7f3401d0SSuman Kumar Chakraborty 	errsou = ADF_CSR_RD(csr, ADF_GEN6_ERRSOU0);
784*7f3401d0SSuman Kumar Chakraborty 	if (errsou & ADF_GEN6_ERRSOU0_MASK) {
785*7f3401d0SSuman Kumar Chakraborty 		adf_gen6_process_errsou0(accel_dev, csr);
786*7f3401d0SSuman Kumar Chakraborty 		handled = true;
787*7f3401d0SSuman Kumar Chakraborty 	}
788*7f3401d0SSuman Kumar Chakraborty 
789*7f3401d0SSuman Kumar Chakraborty 	errsou = ADF_CSR_RD(csr, ADF_GEN6_ERRSOU1);
790*7f3401d0SSuman Kumar Chakraborty 	if (errsou & ADF_GEN6_ERRSOU1_MASK) {
791*7f3401d0SSuman Kumar Chakraborty 		adf_gen6_process_errsou1(accel_dev, csr, errsou);
792*7f3401d0SSuman Kumar Chakraborty 		handled = true;
793*7f3401d0SSuman Kumar Chakraborty 	}
794*7f3401d0SSuman Kumar Chakraborty 
795*7f3401d0SSuman Kumar Chakraborty 	errsou = ADF_CSR_RD(csr, ADF_GEN6_ERRSOU2);
796*7f3401d0SSuman Kumar Chakraborty 	if (errsou & ADF_GEN6_ERRSOU2_MASK) {
797*7f3401d0SSuman Kumar Chakraborty 		adf_gen6_process_errsou2(accel_dev, csr, errsou);
798*7f3401d0SSuman Kumar Chakraborty 		handled = true;
799*7f3401d0SSuman Kumar Chakraborty 	}
800*7f3401d0SSuman Kumar Chakraborty 
801*7f3401d0SSuman Kumar Chakraborty 	errsou = ADF_CSR_RD(csr, ADF_GEN6_ERRSOU3);
802*7f3401d0SSuman Kumar Chakraborty 	if (errsou & ADF_GEN6_ERRSOU3_MASK) {
803*7f3401d0SSuman Kumar Chakraborty 		adf_gen6_process_errsou3(accel_dev, csr, errsou);
804*7f3401d0SSuman Kumar Chakraborty 		handled = true;
805*7f3401d0SSuman Kumar Chakraborty 	}
806*7f3401d0SSuman Kumar Chakraborty 
807*7f3401d0SSuman Kumar Chakraborty 	adf_gen6_is_reset_required(accel_dev, csr, reset_required);
808*7f3401d0SSuman Kumar Chakraborty 
809*7f3401d0SSuman Kumar Chakraborty 	return handled;
810*7f3401d0SSuman Kumar Chakraborty }
811*7f3401d0SSuman Kumar Chakraborty 
812*7f3401d0SSuman Kumar Chakraborty void adf_gen6_init_ras_ops(struct adf_ras_ops *ras_ops)
813*7f3401d0SSuman Kumar Chakraborty {
814*7f3401d0SSuman Kumar Chakraborty 	ras_ops->enable_ras_errors = adf_gen6_enable_ras;
815*7f3401d0SSuman Kumar Chakraborty 	ras_ops->disable_ras_errors = adf_gen6_disable_ras;
816*7f3401d0SSuman Kumar Chakraborty 	ras_ops->handle_interrupt = adf_gen6_handle_interrupt;
817*7f3401d0SSuman Kumar Chakraborty }
818*7f3401d0SSuman Kumar Chakraborty EXPORT_SYMBOL_GPL(adf_gen6_init_ras_ops);
819