crypto: qat - add reporting of correctable errors for QAT GEN4
authorShashank Gupta <shashank.gupta@intel.com>
Fri, 20 Oct 2023 10:32:46 +0000 (11:32 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 27 Oct 2023 10:04:27 +0000 (18:04 +0800)
Add logic to detect and report correctable errors in QAT GEN4
devices.
This includes (1) enabling, disabling and handling error reported
through the ERRSOU0 register and (2) logic to log the errors
in the system log.

Signed-off-by: Shashank Gupta <shashank.gupta@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Reviewed-by: Tero Kristo <tero.kristo@linux.intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h

index 0bf243a51527a15462c96af2fea8c359c2185740..4fbaadbe480e07ebd7349dee3fbc3bc735bce7b0 100644 (file)
@@ -1,20 +1,82 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /* Copyright(c) 2023 Intel Corporation */
 #include "adf_common_drv.h"
+#include "adf_gen4_hw_data.h"
 #include "adf_gen4_ras.h"
 
+static void enable_errsou_reporting(void __iomem *csr)
+{
+       /* Enable correctable error reporting in ERRSOU0 */
+       ADF_CSR_WR(csr, ADF_GEN4_ERRMSK0, 0);
+}
+
+static void disable_errsou_reporting(void __iomem *csr)
+{
+       /* Disable correctable error reporting in ERRSOU0 */
+       ADF_CSR_WR(csr, ADF_GEN4_ERRMSK0, ADF_GEN4_ERRSOU0_BIT);
+}
+
+static void enable_ae_error_reporting(struct adf_accel_dev *accel_dev,
+                                     void __iomem *csr)
+{
+       u32 ae_mask = GET_HW_DATA(accel_dev)->ae_mask;
+
+       /* Enable Acceleration Engine correctable error reporting */
+       ADF_CSR_WR(csr, ADF_GEN4_HIAECORERRLOGENABLE_CPP0, ae_mask);
+}
+
+static void disable_ae_error_reporting(void __iomem *csr)
+{
+       /* Disable Acceleration Engine correctable error reporting */
+       ADF_CSR_WR(csr, ADF_GEN4_HIAECORERRLOGENABLE_CPP0, 0);
+}
+
 static void adf_gen4_enable_ras(struct adf_accel_dev *accel_dev)
 {
+       void __iomem *csr = adf_get_pmisc_base(accel_dev);
+
+       enable_errsou_reporting(csr);
+       enable_ae_error_reporting(accel_dev, csr);
 }
 
 static void adf_gen4_disable_ras(struct adf_accel_dev *accel_dev)
 {
+       void __iomem *csr = adf_get_pmisc_base(accel_dev);
+
+       disable_errsou_reporting(csr);
+       disable_ae_error_reporting(csr);
+}
+
+static void adf_gen4_process_errsou0(struct adf_accel_dev *accel_dev,
+                                    void __iomem *csr)
+{
+       u32 aecorrerr = ADF_CSR_RD(csr, ADF_GEN4_HIAECORERRLOG_CPP0);
+
+       aecorrerr &= GET_HW_DATA(accel_dev)->ae_mask;
+
+       dev_warn(&GET_DEV(accel_dev),
+                "Correctable error detected in AE: 0x%x\n",
+                aecorrerr);
+
+       /* Clear interrupt from ERRSOU0 */
+       ADF_CSR_WR(csr, ADF_GEN4_HIAECORERRLOG_CPP0, aecorrerr);
 }
 
 static bool adf_gen4_handle_interrupt(struct adf_accel_dev *accel_dev,
                                      bool *reset_required)
 {
-       return false;
+       void __iomem *csr = adf_get_pmisc_base(accel_dev);
+       u32 errsou = ADF_CSR_RD(csr, ADF_GEN4_ERRSOU0);
+       bool handled = false;
+
+       *reset_required = false;
+
+       if (errsou & ADF_GEN4_ERRSOU0_BIT) {
+               adf_gen4_process_errsou0(accel_dev, csr);
+               handled = true;
+       }
+
+       return handled;
 }
 
 void adf_gen4_init_ras_ops(struct adf_ras_ops *ras_ops)
index 2765d3529c0d94e39ce824004d6323484b49fe27..e6c4dfbb23896144c7e9ec28777c761411f98714 100644 (file)
@@ -3,8 +3,19 @@
 #ifndef ADF_GEN4_RAS_H_
 #define ADF_GEN4_RAS_H_
 
+#include <linux/bits.h>
+
 struct adf_ras_ops;
 
+/* ERRSOU0 Correctable error mask*/
+#define ADF_GEN4_ERRSOU0_BIT                           BIT(0)
+
+/* HI AE Correctable error log */
+#define ADF_GEN4_HIAECORERRLOG_CPP0                    0x41A308
+
+/* HI AE Correctable error log enable */
+#define ADF_GEN4_HIAECORERRLOGENABLE_CPP0              0x41A318
+
 void adf_gen4_init_ras_ops(struct adf_ras_ops *ras_ops);
 
 #endif /* ADF_GEN4_RAS_H_ */