Matthias Brugger 1949a1
From: Shukun Tan <tanshukun1@huawei.com>
Matthias Brugger 1949a1
Date: Sat, 9 May 2020 17:44:03 +0800
Matthias Brugger 1949a1
Subject: crypto: hisilicon - remove codes of directly report device errors
Matthias Brugger 1949a1
 through MSI
Matthias Brugger 1949a1
Git-commit: 3176637ac10eddffdc3bd75281fa354a0d5a0c1e
Matthias Brugger 1949a1
Patch-mainline: v5.8-rc1
Matthias Brugger 1949a1
References: jsc#SLE-16507 jsc#SLE-15835
Matthias Brugger 1949a1
Matthias Brugger 1949a1
The hardware device can be configured to report directly through MSI, but
Matthias Brugger 1949a1
this method will not go through RAS, configure all hardware errors that
Matthias Brugger 1949a1
should be processed by driver to NFE.
Matthias Brugger 1949a1
Matthias Brugger 1949a1
Signed-off-by: Shukun Tan <tanshukun1@huawei.com>
Matthias Brugger 1949a1
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Matthias Brugger 1949a1
Signed-off-by: Matthias Brugger <mbrugger@suse.com>
Matthias Brugger 1949a1
---
Matthias Brugger 1949a1
 drivers/crypto/hisilicon/hpre/hpre_main.c |  1 -
Matthias Brugger 1949a1
 drivers/crypto/hisilicon/qm.c             | 54 +++++------------------
Matthias Brugger 1949a1
 drivers/crypto/hisilicon/qm.h             |  4 +-
Matthias Brugger 1949a1
 drivers/crypto/hisilicon/sec2/sec_main.c  |  1 -
Matthias Brugger 1949a1
 drivers/crypto/hisilicon/zip/zip_main.c   |  1 -
Matthias Brugger 1949a1
 5 files changed, 13 insertions(+), 48 deletions(-)
Matthias Brugger 1949a1
Matthias Brugger 1949a1
diff --git a/drivers/crypto/hisilicon/hpre/hpre_main.c b/drivers/crypto/hisilicon/hpre/hpre_main.c
Matthias Brugger 1949a1
index bfae7fb23e4c..c5ddd3a8ec85 100644
Matthias Brugger 1949a1
--- a/drivers/crypto/hisilicon/hpre/hpre_main.c
Matthias Brugger 1949a1
+++ b/drivers/crypto/hisilicon/hpre/hpre_main.c
Matthias Brugger 1949a1
@@ -730,7 +730,6 @@ static const struct hisi_qm_err_ini hpre_err_ini = {
Matthias Brugger 1949a1
 		.ce			= QM_BASE_CE,
Matthias Brugger 1949a1
 		.nfe			= QM_BASE_NFE | QM_ACC_DO_TASK_TIMEOUT,
Matthias Brugger 1949a1
 		.fe			= 0,
Matthias Brugger 1949a1
-		.msi			= QM_DB_RANDOM_INVALID,
Matthias Brugger 1949a1
 		.ecc_2bits_mask		= HPRE_CORE_ECC_2BIT_ERR |
Matthias Brugger 1949a1
 					  HPRE_OOO_ECC_2BIT_ERR,
Matthias Brugger 1949a1
 		.msi_wr_port		= HPRE_WR_MSI_PORT,
Matthias Brugger 1949a1
diff --git a/drivers/crypto/hisilicon/qm.c b/drivers/crypto/hisilicon/qm.c
Matthias Brugger 1949a1
index e988124e732a..80935d661ed3 100644
Matthias Brugger 1949a1
--- a/drivers/crypto/hisilicon/qm.c
Matthias Brugger 1949a1
+++ b/drivers/crypto/hisilicon/qm.c
Matthias Brugger 1949a1
@@ -313,8 +313,7 @@ struct hisi_qm_hw_ops {
Matthias Brugger 1949a1
 		      u8 cmd, u16 index, u8 priority);
Matthias Brugger 1949a1
 	u32 (*get_irq_num)(struct hisi_qm *qm);
Matthias Brugger 1949a1
 	int (*debug_init)(struct hisi_qm *qm);
Matthias Brugger 1949a1
-	void (*hw_error_init)(struct hisi_qm *qm, u32 ce, u32 nfe, u32 fe,
Matthias Brugger 1949a1
-			      u32 msi);
Matthias Brugger 1949a1
+	void (*hw_error_init)(struct hisi_qm *qm, u32 ce, u32 nfe, u32 fe);
Matthias Brugger 1949a1
 	void (*hw_error_uninit)(struct hisi_qm *qm);
Matthias Brugger 1949a1
 	pci_ers_result_t (*hw_error_handle)(struct hisi_qm *qm);
Matthias Brugger 1949a1
 };
