Linux 6.9-rc1
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / gt / intel_engine_stats.h
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Copyright © 2020 Intel Corporation
4  */
5
6 #ifndef __INTEL_ENGINE_STATS_H__
7 #define __INTEL_ENGINE_STATS_H__
8
9 #include <linux/atomic.h>
10 #include <linux/ktime.h>
11 #include <linux/seqlock.h>
12
13 #include "i915_gem.h" /* GEM_BUG_ON */
14 #include "intel_engine.h"
15
16 static inline void intel_engine_context_in(struct intel_engine_cs *engine)
17 {
18         struct intel_engine_execlists_stats *stats = &engine->stats.execlists;
19         unsigned long flags;
20
21         if (stats->active) {
22                 stats->active++;
23                 return;
24         }
25
26         /* The writer is serialised; but the pmu reader may be from hardirq */
27         local_irq_save(flags);
28         write_seqcount_begin(&stats->lock);
29
30         stats->start = ktime_get();
31         stats->active++;
32
33         write_seqcount_end(&stats->lock);
34         local_irq_restore(flags);
35
36         GEM_BUG_ON(!stats->active);
37 }
38
39 static inline void intel_engine_context_out(struct intel_engine_cs *engine)
40 {
41         struct intel_engine_execlists_stats *stats = &engine->stats.execlists;
42         unsigned long flags;
43
44         GEM_BUG_ON(!stats->active);
45         if (stats->active > 1) {
46                 stats->active--;
47                 return;
48         }
49
50         local_irq_save(flags);
51         write_seqcount_begin(&stats->lock);
52
53         stats->active--;
54         stats->total = ktime_add(stats->total,
55                                  ktime_sub(ktime_get(), stats->start));
56
57         write_seqcount_end(&stats->lock);
58         local_irq_restore(flags);
59 }
60
61 #endif /* __INTEL_ENGINE_STATS_H__ */