xref: /linux/include/drm/drm_ras.h (revision 4a57e0913e8c7fff407e97909f4ae48caa84d612)
1*c36218dcSRodrigo Vivi /* SPDX-License-Identifier: MIT */
2*c36218dcSRodrigo Vivi /*
3*c36218dcSRodrigo Vivi  * Copyright © 2026 Intel Corporation
4*c36218dcSRodrigo Vivi  */
5*c36218dcSRodrigo Vivi 
6*c36218dcSRodrigo Vivi #ifndef __DRM_RAS_H__
7*c36218dcSRodrigo Vivi #define __DRM_RAS_H__
8*c36218dcSRodrigo Vivi 
9*c36218dcSRodrigo Vivi #include <uapi/drm/drm_ras.h>
10*c36218dcSRodrigo Vivi 
11*c36218dcSRodrigo Vivi /**
12*c36218dcSRodrigo Vivi  * struct drm_ras_node - A DRM RAS Node
13*c36218dcSRodrigo Vivi  */
14*c36218dcSRodrigo Vivi struct drm_ras_node {
15*c36218dcSRodrigo Vivi 	/** @id: Unique identifier for the node. Dynamically assigned. */
16*c36218dcSRodrigo Vivi 	u32 id;
17*c36218dcSRodrigo Vivi 	/**
18*c36218dcSRodrigo Vivi 	 * @device_name: Human-readable name of the device. Given by the driver.
19*c36218dcSRodrigo Vivi 	 */
20*c36218dcSRodrigo Vivi 	const char *device_name;
21*c36218dcSRodrigo Vivi 	/** @node_name: Human-readable name of the node. Given by the driver. */
22*c36218dcSRodrigo Vivi 	const char *node_name;
23*c36218dcSRodrigo Vivi 	/** @type: Type of the node (enum drm_ras_node_type). */
24*c36218dcSRodrigo Vivi 	enum drm_ras_node_type type;
25*c36218dcSRodrigo Vivi 
26*c36218dcSRodrigo Vivi 	/* Error-Counter Related Callback and Variables */
27*c36218dcSRodrigo Vivi 
28*c36218dcSRodrigo Vivi 	/** @error_counter_range: Range of valid Error IDs for this node. */
29*c36218dcSRodrigo Vivi 	struct {
30*c36218dcSRodrigo Vivi 		/** @first: First valid Error ID. */
31*c36218dcSRodrigo Vivi 		u32 first;
32*c36218dcSRodrigo Vivi 		/** @last: Last valid Error ID. Mandatory entry. */
33*c36218dcSRodrigo Vivi 		u32 last;
34*c36218dcSRodrigo Vivi 	} error_counter_range;
35*c36218dcSRodrigo Vivi 
36*c36218dcSRodrigo Vivi 	/**
37*c36218dcSRodrigo Vivi 	 * @query_error_counter:
38*c36218dcSRodrigo Vivi 	 *
39*c36218dcSRodrigo Vivi 	 * This callback is used by drm-ras to query a specific error counter.
40*c36218dcSRodrigo Vivi 	 * Used for input check and to iterate all error counters in a node.
41*c36218dcSRodrigo Vivi 	 *
42*c36218dcSRodrigo Vivi 	 * Driver should expect query_error_counter() to be called with
43*c36218dcSRodrigo Vivi 	 * error_id from `error_counter_range.first` to
44*c36218dcSRodrigo Vivi 	 * `error_counter_range.last`.
45*c36218dcSRodrigo Vivi 	 *
46*c36218dcSRodrigo Vivi 	 * The @query_error_counter is a mandatory callback for
47*c36218dcSRodrigo Vivi 	 * error_counter_node.
48*c36218dcSRodrigo Vivi 	 *
49*c36218dcSRodrigo Vivi 	 * Returns: 0 on success,
50*c36218dcSRodrigo Vivi 	 *          -ENOENT when error_id is not supported as an indication that
51*c36218dcSRodrigo Vivi 	 *                  drm_ras should silently skip this entry. Used for
52*c36218dcSRodrigo Vivi 	 *                  supporting non-contiguous error ranges.
53*c36218dcSRodrigo Vivi 	 *                  Driver is responsible for maintaining the list of
54*c36218dcSRodrigo Vivi 	 *                  supported error IDs in the range of first to last.
55*c36218dcSRodrigo Vivi 	 *          Other negative values on errors that should terminate the
56*c36218dcSRodrigo Vivi 	 *          netlink query.
57*c36218dcSRodrigo Vivi 	 */
58*c36218dcSRodrigo Vivi 	int (*query_error_counter)(struct drm_ras_node *node, u32 error_id,
59*c36218dcSRodrigo Vivi 				   const char **name, u32 *val);
60*c36218dcSRodrigo Vivi 
61*c36218dcSRodrigo Vivi 	/** @priv: Driver private data */
62*c36218dcSRodrigo Vivi 	void *priv;
63*c36218dcSRodrigo Vivi };
64*c36218dcSRodrigo Vivi 
65*c36218dcSRodrigo Vivi struct drm_device;
66*c36218dcSRodrigo Vivi 
67*c36218dcSRodrigo Vivi #if IS_ENABLED(CONFIG_DRM_RAS)
68*c36218dcSRodrigo Vivi int drm_ras_node_register(struct drm_ras_node *node);
69*c36218dcSRodrigo Vivi void drm_ras_node_unregister(struct drm_ras_node *node);
70*c36218dcSRodrigo Vivi #else
71*c36218dcSRodrigo Vivi static inline int drm_ras_node_register(struct drm_ras_node *node) { return 0; }
72*c36218dcSRodrigo Vivi static inline void drm_ras_node_unregister(struct drm_ras_node *node) { }
73*c36218dcSRodrigo Vivi #endif
74*c36218dcSRodrigo Vivi 
75*c36218dcSRodrigo Vivi #endif
76