Matthias Brugger 1949a1
@@ -707,26 +706,6 @@ static irqreturn_t qm_aeq_irq(int irq, void *data)
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 static irqreturn_t qm_abnormal_irq(int irq, void *data)
Matthias Brugger 1949a1
 {
Matthias Brugger 1949a1
-	const struct hisi_qm_hw_error *err = qm_hw_error;
Matthias Brugger 1949a1
-	struct hisi_qm *qm = data;
Matthias Brugger 1949a1
-	struct device *dev = &qm->pdev->dev;
Matthias Brugger 1949a1
-	u32 error_status, tmp;
Matthias Brugger 1949a1
-
Matthias Brugger 1949a1
-	/* read err sts */
Matthias Brugger 1949a1
-	tmp = readl(qm->io_base + QM_ABNORMAL_INT_STATUS);
Matthias Brugger 1949a1
-	error_status = qm->msi_mask & tmp;
Matthias Brugger 1949a1
-
Matthias Brugger 1949a1
-	while (err->msg) {
Matthias Brugger 1949a1
-		if (err->int_msk & error_status)
Matthias Brugger 1949a1
-			dev_err(dev, "%s [error status=0x%x] found\n",
Matthias Brugger 1949a1
-				err->msg, err->int_msk);
Matthias Brugger 1949a1
-
Matthias Brugger 1949a1
-		err++;
Matthias Brugger 1949a1
-	}
Matthias Brugger 1949a1
-
Matthias Brugger 1949a1
-	/* clear err sts */
Matthias Brugger 1949a1
-	writel(error_status, qm->io_base + QM_ABNORMAL_INT_SOURCE);
Matthias Brugger 1949a1
-
Matthias Brugger 1949a1
 	return IRQ_HANDLED;
Matthias Brugger 1949a1
 }
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
@@ -1116,28 +1095,21 @@ static int qm_create_debugfs_file(struct hisi_qm *qm, enum qm_debug_file index)
Matthias Brugger 1949a1
 	return 0;
