Lines Matching full:stream

36  * descriptor representing a stream of GPU metrics which can then be read() as
37 * a stream of sample records.
56 * i915 perf file descriptors represent a "stream" instead of an "event"; where
57 * a perf event primarily corresponds to a single 64bit value, while a stream
61 * of related counters. Samples for an i915 perf stream capturing OA metrics
64 * selected by the user opening the stream. Perf has support for grouping
68 * i915 perf stream configurations are provided as an array of u64 (key,value)
342 * struct perf_open_properties - for validated properties given to open a stream
361 * to open a stream of metrics the configuration is built up in the structure
430 struct i915_perf_regs *__oa_regs(struct i915_perf_stream *stream) in __oa_regs() argument
432 return &stream->engine->oa_group->regs; in __oa_regs()
435 static u32 gen12_oa_hw_tail_read(struct i915_perf_stream *stream) in gen12_oa_hw_tail_read() argument
437 struct intel_uncore *uncore = stream->uncore; in gen12_oa_hw_tail_read()
439 return intel_uncore_read(uncore, __oa_regs(stream)->oa_tail_ptr) & in gen12_oa_hw_tail_read()
443 static u32 gen8_oa_hw_tail_read(struct i915_perf_stream *stream) in gen8_oa_hw_tail_read() argument
445 struct intel_uncore *uncore = stream->uncore; in gen8_oa_hw_tail_read()
450 static u32 gen7_oa_hw_tail_read(struct i915_perf_stream *stream) in gen7_oa_hw_tail_read() argument
452 struct intel_uncore *uncore = stream->uncore; in gen7_oa_hw_tail_read()
461 static u64 oa_report_id(struct i915_perf_stream *stream, void *report) in oa_report_id() argument
463 return oa_report_header_64bit(stream) ? *(u64 *)report : *(u32 *)report; in oa_report_id()
466 static u64 oa_report_reason(struct i915_perf_stream *stream, void *report) in oa_report_reason() argument
468 return (oa_report_id(stream, report) >> OAREPORT_REASON_SHIFT) & in oa_report_reason()
469 (GRAPHICS_VER(stream->perf->i915) == 12 ? in oa_report_reason()
474 static void oa_report_id_clear(struct i915_perf_stream *stream, u32 *report) in oa_report_id_clear() argument
476 if (oa_report_header_64bit(stream)) in oa_report_id_clear()
482 static bool oa_report_ctx_invalid(struct i915_perf_stream *stream, void *report) in oa_report_ctx_invalid() argument
484 return !(oa_report_id(stream, report) & in oa_report_ctx_invalid()
485 stream->perf->gen8_valid_ctx_bit); in oa_report_ctx_invalid()
488 static u64 oa_timestamp(struct i915_perf_stream *stream, void *report) in oa_timestamp() argument
490 return oa_report_header_64bit(stream) ? in oa_timestamp()
495 static void oa_timestamp_clear(struct i915_perf_stream *stream, u32 *report) in oa_timestamp_clear() argument
497 if (oa_report_header_64bit(stream)) in oa_timestamp_clear()
503 static u32 oa_context_id(struct i915_perf_stream *stream, u32 *report) in oa_context_id() argument
505 u32 ctx_id = oa_report_header_64bit(stream) ? report[4] : report[2]; in oa_context_id()
507 return ctx_id & stream->specific_ctx_id_mask; in oa_context_id()
510 static void oa_context_id_squash(struct i915_perf_stream *stream, u32 *report) in oa_context_id_squash() argument
512 if (oa_report_header_64bit(stream)) in oa_context_id_squash()
520 * @stream: i915 stream instance
536 * only called while the stream is enabled, while the global OA configuration
541 static bool oa_buffer_check_unlocked(struct i915_perf_stream *stream) in oa_buffer_check_unlocked() argument
543 u32 gtt_offset = i915_ggtt_offset(stream->oa_buffer.vma); in oa_buffer_check_unlocked()
544 int report_size = stream->oa_buffer.format->size; in oa_buffer_check_unlocked()
555 spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); in oa_buffer_check_unlocked()
557 hw_tail = stream->perf->ops.oa_hw_tail_read(stream); in oa_buffer_check_unlocked()
563 partial_report_size = OA_TAKEN(hw_tail, stream->oa_buffer.tail); in oa_buffer_check_unlocked()
571 * anywhere between this head and stream->oa_buffer.tail. in oa_buffer_check_unlocked()
573 head = stream->oa_buffer.head - gtt_offset; in oa_buffer_check_unlocked()
574 read_tail = stream->oa_buffer.tail - gtt_offset; in oa_buffer_check_unlocked()
578 /* Walk the stream backward until we find a report with report in oa_buffer_check_unlocked()
590 void *report = stream->oa_buffer.vaddr + tail; in oa_buffer_check_unlocked()
592 if (oa_report_id(stream, report) || in oa_buffer_check_unlocked()
593 oa_timestamp(stream, report)) in oa_buffer_check_unlocked()
600 __ratelimit(&stream->perf->tail_pointer_race)) in oa_buffer_check_unlocked()
601 drm_notice(&stream->uncore->i915->drm, in oa_buffer_check_unlocked()
605 stream->oa_buffer.tail = gtt_offset + tail; in oa_buffer_check_unlocked()
607 pollin = OA_TAKEN(stream->oa_buffer.tail, in oa_buffer_check_unlocked()
608 stream->oa_buffer.head) >= report_size; in oa_buffer_check_unlocked()
610 spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); in oa_buffer_check_unlocked()
617 * @stream: An i915-perf stream opened for OA metrics
630 static int append_oa_status(struct i915_perf_stream *stream, in append_oa_status() argument
651 * @stream: An i915-perf stream opened for OA metrics
658 * properties when opening a stream, tracked as `stream->sample_flags`. This
666 static int append_oa_sample(struct i915_perf_stream *stream, in append_oa_sample() argument
672 int report_size = stream->oa_buffer.format->size; in append_oa_sample()
679 header.size = stream->sample_size; in append_oa_sample()
689 oa_buf_end = stream->oa_buffer.vaddr + OA_BUFFER_SIZE; in append_oa_sample()
697 if (copy_to_user(buf, stream->oa_buffer.vaddr, in append_oa_sample()
712 * @stream: An i915-perf stream opened for OA metrics
730 static int gen8_append_oa_reports(struct i915_perf_stream *stream, in gen8_append_oa_reports() argument
735 struct intel_uncore *uncore = stream->uncore; in gen8_append_oa_reports()
736 int report_size = stream->oa_buffer.format->size; in gen8_append_oa_reports()
737 u8 *oa_buf_base = stream->oa_buffer.vaddr; in gen8_append_oa_reports()
738 u32 gtt_offset = i915_ggtt_offset(stream->oa_buffer.vma); in gen8_append_oa_reports()
745 if (drm_WARN_ON(&uncore->i915->drm, !stream->enabled)) in gen8_append_oa_reports()
748 spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); in gen8_append_oa_reports()
750 head = stream->oa_buffer.head; in gen8_append_oa_reports()
751 tail = stream->oa_buffer.tail; in gen8_append_oa_reports()
753 spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); in gen8_append_oa_reports()
793 reason = oa_report_reason(stream, report); in gen8_append_oa_reports()
794 ctx_id = oa_context_id(stream, report32); in gen8_append_oa_reports()
804 if (oa_report_ctx_invalid(stream, report)) { in gen8_append_oa_reports()
806 oa_context_id_squash(stream, report32); in gen8_append_oa_reports()
840 if (!stream->ctx || in gen8_append_oa_reports()
841 stream->specific_ctx_id == ctx_id || in gen8_append_oa_reports()
842 stream->oa_buffer.last_ctx_id == stream->specific_ctx_id || in gen8_append_oa_reports()
849 if (stream->ctx && in gen8_append_oa_reports()
850 stream->specific_ctx_id != ctx_id) { in gen8_append_oa_reports()
851 oa_context_id_squash(stream, report32); in gen8_append_oa_reports()
854 ret = append_oa_sample(stream, buf, count, offset, in gen8_append_oa_reports()
859 stream->oa_buffer.last_ctx_id = ctx_id; in gen8_append_oa_reports()
867 oa_report_id_clear(stream, report32); in gen8_append_oa_reports()
868 oa_timestamp_clear(stream, report32); in gen8_append_oa_reports()
870 u8 *oa_buf_end = stream->oa_buffer.vaddr + in gen8_append_oa_reports()
887 oaheadptr = GRAPHICS_VER(stream->perf->i915) == 12 ? in gen8_append_oa_reports()
888 __oa_regs(stream)->oa_head_ptr : in gen8_append_oa_reports()
891 spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); in gen8_append_oa_reports()
900 stream->oa_buffer.head = head; in gen8_append_oa_reports()
902 spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); in gen8_append_oa_reports()
910 * @stream: An i915-perf stream opened for OA metrics
928 static int gen8_oa_read(struct i915_perf_stream *stream, in gen8_oa_read() argument
933 struct intel_uncore *uncore = stream->uncore; in gen8_oa_read()
938 if (drm_WARN_ON(&uncore->i915->drm, !stream->oa_buffer.vaddr)) in gen8_oa_read()
941 oastatus_reg = GRAPHICS_VER(stream->perf->i915) == 12 ? in gen8_oa_read()
942 __oa_regs(stream)->oa_status : in gen8_oa_read()
962 ret = append_oa_status(stream, buf, count, offset, in gen8_oa_read()
967 drm_dbg(&stream->perf->i915->drm, in gen8_oa_read()
969 stream->period_exponent); in gen8_oa_read()
971 stream->perf->ops.oa_disable(stream); in gen8_oa_read()
972 stream->perf->ops.oa_enable(stream); in gen8_oa_read()
982 ret = append_oa_status(stream, buf, count, offset, in gen8_oa_read()
995 return gen8_append_oa_reports(stream, buf, count, offset); in gen8_oa_read()
1001 * @stream: An i915-perf stream opened for OA metrics
1019 static int gen7_append_oa_reports(struct i915_perf_stream *stream, in gen7_append_oa_reports() argument
1024 struct intel_uncore *uncore = stream->uncore; in gen7_append_oa_reports()
1025 int report_size = stream->oa_buffer.format->size; in gen7_append_oa_reports()
1026 u8 *oa_buf_base = stream->oa_buffer.vaddr; in gen7_append_oa_reports()
1027 u32 gtt_offset = i915_ggtt_offset(stream->oa_buffer.vma); in gen7_append_oa_reports()
1034 if (drm_WARN_ON(&uncore->i915->drm, !stream->enabled)) in gen7_append_oa_reports()
1037 spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); in gen7_append_oa_reports()
1039 head = stream->oa_buffer.head; in gen7_append_oa_reports()
1040 tail = stream->oa_buffer.tail; in gen7_append_oa_reports()
1042 spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); in gen7_append_oa_reports()
1092 if (__ratelimit(&stream->perf->spurious_report_rs)) in gen7_append_oa_reports()
1098 ret = append_oa_sample(stream, buf, count, offset, report); in gen7_append_oa_reports()
1110 spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); in gen7_append_oa_reports()
1120 stream->oa_buffer.head = head; in gen7_append_oa_reports()
1122 spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); in gen7_append_oa_reports()
1130 * @stream: An i915-perf stream opened for OA metrics
1144 static int gen7_oa_read(struct i915_perf_stream *stream, in gen7_oa_read() argument
1149 struct intel_uncore *uncore = stream->uncore; in gen7_oa_read()
1153 if (drm_WARN_ON(&uncore->i915->drm, !stream->oa_buffer.vaddr)) in gen7_oa_read()
1163 oastatus1 &= ~stream->perf->gen7_latched_oastatus1; in gen7_oa_read()
1186 ret = append_oa_status(stream, buf, count, offset, in gen7_oa_read()
1191 drm_dbg(&stream->perf->i915->drm, in gen7_oa_read()
1193 stream->period_exponent); in gen7_oa_read()
1195 stream->perf->ops.oa_disable(stream); in gen7_oa_read()
1196 stream->perf->ops.oa_enable(stream); in gen7_oa_read()
1202 ret = append_oa_status(stream, buf, count, offset, in gen7_oa_read()
1206 stream->perf->gen7_latched_oastatus1 |= in gen7_oa_read()
1210 return gen7_append_oa_reports(stream, buf, count, offset); in gen7_oa_read()
1215 * @stream: An i915-perf stream opened for OA metrics
1217 * Called when userspace tries to read() from a blocking stream FD opened
1227 static int i915_oa_wait_unlocked(struct i915_perf_stream *stream) in i915_oa_wait_unlocked() argument
1230 if (!stream->periodic) in i915_oa_wait_unlocked()
1233 return wait_event_interruptible(stream->poll_wq, in i915_oa_wait_unlocked()
1234 oa_buffer_check_unlocked(stream)); in i915_oa_wait_unlocked()
1238 * i915_oa_poll_wait - call poll_wait() for an OA stream poll()
1239 * @stream: An i915-perf stream opened for OA metrics
1240 * @file: An i915 perf stream file
1243 * For handling userspace polling on an i915 perf stream opened for OA metrics,
1247 static void i915_oa_poll_wait(struct i915_perf_stream *stream, in i915_oa_poll_wait() argument
1251 poll_wait(file, &stream->poll_wq, wait); in i915_oa_poll_wait()
1256 * @stream: An i915-perf stream opened for OA metrics
1266 static int i915_oa_read(struct i915_perf_stream *stream, in i915_oa_read() argument
1271 return stream->perf->ops.read(stream, buf, count, offset); in i915_oa_read()
1274 static struct intel_context *oa_pin_context(struct i915_perf_stream *stream) in oa_pin_context() argument
1277 struct i915_gem_context *ctx = stream->ctx; in oa_pin_context()
1283 if (ce->engine != stream->engine) /* first match! */ in oa_pin_context()
1311 stream->pinned_ctx = ce; in oa_pin_context()
1312 return stream->pinned_ctx; in oa_pin_context()
1406 static int gen12_get_render_context_id(struct i915_perf_stream *stream) in gen12_get_render_context_id() argument
1411 if (intel_engine_uses_guc(stream->engine)) { in gen12_get_render_context_id()
1412 ret = gen12_guc_sw_ctx_id(stream->pinned_ctx, &ctx_id); in gen12_get_render_context_id()
1418 } else if (GRAPHICS_VER_FULL(stream->engine->i915) >= IP_VER(12, 50)) { in gen12_get_render_context_id()
1431 stream->specific_ctx_id = ctx_id & mask; in gen12_get_render_context_id()
1432 stream->specific_ctx_id_mask = mask; in gen12_get_render_context_id()
1510 * @stream: An i915-perf stream opened for OA metrics
1513 * lifetime of the stream. This ensures that we don't have to worry about
1518 static int oa_get_render_ctx_id(struct i915_perf_stream *stream) in oa_get_render_ctx_id() argument
1523 ce = oa_pin_context(stream); in oa_get_render_ctx_id()
1527 if (engine_supports_mi_query(stream->engine) && in oa_get_render_ctx_id()
1528 HAS_LOGICAL_RING_CONTEXTS(stream->perf->i915)) { in oa_get_render_ctx_id()
1536 drm_err(&stream->perf->i915->drm, in oa_get_render_ctx_id()
1538 stream->engine->name); in oa_get_render_ctx_id()
1549 stream->specific_ctx_id = i915_ggtt_offset(ce->state); in oa_get_render_ctx_id()
1550 stream->specific_ctx_id_mask = 0; in oa_get_render_ctx_id()
1567 stream->specific_ctx_id = ce->lrc.lrca >> 12; in oa_get_render_ctx_id()
1573 stream->specific_ctx_id_mask = in oa_get_render_ctx_id()
1576 stream->specific_ctx_id_mask = in oa_get_render_ctx_id()
1578 stream->specific_ctx_id = stream->specific_ctx_id_mask; in oa_get_render_ctx_id()
1584 ret = gen12_get_render_context_id(stream); in oa_get_render_ctx_id()
1591 ce->tag = stream->specific_ctx_id; in oa_get_render_ctx_id()
1593 drm_dbg(&stream->perf->i915->drm, in oa_get_render_ctx_id()
1595 stream->specific_ctx_id, in oa_get_render_ctx_id()
1596 stream->specific_ctx_id_mask); in oa_get_render_ctx_id()
1603 * @stream: An i915-perf stream opened for OA metrics
1606 * for the lifetime of the stream, then that can be undone here.
1608 static void oa_put_render_ctx_id(struct i915_perf_stream *stream) in oa_put_render_ctx_id() argument
1612 ce = fetch_and_zero(&stream->pinned_ctx); in oa_put_render_ctx_id()
1618 stream->specific_ctx_id = INVALID_CTX_ID; in oa_put_render_ctx_id()
1619 stream->specific_ctx_id_mask = 0; in oa_put_render_ctx_id()
1623 free_oa_buffer(struct i915_perf_stream *stream) in free_oa_buffer() argument
1625 i915_vma_unpin_and_release(&stream->oa_buffer.vma, in free_oa_buffer()
1628 stream->oa_buffer.vaddr = NULL; in free_oa_buffer()
1632 free_oa_configs(struct i915_perf_stream *stream) in free_oa_configs() argument
1636 i915_oa_config_put(stream->oa_config); in free_oa_configs()
1637 llist_for_each_entry_safe(oa_bo, tmp, stream->oa_config_bos.first, node) in free_oa_configs()
1642 free_noa_wait(struct i915_perf_stream *stream) in free_noa_wait() argument
1644 i915_vma_unpin_and_release(&stream->noa_wait, 0); in free_noa_wait()
1657 static void i915_oa_stream_destroy(struct i915_perf_stream *stream) in i915_oa_stream_destroy() argument
1659 struct i915_perf *perf = stream->perf; in i915_oa_stream_destroy()
1660 struct intel_gt *gt = stream->engine->gt; in i915_oa_stream_destroy()
1661 struct i915_perf_group *g = stream->engine->oa_group; in i915_oa_stream_destroy()
1663 if (WARN_ON(stream != g->exclusive_stream)) in i915_oa_stream_destroy()
1673 perf->ops.disable_metric_set(stream); in i915_oa_stream_destroy()
1675 free_oa_buffer(stream); in i915_oa_stream_destroy()
1680 if (stream->override_gucrc) in i915_oa_stream_destroy()
1684 intel_uncore_forcewake_put(stream->uncore, FORCEWAKE_ALL); in i915_oa_stream_destroy()
1685 intel_engine_pm_put(stream->engine); in i915_oa_stream_destroy()
1687 if (stream->ctx) in i915_oa_stream_destroy()
1688 oa_put_render_ctx_id(stream); in i915_oa_stream_destroy()
1690 free_oa_configs(stream); in i915_oa_stream_destroy()
1691 free_noa_wait(stream); in i915_oa_stream_destroy()
1700 static void gen7_init_oa_buffer(struct i915_perf_stream *stream) in gen7_init_oa_buffer() argument
1702 struct intel_uncore *uncore = stream->uncore; in gen7_init_oa_buffer()
1703 u32 gtt_offset = i915_ggtt_offset(stream->oa_buffer.vma); in gen7_init_oa_buffer()
1706 spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); in gen7_init_oa_buffer()
1713 stream->oa_buffer.head = gtt_offset; in gen7_init_oa_buffer()
1721 stream->oa_buffer.tail = gtt_offset; in gen7_init_oa_buffer()
1723 spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); in gen7_init_oa_buffer()
1729 stream->perf->gen7_latched_oastatus1 = 0; in gen7_init_oa_buffer()
1734 * when re-enabling a stream or in error/reset paths. in gen7_init_oa_buffer()
1742 memset(stream->oa_buffer.vaddr, 0, OA_BUFFER_SIZE); in gen7_init_oa_buffer()
1745 static void gen8_init_oa_buffer(struct i915_perf_stream *stream) in gen8_init_oa_buffer() argument
1747 struct intel_uncore *uncore = stream->uncore; in gen8_init_oa_buffer()
1748 u32 gtt_offset = i915_ggtt_offset(stream->oa_buffer.vma); in gen8_init_oa_buffer()
1751 spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); in gen8_init_oa_buffer()
1755 stream->oa_buffer.head = gtt_offset; in gen8_init_oa_buffer()
1772 stream->oa_buffer.tail = gtt_offset; in gen8_init_oa_buffer()
1779 stream->oa_buffer.last_ctx_id = INVALID_CTX_ID; in gen8_init_oa_buffer()
1781 spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); in gen8_init_oa_buffer()
1787 * when re-enabling a stream or in error/reset paths. in gen8_init_oa_buffer()
1795 memset(stream->oa_buffer.vaddr, 0, OA_BUFFER_SIZE); in gen8_init_oa_buffer()
1798 static void gen12_init_oa_buffer(struct i915_perf_stream *stream) in gen12_init_oa_buffer() argument
1800 struct intel_uncore *uncore = stream->uncore; in gen12_init_oa_buffer()
1801 u32 gtt_offset = i915_ggtt_offset(stream->oa_buffer.vma); in gen12_init_oa_buffer()
1804 spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); in gen12_init_oa_buffer()
1806 intel_uncore_write(uncore, __oa_regs(stream)->oa_status, 0); in gen12_init_oa_buffer()
1807 intel_uncore_write(uncore, __oa_regs(stream)->oa_head_ptr, in gen12_init_oa_buffer()
1809 stream->oa_buffer.head = gtt_offset; in gen12_init_oa_buffer()
1819 intel_uncore_write(uncore, __oa_regs(stream)->oa_buffer, gtt_offset | in gen12_init_oa_buffer()
1821 intel_uncore_write(uncore, __oa_regs(stream)->oa_tail_ptr, in gen12_init_oa_buffer()
1825 stream->oa_buffer.tail = gtt_offset; in gen12_init_oa_buffer()
1832 stream->oa_buffer.last_ctx_id = INVALID_CTX_ID; in gen12_init_oa_buffer()
1834 spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); in gen12_init_oa_buffer()
1840 * when re-enabling a stream or in error/reset paths. in gen12_init_oa_buffer()
1848 memset(stream->oa_buffer.vaddr, 0, in gen12_init_oa_buffer()
1849 stream->oa_buffer.vma->size); in gen12_init_oa_buffer()
1852 static int alloc_oa_buffer(struct i915_perf_stream *stream) in alloc_oa_buffer() argument
1854 struct drm_i915_private *i915 = stream->perf->i915; in alloc_oa_buffer()
1855 struct intel_gt *gt = stream->engine->gt; in alloc_oa_buffer()
1860 if (drm_WARN_ON(&i915->drm, stream->oa_buffer.vma)) in alloc_oa_buffer()
1866 bo = i915_gem_object_create_shmem(stream->perf->i915, OA_BUFFER_SIZE); in alloc_oa_buffer()
1891 stream->oa_buffer.vma = vma; in alloc_oa_buffer()
1893 stream->oa_buffer.vaddr = in alloc_oa_buffer()
1895 if (IS_ERR(stream->oa_buffer.vaddr)) { in alloc_oa_buffer()
1896 ret = PTR_ERR(stream->oa_buffer.vaddr); in alloc_oa_buffer()
1908 stream->oa_buffer.vaddr = NULL; in alloc_oa_buffer()
1909 stream->oa_buffer.vma = NULL; in alloc_oa_buffer()
1914 static u32 *save_restore_register(struct i915_perf_stream *stream, u32 *cs, in save_restore_register() argument
1923 if (GRAPHICS_VER(stream->perf->i915) >= 8) in save_restore_register()
1929 *cs++ = i915_ggtt_offset(stream->noa_wait) + offset + 4 * d; in save_restore_register()
1936 static int alloc_noa_wait(struct i915_perf_stream *stream) in alloc_noa_wait() argument
1938 struct drm_i915_private *i915 = stream->perf->i915; in alloc_noa_wait()
1939 struct intel_gt *gt = stream->engine->gt; in alloc_noa_wait()
1943 intel_gt_ns_to_clock_interval(to_gt(stream->perf->i915), in alloc_noa_wait()
1944 atomic64_read(&stream->perf->noa_programming_delay)); in alloc_noa_wait()
1945 const u32 base = stream->engine->mmio_base; in alloc_noa_wait()
1984 * needs to be fixed during the lifetime of the i915/perf stream. in alloc_noa_wait()
2002 stream->noa_wait = vma; in alloc_noa_wait()
2010 stream, cs, true /* save */, CS_GPR(i), in alloc_noa_wait()
2013 stream, cs, true /* save */, mi_predicate_result, in alloc_noa_wait()
2129 stream, cs, false /* restore */, CS_GPR(i), in alloc_noa_wait()
2132 stream, cs, false /* restore */, mi_predicate_result, in alloc_noa_wait()
2193 alloc_oa_config_buffer(struct i915_perf_stream *stream, in alloc_oa_config_buffer() argument
2213 obj = i915_gem_object_create_shmem(stream->perf->i915, config_length); in alloc_oa_config_buffer()
2242 *cs++ = (GRAPHICS_VER(stream->perf->i915) < 8 ? in alloc_oa_config_buffer()
2245 *cs++ = i915_ggtt_offset(stream->noa_wait); in alloc_oa_config_buffer()
2252 &stream->engine->gt->ggtt->vm, in alloc_oa_config_buffer()
2260 llist_add(&oa_bo->node, &stream->oa_config_bos); in alloc_oa_config_buffer()
2281 get_oa_vma(struct i915_perf_stream *stream, struct i915_oa_config *oa_config) in get_oa_vma() argument
2287 * to the stream. in get_oa_vma()
2289 llist_for_each_entry(oa_bo, stream->oa_config_bos.first, node) { in get_oa_vma()
2297 oa_bo = alloc_oa_config_buffer(stream, oa_config); in get_oa_vma()
2306 emit_oa_config(struct i915_perf_stream *stream, in emit_oa_config() argument
2316 vma = get_oa_vma(stream, oa_config); in emit_oa_config()
2376 static struct intel_context *oa_context(struct i915_perf_stream *stream) in oa_context() argument
2378 return stream->pinned_ctx ?: stream->engine->kernel_context; in oa_context()
2382 hsw_enable_metric_set(struct i915_perf_stream *stream, in hsw_enable_metric_set() argument
2385 struct intel_uncore *uncore = stream->uncore; in hsw_enable_metric_set()
2402 return emit_oa_config(stream, in hsw_enable_metric_set()
2403 stream->oa_config, oa_context(stream), in hsw_enable_metric_set()
2407 static void hsw_disable_metric_set(struct i915_perf_stream *stream) in hsw_disable_metric_set() argument
2409 struct intel_uncore *uncore = stream->uncore; in hsw_disable_metric_set()
2449 const struct i915_perf_stream *stream) in gen8_update_reg_state_unlocked() argument
2451 u32 ctx_oactxctrl = stream->perf->ctx_oactxctrl_offset; in gen8_update_reg_state_unlocked()
2452 u32 ctx_flexeu0 = stream->perf->ctx_flexeu0_offset; in gen8_update_reg_state_unlocked()
2467 (stream->period_exponent << GEN8_OA_TIMER_PERIOD_SHIFT) | in gen8_update_reg_state_unlocked()
2468 (stream->periodic ? GEN8_OA_TIMER_ENABLE : 0) | in gen8_update_reg_state_unlocked()
2473 oa_config_flex_reg(stream->oa_config, flex_regs[i]); in gen8_update_reg_state_unlocked()
2580 static int gen8_configure_context(struct i915_perf_stream *stream, in gen8_configure_context() argument
2610 static int gen12_configure_oar_context(struct i915_perf_stream *stream, in gen12_configure_oar_context() argument
2614 struct intel_context *ce = stream->pinned_ctx; in gen12_configure_oar_context()
2615 u32 format = stream->oa_buffer.format->format; in gen12_configure_oar_context()
2616 u32 offset = stream->perf->ctx_oactxctrl_offset; in gen12_configure_oar_context()
2661 * Manages updating the per-context aspects of the OA stream
2686 oa_configure_all_contexts(struct i915_perf_stream *stream, in oa_configure_all_contexts() argument
2691 struct drm_i915_private *i915 = stream->perf->i915; in oa_configure_all_contexts()
2693 struct intel_gt *gt = stream->engine->gt; in oa_configure_all_contexts()
2722 err = gen8_configure_context(stream, ctx, regs, num_regs); in oa_configure_all_contexts()
2756 gen12_configure_all_contexts(struct i915_perf_stream *stream, in gen12_configure_all_contexts() argument
2767 if (stream->engine->class != RENDER_CLASS) in gen12_configure_all_contexts()
2770 return oa_configure_all_contexts(stream, in gen12_configure_all_contexts()
2776 lrc_configure_all_contexts(struct i915_perf_stream *stream, in lrc_configure_all_contexts() argument
2780 u32 ctx_oactxctrl = stream->perf->ctx_oactxctrl_offset; in lrc_configure_all_contexts()
2782 const u32 ctx_flexeu0 = stream->perf->ctx_flexeu0_offset; in lrc_configure_all_contexts()
2805 (stream->period_exponent << GEN8_OA_TIMER_PERIOD_SHIFT) | in lrc_configure_all_contexts()
2806 (stream->periodic ? GEN8_OA_TIMER_ENABLE : 0) | in lrc_configure_all_contexts()
2812 return oa_configure_all_contexts(stream, in lrc_configure_all_contexts()
2818 gen8_enable_metric_set(struct i915_perf_stream *stream, in gen8_enable_metric_set() argument
2821 struct intel_uncore *uncore = stream->uncore; in gen8_enable_metric_set()
2822 struct i915_oa_config *oa_config = stream->oa_config; in gen8_enable_metric_set()
2848 if (IS_GRAPHICS_VER(stream->perf->i915, 9, 11)) { in gen8_enable_metric_set()
2859 ret = lrc_configure_all_contexts(stream, oa_config, active); in gen8_enable_metric_set()
2863 return emit_oa_config(stream, in gen8_enable_metric_set()
2864 stream->oa_config, oa_context(stream), in gen8_enable_metric_set()
2868 static u32 oag_report_ctx_switches(const struct i915_perf_stream *stream) in oag_report_ctx_switches() argument
2871 (stream->sample_flags & SAMPLE_OA_REPORT) ? in oag_report_ctx_switches()
2876 gen12_enable_metric_set(struct i915_perf_stream *stream, in gen12_enable_metric_set() argument
2879 struct drm_i915_private *i915 = stream->perf->i915; in gen12_enable_metric_set()
2880 struct intel_uncore *uncore = stream->uncore; in gen12_enable_metric_set()
2881 struct i915_oa_config *oa_config = stream->oa_config; in gen12_enable_metric_set()
2882 bool periodic = stream->periodic; in gen12_enable_metric_set()
2883 u32 period_exponent = stream->period_exponent; in gen12_enable_metric_set()
2899 intel_uncore_write(uncore, __oa_regs(stream)->oa_debug, in gen12_enable_metric_set()
2907 oag_report_ctx_switches(stream)); in gen12_enable_metric_set()
2909 intel_uncore_write(uncore, __oa_regs(stream)->oa_ctx_ctrl, periodic ? in gen12_enable_metric_set()
2930 ret = gen12_configure_all_contexts(stream, oa_config, active); in gen12_enable_metric_set()
2939 if (stream->ctx) { in gen12_enable_metric_set()
2940 ret = gen12_configure_oar_context(stream, active); in gen12_enable_metric_set()
2945 return emit_oa_config(stream, in gen12_enable_metric_set()
2946 stream->oa_config, oa_context(stream), in gen12_enable_metric_set()
2950 static void gen8_disable_metric_set(struct i915_perf_stream *stream) in gen8_disable_metric_set() argument
2952 struct intel_uncore *uncore = stream->uncore; in gen8_disable_metric_set()
2955 lrc_configure_all_contexts(stream, NULL, NULL); in gen8_disable_metric_set()
2960 static void gen11_disable_metric_set(struct i915_perf_stream *stream) in gen11_disable_metric_set() argument
2962 struct intel_uncore *uncore = stream->uncore; in gen11_disable_metric_set()
2965 lrc_configure_all_contexts(stream, NULL, NULL); in gen11_disable_metric_set()
2971 static void gen12_disable_metric_set(struct i915_perf_stream *stream) in gen12_disable_metric_set() argument
2973 struct intel_uncore *uncore = stream->uncore; in gen12_disable_metric_set()
2974 struct drm_i915_private *i915 = stream->perf->i915; in gen12_disable_metric_set()
2989 gen12_configure_all_contexts(stream, NULL, NULL); in gen12_disable_metric_set()
2992 if (stream->ctx) in gen12_disable_metric_set()
2993 gen12_configure_oar_context(stream, NULL); in gen12_disable_metric_set()
3005 static void gen7_oa_enable(struct i915_perf_stream *stream) in gen7_oa_enable() argument
3007 struct intel_uncore *uncore = stream->uncore; in gen7_oa_enable()
3008 struct i915_gem_context *ctx = stream->ctx; in gen7_oa_enable()
3009 u32 ctx_id = stream->specific_ctx_id; in gen7_oa_enable()
3010 bool periodic = stream->periodic; in gen7_oa_enable()
3011 u32 period_exponent = stream->period_exponent; in gen7_oa_enable()
3012 u32 report_format = stream->oa_buffer.format->format; in gen7_oa_enable()
3023 gen7_init_oa_buffer(stream); in gen7_oa_enable()
3035 static void gen8_oa_enable(struct i915_perf_stream *stream) in gen8_oa_enable() argument
3037 struct intel_uncore *uncore = stream->uncore; in gen8_oa_enable()
3038 u32 report_format = stream->oa_buffer.format->format; in gen8_oa_enable()
3049 gen8_init_oa_buffer(stream); in gen8_oa_enable()
3061 static void gen12_oa_enable(struct i915_perf_stream *stream) in gen12_oa_enable() argument
3070 if (!(stream->sample_flags & SAMPLE_OA_REPORT)) in gen12_oa_enable()
3073 gen12_init_oa_buffer(stream); in gen12_oa_enable()
3075 regs = __oa_regs(stream); in gen12_oa_enable()
3076 val = (stream->oa_buffer.format->format << regs->oa_ctrl_counter_format_shift) | in gen12_oa_enable()
3079 intel_uncore_write(stream->uncore, regs->oa_ctrl, val); in gen12_oa_enable()
3083 * i915_oa_stream_enable - handle `I915_PERF_IOCTL_ENABLE` for OA stream
3084 * @stream: An i915 perf stream opened for OA metrics
3087 * when opening the stream. This also starts a hrtimer that will periodically
3091 static void i915_oa_stream_enable(struct i915_perf_stream *stream) in i915_oa_stream_enable() argument
3093 stream->pollin = false; in i915_oa_stream_enable()
3095 stream->perf->ops.oa_enable(stream); in i915_oa_stream_enable()
3097 if (stream->sample_flags & SAMPLE_OA_REPORT) in i915_oa_stream_enable()
3098 hrtimer_start(&stream->poll_check_timer, in i915_oa_stream_enable()
3099 ns_to_ktime(stream->poll_oa_period), in i915_oa_stream_enable()
3103 static void gen7_oa_disable(struct i915_perf_stream *stream) in gen7_oa_disable() argument
3105 struct intel_uncore *uncore = stream->uncore; in gen7_oa_disable()
3111 drm_err(&stream->perf->i915->drm, in gen7_oa_disable()
3115 static void gen8_oa_disable(struct i915_perf_stream *stream) in gen8_oa_disable() argument
3117 struct intel_uncore *uncore = stream->uncore; in gen8_oa_disable()
3123 drm_err(&stream->perf->i915->drm, in gen8_oa_disable()
3127 static void gen12_oa_disable(struct i915_perf_stream *stream) in gen12_oa_disable() argument
3129 struct intel_uncore *uncore = stream->uncore; in gen12_oa_disable()
3131 intel_uncore_write(uncore, __oa_regs(stream)->oa_ctrl, 0); in gen12_oa_disable()
3133 __oa_regs(stream)->oa_ctrl, in gen12_oa_disable()
3136 drm_err(&stream->perf->i915->drm, in gen12_oa_disable()
3144 drm_err(&stream->perf->i915->drm, in gen12_oa_disable()
3149 * i915_oa_stream_disable - handle `I915_PERF_IOCTL_DISABLE` for OA stream
3150 * @stream: An i915 perf stream opened for OA metrics
3156 static void i915_oa_stream_disable(struct i915_perf_stream *stream) in i915_oa_stream_disable() argument
3158 stream->perf->ops.oa_disable(stream); in i915_oa_stream_disable()
3160 if (stream->sample_flags & SAMPLE_OA_REPORT) in i915_oa_stream_disable()
3161 hrtimer_cancel(&stream->poll_check_timer); in i915_oa_stream_disable()
3173 static int i915_perf_stream_enable_sync(struct i915_perf_stream *stream) in i915_perf_stream_enable_sync() argument
3182 err = stream->perf->ops.enable_metric_set(stream, active); in i915_perf_stream_enable_sync()
3250 * i915_oa_stream_init - validate combined props for OA stream and init
3251 * @stream: An i915 perf stream
3253 * @props: The property state that configures stream (individually validated)
3258 * At this point it has been determined that userspace wants a stream of
3267 static int i915_oa_stream_init(struct i915_perf_stream *stream, in i915_oa_stream_init() argument
3271 struct drm_i915_private *i915 = stream->perf->i915; in i915_oa_stream_init()
3272 struct i915_perf *perf = stream->perf; in i915_oa_stream_init()
3278 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3291 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3297 (GRAPHICS_VER(perf->i915) < 12 || !stream->ctx)) { in i915_oa_stream_init()
3298 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3304 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3315 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3321 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3326 stream->engine = props->engine; in i915_oa_stream_init()
3327 stream->uncore = stream->engine->gt->uncore; in i915_oa_stream_init()
3329 stream->sample_size = sizeof(struct drm_i915_perf_record_header); in i915_oa_stream_init()
3331 stream->oa_buffer.format = &perf->oa_formats[props->oa_format]; in i915_oa_stream_init()
3332 if (drm_WARN_ON(&i915->drm, stream->oa_buffer.format->size == 0)) in i915_oa_stream_init()
3335 stream->sample_flags = props->sample_flags; in i915_oa_stream_init()
3336 stream->sample_size += stream->oa_buffer.format->size; in i915_oa_stream_init()
3338 stream->hold_preemption = props->hold_preemption; in i915_oa_stream_init()
3340 stream->periodic = props->oa_periodic; in i915_oa_stream_init()
3341 if (stream->periodic) in i915_oa_stream_init()
3342 stream->period_exponent = props->oa_period_exponent; in i915_oa_stream_init()
3344 if (stream->ctx) { in i915_oa_stream_init()
3345 ret = oa_get_render_ctx_id(stream); in i915_oa_stream_init()
3347 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3353 ret = alloc_noa_wait(stream); in i915_oa_stream_init()
3355 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3360 stream->oa_config = i915_perf_get_oa_config(perf, props->metrics_set); in i915_oa_stream_init()
3361 if (!stream->oa_config) { in i915_oa_stream_init()
3362 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3380 intel_engine_pm_get(stream->engine); in i915_oa_stream_init()
3381 intel_uncore_forcewake_get(stream->uncore, FORCEWAKE_ALL); in i915_oa_stream_init()
3394 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3399 stream->override_gucrc = true; in i915_oa_stream_init()
3402 ret = alloc_oa_buffer(stream); in i915_oa_stream_init()
3406 stream->ops = &i915_oa_stream_ops; in i915_oa_stream_init()
3408 stream->engine->gt->perf.sseu = props->sseu; in i915_oa_stream_init()
3409 WRITE_ONCE(g->exclusive_stream, stream); in i915_oa_stream_init()
3411 ret = i915_perf_stream_enable_sync(stream); in i915_oa_stream_init()
3413 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3418 drm_dbg(&stream->perf->i915->drm, in i915_oa_stream_init()
3419 "opening stream oa config uuid=%s\n", in i915_oa_stream_init()
3420 stream->oa_config->uuid); in i915_oa_stream_init()
3422 hrtimer_init(&stream->poll_check_timer, in i915_oa_stream_init()
3424 stream->poll_check_timer.function = oa_poll_check_timer_cb; in i915_oa_stream_init()
3425 init_waitqueue_head(&stream->poll_wq); in i915_oa_stream_init()
3426 spin_lock_init(&stream->oa_buffer.ptr_lock); in i915_oa_stream_init()
3427 mutex_init(&stream->lock); in i915_oa_stream_init()
3433 perf->ops.disable_metric_set(stream); in i915_oa_stream_init()
3435 free_oa_buffer(stream); in i915_oa_stream_init()
3438 if (stream->override_gucrc) in i915_oa_stream_init()
3442 intel_uncore_forcewake_put(stream->uncore, FORCEWAKE_ALL); in i915_oa_stream_init()
3443 intel_engine_pm_put(stream->engine); in i915_oa_stream_init()
3445 free_oa_configs(stream); in i915_oa_stream_init()
3448 free_noa_wait(stream); in i915_oa_stream_init()
3451 if (stream->ctx) in i915_oa_stream_init()
3452 oa_put_render_ctx_id(stream); in i915_oa_stream_init()
3460 struct i915_perf_stream *stream; in i915_oa_init_reg_state() local
3466 stream = READ_ONCE(engine->oa_group->exclusive_stream); in i915_oa_init_reg_state()
3467 if (stream && GRAPHICS_VER(stream->perf->i915) < 12) in i915_oa_init_reg_state()
3468 gen8_update_reg_state_unlocked(ce, stream); in i915_oa_init_reg_state()
3472 * i915_perf_read - handles read() FOP for i915 perf stream FDs
3473 * @file: An i915 perf stream file
3478 * The entry point for handling a read() on a stream file descriptor from
3480 * &i915_perf_stream_ops->read but to save having stream implementations (of
3483 * We can also consistently treat trying to read from a disabled stream
3484 * as an IO error so implementations can assume the stream is enabled
3494 struct i915_perf_stream *stream = file->private_data; in i915_perf_read() local
3499 * disabled stream as an error. In particular it might otherwise lead in i915_perf_read()
3502 if (!stream->enabled || !(stream->sample_flags & SAMPLE_OA_REPORT)) in i915_perf_read()
3507 * stream->ops->wait_unlocked. in i915_perf_read()
3514 ret = stream->ops->wait_unlocked(stream); in i915_perf_read()
3518 mutex_lock(&stream->lock); in i915_perf_read()
3519 ret = stream->ops->read(stream, buf, count, &offset); in i915_perf_read()
3520 mutex_unlock(&stream->lock); in i915_perf_read()
3523 mutex_lock(&stream->lock); in i915_perf_read()
3524 ret = stream->ops->read(stream, buf, count, &offset); in i915_perf_read()
3525 mutex_unlock(&stream->lock); in i915_perf_read()
3540 stream->pollin = false; in i915_perf_read()
3548 struct i915_perf_stream *stream = in oa_poll_check_timer_cb() local
3549 container_of(hrtimer, typeof(*stream), poll_check_timer); in oa_poll_check_timer_cb()
3551 if (oa_buffer_check_unlocked(stream)) { in oa_poll_check_timer_cb()
3552 stream->pollin = true; in oa_poll_check_timer_cb()
3553 wake_up(&stream->poll_wq); in oa_poll_check_timer_cb()
3557 ns_to_ktime(stream->poll_oa_period)); in oa_poll_check_timer_cb()
3563 * i915_perf_poll_locked - poll_wait() with a suitable wait queue for stream
3564 * @stream: An i915 perf stream
3565 * @file: An i915 perf stream file
3568 * For handling userspace polling on an i915 perf stream, this calls through to
3570 * will be woken for new stream data.
3574 static __poll_t i915_perf_poll_locked(struct i915_perf_stream *stream, in i915_perf_poll_locked() argument
3580 stream->ops->poll_wait(stream, file, wait); in i915_perf_poll_locked()
3588 if (stream->pollin) in i915_perf_poll_locked()
3595 * i915_perf_poll - call poll_wait() with a suitable wait queue for stream
3596 * @file: An i915 perf stream file
3599 * For handling userspace polling on an i915 perf stream, this ensures
3600 * poll_wait() gets called with a wait queue that will be woken for new stream
3609 struct i915_perf_stream *stream = file->private_data; in i915_perf_poll() local
3612 mutex_lock(&stream->lock); in i915_perf_poll()
3613 ret = i915_perf_poll_locked(stream, file, wait); in i915_perf_poll()
3614 mutex_unlock(&stream->lock); in i915_perf_poll()
3621 * @stream: A disabled i915 perf stream
3623 * [Re]enables the associated capture of data for this stream.
3625 * If a stream was previously enabled then there's currently no intention
3629 static void i915_perf_enable_locked(struct i915_perf_stream *stream) in i915_perf_enable_locked() argument
3631 if (stream->enabled) in i915_perf_enable_locked()
3634 /* Allow stream->ops->enable() to refer to this */ in i915_perf_enable_locked()
3635 stream->enabled = true; in i915_perf_enable_locked()
3637 if (stream->ops->enable) in i915_perf_enable_locked()
3638 stream->ops->enable(stream); in i915_perf_enable_locked()
3640 if (stream->hold_preemption) in i915_perf_enable_locked()
3641 intel_context_set_nopreempt(stream->pinned_ctx); in i915_perf_enable_locked()
3646 * @stream: An enabled i915 perf stream
3648 * Disables the associated capture of data for this stream.
3650 * The intention is that disabling an re-enabling a stream will ideally be
3651 * cheaper than destroying and re-opening a stream with the same configuration,
3653 * must be retained between disabling and re-enabling a stream.
3655 * Note: while a stream is disabled it's considered an error for userspace
3656 * to attempt to read from the stream (-EIO).
3658 static void i915_perf_disable_locked(struct i915_perf_stream *stream) in i915_perf_disable_locked() argument
3660 if (!stream->enabled) in i915_perf_disable_locked()
3663 /* Allow stream->ops->disable() to refer to this */ in i915_perf_disable_locked()
3664 stream->enabled = false; in i915_perf_disable_locked()
3666 if (stream->hold_preemption) in i915_perf_disable_locked()
3667 intel_context_clear_nopreempt(stream->pinned_ctx); in i915_perf_disable_locked()
3669 if (stream->ops->disable) in i915_perf_disable_locked()
3670 stream->ops->disable(stream); in i915_perf_disable_locked()
3673 static long i915_perf_config_locked(struct i915_perf_stream *stream, in i915_perf_config_locked() argument
3677 long ret = stream->oa_config->id; in i915_perf_config_locked()
3679 config = i915_perf_get_oa_config(stream->perf, metrics_set); in i915_perf_config_locked()
3683 if (config != stream->oa_config) { in i915_perf_config_locked()
3695 err = emit_oa_config(stream, config, oa_context(stream), NULL); in i915_perf_config_locked()
3697 config = xchg(&stream->oa_config, config); in i915_perf_config_locked()
3708 * i915_perf_ioctl_locked - support ioctl() usage with i915 perf stream FDs
3709 * @stream: An i915 perf stream
3716 static long i915_perf_ioctl_locked(struct i915_perf_stream *stream, in i915_perf_ioctl_locked() argument
3722 i915_perf_enable_locked(stream); in i915_perf_ioctl_locked()
3725 i915_perf_disable_locked(stream); in i915_perf_ioctl_locked()
3728 return i915_perf_config_locked(stream, arg); in i915_perf_ioctl_locked()
3735 * i915_perf_ioctl - support ioctl() usage with i915 perf stream FDs
3736 * @file: An i915 perf stream file
3749 struct i915_perf_stream *stream = file->private_data; in i915_perf_ioctl() local
3752 mutex_lock(&stream->lock); in i915_perf_ioctl()
3753 ret = i915_perf_ioctl_locked(stream, cmd, arg); in i915_perf_ioctl()
3754 mutex_unlock(&stream->lock); in i915_perf_ioctl()
3760 * i915_perf_destroy_locked - destroy an i915 perf stream
3761 * @stream: An i915 perf stream
3763 * Frees all resources associated with the given i915 perf @stream, disabling
3769 static void i915_perf_destroy_locked(struct i915_perf_stream *stream) in i915_perf_destroy_locked() argument
3771 if (stream->enabled) in i915_perf_destroy_locked()
3772 i915_perf_disable_locked(stream); in i915_perf_destroy_locked()
3774 if (stream->ops->destroy) in i915_perf_destroy_locked()
3775 stream->ops->destroy(stream); in i915_perf_destroy_locked()
3777 if (stream->ctx) in i915_perf_destroy_locked()
3778 i915_gem_context_put(stream->ctx); in i915_perf_destroy_locked()
3780 kfree(stream); in i915_perf_destroy_locked()
3784 * i915_perf_release - handles userspace close() of a stream file
3786 * @file: An i915 perf stream file
3788 * Cleans up any resources associated with an open i915 perf stream file.
3796 struct i915_perf_stream *stream = file->private_data; in i915_perf_release() local
3797 struct i915_perf *perf = stream->perf; in i915_perf_release()
3798 struct intel_gt *gt = stream->engine->gt; in i915_perf_release()
3802 * other user of stream->lock. Use the perf lock to destroy the stream in i915_perf_release()
3806 i915_perf_destroy_locked(stream); in i915_perf_release()
3809 /* Release the reference the perf stream kept on the driver. */ in i915_perf_release()
3831 * i915_perf_open_ioctl_locked - DRM ioctl() for userspace to open a stream FD
3839 * Implements further stream config validation and stream initialization on
3848 * config validation and stream initialization details will be handled by
3850 * will be relevant to all stream types / backends.
3861 struct i915_perf_stream *stream = NULL; in i915_perf_open_ioctl_locked() local
3874 "Failed to look up context with ID %u for opening perf stream\n", in i915_perf_open_ioctl_locked()
3897 * doesn't request global stream access (i.e. query based sampling in i915_perf_open_ioctl_locked()
3932 "Insufficient privileges to open i915 perf stream\n"); in i915_perf_open_ioctl_locked()
3937 stream = kzalloc(sizeof(*stream), GFP_KERNEL); in i915_perf_open_ioctl_locked()
3938 if (!stream) { in i915_perf_open_ioctl_locked()
3943 stream->perf = perf; in i915_perf_open_ioctl_locked()
3944 stream->ctx = specific_ctx; in i915_perf_open_ioctl_locked()
3945 stream->poll_oa_period = props->poll_oa_period; in i915_perf_open_ioctl_locked()
3947 ret = i915_oa_stream_init(stream, param, props); in i915_perf_open_ioctl_locked()
3951 /* we avoid simply assigning stream->sample_flags = props->sample_flags in i915_perf_open_ioctl_locked()
3955 if (WARN_ON(stream->sample_flags != props->sample_flags)) { in i915_perf_open_ioctl_locked()
3965 stream_fd = anon_inode_getfd("[i915_perf]", &fops, stream, f_flags); in i915_perf_open_ioctl_locked()
3972 i915_perf_enable_locked(stream); in i915_perf_open_ioctl_locked()
3982 if (stream->ops->destroy) in i915_perf_open_ioctl_locked()
3983 stream->ops->destroy(stream); in i915_perf_open_ioctl_locked()
3985 kfree(stream); in i915_perf_open_ioctl_locked()
4014 * read_properties_unlocked - validate + copy userspace stream open properties
4018 * @props: The stream configuration built up while validating properties
4022 * properties necessary for a particular kind of stream have been set.
4256 * i915_perf_open_ioctl - DRM ioctl() for userspace to open a stream FD
4261 * Validates the stream open parameters given by userspace including flags
4264 * Very little is assumed up front about the nature of the stream being
4266 * i915-perf stream is expected to be a suitable interface for other forms of
4276 * Return: A newly opened i915 Perf stream file descriptor or negative
4326 * used to open an i915-perf stream.
4823 * and their content will be freed when the stream using the config is closed.
5220 * stream instead of waiting until driver _fini which no one in i915_perf_init()