mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-05-05 09:57:21 +02:00
c36218dc49
Introduces the DRM RAS infrastructure over generic netlink. The new interface allows drivers to expose RAS nodes and their associated error counters to userspace in a structured and extensible way. Each drm_ras node can register its own set of error counters, which are then discoverable and queryable through netlink operations. This lays the groundwork for reporting and managing hardware error states in a unified manner across different DRM drivers. Currently it only supports error-counter nodes. But it can be extended later. The registration is also not tied to any drm node, so it can be used by accel devices as well. It uses the new and mandatory YAML description format stored in Documentation/netlink/specs/. This forces a single generic netlink family namespace for the entire drm: "drm-ras". But multiple-endpoints are supported within the single family. Any modification to this API needs to be applied to Documentation/netlink/specs/drm_ras.yaml before regenerating the code: $ tools/net/ynl/pyynl/ynl_gen_c.py --spec \ Documentation/netlink/specs/drm_ras.yaml --mode uapi --header \ -o include/uapi/drm/drm_ras.h $ tools/net/ynl/pyynl/ynl_gen_c.py --spec \ Documentation/netlink/specs/drm_ras.yaml --mode kernel \ --header -o drivers/gpu/drm/drm_ras_nl.h $ tools/net/ynl/pyynl/ynl_gen_c.py --spec \ Documentation/netlink/specs/drm_ras.yaml \ --mode kernel --source -o drivers/gpu/drm/drm_ras_nl.c Cc: Zack McKevitt <zachary.mckevitt@oss.qualcomm.com> Cc: Lijo Lazar <lijo.lazar@amd.com> Cc: Hawking Zhang <Hawking.Zhang@amd.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: David S. Miller <davem@davemloft.net> Cc: Paolo Abeni <pabeni@redhat.com> Cc: Eric Dumazet <edumazet@google.com> Cc: netdev@vger.kernel.org Co-developed-by: Aravind Iddamsetty <aravind.iddamsetty@linux.intel.com> Signed-off-by: Aravind Iddamsetty <aravind.iddamsetty@linux.intel.com> Signed-off-by: Riana Tauro <riana.tauro@intel.com> Reviewed-by: Zack McKevitt <zachary.mckevitt@oss.qualcomm.com> Acked-by: Jakub Kicinski <kuba@kernel.org> Acked-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patch.msgid.link/20260304074412.464435-8-riana.tauro@intel.com Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
76 lines
2.2 KiB
C
76 lines
2.2 KiB
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Copyright © 2026 Intel Corporation
|
|
*/
|
|
|
|
#ifndef __DRM_RAS_H__
|
|
#define __DRM_RAS_H__
|
|
|
|
#include <uapi/drm/drm_ras.h>
|
|
|
|
/**
|
|
* struct drm_ras_node - A DRM RAS Node
|
|
*/
|
|
struct drm_ras_node {
|
|
/** @id: Unique identifier for the node. Dynamically assigned. */
|
|
u32 id;
|
|
/**
|
|
* @device_name: Human-readable name of the device. Given by the driver.
|
|
*/
|
|
const char *device_name;
|
|
/** @node_name: Human-readable name of the node. Given by the driver. */
|
|
const char *node_name;
|
|
/** @type: Type of the node (enum drm_ras_node_type). */
|
|
enum drm_ras_node_type type;
|
|
|
|
/* Error-Counter Related Callback and Variables */
|
|
|
|
/** @error_counter_range: Range of valid Error IDs for this node. */
|
|
struct {
|
|
/** @first: First valid Error ID. */
|
|
u32 first;
|
|
/** @last: Last valid Error ID. Mandatory entry. */
|
|
u32 last;
|
|
} error_counter_range;
|
|
|
|
/**
|
|
* @query_error_counter:
|
|
*
|
|
* This callback is used by drm-ras to query a specific error counter.
|
|
* Used for input check and to iterate all error counters in a node.
|
|
*
|
|
* Driver should expect query_error_counter() to be called with
|
|
* error_id from `error_counter_range.first` to
|
|
* `error_counter_range.last`.
|
|
*
|
|
* The @query_error_counter is a mandatory callback for
|
|
* error_counter_node.
|
|
*
|
|
* Returns: 0 on success,
|
|
* -ENOENT when error_id is not supported as an indication that
|
|
* drm_ras should silently skip this entry. Used for
|
|
* supporting non-contiguous error ranges.
|
|
* Driver is responsible for maintaining the list of
|
|
* supported error IDs in the range of first to last.
|
|
* Other negative values on errors that should terminate the
|
|
* netlink query.
|
|
*/
|
|
int (*query_error_counter)(struct drm_ras_node *node, u32 error_id,
|
|
const char **name, u32 *val);
|
|
|
|
/** @priv: Driver private data */
|
|
void *priv;
|
|
};
|
|
|
|
struct drm_device;
|
|
|
|
#if IS_ENABLED(CONFIG_DRM_RAS)
|
|
int drm_ras_node_register(struct drm_ras_node *node);
|
|
void drm_ras_node_unregister(struct drm_ras_node *node);
|
|
#else
|
|
static inline int drm_ras_node_register(struct drm_ras_node *node) { return 0; }
|
|
static inline void drm_ras_node_unregister(struct drm_ras_node *node) { }
|
|
#endif
|
|
|
|
#endif
|