1 /* 2 * SPDX-License-Identifier: MIT 3 * 4 * Copyright © 2019 Intel Corporation 5 */ 6 7 #ifndef INTEL_ENGINE_PM_H 8 #define INTEL_ENGINE_PM_H 9 10 #include "i915_request.h" 11 #include "intel_engine_types.h" 12 #include "intel_wakeref.h" 13 14 static inline bool 15 intel_engine_pm_is_awake(const struct intel_engine_cs *engine) 16 { 17 return intel_wakeref_is_active(&engine->wakeref); 18 } 19 20 static inline void intel_engine_pm_get(struct intel_engine_cs *engine) 21 { 22 intel_wakeref_get(&engine->wakeref); 23 } 24 25 static inline bool intel_engine_pm_get_if_awake(struct intel_engine_cs *engine) 26 { 27 return intel_wakeref_get_if_active(&engine->wakeref); 28 } 29 30 static inline void intel_engine_pm_put(struct intel_engine_cs *engine) 31 { 32 intel_wakeref_put(&engine->wakeref); 33 } 34 35 static inline void intel_engine_pm_put_async(struct intel_engine_cs *engine) 36 { 37 intel_wakeref_put_async(&engine->wakeref); 38 } 39 40 static inline void intel_engine_pm_flush(struct intel_engine_cs *engine) 41 { 42 intel_wakeref_unlock_wait(&engine->wakeref); 43 } 44 45 static inline struct i915_request * 46 intel_engine_create_kernel_request(struct intel_engine_cs *engine) 47 { 48 struct i915_request *rq; 49 50 /* 51 * The engine->kernel_context is special as it is used inside 52 * the engine-pm barrier (see __engine_park()), circumventing 53 * the usual mutexes and relying on the engine-pm barrier 54 * instead. So whenever we use the engine->kernel_context 55 * outside of the barrier, we must manually handle the 56 * engine wakeref to serialise with the use inside. 57 */ 58 intel_engine_pm_get(engine); 59 rq = i915_request_create(engine->kernel_context); 60 intel_engine_pm_put(engine); 61 62 return rq; 63 } 64 65 void intel_engine_init__pm(struct intel_engine_cs *engine); 66 67 #endif /* INTEL_ENGINE_PM_H */ 68