xref: /linux/drivers/gpu/drm/i915/i915_pmu.c (revision 7abdafd2343ab199367c8243d6a5f06a9aa6976b)
1 /*
2  * SPDX-License-Identifier: MIT
3  *
4  * Copyright © 2017-2018 Intel Corporation
5  */
6 
7 #include <linux/pm_runtime.h>
8 
9 #include "gt/intel_engine.h"
10 #include "gt/intel_engine_pm.h"
11 #include "gt/intel_engine_regs.h"
12 #include "gt/intel_engine_user.h"
13 #include "gt/intel_gt.h"
14 #include "gt/intel_gt_pm.h"
15 #include "gt/intel_gt_regs.h"
16 #include "gt/intel_rc6.h"
17 #include "gt/intel_rps.h"
18 
19 #include "i915_drv.h"
20 #include "i915_pmu.h"
21 
22 /* Frequency for the sampling timer for events which need it. */
23 #define FREQUENCY 200
24 #define PERIOD max_t(u64, 10000, NSEC_PER_SEC / FREQUENCY)
25 
26 #define ENGINE_SAMPLE_MASK \
27 	(BIT(I915_SAMPLE_BUSY) | \
28 	 BIT(I915_SAMPLE_WAIT) | \
29 	 BIT(I915_SAMPLE_SEMA))
30 
event_to_pmu(struct perf_event * event)31 static struct i915_pmu *event_to_pmu(struct perf_event *event)
32 {
33 	return container_of(event->pmu, struct i915_pmu, base);
34 }
35 
pmu_to_i915(struct i915_pmu * pmu)36 static struct drm_i915_private *pmu_to_i915(struct i915_pmu *pmu)
37 {
38 	return container_of(pmu, struct drm_i915_private, pmu);
39 }
40 
engine_config_sample(u64 config)41 static u8 engine_config_sample(u64 config)
42 {
43 	return config & I915_PMU_SAMPLE_MASK;
44 }
45 
engine_event_sample(struct perf_event * event)46 static u8 engine_event_sample(struct perf_event *event)
47 {
48 	return engine_config_sample(event->attr.config);
49 }
50 
engine_event_class(struct perf_event * event)51 static u8 engine_event_class(struct perf_event *event)
52 {
53 	return (event->attr.config >> I915_PMU_CLASS_SHIFT) & 0xff;
54 }
55 
engine_event_instance(struct perf_event * event)56 static u8 engine_event_instance(struct perf_event *event)
57 {
58 	return (event->attr.config >> I915_PMU_SAMPLE_BITS) & 0xff;
59 }
60 
is_engine_config(const u64 config)61 static bool is_engine_config(const u64 config)
62 {
63 	return config < __I915_PMU_OTHER(0);
64 }
65 
config_gt_id(const u64 config)66 static unsigned int config_gt_id(const u64 config)
67 {
68 	return config >> __I915_PMU_GT_SHIFT;
69 }
70 
config_counter(const u64 config)71 static u64 config_counter(const u64 config)
72 {
73 	return config & ~(~0ULL << __I915_PMU_GT_SHIFT);
74 }
75 
other_bit(const u64 config)76 static unsigned int other_bit(const u64 config)
77 {
78 	unsigned int val;
79 
80 	switch (config_counter(config)) {
81 	case I915_PMU_ACTUAL_FREQUENCY:
82 		val =  __I915_PMU_ACTUAL_FREQUENCY_ENABLED;
83 		break;
84 	case I915_PMU_REQUESTED_FREQUENCY:
85 		val = __I915_PMU_REQUESTED_FREQUENCY_ENABLED;
86 		break;
87 	case I915_PMU_RC6_RESIDENCY:
88 		val = __I915_PMU_RC6_RESIDENCY_ENABLED;
89 		break;
90 	default:
91 		/*
92 		 * Events that do not require sampling, or tracking state
93 		 * transitions between enabled and disabled can be ignored.
94 		 */
95 		return -1;
96 	}
97 
98 	return I915_ENGINE_SAMPLE_COUNT +
99 	       config_gt_id(config) * __I915_PMU_TRACKED_EVENT_COUNT +
100 	       val;
101 }
102 
config_bit(const u64 config)103 static unsigned int config_bit(const u64 config)
104 {
105 	if (is_engine_config(config))
106 		return engine_config_sample(config);
107 	else
108 		return other_bit(config);
109 }
110 
config_mask(const u64 config)111 static __always_inline u32 config_mask(const u64 config)
112 {
113 	unsigned int bit = config_bit(config);
114 
115 	if (__builtin_constant_p(bit))
116 		BUILD_BUG_ON(bit >
117 			     BITS_PER_TYPE(typeof_member(struct i915_pmu,
118 							 enable)) - 1);
119 	else
120 		WARN_ON_ONCE(bit >
121 			     BITS_PER_TYPE(typeof_member(struct i915_pmu,
122 							 enable)) - 1);
123 
124 	return BIT(bit);
125 }
126 
is_engine_event(struct perf_event * event)127 static bool is_engine_event(struct perf_event *event)
128 {
129 	return is_engine_config(event->attr.config);
130 }
131 
event_bit(struct perf_event * event)132 static unsigned int event_bit(struct perf_event *event)
133 {
134 	return config_bit(event->attr.config);
135 }
136 
frequency_enabled_mask(void)137 static u32 frequency_enabled_mask(void)
138 {
139 	unsigned int i;
140 	u32 mask = 0;
141 
142 	for (i = 0; i < I915_PMU_MAX_GT; i++)
143 		mask |= config_mask(__I915_PMU_ACTUAL_FREQUENCY(i)) |
144 			config_mask(__I915_PMU_REQUESTED_FREQUENCY(i));
145 
146 	return mask;
147 }
148 
pmu_needs_timer(struct i915_pmu * pmu)149 static bool pmu_needs_timer(struct i915_pmu *pmu)
150 {
151 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
152 	u32 enable;
153 
154 	/*
155 	 * Only some counters need the sampling timer.
156 	 *
157 	 * We start with a bitmask of all currently enabled events.
158 	 */
159 	enable = pmu->enable;
160 
161 	/*
162 	 * Mask out all the ones which do not need the timer, or in
163 	 * other words keep all the ones that could need the timer.
164 	 */
165 	enable &= frequency_enabled_mask() | ENGINE_SAMPLE_MASK;
166 
167 	/*
168 	 * Also there is software busyness tracking available we do not
169 	 * need the timer for I915_SAMPLE_BUSY counter.
170 	 */
171 	if (i915->caps.scheduler & I915_SCHEDULER_CAP_ENGINE_BUSY_STATS)
172 		enable &= ~BIT(I915_SAMPLE_BUSY);
173 
174 	/*
175 	 * If some bits remain it means we need the sampling timer running.
176 	 */
177 	return enable;
178 }
179 
__get_rc6(struct intel_gt * gt)180 static u64 __get_rc6(struct intel_gt *gt)
181 {
182 	struct drm_i915_private *i915 = gt->i915;
183 	u64 val;
184 
185 	val = intel_rc6_residency_ns(&gt->rc6, INTEL_RC6_RES_RC6);
186 
187 	if (HAS_RC6p(i915))
188 		val += intel_rc6_residency_ns(&gt->rc6, INTEL_RC6_RES_RC6p);
189 
190 	if (HAS_RC6pp(i915))
191 		val += intel_rc6_residency_ns(&gt->rc6, INTEL_RC6_RES_RC6pp);
192 
193 	return val;
194 }
195 
ktime_since_raw(const ktime_t kt)196 static inline s64 ktime_since_raw(const ktime_t kt)
197 {
198 	return ktime_to_ns(ktime_sub(ktime_get_raw(), kt));
199 }
200 
read_sample(struct i915_pmu * pmu,unsigned int gt_id,int sample)201 static u64 read_sample(struct i915_pmu *pmu, unsigned int gt_id, int sample)
202 {
203 	return pmu->sample[gt_id][sample].cur;
204 }
205 
206 static void
store_sample(struct i915_pmu * pmu,unsigned int gt_id,int sample,u64 val)207 store_sample(struct i915_pmu *pmu, unsigned int gt_id, int sample, u64 val)
208 {
209 	pmu->sample[gt_id][sample].cur = val;
210 }
211 
212 static void
add_sample_mult(struct i915_pmu * pmu,unsigned int gt_id,int sample,u32 val,u32 mul)213 add_sample_mult(struct i915_pmu *pmu, unsigned int gt_id, int sample, u32 val, u32 mul)
214 {
215 	pmu->sample[gt_id][sample].cur += mul_u32_u32(val, mul);
216 }
217 
get_rc6(struct intel_gt * gt)218 static u64 get_rc6(struct intel_gt *gt)
219 {
220 	struct drm_i915_private *i915 = gt->i915;
221 	const unsigned int gt_id = gt->info.id;
222 	struct i915_pmu *pmu = &i915->pmu;
223 	intel_wakeref_t wakeref;
224 	unsigned long flags;
225 	u64 val;
226 
227 	wakeref = intel_gt_pm_get_if_awake(gt);
228 	if (wakeref) {
229 		val = __get_rc6(gt);
230 		intel_gt_pm_put_async(gt, wakeref);
231 	}
232 
233 	spin_lock_irqsave(&pmu->lock, flags);
234 
235 	if (wakeref) {
236 		store_sample(pmu, gt_id, __I915_SAMPLE_RC6, val);
237 	} else {
238 		/*
239 		 * We think we are runtime suspended.
240 		 *
241 		 * Report the delta from when the device was suspended to now,
242 		 * on top of the last known real value, as the approximated RC6
243 		 * counter value.
244 		 */
245 		val = ktime_since_raw(pmu->sleep_last[gt_id]);
246 		val += read_sample(pmu, gt_id, __I915_SAMPLE_RC6);
247 	}
248 
249 	if (val < read_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED))
250 		val = read_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED);
251 	else
252 		store_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED, val);
253 
254 	spin_unlock_irqrestore(&pmu->lock, flags);
255 
256 	return val;
257 }
258 
init_rc6(struct i915_pmu * pmu)259 static void init_rc6(struct i915_pmu *pmu)
260 {
261 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
262 	struct intel_gt *gt;
263 	unsigned int i;
264 
265 	for_each_gt(gt, i915, i) {
266 		intel_wakeref_t wakeref;
267 
268 		with_intel_runtime_pm(gt->uncore->rpm, wakeref) {
269 			u64 val = __get_rc6(gt);
270 
271 			store_sample(pmu, i, __I915_SAMPLE_RC6, val);
272 			store_sample(pmu, i, __I915_SAMPLE_RC6_LAST_REPORTED,
273 				     val);
274 			pmu->sleep_last[i] = ktime_get_raw();
275 		}
276 	}
277 }
278 
park_rc6(struct intel_gt * gt)279 static void park_rc6(struct intel_gt *gt)
280 {
281 	struct i915_pmu *pmu = &gt->i915->pmu;
282 
283 	store_sample(pmu, gt->info.id, __I915_SAMPLE_RC6, __get_rc6(gt));
284 	pmu->sleep_last[gt->info.id] = ktime_get_raw();
285 }
286 
__i915_pmu_maybe_start_timer(struct i915_pmu * pmu)287 static void __i915_pmu_maybe_start_timer(struct i915_pmu *pmu)
288 {
289 	if (!pmu->timer_enabled && pmu_needs_timer(pmu)) {
290 		pmu->timer_enabled = true;
291 		pmu->timer_last = ktime_get();
292 		hrtimer_start_range_ns(&pmu->timer,
293 				       ns_to_ktime(PERIOD), 0,
294 				       HRTIMER_MODE_REL_PINNED);
295 	}
296 }
297 
i915_pmu_gt_parked(struct intel_gt * gt)298 void i915_pmu_gt_parked(struct intel_gt *gt)
299 {
300 	struct i915_pmu *pmu = &gt->i915->pmu;
301 
302 	if (!pmu->registered)
303 		return;
304 
305 	spin_lock_irq(&pmu->lock);
306 
307 	park_rc6(gt);
308 
309 	/*
310 	 * Signal sampling timer to stop if only engine events are enabled and
311 	 * GPU went idle.
312 	 */
313 	pmu->unparked &= ~BIT(gt->info.id);
314 	if (pmu->unparked == 0)
315 		pmu->timer_enabled = false;
316 
317 	spin_unlock_irq(&pmu->lock);
318 }
319 
i915_pmu_gt_unparked(struct intel_gt * gt)320 void i915_pmu_gt_unparked(struct intel_gt *gt)
321 {
322 	struct i915_pmu *pmu = &gt->i915->pmu;
323 
324 	if (!pmu->registered)
325 		return;
326 
327 	spin_lock_irq(&pmu->lock);
328 
329 	/*
330 	 * Re-enable sampling timer when GPU goes active.
331 	 */
332 	if (pmu->unparked == 0)
333 		__i915_pmu_maybe_start_timer(pmu);
334 
335 	pmu->unparked |= BIT(gt->info.id);
336 
337 	spin_unlock_irq(&pmu->lock);
338 }
339 
340 static void
add_sample(struct i915_pmu_sample * sample,u32 val)341 add_sample(struct i915_pmu_sample *sample, u32 val)
342 {
343 	sample->cur += val;
344 }
345 
exclusive_mmio_access(const struct drm_i915_private * i915)346 static bool exclusive_mmio_access(const struct drm_i915_private *i915)
347 {
348 	/*
349 	 * We have to avoid concurrent mmio cache line access on gen7 or
350 	 * risk a machine hang. For a fun history lesson dig out the old
351 	 * userspace intel_gpu_top and run it on Ivybridge or Haswell!
352 	 */
353 	return GRAPHICS_VER(i915) == 7;
354 }
355 
gen3_engine_sample(struct intel_engine_cs * engine,unsigned int period_ns)356 static void gen3_engine_sample(struct intel_engine_cs *engine, unsigned int period_ns)
357 {
358 	struct intel_engine_pmu *pmu = &engine->pmu;
359 	bool busy;
360 	u32 val;
361 
362 	val = ENGINE_READ_FW(engine, RING_CTL);
363 	if (val == 0) /* powerwell off => engine idle */
364 		return;
365 
366 	if (val & RING_WAIT)
367 		add_sample(&pmu->sample[I915_SAMPLE_WAIT], period_ns);
368 	if (val & RING_WAIT_SEMAPHORE)
369 		add_sample(&pmu->sample[I915_SAMPLE_SEMA], period_ns);
370 
371 	/* No need to sample when busy stats are supported. */
372 	if (intel_engine_supports_stats(engine))
373 		return;
374 
375 	/*
376 	 * While waiting on a semaphore or event, MI_MODE reports the
377 	 * ring as idle. However, previously using the seqno, and with
378 	 * execlists sampling, we account for the ring waiting as the
379 	 * engine being busy. Therefore, we record the sample as being
380 	 * busy if either waiting or !idle.
381 	 */
382 	busy = val & (RING_WAIT_SEMAPHORE | RING_WAIT);
383 	if (!busy) {
384 		val = ENGINE_READ_FW(engine, RING_MI_MODE);
385 		busy = !(val & MODE_IDLE);
386 	}
387 	if (busy)
388 		add_sample(&pmu->sample[I915_SAMPLE_BUSY], period_ns);
389 }
390 
gen2_engine_sample(struct intel_engine_cs * engine,unsigned int period_ns)391 static void gen2_engine_sample(struct intel_engine_cs *engine, unsigned int period_ns)
392 {
393 	struct intel_engine_pmu *pmu = &engine->pmu;
394 	u32 tail, head, acthd;
395 
396 	tail = ENGINE_READ_FW(engine, RING_TAIL);
397 	head = ENGINE_READ_FW(engine, RING_HEAD);
398 	acthd = ENGINE_READ_FW(engine, ACTHD);
399 
400 	if (head & HEAD_WAIT_I8XX)
401 		add_sample(&pmu->sample[I915_SAMPLE_WAIT], period_ns);
402 
403 	if (head & HEAD_WAIT_I8XX || head != acthd ||
404 	    (head & HEAD_ADDR) != (tail & TAIL_ADDR))
405 		add_sample(&pmu->sample[I915_SAMPLE_BUSY], period_ns);
406 }
407 
engine_sample(struct intel_engine_cs * engine,unsigned int period_ns)408 static void engine_sample(struct intel_engine_cs *engine, unsigned int period_ns)
409 {
410 	if (GRAPHICS_VER(engine->i915) >= 3)
411 		gen3_engine_sample(engine, period_ns);
412 	else
413 		gen2_engine_sample(engine, period_ns);
414 }
415 
416 static void
engines_sample(struct intel_gt * gt,unsigned int period_ns)417 engines_sample(struct intel_gt *gt, unsigned int period_ns)
418 {
419 	struct drm_i915_private *i915 = gt->i915;
420 	struct intel_engine_cs *engine;
421 	enum intel_engine_id id;
422 	unsigned long flags;
423 
424 	if ((i915->pmu.enable & ENGINE_SAMPLE_MASK) == 0)
425 		return;
426 
427 	if (!intel_gt_pm_is_awake(gt))
428 		return;
429 
430 	for_each_engine(engine, gt, id) {
431 		if (!engine->pmu.enable)
432 			continue;
433 
434 		if (!intel_engine_pm_get_if_awake(engine))
435 			continue;
436 
437 		if (exclusive_mmio_access(i915)) {
438 			spin_lock_irqsave(&engine->uncore->lock, flags);
439 			engine_sample(engine, period_ns);
440 			spin_unlock_irqrestore(&engine->uncore->lock, flags);
441 		} else {
442 			engine_sample(engine, period_ns);
443 		}
444 
445 		intel_engine_pm_put_async(engine);
446 	}
447 }
448 
449 static bool
frequency_sampling_enabled(struct i915_pmu * pmu,unsigned int gt)450 frequency_sampling_enabled(struct i915_pmu *pmu, unsigned int gt)
451 {
452 	return pmu->enable &
453 	       (config_mask(__I915_PMU_ACTUAL_FREQUENCY(gt)) |
454 		config_mask(__I915_PMU_REQUESTED_FREQUENCY(gt)));
455 }
456 
457 static void
frequency_sample(struct intel_gt * gt,unsigned int period_ns)458 frequency_sample(struct intel_gt *gt, unsigned int period_ns)
459 {
460 	struct drm_i915_private *i915 = gt->i915;
461 	const unsigned int gt_id = gt->info.id;
462 	struct i915_pmu *pmu = &i915->pmu;
463 	struct intel_rps *rps = &gt->rps;
464 	intel_wakeref_t wakeref;
465 
466 	if (!frequency_sampling_enabled(pmu, gt_id))
467 		return;
468 
469 	/* Report 0/0 (actual/requested) frequency while parked. */
470 	wakeref = intel_gt_pm_get_if_awake(gt);
471 	if (!wakeref)
472 		return;
473 
474 	if (pmu->enable & config_mask(__I915_PMU_ACTUAL_FREQUENCY(gt_id))) {
475 		u32 val;
476 
477 		/*
478 		 * We take a quick peek here without using forcewake
479 		 * so that we don't perturb the system under observation
480 		 * (forcewake => !rc6 => increased power use). We expect
481 		 * that if the read fails because it is outside of the
482 		 * mmio power well, then it will return 0 -- in which
483 		 * case we assume the system is running at the intended
484 		 * frequency. Fortunately, the read should rarely fail!
485 		 */
486 		val = intel_rps_read_actual_frequency_fw(rps);
487 		if (!val)
488 			val = intel_gpu_freq(rps, rps->cur_freq);
489 
490 		add_sample_mult(pmu, gt_id, __I915_SAMPLE_FREQ_ACT,
491 				val, period_ns / 1000);
492 	}
493 
494 	if (pmu->enable & config_mask(__I915_PMU_REQUESTED_FREQUENCY(gt_id))) {
495 		add_sample_mult(pmu, gt_id, __I915_SAMPLE_FREQ_REQ,
496 				intel_rps_get_requested_frequency(rps),
497 				period_ns / 1000);
498 	}
499 
500 	intel_gt_pm_put_async(gt, wakeref);
501 }
502 
i915_sample(struct hrtimer * hrtimer)503 static enum hrtimer_restart i915_sample(struct hrtimer *hrtimer)
504 {
505 	struct i915_pmu *pmu = container_of(hrtimer, struct i915_pmu, timer);
506 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
507 	unsigned int period_ns;
508 	struct intel_gt *gt;
509 	unsigned int i;
510 	ktime_t now;
511 
512 	if (!READ_ONCE(pmu->timer_enabled))
513 		return HRTIMER_NORESTART;
514 
515 	now = ktime_get();
516 	period_ns = ktime_to_ns(ktime_sub(now, pmu->timer_last));
517 	pmu->timer_last = now;
518 
519 	/*
520 	 * Strictly speaking the passed in period may not be 100% accurate for
521 	 * all internal calculation, since some amount of time can be spent on
522 	 * grabbing the forcewake. However the potential error from timer call-
523 	 * back delay greatly dominates this so we keep it simple.
524 	 */
525 
526 	for_each_gt(gt, i915, i) {
527 		if (!(pmu->unparked & BIT(i)))
528 			continue;
529 
530 		engines_sample(gt, period_ns);
531 		frequency_sample(gt, period_ns);
532 	}
533 
534 	hrtimer_forward(hrtimer, now, ns_to_ktime(PERIOD));
535 
536 	return HRTIMER_RESTART;
537 }
538 
i915_pmu_event_destroy(struct perf_event * event)539 static void i915_pmu_event_destroy(struct perf_event *event)
540 {
541 	struct i915_pmu *pmu = event_to_pmu(event);
542 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
543 
544 	drm_WARN_ON(&i915->drm, event->parent);
545 
546 	drm_dev_put(&i915->drm);
547 }
548 
549 static int
engine_event_status(struct intel_engine_cs * engine,enum drm_i915_pmu_engine_sample sample)550 engine_event_status(struct intel_engine_cs *engine,
551 		    enum drm_i915_pmu_engine_sample sample)
552 {
553 	switch (sample) {
554 	case I915_SAMPLE_BUSY:
555 	case I915_SAMPLE_WAIT:
556 		break;
557 	case I915_SAMPLE_SEMA:
558 		if (GRAPHICS_VER(engine->i915) < 6)
559 			return -ENODEV;
560 		break;
561 	default:
562 		return -ENOENT;
563 	}
564 
565 	return 0;
566 }
567 
568 static int
config_status(struct drm_i915_private * i915,u64 config)569 config_status(struct drm_i915_private *i915, u64 config)
570 {
571 	struct intel_gt *gt = to_gt(i915);
572 
573 	unsigned int gt_id = config_gt_id(config);
574 	unsigned int max_gt_id = HAS_EXTRA_GT_LIST(i915) ? 1 : 0;
575 
576 	if (gt_id > max_gt_id)
577 		return -ENOENT;
578 
579 	switch (config_counter(config)) {
580 	case I915_PMU_ACTUAL_FREQUENCY:
581 		if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915))
582 			/* Requires a mutex for sampling! */
583 			return -ENODEV;
584 		fallthrough;
585 	case I915_PMU_REQUESTED_FREQUENCY:
586 		if (GRAPHICS_VER(i915) < 6)
587 			return -ENODEV;
588 		break;
589 	case I915_PMU_INTERRUPTS:
590 		if (gt_id)
591 			return -ENOENT;
592 		break;
593 	case I915_PMU_RC6_RESIDENCY:
594 		if (!gt->rc6.supported)
595 			return -ENODEV;
596 		break;
597 	case I915_PMU_SOFTWARE_GT_AWAKE_TIME:
598 		break;
599 	default:
600 		return -ENOENT;
601 	}
602 
603 	return 0;
604 }
605 
engine_event_init(struct perf_event * event)606 static int engine_event_init(struct perf_event *event)
607 {
608 	struct i915_pmu *pmu = event_to_pmu(event);
609 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
610 	struct intel_engine_cs *engine;
611 
612 	engine = intel_engine_lookup_user(i915, engine_event_class(event),
613 					  engine_event_instance(event));
614 	if (!engine)
615 		return -ENODEV;
616 
617 	return engine_event_status(engine, engine_event_sample(event));
618 }
619 
i915_pmu_event_init(struct perf_event * event)620 static int i915_pmu_event_init(struct perf_event *event)
621 {
622 	struct i915_pmu *pmu = event_to_pmu(event);
623 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
624 	int ret;
625 
626 	if (!pmu->registered)
627 		return -ENODEV;
628 
629 	if (event->attr.type != event->pmu->type)
630 		return -ENOENT;
631 
632 	/* unsupported modes and filters */
633 	if (event->attr.sample_period) /* no sampling */
634 		return -EINVAL;
635 
636 	if (has_branch_stack(event))
637 		return -EOPNOTSUPP;
638 
639 	if (event->cpu < 0)
640 		return -EINVAL;
641 
642 	if (is_engine_event(event))
643 		ret = engine_event_init(event);
644 	else
645 		ret = config_status(i915, event->attr.config);
646 	if (ret)
647 		return ret;
648 
649 	if (!event->parent) {
650 		drm_dev_get(&i915->drm);
651 		event->destroy = i915_pmu_event_destroy;
652 	}
653 
654 	return 0;
655 }
656 
__i915_pmu_event_read(struct perf_event * event)657 static u64 __i915_pmu_event_read(struct perf_event *event)
658 {
659 	struct i915_pmu *pmu = event_to_pmu(event);
660 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
661 	u64 val = 0;
662 
663 	if (is_engine_event(event)) {
664 		u8 sample = engine_event_sample(event);
665 		struct intel_engine_cs *engine;
666 
667 		engine = intel_engine_lookup_user(i915,
668 						  engine_event_class(event),
669 						  engine_event_instance(event));
670 
671 		if (drm_WARN_ON_ONCE(&i915->drm, !engine)) {
672 			/* Do nothing */
673 		} else if (sample == I915_SAMPLE_BUSY &&
674 			   intel_engine_supports_stats(engine)) {
675 			ktime_t unused;
676 
677 			val = ktime_to_ns(intel_engine_get_busy_time(engine,
678 								     &unused));
679 		} else {
680 			val = engine->pmu.sample[sample].cur;
681 		}
682 	} else {
683 		const unsigned int gt_id = config_gt_id(event->attr.config);
684 		const u64 config = config_counter(event->attr.config);
685 
686 		switch (config) {
687 		case I915_PMU_ACTUAL_FREQUENCY:
688 			val =
689 			   div_u64(read_sample(pmu, gt_id,
690 					       __I915_SAMPLE_FREQ_ACT),
691 				   USEC_PER_SEC /* to MHz */);
692 			break;
693 		case I915_PMU_REQUESTED_FREQUENCY:
694 			val =
695 			   div_u64(read_sample(pmu, gt_id,
696 					       __I915_SAMPLE_FREQ_REQ),
697 				   USEC_PER_SEC /* to MHz */);
698 			break;
699 		case I915_PMU_INTERRUPTS:
700 			val = READ_ONCE(pmu->irq_count);
701 			break;
702 		case I915_PMU_RC6_RESIDENCY:
703 			val = get_rc6(i915->gt[gt_id]);
704 			break;
705 		case I915_PMU_SOFTWARE_GT_AWAKE_TIME:
706 			val = ktime_to_ns(intel_gt_get_awake_time(to_gt(i915)));
707 			break;
708 		}
709 	}
710 
711 	return val;
712 }
713 
i915_pmu_event_read(struct perf_event * event)714 static void i915_pmu_event_read(struct perf_event *event)
715 {
716 	struct i915_pmu *pmu = event_to_pmu(event);
717 	struct hw_perf_event *hwc = &event->hw;
718 	u64 prev, new;
719 
720 	if (!pmu->registered) {
721 		event->hw.state = PERF_HES_STOPPED;
722 		return;
723 	}
724 
725 	prev = local64_read(&hwc->prev_count);
726 	do {
727 		new = __i915_pmu_event_read(event);
728 	} while (!local64_try_cmpxchg(&hwc->prev_count, &prev, new));
729 
730 	local64_add(new - prev, &event->count);
731 }
732 
i915_pmu_enable(struct perf_event * event)733 static void i915_pmu_enable(struct perf_event *event)
734 {
735 	struct i915_pmu *pmu = event_to_pmu(event);
736 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
737 	const unsigned int bit = event_bit(event);
738 	unsigned long flags;
739 
740 	if (bit == -1)
741 		goto update;
742 
743 	spin_lock_irqsave(&pmu->lock, flags);
744 
745 	/*
746 	 * Update the bitmask of enabled events and increment
747 	 * the event reference counter.
748 	 */
749 	BUILD_BUG_ON(ARRAY_SIZE(pmu->enable_count) != I915_PMU_MASK_BITS);
750 	GEM_BUG_ON(bit >= ARRAY_SIZE(pmu->enable_count));
751 	GEM_BUG_ON(pmu->enable_count[bit] == ~0);
752 
753 	pmu->enable |= BIT(bit);
754 	pmu->enable_count[bit]++;
755 
756 	/*
757 	 * Start the sampling timer if needed and not already enabled.
758 	 */
759 	__i915_pmu_maybe_start_timer(pmu);
760 
761 	/*
762 	 * For per-engine events the bitmask and reference counting
763 	 * is stored per engine.
764 	 */
765 	if (is_engine_event(event)) {
766 		u8 sample = engine_event_sample(event);
767 		struct intel_engine_cs *engine;
768 
769 		engine = intel_engine_lookup_user(i915,
770 						  engine_event_class(event),
771 						  engine_event_instance(event));
772 
773 		BUILD_BUG_ON(ARRAY_SIZE(engine->pmu.enable_count) !=
774 			     I915_ENGINE_SAMPLE_COUNT);
775 		BUILD_BUG_ON(ARRAY_SIZE(engine->pmu.sample) !=
776 			     I915_ENGINE_SAMPLE_COUNT);
777 		GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.enable_count));
778 		GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.sample));
779 		GEM_BUG_ON(engine->pmu.enable_count[sample] == ~0);
780 
781 		engine->pmu.enable |= BIT(sample);
782 		engine->pmu.enable_count[sample]++;
783 	}
784 
785 	spin_unlock_irqrestore(&pmu->lock, flags);
786 
787 update:
788 	/*
789 	 * Store the current counter value so we can report the correct delta
790 	 * for all listeners. Even when the event was already enabled and has
791 	 * an existing non-zero value.
792 	 */
793 	local64_set(&event->hw.prev_count, __i915_pmu_event_read(event));
794 }
795 
i915_pmu_disable(struct perf_event * event)796 static void i915_pmu_disable(struct perf_event *event)
797 {
798 	struct i915_pmu *pmu = event_to_pmu(event);
799 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
800 	const unsigned int bit = event_bit(event);
801 	unsigned long flags;
802 
803 	if (bit == -1)
804 		return;
805 
806 	spin_lock_irqsave(&pmu->lock, flags);
807 
808 	if (is_engine_event(event)) {
809 		u8 sample = engine_event_sample(event);
810 		struct intel_engine_cs *engine;
811 
812 		engine = intel_engine_lookup_user(i915,
813 						  engine_event_class(event),
814 						  engine_event_instance(event));
815 
816 		GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.enable_count));
817 		GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.sample));
818 		GEM_BUG_ON(engine->pmu.enable_count[sample] == 0);
819 
820 		/*
821 		 * Decrement the reference count and clear the enabled
822 		 * bitmask when the last listener on an event goes away.
823 		 */
824 		if (--engine->pmu.enable_count[sample] == 0)
825 			engine->pmu.enable &= ~BIT(sample);
826 	}
827 
828 	GEM_BUG_ON(bit >= ARRAY_SIZE(pmu->enable_count));
829 	GEM_BUG_ON(pmu->enable_count[bit] == 0);
830 	/*
831 	 * Decrement the reference count and clear the enabled
832 	 * bitmask when the last listener on an event goes away.
833 	 */
834 	if (--pmu->enable_count[bit] == 0) {
835 		pmu->enable &= ~BIT(bit);
836 		pmu->timer_enabled &= pmu_needs_timer(pmu);
837 	}
838 
839 	spin_unlock_irqrestore(&pmu->lock, flags);
840 }
841 
i915_pmu_event_start(struct perf_event * event,int flags)842 static void i915_pmu_event_start(struct perf_event *event, int flags)
843 {
844 	struct i915_pmu *pmu = event_to_pmu(event);
845 
846 	if (!pmu->registered)
847 		return;
848 
849 	i915_pmu_enable(event);
850 	event->hw.state = 0;
851 }
852 
i915_pmu_event_stop(struct perf_event * event,int flags)853 static void i915_pmu_event_stop(struct perf_event *event, int flags)
854 {
855 	struct i915_pmu *pmu = event_to_pmu(event);
856 
857 	if (!pmu->registered)
858 		goto out;
859 
860 	if (flags & PERF_EF_UPDATE)
861 		i915_pmu_event_read(event);
862 
863 	i915_pmu_disable(event);
864 
865 out:
866 	event->hw.state = PERF_HES_STOPPED;
867 }
868 
i915_pmu_event_add(struct perf_event * event,int flags)869 static int i915_pmu_event_add(struct perf_event *event, int flags)
870 {
871 	struct i915_pmu *pmu = event_to_pmu(event);
872 
873 	if (!pmu->registered)
874 		return -ENODEV;
875 
876 	if (flags & PERF_EF_START)
877 		i915_pmu_event_start(event, flags);
878 
879 	return 0;
880 }
881 
i915_pmu_event_del(struct perf_event * event,int flags)882 static void i915_pmu_event_del(struct perf_event *event, int flags)
883 {
884 	i915_pmu_event_stop(event, PERF_EF_UPDATE);
885 }
886 
887 struct i915_str_attribute {
888 	struct device_attribute attr;
889 	const char *str;
890 };
891 
i915_pmu_format_show(struct device * dev,struct device_attribute * attr,char * buf)892 static ssize_t i915_pmu_format_show(struct device *dev,
893 				    struct device_attribute *attr, char *buf)
894 {
895 	struct i915_str_attribute *eattr;
896 
897 	eattr = container_of(attr, struct i915_str_attribute, attr);
898 	return sprintf(buf, "%s\n", eattr->str);
899 }
900 
901 #define I915_PMU_FORMAT_ATTR(_name, _config) \
902 	(&((struct i915_str_attribute[]) { \
903 		{ .attr = __ATTR(_name, 0444, i915_pmu_format_show, NULL), \
904 		  .str = _config, } \
905 	})[0].attr.attr)
906 
907 static struct attribute *i915_pmu_format_attrs[] = {
908 	I915_PMU_FORMAT_ATTR(i915_eventid, "config:0-20"),
909 	NULL,
910 };
911 
912 static const struct attribute_group i915_pmu_format_attr_group = {
913 	.name = "format",
914 	.attrs = i915_pmu_format_attrs,
915 };
916 
917 struct i915_ext_attribute {
918 	struct device_attribute attr;
919 	unsigned long val;
920 };
921 
i915_pmu_event_show(struct device * dev,struct device_attribute * attr,char * buf)922 static ssize_t i915_pmu_event_show(struct device *dev,
923 				   struct device_attribute *attr, char *buf)
924 {
925 	struct i915_ext_attribute *eattr;
926 
927 	eattr = container_of(attr, struct i915_ext_attribute, attr);
928 	return sprintf(buf, "config=0x%lx\n", eattr->val);
929 }
930 
931 #define __event(__counter, __name, __unit) \
932 { \
933 	.counter = (__counter), \
934 	.name = (__name), \
935 	.unit = (__unit), \
936 	.global = false, \
937 }
938 
939 #define __global_event(__counter, __name, __unit) \
940 { \
941 	.counter = (__counter), \
942 	.name = (__name), \
943 	.unit = (__unit), \
944 	.global = true, \
945 }
946 
947 #define __engine_event(__sample, __name) \
948 { \
949 	.sample = (__sample), \
950 	.name = (__name), \
951 }
952 
953 static struct i915_ext_attribute *
add_i915_attr(struct i915_ext_attribute * attr,const char * name,u64 config)954 add_i915_attr(struct i915_ext_attribute *attr, const char *name, u64 config)
955 {
956 	sysfs_attr_init(&attr->attr.attr);
957 	attr->attr.attr.name = name;
958 	attr->attr.attr.mode = 0444;
959 	attr->attr.show = i915_pmu_event_show;
960 	attr->val = config;
961 
962 	return ++attr;
963 }
964 
965 static struct perf_pmu_events_attr *
add_pmu_attr(struct perf_pmu_events_attr * attr,const char * name,const char * str)966 add_pmu_attr(struct perf_pmu_events_attr *attr, const char *name,
967 	     const char *str)
968 {
969 	sysfs_attr_init(&attr->attr.attr);
970 	attr->attr.attr.name = name;
971 	attr->attr.attr.mode = 0444;
972 	attr->attr.show = perf_event_sysfs_show;
973 	attr->event_str = str;
974 
975 	return ++attr;
976 }
977 
978 static struct attribute **
create_event_attributes(struct i915_pmu * pmu)979 create_event_attributes(struct i915_pmu *pmu)
980 {
981 	struct drm_i915_private *i915 = pmu_to_i915(pmu);
982 	static const struct {
983 		unsigned int counter;
984 		const char *name;
985 		const char *unit;
986 		bool global;
987 	} events[] = {
988 		__event(0, "actual-frequency", "M"),
989 		__event(1, "requested-frequency", "M"),
990 		__global_event(2, "interrupts", NULL),
991 		__event(3, "rc6-residency", "ns"),
992 		__event(4, "software-gt-awake-time", "ns"),
993 	};
994 	static const struct {
995 		enum drm_i915_pmu_engine_sample sample;
996 		char *name;
997 	} engine_events[] = {
998 		__engine_event(I915_SAMPLE_BUSY, "busy"),
999 		__engine_event(I915_SAMPLE_SEMA, "sema"),
1000 		__engine_event(I915_SAMPLE_WAIT, "wait"),
1001 	};
1002 	unsigned int count = 0;
1003 	struct perf_pmu_events_attr *pmu_attr = NULL, *pmu_iter;
1004 	struct i915_ext_attribute *i915_attr = NULL, *i915_iter;
1005 	struct attribute **attr = NULL, **attr_iter;
1006 	struct intel_engine_cs *engine;
1007 	struct intel_gt *gt;
1008 	unsigned int i, j;
1009 
1010 	/* Count how many counters we will be exposing. */
1011 	for_each_gt(gt, i915, j) {
1012 		for (i = 0; i < ARRAY_SIZE(events); i++) {
1013 			u64 config = ___I915_PMU_OTHER(j, events[i].counter);
1014 
1015 			if (!config_status(i915, config))
1016 				count++;
1017 		}
1018 	}
1019 
1020 	for_each_uabi_engine(engine, i915) {
1021 		for (i = 0; i < ARRAY_SIZE(engine_events); i++) {
1022 			if (!engine_event_status(engine,
1023 						 engine_events[i].sample))
1024 				count++;
1025 		}
1026 	}
1027 
1028 	/* Allocate attribute objects and table. */
1029 	i915_attr = kcalloc(count, sizeof(*i915_attr), GFP_KERNEL);
1030 	if (!i915_attr)
1031 		goto err_alloc;
1032 
1033 	pmu_attr = kcalloc(count, sizeof(*pmu_attr), GFP_KERNEL);
1034 	if (!pmu_attr)
1035 		goto err_alloc;
1036 
1037 	/* Max one pointer of each attribute type plus a termination entry. */
1038 	attr = kcalloc(count * 2 + 1, sizeof(*attr), GFP_KERNEL);
1039 	if (!attr)
1040 		goto err_alloc;
1041 
1042 	i915_iter = i915_attr;
1043 	pmu_iter = pmu_attr;
1044 	attr_iter = attr;
1045 
1046 	/* Initialize supported non-engine counters. */
1047 	for_each_gt(gt, i915, j) {
1048 		for (i = 0; i < ARRAY_SIZE(events); i++) {
1049 			u64 config = ___I915_PMU_OTHER(j, events[i].counter);
1050 			char *str;
1051 
1052 			if (config_status(i915, config))
1053 				continue;
1054 
1055 			if (events[i].global || !HAS_EXTRA_GT_LIST(i915))
1056 				str = kstrdup(events[i].name, GFP_KERNEL);
1057 			else
1058 				str = kasprintf(GFP_KERNEL, "%s-gt%u",
1059 						events[i].name, j);
1060 			if (!str)
1061 				goto err;
1062 
1063 			*attr_iter++ = &i915_iter->attr.attr;
1064 			i915_iter = add_i915_attr(i915_iter, str, config);
1065 
1066 			if (events[i].unit) {
1067 				if (events[i].global || !HAS_EXTRA_GT_LIST(i915))
1068 					str = kasprintf(GFP_KERNEL, "%s.unit",
1069 							events[i].name);
1070 				else
1071 					str = kasprintf(GFP_KERNEL, "%s-gt%u.unit",
1072 							events[i].name, j);
1073 				if (!str)
1074 					goto err;
1075 
1076 				*attr_iter++ = &pmu_iter->attr.attr;
1077 				pmu_iter = add_pmu_attr(pmu_iter, str,
1078 							events[i].unit);
1079 			}
1080 		}
1081 	}
1082 
1083 	/* Initialize supported engine counters. */
1084 	for_each_uabi_engine(engine, i915) {
1085 		for (i = 0; i < ARRAY_SIZE(engine_events); i++) {
1086 			char *str;
1087 
1088 			if (engine_event_status(engine,
1089 						engine_events[i].sample))
1090 				continue;
1091 
1092 			str = kasprintf(GFP_KERNEL, "%s-%s",
1093 					engine->name, engine_events[i].name);
1094 			if (!str)
1095 				goto err;
1096 
1097 			*attr_iter++ = &i915_iter->attr.attr;
1098 			i915_iter =
1099 				add_i915_attr(i915_iter, str,
1100 					      __I915_PMU_ENGINE(engine->uabi_class,
1101 								engine->uabi_instance,
1102 								engine_events[i].sample));
1103 
1104 			str = kasprintf(GFP_KERNEL, "%s-%s.unit",
1105 					engine->name, engine_events[i].name);
1106 			if (!str)
1107 				goto err;
1108 
1109 			*attr_iter++ = &pmu_iter->attr.attr;
1110 			pmu_iter = add_pmu_attr(pmu_iter, str, "ns");
1111 		}
1112 	}
1113 
1114 	pmu->i915_attr = i915_attr;
1115 	pmu->pmu_attr = pmu_attr;
1116 
1117 	return attr;
1118 
1119 err:;
1120 	for (attr_iter = attr; *attr_iter; attr_iter++)
1121 		kfree((*attr_iter)->name);
1122 
1123 err_alloc:
1124 	kfree(attr);
1125 	kfree(i915_attr);
1126 	kfree(pmu_attr);
1127 
1128 	return NULL;
1129 }
1130 
free_event_attributes(struct i915_pmu * pmu)1131 static void free_event_attributes(struct i915_pmu *pmu)
1132 {
1133 	struct attribute **attr_iter = pmu->events_attr_group.attrs;
1134 
1135 	for (; *attr_iter; attr_iter++)
1136 		kfree((*attr_iter)->name);
1137 
1138 	kfree(pmu->events_attr_group.attrs);
1139 	kfree(pmu->i915_attr);
1140 	kfree(pmu->pmu_attr);
1141 
1142 	pmu->events_attr_group.attrs = NULL;
1143 	pmu->i915_attr = NULL;
1144 	pmu->pmu_attr = NULL;
1145 }
1146 
i915_pmu_register(struct drm_i915_private * i915)1147 void i915_pmu_register(struct drm_i915_private *i915)
1148 {
1149 	struct i915_pmu *pmu = &i915->pmu;
1150 	const struct attribute_group *attr_groups[] = {
1151 		&i915_pmu_format_attr_group,
1152 		&pmu->events_attr_group,
1153 		NULL
1154 	};
1155 	int ret = -ENOMEM;
1156 
1157 	spin_lock_init(&pmu->lock);
1158 	hrtimer_setup(&pmu->timer, i915_sample, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1159 	init_rc6(pmu);
1160 
1161 	if (IS_DGFX(i915)) {
1162 		pmu->name = kasprintf(GFP_KERNEL,
1163 				      "i915_%s",
1164 				      dev_name(i915->drm.dev));
1165 		if (pmu->name) {
1166 			/* tools/perf reserves colons as special. */
1167 			strreplace((char *)pmu->name, ':', '_');
1168 		}
1169 	} else {
1170 		pmu->name = "i915";
1171 	}
1172 	if (!pmu->name)
1173 		goto err;
1174 
1175 	pmu->events_attr_group.name = "events";
1176 	pmu->events_attr_group.attrs = create_event_attributes(pmu);
1177 	if (!pmu->events_attr_group.attrs)
1178 		goto err_name;
1179 
1180 	pmu->base.attr_groups = kmemdup(attr_groups, sizeof(attr_groups),
1181 					GFP_KERNEL);
1182 	if (!pmu->base.attr_groups)
1183 		goto err_attr;
1184 
1185 	pmu->base.module	= THIS_MODULE;
1186 	pmu->base.task_ctx_nr	= perf_invalid_context;
1187 	pmu->base.scope		= PERF_PMU_SCOPE_SYS_WIDE;
1188 	pmu->base.event_init	= i915_pmu_event_init;
1189 	pmu->base.add		= i915_pmu_event_add;
1190 	pmu->base.del		= i915_pmu_event_del;
1191 	pmu->base.start		= i915_pmu_event_start;
1192 	pmu->base.stop		= i915_pmu_event_stop;
1193 	pmu->base.read		= i915_pmu_event_read;
1194 
1195 	ret = perf_pmu_register(&pmu->base, pmu->name, -1);
1196 	if (ret)
1197 		goto err_groups;
1198 
1199 	pmu->registered = true;
1200 
1201 	return;
1202 
1203 err_groups:
1204 	kfree(pmu->base.attr_groups);
1205 err_attr:
1206 	free_event_attributes(pmu);
1207 err_name:
1208 	if (IS_DGFX(i915))
1209 		kfree(pmu->name);
1210 err:
1211 	drm_notice(&i915->drm, "Failed to register PMU!\n");
1212 }
1213 
i915_pmu_unregister(struct drm_i915_private * i915)1214 void i915_pmu_unregister(struct drm_i915_private *i915)
1215 {
1216 	struct i915_pmu *pmu = &i915->pmu;
1217 
1218 	if (!pmu->registered)
1219 		return;
1220 
1221 	/* Disconnect the PMU callbacks */
1222 	pmu->registered = false;
1223 
1224 	hrtimer_cancel(&pmu->timer);
1225 
1226 	perf_pmu_unregister(&pmu->base);
1227 	kfree(pmu->base.attr_groups);
1228 	if (IS_DGFX(i915))
1229 		kfree(pmu->name);
1230 	free_event_attributes(pmu);
1231 }
1232