1 /* SPDX-License-Identifier: MIT */ 2 /* 3 * Copyright © 2019 Intel Corporation 4 */ 5 6 #ifndef __INTEL_RUNTIME_PM_H__ 7 #define __INTEL_RUNTIME_PM_H__ 8 9 #include <linux/types.h> 10 11 #include "intel_display.h" 12 #include "intel_wakeref.h" 13 14 struct drm_i915_private; 15 struct drm_printer; 16 struct intel_encoder; 17 18 enum i915_drm_suspend_mode { 19 I915_DRM_SUSPEND_IDLE, 20 I915_DRM_SUSPEND_MEM, 21 I915_DRM_SUSPEND_HIBERNATE, 22 }; 23 24 void skl_enable_dc6(struct drm_i915_private *dev_priv); 25 void gen9_sanitize_dc_state(struct drm_i915_private *dev_priv); 26 void bxt_enable_dc9(struct drm_i915_private *dev_priv); 27 void bxt_disable_dc9(struct drm_i915_private *dev_priv); 28 void gen9_enable_dc5(struct drm_i915_private *dev_priv); 29 30 void intel_runtime_pm_init_early(struct drm_i915_private *dev_priv); 31 int intel_power_domains_init(struct drm_i915_private *); 32 void intel_power_domains_cleanup(struct drm_i915_private *dev_priv); 33 void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume); 34 void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv); 35 void icl_display_core_init(struct drm_i915_private *dev_priv, bool resume); 36 void icl_display_core_uninit(struct drm_i915_private *dev_priv); 37 void intel_power_domains_enable(struct drm_i915_private *dev_priv); 38 void intel_power_domains_disable(struct drm_i915_private *dev_priv); 39 void intel_power_domains_suspend(struct drm_i915_private *dev_priv, 40 enum i915_drm_suspend_mode); 41 void intel_power_domains_resume(struct drm_i915_private *dev_priv); 42 void hsw_enable_pc8(struct drm_i915_private *dev_priv); 43 void hsw_disable_pc8(struct drm_i915_private *dev_priv); 44 void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume); 45 void bxt_display_core_uninit(struct drm_i915_private *dev_priv); 46 void intel_runtime_pm_enable(struct drm_i915_private *dev_priv); 47 void intel_runtime_pm_disable(struct drm_i915_private *dev_priv); 48 void intel_runtime_pm_cleanup(struct drm_i915_private *dev_priv); 49 50 const char * 51 intel_display_power_domain_str(enum intel_display_power_domain domain); 52 53 bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv, 54 enum intel_display_power_domain domain); 55 bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv, 56 enum intel_display_power_domain domain); 57 intel_wakeref_t intel_display_power_get(struct drm_i915_private *dev_priv, 58 enum intel_display_power_domain domain); 59 intel_wakeref_t 60 intel_display_power_get_if_enabled(struct drm_i915_private *dev_priv, 61 enum intel_display_power_domain domain); 62 void intel_display_power_put_unchecked(struct drm_i915_private *dev_priv, 63 enum intel_display_power_domain domain); 64 void __intel_display_power_put_async(struct drm_i915_private *i915, 65 enum intel_display_power_domain domain, 66 intel_wakeref_t wakeref); 67 void intel_display_power_flush_work(struct drm_i915_private *i915); 68 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) 69 void intel_display_power_put(struct drm_i915_private *dev_priv, 70 enum intel_display_power_domain domain, 71 intel_wakeref_t wakeref); 72 static inline void 73 intel_display_power_put_async(struct drm_i915_private *i915, 74 enum intel_display_power_domain domain, 75 intel_wakeref_t wakeref) 76 { 77 __intel_display_power_put_async(i915, domain, wakeref); 78 } 79 #else 80 static inline void 81 intel_display_power_put(struct drm_i915_private *i915, 82 enum intel_display_power_domain domain, 83 intel_wakeref_t wakeref) 84 { 85 intel_display_power_put_unchecked(i915, domain); 86 } 87 88 static inline void 89 intel_display_power_put_async(struct drm_i915_private *i915, 90 enum intel_display_power_domain domain, 91 intel_wakeref_t wakeref) 92 { 93 __intel_display_power_put_async(i915, domain, -1); 94 } 95 #endif 96 97 #define with_intel_display_power(i915, domain, wf) \ 98 for ((wf) = intel_display_power_get((i915), (domain)); (wf); \ 99 intel_display_power_put_async((i915), (domain), (wf)), (wf) = 0) 100 101 void icl_dbuf_slices_update(struct drm_i915_private *dev_priv, 102 u8 req_slices); 103 104 intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915); 105 intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915); 106 intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915); 107 108 #define with_intel_runtime_pm(i915, wf) \ 109 for ((wf) = intel_runtime_pm_get(i915); (wf); \ 110 intel_runtime_pm_put((i915), (wf)), (wf) = 0) 111 112 #define with_intel_runtime_pm_if_in_use(i915, wf) \ 113 for ((wf) = intel_runtime_pm_get_if_in_use(i915); (wf); \ 114 intel_runtime_pm_put((i915), (wf)), (wf) = 0) 115 116 void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915); 117 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) 118 void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref); 119 #else 120 static inline void 121 intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref) 122 { 123 intel_runtime_pm_put_unchecked(i915); 124 } 125 #endif 126 127 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) 128 void print_intel_runtime_pm_wakeref(struct drm_i915_private *i915, 129 struct drm_printer *p); 130 #else 131 static inline void print_intel_runtime_pm_wakeref(struct drm_i915_private *i915, 132 struct drm_printer *p) 133 { 134 } 135 #endif 136 137 void chv_phy_powergate_lanes(struct intel_encoder *encoder, 138 bool override, unsigned int mask); 139 bool chv_phy_powergate_ch(struct drm_i915_private *dev_priv, enum dpio_phy phy, 140 enum dpio_channel ch, bool override); 141 142 #endif /* __INTEL_RUNTIME_PM_H__ */ 143