Lines Matching full:pmu

33 	return container_of(event->pmu, struct i915_pmu, base);  in event_to_pmu()
36 static struct drm_i915_private *pmu_to_i915(struct i915_pmu *pmu) in pmu_to_i915() argument
38 return container_of(pmu, struct drm_i915_private, pmu); in pmu_to_i915()
149 static bool pmu_needs_timer(struct i915_pmu *pmu) in pmu_needs_timer() argument
151 struct drm_i915_private *i915 = pmu_to_i915(pmu); in pmu_needs_timer()
159 enable = pmu->enable; in pmu_needs_timer()
201 static u64 read_sample(struct i915_pmu *pmu, unsigned int gt_id, int sample) in read_sample() argument
203 return pmu->sample[gt_id][sample].cur; in read_sample()
207 store_sample(struct i915_pmu *pmu, unsigned int gt_id, int sample, u64 val) in store_sample() argument
209 pmu->sample[gt_id][sample].cur = val; in store_sample()
213 add_sample_mult(struct i915_pmu *pmu, unsigned int gt_id, int sample, u32 val, u32 mul) in add_sample_mult() argument
215 pmu->sample[gt_id][sample].cur += mul_u32_u32(val, mul); in add_sample_mult()
222 struct i915_pmu *pmu = &i915->pmu; in get_rc6() local
233 spin_lock_irqsave(&pmu->lock, flags); in get_rc6()
236 store_sample(pmu, gt_id, __I915_SAMPLE_RC6, val); in get_rc6()
245 val = ktime_since_raw(pmu->sleep_last[gt_id]); in get_rc6()
246 val += read_sample(pmu, gt_id, __I915_SAMPLE_RC6); in get_rc6()
249 if (val < read_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED)) in get_rc6()
250 val = read_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED); in get_rc6()
252 store_sample(pmu, gt_id, __I915_SAMPLE_RC6_LAST_REPORTED, val); in get_rc6()
254 spin_unlock_irqrestore(&pmu->lock, flags); in get_rc6()
259 static void init_rc6(struct i915_pmu *pmu) in init_rc6() argument
261 struct drm_i915_private *i915 = pmu_to_i915(pmu); in init_rc6()
271 store_sample(pmu, i, __I915_SAMPLE_RC6, val); in init_rc6()
272 store_sample(pmu, i, __I915_SAMPLE_RC6_LAST_REPORTED, in init_rc6()
274 pmu->sleep_last[i] = ktime_get_raw(); in init_rc6()
281 struct i915_pmu *pmu = &gt->i915->pmu; in park_rc6() local
283 store_sample(pmu, gt->info.id, __I915_SAMPLE_RC6, __get_rc6(gt)); in park_rc6()
284 pmu->sleep_last[gt->info.id] = ktime_get_raw(); in park_rc6()
287 static void __i915_pmu_maybe_start_timer(struct i915_pmu *pmu) in __i915_pmu_maybe_start_timer() argument
289 if (!pmu->timer_enabled && pmu_needs_timer(pmu)) { in __i915_pmu_maybe_start_timer()
290 pmu->timer_enabled = true; in __i915_pmu_maybe_start_timer()
291 pmu->timer_last = ktime_get(); in __i915_pmu_maybe_start_timer()
292 hrtimer_start_range_ns(&pmu->timer, in __i915_pmu_maybe_start_timer()
300 struct i915_pmu *pmu = &gt->i915->pmu; in i915_pmu_gt_parked() local
302 if (!pmu->registered) in i915_pmu_gt_parked()
305 spin_lock_irq(&pmu->lock); in i915_pmu_gt_parked()
313 pmu->unparked &= ~BIT(gt->info.id); in i915_pmu_gt_parked()
314 if (pmu->unparked == 0) in i915_pmu_gt_parked()
315 pmu->timer_enabled = false; in i915_pmu_gt_parked()
317 spin_unlock_irq(&pmu->lock); in i915_pmu_gt_parked()
322 struct i915_pmu *pmu = &gt->i915->pmu; in i915_pmu_gt_unparked() local
324 if (!pmu->registered) in i915_pmu_gt_unparked()
327 spin_lock_irq(&pmu->lock); in i915_pmu_gt_unparked()
332 if (pmu->unparked == 0) in i915_pmu_gt_unparked()
333 __i915_pmu_maybe_start_timer(pmu); in i915_pmu_gt_unparked()
335 pmu->unparked |= BIT(gt->info.id); in i915_pmu_gt_unparked()
337 spin_unlock_irq(&pmu->lock); in i915_pmu_gt_unparked()
358 struct intel_engine_pmu *pmu = &engine->pmu; in gen3_engine_sample() local
367 add_sample(&pmu->sample[I915_SAMPLE_WAIT], period_ns); in gen3_engine_sample()
369 add_sample(&pmu->sample[I915_SAMPLE_SEMA], period_ns); in gen3_engine_sample()
388 add_sample(&pmu->sample[I915_SAMPLE_BUSY], period_ns); in gen3_engine_sample()
393 struct intel_engine_pmu *pmu = &engine->pmu; in gen2_engine_sample() local
401 add_sample(&pmu->sample[I915_SAMPLE_WAIT], period_ns); in gen2_engine_sample()
405 add_sample(&pmu->sample[I915_SAMPLE_BUSY], period_ns); in gen2_engine_sample()
424 if ((i915->pmu.enable & ENGINE_SAMPLE_MASK) == 0) in engines_sample()
431 if (!engine->pmu.enable) in engines_sample()
450 frequency_sampling_enabled(struct i915_pmu *pmu, unsigned int gt) in frequency_sampling_enabled() argument
452 return pmu->enable & in frequency_sampling_enabled()
462 struct i915_pmu *pmu = &i915->pmu; in frequency_sample() local
466 if (!frequency_sampling_enabled(pmu, gt_id)) in frequency_sample()
474 if (pmu->enable & config_mask(__I915_PMU_ACTUAL_FREQUENCY(gt_id))) { in frequency_sample()
490 add_sample_mult(pmu, gt_id, __I915_SAMPLE_FREQ_ACT, in frequency_sample()
494 if (pmu->enable & config_mask(__I915_PMU_REQUESTED_FREQUENCY(gt_id))) { in frequency_sample()
495 add_sample_mult(pmu, gt_id, __I915_SAMPLE_FREQ_REQ, in frequency_sample()
505 struct i915_pmu *pmu = container_of(hrtimer, struct i915_pmu, timer); in i915_sample() local
506 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_sample()
512 if (!READ_ONCE(pmu->timer_enabled)) in i915_sample()
516 period_ns = ktime_to_ns(ktime_sub(now, pmu->timer_last)); in i915_sample()
517 pmu->timer_last = now; in i915_sample()
527 if (!(pmu->unparked & BIT(i))) in i915_sample()
541 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_destroy() local
542 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_pmu_event_destroy()
608 struct i915_pmu *pmu = event_to_pmu(event); in engine_event_init() local
609 struct drm_i915_private *i915 = pmu_to_i915(pmu); in engine_event_init()
622 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_init() local
623 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_pmu_event_init()
626 if (!pmu->registered) in i915_pmu_event_init()
629 if (event->attr.type != event->pmu->type) in i915_pmu_event_init()
659 struct i915_pmu *pmu = event_to_pmu(event); in __i915_pmu_event_read() local
660 struct drm_i915_private *i915 = pmu_to_i915(pmu); in __i915_pmu_event_read()
680 val = engine->pmu.sample[sample].cur; in __i915_pmu_event_read()
689 div_u64(read_sample(pmu, gt_id, in __i915_pmu_event_read()
695 div_u64(read_sample(pmu, gt_id, in __i915_pmu_event_read()
700 val = READ_ONCE(pmu->irq_count); in __i915_pmu_event_read()
716 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_read() local
720 if (!pmu->registered) { in i915_pmu_event_read()
735 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_enable() local
736 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_pmu_enable()
743 spin_lock_irqsave(&pmu->lock, flags); in i915_pmu_enable()
749 BUILD_BUG_ON(ARRAY_SIZE(pmu->enable_count) != I915_PMU_MASK_BITS); in i915_pmu_enable()
750 GEM_BUG_ON(bit >= ARRAY_SIZE(pmu->enable_count)); in i915_pmu_enable()
751 GEM_BUG_ON(pmu->enable_count[bit] == ~0); in i915_pmu_enable()
753 pmu->enable |= BIT(bit); in i915_pmu_enable()
754 pmu->enable_count[bit]++; in i915_pmu_enable()
759 __i915_pmu_maybe_start_timer(pmu); in i915_pmu_enable()
773 BUILD_BUG_ON(ARRAY_SIZE(engine->pmu.enable_count) != in i915_pmu_enable()
775 BUILD_BUG_ON(ARRAY_SIZE(engine->pmu.sample) != in i915_pmu_enable()
777 GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.enable_count)); in i915_pmu_enable()
778 GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.sample)); in i915_pmu_enable()
779 GEM_BUG_ON(engine->pmu.enable_count[sample] == ~0); in i915_pmu_enable()
781 engine->pmu.enable |= BIT(sample); in i915_pmu_enable()
782 engine->pmu.enable_count[sample]++; in i915_pmu_enable()
785 spin_unlock_irqrestore(&pmu->lock, flags); in i915_pmu_enable()
798 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_disable() local
799 struct drm_i915_private *i915 = pmu_to_i915(pmu); in i915_pmu_disable()
806 spin_lock_irqsave(&pmu->lock, flags); in i915_pmu_disable()
816 GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.enable_count)); in i915_pmu_disable()
817 GEM_BUG_ON(sample >= ARRAY_SIZE(engine->pmu.sample)); in i915_pmu_disable()
818 GEM_BUG_ON(engine->pmu.enable_count[sample] == 0); in i915_pmu_disable()
824 if (--engine->pmu.enable_count[sample] == 0) in i915_pmu_disable()
825 engine->pmu.enable &= ~BIT(sample); in i915_pmu_disable()
828 GEM_BUG_ON(bit >= ARRAY_SIZE(pmu->enable_count)); in i915_pmu_disable()
829 GEM_BUG_ON(pmu->enable_count[bit] == 0); in i915_pmu_disable()
834 if (--pmu->enable_count[bit] == 0) { in i915_pmu_disable()
835 pmu->enable &= ~BIT(bit); in i915_pmu_disable()
836 pmu->timer_enabled &= pmu_needs_timer(pmu); in i915_pmu_disable()
839 spin_unlock_irqrestore(&pmu->lock, flags); in i915_pmu_disable()
844 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_start() local
846 if (!pmu->registered) in i915_pmu_event_start()
855 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_stop() local
857 if (!pmu->registered) in i915_pmu_event_stop()
871 struct i915_pmu *pmu = event_to_pmu(event); in i915_pmu_event_add() local
873 if (!pmu->registered) in i915_pmu_event_add()
979 create_event_attributes(struct i915_pmu *pmu) in create_event_attributes() argument
981 struct drm_i915_private *i915 = pmu_to_i915(pmu); in create_event_attributes()
1114 pmu->i915_attr = i915_attr; in create_event_attributes()
1115 pmu->pmu_attr = pmu_attr; in create_event_attributes()
1131 static void free_event_attributes(struct i915_pmu *pmu) in free_event_attributes() argument
1133 struct attribute **attr_iter = pmu->events_attr_group.attrs; in free_event_attributes()
1138 kfree(pmu->events_attr_group.attrs); in free_event_attributes()
1139 kfree(pmu->i915_attr); in free_event_attributes()
1140 kfree(pmu->pmu_attr); in free_event_attributes()
1142 pmu->events_attr_group.attrs = NULL; in free_event_attributes()
1143 pmu->i915_attr = NULL; in free_event_attributes()
1144 pmu->pmu_attr = NULL; in free_event_attributes()
1149 struct i915_pmu *pmu = &i915->pmu; in i915_pmu_register() local
1152 &pmu->events_attr_group, in i915_pmu_register()
1157 spin_lock_init(&pmu->lock); in i915_pmu_register()
1158 hrtimer_setup(&pmu->timer, i915_sample, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in i915_pmu_register()
1159 init_rc6(pmu); in i915_pmu_register()
1162 pmu->name = kasprintf(GFP_KERNEL, in i915_pmu_register()
1165 if (pmu->name) { in i915_pmu_register()
1167 strreplace((char *)pmu->name, ':', '_'); in i915_pmu_register()
1170 pmu->name = "i915"; in i915_pmu_register()
1172 if (!pmu->name) in i915_pmu_register()
1175 pmu->events_attr_group.name = "events"; in i915_pmu_register()
1176 pmu->events_attr_group.attrs = create_event_attributes(pmu); in i915_pmu_register()
1177 if (!pmu->events_attr_group.attrs) in i915_pmu_register()
1180 pmu->base.attr_groups = kmemdup(attr_groups, sizeof(attr_groups), in i915_pmu_register()
1182 if (!pmu->base.attr_groups) in i915_pmu_register()
1185 pmu->base.module = THIS_MODULE; in i915_pmu_register()
1186 pmu->base.task_ctx_nr = perf_invalid_context; in i915_pmu_register()
1187 pmu->base.scope = PERF_PMU_SCOPE_SYS_WIDE; in i915_pmu_register()
1188 pmu->base.event_init = i915_pmu_event_init; in i915_pmu_register()
1189 pmu->base.add = i915_pmu_event_add; in i915_pmu_register()
1190 pmu->base.del = i915_pmu_event_del; in i915_pmu_register()
1191 pmu->base.start = i915_pmu_event_start; in i915_pmu_register()
1192 pmu->base.stop = i915_pmu_event_stop; in i915_pmu_register()
1193 pmu->base.read = i915_pmu_event_read; in i915_pmu_register()
1195 ret = perf_pmu_register(&pmu->base, pmu->name, -1); in i915_pmu_register()
1199 pmu->registered = true; in i915_pmu_register()
1204 kfree(pmu->base.attr_groups); in i915_pmu_register()
1206 free_event_attributes(pmu); in i915_pmu_register()
1209 kfree(pmu->name); in i915_pmu_register()
1211 drm_notice(&i915->drm, "Failed to register PMU!\n"); in i915_pmu_register()
1216 struct i915_pmu *pmu = &i915->pmu; in i915_pmu_unregister() local
1218 if (!pmu->registered) in i915_pmu_unregister()
1221 /* Disconnect the PMU callbacks */ in i915_pmu_unregister()
1222 pmu->registered = false; in i915_pmu_unregister()
1224 hrtimer_cancel(&pmu->timer); in i915_pmu_unregister()
1226 perf_pmu_unregister(&pmu->base); in i915_pmu_unregister()
1227 kfree(pmu->base.attr_groups); in i915_pmu_unregister()
1229 kfree(pmu->name); in i915_pmu_unregister()
1230 free_event_attributes(pmu); in i915_pmu_unregister()