Lines Matching refs:perf

389 i915_perf_get_oa_config(struct i915_perf *perf, int metrics_set)  in i915_perf_get_oa_config()  argument
394 oa_config = idr_find(&perf->metrics_idr, metrics_set); in i915_perf_get_oa_config()
471 hw_tail = stream->perf->ops.oa_hw_tail_read(stream); in oa_buffer_check_unlocked()
521 __ratelimit(&stream->perf->tail_pointer_race)) in oa_buffer_check_unlocked()
722 (GRAPHICS_VER(stream->perf->i915) == 12 ? in gen8_append_oa_reports()
736 if (!(report32[0] & stream->perf->gen8_valid_ctx_bit) && in gen8_append_oa_reports()
737 GRAPHICS_VER(stream->perf->i915) <= 11) in gen8_append_oa_reports()
771 if (!stream->perf->exclusive_stream->ctx || in gen8_append_oa_reports()
780 if (stream->perf->exclusive_stream->ctx && in gen8_append_oa_reports()
804 oaheadptr = GRAPHICS_VER(stream->perf->i915) == 12 ? in gen8_append_oa_reports()
857 oastatus_reg = GRAPHICS_VER(stream->perf->i915) == 12 ? in gen8_oa_read()
885 stream->perf->ops.oa_disable(stream); in gen8_oa_read()
886 stream->perf->ops.oa_enable(stream); in gen8_oa_read()
1007 if (__ratelimit(&stream->perf->spurious_report_rs)) in gen7_append_oa_reports()
1077 oastatus1 &= ~stream->perf->gen7_latched_oastatus1; in gen7_oa_read()
1108 stream->perf->ops.oa_disable(stream); in gen7_oa_read()
1109 stream->perf->ops.oa_enable(stream); in gen7_oa_read()
1119 stream->perf->gen7_latched_oastatus1 |= in gen7_oa_read()
1184 return stream->perf->ops.read(stream, buf, count, offset); in i915_oa_read()
1313 drm_dbg(&stream->perf->i915->drm, in oa_get_render_ctx_id()
1369 struct i915_perf *perf = stream->perf; in i915_oa_stream_destroy() local
1371 BUG_ON(stream != perf->exclusive_stream); in i915_oa_stream_destroy()
1379 WRITE_ONCE(perf->exclusive_stream, NULL); in i915_oa_stream_destroy()
1380 perf->ops.disable_metric_set(stream); in i915_oa_stream_destroy()
1393 if (perf->spurious_report_rs.missed) { in i915_oa_stream_destroy()
1395 perf->spurious_report_rs.missed); in i915_oa_stream_destroy()
1429 stream->perf->gen7_latched_oastatus1 = 0; in gen7_init_oa_buffer()
1556 struct drm_i915_private *i915 = stream->perf->i915; in alloc_oa_buffer()
1567 bo = i915_gem_object_create_shmem(stream->perf->i915, OA_BUFFER_SIZE); in alloc_oa_buffer()
1613 if (GRAPHICS_VER(stream->perf->i915) >= 8) in save_restore_register()
1629 struct drm_i915_private *i915 = stream->perf->i915; in alloc_noa_wait()
1633 intel_gt_ns_to_clock_interval(stream->perf->i915->ggtt.vm.gt, in alloc_noa_wait()
1634 atomic64_read(&stream->perf->noa_programming_delay)); in alloc_noa_wait()
1874 obj = i915_gem_object_create_shmem(stream->perf->i915, config_length); in alloc_oa_config_buffer()
1903 *cs++ = (GRAPHICS_VER(stream->perf->i915) < 8 ? in alloc_oa_config_buffer()
2114 u32 ctx_oactxctrl = stream->perf->ctx_oactxctrl_offset; in gen8_update_reg_state_unlocked()
2115 u32 ctx_flexeu0 = stream->perf->ctx_flexeu0_offset; in gen8_update_reg_state_unlocked()
2281 stream->perf->ctx_oactxctrl_offset + 1, in gen12_configure_oar_context()
2351 struct drm_i915_private *i915 = stream->perf->i915; in oa_configure_all_contexts()
2356 lockdep_assert_held(&stream->perf->lock); in oa_configure_all_contexts()
2437 const u32 ctx_flexeu0 = stream->perf->ctx_flexeu0_offset; in lrc_configure_all_contexts()
2446 stream->perf->ctx_oactxctrl_offset + 1, in lrc_configure_all_contexts()
2503 if (IS_GRAPHICS_VER(stream->perf->i915, 9, 11)) { in gen8_enable_metric_set()
2705 stream->perf->ops.oa_enable(stream); in i915_oa_stream_enable()
2721 drm_err(&stream->perf->i915->drm, in gen7_oa_disable()
2733 drm_err(&stream->perf->i915->drm, in gen8_oa_disable()
2746 drm_err(&stream->perf->i915->drm, in gen12_oa_disable()
2754 drm_err(&stream->perf->i915->drm, in gen12_oa_disable()
2768 stream->perf->ops.oa_disable(stream); in i915_oa_stream_disable()
2792 err = stream->perf->ops.enable_metric_set(stream, active); in i915_perf_stream_enable_sync()
2854 struct drm_i915_private *i915 = stream->perf->i915; in i915_oa_stream_init()
2855 struct i915_perf *perf = stream->perf; in i915_oa_stream_init() local
2869 if (!perf->metrics_kobj) { in i915_oa_stream_init()
2875 (GRAPHICS_VER(perf->i915) < 12 || !stream->ctx)) { in i915_oa_stream_init()
2880 if (!perf->ops.enable_metric_set) { in i915_oa_stream_init()
2890 if (perf->exclusive_stream) { in i915_oa_stream_init()
2905 format_size = perf->oa_formats[props->oa_format].size; in i915_oa_stream_init()
2917 perf->oa_formats[props->oa_format].format; in i915_oa_stream_init()
2937 stream->oa_config = i915_perf_get_oa_config(perf, props->metrics_set); in i915_oa_stream_init()
2965 perf->sseu = props->sseu; in i915_oa_stream_init()
2966 WRITE_ONCE(perf->exclusive_stream, stream); in i915_oa_stream_init()
2986 WRITE_ONCE(perf->exclusive_stream, NULL); in i915_oa_stream_init()
2987 perf->ops.disable_metric_set(stream); in i915_oa_stream_init()
3016 stream = READ_ONCE(engine->i915->perf.exclusive_stream); in i915_oa_init_reg_state()
3017 if (stream && GRAPHICS_VER(stream->perf->i915) < 12) in i915_oa_init_reg_state()
3045 struct i915_perf *perf = stream->perf; in i915_perf_read() local
3069 mutex_lock(&perf->lock); in i915_perf_read()
3071 mutex_unlock(&perf->lock); in i915_perf_read()
3074 mutex_lock(&perf->lock); in i915_perf_read()
3076 mutex_unlock(&perf->lock); in i915_perf_read()
3164 struct i915_perf *perf = stream->perf; in i915_perf_poll() local
3167 mutex_lock(&perf->lock); in i915_perf_poll()
3169 mutex_unlock(&perf->lock); in i915_perf_poll()
3234 config = i915_perf_get_oa_config(stream->perf, metrics_set); in i915_perf_config_locked()
3308 struct i915_perf *perf = stream->perf; in i915_perf_ioctl() local
3311 mutex_lock(&perf->lock); in i915_perf_ioctl()
3313 mutex_unlock(&perf->lock); in i915_perf_ioctl()
3356 struct i915_perf *perf = stream->perf; in i915_perf_release() local
3358 mutex_lock(&perf->lock); in i915_perf_release()
3360 mutex_unlock(&perf->lock); in i915_perf_release()
3363 drm_dev_put(&perf->i915->drm); in i915_perf_release()
3408 i915_perf_open_ioctl_locked(struct i915_perf *perf, in i915_perf_open_ioctl_locked() argument
3452 if (IS_HASWELL(perf->i915) && specific_ctx) in i915_perf_open_ioctl_locked()
3454 else if (GRAPHICS_VER(perf->i915) == 12 && specific_ctx && in i915_perf_open_ioctl_locked()
3493 stream->perf = perf; in i915_perf_open_ioctl_locked()
3527 drm_dev_get(&perf->i915->drm); in i915_perf_open_ioctl_locked()
3543 static u64 oa_exponent_to_ns(struct i915_perf *perf, int exponent) in oa_exponent_to_ns() argument
3545 return intel_gt_clock_interval_to_ns(perf->i915->ggtt.vm.gt, in oa_exponent_to_ns()
3550 oa_format_valid(struct i915_perf *perf, enum drm_i915_oa_format format) in oa_format_valid() argument
3552 return test_bit(format, perf->format_mask); in oa_format_valid()
3556 oa_format_add(struct i915_perf *perf, enum drm_i915_oa_format format) in oa_format_add() argument
3558 __set_bit(format, perf->format_mask); in oa_format_add()
3576 static int read_properties_unlocked(struct i915_perf *perf, in read_properties_unlocked() argument
3594 props->engine = intel_engine_lookup_user(perf->i915, in read_properties_unlocked()
3652 if (!oa_format_valid(perf, value)) { in read_properties_unlocked()
3673 oa_period = oa_exponent_to_ns(perf, value); in read_properties_unlocked()
3764 struct i915_perf *perf = &to_i915(dev)->perf; in i915_perf_open_ioctl() local
3770 if (!perf->i915) { in i915_perf_open_ioctl()
3783 ret = read_properties_unlocked(perf, in i915_perf_open_ioctl()
3790 mutex_lock(&perf->lock); in i915_perf_open_ioctl()
3791 ret = i915_perf_open_ioctl_locked(perf, param, &props, file); in i915_perf_open_ioctl()
3792 mutex_unlock(&perf->lock); in i915_perf_open_ioctl()
3807 struct i915_perf *perf = &i915->perf; in i915_perf_register() local
3809 if (!perf->i915) in i915_perf_register()
3816 mutex_lock(&perf->lock); in i915_perf_register()
3818 perf->metrics_kobj = in i915_perf_register()
3822 mutex_unlock(&perf->lock); in i915_perf_register()
3836 struct i915_perf *perf = &i915->perf; in i915_perf_unregister() local
3838 if (!perf->metrics_kobj) in i915_perf_unregister()
3841 kobject_put(perf->metrics_kobj); in i915_perf_unregister()
3842 perf->metrics_kobj = NULL; in i915_perf_unregister()
3845 static bool gen8_is_valid_flex_addr(struct i915_perf *perf, u32 addr) in gen8_is_valid_flex_addr() argument
3876 static bool gen7_is_valid_b_counter_addr(struct i915_perf *perf, u32 addr) in gen7_is_valid_b_counter_addr() argument
3883 static bool gen7_is_valid_mux_addr(struct i915_perf *perf, u32 addr) in gen7_is_valid_mux_addr() argument
3891 static bool gen8_is_valid_mux_addr(struct i915_perf *perf, u32 addr) in gen8_is_valid_mux_addr() argument
3893 return gen7_is_valid_mux_addr(perf, addr) || in gen8_is_valid_mux_addr()
3898 static bool gen11_is_valid_mux_addr(struct i915_perf *perf, u32 addr) in gen11_is_valid_mux_addr() argument
3900 return gen8_is_valid_mux_addr(perf, addr) || in gen11_is_valid_mux_addr()
3905 static bool hsw_is_valid_mux_addr(struct i915_perf *perf, u32 addr) in hsw_is_valid_mux_addr() argument
3907 return gen7_is_valid_mux_addr(perf, addr) || in hsw_is_valid_mux_addr()
3913 static bool chv_is_valid_mux_addr(struct i915_perf *perf, u32 addr) in chv_is_valid_mux_addr() argument
3915 return gen7_is_valid_mux_addr(perf, addr) || in chv_is_valid_mux_addr()
3919 static bool gen12_is_valid_b_counter_addr(struct i915_perf *perf, u32 addr) in gen12_is_valid_b_counter_addr() argument
3930 static bool gen12_is_valid_mux_addr(struct i915_perf *perf, u32 addr) in gen12_is_valid_mux_addr() argument
3960 static struct i915_oa_reg *alloc_oa_regs(struct i915_perf *perf, in alloc_oa_regs() argument
3961 bool (*is_valid)(struct i915_perf *perf, u32 addr), in alloc_oa_regs() argument
3988 if (!is_valid(perf, addr)) { in alloc_oa_regs()
4021 static int create_dynamic_oa_sysfs_entry(struct i915_perf *perf, in create_dynamic_oa_sysfs_entry() argument
4036 return sysfs_create_group(perf->metrics_kobj, in create_dynamic_oa_sysfs_entry()
4056 struct i915_perf *perf = &to_i915(dev)->perf; in i915_perf_add_config_ioctl() local
4062 if (!perf->i915) { in i915_perf_add_config_ioctl()
4067 if (!perf->metrics_kobj) { in i915_perf_add_config_ioctl()
4090 oa_config->perf = perf; in i915_perf_add_config_ioctl()
4105 regs = alloc_oa_regs(perf, in i915_perf_add_config_ioctl()
4106 perf->ops.is_valid_mux_reg, in i915_perf_add_config_ioctl()
4118 regs = alloc_oa_regs(perf, in i915_perf_add_config_ioctl()
4119 perf->ops.is_valid_b_counter_reg, in i915_perf_add_config_ioctl()
4130 if (GRAPHICS_VER(perf->i915) < 8) { in i915_perf_add_config_ioctl()
4137 regs = alloc_oa_regs(perf, in i915_perf_add_config_ioctl()
4138 perf->ops.is_valid_flex_reg, in i915_perf_add_config_ioctl()
4150 err = mutex_lock_interruptible(&perf->metrics_lock); in i915_perf_add_config_ioctl()
4157 idr_for_each_entry(&perf->metrics_idr, tmp, id) { in i915_perf_add_config_ioctl()
4165 err = create_dynamic_oa_sysfs_entry(perf, oa_config); in i915_perf_add_config_ioctl()
4172 oa_config->id = idr_alloc(&perf->metrics_idr, in i915_perf_add_config_ioctl()
4181 mutex_unlock(&perf->metrics_lock); in i915_perf_add_config_ioctl()
4188 mutex_unlock(&perf->metrics_lock); in i915_perf_add_config_ioctl()
4209 struct i915_perf *perf = &to_i915(dev)->perf; in i915_perf_remove_config_ioctl() local
4214 if (!perf->i915) { in i915_perf_remove_config_ioctl()
4224 ret = mutex_lock_interruptible(&perf->metrics_lock); in i915_perf_remove_config_ioctl()
4228 oa_config = idr_find(&perf->metrics_idr, *arg); in i915_perf_remove_config_ioctl()
4237 sysfs_remove_group(perf->metrics_kobj, &oa_config->sysfs_metric); in i915_perf_remove_config_ioctl()
4239 idr_remove(&perf->metrics_idr, *arg); in i915_perf_remove_config_ioctl()
4241 mutex_unlock(&perf->metrics_lock); in i915_perf_remove_config_ioctl()
4250 mutex_unlock(&perf->metrics_lock); in i915_perf_remove_config_ioctl()
4296 static void oa_init_supported_formats(struct i915_perf *perf) in oa_init_supported_formats() argument
4298 struct drm_i915_private *i915 = perf->i915; in oa_init_supported_formats()
4303 oa_format_add(perf, I915_OA_FORMAT_A13); in oa_init_supported_formats()
4304 oa_format_add(perf, I915_OA_FORMAT_A13); in oa_init_supported_formats()
4305 oa_format_add(perf, I915_OA_FORMAT_A29); in oa_init_supported_formats()
4306 oa_format_add(perf, I915_OA_FORMAT_A13_B8_C8); in oa_init_supported_formats()
4307 oa_format_add(perf, I915_OA_FORMAT_B4_C8); in oa_init_supported_formats()
4308 oa_format_add(perf, I915_OA_FORMAT_A45_B8_C8); in oa_init_supported_formats()
4309 oa_format_add(perf, I915_OA_FORMAT_B4_C8_A16); in oa_init_supported_formats()
4310 oa_format_add(perf, I915_OA_FORMAT_C4_B8); in oa_init_supported_formats()
4329 oa_format_add(perf, I915_OA_FORMAT_A12); in oa_init_supported_formats()
4330 oa_format_add(perf, I915_OA_FORMAT_A12_B8_C8); in oa_init_supported_formats()
4331 oa_format_add(perf, I915_OA_FORMAT_A32u40_A4u32_B8_C8); in oa_init_supported_formats()
4332 oa_format_add(perf, I915_OA_FORMAT_C4_B8); in oa_init_supported_formats()
4351 struct i915_perf *perf = &i915->perf; in i915_perf_init() local
4355 perf->oa_formats = oa_formats; in i915_perf_init()
4357 perf->ops.is_valid_b_counter_reg = gen7_is_valid_b_counter_addr; in i915_perf_init()
4358 perf->ops.is_valid_mux_reg = hsw_is_valid_mux_addr; in i915_perf_init()
4359 perf->ops.is_valid_flex_reg = NULL; in i915_perf_init()
4360 perf->ops.enable_metric_set = hsw_enable_metric_set; in i915_perf_init()
4361 perf->ops.disable_metric_set = hsw_disable_metric_set; in i915_perf_init()
4362 perf->ops.oa_enable = gen7_oa_enable; in i915_perf_init()
4363 perf->ops.oa_disable = gen7_oa_disable; in i915_perf_init()
4364 perf->ops.read = gen7_oa_read; in i915_perf_init()
4365 perf->ops.oa_hw_tail_read = gen7_oa_hw_tail_read; in i915_perf_init()
4373 perf->ops.read = gen8_oa_read; in i915_perf_init()
4376 perf->ops.is_valid_b_counter_reg = in i915_perf_init()
4378 perf->ops.is_valid_mux_reg = in i915_perf_init()
4380 perf->ops.is_valid_flex_reg = in i915_perf_init()
4384 perf->ops.is_valid_mux_reg = in i915_perf_init()
4388 perf->ops.oa_enable = gen8_oa_enable; in i915_perf_init()
4389 perf->ops.oa_disable = gen8_oa_disable; in i915_perf_init()
4390 perf->ops.enable_metric_set = gen8_enable_metric_set; in i915_perf_init()
4391 perf->ops.disable_metric_set = gen8_disable_metric_set; in i915_perf_init()
4392 perf->ops.oa_hw_tail_read = gen8_oa_hw_tail_read; in i915_perf_init()
4395 perf->ctx_oactxctrl_offset = 0x120; in i915_perf_init()
4396 perf->ctx_flexeu0_offset = 0x2ce; in i915_perf_init()
4398 perf->gen8_valid_ctx_bit = BIT(25); in i915_perf_init()
4400 perf->ctx_oactxctrl_offset = 0x128; in i915_perf_init()
4401 perf->ctx_flexeu0_offset = 0x3de; in i915_perf_init()
4403 perf->gen8_valid_ctx_bit = BIT(16); in i915_perf_init()
4406 perf->ops.is_valid_b_counter_reg = in i915_perf_init()
4408 perf->ops.is_valid_mux_reg = in i915_perf_init()
4410 perf->ops.is_valid_flex_reg = in i915_perf_init()
4413 perf->ops.oa_enable = gen8_oa_enable; in i915_perf_init()
4414 perf->ops.oa_disable = gen8_oa_disable; in i915_perf_init()
4415 perf->ops.enable_metric_set = gen8_enable_metric_set; in i915_perf_init()
4416 perf->ops.disable_metric_set = gen11_disable_metric_set; in i915_perf_init()
4417 perf->ops.oa_hw_tail_read = gen8_oa_hw_tail_read; in i915_perf_init()
4419 perf->ctx_oactxctrl_offset = 0x124; in i915_perf_init()
4420 perf->ctx_flexeu0_offset = 0x78e; in i915_perf_init()
4422 perf->gen8_valid_ctx_bit = BIT(16); in i915_perf_init()
4424 perf->ops.is_valid_b_counter_reg = in i915_perf_init()
4426 perf->ops.is_valid_mux_reg = in i915_perf_init()
4428 perf->ops.is_valid_flex_reg = in i915_perf_init()
4431 perf->ops.oa_enable = gen12_oa_enable; in i915_perf_init()
4432 perf->ops.oa_disable = gen12_oa_disable; in i915_perf_init()
4433 perf->ops.enable_metric_set = gen12_enable_metric_set; in i915_perf_init()
4434 perf->ops.disable_metric_set = gen12_disable_metric_set; in i915_perf_init()
4435 perf->ops.oa_hw_tail_read = gen12_oa_hw_tail_read; in i915_perf_init()
4437 perf->ctx_flexeu0_offset = 0; in i915_perf_init()
4438 perf->ctx_oactxctrl_offset = 0x144; in i915_perf_init()
4442 if (perf->ops.enable_metric_set) { in i915_perf_init()
4443 mutex_init(&perf->lock); in i915_perf_init()
4448 mutex_init(&perf->metrics_lock); in i915_perf_init()
4449 idr_init_base(&perf->metrics_idr, 1); in i915_perf_init()
4461 ratelimit_state_init(&perf->spurious_report_rs, 5 * HZ, 10); in i915_perf_init()
4466 ratelimit_set_flags(&perf->spurious_report_rs, in i915_perf_init()
4469 ratelimit_state_init(&perf->tail_pointer_race, in i915_perf_init()
4471 ratelimit_set_flags(&perf->tail_pointer_race, in i915_perf_init()
4474 atomic64_set(&perf->noa_programming_delay, in i915_perf_init()
4477 perf->i915 = i915; in i915_perf_init()
4479 oa_init_supported_formats(perf); in i915_perf_init()
4506 struct i915_perf *perf = &i915->perf; in i915_perf_fini() local
4508 if (!perf->i915) in i915_perf_fini()
4511 idr_for_each(&perf->metrics_idr, destroy_config, perf); in i915_perf_fini()
4512 idr_destroy(&perf->metrics_idr); in i915_perf_fini()
4514 memset(&perf->ops, 0, sizeof(perf->ops)); in i915_perf_fini()
4515 perf->i915 = NULL; in i915_perf_fini()