3939#define HPRE_HAC_RAS_NFE_ENB 0x301414
4040#define HPRE_HAC_RAS_FE_ENB 0x301418
4141#define HPRE_HAC_INT_SET 0x301500
42+ #define HPRE_AXI_ERROR_MASK GENMASK(21, 10)
4243#define HPRE_RNG_TIMEOUT_NUM 0x301A34
4344#define HPRE_CORE_INT_ENABLE 0
4445#define HPRE_RDCHN_INI_ST 0x301a00
@@ -798,8 +799,7 @@ static void hpre_master_ooo_ctrl(struct hisi_qm *qm, bool enable)
798799 val1 = readl (qm -> io_base + HPRE_AM_OOO_SHUTDOWN_ENB );
799800 if (enable ) {
800801 val1 |= HPRE_AM_OOO_SHUTDOWN_ENABLE ;
801- val2 = hisi_qm_get_hw_info (qm , hpre_basic_info ,
802- HPRE_OOO_SHUTDOWN_MASK_CAP , qm -> cap_ver );
802+ val2 = qm -> err_info .dev_err .shutdown_mask ;
803803 } else {
804804 val1 &= ~HPRE_AM_OOO_SHUTDOWN_ENABLE ;
805805 val2 = 0x0 ;
@@ -813,38 +813,33 @@ static void hpre_master_ooo_ctrl(struct hisi_qm *qm, bool enable)
813813
814814static void hpre_hw_error_disable (struct hisi_qm * qm )
815815{
816- u32 ce , nfe ;
817-
818- ce = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_CE_MASK_CAP , qm -> cap_ver );
819- nfe = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_NFE_MASK_CAP , qm -> cap_ver );
816+ struct hisi_qm_err_mask * dev_err = & qm -> err_info .dev_err ;
817+ u32 err_mask = dev_err -> ce | dev_err -> nfe | dev_err -> fe ;
820818
821819 /* disable hpre hw error interrupts */
822- writel (ce | nfe | HPRE_HAC_RAS_FE_ENABLE , qm -> io_base + HPRE_INT_MASK );
820+ writel (err_mask , qm -> io_base + HPRE_INT_MASK );
823821 /* disable HPRE block master OOO when nfe occurs on Kunpeng930 */
824822 hpre_master_ooo_ctrl (qm , false);
825823}
826824
827825static void hpre_hw_error_enable (struct hisi_qm * qm )
828826{
829- u32 ce , nfe , err_en ;
830-
831- ce = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_CE_MASK_CAP , qm -> cap_ver );
832- nfe = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_NFE_MASK_CAP , qm -> cap_ver );
827+ struct hisi_qm_err_mask * dev_err = & qm -> err_info .dev_err ;
828+ u32 err_mask = dev_err -> ce | dev_err -> nfe | dev_err -> fe ;
833829
834830 /* clear HPRE hw error source if having */
835- writel (ce | nfe | HPRE_HAC_RAS_FE_ENABLE , qm -> io_base + HPRE_HAC_SOURCE_INT );
831+ writel (err_mask , qm -> io_base + HPRE_HAC_SOURCE_INT );
836832
837833 /* configure error type */
838- writel (ce , qm -> io_base + HPRE_RAS_CE_ENB );
839- writel (nfe , qm -> io_base + HPRE_RAS_NFE_ENB );
840- writel (HPRE_HAC_RAS_FE_ENABLE , qm -> io_base + HPRE_RAS_FE_ENB );
834+ writel (dev_err -> ce , qm -> io_base + HPRE_RAS_CE_ENB );
835+ writel (dev_err -> nfe , qm -> io_base + HPRE_RAS_NFE_ENB );
836+ writel (dev_err -> fe , qm -> io_base + HPRE_RAS_FE_ENB );
841837
842838 /* enable HPRE block master OOO when nfe occurs on Kunpeng930 */
843839 hpre_master_ooo_ctrl (qm , true);
844840
845841 /* enable hpre hw error interrupts */
846- err_en = ce | nfe | HPRE_HAC_RAS_FE_ENABLE ;
847- writel (~err_en , qm -> io_base + HPRE_INT_MASK );
842+ writel (~err_mask , qm -> io_base + HPRE_INT_MASK );
848843}
849844
850845static inline struct hisi_qm * hpre_file_to_qm (struct hpre_debugfs_file * file )
@@ -1399,9 +1394,8 @@ static void hpre_clear_hw_err_status(struct hisi_qm *qm, u32 err_sts)
13991394
14001395static void hpre_disable_error_report (struct hisi_qm * qm , u32 err_type )
14011396{
1402- u32 nfe_mask ;
1397+ u32 nfe_mask = qm -> err_info . dev_err . nfe ;
14031398
1404- nfe_mask = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_NFE_MASK_CAP , qm -> cap_ver );
14051399 writel (nfe_mask & (~err_type ), qm -> io_base + HPRE_RAS_NFE_ENB );
14061400}
14071401
@@ -1422,11 +1416,11 @@ static enum acc_err_result hpre_get_err_result(struct hisi_qm *qm)
14221416
14231417 err_status = hpre_get_hw_err_status (qm );
14241418 if (err_status ) {
1425- if (err_status & qm -> err_info .ecc_2bits_mask )
1419+ if (err_status & qm -> err_info .dev_err . ecc_2bits_mask )
14261420 qm -> err_status .is_dev_ecc_mbit = true;
14271421 hpre_log_hw_error (qm , err_status );
14281422
1429- if (err_status & qm -> err_info .dev_reset_mask ) {
1423+ if (err_status & qm -> err_info .dev_err . reset_mask ) {
14301424 /* Disable the same error reporting until device is recovered. */
14311425 hpre_disable_error_report (qm , err_status );
14321426 return ACC_ERR_NEED_RESET ;
@@ -1442,28 +1436,64 @@ static bool hpre_dev_is_abnormal(struct hisi_qm *qm)
14421436 u32 err_status ;
14431437
14441438 err_status = hpre_get_hw_err_status (qm );
1445- if (err_status & qm -> err_info .dev_shutdown_mask )
1439+ if (err_status & qm -> err_info .dev_err . shutdown_mask )
14461440 return true;
14471441
14481442 return false;
14491443}
14501444
1445+ static void hpre_disable_axi_error (struct hisi_qm * qm )
1446+ {
1447+ struct hisi_qm_err_mask * dev_err = & qm -> err_info .dev_err ;
1448+ u32 err_mask = dev_err -> ce | dev_err -> nfe | dev_err -> fe ;
1449+ u32 val ;
1450+
1451+ val = ~(err_mask & (~HPRE_AXI_ERROR_MASK ));
1452+ writel (val , qm -> io_base + HPRE_INT_MASK );
1453+
1454+ if (qm -> ver > QM_HW_V2 )
1455+ writel (dev_err -> shutdown_mask & (~HPRE_AXI_ERROR_MASK ),
1456+ qm -> io_base + HPRE_OOO_SHUTDOWN_SEL );
1457+ }
1458+
1459+ static void hpre_enable_axi_error (struct hisi_qm * qm )
1460+ {
1461+ struct hisi_qm_err_mask * dev_err = & qm -> err_info .dev_err ;
1462+ u32 err_mask = dev_err -> ce | dev_err -> nfe | dev_err -> fe ;
1463+
1464+ /* clear axi error source */
1465+ writel (HPRE_AXI_ERROR_MASK , qm -> io_base + HPRE_HAC_SOURCE_INT );
1466+
1467+ writel (~err_mask , qm -> io_base + HPRE_INT_MASK );
1468+
1469+ if (qm -> ver > QM_HW_V2 )
1470+ writel (dev_err -> shutdown_mask , qm -> io_base + HPRE_OOO_SHUTDOWN_SEL );
1471+ }
1472+
14511473static void hpre_err_info_init (struct hisi_qm * qm )
14521474{
14531475 struct hisi_qm_err_info * err_info = & qm -> err_info ;
1476+ struct hisi_qm_err_mask * qm_err = & err_info -> qm_err ;
1477+ struct hisi_qm_err_mask * dev_err = & err_info -> dev_err ;
1478+
1479+ qm_err -> fe = HPRE_HAC_RAS_FE_ENABLE ;
1480+ qm_err -> ce = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_QM_CE_MASK_CAP , qm -> cap_ver );
1481+ qm_err -> nfe = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_QM_NFE_MASK_CAP , qm -> cap_ver );
1482+ qm_err -> shutdown_mask = hisi_qm_get_hw_info (qm , hpre_basic_info ,
1483+ HPRE_QM_OOO_SHUTDOWN_MASK_CAP , qm -> cap_ver );
1484+ qm_err -> reset_mask = hisi_qm_get_hw_info (qm , hpre_basic_info ,
1485+ HPRE_QM_RESET_MASK_CAP , qm -> cap_ver );
1486+ qm_err -> ecc_2bits_mask = QM_ECC_MBIT ;
1487+
1488+ dev_err -> fe = HPRE_HAC_RAS_FE_ENABLE ;
1489+ dev_err -> ce = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_CE_MASK_CAP , qm -> cap_ver );
1490+ dev_err -> nfe = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_NFE_MASK_CAP , qm -> cap_ver );
1491+ dev_err -> shutdown_mask = hisi_qm_get_hw_info (qm , hpre_basic_info ,
1492+ HPRE_OOO_SHUTDOWN_MASK_CAP , qm -> cap_ver );
1493+ dev_err -> reset_mask = hisi_qm_get_hw_info (qm , hpre_basic_info ,
1494+ HPRE_RESET_MASK_CAP , qm -> cap_ver );
1495+ dev_err -> ecc_2bits_mask = HPRE_CORE_ECC_2BIT_ERR | HPRE_OOO_ECC_2BIT_ERR ;
14541496
1455- err_info -> fe = HPRE_HAC_RAS_FE_ENABLE ;
1456- err_info -> ce = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_QM_CE_MASK_CAP , qm -> cap_ver );
1457- err_info -> nfe = hisi_qm_get_hw_info (qm , hpre_basic_info , HPRE_QM_NFE_MASK_CAP , qm -> cap_ver );
1458- err_info -> ecc_2bits_mask = HPRE_CORE_ECC_2BIT_ERR | HPRE_OOO_ECC_2BIT_ERR ;
1459- err_info -> dev_shutdown_mask = hisi_qm_get_hw_info (qm , hpre_basic_info ,
1460- HPRE_OOO_SHUTDOWN_MASK_CAP , qm -> cap_ver );
1461- err_info -> qm_shutdown_mask = hisi_qm_get_hw_info (qm , hpre_basic_info ,
1462- HPRE_QM_OOO_SHUTDOWN_MASK_CAP , qm -> cap_ver );
1463- err_info -> qm_reset_mask = hisi_qm_get_hw_info (qm , hpre_basic_info ,
1464- HPRE_QM_RESET_MASK_CAP , qm -> cap_ver );
1465- err_info -> dev_reset_mask = hisi_qm_get_hw_info (qm , hpre_basic_info ,
1466- HPRE_RESET_MASK_CAP , qm -> cap_ver );
14671497 err_info -> msi_wr_port = HPRE_WR_MSI_PORT ;
14681498 err_info -> acpi_rst = "HRST" ;
14691499}
@@ -1481,6 +1511,8 @@ static const struct hisi_qm_err_ini hpre_err_ini = {
14811511 .err_info_init = hpre_err_info_init ,
14821512 .get_err_result = hpre_get_err_result ,
14831513 .dev_is_abnormal = hpre_dev_is_abnormal ,
1514+ .disable_axi_error = hpre_disable_axi_error ,
1515+ .enable_axi_error = hpre_enable_axi_error ,
14841516};
14851517
14861518static int hpre_pf_probe_init (struct hpre * hpre )
0 commit comments