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 Wilsonstatic 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 Wilsonstatic 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