xref: /linux/drivers/gpu/drm/xe/xe_oa_types.h (revision e811c33b1f137be26a20444b79db8cbc1fca1c89)
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2023-2024 Intel Corporation
4  */
5 
6 #ifndef _XE_OA_TYPES_H_
7 #define _XE_OA_TYPES_H_
8 
9 #include <linux/bitops.h>
10 #include <linux/idr.h>
11 #include <linux/mutex.h>
12 #include <linux/types.h>
13 
14 #include <uapi/drm/xe_drm.h>
15 #include "regs/xe_reg_defs.h"
16 #include "xe_hw_engine_types.h"
17 
18 struct drm_syncobj;
19 
20 #define DEFAULT_XE_OA_BUFFER_SIZE SZ_16M
21 
22 enum xe_oa_report_header {
23 	HDR_32_BIT = 0,
24 	HDR_64_BIT,
25 };
26 
27 enum xe_oa_format_name {
28 	XE_OA_FORMAT_C4_B8,
29 
30 	/* Gen8+ */
31 	XE_OA_FORMAT_A12,
32 	XE_OA_FORMAT_A12_B8_C8,
33 	XE_OA_FORMAT_A32u40_A4u32_B8_C8,
34 
35 	/* DG2 */
36 	XE_OAR_FORMAT_A32u40_A4u32_B8_C8,
37 	XE_OA_FORMAT_A24u40_A14u32_B8_C8,
38 
39 	/* DG2/MTL OAC */
40 	XE_OAC_FORMAT_A24u64_B8_C8,
41 	XE_OAC_FORMAT_A22u32_R2u32_B8_C8,
42 
43 	/* MTL OAM */
44 	XE_OAM_FORMAT_MPEC8u64_B8_C8,
45 	XE_OAM_FORMAT_MPEC8u32_B8_C8,
46 
47 	/* Xe2+ */
48 	XE_OA_FORMAT_PEC64u64,
49 	XE_OA_FORMAT_PEC64u64_B8_C8,
50 	XE_OA_FORMAT_PEC64u32,
51 	XE_OA_FORMAT_PEC32u64_G1,
52 	XE_OA_FORMAT_PEC32u32_G1,
53 	XE_OA_FORMAT_PEC32u64_G2,
54 	XE_OA_FORMAT_PEC32u32_G2,
55 	XE_OA_FORMAT_PEC36u64_G1_32_G2_4,
56 	XE_OA_FORMAT_PEC36u64_G1_4_G2_32,
57 
58 	__XE_OA_FORMAT_MAX,
59 };
60 
61 /**
62  * struct xe_oa_format - Format fields for supported OA formats. OA format
63  * properties are specified in PRM/Bspec 52198 and 60942
64  */
65 struct xe_oa_format {
66 	/** @counter_select: counter select value (see Bspec 52198/60942) */
67 	u32 counter_select;
68 	/** @size: record size as written by HW (multiple of 64 byte cachelines) */
69 	int size;
70 	/** @type: of enum @drm_xe_oa_format_type */
71 	int type;
72 	/** @header: 32 or 64 bit report headers */
73 	enum xe_oa_report_header header;
74 	/** @counter_size: counter size value (see Bspec 60942) */
75 	u16 counter_size;
76 	/** @bc_report: BC report value (see Bspec 60942) */
77 	u16 bc_report;
78 };
79 
80 /** struct xe_oa_regs - Registers for each OA unit */
81 struct xe_oa_regs {
82 	u32 base;
83 	struct xe_reg oa_head_ptr;
84 	struct xe_reg oa_tail_ptr;
85 	struct xe_reg oa_buffer;
86 	struct xe_reg oa_ctx_ctrl;
87 	struct xe_reg oa_ctrl;
88 	struct xe_reg oa_debug;
89 	struct xe_reg oa_status;
90 	u32 oa_ctrl_counter_select_mask;
91 };
92 
93 /**
94  * struct xe_oa_unit - Hardware OA unit
95  */
96 struct xe_oa_unit {
97 	/** @oa_unit_id: identifier for the OA unit */
98 	u16 oa_unit_id;
99 
100 	/** @gt: gt associated with the OA unit */
101 	struct xe_gt *gt;
102 
103 	/** @type: Type of OA unit - OAM, OAG etc. */
104 	enum drm_xe_oa_unit_type type;
105 
106 	/** @regs: OA registers for programming the OA unit */
107 	struct xe_oa_regs regs;
108 
109 	/** @num_engines: number of engines attached to this OA unit */
110 	u32 num_engines;
111 
112 	/** @exclusive_stream: The stream currently using the OA unit */
113 	struct xe_oa_stream *exclusive_stream;
114 };
115 
116 /**
117  * struct xe_oa_gt - OA per-gt information
118  */
119 struct xe_oa_gt {
120 	/** @gt_lock: lock protecting create/destroy OA streams */
121 	struct mutex gt_lock;
122 
123 	/** @num_oa_units: number of oa units for each gt */
124 	u32 num_oa_units;
125 
126 	/** @oa_unit: array of oa_units */
127 	struct xe_oa_unit *oa_unit;
128 };
129 
130 /**
131  * struct xe_oa - OA device level information
132  */
133 struct xe_oa {
134 	/** @xe: back pointer to xe device */
135 	struct xe_device *xe;
136 
137 	/** @metrics_kobj: kobj for metrics sysfs */
138 	struct kobject *metrics_kobj;
139 
140 	/** @metrics_lock: lock protecting add/remove configs */
141 	struct mutex metrics_lock;
142 
143 	/** @metrics_idr: List of dynamic configurations (struct xe_oa_config) */
144 	struct idr metrics_idr;
145 
146 	/** @oa_formats: tracks all OA formats across platforms */
147 	const struct xe_oa_format *oa_formats;
148 
149 	/** @format_mask: tracks valid OA formats for a platform */
150 	unsigned long format_mask[BITS_TO_LONGS(__XE_OA_FORMAT_MAX)];
151 
152 	/** @oa_unit_ids: tracks oa unit ids assigned across gt's */
153 	u16 oa_unit_ids;
154 };
155 
156 /** @xe_oa_buffer: State of the stream OA buffer */
157 struct xe_oa_buffer {
158 	/** @format: data format */
159 	const struct xe_oa_format *format;
160 
161 	/** @format: xe_bo backing the OA buffer */
162 	struct xe_bo *bo;
163 
164 	/** @vaddr: mapped vaddr of the OA buffer */
165 	u8 *vaddr;
166 
167 	/** @ptr_lock: Lock protecting reads/writes to head/tail pointers */
168 	spinlock_t ptr_lock;
169 
170 	/** @head: Cached head to read from */
171 	u32 head;
172 
173 	/** @tail: The last verified cached tail where HW has completed writing */
174 	u32 tail;
175 
176 	/** @circ_size: The effective circular buffer size, for Xe2+ */
177 	u32 circ_size;
178 };
179 
180 /**
181  * struct xe_oa_stream - state for a single open stream FD
182  */
183 struct xe_oa_stream {
184 	/** @oa: xe_oa backpointer */
185 	struct xe_oa *oa;
186 
187 	/** @gt: gt associated with the oa stream */
188 	struct xe_gt *gt;
189 
190 	/** @oa_unit: oa unit for this stream */
191 	struct xe_oa_unit *oa_unit;
192 
193 	/** @hwe: hardware engine associated with this oa stream */
194 	struct xe_hw_engine *hwe;
195 
196 	/** @stream_lock: Lock serializing stream operations */
197 	struct mutex stream_lock;
198 
199 	/** @sample: true if DRM_XE_OA_PROP_SAMPLE_OA is provided */
200 	bool sample;
201 
202 	/** @exec_q: Exec queue corresponding to DRM_XE_OA_PROPERTY_EXEC_QUEUE_ID */
203 	struct xe_exec_queue *exec_q;
204 
205 	/** @k_exec_q: kernel exec_q used for OA programming batch submissions */
206 	struct xe_exec_queue *k_exec_q;
207 
208 	/** @enabled: Whether the stream is currently enabled */
209 	bool enabled;
210 
211 	/** @oa_config: OA configuration used by the stream */
212 	struct xe_oa_config *oa_config;
213 
214 	/** @oa_config_bos: List of struct @xe_oa_config_bo's */
215 	struct llist_head oa_config_bos;
216 
217 	/** @poll_check_timer: Timer to periodically check for data in the OA buffer */
218 	struct hrtimer poll_check_timer;
219 
220 	/** @poll_wq: Wait queue for waiting for OA data to be available */
221 	wait_queue_head_t poll_wq;
222 
223 	/** @pollin: Whether there is data available to read */
224 	bool pollin;
225 
226 	/** @wait_num_reports: Number of reports to wait for before signalling pollin */
227 	int wait_num_reports;
228 
229 	/** @periodic: Whether periodic sampling is currently enabled */
230 	bool periodic;
231 
232 	/** @period_exponent: OA unit sampling frequency is derived from this */
233 	int period_exponent;
234 
235 	/** @oa_buffer: OA buffer for the stream */
236 	struct xe_oa_buffer oa_buffer;
237 
238 	/** @poll_period_ns: hrtimer period for checking OA buffer for available data */
239 	u64 poll_period_ns;
240 
241 	/** @override_gucrc: GuC RC has been overridden for the OA stream */
242 	bool override_gucrc;
243 
244 	/** @oa_status: temporary storage for oa_status register value */
245 	u32 oa_status;
246 
247 	/** @no_preempt: Whether preemption and timeslicing is disabled for stream exec_q */
248 	u32 no_preempt;
249 
250 	/** @xef: xe_file with which the stream was opened */
251 	struct xe_file *xef;
252 
253 	/** @ufence_syncobj: User fence syncobj */
254 	struct drm_syncobj *ufence_syncobj;
255 
256 	/** @ufence_timeline_value: User fence timeline value */
257 	u64 ufence_timeline_value;
258 
259 	/** @last_fence: fence to use in stream destroy when needed */
260 	struct dma_fence *last_fence;
261 
262 	/** @num_syncs: size of @syncs array */
263 	u32 num_syncs;
264 
265 	/** @syncs: syncs to wait on and to signal */
266 	struct xe_sync_entry *syncs;
267 };
268 #endif
269