15ca02815Sjsg /* SPDX-License-Identifier: MIT */
2c349dbc7Sjsg /*
3c349dbc7Sjsg * Copyright © 2019 Intel Corporation
4c349dbc7Sjsg */
5c349dbc7Sjsg
6c349dbc7Sjsg #ifndef INTEL_ENGINE_PM_H
7c349dbc7Sjsg #define INTEL_ENGINE_PM_H
8c349dbc7Sjsg
9*1bb76ff1Sjsg #include "i915_drv.h"
10c349dbc7Sjsg #include "i915_request.h"
11c349dbc7Sjsg #include "intel_engine_types.h"
12c349dbc7Sjsg #include "intel_wakeref.h"
13*1bb76ff1Sjsg #include "intel_gt_pm.h"
14c349dbc7Sjsg
15c349dbc7Sjsg static inline bool
intel_engine_pm_is_awake(const struct intel_engine_cs * engine)16c349dbc7Sjsg intel_engine_pm_is_awake(const struct intel_engine_cs *engine)
17c349dbc7Sjsg {
18c349dbc7Sjsg return intel_wakeref_is_active(&engine->wakeref);
19c349dbc7Sjsg }
20c349dbc7Sjsg
__intel_engine_pm_get(struct intel_engine_cs * engine)21*1bb76ff1Sjsg static inline void __intel_engine_pm_get(struct intel_engine_cs *engine)
22*1bb76ff1Sjsg {
23*1bb76ff1Sjsg __intel_wakeref_get(&engine->wakeref);
24*1bb76ff1Sjsg }
25*1bb76ff1Sjsg
intel_engine_pm_get(struct intel_engine_cs * engine)26c349dbc7Sjsg static inline void intel_engine_pm_get(struct intel_engine_cs *engine)
27c349dbc7Sjsg {
28c349dbc7Sjsg intel_wakeref_get(&engine->wakeref);
29c349dbc7Sjsg }
30c349dbc7Sjsg
intel_engine_pm_get_if_awake(struct intel_engine_cs * engine)31c349dbc7Sjsg static inline bool intel_engine_pm_get_if_awake(struct intel_engine_cs *engine)
32c349dbc7Sjsg {
33c349dbc7Sjsg return intel_wakeref_get_if_active(&engine->wakeref);
34c349dbc7Sjsg }
35c349dbc7Sjsg
intel_engine_pm_might_get(struct intel_engine_cs * engine)36*1bb76ff1Sjsg static inline void intel_engine_pm_might_get(struct intel_engine_cs *engine)
37*1bb76ff1Sjsg {
38*1bb76ff1Sjsg if (!intel_engine_is_virtual(engine)) {
39*1bb76ff1Sjsg intel_wakeref_might_get(&engine->wakeref);
40*1bb76ff1Sjsg } else {
41*1bb76ff1Sjsg struct intel_gt *gt = engine->gt;
42*1bb76ff1Sjsg struct intel_engine_cs *tengine;
43*1bb76ff1Sjsg intel_engine_mask_t tmp, mask = engine->mask;
44*1bb76ff1Sjsg
45*1bb76ff1Sjsg for_each_engine_masked(tengine, gt, mask, tmp)
46*1bb76ff1Sjsg intel_wakeref_might_get(&tengine->wakeref);
47*1bb76ff1Sjsg }
48*1bb76ff1Sjsg intel_gt_pm_might_get(engine->gt);
49*1bb76ff1Sjsg }
50*1bb76ff1Sjsg
intel_engine_pm_put(struct intel_engine_cs * engine)51c349dbc7Sjsg static inline void intel_engine_pm_put(struct intel_engine_cs *engine)
52c349dbc7Sjsg {
53c349dbc7Sjsg intel_wakeref_put(&engine->wakeref);
54c349dbc7Sjsg }
55c349dbc7Sjsg
intel_engine_pm_put_async(struct intel_engine_cs * engine)56c349dbc7Sjsg static inline void intel_engine_pm_put_async(struct intel_engine_cs *engine)
57c349dbc7Sjsg {
58c349dbc7Sjsg intel_wakeref_put_async(&engine->wakeref);
59c349dbc7Sjsg }
60c349dbc7Sjsg
intel_engine_pm_put_delay(struct intel_engine_cs * engine,unsigned long delay)61ad8b1aafSjsg static inline void intel_engine_pm_put_delay(struct intel_engine_cs *engine,
62ad8b1aafSjsg unsigned long delay)
63ad8b1aafSjsg {
64ad8b1aafSjsg intel_wakeref_put_delay(&engine->wakeref, delay);
65ad8b1aafSjsg }
66ad8b1aafSjsg
intel_engine_pm_flush(struct intel_engine_cs * engine)67c349dbc7Sjsg static inline void intel_engine_pm_flush(struct intel_engine_cs *engine)
68c349dbc7Sjsg {
69c349dbc7Sjsg intel_wakeref_unlock_wait(&engine->wakeref);
70c349dbc7Sjsg }
71c349dbc7Sjsg
intel_engine_pm_might_put(struct intel_engine_cs * engine)72*1bb76ff1Sjsg static inline void intel_engine_pm_might_put(struct intel_engine_cs *engine)
73*1bb76ff1Sjsg {
74*1bb76ff1Sjsg if (!intel_engine_is_virtual(engine)) {
75*1bb76ff1Sjsg intel_wakeref_might_put(&engine->wakeref);
76*1bb76ff1Sjsg } else {
77*1bb76ff1Sjsg struct intel_gt *gt = engine->gt;
78*1bb76ff1Sjsg struct intel_engine_cs *tengine;
79*1bb76ff1Sjsg intel_engine_mask_t tmp, mask = engine->mask;
80*1bb76ff1Sjsg
81*1bb76ff1Sjsg for_each_engine_masked(tengine, gt, mask, tmp)
82*1bb76ff1Sjsg intel_wakeref_might_put(&tengine->wakeref);
83*1bb76ff1Sjsg }
84*1bb76ff1Sjsg intel_gt_pm_might_put(engine->gt);
85*1bb76ff1Sjsg }
86*1bb76ff1Sjsg
87c349dbc7Sjsg static inline struct i915_request *
intel_engine_create_kernel_request(struct intel_engine_cs * engine)88c349dbc7Sjsg intel_engine_create_kernel_request(struct intel_engine_cs *engine)
89c349dbc7Sjsg {
90c349dbc7Sjsg struct i915_request *rq;
91c349dbc7Sjsg
92c349dbc7Sjsg /*
93c349dbc7Sjsg * The engine->kernel_context is special as it is used inside
94c349dbc7Sjsg * the engine-pm barrier (see __engine_park()), circumventing
95c349dbc7Sjsg * the usual mutexes and relying on the engine-pm barrier
96c349dbc7Sjsg * instead. So whenever we use the engine->kernel_context
97c349dbc7Sjsg * outside of the barrier, we must manually handle the
98c349dbc7Sjsg * engine wakeref to serialise with the use inside.
99c349dbc7Sjsg */
100c349dbc7Sjsg intel_engine_pm_get(engine);
101c349dbc7Sjsg rq = i915_request_create(engine->kernel_context);
102c349dbc7Sjsg intel_engine_pm_put(engine);
103c349dbc7Sjsg
104c349dbc7Sjsg return rq;
105c349dbc7Sjsg }
106c349dbc7Sjsg
107c349dbc7Sjsg void intel_engine_init__pm(struct intel_engine_cs *engine);
108c349dbc7Sjsg
1093f069f93Sjsg void intel_engine_reset_pinned_contexts(struct intel_engine_cs *engine);
1103f069f93Sjsg
111c349dbc7Sjsg #endif /* INTEL_ENGINE_PM_H */
112