xref: /linux/drivers/gpu/drm/amd/display/dc/dc_probe.h (revision 67f8bc848ee31831336bd478e57d2f993551902e)
1*7ae85e64SWenjing Liu // SPDX-License-Identifier: MIT
2*7ae85e64SWenjing Liu //
3*7ae85e64SWenjing Liu // Copyright 2025 Advanced Micro Devices, Inc.
4*7ae85e64SWenjing Liu 
5*7ae85e64SWenjing Liu #ifndef _DC_PROBE_H_
6*7ae85e64SWenjing Liu #define _DC_PROBE_H_
7*7ae85e64SWenjing Liu 
8*7ae85e64SWenjing Liu #include "os_types.h"
9*7ae85e64SWenjing Liu 
10*7ae85e64SWenjing Liu /**
11*7ae85e64SWenjing Liu  * enum dc_probe_type - What DM wants to probe.
12*7ae85e64SWenjing Liu  *
13*7ae85e64SWenjing Liu  * Each value names a measurable quantity as an abstraction. DC resolves it to
14*7ae85e64SWenjing Liu  * whatever HW measurement block fulfills it. DM never selects the HW block.
15*7ae85e64SWenjing Liu  */
16*7ae85e64SWenjing Liu enum dc_probe_type {
17*7ae85e64SWenjing Liu 	DC_PROBE_PEAK_MEM_BW = 0,
18*7ae85e64SWenjing Liu 	DC_PROBE_AVG_MEM_BW,
19*7ae85e64SWenjing Liu 	DC_PROBE_MEM_LATENCY,
20*7ae85e64SWenjing Liu 	DC_PROBE_URGENT_RAMP_LATENCY,
21*7ae85e64SWenjing Liu 	DC_PROBE_URGENT_ASSERTION_COUNT,
22*7ae85e64SWenjing Liu 	DC_PROBE_PREFETCH_DATA_SIZE,
23*7ae85e64SWenjing Liu };
24*7ae85e64SWenjing Liu 
25*7ae85e64SWenjing Liu /**
26*7ae85e64SWenjing Liu  * enum dc_probe_target_state - Target lifecycle state DM wants DC to reach.
27*7ae85e64SWenjing Liu  *
28*7ae85e64SWenjing Liu  * DM sets this to describe the final state DC must reach by the end of the
29*7ae85e64SWenjing Liu  * commit. DC performs whatever HW transition sequence is needed.
30*7ae85e64SWenjing Liu  *
31*7ae85e64SWenjing Liu  * @DC_PROBE_NOT_MEASURING: probe inactive, no valid data available.
32*7ae85e64SWenjing Liu  * @DC_PROBE_MEASURING:     probe runs continuously. The latest value can be
33*7ae85e64SWenjing Liu  *   read back at any time and may differ on each read.
34*7ae85e64SWenjing Liu  * @DC_PROBE_MEASURED:      probe performed one shot. The result is latched and
35*7ae85e64SWenjing Liu  *   stays valid until DM transitions back to DC_PROBE_NOT_MEASURING.
36*7ae85e64SWenjing Liu  */
37*7ae85e64SWenjing Liu enum dc_probe_target_state {
38*7ae85e64SWenjing Liu 	DC_PROBE_NOT_MEASURING = 0,
39*7ae85e64SWenjing Liu 	DC_PROBE_MEASURING,
40*7ae85e64SWenjing Liu 	DC_PROBE_MEASURED,
41*7ae85e64SWenjing Liu };
42*7ae85e64SWenjing Liu 
43*7ae85e64SWenjing Liu /**
44*7ae85e64SWenjing Liu  * enum dc_probe_scope_type - What the probe is scoped to.
45*7ae85e64SWenjing Liu  * @DC_PROBE_SCOPE_GLOBAL: whole memory subsystem, no stream/plane selector.
46*7ae85e64SWenjing Liu  *
47*7ae85e64SWenjing Liu  * Only GLOBAL is implemented. Per-stream/plane scoping must select targets by
48*7ae85e64SWenjing Liu  * stable id, not object pointer — dc_state copy semantics would dangle a raw
49*7ae85e64SWenjing Liu  * pointer when the absolute-set commit removes or replaces the target.
50*7ae85e64SWenjing Liu  */
51*7ae85e64SWenjing Liu enum dc_probe_scope_type {
52*7ae85e64SWenjing Liu 	DC_PROBE_SCOPE_GLOBAL = 0,
53*7ae85e64SWenjing Liu };
54*7ae85e64SWenjing Liu 
55*7ae85e64SWenjing Liu /**
56*7ae85e64SWenjing Liu  * struct dc_probe_scope - Selects what a probe measures against.
57*7ae85e64SWenjing Liu  * @type: scope kind, only DC_PROBE_SCOPE_GLOBAL is implemented.
58*7ae85e64SWenjing Liu  */
59*7ae85e64SWenjing Liu struct dc_probe_scope {
60*7ae85e64SWenjing Liu 	enum dc_probe_scope_type type;
61*7ae85e64SWenjing Liu };
62*7ae85e64SWenjing Liu 
63*7ae85e64SWenjing Liu /**
64*7ae85e64SWenjing Liu  * struct dc_probe_state - DM-authored descriptor of a single probe.
65*7ae85e64SWenjing Liu  *
66*7ae85e64SWenjing Liu  * A plain inline value with copy semantics: no allocation, no refcount. DC
67*7ae85e64SWenjing Liu  * resolves each descriptor to a HW measurement instance and diffs the desired
68*7ae85e64SWenjing Liu  * set against the committed set to plan the transition.
69*7ae85e64SWenjing Liu  *
70*7ae85e64SWenjing Liu  * @type:         what to measure.
71*7ae85e64SWenjing Liu  * @target_state: desired lifecycle state for this probe.
72*7ae85e64SWenjing Liu  * @scope:        what the probe is scoped to (GLOBAL only for now).
73*7ae85e64SWenjing Liu  */
74*7ae85e64SWenjing Liu struct dc_probe_state {
75*7ae85e64SWenjing Liu 	enum dc_probe_type         type;
76*7ae85e64SWenjing Liu 	enum dc_probe_target_state target_state;
77*7ae85e64SWenjing Liu 	struct dc_probe_scope      scope;
78*7ae85e64SWenjing Liu };
79*7ae85e64SWenjing Liu 
80*7ae85e64SWenjing Liu #define MAX_PROBES 1
81*7ae85e64SWenjing Liu 
82*7ae85e64SWenjing Liu /**
83*7ae85e64SWenjing Liu  * struct dc_probe_updates - Absolute set of probes DM wants active.
84*7ae85e64SWenjing Liu  *
85*7ae85e64SWenjing Liu  * Mirrors the plane/stream absolute-set model: the array is the complete
86*7ae85e64SWenjing Liu  * desired set. DC compares it against the committed set to add, remove, or
87*7ae85e64SWenjing Liu  * transition probes.
88*7ae85e64SWenjing Liu  *
89*7ae85e64SWenjing Liu  * @probes:      desired probe descriptors.
90*7ae85e64SWenjing Liu  * @probe_count: number of valid entries in @probes.
91*7ae85e64SWenjing Liu  */
92*7ae85e64SWenjing Liu struct dc_probe_updates {
93*7ae85e64SWenjing Liu 	struct dc_probe_state probes[MAX_PROBES];
94*7ae85e64SWenjing Liu 	int                   probe_count;
95*7ae85e64SWenjing Liu };
96*7ae85e64SWenjing Liu 
97*7ae85e64SWenjing Liu #endif /* _DC_PROBE_H_ */
98