提交 7fd4585b 编写于 作者: W Weili Qian 提交者: Zheng Zengkai

crypto: hisilicon/qm - do not reset hardware when CE happens

mainline inclusion
from mainline-v5.12-rc1-dontuse
commit 1db0016e
category: bugfix
bugzilla: 173981
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1db0016e0d223b644d2c77a4569e8939f5c55a7c

----------------------------------------------------------------------

There is no need to reset hardware when Corrected Error(CE) happens.
Signed-off-by: NWeili Qian <qianweili@huawei.com>
Reviewed-by: NZaibo Xu <xuzaibo@huawei.com>
Signed-off-by: NHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: NMingqiang Ling <lingmingqiang@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 219eac98
...@@ -881,6 +881,7 @@ static const struct hisi_qm_err_ini hpre_err_ini = { ...@@ -881,6 +881,7 @@ static const struct hisi_qm_err_ini hpre_err_ini = {
.fe = 0, .fe = 0,
.ecc_2bits_mask = HPRE_CORE_ECC_2BIT_ERR | .ecc_2bits_mask = HPRE_CORE_ECC_2BIT_ERR |
HPRE_OOO_ECC_2BIT_ERR, HPRE_OOO_ECC_2BIT_ERR,
.dev_ce_mask = HPRE_HAC_RAS_CE_ENABLE,
.msi_wr_port = HPRE_WR_MSI_PORT, .msi_wr_port = HPRE_WR_MSI_PORT,
.acpi_rst = "HRST", .acpi_rst = "HRST",
} }
......
...@@ -1612,7 +1612,7 @@ static void qm_log_hw_error(struct hisi_qm *qm, u32 error_status) ...@@ -1612,7 +1612,7 @@ static void qm_log_hw_error(struct hisi_qm *qm, u32 error_status)
static enum acc_err_result qm_hw_error_handle_v2(struct hisi_qm *qm) static enum acc_err_result qm_hw_error_handle_v2(struct hisi_qm *qm)
{ {
u32 error_status, tmp; u32 error_status, tmp, val;
/* read err sts */ /* read err sts */
tmp = readl(qm->io_base + QM_ABNORMAL_INT_STATUS); tmp = readl(qm->io_base + QM_ABNORMAL_INT_STATUS);
...@@ -1623,9 +1623,13 @@ static enum acc_err_result qm_hw_error_handle_v2(struct hisi_qm *qm) ...@@ -1623,9 +1623,13 @@ static enum acc_err_result qm_hw_error_handle_v2(struct hisi_qm *qm)
qm->err_status.is_qm_ecc_mbit = true; qm->err_status.is_qm_ecc_mbit = true;
qm_log_hw_error(qm, error_status); qm_log_hw_error(qm, error_status);
if (error_status == QM_DB_RANDOM_INVALID) { val = error_status | QM_DB_RANDOM_INVALID | QM_BASE_CE;
/* ce error does not need to be reset */
if (val == (QM_DB_RANDOM_INVALID | QM_BASE_CE)) {
writel(error_status, qm->io_base + writel(error_status, qm->io_base +
QM_ABNORMAL_INT_SOURCE); QM_ABNORMAL_INT_SOURCE);
writel(qm->err_ini->err_info.nfe,
qm->io_base + QM_RAS_NFE_ENABLE);
return ACC_ERR_RECOVERED; return ACC_ERR_RECOVERED;
} }
...@@ -3317,12 +3321,19 @@ static enum acc_err_result qm_dev_err_handle(struct hisi_qm *qm) ...@@ -3317,12 +3321,19 @@ static enum acc_err_result qm_dev_err_handle(struct hisi_qm *qm)
if (err_sts & qm->err_ini->err_info.ecc_2bits_mask) if (err_sts & qm->err_ini->err_info.ecc_2bits_mask)
qm->err_status.is_dev_ecc_mbit = true; qm->err_status.is_dev_ecc_mbit = true;
if (!qm->err_ini->log_dev_hw_err) { if (qm->err_ini->log_dev_hw_err)
dev_err(&qm->pdev->dev, "Device doesn't support log hw error!\n"); qm->err_ini->log_dev_hw_err(qm, err_sts);
return ACC_ERR_NEED_RESET;
/* ce error does not need to be reset */
if ((err_sts | qm->err_ini->err_info.dev_ce_mask) ==
qm->err_ini->err_info.dev_ce_mask) {
if (qm->err_ini->clear_dev_hw_err_status)
qm->err_ini->clear_dev_hw_err_status(qm,
err_sts);
return ACC_ERR_RECOVERED;
} }
qm->err_ini->log_dev_hw_err(qm, err_sts);
return ACC_ERR_NEED_RESET; return ACC_ERR_NEED_RESET;
} }
......
...@@ -173,6 +173,7 @@ struct hisi_qm_err_info { ...@@ -173,6 +173,7 @@ struct hisi_qm_err_info {
char *acpi_rst; char *acpi_rst;
u32 msi_wr_port; u32 msi_wr_port;
u32 ecc_2bits_mask; u32 ecc_2bits_mask;
u32 dev_ce_mask;
u32 ce; u32 ce;
u32 nfe; u32 nfe;
u32 fe; u32 fe;
......
...@@ -752,6 +752,7 @@ static const struct hisi_qm_err_ini sec_err_ini = { ...@@ -752,6 +752,7 @@ static const struct hisi_qm_err_ini sec_err_ini = {
QM_ACC_WB_NOT_READY_TIMEOUT, QM_ACC_WB_NOT_READY_TIMEOUT,
.fe = 0, .fe = 0,
.ecc_2bits_mask = SEC_CORE_INT_STATUS_M_ECC, .ecc_2bits_mask = SEC_CORE_INT_STATUS_M_ECC,
.dev_ce_mask = SEC_RAS_CE_ENB_MSK,
.msi_wr_port = BIT(0), .msi_wr_port = BIT(0),
.acpi_rst = "SRST", .acpi_rst = "SRST",
} }
......
...@@ -66,6 +66,7 @@ ...@@ -66,6 +66,7 @@
#define HZIP_CORE_INT_STATUS_M_ECC BIT(1) #define HZIP_CORE_INT_STATUS_M_ECC BIT(1)
#define HZIP_CORE_SRAM_ECC_ERR_INFO 0x301148 #define HZIP_CORE_SRAM_ECC_ERR_INFO 0x301148
#define HZIP_CORE_INT_RAS_CE_ENB 0x301160 #define HZIP_CORE_INT_RAS_CE_ENB 0x301160
#define HZIP_CORE_INT_RAS_CE_ENABLE 0x1
#define HZIP_CORE_INT_RAS_NFE_ENB 0x301164 #define HZIP_CORE_INT_RAS_NFE_ENB 0x301164
#define HZIP_CORE_INT_RAS_FE_ENB 0x301168 #define HZIP_CORE_INT_RAS_FE_ENB 0x301168
#define HZIP_CORE_INT_RAS_NFE_ENABLE 0x7FE #define HZIP_CORE_INT_RAS_NFE_ENABLE 0x7FE
...@@ -327,7 +328,8 @@ static void hisi_zip_hw_error_enable(struct hisi_qm *qm) ...@@ -327,7 +328,8 @@ static void hisi_zip_hw_error_enable(struct hisi_qm *qm)
writel(HZIP_CORE_INT_MASK_ALL, qm->io_base + HZIP_CORE_INT_SOURCE); writel(HZIP_CORE_INT_MASK_ALL, qm->io_base + HZIP_CORE_INT_SOURCE);
/* configure error type */ /* configure error type */
writel(0x1, qm->io_base + HZIP_CORE_INT_RAS_CE_ENB); writel(HZIP_CORE_INT_RAS_CE_ENABLE,
qm->io_base + HZIP_CORE_INT_RAS_CE_ENB);
writel(0x0, qm->io_base + HZIP_CORE_INT_RAS_FE_ENB); writel(0x0, qm->io_base + HZIP_CORE_INT_RAS_FE_ENB);
writel(HZIP_CORE_INT_RAS_NFE_ENABLE, writel(HZIP_CORE_INT_RAS_NFE_ENABLE,
qm->io_base + HZIP_CORE_INT_RAS_NFE_ENB); qm->io_base + HZIP_CORE_INT_RAS_NFE_ENB);
...@@ -727,6 +729,7 @@ static const struct hisi_qm_err_ini hisi_zip_err_ini = { ...@@ -727,6 +729,7 @@ static const struct hisi_qm_err_ini hisi_zip_err_ini = {
QM_ACC_WB_NOT_READY_TIMEOUT, QM_ACC_WB_NOT_READY_TIMEOUT,
.fe = 0, .fe = 0,
.ecc_2bits_mask = HZIP_CORE_INT_STATUS_M_ECC, .ecc_2bits_mask = HZIP_CORE_INT_STATUS_M_ECC,
.dev_ce_mask = HZIP_CORE_INT_RAS_CE_ENABLE,
.msi_wr_port = HZIP_WR_PORT, .msi_wr_port = HZIP_WR_PORT,
.acpi_rst = "ZRST", .acpi_rst = "ZRST",
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册