Lines Matching refs:pmu
36 return container_of(event->pmu, struct i915_pmu, base); in event_to_pmu()
39 static struct drm_i915_private *pmu_to_i915(struct i915_pmu *pmu) in pmu_to_i915() argument
41 return container_of(pmu, struct drm_i915_private, pmu); in pmu_to_i915()
152 static bool pmu_needs_timer(struct i915_pmu *pmu) in pmu_needs_timer() argument
154 struct drm_i915_private *i915 = pmu_to_i915(pmu); in pmu_needs_timer()
162 enable = pmu->enable; in pmu_needs_timer()
204 static u64 read_sample(struct i915_pmu *pmu, unsigned int gt_id, int sample) in read_sample() argument
206 return pmu->sample[gt_id][sample].cur; in read_sample()
210 store_sample(struct i915_pmu *pmu, unsigned int gt_id, int sample, u64 val) in store_sample() argument
212 pmu->sample[gt_id][sample].cur = val; in store_sample()
216 add_sample_mult(struct i915_pmu *pmu, unsigned int gt_id, int sample, u32 val, u32 mul) in add_sample_mult() argument
218 pmu->sample[gt_id][sample].cur += mul_u32_u32(val, mul); in add_sample_mult()
225 struct i915_pmu *pmu = &i915->pmu; in get_rc6() local
236 spin_lock_irqsave(&pmu->lock, flags); in get_rc6()
239 store_sample(pmu, gt_id, __I915_SAMPLE_RC6, val); in get_rc6()
248 val = ktime_since_raw(pmu->sleep_last[gt_id]); in get_rc6()
249 val += read_sample(pmu, gt_id, __I915_SAMPLE_RC6); in get_rc6()
252 if (val < read_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED)) in get_rc6()
253 val = read_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED); in get_rc6()
255 store_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED, val); in get_rc6()
257 spin_unlock_irqrestore(&pmu->lock, flags); in get_rc6()
262 static void init_rc6(struct i915_pmu *pmu) in init_rc6() argument
264 struct drm_i915_private *i915 = pmu_to_i915(pmu); in init_rc6()
274 store_sample(pmu, i, __I915_SAMPLE_RC6, val); in init_rc6()
275 store_sample(pmu, i, __I915_SAMPLE_RC6_LAST_REPORTED, in init_rc6()
277 pmu->sleep_last[i] = ktime_get_raw(); in init_rc6()
284 struct i915_pmu *pmu = >->i915->pmu; in park_rc6() local
286 store_sample(pmu, gt->info.id, __I915_SAMPLE_RC6, __get_rc6(gt)); in park_rc6()
287 pmu->sleep_last[gt->info.id] = ktime_get_raw(); in park_rc6()
290 static void __i915_pmu_maybe_start_timer(struct i915_pmu *pmu) in __i915_pmu_maybe_start_timer() argument
292 if (!pmu->timer_enabled && pmu_needs_timer(pmu)) { in __i915_pmu_maybe_start_timer()
293 pmu->timer_enabled = true; in __i915_pmu_maybe_start_timer()
294 pmu->timer_last = ktime_get(); in __i915_pmu_maybe_start_timer()
295 hrtimer_start_range_ns(&pmu->timer, in __i915_pmu_maybe_start_timer()
303 struct i915_pmu *pmu = >->i915->pmu; in i915_pmu_gt_parked() local
305 if (!pmu->registered) in i915_pmu_gt_parked()
308 spin_lock_irq(&pmu->lock); in i915_pmu_gt_parked()
316 pmu->unparked &= ~BIT(gt->info.id); in i915_pmu_gt_parked()
317 if (pmu->unparked == 0) in i915_pmu_gt_parked()
318 pmu->timer_enabled = false; in i915_pmu_gt_parked()
320 spin_unlock_irq(&pmu->lock); in i915_pmu_gt_parked()
325 struct i915_pmu *pmu = >->i915->pmu; in i915_pmu_gt_unparked() local
327 if (!pmu->registered) in i915_pmu_gt_unparked()
330 spin_lock_irq(&pmu->lock); in i915_pmu_gt_unparked()
335 if (pmu->unparked == 0) in i915_pmu_gt_unparked()
336 __i915_pmu_maybe_start_timer(pmu); in i915_pmu_gt_unparked()
338 pmu->unparked |= BIT(gt->info.id); in i915_pmu_gt_unparked()
340 spin_unlock_irq(&pmu->lock); in i915_pmu_gt_unparked()
361 struct intel_engine_pmu *pmu = &engine->pmu; in gen3_engine_sample() local
370 add_sample(&pmu->sample[I915_SAMPLE_WAIT], period_ns); in gen3_engine_sample()
372 add_sample(&pmu->sample[I915_SAMPLE_SEMA], period_ns); in gen3_engine_sample()
391 add_sample(&pmu->sample[I915_SAMPLE_BUSY], period_ns); in gen3_engine_sample()
396 struct intel_engine_pmu *pmu = &engine->pmu; in gen2_engine_sample() local
404 add_sample(&pmu->sample[I915_SAMPLE_WAIT], period_ns); in gen2_engine_sample()
408 add_sample(&pmu->sample[I915_SAMPLE_BUSY], period_ns); in gen2_engine_sample()
427 if ((i915->pmu.enable & ENGINE_SAMPLE_MASK) == 0) in engines_sample()
434 if (!engine->pmu.enable) in engines_sample()
453 frequency_sampling_enabled(struct i915_pmu *pmu, unsigned int gt) in frequency_sampling_enabled() argument
455 return pmu->enable & in frequency_sampling_enabled()
465 struct i915_pmu *pmu = &i915->pmu; in frequency_sample() local
469 if (!frequency_sampling_enabled(pmu, gt_id)) in frequency_sample()
477 if (pmu->enable & config_mask(__I915_PMU_ACTUAL_FREQUENCY(gt_id))) { in frequency_sample()
493 add_sample_mult(pmu, gt_id, __I915_SAMPLE_FREQ_ACT, in frequency_sample()
497 if (pmu->enable & config_mask(__I915_PMU_REQUESTED_FREQUENCY(gt_id))) { in frequency_sample()
498 add_sample_mult(pmu, gt_id, __I915_SAMPLE_FREQ_REQ, in frequency_sample()
508 struct i915_pmu *pmu = container_of(hrtimer, struct i915_pmu, timer); in i915_sample() local
509 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_sample()
515 if (!READ_ONCE(pmu->timer_enabled)) in i915_sample()
519 period_ns = ktime_to_ns(ktime_sub(now, pmu->timer_last)); in i915_sample()
520 pmu->timer_last = now; in i915_sample()
530 if (!(pmu->unparked & BIT(i))) in i915_sample()
544 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_destroy() local
545 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_pmu_event_destroy()
611 struct i915_pmu *pmu = event_to_pmu(event); in engine_event_init() local
612 struct drm_i915_private *i915 = pmu_to_i915(pmu); in engine_event_init()
625 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_init() local
626 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_pmu_event_init()
629 if (!pmu->registered) in i915_pmu_event_init()
632 if (event->attr.type != event->pmu->type) in i915_pmu_event_init()
666 struct i915_pmu *pmu = event_to_pmu(event); in __i915_pmu_event_read() local
667 struct drm_i915_private *i915 = pmu_to_i915(pmu); in __i915_pmu_event_read()
687 val = engine->pmu.sample[sample].cur; in __i915_pmu_event_read()
696 div_u64(read_sample(pmu, gt_id, in __i915_pmu_event_read()
702 div_u64(read_sample(pmu, gt_id, in __i915_pmu_event_read()
707 val = READ_ONCE(pmu->irq_count); in __i915_pmu_event_read()
723 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_read() local
727 if (!pmu->registered) { in i915_pmu_event_read()
742 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_enable() local
743 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_pmu_enable()
750 spin_lock_irqsave(&pmu->lock, flags); in i915_pmu_enable()
756 BUILD_BUG_ON(ARRAY_SIZE(pmu->enable_count) != I915_PMU_MASK_BITS); in i915_pmu_enable()
757 GEM_BUG_ON(bit >= ARRAY_SIZE(pmu->enable_count)); in i915_pmu_enable()
758 GEM_BUG_ON(pmu->enable_count[bit] == ~0); in i915_pmu_enable()
760 pmu->enable |= BIT(bit); in i915_pmu_enable()
761 pmu->enable_count[bit]++; in i915_pmu_enable()
766 __i915_pmu_maybe_start_timer(pmu); in i915_pmu_enable()
780 BUILD_BUG_ON(ARRAY_SIZE(engine->pmu.enable_count) != in i915_pmu_enable()
782 BUILD_BUG_ON(ARRAY_SIZE(engine->pmu.sample) != in i915_pmu_enable()
784 GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.enable_count)); in i915_pmu_enable()
785 GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.sample)); in i915_pmu_enable()
786 GEM_BUG_ON(engine->pmu.enable_count[sample] == ~0); in i915_pmu_enable()
788 engine->pmu.enable |= BIT(sample); in i915_pmu_enable()
789 engine->pmu.enable_count[sample]++; in i915_pmu_enable()
792 spin_unlock_irqrestore(&pmu->lock, flags); in i915_pmu_enable()
805 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_disable() local
806 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_pmu_disable()
813 spin_lock_irqsave(&pmu->lock, flags); in i915_pmu_disable()
823 GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.enable_count)); in i915_pmu_disable()
824 GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.sample)); in i915_pmu_disable()
825 GEM_BUG_ON(engine->pmu.enable_count[sample] == 0); in i915_pmu_disable()
831 if (--engine->pmu.enable_count[sample] == 0) in i915_pmu_disable()
832 engine->pmu.enable &= ~BIT(sample); in i915_pmu_disable()
835 GEM_BUG_ON(bit >= ARRAY_SIZE(pmu->enable_count)); in i915_pmu_disable()
836 GEM_BUG_ON(pmu->enable_count[bit] == 0); in i915_pmu_disable()
841 if (--pmu->enable_count[bit] == 0) { in i915_pmu_disable()
842 pmu->enable &= ~BIT(bit); in i915_pmu_disable()
843 pmu->timer_enabled &= pmu_needs_timer(pmu); in i915_pmu_disable()
846 spin_unlock_irqrestore(&pmu->lock, flags); in i915_pmu_disable()
851 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_start() local
853 if (!pmu->registered) in i915_pmu_event_start()
862 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_stop() local
864 if (!pmu->registered) in i915_pmu_event_stop()
878 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_add() local
880 if (!pmu->registered) in i915_pmu_event_add()
1008 create_event_attributes(struct i915_pmu *pmu) in create_event_attributes() argument
1010 struct drm_i915_private *i915 = pmu_to_i915(pmu); in create_event_attributes()
1143 pmu->i915_attr = i915_attr; in create_event_attributes()
1144 pmu->pmu_attr = pmu_attr; in create_event_attributes()
1160 static void free_event_attributes(struct i915_pmu *pmu) in free_event_attributes() argument
1162 struct attribute **attr_iter = pmu->events_attr_group.attrs; in free_event_attributes()
1167 kfree(pmu->events_attr_group.attrs); in free_event_attributes()
1168 kfree(pmu->i915_attr); in free_event_attributes()
1169 kfree(pmu->pmu_attr); in free_event_attributes()
1171 pmu->events_attr_group.attrs = NULL; in free_event_attributes()
1172 pmu->i915_attr = NULL; in free_event_attributes()
1173 pmu->pmu_attr = NULL; in free_event_attributes()
1178 struct i915_pmu *pmu = hlist_entry_safe(node, typeof(*pmu), cpuhp.node); in i915_pmu_cpu_online() local
1189 struct i915_pmu *pmu = hlist_entry_safe(node, typeof(*pmu), cpuhp.node); in i915_pmu_cpu_offline() local
1196 if (!pmu->registered) in i915_pmu_cpu_offline()
1209 if (target < nr_cpu_ids && target != pmu->cpuhp.cpu) { in i915_pmu_cpu_offline()
1210 perf_pmu_migrate_context(&pmu->base, cpu, target); in i915_pmu_cpu_offline()
1211 pmu->cpuhp.cpu = target; in i915_pmu_cpu_offline()
1242 static int i915_pmu_register_cpuhp_state(struct i915_pmu *pmu) in i915_pmu_register_cpuhp_state() argument
1247 return cpuhp_state_add_instance(cpuhp_state, &pmu->cpuhp.node); in i915_pmu_register_cpuhp_state()
1250 static void i915_pmu_unregister_cpuhp_state(struct i915_pmu *pmu) in i915_pmu_unregister_cpuhp_state() argument
1252 cpuhp_state_remove_instance(cpuhp_state, &pmu->cpuhp.node); in i915_pmu_unregister_cpuhp_state()
1257 struct i915_pmu *pmu = &i915->pmu; in i915_pmu_register() local
1260 &pmu->events_attr_group, in i915_pmu_register()
1266 spin_lock_init(&pmu->lock); in i915_pmu_register()
1267 hrtimer_init(&pmu->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in i915_pmu_register()
1268 pmu->timer.function = i915_sample; in i915_pmu_register()
1269 pmu->cpuhp.cpu = -1; in i915_pmu_register()
1270 init_rc6(pmu); in i915_pmu_register()
1273 pmu->name = kasprintf(GFP_KERNEL, in i915_pmu_register()
1276 if (pmu->name) { in i915_pmu_register()
1278 strreplace((char *)pmu->name, ':', '_'); in i915_pmu_register()
1281 pmu->name = "i915"; in i915_pmu_register()
1283 if (!pmu->name) in i915_pmu_register()
1286 pmu->events_attr_group.name = "events"; in i915_pmu_register()
1287 pmu->events_attr_group.attrs = create_event_attributes(pmu); in i915_pmu_register()
1288 if (!pmu->events_attr_group.attrs) in i915_pmu_register()
1291 pmu->base.attr_groups = kmemdup(attr_groups, sizeof(attr_groups), in i915_pmu_register()
1293 if (!pmu->base.attr_groups) in i915_pmu_register()
1296 pmu->base.module = THIS_MODULE; in i915_pmu_register()
1297 pmu->base.task_ctx_nr = perf_invalid_context; in i915_pmu_register()
1298 pmu->base.event_init = i915_pmu_event_init; in i915_pmu_register()
1299 pmu->base.add = i915_pmu_event_add; in i915_pmu_register()
1300 pmu->base.del = i915_pmu_event_del; in i915_pmu_register()
1301 pmu->base.start = i915_pmu_event_start; in i915_pmu_register()
1302 pmu->base.stop = i915_pmu_event_stop; in i915_pmu_register()
1303 pmu->base.read = i915_pmu_event_read; in i915_pmu_register()
1304 pmu->base.event_idx = i915_pmu_event_event_idx; in i915_pmu_register()
1306 ret = perf_pmu_register(&pmu->base, pmu->name, -1); in i915_pmu_register()
1310 ret = i915_pmu_register_cpuhp_state(pmu); in i915_pmu_register()
1314 pmu->registered = true; in i915_pmu_register()
1319 perf_pmu_unregister(&pmu->base); in i915_pmu_register()
1321 kfree(pmu->base.attr_groups); in i915_pmu_register()
1323 free_event_attributes(pmu); in i915_pmu_register()
1326 kfree(pmu->name); in i915_pmu_register()
1333 struct i915_pmu *pmu = &i915->pmu; in i915_pmu_unregister() local
1335 if (!pmu->registered) in i915_pmu_unregister()
1339 pmu->registered = false; in i915_pmu_unregister()
1341 hrtimer_cancel(&pmu->timer); in i915_pmu_unregister()
1343 i915_pmu_unregister_cpuhp_state(pmu); in i915_pmu_unregister()
1345 perf_pmu_unregister(&pmu->base); in i915_pmu_unregister()
1346 kfree(pmu->base.attr_groups); in i915_pmu_unregister()
1348 kfree(pmu->name); in i915_pmu_unregister()
1349 free_event_attributes(pmu); in i915_pmu_unregister()