Matthias Brugger 1949a1
 }
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
-static void qm_hw_error_init_v1(struct hisi_qm *qm, u32 ce, u32 nfe, u32 fe,
Matthias Brugger 1949a1
-				u32 msi)
Matthias Brugger 1949a1
+static void qm_hw_error_init_v1(struct hisi_qm *qm, u32 ce, u32 nfe, u32 fe)
Matthias Brugger 1949a1
 {
Matthias Brugger 1949a1
 	writel(QM_ABNORMAL_INT_MASK_VALUE, qm->io_base + QM_ABNORMAL_INT_MASK);
Matthias Brugger 1949a1
 }
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
-static void qm_hw_error_init_v2(struct hisi_qm *qm, u32 ce, u32 nfe, u32 fe,
Matthias Brugger 1949a1
-				u32 msi)
Matthias Brugger 1949a1
+static void qm_hw_error_init_v2(struct hisi_qm *qm, u32 ce, u32 nfe, u32 fe)
Matthias Brugger 1949a1
 {
Matthias Brugger 1949a1
-	u32 irq_enable = ce | nfe | fe | msi;
Matthias Brugger 1949a1
+	u32 irq_enable = ce | nfe | fe;
Matthias Brugger 1949a1
 	u32 irq_unmask = ~irq_enable;
Matthias Brugger 1949a1
-	u32 error_status;
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 	qm->error_mask = ce | nfe | fe;
Matthias Brugger 1949a1
-	qm->msi_mask = msi;
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 	/* clear QM hw residual error source */
Matthias Brugger 1949a1
-	error_status = readl(qm->io_base + QM_ABNORMAL_INT_STATUS);
Matthias Brugger 1949a1
-	if (error_status) {
Matthias Brugger 1949a1
-		error_status &= qm->error_mask;
Matthias Brugger 1949a1
-		writel(error_status, qm->io_base + QM_ABNORMAL_INT_SOURCE);
Matthias Brugger 1949a1
-	}
Matthias Brugger 1949a1
+	writel(QM_ABNORMAL_INT_SOURCE_CLR,
Matthias Brugger 1949a1
+	       qm->io_base + QM_ABNORMAL_INT_SOURCE);
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 	/* configure error type */
Matthias Brugger 1949a1
 	writel(ce, qm->io_base + QM_RAS_CE_ENABLE);
Matthias Brugger 1949a1
@@ -1145,9 +1117,6 @@ static void qm_hw_error_init_v2(struct hisi_qm *qm, u32 ce, u32 nfe, u32 fe,
Matthias Brugger 1949a1
 	writel(nfe, qm->io_base + QM_RAS_NFE_ENABLE);
Matthias Brugger 1949a1
 	writel(fe, qm->io_base + QM_RAS_FE_ENABLE);
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
-	/* use RAS irq default, so only set QM_RAS_MSI_INT_SEL for MSI */
Matthias Brugger 1949a1
-	writel(msi, qm->io_base + QM_RAS_MSI_INT_SEL);
Matthias Brugger 1949a1
-
Matthias Brugger 1949a1
 	irq_unmask &= readl(qm->io_base + QM_ABNORMAL_INT_MASK);
Matthias Brugger 1949a1
 	writel(irq_unmask, qm->io_base + QM_ABNORMAL_INT_MASK);
Matthias Brugger 1949a1
 }
Matthias Brugger 1949a1
@@ -1207,9 +1176,11 @@ static pci_ers_result_t qm_hw_error_handle_v2(struct hisi_qm *qm)
Matthias Brugger 1949a1
 			qm->err_status.is_qm_ecc_mbit = true;
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 		qm_log_hw_error(qm, error_status);
Matthias Brugger 1949a1
-
Matthias Brugger 1949a1
-		/* clear err sts */
Matthias Brugger 1949a1
-		writel(error_status, qm->io_base + QM_ABNORMAL_INT_SOURCE);
Matthias Brugger 1949a1
+		if (error_status == QM_DB_RANDOM_INVALID) {
Matthias Brugger 1949a1
+			writel(error_status, qm->io_base +
Matthias Brugger 1949a1
+			       QM_ABNORMAL_INT_SOURCE);
Matthias Brugger 1949a1
+			return PCI_ERS_RESULT_RECOVERED;
Matthias Brugger 1949a1
+		}
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 		return PCI_ERS_RESULT_NEED_RESET;
Matthias Brugger 1949a1
 	}
Matthias Brugger 1949a1
@@ -2476,8 +2447,7 @@ static void qm_hw_error_init(struct hisi_qm *qm)
Matthias Brugger 1949a1
 		return;
Matthias Brugger 1949a1
 	}
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
-	qm->ops->hw_error_init(qm, err_info->ce, err_info->nfe,
Matthias Brugger 1949a1
-			       err_info->fe, err_info->msi);
Matthias Brugger 1949a1
+	qm->ops->hw_error_init(qm, err_info->ce, err_info->nfe, err_info->fe);
Matthias Brugger 1949a1
 }
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 static void qm_hw_error_uninit(struct hisi_qm *qm)
Matthias Brugger 1949a1
diff --git a/drivers/crypto/hisilicon/qm.h b/drivers/crypto/hisilicon/qm.h
Matthias Brugger 1949a1
index 80b9746dfe19..fc5e96a02399 100644
Matthias Brugger 1949a1
--- a/drivers/crypto/hisilicon/qm.h
Matthias Brugger 1949a1
+++ b/drivers/crypto/hisilicon/qm.h
Matthias Brugger 1949a1
@@ -74,7 +74,7 @@
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 #define QM_BASE_NFE	(QM_AXI_RRESP | QM_AXI_BRESP | QM_ECC_MBIT | \
Matthias Brugger 1949a1
 			 QM_ACC_GET_TASK_TIMEOUT | QM_DB_TIMEOUT | \
