add ras error detection and reporting for GEN4 devices
Subsystems (2)
cover add ras error detection and reporting for GEN4 devices
This set introduces the required infrastructure to detect, report, and count errors in the QAT drivers and enables the reporting of errors in QAT GEN4 devices. In particular, it enables the reporting of correctable, nonfatal, and fatal errors.
In addition, exposes the number of occurrences of each type of error through sysfs.
The first patch adds the common infrastructures for error reporting for all generations of QAT. Patches from 2 to 5 and 7 enable the reporting of errors flagged through the register ERRSOUx for GEN4 devices. ERRSOUx error reporting for GEN4 devices.
Patch 6 adds a helper to retrieve the base address of the aram bar.
Patch 8 introduces the ras counter interface for counting QAT-specific errors, and exposes such counters through sysfs. Patch 9 adds logic to count correctable, nonfatal, and fatal errors for GEN4 devices.
Shashank Gupta (9):
crypto: qat - add infrastructure for error reporting
crypto: qat - add reporting of correctable errors for QAT GEN4
crypto: qat - add reporting of errors from ERRSOU1 for QAT GEN4
crypto: qat - add handling of errors from ERRSOU2 for QAT GEN4
crypto: qat - add handling of compression related errors for QAT GEN4
crypto: qat - add adf_get_aram_base() helper function
crypto: qat - add handling of errors from ERRSOU3 for QAT GEN4
crypto: qat - add error counters
crypto: qat - count QAT GEN4 errors
.../ABI/testing/sysfs-driver-qat_ras | 42 + .../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 13 + .../intel/qat/qat_4xxx/adf_4xxx_hw_data.h | 17 + drivers/crypto/intel/qat/qat_4xxx/adf_drv.c | 1 + drivers/crypto/intel/qat/qat_common/Makefile | 2 + .../intel/qat/qat_common/adf_accel_devices.h | 34 + .../intel/qat/qat_common/adf_common_drv.h | 10 + .../intel/qat/qat_common/adf_gen4_ras.c | 1566 +++++++++++++++++ .../intel/qat/qat_common/adf_gen4_ras.h | 825 +++++++++ .../crypto/intel/qat/qat_common/adf_init.c | 9 + drivers/crypto/intel/qat/qat_common/adf_isr.c | 18 + .../qat/qat_common/adf_sysfs_ras_counters.c | 112 ++ .../qat/qat_common/adf_sysfs_ras_counters.h | 28 + 13 files changed, 2677 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-driver-qat_ras create mode 100644 drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c create mode 100644 drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.c create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.h
Signature · 1 line
2.41.0
PATCH 1/9 crypto: qat - add infrastructure for error reporting
Add infrastructure for enabling, disabling and reporting errors in the QAT driver. This adds a new structure, adf_ras_ops, to adf_hw_device_data that contains the following methods:
- enable_ras_errors(): allows to enable RAS errors at device initialization.
- disable_ras_errors(): allows to disable RAS errors at device shutdown.
- handle_interrupt(): allows to detect if there is an error and report if a reset is required. This is executed immediately after the error is reported, in the context of an ISR.
An initial, empty, implementation of the methods above is provided for QAT GEN4.
--- .../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 2 ++ drivers/crypto/intel/qat/qat_common/Makefile | 1 + .../intel/qat/qat_common/adf_accel_devices.h | 8 ++++++ .../intel/qat/qat_common/adf_gen4_ras.c | 26 +++++++++++++++++++ .../intel/qat/qat_common/adf_gen4_ras.h | 10 +++++++ .../crypto/intel/qat/qat_common/adf_init.c | 6 +++++ drivers/crypto/intel/qat/qat_common/adf_isr.c | 18 +++++++++++++ 7 files changed, 71 insertions(+) create mode 100644 drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c create mode 100644 drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h
drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c +2 -0
@@ -9,6 +9,7 @@#include <adf_gen4_hw_data.h> #include <adf_gen4_pfvf.h> #include <adf_gen4_pm.h> +#include "adf_gen4_ras.h" #include <adf_gen4_timer.h> #include "adf_4xxx_hw_data.h" #include "adf_cfg_services.h"
@@ -541,6 +542,7 @@ void adf_init_hw_data_4xxx(struct adf_hw_device_data *hw_data, u32 dev_id)adf_gen4_init_hw_csr_ops (&hw_data->csr_ops);adf_gen4_init_pf_pfvf_ops (&hw_data->pfvf_ops);adf_gen4_init_dc_ops (&hw_data->dc_ops); +adf_gen4_init_ras_ops (&hw_data->ras_ops); }void adf_clean_hw_data_4xxx (struct adf_hw_device_data *hw_data)
drivers/crypto/intel/qat/qat_common/Makefile +1 -0
@@ -18,6 +18,7 @@ intel_qat-objs := adf_cfg.o \ adf_gen4_pm.o \ adf_gen2_dc.o \ adf_gen4_dc.o \ + adf_gen4_ras.o \ adf_gen4_timer.o \ adf_clock.o \ qat_crypto.o \
drivers/crypto/intel/qat/qat_common/adf_accel_devices.h +8 -0
@@ -152,6 +152,13 @@ struct adf_accel_dev;struct adf_etr_data ;struct adf_etr_ring_data ; +struct adf_ras_ops { +void (*enable_ras_errors)(struct adf_accel_dev *accel_dev); +void (*disable_ras_errors)(struct adf_accel_dev *accel_dev); +bool (*handle_interrupt)(struct adf_accel_dev *accel_dev, +bool *reset_required); +}; +struct adf_pfvf_ops {int (*enable_comms)(struct adf_accel_dev *accel_dev);u32 (*get_pf2vf_offset)(u32 i);
@@ -214,6 +221,7 @@ struct adf_hw_device_data {struct adf_pfvf_ops pfvf_ops;struct adf_hw_csr_ops csr_ops;struct adf_dc_ops dc_ops; +struct adf_ras_ops ras_ops;const char *fw_name;const char *fw_mmp_name;u32 fuses;
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c new file +26 -0
@@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright(c) 2023 Intel Corporation */ +#include "adf_common_drv.h" +#include "adf_gen4_ras.h" + +static void adf_gen4_enable_ras (struct adf_accel_dev *accel_dev) +{ +} + +static void adf_gen4_disable_ras (struct adf_accel_dev *accel_dev) +{ +} + +static bool adf_gen4_handle_interrupt (struct adf_accel_dev *accel_dev, +bool *reset_required) +{ +return false; +} + +void adf_gen4_init_ras_ops (struct adf_ras_ops *ras_ops) +{ + ras_ops->enable_ras_errors = adf_gen4_enable_ras; + ras_ops->disable_ras_errors = adf_gen4_disable_ras; + ras_ops->handle_interrupt = adf_gen4_handle_interrupt; +} +EXPORT_SYMBOL_GPL (adf_gen4_init_ras_ops);
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h new file +10 -0
@@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright(c) 2023 Intel Corporation */ +#ifndef ADF_GEN4_RAS_H_ +#define ADF_GEN4_RAS_H_ + +struct adf_ras_ops ; + +void adf_gen4_init_ras_ops (struct adf_ras_ops *ras_ops); + +#endif /* ADF_GEN4_RAS_H_ */
drivers/crypto/intel/qat/qat_common/adf_init.c +6 -0
@@ -116,6 +116,9 @@ static int adf_dev_init(struct adf_accel_dev *accel_dev) }set_bit (ADF_STATUS_IRQ_ALLOCATED , &accel_dev->status); +if (hw_data->ras_ops.enable_ras_errors) + hw_data->ras_ops.enable_ras_errors (accel_dev); + hw_data->enable_ints (accel_dev); hw_data->enable_error_correction (accel_dev);
@@ -350,6 +353,9 @@ static void adf_dev_shutdown(struct adf_accel_dev *accel_dev)clear_bit (accel_dev->accel_id, service->init_status); } +if (hw_data->ras_ops.disable_ras_errors) + hw_data->ras_ops.disable_ras_errors (accel_dev); +adf_heartbeat_shutdown (accel_dev); hw_data->disable_iov (accel_dev);
drivers/crypto/intel/qat/qat_common/adf_isr.c +18 -0
@@ -132,6 +132,21 @@ static bool adf_handle_pm_int(struct adf_accel_dev *accel_dev)return false; } +static bool adf_handle_ras_int (struct adf_accel_dev *accel_dev) +{ +struct adf_ras_ops *ras_ops = &accel_dev->hw_device->ras_ops; +bool reset_required; + +if (ras_ops->handle_interrupt && + ras_ops->handle_interrupt (accel_dev, &reset_required)) { +if (reset_required) +dev_err (&GET_DEV (accel_dev),"Fatal error, reset required\n" ); +return true; + } + +return false; +} +static irqreturn_t adf_msix_isr_ae (int irq,void *dev_ptr) {struct adf_accel_dev *accel_dev = dev_ptr;
@@ -145,6 +160,9 @@ static irqreturn_t adf_msix_isr_ae(int irq, void *dev_ptr)if (adf_handle_pm_int (accel_dev))return IRQ_HANDLED ; +if (adf_handle_ras_int (accel_dev)) +return IRQ_HANDLED ; +dev_dbg (&GET_DEV (accel_dev),"qat_dev%d spurious AE interrupt\n" , accel_dev->accel_id);
Signature · 1 line
2.41.0
PATCH 2/9 crypto: qat - add reporting of correctable errors for QAT GEN4
In reply to Shashank GuptaAdd 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.
--- .../intel/qat/qat_common/adf_gen4_ras.c | 64 ++++++++++++++++++- .../intel/qat/qat_common/adf_gen4_ras.h | 11 ++++ 2 files changed, 74 insertions(+), 1 deletion(-)
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c +63 -1
@@ -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)
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h +11 -0
@@ -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_ */
Signature · 1 line
2.41.0
PATCH 3/9 crypto: qat - add reporting of errors from ERRSOU1 for QAT GEN4
In reply to Shashank GuptaAdd logic to detect and report uncorrectable errors reported through the ERRSOU1 register in QAT GEN4 devices.
This also introduces the adf_dev_err_mask structure as part of adf_hw_device_data which will allow to provide different error masks per device generation.
--- .../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 6 + .../intel/qat/qat_4xxx/adf_4xxx_hw_data.h | 2 + .../intel/qat/qat_common/adf_accel_devices.h | 6 + .../intel/qat/qat_common/adf_gen4_ras.c | 289 ++++++++++++++++++ .../intel/qat/qat_common/adf_gen4_ras.h | 190 ++++++++++++ 5 files changed, 493 insertions(+)
drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c +6 -0
@@ -476,6 +476,11 @@ static u32 uof_get_ae_mask(struct adf_accel_dev *accel_dev, u32 obj_num) } } +static void adf_gen4_set_err_mask (struct adf_dev_err_mask *dev_err_mask) +{ + dev_err_mask->cppagentcmdpar_mask =ADF_4XXX_HICPPAGENTCMDPARERRLOG_MASK ; +} +void adf_init_hw_data_4xxx (struct adf_hw_device_data *hw_data,u32 dev_id) { hw_data->dev_class = &adf_4xxx_class;
@@ -539,6 +544,7 @@ void adf_init_hw_data_4xxx(struct adf_hw_device_data *hw_data, u32 dev_id) hw_data->get_hb_clock = get_heartbeat_clock; hw_data->num_hb_ctrs =ADF_NUM_HB_CNT_PER_AE ; +adf_gen4_set_err_mask (&hw_data->dev_err_mask);adf_gen4_init_hw_csr_ops (&hw_data->csr_ops);adf_gen4_init_pf_pfvf_ops (&hw_data->pfvf_ops);adf_gen4_init_dc_ops (&hw_data->dc_ops);
drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.h +2 -0
@@ -28,6 +28,8 @@#define ADF_4XXX_ACCELENGINES_MASK (0x1FF)#define ADF_4XXX_ADMIN_AE_MASK (0x100) +#define ADF_4XXX_HICPPAGENTCMDPARERRLOG_MASK 0x1F +#define ADF_4XXX_ETR_MAX_BANKS 64/* MSIX interrupt */
drivers/crypto/intel/qat/qat_common/adf_accel_devices.h +6 -0
@@ -176,6 +176,10 @@ struct adf_dc_ops {void (*build_deflate_ctx)(void *ctx); }; +struct adf_dev_err_mask { +u32 cppagentcmdpar_mask; +}; +struct adf_hw_device_data {struct adf_hw_device_class *dev_class;u32 (*get_accel_mask)(struct adf_hw_device_data *self);
@@ -222,6 +226,7 @@ struct adf_hw_device_data {struct adf_hw_csr_ops csr_ops;struct adf_dc_ops dc_ops;struct adf_ras_ops ras_ops; +struct adf_dev_err_mask dev_err_mask;const char *fw_name;const char *fw_mmp_name;u32 fuses;
@@ -270,6 +275,7 @@ struct adf_hw_device_data {#define GET_SRV_TYPE (accel_dev, idx) \ (((GET_HW_DATA(accel_dev)->ring_to_svc_map) >> (ADF_SRV_TYPE_BIT_LEN * (idx))) \ & ADF_SRV_TYPE_MASK) +#define GET_ERR_MASK (accel_dev) (&GET_HW_DATA(accel_dev)->dev_err_mask)#define GET_MAX_ACCELENGINES (accel_dev) (GET_HW_DATA(accel_dev)->num_engines)#define GET_CSR_OPS (accel_dev) (&(accel_dev)->hw_device->csr_ops)#define GET_PFVF_OPS (accel_dev) (&(accel_dev)->hw_device->pfvf_ops)
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c +289 -0
337 lines not on this page · raw message
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h +190 -0
196 lines not on this page · raw message
Signature · 1 line
2.41.0
PATCH 4/9 crypto: qat - add handling of errors from ERRSOU2 for QAT GEN4
In reply to Shashank GuptaAdd logic to detect, report and handle uncorrectable errors reported through the ERRSOU2 register in QAT GEN4 devices.
--- .../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 5 + .../intel/qat/qat_4xxx/adf_4xxx_hw_data.h | 15 + .../intel/qat/qat_common/adf_accel_devices.h | 6 + .../intel/qat/qat_common/adf_gen4_ras.c | 709 ++++++++++++++++++ .../intel/qat/qat_common/adf_gen4_ras.h | 320 ++++++++ 5 files changed, 1055 insertions(+)
drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.c +5 -0
@@ -479,6 +479,11 @@ static u32 uof_get_ae_mask(struct adf_accel_dev *accel_dev, u32 obj_num)static void adf_gen4_set_err_mask (struct adf_dev_err_mask *dev_err_mask) { dev_err_mask->cppagentcmdpar_mask =ADF_4XXX_HICPPAGENTCMDPARERRLOG_MASK ; + dev_err_mask->parerr_ath_cph_mask =ADF_4XXX_PARITYERRORMASK_ATH_CPH_MASK ; + dev_err_mask->parerr_cpr_xlt_mask =ADF_4XXX_PARITYERRORMASK_CPR_XLT_MASK ; + dev_err_mask->parerr_dcpr_ucs_mask =ADF_4XXX_PARITYERRORMASK_DCPR_UCS_MASK ; + dev_err_mask->parerr_pke_mask =ADF_4XXX_PARITYERRORMASK_PKE_MASK ; + dev_err_mask->ssmfeatren_mask =ADF_4XXX_SSMFEATREN_MASK ; }void adf_init_hw_data_4xxx (struct adf_hw_device_data *hw_data,u32 dev_id)
drivers/crypto/intel/qat/qat_4xxx/adf_4xxx_hw_data.h +15 -0
@@ -29,6 +29,21 @@#define ADF_4XXX_ADMIN_AE_MASK (0x100)#define ADF_4XXX_HICPPAGENTCMDPARERRLOG_MASK 0x1F +#define ADF_4XXX_PARITYERRORMASK_ATH_CPH_MASK 0xF000F +#define ADF_4XXX_PARITYERRORMASK_CPR_XLT_MASK 0x10001 +#define ADF_4XXX_PARITYERRORMASK_DCPR_UCS_MASK 0x30007 +#define ADF_4XXX_PARITYERRORMASK_PKE_MASK 0x3F + +/* +* SSMFEATREN bit mask +* BIT(4) - enables parity detection on CPP +* BIT(12) - enables the logging of push/pull data errors +* in pperr register +* BIT(16) - BIT(23) - enable parity detection on SPPs +*/ +#define ADF_4XXX_SSMFEATREN_MASK \ + (BIT(4) | BIT(12) | BIT(16) | BIT(17) | BIT(18) | \ + BIT(19) | BIT(20) | BIT(21) | BIT(22) | BIT(23))#define ADF_4XXX_ETR_MAX_BANKS 64
drivers/crypto/intel/qat/qat_common/adf_accel_devices.h +6 -0
@@ -178,6 +178,12 @@ struct adf_dc_ops {struct adf_dev_err_mask {u32 cppagentcmdpar_mask; +u32 parerr_ath_cph_mask; +u32 parerr_cpr_xlt_mask; +u32 parerr_dcpr_ucs_mask; +u32 parerr_pke_mask; +u32 parerr_wat_wcp_mask; +u32 ssmfeatren_mask; };struct adf_hw_device_data {
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c +709 -0
766 lines not on this page · raw message
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h +320 -0
326 lines not on this page · raw message
Signature · 1 line
2.41.0
PATCH 5/9 crypto: qat - add handling of compression related errors for QAT GEN4
In reply to Shashank GuptaAdd logic to detect, report and handle correctable and uncorrectable errors related to the compression hardware.
These are detected through the EXPRPSSMXLT, EXPRPSSMCPR and EXPRPSSMDCPR registers.
--- .../intel/qat/qat_common/adf_gen4_ras.c | 76 ++++++++++++++++++- .../intel/qat/qat_common/adf_gen4_ras.h | 76 +++++++++++++++++++ 2 files changed, 151 insertions(+), 1 deletion(-)
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c +75 -1
@@ -996,13 +996,87 @@ static bool adf_handle_iaintstatssm(struct adf_accel_dev *accel_dev,return reset_required; } +static bool adf_handle_exprpssmcmpr (struct adf_accel_dev *accel_dev, +void __iomem *csr) +{ +u32 reg =ADF_CSR_RD (csr,ADF_GEN4_EXPRPSSMCPR ); + + reg &=ADF_GEN4_EXPRPSSMCPR_UNCERR_BITMASK ; +if (!reg) +return false; + +dev_err (&GET_DEV (accel_dev), +"Uncorrectable error exception in SSM CMP: 0x%x" , reg); + +ADF_CSR_WR (csr,ADF_GEN4_EXPRPSSMCPR , reg); + +return false; +} + +static bool adf_handle_exprpssmxlt (struct adf_accel_dev *accel_dev, +void __iomem *csr) +{ +u32 reg =ADF_CSR_RD (csr,ADF_GEN4_EXPRPSSMXLT ); + + reg &=ADF_GEN4_EXPRPSSMXLT_UNCERR_BITMASK | +ADF_GEN4_EXPRPSSMXLT_CERR_BIT ; +if (!reg) +return false; + +if (reg &ADF_GEN4_EXPRPSSMXLT_UNCERR_BITMASK ) +dev_err (&GET_DEV (accel_dev), +"Uncorrectable error exception in SSM XLT: 0x%x" , reg); + +if (reg &ADF_GEN4_EXPRPSSMXLT_CERR_BIT ) +dev_warn (&GET_DEV (accel_dev), +"Correctable error exception in SSM XLT: 0x%x" , reg); + +ADF_CSR_WR (csr,ADF_GEN4_EXPRPSSMXLT , reg); + +return false; +} + +static bool adf_handle_exprpssmdcpr (struct adf_accel_dev *accel_dev, +void __iomem *csr) +{ +u32 reg; +int i; + +for (i =0 ; i <ADF_GEN4_DCPR_SLICES_NUM ; i++) { + reg =ADF_CSR_RD (csr,ADF_GEN4_EXPRPSSMDCPR (i)); + reg &=ADF_GEN4_EXPRPSSMDCPR_UNCERR_BITMASK | +ADF_GEN4_EXPRPSSMDCPR_CERR_BITMASK ; +if (!reg) +continue ; + +if (reg &ADF_GEN4_EXPRPSSMDCPR_UNCERR_BITMASK ) +dev_err (&GET_DEV (accel_dev), +"Uncorrectable error exception in SSM DCMP: 0x%x" , reg); + +if (reg &ADF_GEN4_EXPRPSSMDCPR_CERR_BITMASK ) +dev_warn (&GET_DEV (accel_dev), +"Correctable error exception in SSM DCMP: 0x%x" , reg); + +ADF_CSR_WR (csr,ADF_GEN4_EXPRPSSMDCPR (i), reg); + } + +return false; +} +static bool adf_handle_ssm (struct adf_accel_dev *accel_dev,void __iomem *csr,u32 errsou) { +bool reset_required; +if (!(errsou &ADF_GEN4_ERRSOU2_SSM_ERR_BIT ))return false; -return adf_handle_iaintstatssm (accel_dev, csr); + reset_required =adf_handle_iaintstatssm (accel_dev, csr); + reset_required |=adf_handle_exprpssmcmpr (accel_dev, csr); + reset_required |=adf_handle_exprpssmxlt (accel_dev, csr); + reset_required |=adf_handle_exprpssmdcpr (accel_dev, csr); + +return reset_required; } static bool adf_handle_cpp_cfc_err(struct adf_accel_dev *accel_dev,
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h +76 -0
82 lines not on this page · raw message
Signature · 1 line
2.41.0
PATCH 6/9 crypto: qat - add adf_get_aram_base() helper function
In reply to Shashank GuptaAdd the function adf_get_aram_base() which allows to return the base address of the aram bar.
--- drivers/crypto/intel/qat/qat_common/adf_common_drv.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/crypto/intel/qat/qat_common/adf_common_drv.h +10 -0
@@ -248,4 +248,14 @@ static inline void __iomem *adf_get_pmisc_base(struct adf_accel_dev *accel_dev) return pmisc->virt_addr; } +static inline void __iomem *adf_get_aram_base (struct adf_accel_dev *accel_dev) +{ +struct adf_hw_device_data *hw_data = accel_dev->hw_device; +struct adf_bar *param; + + param = &GET_BARS (accel_dev)[hw_data->get_sram_bar_id (hw_data)]; + +return param->virt_addr; +} +#endif
Signature · 1 line
2.41.0
PATCH 7/9 crypto: qat - add handling of errors from ERRSOU3 for QAT GEN4
In reply to Shashank GuptaAdd logic to detect, report and handle uncorrectable errors reported through the ERRSOU3 register in QAT GEN4 devices.
--- .../intel/qat/qat_common/adf_gen4_ras.c | 256 ++++++++++++++++++ .../intel/qat/qat_common/adf_gen4_ras.h | 218 +++++++++++++++ 2 files changed, 474 insertions(+)
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c +256 -0
@@ -19,6 +19,14 @@ static void enable_errsou_reporting(void __iomem *csr)ADF_CSR_WR (csr,ADF_GEN4_ERRMSK2 ,ADF_GEN4_ERRSOU2_PM_INT_BIT |ADF_GEN4_ERRSOU2_CPP_CFC_ATT_INT_BITMASK ); + +/* +* Enable uncorrectable error reporting in ERRSOU3 +* but disable RLT error interrupt and VFLR notify interrupt by default +*/ +ADF_CSR_WR (csr,ADF_GEN4_ERRMSK3 , +ADF_GEN4_ERRSOU3_RLTERROR_BIT | +ADF_GEN4_ERRSOU3_VFLRNOTIFY_BIT ); }static void disable_errsou_reporting (void __iomem *csr)
@@ -35,6 +43,9 @@ static void disable_errsou_reporting(void __iomem *csr) val =ADF_CSR_RD (csr,ADF_GEN4_ERRMSK2 ); val |=ADF_GEN4_ERRSOU2_DIS_BITMASK ;ADF_CSR_WR (csr,ADF_GEN4_ERRMSK2 , val); + +/* Disable uncorrectable error reporting in ERRSOU3 */ +ADF_CSR_WR (csr,ADF_GEN4_ERRMSK3 ,ADF_GEN4_ERRSOU3_BITMASK ); } static void enable_ae_error_reporting(struct adf_accel_dev *accel_dev,
@@ -82,6 +93,8 @@ static void disable_cpp_error_reporting(void __iomem *csr)static void enable_ti_ri_error_reporting (void __iomem *csr) { +u32 reg; +/* Enable RI Memory error reporting */ ADF_CSR_WR(csr, ADF_GEN4_RI_MEM_PAR_ERR_EN0, ADF_GEN4_RIMEM_PARERR_STS_FATAL_BITMASK |
@@ -96,10 +109,26 @@ static void enable_ti_ri_error_reporting(void __iomem *csr)ADF_CSR_WR (csr,ADF_GEN4_TI_PUSHFUB_PAR_ERR_MASK ,0 );ADF_CSR_WR (csr,ADF_GEN4_TI_CD_PAR_ERR_MASK ,0 );ADF_CSR_WR (csr,ADF_GEN4_TI_TRNSB_PAR_ERR_MASK ,0 ); + +/* Enable error handling in RI, TI CPP interface control registers */ +ADF_CSR_WR (csr,ADF_GEN4_RICPPINTCTL ,ADF_GEN4_RICPPINTCTL_BITMASK ); + +ADF_CSR_WR (csr,ADF_GEN4_TICPPINTCTL ,ADF_GEN4_TICPPINTCTL_BITMASK ); + +/* +* Enable error detection and reporting in TIMISCSTS +* with bits 1, 2 and 30 value preserved +*/ + reg =ADF_CSR_RD (csr,ADF_GEN4_TIMISCCTL ); + reg &=ADF_GEN4_TIMSCCTL_RELAY_BITMASK ; + reg |=ADF_GEN4_TIMISCCTL_BIT ; +ADF_CSR_WR (csr,ADF_GEN4_TIMISCCTL , reg); }static void disable_ti_ri_error_reporting (void __iomem *csr) { +u32 reg; +/* Disable RI Memory error reporting */ ADF_CSR_WR (csr,ADF_GEN4_RI_MEM_PAR_ERR_EN0 ,0 );
@@ -117,6 +146,19 @@ static void disable_ti_ri_error_reporting(void __iomem *csr) ADF_GEN4_TI_CD_PAR_STS_BITMASK);ADF_CSR_WR (csr,ADF_GEN4_TI_TRNSB_PAR_ERR_MASK ,ADF_GEN4_TI_TRNSB_PAR_STS_BITMASK ); + +/* Disable error handling in RI, TI CPP interface control registers */ +ADF_CSR_WR (csr,ADF_GEN4_RICPPINTCTL ,0 ); + +ADF_CSR_WR (csr,ADF_GEN4_TICPPINTCTL ,0 ); + +/* +* Disable error detection and reporting in TIMISCSTS +* with bits 1, 2 and 30 value preserved +*/ + reg =ADF_CSR_RD (csr,ADF_GEN4_TIMISCCTL ); + reg &=ADF_GEN4_TIMSCCTL_RELAY_BITMASK ; +ADF_CSR_WR (csr,ADF_GEN4_TIMISCCTL , reg); } static void enable_rf_error_reporting(struct adf_accel_dev *accel_dev,
@@ -251,8 +293,32 @@ static void disable_ssm_error_reporting(struct adf_accel_dev *accel_dev, err_mask->parerr_wat_wcp_mask); } +static void enable_aram_error_reporting (void __iomem *csr) +{ +ADF_CSR_WR (csr,ADF_GEN4_REG_ARAMCERRUERR_EN , +ADF_GEN4_REG_ARAMCERRUERR_EN_BITMASK ); + +ADF_CSR_WR (csr,ADF_GEN4_REG_ARAMCERR , +ADF_GEN4_REG_ARAMCERR_EN_BITMASK ); + +ADF_CSR_WR (csr,ADF_GEN4_REG_ARAMUERR , +ADF_GEN4_REG_ARAMUERR_EN_BITMASK ); + +ADF_CSR_WR (csr,ADF_GEN4_REG_CPPMEMTGTERR , +ADF_GEN4_REG_CPPMEMTGTERR_EN_BITMASK ); +} + +static void disable_aram_error_reporting (void __iomem *csr) +{ +ADF_CSR_WR (csr,ADF_GEN4_REG_ARAMCERRUERR_EN ,0 ); +ADF_CSR_WR (csr,ADF_GEN4_REG_ARAMCERR ,0 ); +ADF_CSR_WR (csr,ADF_GEN4_REG_ARAMUERR ,0 ); +ADF_CSR_WR (csr,ADF_GEN4_REG_CPPMEMTGTERR ,0 ); +} +static void adf_gen4_enable_ras (struct adf_accel_dev *accel_dev) { +void __iomem *aram_csr =adf_get_aram_base (accel_dev);void __iomem *csr =adf_get_pmisc_base (accel_dev);enable_errsou_reporting (csr);
@@ -261,10 +327,12 @@ static void adf_gen4_enable_ras(struct adf_accel_dev *accel_dev)enable_ti_ri_error_reporting (csr);enable_rf_error_reporting (accel_dev, csr);enable_ssm_error_reporting (accel_dev, csr); +enable_aram_error_reporting (aram_csr); }static void adf_gen4_disable_ras (struct adf_accel_dev *accel_dev) { +void __iomem *aram_csr =adf_get_aram_base (accel_dev);void __iomem *csr =adf_get_pmisc_base (accel_dev);disable_errsou_reporting (csr);
@@ -273,6 +341,7 @@ static void adf_gen4_disable_ras(struct adf_accel_dev *accel_dev)disable_ti_ri_error_reporting (csr);disable_rf_error_reporting (accel_dev, csr);disable_ssm_error_reporting (accel_dev, csr); +disable_aram_error_reporting (aram_csr); } static void adf_gen4_process_errsou0(struct adf_accel_dev *accel_dev,
@@ -1122,9 +1191,190 @@ static void adf_gen4_process_errsou2(struct adf_accel_dev *accel_dev, *reset_required |=adf_handle_cpp_cfc_err (accel_dev, csr, errsou); } +static bool adf_handle_timiscsts (struct adf_accel_dev *accel_dev, +void __iomem *csr,u32 errsou) +{ +u32 timiscsts; + +if (!(errsou &ADF_GEN4_ERRSOU3_TIMISCSTS_BIT )) +return false; + + timiscsts =ADF_CSR_RD (csr,ADF_GEN4_TIMISCSTS ); + +dev_err (&GET_DEV (accel_dev), +"Fatal error in Transmit Interface: 0x%x\n" , timiscsts); + +return true; +} + +static bool adf_handle_ricppintsts (struct adf_accel_dev *accel_dev, +void __iomem *csr,u32 errsou) +{ +u32 ricppintsts; + +if (!(errsou &ADF_GEN4_ERRSOU3_RICPPINTSTS_BITMASK )) +return false; + + ricppintsts =ADF_CSR_RD (csr,ADF_GEN4_RICPPINTSTS ); + ricppintsts &=ADF_GEN4_RICPPINTSTS_BITMASK ; + +dev_err (&GET_DEV (accel_dev), +"RI CPP Uncorrectable Error: 0x%x\n" , ricppintsts); + +ADF_CSR_WR (csr,ADF_GEN4_RICPPINTSTS , ricppintsts); + +return false; +} + +static bool adf_handle_ticppintsts (struct adf_accel_dev *accel_dev, +void __iomem *csr,u32 errsou) +{ +u32 ticppintsts; + +if (!(errsou &ADF_GEN4_ERRSOU3_TICPPINTSTS_BITMASK )) +return false; + + ticppintsts =ADF_CSR_RD (csr,ADF_GEN4_TICPPINTSTS ); + ticppintsts &=ADF_GEN4_TICPPINTSTS_BITMASK ; + +dev_err (&GET_DEV (accel_dev), +"TI CPP Uncorrectable Error: 0x%x\n" , ticppintsts); + +ADF_CSR_WR (csr,ADF_GEN4_TICPPINTSTS , ticppintsts); + +return false; +} + +static bool adf_handle_aramcerr (struct adf_accel_dev *accel_dev, +void __iomem *csr,u32 errsou) +{ +u32 aram_cerr; + +if (!(errsou &ADF_GEN4_ERRSOU3_REG_ARAMCERR_BIT )) +return false; + + aram_cerr =ADF_CSR_RD (csr,ADF_GEN4_REG_ARAMCERR ); + aram_cerr &=ADF_GEN4_REG_ARAMCERR_BIT ; + +dev_warn (&GET_DEV (accel_dev), +"ARAM correctable error : 0x%x\n" , aram_cerr); + + aram_cerr |=ADF_GEN4_REG_ARAMCERR_EN_BITMASK ; + +ADF_CSR_WR (csr,ADF_GEN4_REG_ARAMCERR , aram_cerr); + +return false; +} + +static bool adf_handle_aramuerr (struct adf_accel_dev *accel_dev, +void __iomem *csr,u32 errsou) +{ +bool reset_required = false; +u32 aramuerr; + +if (!(errsou &ADF_GEN4_ERRSOU3_REG_ARAMUERR_BIT )) +return false; + + aramuerr =ADF_CSR_RD (csr,ADF_GEN4_REG_ARAMUERR ); + aramuerr &=ADF_GEN4_REG_ARAMUERR_ERROR_BIT | +ADF_GEN4_REG_ARAMUERR_MULTI_ERRORS_BIT ; + +if (!aramuerr) +return false; + +if (aramuerr &ADF_GEN4_REG_ARAMUERR_MULTI_ERRORS_BIT ) { +dev_err (&GET_DEV (accel_dev), +"ARAM multiple uncorrectable errors: 0x%x\n" , aramuerr); + + reset_required = true; + }else { +dev_err (&GET_DEV (accel_dev), +"ARAM uncorrectable error: 0x%x\n" , aramuerr); + } + + aramuerr |=ADF_GEN4_REG_ARAMUERR_EN_BITMASK ; + +ADF_CSR_WR (csr,ADF_GEN4_REG_ARAMUERR , aramuerr); + +return reset_required; +} + +static bool adf_handle_reg_cppmemtgterr (struct adf_accel_dev *accel_dev, +void __iomem *csr,u32 errsou) +{ +bool reset_required = false; +u32 cppmemtgterr; + +if (!(errsou &ADF_GEN4_ERRSOU3_REG_ARAMUERR_BIT )) +return false; + + cppmemtgterr =ADF_CSR_RD (csr,ADF_GEN4_REG_CPPMEMTGTERR ); + cppmemtgterr &=ADF_GEN4_REG_CPPMEMTGTERR_BITMASK | +ADF_GEN4_REG_CPPMEMTGTERR_MULTI_ERRORS_BIT ; +if (!cppmemtgterr) +return false; + +if (cppmemtgterr &ADF_GEN4_REG_CPPMEMTGTERR_MULTI_ERRORS_BIT ) { +dev_err (&GET_DEV (accel_dev), +"Misc memory target multiple uncorrectable errors: 0x%x\n" , + cppmemtgterr); + + reset_required = true; + }else { +dev_err (&GET_DEV (accel_dev), +"Misc memory target uncorrectable error: 0x%x\n" , cppmemtgterr); + } + + cppmemtgterr |=ADF_GEN4_REG_CPPMEMTGTERR_EN_BITMASK ; + +ADF_CSR_WR (csr,ADF_GEN4_REG_CPPMEMTGTERR , cppmemtgterr); + +return reset_required; +} + +static bool adf_handle_atufaultstatus (struct adf_accel_dev *accel_dev, +void __iomem *csr,u32 errsou) +{ +u32 i; +u32 max_rp_num =GET_HW_DATA (accel_dev)->num_banks; + +if (!(errsou &ADF_GEN4_ERRSOU3_ATUFAULTSTATUS_BIT )) +return false; + +for (i =0 ; i < max_rp_num; i++) { +u32 atufaultstatus =ADF_CSR_RD (csr,ADF_GEN4_ATUFAULTSTATUS (i)); + + atufaultstatus &=ADF_GEN4_ATUFAULTSTATUS_BIT ; + +if (atufaultstatus) { +dev_err (&GET_DEV (accel_dev), +"Ring Pair (%u) ATU detected fault: 0x%x\n" , i, + atufaultstatus); + +ADF_CSR_WR (csr,ADF_GEN4_ATUFAULTSTATUS (i), atufaultstatus); + } + } + +return false; +} + +static void adf_gen4_process_errsou3 (struct adf_accel_dev *accel_dev, +void __iomem *csr,void __iomem *aram_csr, +u32 errsou,bool *reset_required) +{ + *reset_required |=adf_handle_timiscsts (accel_dev, csr, errsou); + *reset_required |=adf_handle_ricppintsts (accel_dev, csr, errsou); + *reset_required |=adf_handle_ticppintsts (accel_dev, csr, errsou); + *reset_required |=adf_handle_aramcerr (accel_dev, aram_csr, errsou); + *reset_required |=adf_handle_aramuerr (accel_dev, aram_csr, errsou); + *reset_required |=adf_handle_reg_cppmemtgterr (accel_dev, aram_csr, errsou); + *reset_required |=adf_handle_atufaultstatus (accel_dev, csr, errsou); +} +static bool adf_gen4_handle_interrupt (struct adf_accel_dev *accel_dev,bool *reset_required) { +void __iomem *aram_csr =adf_get_aram_base (accel_dev);void __iomem *csr =adf_get_pmisc_base (accel_dev);u32 errsou =ADF_CSR_RD (csr,ADF_GEN4_ERRSOU0 );bool handled = false;
@@ -1148,6 +1398,12 @@ static bool adf_gen4_handle_interrupt(struct adf_accel_dev *accel_dev, handled = true; } + errsou =ADF_CSR_RD (csr,ADF_GEN4_ERRSOU3 ); +if (errsou &ADF_GEN4_ERRSOU3_BITMASK ) { +adf_gen4_process_errsou3 (accel_dev, csr, aram_csr, errsou, reset_required); + handled = true; + } +return handled; }
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h +218 -0
224 lines not on this page · raw message
Signature · 1 line
2.41.0
PATCH 8/9 crypto: qat - add error counters
In reply to Shashank GuptaIntroduce ras counters interface for counting QAT specific device errors and expose them through the newly created qat_ras sysfs group attribute.
This adds the following attributes:
- errors_correctable: number of correctable errors
- errors_nonfatal: number of uncorrectable non fatal errors
- errors_fatal: number of uncorrectable fatal errors
- reset_error_counters: resets all counters
These counters are initialized during device bring up and cleared during device shutdown and are applicable only to QAT GEN4 devices.
--- .../ABI/testing/sysfs-driver-qat_ras | 42 +++++++ drivers/crypto/intel/qat/qat_4xxx/adf_drv.c | 1 + drivers/crypto/intel/qat/qat_common/Makefile | 1 + .../intel/qat/qat_common/adf_accel_devices.h | 14 +++ .../crypto/intel/qat/qat_common/adf_init.c | 3 + .../qat/qat_common/adf_sysfs_ras_counters.c | 112 ++++++++++++++++++ .../qat/qat_common/adf_sysfs_ras_counters.h | 28 +++++ 7 files changed, 201 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-driver-qat_ras create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.c create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.h
Documentation/ABI/testing/sysfs-driver-qat_ras new file +42 -0
@@ -0,0 +1,42 @@ +What: /sys/bus/pci/devices/<BDF>/qat_ras/errors_correctable +Date: January 2024 +KernelVersion: 6.7 +Contact: [email protected] +Description: (RO) Reports the number of correctable errors detected by the device. + + This attribute is only available for qat_4xxx devices. + +What: /sys/bus/pci/devices/<BDF>/qat_ras/errors_nonfatal +Date: January 2024 +KernelVersion: 6.7 +Contact: [email protected] +Description: (RO) Reports the number of non fatal errors detected by the device. + + This attribute is only available for qat_4xxx devices. + +What: /sys/bus/pci/devices/<BDF>/qat_ras/errors_fatal +Date: January 2024 +KernelVersion: 6.7 +Contact: [email protected] +Description: (RO) Reports the number of fatal errors detected by the device. + + This attribute is only available for qat_4xxx devices. + +What: /sys/bus/pci/devices/<BDF>/qat_ras/reset_error_counters +Date: January 2024 +KernelVersion: 6.7 +Contact: [email protected] +Description: (WO) Write to resets all error counters of a device. + + The following example reports how to reset the counters:: + + # echo 1 > /sys/bus/pci/devices/<BDF>/qat_ras/reset_error_counters + # cat /sys/bus/pci/devices/<BDF>/qat_ras/errors_correctable + 0 + # cat /sys/bus/pci/devices/<BDF>/qat_ras/errors_nonfatal + 0 + # cat /sys/bus/pci/devices/<BDF>/qat_ras/errors_fatal + 0 + + This attribute is only available for qat_4xxx devices. +
drivers/crypto/intel/qat/qat_4xxx/adf_drv.c +1 -0
@@ -418,6 +418,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) goto out_err; } + accel_dev->ras_errors.enabled = true;adf_dbgfs_init (accel_dev); ret =adf_dev_up (accel_dev, true);
drivers/crypto/intel/qat/qat_common/Makefile +1 -0
@@ -12,6 +12,7 @@ intel_qat-objs := adf_cfg.o \ adf_admin.o \ adf_hw_arbiter.o \ adf_sysfs.o \ + adf_sysfs_ras_counters.o \ adf_gen2_hw_data.o \ adf_gen2_config.o \ adf_gen4_hw_data.o \
drivers/crypto/intel/qat/qat_common/adf_accel_devices.h +14 -0
@@ -7,6 +7,7 @@#include <linux/list.h> #include <linux/io.h> #include <linux/ratelimit.h> +#include <linux/types.h> #include "adf_cfg_common.h" #include "adf_pfvf_msg.h"
@@ -81,6 +82,18 @@ enum dev_sku_info { DEV_SKU_UNKNOWN, }; +enum ras_errors { +ADF_RAS_CORR , +ADF_RAS_UNCORR , +ADF_RAS_FATAL , +ADF_RAS_ERRORS , +}; + +struct adf_error_counters { +atomic_t counter[ADF_RAS_ERRORS ]; +bool enabled; +}; +static inline const char *get_sku_info (enum dev_sku_info info) {switch (info) {
@@ -360,6 +373,7 @@ struct adf_accel_dev {u8 pf_compat_ver; } vf; }; +struct adf_error_counters ras_errors;struct mutex state_lock;/* protect state of the device */ bool is_vf;u32 accel_id;
drivers/crypto/intel/qat/qat_common/adf_init.c +3 -0
@@ -9,6 +9,7 @@#include "adf_common_drv.h" #include "adf_dbgfs.h" #include "adf_heartbeat.h" +#include "adf_sysfs_ras_counters.h" static LIST_HEAD (service_table);static DEFINE_MUTEX (service_lock);
@@ -242,6 +243,7 @@ static int adf_dev_start(struct adf_accel_dev *accel_dev)set_bit (ADF_STATUS_COMP_ALGS_REGISTERED , &accel_dev->status);adf_dbgfs_add (accel_dev); +adf_sysfs_start_ras (accel_dev);return 0 ; }
@@ -268,6 +270,7 @@ static void adf_dev_stop(struct adf_accel_dev *accel_dev)return ;adf_dbgfs_rm (accel_dev); +adf_sysfs_stop_ras (accel_dev);clear_bit (ADF_STATUS_STARTING , &accel_dev->status);clear_bit (ADF_STATUS_STARTED , &accel_dev->status);
drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.c new file +112 -0
112 lines not on this page · raw message
drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.h new file +28 -0
@@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* Copyright(c) 2023 Intel Corporation */ + +#ifndef ADF_RAS_H +#define ADF_RAS_H + +#include <linux/bitops.h> +#include <linux/atomic.h> + +struct adf_accel_dev ; + +void adf_sysfs_start_ras (struct adf_accel_dev *accel_dev); +void adf_sysfs_stop_ras (struct adf_accel_dev *accel_dev); + +#define ADF_RAS_ERR_CTR_READ (ras_errors,ERR ) \ + atomic_read(&(ras_errors).counter[ERR]) + +#define ADF_RAS_ERR_CTR_CLEAR (ras_errors) \ + do { \ + for (int err = 0; err < ADF_RAS_ERRORS; ++err) \ + atomic_set(&(ras_errors).counter[err], 0); \ + } while (0) + +#define ADF_RAS_ERR_CTR_INC (ras_errors,ERR ) \ + atomic_inc(&(ras_errors).counter[ERR]) + +#endif /* ADF_RAS_H */ +
Signature · 1 line
2.41.0
PATCH 9/9 crypto: qat - count QAT GEN4 errors
In reply to Shashank GuptaAdd logic to count correctable, non fatal and fatal error for QAT GEN4 devices.
These counters are reported through sysfs attributes in the group qat_ras.
--- .../intel/qat/qat_common/adf_gen4_ras.c | 182 ++++++++++++++++-- 1 file changed, 166 insertions(+), 16 deletions(-)
drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c +166 -16
@@ -3,6 +3,9 @@#include "adf_common_drv.h" #include "adf_gen4_hw_data.h" #include "adf_gen4_ras.h" +#include "adf_sysfs_ras_counters.h" + +#define BITS_PER_REG (_n_) (sizeof(_n_) * BITS_PER_BYTE)static void enable_errsou_reporting (void __iomem *csr) {
@@ -355,6 +358,8 @@ static void adf_gen4_process_errsou0(struct adf_accel_dev *accel_dev,"Correctable error detected in AE: 0x%x\n" , aecorrerr); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_CORR ); +/* Clear interrupt from ERRSOU0 */ ADF_CSR_WR (csr,ADF_GEN4_HIAECORERRLOG_CPP0 , aecorrerr); }
@@ -374,6 +379,8 @@ static bool adf_handle_cpp_aeunc(struct adf_accel_dev *accel_dev,"Uncorrectable error detected in AE: 0x%x\n" , aeuncorerr); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_HIAEUNCERRLOG_CPP0 , aeuncorerr);return false;
@@ -395,6 +402,8 @@ static bool adf_handle_cppcmdparerr(struct adf_accel_dev *accel_dev,"HI CPP agent command parity error: 0x%x\n" , cmdparerr); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_HICPPAGENTCMDPARERRLOG , cmdparerr);return true;
@@ -413,15 +422,18 @@ static bool adf_handle_ri_mem_par_err(struct adf_accel_dev *accel_dev, rimem_parerr_sts &=ADF_GEN4_RIMEM_PARERR_STS_UNCERR_BITMASK |ADF_GEN4_RIMEM_PARERR_STS_FATAL_BITMASK ; -if (rimem_parerr_sts &ADF_GEN4_RIMEM_PARERR_STS_UNCERR_BITMASK ) +if (rimem_parerr_sts &ADF_GEN4_RIMEM_PARERR_STS_UNCERR_BITMASK ) {dev_err (&GET_DEV (accel_dev),"RI Memory Parity uncorrectable error: 0x%x\n" , rimem_parerr_sts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); + }if (rimem_parerr_sts &ADF_GEN4_RIMEM_PARERR_STS_FATAL_BITMASK ) {dev_err (&GET_DEV (accel_dev),"RI Memory Parity fatal error: 0x%x\n" , rimem_parerr_sts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); reset_required = true; }
@@ -445,6 +457,7 @@ static bool adf_handle_ti_ci_par_sts(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"TI Memory Parity Error: 0x%x\n" , ti_ci_par_sts);ADF_CSR_WR (csr,ADF_GEN4_TI_CI_PAR_STS , ti_ci_par_sts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); }return false;
@@ -467,6 +480,8 @@ static bool adf_handle_ti_pullfub_par_sts(struct adf_accel_dev *accel_dev,ADF_CSR_WR (csr,ADF_GEN4_TI_PULL0FUB_PAR_STS , ti_pullfub_par_sts); + +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); }return false;
@@ -487,6 +502,8 @@ static bool adf_handle_ti_pushfub_par_sts(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"TI Push Parity Error: 0x%x\n" , ti_pushfub_par_sts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_TI_PUSHFUB_PAR_STS , ti_pushfub_par_sts); }
@@ -509,6 +526,8 @@ static bool adf_handle_ti_cd_par_sts(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"TI CD Parity Error: 0x%x\n" , ti_cd_par_sts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_TI_CD_PAR_STS , ti_cd_par_sts); }
@@ -530,6 +549,8 @@ static bool adf_handle_ti_trnsb_par_sts(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"TI TRNSB Parity Error: 0x%x\n" , ti_trnsb_par_sts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_TI_TRNSB_PAR_STS , ti_trnsb_par_sts); }
@@ -551,6 +572,8 @@ static bool adf_handle_iosfp_cmd_parerr(struct adf_accel_dev *accel_dev,"Command Parity error detected on IOSFP: 0x%x\n" , rimiscsts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_RIMISCSTS , rimiscsts);return true;
@@ -586,6 +609,8 @@ static bool adf_handle_uerrssmsh(struct adf_accel_dev *accel_dev,"Uncorrectable error on ssm shared memory: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_UERRSSMSH , reg);return false;
@@ -606,6 +631,8 @@ static bool adf_handle_cerrssmsh(struct adf_accel_dev *accel_dev,"Correctable error on ssm shared memory: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_CORR ); +ADF_CSR_WR (csr,ADF_GEN4_CERRSSMSH , reg);return false;
@@ -626,6 +653,8 @@ static bool adf_handle_pperr_err(struct adf_accel_dev *accel_dev,"Uncorrectable error CPP transaction on memory target: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_PPERR , reg);return false;
@@ -642,6 +671,8 @@ static void adf_poll_slicehang_csr(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"Slice %s hang error encountered\n" , slice_name); + +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); } static bool adf_handle_slice_hang_error(struct adf_accel_dev *accel_dev,
@@ -682,6 +713,8 @@ static bool adf_handle_spp_pullcmd_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull command fatal error ATH_CPH: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLCMDPARERR_ATH_CPH , reg); reset_required = true;
@@ -693,6 +726,8 @@ static bool adf_handle_spp_pullcmd_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull command fatal error CPR_XLT: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLCMDPARERR_CPR_XLT , reg); reset_required = true;
@@ -704,6 +739,8 @@ static bool adf_handle_spp_pullcmd_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull command fatal error DCPR_UCS: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLCMDPARERR_DCPR_UCS , reg); reset_required = true;
@@ -715,6 +752,8 @@ static bool adf_handle_spp_pullcmd_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull command fatal error PKE: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLCMDPARERR_PKE , reg); reset_required = true;
@@ -727,6 +766,8 @@ static bool adf_handle_spp_pullcmd_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull command fatal error WAT_WCP: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLCMDPARERR_WAT_WCP , reg); reset_required = true;
@@ -748,6 +789,8 @@ static bool adf_handle_spp_pulldata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull data err ATH_CPH: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLDATAPARERR_ATH_CPH , reg); }
@@ -757,6 +800,8 @@ static bool adf_handle_spp_pulldata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull data err CPR_XLT: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLDATAPARERR_CPR_XLT , reg); }
@@ -766,6 +811,8 @@ static bool adf_handle_spp_pulldata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull data err DCPR_UCS: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLDATAPARERR_DCPR_UCS , reg); }
@@ -775,6 +822,8 @@ static bool adf_handle_spp_pulldata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull data err PKE: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLDATAPARERR_PKE , reg); }
@@ -785,6 +834,8 @@ static bool adf_handle_spp_pulldata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP pull data err WAT_WCP: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPULLDATAPARERR_WAT_WCP , reg); } }
@@ -805,6 +856,8 @@ static bool adf_handle_spp_pushcmd_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP push command fatal error ATH_CPH: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHCMDPARERR_ATH_CPH , reg); reset_required = true;
@@ -816,6 +869,8 @@ static bool adf_handle_spp_pushcmd_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP push command fatal error CPR_XLT: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHCMDPARERR_CPR_XLT , reg); reset_required = true;
@@ -827,6 +882,8 @@ static bool adf_handle_spp_pushcmd_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP push command fatal error DCPR_UCS: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHCMDPARERR_DCPR_UCS , reg); reset_required = true;
@@ -839,6 +896,8 @@ static bool adf_handle_spp_pushcmd_err(struct adf_accel_dev *accel_dev,"SPP push command fatal error PKE: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHCMDPARERR_PKE , reg); reset_required = true;
@@ -851,6 +910,8 @@ static bool adf_handle_spp_pushcmd_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP push command fatal error WAT_WCP: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHCMDPARERR_WAT_WCP , reg); reset_required = true;
@@ -872,6 +933,8 @@ static bool adf_handle_spp_pushdata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP push data err ATH_CPH: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHDATAPARERR_ATH_CPH , reg); }
@@ -881,6 +944,8 @@ static bool adf_handle_spp_pushdata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP push data err CPR_XLT: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHDATAPARERR_CPR_XLT , reg); }
@@ -890,6 +955,8 @@ static bool adf_handle_spp_pushdata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP push data err DCPR_UCS: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHDATAPARERR_DCPR_UCS , reg); }
@@ -899,6 +966,8 @@ static bool adf_handle_spp_pushdata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP push data err PKE: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHDATAPARERR_PKE , reg); }
@@ -909,6 +978,8 @@ static bool adf_handle_spp_pushdata_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"SPP push data err WAT_WCP: 0x%x\n" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_SPPPUSHDATAPARERR_WAT_WCP , reg); }
@@ -936,8 +1007,11 @@ static bool adf_handle_spppar_err(struct adf_accel_dev *accel_dev,static bool adf_handle_ssmcpppar_err (struct adf_accel_dev *accel_dev,void __iomem *csr,u32 iastatssm) { +u32 reg =ADF_CSR_RD (csr,ADF_GEN4_SSMCPPERR ); +u32 bits_num =BITS_PER_REG (reg);bool reset_required = false; -u32 reg; +unsigned long errs_bits; +u32 bit_iterator;if (!(iastatssm &ADF_GEN4_IAINTSTATSSM_SSMCPPERR_BIT ))return false;
@@ -948,12 +1022,22 @@ static bool adf_handle_ssmcpppar_err(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"Fatal SSM CPP parity error: 0x%x\n" , reg); + errs_bits = reg &ADF_GEN4_SSMCPPERR_FATAL_BITMASK ; +for_each_set_bit (bit_iterator, &errs_bits, bits_num) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); + } reset_required = true; } -if (reg &ADF_GEN4_SSMCPPERR_UNCERR_BITMASK ) +if (reg &ADF_GEN4_SSMCPPERR_UNCERR_BITMASK ) {dev_err (&GET_DEV (accel_dev),"non-Fatal SSM CPP parity error: 0x%x\n" , reg); + errs_bits = reg &ADF_GEN4_SSMCPPERR_UNCERR_BITMASK ; + +for_each_set_bit (bit_iterator, &errs_bits, bits_num) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); + } + }ADF_CSR_WR (csr,ADF_GEN4_SSMCPPERR , reg);
@@ -971,35 +1055,47 @@ static bool adf_handle_rf_parr_err(struct adf_accel_dev *accel_dev, reg =ADF_CSR_RD (csr,ADF_GEN4_SSMSOFTERRORPARITY_SRC ); reg &=ADF_GEN4_SSMSOFTERRORPARITY_SRC_BIT ; -if (reg) +if (reg) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR );ADF_CSR_WR (csr,ADF_GEN4_SSMSOFTERRORPARITY_SRC , reg); + } reg =ADF_CSR_RD (csr,ADF_GEN4_SSMSOFTERRORPARITY_ATH_CPH ); reg &= err_mask->parerr_ath_cph_mask; -if (reg) +if (reg) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR );ADF_CSR_WR (csr,ADF_GEN4_SSMSOFTERRORPARITY_ATH_CPH , reg); + } reg =ADF_CSR_RD (csr,ADF_GEN4_SSMSOFTERRORPARITY_CPR_XLT ); reg &= err_mask->parerr_cpr_xlt_mask; -if (reg) +if (reg) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR );ADF_CSR_WR (csr,ADF_GEN4_SSMSOFTERRORPARITY_CPR_XLT , reg); + } reg =ADF_CSR_RD (csr,ADF_GEN4_SSMSOFTERRORPARITY_DCPR_UCS ); reg &= err_mask->parerr_dcpr_ucs_mask; -if (reg) +if (reg) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR );ADF_CSR_WR (csr,ADF_GEN4_SSMSOFTERRORPARITY_DCPR_UCS , reg); + } reg =ADF_CSR_RD (csr,ADF_GEN4_SSMSOFTERRORPARITY_PKE ); reg &= err_mask->parerr_pke_mask; -if (reg) +if (reg) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR );ADF_CSR_WR (csr,ADF_GEN4_SSMSOFTERRORPARITY_PKE , reg); + }if (err_mask->parerr_wat_wcp_mask) { reg =ADF_CSR_RD (csr,ADF_GEN4_SSMSOFTERRORPARITY_WAT_WCP ); reg &= err_mask->parerr_wat_wcp_mask; -if (reg) +if (reg) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR );ADF_CSR_WR (csr,ADF_GEN4_SSMSOFTERRORPARITY_WAT_WCP , reg); + } }dev_err (&GET_DEV (accel_dev),"Slice ssm soft parity error reported" );
@@ -1010,8 +1106,11 @@ static bool adf_handle_rf_parr_err(struct adf_accel_dev *accel_dev,static bool adf_handle_ser_err_ssmsh (struct adf_accel_dev *accel_dev,void __iomem *csr,u32 iastatssm) { +u32 reg =ADF_CSR_RD (csr,ADF_GEN4_SER_ERR_SSMSH ); +u32 bits_num =BITS_PER_REG (reg);bool reset_required = false; -u32 reg; +unsigned long errs_bits; +u32 bit_iterator;if (!(iastatssm & (ADF_GEN4_IAINTSTATSSM_SER_ERR_SSMSH_CERR_BIT |ADF_GEN4_IAINTSTATSSM_SER_ERR_SSMSH_UNCERR_BIT )))
@@ -1025,17 +1124,34 @@ static bool adf_handle_ser_err_ssmsh(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"Fatal SER_SSMSH_ERR: 0x%x\n" , reg); + errs_bits = reg &ADF_GEN4_SER_ERR_SSMSH_FATAL_BITMASK ; +for_each_set_bit (bit_iterator, &errs_bits, bits_num) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); + } + reset_required = true; } -if (reg &ADF_GEN4_SER_ERR_SSMSH_UNCERR_BITMASK ) +if (reg &ADF_GEN4_SER_ERR_SSMSH_UNCERR_BITMASK ) {dev_err (&GET_DEV (accel_dev),"non-fatal SER_SSMSH_ERR: 0x%x\n" , reg); -if (reg &ADF_GEN4_SER_ERR_SSMSH_CERR_BITMASK ) + errs_bits = reg &ADF_GEN4_SER_ERR_SSMSH_UNCERR_BITMASK ; +for_each_set_bit (bit_iterator, &errs_bits, bits_num) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); + } + } + +if (reg &ADF_GEN4_SER_ERR_SSMSH_CERR_BITMASK ) {dev_warn (&GET_DEV (accel_dev),"Correctable SER_SSMSH_ERR: 0x%x\n" , reg); + errs_bits = reg &ADF_GEN4_SER_ERR_SSMSH_CERR_BITMASK ; +for_each_set_bit (bit_iterator, &errs_bits, bits_num) { +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_CORR ); + } + } +ADF_CSR_WR (csr,ADF_GEN4_SER_ERR_SSMSH , reg);return reset_required;
@@ -1077,6 +1193,8 @@ static bool adf_handle_exprpssmcmpr(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"Uncorrectable error exception in SSM CMP: 0x%x" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_EXPRPSSMCPR , reg);return false;
@@ -1092,14 +1210,20 @@ static bool adf_handle_exprpssmxlt(struct adf_accel_dev *accel_dev,if (!reg)return false; -if (reg &ADF_GEN4_EXPRPSSMXLT_UNCERR_BITMASK ) +if (reg &ADF_GEN4_EXPRPSSMXLT_UNCERR_BITMASK ) {dev_err (&GET_DEV (accel_dev),"Uncorrectable error exception in SSM XLT: 0x%x" , reg); -if (reg &ADF_GEN4_EXPRPSSMXLT_CERR_BIT ) +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); + } + +if (reg &ADF_GEN4_EXPRPSSMXLT_CERR_BIT ) {dev_warn (&GET_DEV (accel_dev),"Correctable error exception in SSM XLT: 0x%x" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_CORR ); + } +ADF_CSR_WR (csr,ADF_GEN4_EXPRPSSMXLT , reg);return false;
@@ -1118,14 +1242,20 @@ static bool adf_handle_exprpssmdcpr(struct adf_accel_dev *accel_dev,if (!reg)continue ; -if (reg &ADF_GEN4_EXPRPSSMDCPR_UNCERR_BITMASK ) +if (reg &ADF_GEN4_EXPRPSSMDCPR_UNCERR_BITMASK ) {dev_err (&GET_DEV (accel_dev),"Uncorrectable error exception in SSM DCMP: 0x%x" , reg); -if (reg &ADF_GEN4_EXPRPSSMDCPR_CERR_BITMASK ) +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); + } + +if (reg &ADF_GEN4_EXPRPSSMDCPR_CERR_BITMASK ) {dev_warn (&GET_DEV (accel_dev),"Correctable error exception in SSM DCMP: 0x%x" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_CORR ); + } +ADF_CSR_WR (csr,ADF_GEN4_EXPRPSSMDCPR (i), reg); }
@@ -1161,11 +1291,13 @@ static bool adf_handle_cpp_cfc_err(struct adf_accel_dev *accel_dev,if (reg &ADF_GEN4_CPP_CFC_ERR_STATUS_DATAPAR_BIT ) {dev_err (&GET_DEV (accel_dev),"CPP_CFC_ERR: data parity: 0x%x" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); }if (reg &ADF_GEN4_CPP_CFC_ERR_STATUS_CMDPAR_BIT ) {dev_err (&GET_DEV (accel_dev),"CPP_CFC_ERR: command parity: 0x%x" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); reset_required = true; }
@@ -1173,6 +1305,7 @@ static bool adf_handle_cpp_cfc_err(struct adf_accel_dev *accel_dev,if (reg &ADF_GEN4_CPP_CFC_ERR_STATUS_MERR_BIT ) {dev_err (&GET_DEV (accel_dev),"CPP_CFC_ERR: multiple errors: 0x%x" , reg); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); reset_required = true; }
@@ -1204,6 +1337,8 @@ static bool adf_handle_timiscsts(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"Fatal error in Transmit Interface: 0x%x\n" , timiscsts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); +return true; }
@@ -1221,6 +1356,8 @@ static bool adf_handle_ricppintsts(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"RI CPP Uncorrectable Error: 0x%x\n" , ricppintsts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_RICPPINTSTS , ricppintsts);return false;
@@ -1240,6 +1377,8 @@ static bool adf_handle_ticppintsts(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"TI CPP Uncorrectable Error: 0x%x\n" , ticppintsts); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_TICPPINTSTS , ticppintsts);return false;
@@ -1259,6 +1398,8 @@ static bool adf_handle_aramcerr(struct adf_accel_dev *accel_dev,dev_warn (&GET_DEV (accel_dev),"ARAM correctable error : 0x%x\n" , aram_cerr); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_CORR ); + aram_cerr |=ADF_GEN4_REG_ARAMCERR_EN_BITMASK ;ADF_CSR_WR (csr,ADF_GEN4_REG_ARAMCERR , aram_cerr);
@@ -1286,10 +1427,14 @@ static bool adf_handle_aramuerr(struct adf_accel_dev *accel_dev,dev_err (&GET_DEV (accel_dev),"ARAM multiple uncorrectable errors: 0x%x\n" , aramuerr); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); + reset_required = true; }else {dev_err (&GET_DEV (accel_dev),"ARAM uncorrectable error: 0x%x\n" , aramuerr); + +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); } aramuerr |=ADF_GEN4_REG_ARAMUERR_EN_BITMASK ;
@@ -1319,10 +1464,13 @@ static bool adf_handle_reg_cppmemtgterr(struct adf_accel_dev *accel_dev,"Misc memory target multiple uncorrectable errors: 0x%x\n" , cppmemtgterr); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_FATAL ); + reset_required = true; }else {dev_err (&GET_DEV (accel_dev),"Misc memory target uncorrectable error: 0x%x\n" , cppmemtgterr); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); } cppmemtgterr |=ADF_GEN4_REG_CPPMEMTGTERR_EN_BITMASK ;
@@ -1351,6 +1499,8 @@ static bool adf_handle_atufaultstatus(struct adf_accel_dev *accel_dev,"Ring Pair (%u) ATU detected fault: 0x%x\n" , i, atufaultstatus); +ADF_RAS_ERR_CTR_INC (accel_dev->ras_errors,ADF_RAS_UNCORR ); +ADF_CSR_WR (csr,ADF_GEN4_ATUFAULTSTATUS (i), atufaultstatus); } }
Signature · 1 line
2.41.0
Herbert Xu
maintainerQuoted 33 lines · Shashank Gupta
This set introduces the required infrastructure to detect, report, and count errors in the QAT drivers and enables the reporting of errors in QAT GEN4 devices. In particular, it enables the reporting of correctable, nonfatal, and fatal errors.
In addition, exposes the number of occurrences of each type of error through sysfs.The first patch adds the common infrastructures for error reporting for all generations of QAT. Patches from 2 to 5 and 7 enable the reporting of errors flagged through the register ERRSOUx for GEN4 devices. ERRSOUx error reporting for GEN4 devices.
Patch 6 adds a helper to retrieve the base address of the aram bar.
Patch 8 introduces the ras counter interface for counting QAT-specific errors, and exposes such counters through sysfs. Patch 9 adds logic to count correctable, nonfatal, and fatal errors for GEN4 devices.Shashank Gupta (9):
crypto: qat - add infrastructure for error reporting
crypto: qat - add reporting of correctable errors for QAT GEN4
crypto: qat - add reporting of errors from ERRSOU1 for QAT GEN4
crypto: qat - add handling of errors from ERRSOU2 for QAT GEN4
crypto: qat - add handling of compression related errors for QAT GEN4
crypto: qat - addadf_get_aram_base()helper function
crypto: qat - add handling of errors from ERRSOU3 for QAT GEN4
crypto: qat - add error counters
crypto: qat - count QAT GEN4 errors.../ABI/testing/sysfs-driver-qat_ras | 42 + .../intel/qat/qat_4xxx/adf_4xxx_hw_data.c | 13 + .../intel/qat/qat_4xxx/adf_4xxx_hw_data.h | 17 + drivers/crypto/intel/qat/qat_4xxx/adf_drv.c | 1 + drivers/crypto/intel/qat/qat_common/Makefile | 2 + .../intel/qat/qat_common/adf_accel_devices.h | 34 + .../intel/qat/qat_common/adf_common_drv.h | 10 + .../intel/qat/qat_common/adf_gen4_ras.c | 1566 +++++++++++++++++ .../intel/qat/qat_common/adf_gen4_ras.h | 825 +++++++++ .../crypto/intel/qat/qat_common/adf_init.c | 9 + drivers/crypto/intel/qat/qat_common/adf_isr.c | 18 +
Quoted 11 lines
.../qat/qat_common/adf_sysfs_ras_counters.c | 112 ++ .../qat/qat_common/adf_sysfs_ras_counters.h | 28 + 13 files changed, 2677 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-driver-qat_ras create mode 100644 drivers/crypto/intel/qat/qat_common/adf_gen4_ras.c create mode 100644 drivers/crypto/intel/qat/qat_common/adf_gen4_ras.h create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.c create mode 100644 drivers/crypto/intel/qat/qat_common/adf_sysfs_ras_counters.hSignature · 1 line
2.41.0
All applied. Thanks.
Signature · 3 lines
Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt