[PATCH 3/8] lib/igt_drm_netlink: add get_error_threshold command support
Ravi Kishore Koppuravuri <[email protected]> Wed, 29 Jul 2026 17:49:54 +0530
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <[email protected]> |
Add support for GET_ERROR_THRESHOLD to fetch the current value of error threshold Signed-off-by: Ravi Kishore Koppuravuri <[email protected]> --- include/drm-uapi/drm_ras.h | 18 +++++++++++++ lib/igt_drm_netlink.c | 53 +++++++++++++++++++++++++++++++++++--- lib/igt_drm_netlink.h | 2 ++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/include/drm-uapi/drm_ras.h b/include/drm-uapi/drm_ras.h index 218a3ee86..60611833b 100644 --- a/include/drm-uapi/drm_ras.h +++ b/include/drm-uapi/drm_ras.h @@ -33,18 +33,36 @@ enum { DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_ID, DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_NAME, DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_VALUE, + DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_THRESHOLD, __DRM_RAS_A_ERROR_COUNTER_ATTRS_MAX, DRM_RAS_A_ERROR_COUNTER_ATTRS_MAX = (__DRM_RAS_A_ERROR_COUNTER_ATTRS_MAX - 1) }; +enum { + DRM_RAS_A_ERROR_EVENT_ATTRS_DEVICE_NAME = 1, + DRM_RAS_A_ERROR_EVENT_ATTRS_NODE_ID, + DRM_RAS_A_ERROR_EVENT_ATTRS_NODE_NAME, + DRM_RAS_A_ERROR_EVENT_ATTRS_ERROR_ID, + DRM_RAS_A_ERROR_EVENT_ATTRS_ERROR_NAME, + DRM_RAS_A_ERROR_EVENT_ATTRS_ERROR_VALUE, + + __DRM_RAS_A_ERROR_EVENT_ATTRS_MAX, + DRM_RAS_A_ERROR_EVENT_ATTRS_MAX = (__DRM_RAS_A_ERROR_EVENT_ATTRS_MAX - 1) +}; + enum { DRM_RAS_CMD_LIST_NODES = 1, DRM_RAS_CMD_GET_ERROR_COUNTER, DRM_RAS_CMD_CLEAR_ERROR_COUNTER, + DRM_RAS_CMD_GET_ERROR_THRESHOLD, + DRM_RAS_CMD_SET_ERROR_THRESHOLD, + DRM_RAS_CMD_ERROR_EVENT, __DRM_RAS_CMD_MAX, DRM_RAS_CMD_MAX = (__DRM_RAS_CMD_MAX - 1) }; +#define DRM_RAS_MCGRP_ERROR_NOTIFY "error-notify" + #endif /* _UAPI_LINUX_DRM_RAS_H */ diff --git a/lib/igt_drm_netlink.c b/lib/igt_drm_netlink.c index 4d543275d..036660a6a 100644 --- a/lib/igt_drm_netlink.c +++ b/lib/igt_drm_netlink.c @@ -43,6 +43,21 @@ static int ras_command_cb(struct nl_msg *msg, void *arg) ctx->error_value = nla_get_u32(attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_VALUE]); break; } + case DRM_RAS_CMD_GET_ERROR_THRESHOLD: { + struct nlattr *attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_MAX + 1]; + + ret = genlmsg_parse(nlh, 0, attrs, + DRM_RAS_A_ERROR_COUNTER_ATTRS_MAX, NULL); + if (ret < 0) + return NL_SKIP; + + if (!attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_THRESHOLD]) + return NL_SKIP; + + ctx->error_threshold = + nla_get_u32(attrs[DRM_RAS_A_ERROR_COUNTER_ATTRS_ERROR_THRESHOLD]); + break; + } default: return NL_SKIP; } @@ -94,6 +109,7 @@ static int send_command(struct app_context *ctx, uint8_t cmd) } switch (cmd) { + case DRM_RAS_CMD_GET_ERROR_THRESHOLD: case DRM_RAS_CMD_GET_ERROR_COUNTER: ret = nla_put_u32(msg, DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID, @@ -141,6 +157,7 @@ int init_app_context(struct app_context *ctx) ctx->node_id = UINT32_MAX; ctx->error_id = UINT32_MAX; ctx->error_value = 0; + ctx->error_threshold = 0; ctx->family_id = -1; return 0; @@ -155,6 +172,7 @@ void cleanup_app_context(struct app_context *ctx) ctx->node_id = UINT32_MAX; ctx->error_id = UINT32_MAX; ctx->error_value = 0; + ctx->error_threshold = 0; ctx->family_id = -1; } @@ -206,10 +224,8 @@ int init_nl_socket(struct app_context *ctx) return 0; } -int get_error_counter(struct app_context *ctx) +static int validate_inputs(struct app_context *ctx, uint8_t cmd) { - int ret; - if (!ctx || !ctx->sock || ctx->family_id < 0) return -EINVAL; @@ -222,6 +238,17 @@ int get_error_counter(struct app_context *ctx) return -EINVAL; } + return 0; +} + +int get_error_counter(struct app_context *ctx) +{ + int ret; + + ret = validate_inputs(ctx, DRM_RAS_CMD_GET_ERROR_COUNTER); + if (ret < 0) + return ret; + ctx->error_value = 0; ret = send_command(ctx, DRM_RAS_CMD_GET_ERROR_COUNTER); @@ -233,3 +260,23 @@ int get_error_counter(struct app_context *ctx) return 0; } + +int get_error_threshold(struct app_context *ctx) +{ + int ret; + + ret = validate_inputs(ctx, DRM_RAS_CMD_GET_ERROR_THRESHOLD); + if (ret < 0) + return ret; + + ctx->error_threshold = 0; + + ret = send_command(ctx, DRM_RAS_CMD_GET_ERROR_THRESHOLD); + if (ret < 0) + return ret; + + igt_debug("Retrieved error threshold: node_id=%u error_id=%u threshold=%u\n", + ctx->node_id, ctx->error_id, ctx->error_threshold); + + return 0; +} diff --git a/lib/igt_drm_netlink.h b/lib/igt_drm_netlink.h index e539bc030..fae9b0e06 100644 --- a/lib/igt_drm_netlink.h +++ b/lib/igt_drm_netlink.h @@ -23,6 +23,7 @@ struct app_context { uint32_t node_id; uint32_t error_id; uint32_t error_value; + uint32_t error_threshold; int family_id; }; @@ -31,6 +32,7 @@ void cleanup_app_context(struct app_context *ctx); void cleanup_nl_socket(struct app_context *ctx); int init_nl_socket(struct app_context *ctx); int get_error_counter(struct app_context *ctx); +int get_error_threshold(struct app_context *ctx); #endif /* IGT_DRM_NETLINK_H */ -- 2.34.1