Skip to content

Commit e03b590

Browse files
mbrost05johnharr-intel
authored andcommitted
drm/i915: Add intel_context tracing
Add intel_context tracing. These trace points are particular helpful when debugging the GuC firmware and can be enabled via CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS kernel config option. Cc: John Harrison <[email protected]> Signed-off-by: Matthew Brost <[email protected]> Reviewed-by: John Harrison <[email protected]> Signed-off-by: John Harrison <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent dbf9da8 commit e03b590

File tree

3 files changed

+165
-0
lines changed

3 files changed

+165
-0
lines changed

drivers/gpu/drm/i915/gt/intel_context.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "i915_drv.h"
1010
#include "i915_globals.h"
11+
#include "i915_trace.h"
1112

1213
#include "intel_context.h"
1314
#include "intel_engine.h"
@@ -28,6 +29,7 @@ static void rcu_context_free(struct rcu_head *rcu)
2829
{
2930
struct intel_context *ce = container_of(rcu, typeof(*ce), rcu);
3031

32+
trace_intel_context_free(ce);
3133
kmem_cache_free(global.slab_ce, ce);
3234
}
3335

@@ -46,6 +48,7 @@ intel_context_create(struct intel_engine_cs *engine)
4648
return ERR_PTR(-ENOMEM);
4749

4850
intel_context_init(ce, engine);
51+
trace_intel_context_create(ce);
4952
return ce;
5053
}
5154

@@ -268,6 +271,8 @@ int __intel_context_do_pin_ww(struct intel_context *ce,
268271

269272
GEM_BUG_ON(!intel_context_is_pinned(ce)); /* no overflow! */
270273

274+
trace_intel_context_do_pin(ce);
275+
271276
err_unlock:
272277
mutex_unlock(&ce->pin_mutex);
273278
err_post_unpin:
@@ -323,6 +328,7 @@ void __intel_context_do_unpin(struct intel_context *ce, int sub)
323328
*/
324329
intel_context_get(ce);
325330
intel_context_active_release(ce);
331+
trace_intel_context_do_unpin(ce);
326332
intel_context_put(ce);
327333
}
328334

drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ static int guc_add_request(struct intel_guc *guc, struct i915_request *rq)
344344

345345
err = intel_guc_send_nb(guc, action, len, g2h_len_dw);
346346
if (!enabled && !err) {
347+
trace_intel_context_sched_enable(ce);
347348
atomic_inc(&guc->outstanding_submission_g2h);
348349
set_context_enabled(ce);
349350
} else if (!enabled) {
@@ -815,6 +816,8 @@ static int register_context(struct intel_context *ce)
815816
u32 offset = intel_guc_ggtt_offset(guc, guc->lrc_desc_pool) +
816817
ce->guc_id * sizeof(struct guc_lrc_desc);
817818

819+
trace_intel_context_register(ce);
820+
818821
return __guc_action_register_context(guc, ce->guc_id, offset);
819822
}
820823

@@ -835,6 +838,8 @@ static int deregister_context(struct intel_context *ce, u32 guc_id)
835838
{
836839
struct intel_guc *guc = ce_to_guc(ce);
837840

841+
trace_intel_context_deregister(ce);
842+
838843
return __guc_action_deregister_context(guc, guc_id);
839844
}
840845

