From: Riana Tauro <[email protected]>

DO NOT REVIEW. COMPILATION ONLY
This patch is from https://patchwork.freedesktop.org/series/160482/
Added only for Compilation.

Signed-off-by: Riana Tauro <[email protected]>
Signed-off-by: Mallesh Koujalagi <[email protected]>
---
 drivers/gpu/drm/xe/xe_ras.c       | 43 +++++++++++++++++
 drivers/gpu/drm/xe/xe_ras_types.h | 80 +++++++++++++++++++++++++++++++
 2 files changed, 123 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_ras.c b/drivers/gpu/drm/xe/xe_ras.c
index 74d5016d9ffe..3d39bb95e94d 100644
--- a/drivers/gpu/drm/xe/xe_ras.c
+++ b/drivers/gpu/drm/xe/xe_ras.c
@@ -9,6 +9,7 @@
 #include "xe_printk.h"
 #include "xe_ras.h"
 #include "xe_ras_types.h"
+#include "xe_survivability_mode.h"
 #include "xe_sysctrl.h"
 #include "xe_sysctrl_event_types.h"
 #include "xe_sysctrl_mailbox.h"
@@ -193,6 +194,48 @@ static void ras_usp_aer_init(struct xe_device *xe)
        dev_dbg(&usp->dev, "Uncorrectable Internal Errors downgraded and 
unmasked\n");
 }
 
+static __maybe_unused enum xe_ras_recovery_action
+handle_soc_internal_errors(struct xe_device *xe,
+                          struct xe_ras_error_array *arr)
+{
+       struct xe_ras_soc_error *info = (void *)arr->details;
+       struct xe_ras_soc_error_source *source = &info->source;
+       struct xe_ras_error_class *counter = &arr->counter;
+
+       if (source->csc) {
+               struct xe_ras_csc_error *csc_error = (void *)info->details;
+
+               /*
+                * CSC uncorrectable errors are classified as hardware errors 
and firmware errors.
+                * CSC firmware errors are critical errors that can be 
recovered only by firmware
+                * update via SPI driver. On a CSC firmware error, PCODE 
enables FDO mode and sets
+                * the bit in the capability register. On receiving this error, 
the driver enables
+                * runtime survivability mode which notifies userspace that a 
firmware update
+                * is required.
+                */
+               if (csc_error->hec_fw_error) {
+                       xe_err(xe, "[RAS]: CSC %s detected: 0x%x\n",
+                              sev_to_str(counter->common.severity),
+                              csc_error->hec_fw_error);
+                       xe_survivability_mode_runtime_enable(xe);
+                       return XE_RAS_RECOVERY_ACTION_DISCONNECT;
+               }
+       } else if (source->ieh) {
+               struct xe_ras_ieh_error *ieh_error = (void *)info->details;
+
+               if (ieh_error->global_error_status & XE_RAS_SOC_IEH_PUNIT) {
+                       xe_err(xe, "[RAS]: PUNIT %s detected: 0x%x\n",
+                              sev_to_str(counter->common.severity),
+                              ieh_error->global_error_status);
+                       /* TODO: Add PUNIT error handling */
+                       return XE_RAS_RECOVERY_ACTION_DISCONNECT;
+               }
+       }
+
+       /* For other SOC internal errors, request a reset as recovery mechanism 
*/
+       return XE_RAS_RECOVERY_ACTION_RESET;
+}
+
 void xe_ras_counter_threshold_crossed(struct xe_device *xe,
                                      struct xe_sysctrl_event_response 
*response)
 {
diff --git a/drivers/gpu/drm/xe/xe_ras_types.h 
b/drivers/gpu/drm/xe/xe_ras_types.h
index 6688e11f57a8..3c165096ea20 100644
--- a/drivers/gpu/drm/xe/xe_ras_types.h
+++ b/drivers/gpu/drm/xe/xe_ras_types.h
@@ -9,6 +9,7 @@
 #include <linux/types.h>
 
 #define XE_RAS_NUM_COUNTERS                    16
+#define XE_RAS_SOC_IEH_PUNIT                   BIT(1)
 
 /**
  * struct xe_ras_error_common - Error fields that are common across all 
products
@@ -121,4 +122,83 @@ struct xe_ras_clear_counter_response {
        /** @reserved1: Reserved for future use */
        u32 reserved1[3];
 } __packed;
+
+/**
+ * enum xe_ras_recovery_action - RAS recovery actions
+ *
+ * @XE_RAS_RECOVERY_ACTION_RECOVERED: Error recovered
+ * @XE_RAS_RECOVERY_ACTION_RESET: Requires reset
+ * @XE_RAS_RECOVERY_ACTION_DISCONNECT: Requires disconnect
+ * @XE_RAS_RECOVERY_ACTION_MAX: Max action value
+ */
+enum xe_ras_recovery_action {
+       XE_RAS_RECOVERY_ACTION_RECOVERED = 0,
+       XE_RAS_RECOVERY_ACTION_RESET,
+       XE_RAS_RECOVERY_ACTION_DISCONNECT,
+       XE_RAS_RECOVERY_ACTION_MAX
+};
+
+/**
+ * struct xe_ras_error_array - Details of the error types
+ */
+struct xe_ras_error_array {
+       /** @counter_value: Counter value of the returned error */
+       u32 counter_value;
+       /** @counter: Error counter */
+       struct xe_ras_error_class counter;
+       /** @timestamp: Timestamp */
+       u64 timestamp;
+       /** @details: Error details specific to the counter */
+       u32 details[XE_RAS_NUM_COUNTERS];
+} __packed;
+
+/**
+ * struct xe_ras_soc_error_source - Source of SoC error
+ */
+struct xe_ras_soc_error_source {
+       /** @csc: CSC */
+       u32 csc:1;
+       /** @ieh: IEH (Integrated Error Handler) */
+       u32 ieh:1;
+       /** @reserved: Reserved for future use */
+       u32 reserved:30;
+} __packed;
+
+/**
+ * struct xe_ras_soc_error - Error details of SoC internal error
+ */
+struct xe_ras_soc_error {
+       /** @source: Error source */
+       struct xe_ras_soc_error_source source;
+       /** @details: Error details specific to the error source */
+       u32 details[15];
+} __packed;
+
+/**
+ * struct xe_ras_csc_error - CSC error details
+ */
+struct xe_ras_csc_error {
+       /** @reserved: Reserved */
+       u32 reserved;
+       /** @hec_fw_error: CSC firmware error */
+       u32 hec_fw_error;
+} __packed;
+
+/**
+ * struct xe_ras_ieh_error - SoC IEH (Integrated Error Handler) error details
+ */
+struct xe_ras_ieh_error {
+       /** @ieh_instance: IEH instance */
+       u32 ieh_instance:2;
+       /** @reserved: Reserved for future use */
+       u32 reserved:30;
+       /** @global_error_status: Global error status */
+       u32 global_error_status;
+       /** @local_error_status: Local error status */
+       u32 local_error_status;
+       /** @gerr_mask: Global error mask */
+       u32 gerr_mask;
+       /** @info: Additional information */
+       u32 info[10];
+} __packed;
 #endif
-- 
2.48.1

Reply via email to