]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/xe_drm_ras: Add support for clear-error-counter in XE drm_ras
authorRiana Tauro <riana.tauro@intel.com>
Thu, 9 Apr 2026 07:33:20 +0000 (13:03 +0530)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Fri, 24 Apr 2026 12:44:19 +0000 (08:44 -0400)
Add support for clear-error-counter command in XE drm_ras
This resets the counter value.

Usage:

$ sudo ynl --family drm_ras  --do clear-error-counter --json \
'{"node-id":1, "error-id":1}'
None

Signed-off-by: Riana Tauro <riana.tauro@intel.com>
Reviewed-by: Raag Jadav <raag.jadav@intel.com>
Link: https://patch.msgid.link/20260409073318.2909379-6-riana.tauro@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_drm_ras.c

index e07dc23a155eda1649c949c84d138a77a065866f..c21c8b428de6b8bdae87a0e60e0a1f62a14de7b1 100644 (file)
@@ -27,6 +27,16 @@ static int hw_query_error_counter(struct xe_drm_ras_counter *info,
        return 0;
 }
 
+static int hw_clear_error_counter(struct xe_drm_ras_counter *info, u32 error_id)
+{
+       if (!info || !info[error_id].name)
+               return -ENOENT;
+
+       atomic_set(&info[error_id].counter, 0);
+
+       return 0;
+}
+
 static int query_uncorrectable_error_counter(struct drm_ras_node *ep, u32 error_id,
                                             const char **name, u32 *val)
 {
@@ -37,6 +47,15 @@ static int query_uncorrectable_error_counter(struct drm_ras_node *ep, u32 error_
        return hw_query_error_counter(info, error_id, name, val);
 }
 
+static int clear_uncorrectable_error_counter(struct drm_ras_node *node, u32 error_id)
+{
+       struct xe_device *xe = node->priv;
+       struct xe_drm_ras *ras = &xe->ras;
+       struct xe_drm_ras_counter *info = ras->info[DRM_XE_RAS_ERR_SEV_UNCORRECTABLE];
+
+       return hw_clear_error_counter(info, error_id);
+}
+
 static int query_correctable_error_counter(struct drm_ras_node *ep, u32 error_id,
                                           const char **name, u32 *val)
 {
@@ -47,6 +66,15 @@ static int query_correctable_error_counter(struct drm_ras_node *ep, u32 error_id
        return hw_query_error_counter(info, error_id, name, val);
 }
 
+static int clear_correctable_error_counter(struct drm_ras_node *node, u32 error_id)
+{
+       struct xe_device *xe = node->priv;
+       struct xe_drm_ras *ras = &xe->ras;
+       struct xe_drm_ras_counter *info = ras->info[DRM_XE_RAS_ERR_SEV_CORRECTABLE];
+
+       return hw_clear_error_counter(info, error_id);
+}
+
 static struct xe_drm_ras_counter *allocate_and_copy_counters(struct xe_device *xe)
 {
        struct xe_drm_ras_counter *counter;
@@ -92,10 +120,13 @@ static int assign_node_params(struct xe_device *xe, struct drm_ras_node *node,
        if (IS_ERR(ras->info[severity]))
                return PTR_ERR(ras->info[severity]);
 
-       if (severity == DRM_XE_RAS_ERR_SEV_CORRECTABLE)
+       if (severity == DRM_XE_RAS_ERR_SEV_CORRECTABLE) {
                node->query_error_counter = query_correctable_error_counter;
-       else
+               node->clear_error_counter = clear_correctable_error_counter;
+       } else {
                node->query_error_counter = query_uncorrectable_error_counter;
+               node->clear_error_counter = clear_uncorrectable_error_counter;
+       }
 
        return 0;
 }