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