Matthias Brugger 1949a1
-			 QM_OF_FIFO_OF)
Matthias Brugger 1949a1
+			 QM_OF_FIFO_OF | QM_DB_RANDOM_INVALID)
Matthias Brugger 1949a1
 #define QM_BASE_CE			QM_ECC_1BIT
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 #define QM_Q_DEPTH			1024
Matthias Brugger 1949a1
@@ -158,7 +158,6 @@ struct hisi_qm_err_info {
Matthias Brugger 1949a1
 	u32 ce;
Matthias Brugger 1949a1
 	u32 nfe;
Matthias Brugger 1949a1
 	u32 fe;
Matthias Brugger 1949a1
-	u32 msi;
Matthias Brugger 1949a1
 };
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 struct hisi_qm_err_status {
Matthias Brugger 1949a1
@@ -224,7 +223,6 @@ struct hisi_qm {
Matthias Brugger 1949a1
 	struct qm_debug debug;
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 	u32 error_mask;
Matthias Brugger 1949a1
-	u32 msi_mask;
Matthias Brugger 1949a1
 
Matthias Brugger 1949a1
 	struct workqueue_struct *wq;
Matthias Brugger 1949a1
 	struct work_struct work;
Matthias Brugger 1949a1
diff --git a/drivers/crypto/hisilicon/sec2/sec_main.c b/drivers/crypto/hisilicon/sec2/sec_main.c
Matthias Brugger 1949a1
index 74e806fd9ff9..c3381f253d55 100644
Matthias Brugger 1949a1
--- a/drivers/crypto/hisilicon/sec2/sec_main.c
Matthias Brugger 1949a1
+++ b/drivers/crypto/hisilicon/sec2/sec_main.c
Matthias Brugger 1949a1
@@ -682,7 +682,6 @@ static const struct hisi_qm_err_ini sec_err_ini = {
Matthias Brugger 1949a1
 		.nfe			= QM_BASE_NFE | QM_ACC_DO_TASK_TIMEOUT |
Matthias Brugger 1949a1
 					  QM_ACC_WB_NOT_READY_TIMEOUT,
Matthias Brugger 1949a1
 		.fe			= 0,
Matthias Brugger 1949a1
-		.msi			= QM_DB_RANDOM_INVALID,
Matthias Brugger 1949a1
 		.ecc_2bits_mask		= SEC_CORE_INT_STATUS_M_ECC,
Matthias Brugger 1949a1
 		.msi_wr_port		= BIT(0),
Matthias Brugger 1949a1
 		.acpi_rst		= "SRST",
Matthias Brugger 1949a1
diff --git a/drivers/crypto/hisilicon/zip/zip_main.c b/drivers/crypto/hisilicon/zip/zip_main.c
Matthias Brugger 1949a1
index 0ddd56a0a075..6161b1025b7f 100644
Matthias Brugger 1949a1
--- a/drivers/crypto/hisilicon/zip/zip_main.c
Matthias Brugger 1949a1
+++ b/drivers/crypto/hisilicon/zip/zip_main.c
Matthias Brugger 1949a1
@@ -643,7 +643,6 @@ static const struct hisi_qm_err_ini hisi_zip_err_ini = {
Matthias Brugger 1949a1
 		.nfe			= QM_BASE_NFE |
Matthias Brugger 1949a1
 					  QM_ACC_WB_NOT_READY_TIMEOUT,
Matthias Brugger 1949a1
 		.fe			= 0,
Matthias Brugger 1949a1
-		.msi			= QM_DB_RANDOM_INVALID,
Matthias Brugger 1949a1
 		.ecc_2bits_mask		= HZIP_CORE_INT_STATUS_M_ECC,
Matthias Brugger 1949a1
 		.msi_wr_port		= HZIP_WR_PORT,
Matthias Brugger 1949a1
 		.acpi_rst		= "ZRST",
Matthias Brugger 1949a1
-- 
Matthias Brugger 1949a1
2.29.2
Matthias Brugger 1949a1