@@ -908,6 +913,7 @@ static int guc_lrc_desc_pin(struct intel_context *ce)
908913
* registering this context.
909914
*/
910915
if (context_registered) {
916+
trace_intel_context_steal_guc_id(ce);
911917
set_context_wait_for_deregister_to_register(ce);
912918
intel_context_get(ce);
913919

@@ -971,6 +977,7 @@ static void __guc_context_sched_disable(struct intel_guc *guc,
971977

972978
GEM_BUG_ON(guc_id == GUC_INVALID_LRC_ID);
973979

980+
trace_intel_context_sched_disable(ce);
974981
intel_context_get(ce);
975982

976983
guc_submission_send_busy_loop(guc, action, ARRAY_SIZE(action),
@@ -1133,6 +1140,9 @@ static void __guc_signal_context_fence(struct intel_context *ce)
11331140

11341141
lockdep_assert_held(&ce->guc_state.lock);
11351142

1143+
if (!list_empty(&ce->guc_state.fences))
1144+
trace_intel_context_fence_release(ce);
1145+
11361146
list_for_each_entry(rq, &ce->guc_state.fences, guc_fence_link)
11371147
i915_sw_fence_complete(&rq->submit);
11381148

@@ -1538,6 +1548,8 @@ int intel_guc_deregister_done_process_msg(struct intel_guc *guc,
15381548
if (unlikely(!ce))
15391549
return -EPROTO;
15401550

1551+
trace_intel_context_deregister_done(ce);
1552+
15411553
if (context_wait_for_deregister_to_register(ce)) {
15421554
struct intel_runtime_pm *runtime_pm =
15431555
&ce->engine->gt->i915->runtime_pm;
@@ -1589,6 +1601,8 @@ int intel_guc_sched_done_process_msg(struct intel_guc *guc,
15891601
return -EPROTO;
15901602
}
15911603

1604+
trace_intel_context_sched_done(ce);
1605+
15921606
if (context_pending_enable(ce)) {
15931607
clr_context_pending_enable(ce);
15941608
} else if (context_pending_disable(ce)) {

drivers/gpu/drm/i915/i915_trace.h

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,91 @@ TRACE_EVENT(i915_request_out,
895895
__entry->ctx, __entry->seqno, __entry->completed)
896896
);
897897

898+
DECLARE_EVENT_CLASS(intel_context,
899+
TP_PROTO(struct intel_context *ce),
900+
TP_ARGS(ce),
901+
902+
TP_STRUCT__entry(
903+
__field(u32, guc_id)
904+
__field(int, pin_count)
905+
__field(u32, sched_state)
906+
__field(u32, guc_sched_state_no_lock)
907+
),
908+
909+
TP_fast_assign(
910+
__entry->guc_id = ce->guc_id;
911+
__entry->pin_count = atomic_read(&ce->pin_count);
912+
__entry->sched_state = ce->guc_state.sched_state;
913+
__entry->guc_sched_state_no_lock =
914+
atomic_read(&ce->guc_sched_state_no_lock);
915+
),
916+
917+
TP_printk("guc_id=%d, pin_count=%d sched_state=0x%x,0x%x",
918+
__entry->guc_id, __entry->pin_count,
919+
__entry->sched_state,
920+
__entry->guc_sched_state_no_lock)
921+
);
922+
923+
DEFINE_EVENT(intel_context, intel_context_register,
924+
TP_PROTO(struct intel_context *ce),
925+
TP_ARGS(ce)
926+
);
927+
928+
DEFINE_EVENT(intel_context, intel_context_deregister,
929+
TP_PROTO(struct intel_context *ce),
930+
TP_ARGS(ce)
931+
);
932+
933+
DEFINE_EVENT(intel_context, intel_context_deregister_done,
934+
TP_PROTO(struct intel_context *ce),
935+
TP_ARGS(ce)
936+
);
937+
938+
DEFINE_EVENT(intel_context, intel_context_sched_enable,
939+
TP_PROTO(struct intel_context *ce),
940+
TP_ARGS(ce)
941+
);
942+
943+
DEFINE_EVENT(intel_context, intel_context_sched_disable,
944+
TP_PROTO(struct intel_context *ce),
945+
TP_ARGS(ce)
946+
);
947+
948+
DEFINE_EVENT(intel_context, intel_context_sched_done,
949+
TP_PROTO(struct intel_context *ce),
950+
TP_ARGS(ce)
951+
);
952+
953+
DEFINE_EVENT(intel_context, intel_context_create,
954+
TP_PROTO(struct intel_context *ce),
955+
TP_ARGS(ce)
956+
);
957+
958+
DEFINE_EVENT(intel_context, intel_context_fence_release,
959+
TP_PROTO(struct intel_context *ce),
960+
TP_ARGS(ce)
961+
);
962+
963+
DEFINE_EVENT(intel_context, intel_context_free,
964+
TP_PROTO(struct intel_context *ce),
965+
TP_ARGS(ce)
966+
);
967+
968+
DEFINE_EVENT(intel_context, intel_context_steal_guc_id,
969+
TP_PROTO(struct intel_context *ce),
970+
TP_ARGS(ce)
971+
);
972+
973+
DEFINE_EVENT(intel_context, intel_context_do_pin,
974+
TP_PROTO(struct intel_context *ce),
975+
TP_ARGS(ce)
976+
);
977+
978+
DEFINE_EVENT(intel_context, intel_context_do_unpin,
979+
TP_PROTO(struct intel_context *ce),
980+
TP_ARGS(ce)
981+
);
982+
898983
#else
899984
#if !defined(TRACE_HEADER_MULTI_READ)
900985
static inline void
@@ -921,6 +1006,66 @@ static inline void
9211006
trace_i915_request_out(struct i915_request *rq)
9221007
{
9231008
}
1009+
1010+
static inline void
1011+
trace_intel_context_register(struct intel_context *ce)
1012+
{
1013+
}
1014+
1015+
static inline void
1016+
trace_intel_context_deregister(struct intel_context *ce)
1017+
{
1018+
}
1019+
1020+
static inline void
1021+
trace_intel_context_deregister_done(struct intel_context *ce)
1022+
{
1023+
}
1024+
1025+
static inline void
1026+
trace_intel_context_sched_enable(struct intel_context *ce)
1027+
{
1028+
}
1029+
1030+
static inline void
1031+
trace_intel_context_sched_disable(struct intel_context *ce)
1032+
{
1033+
}
1034+
1035+
static inline void
1036+
trace_intel_context_sched_done(struct intel_context *ce)
1037+
{
1038+
}
1039+
1040+
static inline void
1041+
trace_intel_context_create(struct intel_context *ce)
1042+
{
1043+
}
1044+
1045+
static inline void
1046+
trace_intel_context_fence_release(struct intel_context *ce)
1047+
{
1048+
}
1049+
1050+
static inline void
1051+
trace_intel_context_free(struct intel_context *ce)
1052+
{
1053+
}
1054+
1055+
static inline void
1056+
trace_intel_context_steal_guc_id(struct intel_context *ce)
1057+
{
1058+
}
1059+
1060+
static inline void
1061+
trace_intel_context_do_pin(struct intel_context *ce)
1062+
{
1063+
}
1064+
1065+
static inline void
1066+
trace_intel_context_do_unpin(struct intel_context *ce)
1067+
{
1068+
}
9241069
#endif
9251070
#endif
9261071

0 commit comments

Comments
 (0)