This source file includes following definitions.
- intel_display_power_put_async
- intel_display_power_put
- intel_display_power_put_async
   1 
   2 
   3 
   4 
   5 
   6 #ifndef __INTEL_DISPLAY_POWER_H__
   7 #define __INTEL_DISPLAY_POWER_H__
   8 
   9 #include "intel_display.h"
  10 #include "intel_runtime_pm.h"
  11 #include "i915_reg.h"
  12 
  13 struct drm_i915_private;
  14 struct intel_encoder;
  15 
  16 enum intel_display_power_domain {
  17         POWER_DOMAIN_DISPLAY_CORE,
  18         POWER_DOMAIN_PIPE_A,
  19         POWER_DOMAIN_PIPE_B,
  20         POWER_DOMAIN_PIPE_C,
  21         POWER_DOMAIN_PIPE_D,
  22         POWER_DOMAIN_PIPE_A_PANEL_FITTER,
  23         POWER_DOMAIN_PIPE_B_PANEL_FITTER,
  24         POWER_DOMAIN_PIPE_C_PANEL_FITTER,
  25         POWER_DOMAIN_PIPE_D_PANEL_FITTER,
  26         POWER_DOMAIN_TRANSCODER_A,
  27         POWER_DOMAIN_TRANSCODER_B,
  28         POWER_DOMAIN_TRANSCODER_C,
  29         POWER_DOMAIN_TRANSCODER_D,
  30         POWER_DOMAIN_TRANSCODER_EDP,
  31         
  32         POWER_DOMAIN_TRANSCODER_VDSC_PW2,
  33         POWER_DOMAIN_TRANSCODER_DSI_A,
  34         POWER_DOMAIN_TRANSCODER_DSI_C,
  35         POWER_DOMAIN_PORT_DDI_A_LANES,
  36         POWER_DOMAIN_PORT_DDI_B_LANES,
  37         POWER_DOMAIN_PORT_DDI_C_LANES,
  38         POWER_DOMAIN_PORT_DDI_D_LANES,
  39         POWER_DOMAIN_PORT_DDI_TC1_LANES = POWER_DOMAIN_PORT_DDI_D_LANES,
  40         POWER_DOMAIN_PORT_DDI_E_LANES,
  41         POWER_DOMAIN_PORT_DDI_TC2_LANES = POWER_DOMAIN_PORT_DDI_E_LANES,
  42         POWER_DOMAIN_PORT_DDI_F_LANES,
  43         POWER_DOMAIN_PORT_DDI_TC3_LANES = POWER_DOMAIN_PORT_DDI_F_LANES,
  44         POWER_DOMAIN_PORT_DDI_TC4_LANES,
  45         POWER_DOMAIN_PORT_DDI_TC5_LANES,
  46         POWER_DOMAIN_PORT_DDI_TC6_LANES,
  47         POWER_DOMAIN_PORT_DDI_A_IO,
  48         POWER_DOMAIN_PORT_DDI_B_IO,
  49         POWER_DOMAIN_PORT_DDI_C_IO,
  50         POWER_DOMAIN_PORT_DDI_D_IO,
  51         POWER_DOMAIN_PORT_DDI_TC1_IO = POWER_DOMAIN_PORT_DDI_D_IO,
  52         POWER_DOMAIN_PORT_DDI_E_IO,
  53         POWER_DOMAIN_PORT_DDI_TC2_IO = POWER_DOMAIN_PORT_DDI_E_IO,
  54         POWER_DOMAIN_PORT_DDI_F_IO,
  55         POWER_DOMAIN_PORT_DDI_TC3_IO = POWER_DOMAIN_PORT_DDI_F_IO,
  56         POWER_DOMAIN_PORT_DDI_G_IO,
  57         POWER_DOMAIN_PORT_DDI_TC4_IO = POWER_DOMAIN_PORT_DDI_G_IO,
  58         POWER_DOMAIN_PORT_DDI_H_IO,
  59         POWER_DOMAIN_PORT_DDI_TC5_IO = POWER_DOMAIN_PORT_DDI_H_IO,
  60         POWER_DOMAIN_PORT_DDI_I_IO,
  61         POWER_DOMAIN_PORT_DDI_TC6_IO = POWER_DOMAIN_PORT_DDI_I_IO,
  62         POWER_DOMAIN_PORT_DSI,
  63         POWER_DOMAIN_PORT_CRT,
  64         POWER_DOMAIN_PORT_OTHER,
  65         POWER_DOMAIN_VGA,
  66         POWER_DOMAIN_AUDIO,
  67         POWER_DOMAIN_AUX_A,
  68         POWER_DOMAIN_AUX_B,
  69         POWER_DOMAIN_AUX_C,
  70         POWER_DOMAIN_AUX_D,
  71         POWER_DOMAIN_AUX_TC1 = POWER_DOMAIN_AUX_D,
  72         POWER_DOMAIN_AUX_E,
  73         POWER_DOMAIN_AUX_TC2 = POWER_DOMAIN_AUX_E,
  74         POWER_DOMAIN_AUX_F,
  75         POWER_DOMAIN_AUX_TC3 = POWER_DOMAIN_AUX_F,
  76         POWER_DOMAIN_AUX_TC4,
  77         POWER_DOMAIN_AUX_TC5,
  78         POWER_DOMAIN_AUX_TC6,
  79         POWER_DOMAIN_AUX_IO_A,
  80         POWER_DOMAIN_AUX_TBT1,
  81         POWER_DOMAIN_AUX_TBT2,
  82         POWER_DOMAIN_AUX_TBT3,
  83         POWER_DOMAIN_AUX_TBT4,
  84         POWER_DOMAIN_AUX_TBT5,
  85         POWER_DOMAIN_AUX_TBT6,
  86         POWER_DOMAIN_GMBUS,
  87         POWER_DOMAIN_MODESET,
  88         POWER_DOMAIN_GT_IRQ,
  89         POWER_DOMAIN_DPLL_DC_OFF,
  90         POWER_DOMAIN_INIT,
  91 
  92         POWER_DOMAIN_NUM,
  93 };
  94 
  95 
  96 
  97 
  98 
  99 
 100 
 101 
 102 enum i915_power_well_id {
 103         DISP_PW_ID_NONE,
 104 
 105         VLV_DISP_PW_DISP2D,
 106         BXT_DISP_PW_DPIO_CMN_A,
 107         VLV_DISP_PW_DPIO_CMN_BC,
 108         GLK_DISP_PW_DPIO_CMN_C,
 109         CHV_DISP_PW_DPIO_CMN_D,
 110         HSW_DISP_PW_GLOBAL,
 111         SKL_DISP_PW_MISC_IO,
 112         SKL_DISP_PW_1,
 113         SKL_DISP_PW_2,
 114 };
 115 
 116 #define POWER_DOMAIN_PIPE(pipe) ((pipe) + POWER_DOMAIN_PIPE_A)
 117 #define POWER_DOMAIN_PIPE_PANEL_FITTER(pipe) \
 118                 ((pipe) + POWER_DOMAIN_PIPE_A_PANEL_FITTER)
 119 #define POWER_DOMAIN_TRANSCODER(tran) \
 120         ((tran) == TRANSCODER_EDP ? POWER_DOMAIN_TRANSCODER_EDP : \
 121          (tran) + POWER_DOMAIN_TRANSCODER_A)
 122 
 123 struct i915_power_well;
 124 
 125 struct i915_power_well_ops {
 126         
 127 
 128 
 129 
 130 
 131 
 132         void (*sync_hw)(struct drm_i915_private *dev_priv,
 133                         struct i915_power_well *power_well);
 134         
 135 
 136 
 137 
 138 
 139         void (*enable)(struct drm_i915_private *dev_priv,
 140                        struct i915_power_well *power_well);
 141         
 142 
 143 
 144 
 145         void (*disable)(struct drm_i915_private *dev_priv,
 146                         struct i915_power_well *power_well);
 147         
 148         bool (*is_enabled)(struct drm_i915_private *dev_priv,
 149                            struct i915_power_well *power_well);
 150 };
 151 
 152 struct i915_power_well_regs {
 153         i915_reg_t bios;
 154         i915_reg_t driver;
 155         i915_reg_t kvmr;
 156         i915_reg_t debug;
 157 };
 158 
 159 
 160 struct i915_power_well_desc {
 161         const char *name;
 162         bool always_on;
 163         u64 domains;
 164         
 165         enum i915_power_well_id id;
 166         
 167 
 168 
 169 
 170         union {
 171                 struct {
 172                         
 173 
 174 
 175 
 176                         u8 idx;
 177                 } vlv;
 178                 struct {
 179                         enum dpio_phy phy;
 180                 } bxt;
 181                 struct {
 182                         const struct i915_power_well_regs *regs;
 183                         
 184 
 185 
 186 
 187                         u8 idx;
 188                         
 189                         u8 irq_pipe_mask;
 190                         
 191                         bool has_vga:1;
 192                         bool has_fuses:1;
 193                         
 194 
 195 
 196 
 197                         bool is_tc_tbt:1;
 198                 } hsw;
 199         };
 200         const struct i915_power_well_ops *ops;
 201 };
 202 
 203 struct i915_power_well {
 204         const struct i915_power_well_desc *desc;
 205         
 206         int count;
 207         
 208         bool hw_enabled;
 209 };
 210 
 211 struct i915_power_domains {
 212         
 213 
 214 
 215 
 216         bool initializing;
 217         bool display_core_suspended;
 218         int power_well_count;
 219 
 220         intel_wakeref_t wakeref;
 221 
 222         struct mutex lock;
 223         int domain_use_count[POWER_DOMAIN_NUM];
 224 
 225         struct delayed_work async_put_work;
 226         intel_wakeref_t async_put_wakeref;
 227         u64 async_put_domains[2];
 228 
 229         struct i915_power_well *power_wells;
 230 };
 231 
 232 #define for_each_power_domain(domain, mask)                             \
 233         for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++)     \
 234                 for_each_if(BIT_ULL(domain) & (mask))
 235 
 236 #define for_each_power_well(__dev_priv, __power_well)                           \
 237         for ((__power_well) = (__dev_priv)->power_domains.power_wells;  \
 238              (__power_well) - (__dev_priv)->power_domains.power_wells < \
 239                 (__dev_priv)->power_domains.power_well_count;           \
 240              (__power_well)++)
 241 
 242 #define for_each_power_well_reverse(__dev_priv, __power_well)                   \
 243         for ((__power_well) = (__dev_priv)->power_domains.power_wells +         \
 244                               (__dev_priv)->power_domains.power_well_count - 1; \
 245              (__power_well) - (__dev_priv)->power_domains.power_wells >= 0;     \
 246              (__power_well)--)
 247 
 248 #define for_each_power_domain_well(__dev_priv, __power_well, __domain_mask)     \
 249         for_each_power_well(__dev_priv, __power_well)                           \
 250                 for_each_if((__power_well)->desc->domains & (__domain_mask))
 251 
 252 #define for_each_power_domain_well_reverse(__dev_priv, __power_well, __domain_mask) \
 253         for_each_power_well_reverse(__dev_priv, __power_well)                   \
 254                 for_each_if((__power_well)->desc->domains & (__domain_mask))
 255 
 256 int intel_power_domains_init(struct drm_i915_private *dev_priv);
 257 void intel_power_domains_cleanup(struct drm_i915_private *dev_priv);
 258 void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume);
 259 void intel_power_domains_driver_remove(struct drm_i915_private *dev_priv);
 260 void intel_power_domains_enable(struct drm_i915_private *dev_priv);
 261 void intel_power_domains_disable(struct drm_i915_private *dev_priv);
 262 void intel_power_domains_suspend(struct drm_i915_private *dev_priv,
 263                                  enum i915_drm_suspend_mode);
 264 void intel_power_domains_resume(struct drm_i915_private *dev_priv);
 265 
 266 void intel_display_power_suspend_late(struct drm_i915_private *i915);
 267 void intel_display_power_resume_early(struct drm_i915_private *i915);
 268 void intel_display_power_suspend(struct drm_i915_private *i915);
 269 void intel_display_power_resume(struct drm_i915_private *i915);
 270 
 271 const char *
 272 intel_display_power_domain_str(struct drm_i915_private *i915,
 273                                enum intel_display_power_domain domain);
 274 
 275 bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
 276                                     enum intel_display_power_domain domain);
 277 bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
 278                                       enum intel_display_power_domain domain);
 279 intel_wakeref_t intel_display_power_get(struct drm_i915_private *dev_priv,
 280                                         enum intel_display_power_domain domain);
 281 intel_wakeref_t
 282 intel_display_power_get_if_enabled(struct drm_i915_private *dev_priv,
 283                                    enum intel_display_power_domain domain);
 284 void intel_display_power_put_unchecked(struct drm_i915_private *dev_priv,
 285                                        enum intel_display_power_domain domain);
 286 void __intel_display_power_put_async(struct drm_i915_private *i915,
 287                                      enum intel_display_power_domain domain,
 288                                      intel_wakeref_t wakeref);
 289 void intel_display_power_flush_work(struct drm_i915_private *i915);
 290 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
 291 void intel_display_power_put(struct drm_i915_private *dev_priv,
 292                              enum intel_display_power_domain domain,
 293                              intel_wakeref_t wakeref);
 294 static inline void
 295 intel_display_power_put_async(struct drm_i915_private *i915,
 296                               enum intel_display_power_domain domain,
 297                               intel_wakeref_t wakeref)
 298 {
 299         __intel_display_power_put_async(i915, domain, wakeref);
 300 }
 301 #else
 302 static inline void
 303 intel_display_power_put(struct drm_i915_private *i915,
 304                         enum intel_display_power_domain domain,
 305                         intel_wakeref_t wakeref)
 306 {
 307         intel_display_power_put_unchecked(i915, domain);
 308 }
 309 
 310 static inline void
 311 intel_display_power_put_async(struct drm_i915_private *i915,
 312                               enum intel_display_power_domain domain,
 313                               intel_wakeref_t wakeref)
 314 {
 315         __intel_display_power_put_async(i915, domain, -1);
 316 }
 317 #endif
 318 
 319 #define with_intel_display_power(i915, domain, wf) \
 320         for ((wf) = intel_display_power_get((i915), (domain)); (wf); \
 321              intel_display_power_put_async((i915), (domain), (wf)), (wf) = 0)
 322 
 323 void icl_dbuf_slices_update(struct drm_i915_private *dev_priv,
 324                             u8 req_slices);
 325 
 326 void chv_phy_powergate_lanes(struct intel_encoder *encoder,
 327                              bool override, unsigned int mask);
 328 bool chv_phy_powergate_ch(struct drm_i915_private *dev_priv, enum dpio_phy phy,
 329                           enum dpio_channel ch, bool override);
 330 
 331 #endif