xref: /openbmc/linux/drivers/gpu/drm/i915/gt/intel_engine_stats.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
14fb05a39SChris Wilson /* SPDX-License-Identifier: MIT */
24fb05a39SChris Wilson /*
34fb05a39SChris Wilson  * Copyright © 2020 Intel Corporation
44fb05a39SChris Wilson  */
54fb05a39SChris Wilson 
64fb05a39SChris Wilson #ifndef __INTEL_ENGINE_STATS_H__
74fb05a39SChris Wilson #define __INTEL_ENGINE_STATS_H__
84fb05a39SChris Wilson 
94fb05a39SChris Wilson #include <linux/atomic.h>
104fb05a39SChris Wilson #include <linux/ktime.h>
114fb05a39SChris Wilson #include <linux/seqlock.h>
124fb05a39SChris Wilson 
134fb05a39SChris Wilson #include "i915_gem.h" /* GEM_BUG_ON */
144fb05a39SChris Wilson #include "intel_engine.h"
154fb05a39SChris Wilson 
intel_engine_context_in(struct intel_engine_cs * engine)164fb05a39SChris Wilson static inline void intel_engine_context_in(struct intel_engine_cs *engine)
174fb05a39SChris Wilson {
18*344e6947SUmesh Nerlige Ramappa 	struct intel_engine_execlists_stats *stats = &engine->stats.execlists;
194fb05a39SChris Wilson 	unsigned long flags;
204fb05a39SChris Wilson 
21*344e6947SUmesh Nerlige Ramappa 	if (stats->active) {
22*344e6947SUmesh Nerlige Ramappa 		stats->active++;
234fb05a39SChris Wilson 		return;
244fb05a39SChris Wilson 	}
25f530a41dSChris Wilson 
26f530a41dSChris Wilson 	/* The writer is serialised; but the pmu reader may be from hardirq */
27f530a41dSChris Wilson 	local_irq_save(flags);
28*344e6947SUmesh Nerlige Ramappa 	write_seqcount_begin(&stats->lock);
29f530a41dSChris Wilson 
30*344e6947SUmesh Nerlige Ramappa 	stats->start = ktime_get();
31*344e6947SUmesh Nerlige Ramappa 	stats->active++;
32f530a41dSChris Wilson 
33*344e6947SUmesh Nerlige Ramappa 	write_seqcount_end(&stats->lock);
34f530a41dSChris Wilson 	local_irq_restore(flags);
35f530a41dSChris Wilson 
36*344e6947SUmesh Nerlige Ramappa 	GEM_BUG_ON(!stats->active);
374fb05a39SChris Wilson }
384fb05a39SChris Wilson 
intel_engine_context_out(struct intel_engine_cs * engine)394fb05a39SChris Wilson static inline void intel_engine_context_out(struct intel_engine_cs *engine)
404fb05a39SChris Wilson {
41*344e6947SUmesh Nerlige Ramappa 	struct intel_engine_execlists_stats *stats = &engine->stats.execlists;
424fb05a39SChris Wilson 	unsigned long flags;
434fb05a39SChris Wilson 
44*344e6947SUmesh Nerlige Ramappa 	GEM_BUG_ON(!stats->active);
45*344e6947SUmesh Nerlige Ramappa 	if (stats->active > 1) {
46*344e6947SUmesh Nerlige Ramappa 		stats->active--;
474fb05a39SChris Wilson 		return;
48f530a41dSChris Wilson 	}
494fb05a39SChris Wilson 
50f530a41dSChris Wilson 	local_irq_save(flags);
51*344e6947SUmesh Nerlige Ramappa 	write_seqcount_begin(&stats->lock);
52f530a41dSChris Wilson 
53*344e6947SUmesh Nerlige Ramappa 	stats->active--;
54*344e6947SUmesh Nerlige Ramappa 	stats->total = ktime_add(stats->total,
55*344e6947SUmesh Nerlige Ramappa 				 ktime_sub(ktime_get(), stats->start));
56f530a41dSChris Wilson 
57*344e6947SUmesh Nerlige Ramappa 	write_seqcount_end(&stats->lock);
58f530a41dSChris Wilson 	local_irq_restore(flags);
594fb05a39SChris Wilson }
604fb05a39SChris Wilson 
614fb05a39SChris Wilson #endif /* __INTEL_ENGINE_STATS_H__ */
62