From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 96217C54F51 for ; Wed, 29 Jul 2026 12:23:47 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2916B10E046; Wed, 29 Jul 2026 12:23:47 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="RGunlkrH"; dkim-atps=neutral Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) by gabe.freedesktop.org (Postfix) with ESMTPS id D141B10E03A for ; Wed, 29 Jul 2026 12:20:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785327646; x=1816863646; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=UIBemX7RyVqJmpz+PrI+orakZbtyBNVH4rQ9VI47rEQ=; b=RGunlkrHre97A/VfDpwLjgF7F9aagtgCIh3HIF+2ndhQ6ivIPwRjxdVM R2quxjrY+xyuAgacL7ou/pfjT5dVibOhGLewRWAHYww9/hpF3Btob0L2y eM4FgF8fOw4gaFBKiMAtAf1OhwhF3Qk/HL79i6qnDC5QVfWw7+7KnSHX5 T4y61gMB07OpUhkcbwYXo1kbtzpjxYfegUEcF2ZOyMjVXSYXjmXWdPtUI hASGFz3ycwiQ71IShXY8uMkE2NOjUyaV4Rbih0QDqwnLb2LxA13u79EVI FD28LcZ1SWT8fbM/wqWt3U1H0DdLamtBu5pKJqk7NSrZ8Wj9OkQnPS9Ga Q==; X-CSE-ConnectionGUID: fZOc7PFCQX+gkrlKaPIaOw== X-CSE-MsgGUID: A8xKdkc0Rami4AG8VcDOQQ== X-IronPort-AV: E=McAfee;i="6800,10657,11859"; a="108725165" X-IronPort-AV: E=Sophos;i="6.25,192,1779174000"; d="scan'208";a="108725165" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jul 2026 05:20:46 -0700 X-CSE-ConnectionGUID: 1JRVnFViSFSoUepOn5FxEw== X-CSE-MsgGUID: tBCPvn+oQg2Y/ihA8WGJNw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,192,1779174000"; d="scan'208";a="263802176" Received: from rkoppura-z790i-aorus-ultra.iind.intel.com ([10.190.239.17]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jul 2026 05:20:44 -0700 From: Ravi Kishore Koppuravuri To: igt-dev@lists.freedesktop.org Cc: riana.tauro@intel.com, anshuman.gupta@intel.com, mallesh.koujalagi@intel.com, raag.jadav@intel.com, Ravi Kishore Koppuravuri Subject: [PATCH 1/8] lib/igt_drm_netlink: Introduce DRM RAS Generic Netlink interface Date: Wed, 29 Jul 2026 17:49:52 +0530 Message-Id: <20260729121959.603890-2-ravi.kishore.koppuravuri@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260729121959.603890-1-ravi.kishore.koppuravuri@intel.com> References: <20260729121959.603890-1-ravi.kishore.koppuravuri@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: igt-dev@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development mailing list for IGT GPU Tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" Introduce DRM RAS Generic Netlink interface as a library Signed-off-by: Ravi Kishore Koppuravuri --- include/drm-uapi/drm_ras.h | 50 +++++++++++++++++++++++++++++++ lib/igt_drm_netlink.c | 60 ++++++++++++++++++++++++++++++++++++++ lib/igt_drm_netlink.h | 25 ++++++++++++++++ lib/meson.build | 9 ++++++ 4 files changed, 144 insertions(+) create mode 100644 include/drm-uapi/drm_ras.h create mode 100644 lib/igt_drm_netlink.c create mode 100644 lib/igt_drm_netlink.h diff --git a/include/drm-uapi/drm_ras.h b/include/drm-uapi/drm_ras.h new file mode 100644 index 000000000..218a3ee86 --- /dev/null +++ b/include/drm-uapi/drm_ras.h @@ -0,0 +1,50 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/drm_ras.yaml */ +/* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ + +#ifndef _UAPI_LINUX_DRM_RAS_H +#define _UAPI_LINUX_DRM_RAS_H + +#define DRM_RAS_FAMILY_NAME "drm-ras" +#define DRM_RAS_FAMILY_VERSION 1 + +/* + * Type of the node. Currently, only error-counter nodes are supported, which + * expose reliability counters for a hardware/software component. + */ +enum drm_ras_node_type { + DRM_RAS_NODE_TYPE_ERROR_COUNTER = 1, +}; + +enum { + DRM_RAS_A_NODE_ATTRS_NODE_ID = 1, + DRM_RAS_A_NODE_ATTRS_DEVICE_NAME, + DRM_RAS_A_NODE_ATTRS_NODE_NAME, + DRM_RAS_A_NODE_ATTRS_NODE_TYPE, + + __DRM_RAS_A_NODE_ATTRS_MAX, + DRM_RAS_A_NODE_ATTRS_MAX = (__DRM_RAS_A_NODE_ATTRS_MAX - 1) +}; + +enum { + DRM_RAS_A_ERROR_COUNTER_ATTRS_NODE_ID = 1, + 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_MAX, + DRM_RAS_A_ERROR_COUNTER_ATTRS_MAX = (__DRM_RAS_A_ERROR_COUNTER_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_MAX, + DRM_RAS_CMD_MAX = (__DRM_RAS_CMD_MAX - 1) +}; + +#endif /* _UAPI_LINUX_DRM_RAS_H */ diff --git a/lib/igt_drm_netlink.c b/lib/igt_drm_netlink.c new file mode 100644 index 000000000..1c07bb2db --- /dev/null +++ b/lib/igt_drm_netlink.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright © 2026 Intel Corporation + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "igt_core.h" +#include "igt_drm_netlink.h" + +void cleanup_nl_socket(struct app_context *ctx) +{ + if (!ctx || !ctx->sock) + return; + + nl_close(ctx->sock); + nl_socket_free(ctx->sock); + ctx->sock = NULL; + ctx->family_id = -1; + + igt_debug("Cleaned up netlink socket.\n"); +} + +int init_nl_socket(struct app_context *ctx) +{ + ctx->sock = nl_socket_alloc(); + if (!ctx->sock) + return -1; + + igt_debug("Socket allocation successful. Connecting to Generic Netlink...\n"); + if (genl_connect(ctx->sock) < 0) { + cleanup_nl_socket(ctx); + return -1; + } + + igt_debug("Resolving Generic Netlink family '%s'...\n", DRM_RAS_FAMILY_NAME); + ctx->family_id = genl_ctrl_resolve(ctx->sock, DRM_RAS_FAMILY_NAME); + if (ctx->family_id < 0) { + fprintf(stderr, + "Failed to resolve Generic Netlink family '%s': %s. " + "This may mean the running kernel does not expose DRM RAS support.\n", + DRM_RAS_FAMILY_NAME, + nl_geterror(ctx->family_id)); + cleanup_nl_socket(ctx); + return -1; + } + + igt_debug("Resolved Generic Netlink family '%s' with id %d.\n", + DRM_RAS_FAMILY_NAME, ctx->family_id); + return 0; +} diff --git a/lib/igt_drm_netlink.h b/lib/igt_drm_netlink.h new file mode 100644 index 000000000..c20d5452b --- /dev/null +++ b/lib/igt_drm_netlink.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Copyright © 2026 Intel Corporation + */ + +#ifndef IGT_DRM_NETLINK_H +#define IGT_DRM_NETLINK_H + +#include +#include + +#include + +#include + +struct app_context { + struct nl_sock *sock; + int family_id; +}; + +void cleanup_nl_socket(struct app_context *ctx); +int init_nl_socket(struct app_context *ctx); + +#endif /* IGT_DRM_NETLINK_H */ + diff --git a/lib/meson.build b/lib/meson.build index 4af346b43..79674e032 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -27,6 +27,7 @@ lib_sources = [ 'igt_device_scan.c', 'igt_drm_clients.h', 'igt_drm_fdinfo.c', + 'igt_drm_netlink.c', 'igt_fs.c', 'igt_aux.c', 'igt_dp.c', @@ -141,6 +142,13 @@ lib_sources = [ 'vendor/uwildmat/uwildmat.c', ] +libnl = declare_dependency(dependencies : [ + dependency('libnl-3.0', required : true), + dependency('libnl-genl-3.0', required : true), + dependency('libnl-cli-3.0', required : true), + dependency('libnl-utils', required : false), +]) + lib_deps = [ cairo, glib, @@ -148,6 +156,7 @@ lib_deps = [ libdrm, libdw, libkmod, + libnl, libpci, libudev, math, -- 2.34.1