]> git.ipfire.org Git - thirdparty/linux.git/blob - drivers/gpu/drm/i915/display/intel_display_power.c
Merge branch 'nvme-5.7' of git://git.infradead.org/nvme into block-5.7
[thirdparty/linux.git] / drivers / gpu / drm / i915 / display / intel_display_power.c
1 /* SPDX-License-Identifier: MIT */
2 /*
3 * Copyright © 2019 Intel Corporation
4 */
5
6 #include "display/intel_crt.h"
7 #include "display/intel_dp.h"
8
9 #include "i915_drv.h"
10 #include "i915_irq.h"
11 #include "intel_cdclk.h"
12 #include "intel_combo_phy.h"
13 #include "intel_csr.h"
14 #include "intel_display_power.h"
15 #include "intel_display_types.h"
16 #include "intel_dpio_phy.h"
17 #include "intel_hotplug.h"
18 #include "intel_pm.h"
19 #include "intel_sideband.h"
20 #include "intel_tc.h"
21 #include "intel_vga.h"
22
23 bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,
24 enum i915_power_well_id power_well_id);
25
26 const char *
27 intel_display_power_domain_str(enum intel_display_power_domain domain)
28 {
29 switch (domain) {
30 case POWER_DOMAIN_DISPLAY_CORE:
31 return "DISPLAY_CORE";
32 case POWER_DOMAIN_PIPE_A:
33 return "PIPE_A";
34 case POWER_DOMAIN_PIPE_B:
35 return "PIPE_B";
36 case POWER_DOMAIN_PIPE_C:
37 return "PIPE_C";
38 case POWER_DOMAIN_PIPE_D:
39 return "PIPE_D";
40 case POWER_DOMAIN_PIPE_A_PANEL_FITTER:
41 return "PIPE_A_PANEL_FITTER";
42 case POWER_DOMAIN_PIPE_B_PANEL_FITTER:
43 return "PIPE_B_PANEL_FITTER";
44 case POWER_DOMAIN_PIPE_C_PANEL_FITTER:
45 return "PIPE_C_PANEL_FITTER";
46 case POWER_DOMAIN_PIPE_D_PANEL_FITTER:
47 return "PIPE_D_PANEL_FITTER";
48 case POWER_DOMAIN_TRANSCODER_A:
49 return "TRANSCODER_A";
50 case POWER_DOMAIN_TRANSCODER_B:
51 return "TRANSCODER_B";
52 case POWER_DOMAIN_TRANSCODER_C:
53 return "TRANSCODER_C";
54 case POWER_DOMAIN_TRANSCODER_D:
55 return "TRANSCODER_D";
56 case POWER_DOMAIN_TRANSCODER_EDP:
57 return "TRANSCODER_EDP";
58 case POWER_DOMAIN_TRANSCODER_VDSC_PW2:
59 return "TRANSCODER_VDSC_PW2";
60 case POWER_DOMAIN_TRANSCODER_DSI_A:
61 return "TRANSCODER_DSI_A";
62 case POWER_DOMAIN_TRANSCODER_DSI_C:
63 return "TRANSCODER_DSI_C";
64 case POWER_DOMAIN_PORT_DDI_A_LANES:
65 return "PORT_DDI_A_LANES";
66 case POWER_DOMAIN_PORT_DDI_B_LANES:
67 return "PORT_DDI_B_LANES";
68 case POWER_DOMAIN_PORT_DDI_C_LANES:
69 return "PORT_DDI_C_LANES";
70 case POWER_DOMAIN_PORT_DDI_D_LANES:
71 return "PORT_DDI_D_LANES";
72 case POWER_DOMAIN_PORT_DDI_E_LANES:
73 return "PORT_DDI_E_LANES";
74 case POWER_DOMAIN_PORT_DDI_F_LANES:
75 return "PORT_DDI_F_LANES";
76 case POWER_DOMAIN_PORT_DDI_G_LANES:
77 return "PORT_DDI_G_LANES";
78 case POWER_DOMAIN_PORT_DDI_H_LANES:
79 return "PORT_DDI_H_LANES";
80 case POWER_DOMAIN_PORT_DDI_I_LANES:
81 return "PORT_DDI_I_LANES";
82 case POWER_DOMAIN_PORT_DDI_A_IO:
83 return "PORT_DDI_A_IO";
84 case POWER_DOMAIN_PORT_DDI_B_IO:
85 return "PORT_DDI_B_IO";
86 case POWER_DOMAIN_PORT_DDI_C_IO:
87 return "PORT_DDI_C_IO";
88 case POWER_DOMAIN_PORT_DDI_D_IO:
89 return "PORT_DDI_D_IO";
90 case POWER_DOMAIN_PORT_DDI_E_IO:
91 return "PORT_DDI_E_IO";
92 case POWER_DOMAIN_PORT_DDI_F_IO:
93 return "PORT_DDI_F_IO";
94 case POWER_DOMAIN_PORT_DDI_G_IO:
95 return "PORT_DDI_G_IO";
96 case POWER_DOMAIN_PORT_DDI_H_IO:
97 return "PORT_DDI_H_IO";
98 case POWER_DOMAIN_PORT_DDI_I_IO:
99 return "PORT_DDI_I_IO";
100 case POWER_DOMAIN_PORT_DSI:
101 return "PORT_DSI";
102 case POWER_DOMAIN_PORT_CRT:
103 return "PORT_CRT";
104 case POWER_DOMAIN_PORT_OTHER:
105 return "PORT_OTHER";
106 case POWER_DOMAIN_VGA:
107 return "VGA";
108 case POWER_DOMAIN_AUDIO:
109 return "AUDIO";
110 case POWER_DOMAIN_AUX_A:
111 return "AUX_A";
112 case POWER_DOMAIN_AUX_B:
113 return "AUX_B";
114 case POWER_DOMAIN_AUX_C:
115 return "AUX_C";
116 case POWER_DOMAIN_AUX_D:
117 return "AUX_D";
118 case POWER_DOMAIN_AUX_E:
119 return "AUX_E";
120 case POWER_DOMAIN_AUX_F:
121 return "AUX_F";
122 case POWER_DOMAIN_AUX_G:
123 return "AUX_G";
124 case POWER_DOMAIN_AUX_H:
125 return "AUX_H";
126 case POWER_DOMAIN_AUX_I:
127 return "AUX_I";
128 case POWER_DOMAIN_AUX_IO_A:
129 return "AUX_IO_A";
130 case POWER_DOMAIN_AUX_C_TBT:
131 return "AUX_C_TBT";
132 case POWER_DOMAIN_AUX_D_TBT:
133 return "AUX_D_TBT";
134 case POWER_DOMAIN_AUX_E_TBT:
135 return "AUX_E_TBT";
136 case POWER_DOMAIN_AUX_F_TBT:
137 return "AUX_F_TBT";
138 case POWER_DOMAIN_AUX_G_TBT:
139 return "AUX_G_TBT";
140 case POWER_DOMAIN_AUX_H_TBT:
141 return "AUX_H_TBT";
142 case POWER_DOMAIN_AUX_I_TBT:
143 return "AUX_I_TBT";
144 case POWER_DOMAIN_GMBUS:
145 return "GMBUS";
146 case POWER_DOMAIN_INIT:
147 return "INIT";
148 case POWER_DOMAIN_MODESET:
149 return "MODESET";
150 case POWER_DOMAIN_GT_IRQ:
151 return "GT_IRQ";
152 case POWER_DOMAIN_DPLL_DC_OFF:
153 return "DPLL_DC_OFF";
154 default:
155 MISSING_CASE(domain);
156 return "?";
157 }
158 }
159
160 static void intel_power_well_enable(struct drm_i915_private *dev_priv,
161 struct i915_power_well *power_well)
162 {
163 drm_dbg_kms(&dev_priv->drm, "enabling %s\n", power_well->desc->name);
164 power_well->desc->ops->enable(dev_priv, power_well);
165 power_well->hw_enabled = true;
166 }
167
168 static void intel_power_well_disable(struct drm_i915_private *dev_priv,
169 struct i915_power_well *power_well)
170 {
171 drm_dbg_kms(&dev_priv->drm, "disabling %s\n", power_well->desc->name);
172 power_well->hw_enabled = false;
173 power_well->desc->ops->disable(dev_priv, power_well);
174 }
175
176 static void intel_power_well_get(struct drm_i915_private *dev_priv,
177 struct i915_power_well *power_well)
178 {
179 if (!power_well->count++)
180 intel_power_well_enable(dev_priv, power_well);
181 }
182
183 static void intel_power_well_put(struct drm_i915_private *dev_priv,
184 struct i915_power_well *power_well)
185 {
186 drm_WARN(&dev_priv->drm, !power_well->count,
187 "Use count on power well %s is already zero",
188 power_well->desc->name);
189
190 if (!--power_well->count)
191 intel_power_well_disable(dev_priv, power_well);
192 }
193
194 /**
195 * __intel_display_power_is_enabled - unlocked check for a power domain
196 * @dev_priv: i915 device instance
197 * @domain: power domain to check
198 *
199 * This is the unlocked version of intel_display_power_is_enabled() and should
200 * only be used from error capture and recovery code where deadlocks are
201 * possible.
202 *
203 * Returns:
204 * True when the power domain is enabled, false otherwise.
205 */
206 bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
207 enum intel_display_power_domain domain)
208 {
209 struct i915_power_well *power_well;
210 bool is_enabled;
211
212 if (dev_priv->runtime_pm.suspended)
213 return false;
214
215 is_enabled = true;
216
217 for_each_power_domain_well_reverse(dev_priv, power_well, BIT_ULL(domain)) {
218 if (power_well->desc->always_on)
219 continue;
220
221 if (!power_well->hw_enabled) {
222 is_enabled = false;
223 break;
224 }
225 }
226
227 return is_enabled;
228 }
229
230 /**
231 * intel_display_power_is_enabled - check for a power domain
232 * @dev_priv: i915 device instance
233 * @domain: power domain to check
234 *
235 * This function can be used to check the hw power domain state. It is mostly
236 * used in hardware state readout functions. Everywhere else code should rely
237 * upon explicit power domain reference counting to ensure that the hardware
238 * block is powered up before accessing it.
239 *
240 * Callers must hold the relevant modesetting locks to ensure that concurrent
241 * threads can't disable the power well while the caller tries to read a few
242 * registers.
243 *
244 * Returns:
245 * True when the power domain is enabled, false otherwise.
246 */
247 bool intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
248 enum intel_display_power_domain domain)
249 {
250 struct i915_power_domains *power_domains;
251 bool ret;
252
253 power_domains = &dev_priv->power_domains;
254
255 mutex_lock(&power_domains->lock);
256 ret = __intel_display_power_is_enabled(dev_priv, domain);
257 mutex_unlock(&power_domains->lock);
258
259 return ret;
260 }
261
262 /*
263 * Starting with Haswell, we have a "Power Down Well" that can be turned off
264 * when not needed anymore. We have 4 registers that can request the power well
265 * to be enabled, and it will only be disabled if none of the registers is
266 * requesting it to be enabled.
267 */
268 static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv,
269 u8 irq_pipe_mask, bool has_vga)
270 {
271 if (has_vga)
272 intel_vga_reset_io_mem(dev_priv);
273
274 if (irq_pipe_mask)
275 gen8_irq_power_well_post_enable(dev_priv, irq_pipe_mask);
276 }
277
278 static void hsw_power_well_pre_disable(struct drm_i915_private *dev_priv,
279 u8 irq_pipe_mask)
280 {
281 if (irq_pipe_mask)
282 gen8_irq_power_well_pre_disable(dev_priv, irq_pipe_mask);
283 }
284
285 static void hsw_wait_for_power_well_enable(struct drm_i915_private *dev_priv,
286 struct i915_power_well *power_well)
287 {
288 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
289 int pw_idx = power_well->desc->hsw.idx;
290
291 /* Timeout for PW1:10 us, AUX:not specified, other PWs:20 us. */
292 if (intel_de_wait_for_set(dev_priv, regs->driver,
293 HSW_PWR_WELL_CTL_STATE(pw_idx), 1)) {
294 drm_dbg_kms(&dev_priv->drm, "%s power well enable timeout\n",
295 power_well->desc->name);
296
297 /* An AUX timeout is expected if the TBT DP tunnel is down. */
298 drm_WARN_ON(&dev_priv->drm, !power_well->desc->hsw.is_tc_tbt);
299 }
300 }
301
302 static u32 hsw_power_well_requesters(struct drm_i915_private *dev_priv,
303 const struct i915_power_well_regs *regs,
304 int pw_idx)
305 {
306 u32 req_mask = HSW_PWR_WELL_CTL_REQ(pw_idx);
307 u32 ret;
308
309 ret = intel_de_read(dev_priv, regs->bios) & req_mask ? 1 : 0;
310 ret |= intel_de_read(dev_priv, regs->driver) & req_mask ? 2 : 0;
311 if (regs->kvmr.reg)
312 ret |= intel_de_read(dev_priv, regs->kvmr) & req_mask ? 4 : 0;
313 ret |= intel_de_read(dev_priv, regs->debug) & req_mask ? 8 : 0;
314
315 return ret;
316 }
317
318 static void hsw_wait_for_power_well_disable(struct drm_i915_private *dev_priv,
319 struct i915_power_well *power_well)
320 {
321 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
322 int pw_idx = power_well->desc->hsw.idx;
323 bool disabled;
324 u32 reqs;
325
326 /*
327 * Bspec doesn't require waiting for PWs to get disabled, but still do
328 * this for paranoia. The known cases where a PW will be forced on:
329 * - a KVMR request on any power well via the KVMR request register
330 * - a DMC request on PW1 and MISC_IO power wells via the BIOS and
331 * DEBUG request registers
332 * Skip the wait in case any of the request bits are set and print a
333 * diagnostic message.
334 */
335 wait_for((disabled = !(intel_de_read(dev_priv, regs->driver) &
336 HSW_PWR_WELL_CTL_STATE(pw_idx))) ||
337 (reqs = hsw_power_well_requesters(dev_priv, regs, pw_idx)), 1);
338 if (disabled)
339 return;
340
341 drm_dbg_kms(&dev_priv->drm,
342 "%s forced on (bios:%d driver:%d kvmr:%d debug:%d)\n",
343 power_well->desc->name,
344 !!(reqs & 1), !!(reqs & 2), !!(reqs & 4), !!(reqs & 8));
345 }
346
347 static void gen9_wait_for_power_well_fuses(struct drm_i915_private *dev_priv,
348 enum skl_power_gate pg)
349 {
350 /* Timeout 5us for PG#0, for other PGs 1us */
351 drm_WARN_ON(&dev_priv->drm,
352 intel_de_wait_for_set(dev_priv, SKL_FUSE_STATUS,
353 SKL_FUSE_PG_DIST_STATUS(pg), 1));
354 }
355
356 static void hsw_power_well_enable(struct drm_i915_private *dev_priv,
357 struct i915_power_well *power_well)
358 {
359 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
360 int pw_idx = power_well->desc->hsw.idx;
361 bool wait_fuses = power_well->desc->hsw.has_fuses;
362 enum skl_power_gate uninitialized_var(pg);
363 u32 val;
364
365 if (wait_fuses) {
366 pg = INTEL_GEN(dev_priv) >= 11 ? ICL_PW_CTL_IDX_TO_PG(pw_idx) :
367 SKL_PW_CTL_IDX_TO_PG(pw_idx);
368 /*
369 * For PW1 we have to wait both for the PW0/PG0 fuse state
370 * before enabling the power well and PW1/PG1's own fuse
371 * state after the enabling. For all other power wells with
372 * fuses we only have to wait for that PW/PG's fuse state
373 * after the enabling.
374 */
375 if (pg == SKL_PG1)
376 gen9_wait_for_power_well_fuses(dev_priv, SKL_PG0);
377 }
378
379 val = intel_de_read(dev_priv, regs->driver);
380 intel_de_write(dev_priv, regs->driver,
381 val | HSW_PWR_WELL_CTL_REQ(pw_idx));
382 hsw_wait_for_power_well_enable(dev_priv, power_well);
383
384 /* Display WA #1178: cnl */
385 if (IS_CANNONLAKE(dev_priv) &&
386 pw_idx >= GLK_PW_CTL_IDX_AUX_B &&
387 pw_idx <= CNL_PW_CTL_IDX_AUX_F) {
388 val = intel_de_read(dev_priv, CNL_AUX_ANAOVRD1(pw_idx));
389 val |= CNL_AUX_ANAOVRD1_ENABLE | CNL_AUX_ANAOVRD1_LDO_BYPASS;
390 intel_de_write(dev_priv, CNL_AUX_ANAOVRD1(pw_idx), val);
391 }
392
393 if (wait_fuses)
394 gen9_wait_for_power_well_fuses(dev_priv, pg);
395
396 hsw_power_well_post_enable(dev_priv,
397 power_well->desc->hsw.irq_pipe_mask,
398 power_well->desc->hsw.has_vga);
399 }
400
401 static void hsw_power_well_disable(struct drm_i915_private *dev_priv,
402 struct i915_power_well *power_well)
403 {
404 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
405 int pw_idx = power_well->desc->hsw.idx;
406 u32 val;
407
408 hsw_power_well_pre_disable(dev_priv,
409 power_well->desc->hsw.irq_pipe_mask);
410
411 val = intel_de_read(dev_priv, regs->driver);
412 intel_de_write(dev_priv, regs->driver,
413 val & ~HSW_PWR_WELL_CTL_REQ(pw_idx));
414 hsw_wait_for_power_well_disable(dev_priv, power_well);
415 }
416
417 #define ICL_AUX_PW_TO_PHY(pw_idx) ((pw_idx) - ICL_PW_CTL_IDX_AUX_A)
418
419 static void
420 icl_combo_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
421 struct i915_power_well *power_well)
422 {
423 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
424 int pw_idx = power_well->desc->hsw.idx;
425 enum phy phy = ICL_AUX_PW_TO_PHY(pw_idx);
426 u32 val;
427
428 drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv));
429
430 val = intel_de_read(dev_priv, regs->driver);
431 intel_de_write(dev_priv, regs->driver,
432 val | HSW_PWR_WELL_CTL_REQ(pw_idx));
433
434 if (INTEL_GEN(dev_priv) < 12) {
435 val = intel_de_read(dev_priv, ICL_PORT_CL_DW12(phy));
436 intel_de_write(dev_priv, ICL_PORT_CL_DW12(phy),
437 val | ICL_LANE_ENABLE_AUX);
438 }
439
440 hsw_wait_for_power_well_enable(dev_priv, power_well);
441
442 /* Display WA #1178: icl */
443 if (pw_idx >= ICL_PW_CTL_IDX_AUX_A && pw_idx <= ICL_PW_CTL_IDX_AUX_B &&
444 !intel_bios_is_port_edp(dev_priv, (enum port)phy)) {
445 val = intel_de_read(dev_priv, ICL_AUX_ANAOVRD1(pw_idx));
446 val |= ICL_AUX_ANAOVRD1_ENABLE | ICL_AUX_ANAOVRD1_LDO_BYPASS;
447 intel_de_write(dev_priv, ICL_AUX_ANAOVRD1(pw_idx), val);
448 }
449 }
450
451 static void
452 icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
453 struct i915_power_well *power_well)
454 {
455 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
456 int pw_idx = power_well->desc->hsw.idx;
457 enum phy phy = ICL_AUX_PW_TO_PHY(pw_idx);
458 u32 val;
459
460 drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv));
461
462 val = intel_de_read(dev_priv, ICL_PORT_CL_DW12(phy));
463 intel_de_write(dev_priv, ICL_PORT_CL_DW12(phy),
464 val & ~ICL_LANE_ENABLE_AUX);
465
466 val = intel_de_read(dev_priv, regs->driver);
467 intel_de_write(dev_priv, regs->driver,
468 val & ~HSW_PWR_WELL_CTL_REQ(pw_idx));
469
470 hsw_wait_for_power_well_disable(dev_priv, power_well);
471 }
472
473 #define ICL_AUX_PW_TO_CH(pw_idx) \
474 ((pw_idx) - ICL_PW_CTL_IDX_AUX_A + AUX_CH_A)
475
476 #define ICL_TBT_AUX_PW_TO_CH(pw_idx) \
477 ((pw_idx) - ICL_PW_CTL_IDX_AUX_TBT1 + AUX_CH_C)
478
479 static enum aux_ch icl_tc_phy_aux_ch(struct drm_i915_private *dev_priv,
480 struct i915_power_well *power_well)
481 {
482 int pw_idx = power_well->desc->hsw.idx;
483
484 return power_well->desc->hsw.is_tc_tbt ? ICL_TBT_AUX_PW_TO_CH(pw_idx) :
485 ICL_AUX_PW_TO_CH(pw_idx);
486 }
487
488 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
489
490 static u64 async_put_domains_mask(struct i915_power_domains *power_domains);
491
492 static int power_well_async_ref_count(struct drm_i915_private *dev_priv,
493 struct i915_power_well *power_well)
494 {
495 int refs = hweight64(power_well->desc->domains &
496 async_put_domains_mask(&dev_priv->power_domains));
497
498 drm_WARN_ON(&dev_priv->drm, refs > power_well->count);
499
500 return refs;
501 }
502
503 static void icl_tc_port_assert_ref_held(struct drm_i915_private *dev_priv,
504 struct i915_power_well *power_well)
505 {
506 enum aux_ch aux_ch = icl_tc_phy_aux_ch(dev_priv, power_well);
507 struct intel_digital_port *dig_port = NULL;
508 struct intel_encoder *encoder;
509
510 /* Bypass the check if all references are released asynchronously */
511 if (power_well_async_ref_count(dev_priv, power_well) ==
512 power_well->count)
513 return;
514
515 aux_ch = icl_tc_phy_aux_ch(dev_priv, power_well);
516
517 for_each_intel_encoder(&dev_priv->drm, encoder) {
518 enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
519
520 if (!intel_phy_is_tc(dev_priv, phy))
521 continue;
522
523 /* We'll check the MST primary port */
524 if (encoder->type == INTEL_OUTPUT_DP_MST)
525 continue;
526
527 dig_port = enc_to_dig_port(encoder);
528 if (drm_WARN_ON(&dev_priv->drm, !dig_port))
529 continue;
530
531 if (dig_port->aux_ch != aux_ch) {
532 dig_port = NULL;
533 continue;
534 }
535
536 break;
537 }
538
539 if (drm_WARN_ON(&dev_priv->drm, !dig_port))
540 return;
541
542 drm_WARN_ON(&dev_priv->drm, !intel_tc_port_ref_held(dig_port));
543 }
544
545 #else
546
547 static void icl_tc_port_assert_ref_held(struct drm_i915_private *dev_priv,
548 struct i915_power_well *power_well)
549 {
550 }
551
552 #endif
553
554 #define TGL_AUX_PW_TO_TC_PORT(pw_idx) ((pw_idx) - TGL_PW_CTL_IDX_AUX_TC1)
555
556 static void
557 icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
558 struct i915_power_well *power_well)
559 {
560 enum aux_ch aux_ch = icl_tc_phy_aux_ch(dev_priv, power_well);
561 u32 val;
562
563 icl_tc_port_assert_ref_held(dev_priv, power_well);
564
565 val = intel_de_read(dev_priv, DP_AUX_CH_CTL(aux_ch));
566 val &= ~DP_AUX_CH_CTL_TBT_IO;
567 if (power_well->desc->hsw.is_tc_tbt)
568 val |= DP_AUX_CH_CTL_TBT_IO;
569 intel_de_write(dev_priv, DP_AUX_CH_CTL(aux_ch), val);
570
571 hsw_power_well_enable(dev_priv, power_well);
572
573 if (INTEL_GEN(dev_priv) >= 12 && !power_well->desc->hsw.is_tc_tbt) {
574 enum tc_port tc_port;
575
576 tc_port = TGL_AUX_PW_TO_TC_PORT(power_well->desc->hsw.idx);
577 intel_de_write(dev_priv, HIP_INDEX_REG(tc_port),
578 HIP_INDEX_VAL(tc_port, 0x2));
579
580 if (intel_de_wait_for_set(dev_priv, DKL_CMN_UC_DW_27(tc_port),
581 DKL_CMN_UC_DW27_UC_HEALTH, 1))
582 drm_warn(&dev_priv->drm,
583 "Timeout waiting TC uC health\n");
584 }
585 }
586
587 static void
588 icl_tc_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
589 struct i915_power_well *power_well)
590 {
591 icl_tc_port_assert_ref_held(dev_priv, power_well);
592
593 hsw_power_well_disable(dev_priv, power_well);
594 }
595
596 /*
597 * We should only use the power well if we explicitly asked the hardware to
598 * enable it, so check if it's enabled and also check if we've requested it to
599 * be enabled.
600 */
601 static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv,
602 struct i915_power_well *power_well)
603 {
604 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
605 enum i915_power_well_id id = power_well->desc->id;
606 int pw_idx = power_well->desc->hsw.idx;
607 u32 mask = HSW_PWR_WELL_CTL_REQ(pw_idx) |
608 HSW_PWR_WELL_CTL_STATE(pw_idx);
609 u32 val;
610
611 val = intel_de_read(dev_priv, regs->driver);
612
613 /*
614 * On GEN9 big core due to a DMC bug the driver's request bits for PW1
615 * and the MISC_IO PW will be not restored, so check instead for the
616 * BIOS's own request bits, which are forced-on for these power wells
617 * when exiting DC5/6.
618 */
619 if (IS_GEN(dev_priv, 9) && !IS_GEN9_LP(dev_priv) &&
620 (id == SKL_DISP_PW_1 || id == SKL_DISP_PW_MISC_IO))
621 val |= intel_de_read(dev_priv, regs->bios);
622
623 return (val & mask) == mask;
624 }
625
626 static void assert_can_enable_dc9(struct drm_i915_private *dev_priv)
627 {
628 drm_WARN_ONCE(&dev_priv->drm,
629 (intel_de_read(dev_priv, DC_STATE_EN) & DC_STATE_EN_DC9),
630 "DC9 already programmed to be enabled.\n");
631 drm_WARN_ONCE(&dev_priv->drm,
632 intel_de_read(dev_priv, DC_STATE_EN) &
633 DC_STATE_EN_UPTO_DC5,
634 "DC5 still not disabled to enable DC9.\n");
635 drm_WARN_ONCE(&dev_priv->drm,
636 intel_de_read(dev_priv, HSW_PWR_WELL_CTL2) &
637 HSW_PWR_WELL_CTL_REQ(SKL_PW_CTL_IDX_PW_2),
638 "Power well 2 on.\n");
639 drm_WARN_ONCE(&dev_priv->drm, intel_irqs_enabled(dev_priv),
640 "Interrupts not disabled yet.\n");
641
642 /*
643 * TODO: check for the following to verify the conditions to enter DC9
644 * state are satisfied:
645 * 1] Check relevant display engine registers to verify if mode set
646 * disable sequence was followed.
647 * 2] Check if display uninitialize sequence is initialized.
648 */
649 }
650
651 static void assert_can_disable_dc9(struct drm_i915_private *dev_priv)
652 {
653 drm_WARN_ONCE(&dev_priv->drm, intel_irqs_enabled(dev_priv),
654 "Interrupts not disabled yet.\n");
655 drm_WARN_ONCE(&dev_priv->drm,
656 intel_de_read(dev_priv, DC_STATE_EN) &
657 DC_STATE_EN_UPTO_DC5,
658 "DC5 still not disabled.\n");
659
660 /*
661 * TODO: check for the following to verify DC9 state was indeed
662 * entered before programming to disable it:
663 * 1] Check relevant display engine registers to verify if mode
664 * set disable sequence was followed.
665 * 2] Check if display uninitialize sequence is initialized.
666 */
667 }
668
669 static void gen9_write_dc_state(struct drm_i915_private *dev_priv,
670 u32 state)
671 {
672 int rewrites = 0;
673 int rereads = 0;
674 u32 v;
675
676 intel_de_write(dev_priv, DC_STATE_EN, state);
677
678 /* It has been observed that disabling the dc6 state sometimes
679 * doesn't stick and dmc keeps returning old value. Make sure
680 * the write really sticks enough times and also force rewrite until
681 * we are confident that state is exactly what we want.
682 */
683 do {
684 v = intel_de_read(dev_priv, DC_STATE_EN);
685
686 if (v != state) {
687 intel_de_write(dev_priv, DC_STATE_EN, state);
688 rewrites++;
689 rereads = 0;
690 } else if (rereads++ > 5) {
691 break;
692 }
693
694 } while (rewrites < 100);
695
696 if (v != state)
697 drm_err(&dev_priv->drm,
698 "Writing dc state to 0x%x failed, now 0x%x\n",
699 state, v);
700
701 /* Most of the times we need one retry, avoid spam */
702 if (rewrites > 1)
703 drm_dbg_kms(&dev_priv->drm,
704 "Rewrote dc state to 0x%x %d times\n",
705 state, rewrites);
706 }
707
708 static u32 gen9_dc_mask(struct drm_i915_private *dev_priv)
709 {
710 u32 mask;
711
712 mask = DC_STATE_EN_UPTO_DC5;
713
714 if (INTEL_GEN(dev_priv) >= 12)
715 mask |= DC_STATE_EN_DC3CO | DC_STATE_EN_UPTO_DC6
716 | DC_STATE_EN_DC9;
717 else if (IS_GEN(dev_priv, 11))
718 mask |= DC_STATE_EN_UPTO_DC6 | DC_STATE_EN_DC9;
719 else if (IS_GEN9_LP(dev_priv))
720 mask |= DC_STATE_EN_DC9;
721 else
722 mask |= DC_STATE_EN_UPTO_DC6;
723
724 return mask;
725 }
726
727 static void gen9_sanitize_dc_state(struct drm_i915_private *dev_priv)
728 {
729 u32 val;
730
731 val = intel_de_read(dev_priv, DC_STATE_EN) & gen9_dc_mask(dev_priv);
732
733 drm_dbg_kms(&dev_priv->drm,
734 "Resetting DC state tracking from %02x to %02x\n",
735 dev_priv->csr.dc_state, val);
736 dev_priv->csr.dc_state = val;
737 }
738
739 /**
740 * gen9_set_dc_state - set target display C power state
741 * @dev_priv: i915 device instance
742 * @state: target DC power state
743 * - DC_STATE_DISABLE
744 * - DC_STATE_EN_UPTO_DC5
745 * - DC_STATE_EN_UPTO_DC6
746 * - DC_STATE_EN_DC9
747 *
748 * Signal to DMC firmware/HW the target DC power state passed in @state.
749 * DMC/HW can turn off individual display clocks and power rails when entering
750 * a deeper DC power state (higher in number) and turns these back when exiting
751 * that state to a shallower power state (lower in number). The HW will decide
752 * when to actually enter a given state on an on-demand basis, for instance
753 * depending on the active state of display pipes. The state of display
754 * registers backed by affected power rails are saved/restored as needed.
755 *
756 * Based on the above enabling a deeper DC power state is asynchronous wrt.
757 * enabling it. Disabling a deeper power state is synchronous: for instance
758 * setting %DC_STATE_DISABLE won't complete until all HW resources are turned
759 * back on and register state is restored. This is guaranteed by the MMIO write
760 * to DC_STATE_EN blocking until the state is restored.
761 */
762 static void gen9_set_dc_state(struct drm_i915_private *dev_priv, u32 state)
763 {
764 u32 val;
765 u32 mask;
766
767 if (drm_WARN_ON_ONCE(&dev_priv->drm,
768 state & ~dev_priv->csr.allowed_dc_mask))
769 state &= dev_priv->csr.allowed_dc_mask;
770
771 val = intel_de_read(dev_priv, DC_STATE_EN);
772 mask = gen9_dc_mask(dev_priv);
773 drm_dbg_kms(&dev_priv->drm, "Setting DC state from %02x to %02x\n",
774 val & mask, state);
775
776 /* Check if DMC is ignoring our DC state requests */
777 if ((val & mask) != dev_priv->csr.dc_state)
778 drm_err(&dev_priv->drm, "DC state mismatch (0x%x -> 0x%x)\n",
779 dev_priv->csr.dc_state, val & mask);
780
781 val &= ~mask;
782 val |= state;
783
784 gen9_write_dc_state(dev_priv, val);
785
786 dev_priv->csr.dc_state = val & mask;
787 }
788
789 static u32
790 sanitize_target_dc_state(struct drm_i915_private *dev_priv,
791 u32 target_dc_state)
792 {
793 u32 states[] = {
794 DC_STATE_EN_UPTO_DC6,
795 DC_STATE_EN_UPTO_DC5,
796 DC_STATE_EN_DC3CO,
797 DC_STATE_DISABLE,
798 };
799 int i;
800
801 for (i = 0; i < ARRAY_SIZE(states) - 1; i++) {
802 if (target_dc_state != states[i])
803 continue;
804
805 if (dev_priv->csr.allowed_dc_mask & target_dc_state)
806 break;
807
808 target_dc_state = states[i + 1];
809 }
810
811 return target_dc_state;
812 }
813
814 static void tgl_enable_dc3co(struct drm_i915_private *dev_priv)
815 {
816 drm_dbg_kms(&dev_priv->drm, "Enabling DC3CO\n");
817 gen9_set_dc_state(dev_priv, DC_STATE_EN_DC3CO);
818 }
819
820 static void tgl_disable_dc3co(struct drm_i915_private *dev_priv)
821 {
822 u32 val;
823
824 drm_dbg_kms(&dev_priv->drm, "Disabling DC3CO\n");
825 val = intel_de_read(dev_priv, DC_STATE_EN);
826 val &= ~DC_STATE_DC3CO_STATUS;
827 intel_de_write(dev_priv, DC_STATE_EN, val);
828 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
829 /*
830 * Delay of 200us DC3CO Exit time B.Spec 49196
831 */
832 usleep_range(200, 210);
833 }
834
835 static void bxt_enable_dc9(struct drm_i915_private *dev_priv)
836 {
837 assert_can_enable_dc9(dev_priv);
838
839 drm_dbg_kms(&dev_priv->drm, "Enabling DC9\n");
840 /*
841 * Power sequencer reset is not needed on
842 * platforms with South Display Engine on PCH,
843 * because PPS registers are always on.
844 */
845 if (!HAS_PCH_SPLIT(dev_priv))
846 intel_power_sequencer_reset(dev_priv);
847 gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9);
848 }
849
850 static void bxt_disable_dc9(struct drm_i915_private *dev_priv)
851 {
852 assert_can_disable_dc9(dev_priv);
853
854 drm_dbg_kms(&dev_priv->drm, "Disabling DC9\n");
855
856 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
857
858 intel_pps_unlock_regs_wa(dev_priv);
859 }
860
861 static void assert_csr_loaded(struct drm_i915_private *dev_priv)
862 {
863 drm_WARN_ONCE(&dev_priv->drm,
864 !intel_de_read(dev_priv, CSR_PROGRAM(0)),
865 "CSR program storage start is NULL\n");
866 drm_WARN_ONCE(&dev_priv->drm, !intel_de_read(dev_priv, CSR_SSP_BASE),
867 "CSR SSP Base Not fine\n");
868 drm_WARN_ONCE(&dev_priv->drm, !intel_de_read(dev_priv, CSR_HTP_SKL),
869 "CSR HTP Not fine\n");
870 }
871
872 static struct i915_power_well *
873 lookup_power_well(struct drm_i915_private *dev_priv,
874 enum i915_power_well_id power_well_id)
875 {
876 struct i915_power_well *power_well;
877
878 for_each_power_well(dev_priv, power_well)
879 if (power_well->desc->id == power_well_id)
880 return power_well;
881
882 /*
883 * It's not feasible to add error checking code to the callers since
884 * this condition really shouldn't happen and it doesn't even make sense
885 * to abort things like display initialization sequences. Just return
886 * the first power well and hope the WARN gets reported so we can fix
887 * our driver.
888 */
889 drm_WARN(&dev_priv->drm, 1,
890 "Power well %d not defined for this platform\n",
891 power_well_id);
892 return &dev_priv->power_domains.power_wells[0];
893 }
894
895 /**
896 * intel_display_power_set_target_dc_state - Set target dc state.
897 * @dev_priv: i915 device
898 * @state: state which needs to be set as target_dc_state.
899 *
900 * This function set the "DC off" power well target_dc_state,
901 * based upon this target_dc_stste, "DC off" power well will
902 * enable desired DC state.
903 */
904 void intel_display_power_set_target_dc_state(struct drm_i915_private *dev_priv,
905 u32 state)
906 {
907 struct i915_power_well *power_well;
908 bool dc_off_enabled;
909 struct i915_power_domains *power_domains = &dev_priv->power_domains;
910
911 mutex_lock(&power_domains->lock);
912 power_well = lookup_power_well(dev_priv, SKL_DISP_DC_OFF);
913
914 if (drm_WARN_ON(&dev_priv->drm, !power_well))
915 goto unlock;
916
917 state = sanitize_target_dc_state(dev_priv, state);
918
919 if (state == dev_priv->csr.target_dc_state)
920 goto unlock;
921
922 dc_off_enabled = power_well->desc->ops->is_enabled(dev_priv,
923 power_well);
924 /*
925 * If DC off power well is disabled, need to enable and disable the
926 * DC off power well to effect target DC state.
927 */
928 if (!dc_off_enabled)
929 power_well->desc->ops->enable(dev_priv, power_well);
930
931 dev_priv->csr.target_dc_state = state;
932
933 if (!dc_off_enabled)
934 power_well->desc->ops->disable(dev_priv, power_well);
935
936 unlock:
937 mutex_unlock(&power_domains->lock);
938 }
939
940 static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)
941 {
942 enum i915_power_well_id high_pg;
943
944 /* Power wells at this level and above must be disabled for DC5 entry */
945 if (INTEL_GEN(dev_priv) >= 12)
946 high_pg = TGL_DISP_PW_3;
947 else
948 high_pg = SKL_DISP_PW_2;
949
950 drm_WARN_ONCE(&dev_priv->drm,
951 intel_display_power_well_is_enabled(dev_priv, high_pg),
952 "Power wells above platform's DC5 limit still enabled.\n");
953
954 drm_WARN_ONCE(&dev_priv->drm,
955 (intel_de_read(dev_priv, DC_STATE_EN) &
956 DC_STATE_EN_UPTO_DC5),
957 "DC5 already programmed to be enabled.\n");
958 assert_rpm_wakelock_held(&dev_priv->runtime_pm);
959
960 assert_csr_loaded(dev_priv);
961 }
962
963 static void gen9_enable_dc5(struct drm_i915_private *dev_priv)
964 {
965 assert_can_enable_dc5(dev_priv);
966
967 drm_dbg_kms(&dev_priv->drm, "Enabling DC5\n");
968
969 /* Wa Display #1183: skl,kbl,cfl */
970 if (IS_GEN9_BC(dev_priv))
971 intel_de_write(dev_priv, GEN8_CHICKEN_DCPR_1,
972 intel_de_read(dev_priv, GEN8_CHICKEN_DCPR_1) | SKL_SELECT_ALTERNATE_DC_EXIT);
973
974 gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC5);
975 }
976
977 static void assert_can_enable_dc6(struct drm_i915_private *dev_priv)
978 {
979 drm_WARN_ONCE(&dev_priv->drm,
980 intel_de_read(dev_priv, UTIL_PIN_CTL) & UTIL_PIN_ENABLE,
981 "Backlight is not disabled.\n");
982 drm_WARN_ONCE(&dev_priv->drm,
983 (intel_de_read(dev_priv, DC_STATE_EN) &
984 DC_STATE_EN_UPTO_DC6),
985 "DC6 already programmed to be enabled.\n");
986
987 assert_csr_loaded(dev_priv);
988 }
989
990 static void skl_enable_dc6(struct drm_i915_private *dev_priv)
991 {
992 assert_can_enable_dc6(dev_priv);
993
994 drm_dbg_kms(&dev_priv->drm, "Enabling DC6\n");
995
996 /* Wa Display #1183: skl,kbl,cfl */
997 if (IS_GEN9_BC(dev_priv))
998 intel_de_write(dev_priv, GEN8_CHICKEN_DCPR_1,
999 intel_de_read(dev_priv, GEN8_CHICKEN_DCPR_1) | SKL_SELECT_ALTERNATE_DC_EXIT);
1000
1001 gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6);
1002 }
1003
1004 static void hsw_power_well_sync_hw(struct drm_i915_private *dev_priv,
1005 struct i915_power_well *power_well)
1006 {
1007 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
1008 int pw_idx = power_well->desc->hsw.idx;
1009 u32 mask = HSW_PWR_WELL_CTL_REQ(pw_idx);
1010 u32 bios_req = intel_de_read(dev_priv, regs->bios);
1011
1012 /* Take over the request bit if set by BIOS. */
1013 if (bios_req & mask) {
1014 u32 drv_req = intel_de_read(dev_priv, regs->driver);
1015
1016 if (!(drv_req & mask))
1017 intel_de_write(dev_priv, regs->driver, drv_req | mask);
1018 intel_de_write(dev_priv, regs->bios, bios_req & ~mask);
1019 }
1020 }
1021
1022 static void bxt_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
1023 struct i915_power_well *power_well)
1024 {
1025 bxt_ddi_phy_init(dev_priv, power_well->desc->bxt.phy);
1026 }
1027
1028 static void bxt_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
1029 struct i915_power_well *power_well)
1030 {
1031 bxt_ddi_phy_uninit(dev_priv, power_well->desc->bxt.phy);
1032 }
1033
1034 static bool bxt_dpio_cmn_power_well_enabled(struct drm_i915_private *dev_priv,
1035 struct i915_power_well *power_well)
1036 {
1037 return bxt_ddi_phy_is_enabled(dev_priv, power_well->desc->bxt.phy);
1038 }
1039
1040 static void bxt_verify_ddi_phy_power_wells(struct drm_i915_private *dev_priv)
1041 {
1042 struct i915_power_well *power_well;
1043
1044 power_well = lookup_power_well(dev_priv, BXT_DISP_PW_DPIO_CMN_A);
1045 if (power_well->count > 0)
1046 bxt_ddi_phy_verify_state(dev_priv, power_well->desc->bxt.phy);
1047
1048 power_well = lookup_power_well(dev_priv, VLV_DISP_PW_DPIO_CMN_BC);
1049 if (power_well->count > 0)
1050 bxt_ddi_phy_verify_state(dev_priv, power_well->desc->bxt.phy);
1051
1052 if (IS_GEMINILAKE(dev_priv)) {
1053 power_well = lookup_power_well(dev_priv,
1054 GLK_DISP_PW_DPIO_CMN_C);
1055 if (power_well->count > 0)
1056 bxt_ddi_phy_verify_state(dev_priv,
1057 power_well->desc->bxt.phy);
1058 }
1059 }
1060
1061 static bool gen9_dc_off_power_well_enabled(struct drm_i915_private *dev_priv,
1062 struct i915_power_well *power_well)
1063 {
1064 return ((intel_de_read(dev_priv, DC_STATE_EN) & DC_STATE_EN_DC3CO) == 0 &&
1065 (intel_de_read(dev_priv, DC_STATE_EN) & DC_STATE_EN_UPTO_DC5_DC6_MASK) == 0);
1066 }
1067
1068 static void gen9_assert_dbuf_enabled(struct drm_i915_private *dev_priv)
1069 {
1070 u8 hw_enabled_dbuf_slices = intel_enabled_dbuf_slices_mask(dev_priv);
1071 u8 enabled_dbuf_slices = dev_priv->enabled_dbuf_slices_mask;
1072
1073 drm_WARN(&dev_priv->drm,
1074 hw_enabled_dbuf_slices != enabled_dbuf_slices,
1075 "Unexpected DBuf power power state (0x%08x, expected 0x%08x)\n",
1076 hw_enabled_dbuf_slices,
1077 enabled_dbuf_slices);
1078 }
1079
1080 static void gen9_disable_dc_states(struct drm_i915_private *dev_priv)
1081 {
1082 struct intel_cdclk_config cdclk_config = {};
1083
1084 if (dev_priv->csr.target_dc_state == DC_STATE_EN_DC3CO) {
1085 tgl_disable_dc3co(dev_priv);
1086 return;
1087 }
1088
1089 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
1090
1091 dev_priv->display.get_cdclk(dev_priv, &cdclk_config);
1092 /* Can't read out voltage_level so can't use intel_cdclk_changed() */
1093 drm_WARN_ON(&dev_priv->drm,
1094 intel_cdclk_needs_modeset(&dev_priv->cdclk.hw,
1095 &cdclk_config));
1096
1097 gen9_assert_dbuf_enabled(dev_priv);
1098
1099 if (IS_GEN9_LP(dev_priv))
1100 bxt_verify_ddi_phy_power_wells(dev_priv);
1101
1102 if (INTEL_GEN(dev_priv) >= 11)
1103 /*
1104 * DMC retains HW context only for port A, the other combo
1105 * PHY's HW context for port B is lost after DC transitions,
1106 * so we need to restore it manually.
1107 */
1108 intel_combo_phy_init(dev_priv);
1109 }
1110
1111 static void gen9_dc_off_power_well_enable(struct drm_i915_private *dev_priv,
1112 struct i915_power_well *power_well)
1113 {
1114 gen9_disable_dc_states(dev_priv);
1115 }
1116
1117 static void gen9_dc_off_power_well_disable(struct drm_i915_private *dev_priv,
1118 struct i915_power_well *power_well)
1119 {
1120 if (!dev_priv->csr.dmc_payload)
1121 return;
1122
1123 switch (dev_priv->csr.target_dc_state) {
1124 case DC_STATE_EN_DC3CO:
1125 tgl_enable_dc3co(dev_priv);
1126 break;
1127 case DC_STATE_EN_UPTO_DC6:
1128 skl_enable_dc6(dev_priv);
1129 break;
1130 case DC_STATE_EN_UPTO_DC5:
1131 gen9_enable_dc5(dev_priv);
1132 break;
1133 }
1134 }
1135
1136 static void i9xx_power_well_sync_hw_noop(struct drm_i915_private *dev_priv,
1137 struct i915_power_well *power_well)
1138 {
1139 }
1140
1141 static void i9xx_always_on_power_well_noop(struct drm_i915_private *dev_priv,
1142 struct i915_power_well *power_well)
1143 {
1144 }
1145
1146 static bool i9xx_always_on_power_well_enabled(struct drm_i915_private *dev_priv,
1147 struct i915_power_well *power_well)
1148 {
1149 return true;
1150 }
1151
1152 static void i830_pipes_power_well_enable(struct drm_i915_private *dev_priv,
1153 struct i915_power_well *power_well)
1154 {
1155 if ((intel_de_read(dev_priv, PIPECONF(PIPE_A)) & PIPECONF_ENABLE) == 0)
1156 i830_enable_pipe(dev_priv, PIPE_A);
1157 if ((intel_de_read(dev_priv, PIPECONF(PIPE_B)) & PIPECONF_ENABLE) == 0)
1158 i830_enable_pipe(dev_priv, PIPE_B);
1159 }
1160
1161 static void i830_pipes_power_well_disable(struct drm_i915_private *dev_priv,
1162 struct i915_power_well *power_well)
1163 {
1164 i830_disable_pipe(dev_priv, PIPE_B);
1165 i830_disable_pipe(dev_priv, PIPE_A);
1166 }
1167
1168 static bool i830_pipes_power_well_enabled(struct drm_i915_private *dev_priv,
1169 struct i915_power_well *power_well)
1170 {
1171 return intel_de_read(dev_priv, PIPECONF(PIPE_A)) & PIPECONF_ENABLE &&
1172 intel_de_read(dev_priv, PIPECONF(PIPE_B)) & PIPECONF_ENABLE;
1173 }
1174
1175 static void i830_pipes_power_well_sync_hw(struct drm_i915_private *dev_priv,
1176 struct i915_power_well *power_well)
1177 {
1178 if (power_well->count > 0)
1179 i830_pipes_power_well_enable(dev_priv, power_well);
1180 else
1181 i830_pipes_power_well_disable(dev_priv, power_well);
1182 }
1183
1184 static void vlv_set_power_well(struct drm_i915_private *dev_priv,
1185 struct i915_power_well *power_well, bool enable)
1186 {
1187 int pw_idx = power_well->desc->vlv.idx;
1188 u32 mask;
1189 u32 state;
1190 u32 ctrl;
1191
1192 mask = PUNIT_PWRGT_MASK(pw_idx);
1193 state = enable ? PUNIT_PWRGT_PWR_ON(pw_idx) :
1194 PUNIT_PWRGT_PWR_GATE(pw_idx);
1195
1196 vlv_punit_get(dev_priv);
1197
1198 #define COND \
1199 ((vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask) == state)
1200
1201 if (COND)
1202 goto out;
1203
1204 ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL);
1205 ctrl &= ~mask;
1206 ctrl |= state;
1207 vlv_punit_write(dev_priv, PUNIT_REG_PWRGT_CTRL, ctrl);
1208
1209 if (wait_for(COND, 100))
1210 drm_err(&dev_priv->drm,
1211 "timeout setting power well state %08x (%08x)\n",
1212 state,
1213 vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL));
1214
1215 #undef COND
1216
1217 out:
1218 vlv_punit_put(dev_priv);
1219 }
1220
1221 static void vlv_power_well_enable(struct drm_i915_private *dev_priv,
1222 struct i915_power_well *power_well)
1223 {
1224 vlv_set_power_well(dev_priv, power_well, true);
1225 }
1226
1227 static void vlv_power_well_disable(struct drm_i915_private *dev_priv,
1228 struct i915_power_well *power_well)
1229 {
1230 vlv_set_power_well(dev_priv, power_well, false);
1231 }
1232
1233 static bool vlv_power_well_enabled(struct drm_i915_private *dev_priv,
1234 struct i915_power_well *power_well)
1235 {
1236 int pw_idx = power_well->desc->vlv.idx;
1237 bool enabled = false;
1238 u32 mask;
1239 u32 state;
1240 u32 ctrl;
1241
1242 mask = PUNIT_PWRGT_MASK(pw_idx);
1243 ctrl = PUNIT_PWRGT_PWR_ON(pw_idx);
1244
1245 vlv_punit_get(dev_priv);
1246
1247 state = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_STATUS) & mask;
1248 /*
1249 * We only ever set the power-on and power-gate states, anything
1250 * else is unexpected.
1251 */
1252 drm_WARN_ON(&dev_priv->drm, state != PUNIT_PWRGT_PWR_ON(pw_idx) &&
1253 state != PUNIT_PWRGT_PWR_GATE(pw_idx));
1254 if (state == ctrl)
1255 enabled = true;
1256
1257 /*
1258 * A transient state at this point would mean some unexpected party
1259 * is poking at the power controls too.
1260 */
1261 ctrl = vlv_punit_read(dev_priv, PUNIT_REG_PWRGT_CTRL) & mask;
1262 drm_WARN_ON(&dev_priv->drm, ctrl != state);
1263
1264 vlv_punit_put(dev_priv);
1265
1266 return enabled;
1267 }
1268
1269 static void vlv_init_display_clock_gating(struct drm_i915_private *dev_priv)
1270 {
1271 u32 val;
1272
1273 /*
1274 * On driver load, a pipe may be active and driving a DSI display.
1275 * Preserve DPOUNIT_CLOCK_GATE_DISABLE to avoid the pipe getting stuck
1276 * (and never recovering) in this case. intel_dsi_post_disable() will
1277 * clear it when we turn off the display.
1278 */
1279 val = intel_de_read(dev_priv, DSPCLK_GATE_D);
1280 val &= DPOUNIT_CLOCK_GATE_DISABLE;
1281 val |= VRHUNIT_CLOCK_GATE_DISABLE;
1282 intel_de_write(dev_priv, DSPCLK_GATE_D, val);
1283
1284 /*
1285 * Disable trickle feed and enable pnd deadline calculation
1286 */
1287 intel_de_write(dev_priv, MI_ARB_VLV,
1288 MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE);
1289 intel_de_write(dev_priv, CBR1_VLV, 0);
1290
1291 drm_WARN_ON(&dev_priv->drm, RUNTIME_INFO(dev_priv)->rawclk_freq == 0);
1292 intel_de_write(dev_priv, RAWCLK_FREQ_VLV,
1293 DIV_ROUND_CLOSEST(RUNTIME_INFO(dev_priv)->rawclk_freq,
1294 1000));
1295 }
1296
1297 static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
1298 {
1299 struct intel_encoder *encoder;
1300 enum pipe pipe;
1301
1302 /*
1303 * Enable the CRI clock source so we can get at the
1304 * display and the reference clock for VGA
1305 * hotplug / manual detection. Supposedly DSI also
1306 * needs the ref clock up and running.
1307 *
1308 * CHV DPLL B/C have some issues if VGA mode is enabled.
1309 */
1310 for_each_pipe(dev_priv, pipe) {
1311 u32 val = intel_de_read(dev_priv, DPLL(pipe));
1312
1313 val |= DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
1314 if (pipe != PIPE_A)
1315 val |= DPLL_INTEGRATED_CRI_CLK_VLV;
1316
1317 intel_de_write(dev_priv, DPLL(pipe), val);
1318 }
1319
1320 vlv_init_display_clock_gating(dev_priv);
1321
1322 spin_lock_irq(&dev_priv->irq_lock);
1323 valleyview_enable_display_irqs(dev_priv);
1324 spin_unlock_irq(&dev_priv->irq_lock);
1325
1326 /*
1327 * During driver initialization/resume we can avoid restoring the
1328 * part of the HW/SW state that will be inited anyway explicitly.
1329 */
1330 if (dev_priv->power_domains.initializing)
1331 return;
1332
1333 intel_hpd_init(dev_priv);
1334
1335 /* Re-enable the ADPA, if we have one */
1336 for_each_intel_encoder(&dev_priv->drm, encoder) {
1337 if (encoder->type == INTEL_OUTPUT_ANALOG)
1338 intel_crt_reset(&encoder->base);
1339 }
1340
1341 intel_vga_redisable_power_on(dev_priv);
1342
1343 intel_pps_unlock_regs_wa(dev_priv);
1344 }
1345
1346 static void vlv_display_power_well_deinit(struct drm_i915_private *dev_priv)
1347 {
1348 spin_lock_irq(&dev_priv->irq_lock);
1349 valleyview_disable_display_irqs(dev_priv);
1350 spin_unlock_irq(&dev_priv->irq_lock);
1351
1352 /* make sure we're done processing display irqs */
1353 intel_synchronize_irq(dev_priv);
1354
1355 intel_power_sequencer_reset(dev_priv);
1356
1357 /* Prevent us from re-enabling polling on accident in late suspend */
1358 if (!dev_priv->drm.dev->power.is_suspended)
1359 intel_hpd_poll_init(dev_priv);
1360 }
1361
1362 static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv,
1363 struct i915_power_well *power_well)
1364 {
1365 vlv_set_power_well(dev_priv, power_well, true);
1366
1367 vlv_display_power_well_init(dev_priv);
1368 }
1369
1370 static void vlv_display_power_well_disable(struct drm_i915_private *dev_priv,
1371 struct i915_power_well *power_well)
1372 {
1373 vlv_display_power_well_deinit(dev_priv);
1374
1375 vlv_set_power_well(dev_priv, power_well, false);
1376 }
1377
1378 static void vlv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
1379 struct i915_power_well *power_well)
1380 {
1381 /* since ref/cri clock was enabled */
1382 udelay(1); /* >10ns for cmnreset, >0ns for sidereset */
1383
1384 vlv_set_power_well(dev_priv, power_well, true);
1385
1386 /*
1387 * From VLV2A0_DP_eDP_DPIO_driver_vbios_notes_10.docx -
1388 * 6. De-assert cmn_reset/side_reset. Same as VLV X0.
1389 * a. GUnit 0x2110 bit[0] set to 1 (def 0)
1390 * b. The other bits such as sfr settings / modesel may all
1391 * be set to 0.
1392 *
1393 * This should only be done on init and resume from S3 with
1394 * both PLLs disabled, or we risk losing DPIO and PLL
1395 * synchronization.
1396 */
1397 intel_de_write(dev_priv, DPIO_CTL,
1398 intel_de_read(dev_priv, DPIO_CTL) | DPIO_CMNRST);
1399 }
1400
1401 static void vlv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
1402 struct i915_power_well *power_well)
1403 {
1404 enum pipe pipe;
1405
1406 for_each_pipe(dev_priv, pipe)
1407 assert_pll_disabled(dev_priv, pipe);
1408
1409 /* Assert common reset */
1410 intel_de_write(dev_priv, DPIO_CTL,
1411 intel_de_read(dev_priv, DPIO_CTL) & ~DPIO_CMNRST);
1412
1413 vlv_set_power_well(dev_priv, power_well, false);
1414 }
1415
1416 #define POWER_DOMAIN_MASK (GENMASK_ULL(POWER_DOMAIN_NUM - 1, 0))
1417
1418 #define BITS_SET(val, bits) (((val) & (bits)) == (bits))
1419
1420 static void assert_chv_phy_status(struct drm_i915_private *dev_priv)
1421 {
1422 struct i915_power_well *cmn_bc =
1423 lookup_power_well(dev_priv, VLV_DISP_PW_DPIO_CMN_BC);
1424 struct i915_power_well *cmn_d =
1425 lookup_power_well(dev_priv, CHV_DISP_PW_DPIO_CMN_D);
1426 u32 phy_control = dev_priv->chv_phy_control;
1427 u32 phy_status = 0;
1428 u32 phy_status_mask = 0xffffffff;
1429
1430 /*
1431 * The BIOS can leave the PHY is some weird state
1432 * where it doesn't fully power down some parts.
1433 * Disable the asserts until the PHY has been fully
1434 * reset (ie. the power well has been disabled at
1435 * least once).
1436 */
1437 if (!dev_priv->chv_phy_assert[DPIO_PHY0])
1438 phy_status_mask &= ~(PHY_STATUS_CMN_LDO(DPIO_PHY0, DPIO_CH0) |
1439 PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH0, 0) |
1440 PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH0, 1) |
1441 PHY_STATUS_CMN_LDO(DPIO_PHY0, DPIO_CH1) |
1442 PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH1, 0) |
1443 PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH1, 1));
1444
1445 if (!dev_priv->chv_phy_assert[DPIO_PHY1])
1446 phy_status_mask &= ~(PHY_STATUS_CMN_LDO(DPIO_PHY1, DPIO_CH0) |
1447 PHY_STATUS_SPLINE_LDO(DPIO_PHY1, DPIO_CH0, 0) |
1448 PHY_STATUS_SPLINE_LDO(DPIO_PHY1, DPIO_CH0, 1));
1449
1450 if (cmn_bc->desc->ops->is_enabled(dev_priv, cmn_bc)) {
1451 phy_status |= PHY_POWERGOOD(DPIO_PHY0);
1452
1453 /* this assumes override is only used to enable lanes */
1454 if ((phy_control & PHY_CH_POWER_DOWN_OVRD_EN(DPIO_PHY0, DPIO_CH0)) == 0)
1455 phy_control |= PHY_CH_POWER_DOWN_OVRD(0xf, DPIO_PHY0, DPIO_CH0);
1456
1457 if ((phy_control & PHY_CH_POWER_DOWN_OVRD_EN(DPIO_PHY0, DPIO_CH1)) == 0)
1458 phy_control |= PHY_CH_POWER_DOWN_OVRD(0xf, DPIO_PHY0, DPIO_CH1);
1459
1460 /* CL1 is on whenever anything is on in either channel */
1461 if (BITS_SET(phy_control,
1462 PHY_CH_POWER_DOWN_OVRD(0xf, DPIO_PHY0, DPIO_CH0) |
1463 PHY_CH_POWER_DOWN_OVRD(0xf, DPIO_PHY0, DPIO_CH1)))
1464 phy_status |= PHY_STATUS_CMN_LDO(DPIO_PHY0, DPIO_CH0);
1465
1466 /*
1467 * The DPLLB check accounts for the pipe B + port A usage
1468 * with CL2 powered up but all the lanes in the second channel
1469 * powered down.
1470 */
1471 if (BITS_SET(phy_control,
1472 PHY_CH_POWER_DOWN_OVRD(0xf, DPIO_PHY0, DPIO_CH1)) &&
1473 (intel_de_read(dev_priv, DPLL(PIPE_B)) & DPLL_VCO_ENABLE) == 0)
1474 phy_status |= PHY_STATUS_CMN_LDO(DPIO_PHY0, DPIO_CH1);
1475
1476 if (BITS_SET(phy_control,
1477 PHY_CH_POWER_DOWN_OVRD(0x3, DPIO_PHY0, DPIO_CH0)))
1478 phy_status |= PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH0, 0);
1479 if (BITS_SET(phy_control,
1480 PHY_CH_POWER_DOWN_OVRD(0xc, DPIO_PHY0, DPIO_CH0)))
1481 phy_status |= PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH0, 1);
1482
1483 if (BITS_SET(phy_control,
1484 PHY_CH_POWER_DOWN_OVRD(0x3, DPIO_PHY0, DPIO_CH1)))
1485 phy_status |= PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH1, 0);
1486 if (BITS_SET(phy_control,
1487 PHY_CH_POWER_DOWN_OVRD(0xc, DPIO_PHY0, DPIO_CH1)))
1488 phy_status |= PHY_STATUS_SPLINE_LDO(DPIO_PHY0, DPIO_CH1, 1);
1489 }
1490
1491 if (cmn_d->desc->ops->is_enabled(dev_priv, cmn_d)) {
1492 phy_status |= PHY_POWERGOOD(DPIO_PHY1);
1493
1494 /* this assumes override is only used to enable lanes */
1495 if ((phy_control & PHY_CH_POWER_DOWN_OVRD_EN(DPIO_PHY1, DPIO_CH0)) == 0)
1496 phy_control |= PHY_CH_POWER_DOWN_OVRD(0xf, DPIO_PHY1, DPIO_CH0);
1497
1498 if (BITS_SET(phy_control,
1499 PHY_CH_POWER_DOWN_OVRD(0xf, DPIO_PHY1, DPIO_CH0)))
1500 phy_status |= PHY_STATUS_CMN_LDO(DPIO_PHY1, DPIO_CH0);
1501
1502 if (BITS_SET(phy_control,
1503 PHY_CH_POWER_DOWN_OVRD(0x3, DPIO_PHY1, DPIO_CH0)))
1504 phy_status |= PHY_STATUS_SPLINE_LDO(DPIO_PHY1, DPIO_CH0, 0);
1505 if (BITS_SET(phy_control,
1506 PHY_CH_POWER_DOWN_OVRD(0xc, DPIO_PHY1, DPIO_CH0)))
1507 phy_status |= PHY_STATUS_SPLINE_LDO(DPIO_PHY1, DPIO_CH0, 1);
1508 }
1509
1510 phy_status &= phy_status_mask;
1511
1512 /*
1513 * The PHY may be busy with some initial calibration and whatnot,
1514 * so the power state can take a while to actually change.
1515 */
1516 if (intel_de_wait_for_register(dev_priv, DISPLAY_PHY_STATUS,
1517 phy_status_mask, phy_status, 10))
1518 drm_err(&dev_priv->drm,
1519 "Unexpected PHY_STATUS 0x%08x, expected 0x%08x (PHY_CONTROL=0x%08x)\n",
1520 intel_de_read(dev_priv, DISPLAY_PHY_STATUS) & phy_status_mask,
1521 phy_status, dev_priv->chv_phy_control);
1522 }
1523
1524 #undef BITS_SET
1525
1526 static void chv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
1527 struct i915_power_well *power_well)
1528 {
1529 enum dpio_phy phy;
1530 enum pipe pipe;
1531 u32 tmp;
1532
1533 drm_WARN_ON_ONCE(&dev_priv->drm,
1534 power_well->desc->id != VLV_DISP_PW_DPIO_CMN_BC &&
1535 power_well->desc->id != CHV_DISP_PW_DPIO_CMN_D);
1536
1537 if (power_well->desc->id == VLV_DISP_PW_DPIO_CMN_BC) {
1538 pipe = PIPE_A;
1539 phy = DPIO_PHY0;
1540 } else {
1541 pipe = PIPE_C;
1542 phy = DPIO_PHY1;
1543 }
1544
1545 /* since ref/cri clock was enabled */
1546 udelay(1); /* >10ns for cmnreset, >0ns for sidereset */
1547 vlv_set_power_well(dev_priv, power_well, true);
1548
1549 /* Poll for phypwrgood signal */
1550 if (intel_de_wait_for_set(dev_priv, DISPLAY_PHY_STATUS,
1551 PHY_POWERGOOD(phy), 1))
1552 drm_err(&dev_priv->drm, "Display PHY %d is not power up\n",
1553 phy);
1554
1555 vlv_dpio_get(dev_priv);
1556
1557 /* Enable dynamic power down */
1558 tmp = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW28);
1559 tmp |= DPIO_DYNPWRDOWNEN_CH0 | DPIO_CL1POWERDOWNEN |
1560 DPIO_SUS_CLK_CONFIG_GATE_CLKREQ;
1561 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW28, tmp);
1562
1563 if (power_well->desc->id == VLV_DISP_PW_DPIO_CMN_BC) {
1564 tmp = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW6_CH1);
1565 tmp |= DPIO_DYNPWRDOWNEN_CH1;
1566 vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW6_CH1, tmp);
1567 } else {
1568 /*
1569 * Force the non-existing CL2 off. BXT does this
1570 * too, so maybe it saves some power even though
1571 * CL2 doesn't exist?
1572 */
1573 tmp = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW30);
1574 tmp |= DPIO_CL2_LDOFUSE_PWRENB;
1575 vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW30, tmp);
1576 }
1577
1578 vlv_dpio_put(dev_priv);
1579
1580 dev_priv->chv_phy_control |= PHY_COM_LANE_RESET_DEASSERT(phy);
1581 intel_de_write(dev_priv, DISPLAY_PHY_CONTROL,
1582 dev_priv->chv_phy_control);
1583
1584 drm_dbg_kms(&dev_priv->drm,
1585 "Enabled DPIO PHY%d (PHY_CONTROL=0x%08x)\n",
1586 phy, dev_priv->chv_phy_control);
1587
1588 assert_chv_phy_status(dev_priv);
1589 }
1590
1591 static void chv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
1592 struct i915_power_well *power_well)
1593 {
1594 enum dpio_phy phy;
1595
1596 drm_WARN_ON_ONCE(&dev_priv->drm,
1597 power_well->desc->id != VLV_DISP_PW_DPIO_CMN_BC &&
1598 power_well->desc->id != CHV_DISP_PW_DPIO_CMN_D);
1599
1600 if (power_well->desc->id == VLV_DISP_PW_DPIO_CMN_BC) {
1601 phy = DPIO_PHY0;
1602 assert_pll_disabled(dev_priv, PIPE_A);
1603 assert_pll_disabled(dev_priv, PIPE_B);
1604 } else {
1605 phy = DPIO_PHY1;
1606 assert_pll_disabled(dev_priv, PIPE_C);
1607 }
1608
1609 dev_priv->chv_phy_control &= ~PHY_COM_LANE_RESET_DEASSERT(phy);
1610 intel_de_write(dev_priv, DISPLAY_PHY_CONTROL,
1611 dev_priv->chv_phy_control);
1612
1613 vlv_set_power_well(dev_priv, power_well, false);
1614
1615 drm_dbg_kms(&dev_priv->drm,
1616 "Disabled DPIO PHY%d (PHY_CONTROL=0x%08x)\n",
1617 phy, dev_priv->chv_phy_control);
1618
1619 /* PHY is fully reset now, so we can enable the PHY state asserts */
1620 dev_priv->chv_phy_assert[phy] = true;
1621
1622 assert_chv_phy_status(dev_priv);
1623 }
1624
1625 static void assert_chv_phy_powergate(struct drm_i915_private *dev_priv, enum dpio_phy phy,
1626 enum dpio_channel ch, bool override, unsigned int mask)
1627 {
1628 enum pipe pipe = phy == DPIO_PHY0 ? PIPE_A : PIPE_C;
1629 u32 reg, val, expected, actual;
1630
1631 /*
1632 * The BIOS can leave the PHY is some weird state
1633 * where it doesn't fully power down some parts.
1634 * Disable the asserts until the PHY has been fully
1635 * reset (ie. the power well has been disabled at
1636 * least once).
1637 */
1638 if (!dev_priv->chv_phy_assert[phy])
1639 return;
1640
1641 if (ch == DPIO_CH0)
1642 reg = _CHV_CMN_DW0_CH0;
1643 else
1644 reg = _CHV_CMN_DW6_CH1;
1645
1646 vlv_dpio_get(dev_priv);
1647 val = vlv_dpio_read(dev_priv, pipe, reg);
1648 vlv_dpio_put(dev_priv);
1649
1650 /*
1651 * This assumes !override is only used when the port is disabled.
1652 * All lanes should power down even without the override when
1653 * the port is disabled.
1654 */
1655 if (!override || mask == 0xf) {
1656 expected = DPIO_ALLDL_POWERDOWN | DPIO_ANYDL_POWERDOWN;
1657 /*
1658 * If CH1 common lane is not active anymore
1659 * (eg. for pipe B DPLL) the entire channel will
1660 * shut down, which causes the common lane registers
1661 * to read as 0. That means we can't actually check
1662 * the lane power down status bits, but as the entire
1663 * register reads as 0 it's a good indication that the
1664 * channel is indeed entirely powered down.
1665 */
1666 if (ch == DPIO_CH1 && val == 0)
1667 expected = 0;
1668 } else if (mask != 0x0) {
1669 expected = DPIO_ANYDL_POWERDOWN;
1670 } else {
1671 expected = 0;
1672 }
1673
1674 if (ch == DPIO_CH0)
1675 actual = val >> DPIO_ANYDL_POWERDOWN_SHIFT_CH0;
1676 else
1677 actual = val >> DPIO_ANYDL_POWERDOWN_SHIFT_CH1;
1678 actual &= DPIO_ALLDL_POWERDOWN | DPIO_ANYDL_POWERDOWN;
1679
1680 drm_WARN(&dev_priv->drm, actual != expected,
1681 "Unexpected DPIO lane power down: all %d, any %d. Expected: all %d, any %d. (0x%x = 0x%08x)\n",
1682 !!(actual & DPIO_ALLDL_POWERDOWN),
1683 !!(actual & DPIO_ANYDL_POWERDOWN),
1684 !!(expected & DPIO_ALLDL_POWERDOWN),
1685 !!(expected & DPIO_ANYDL_POWERDOWN),
1686 reg, val);
1687 }
1688
1689 bool chv_phy_powergate_ch(struct drm_i915_private *dev_priv, enum dpio_phy phy,
1690 enum dpio_channel ch, bool override)
1691 {
1692 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1693 bool was_override;
1694
1695 mutex_lock(&power_domains->lock);
1696
1697 was_override = dev_priv->chv_phy_control & PHY_CH_POWER_DOWN_OVRD_EN(phy, ch);
1698
1699 if (override == was_override)
1700 goto out;
1701
1702 if (override)
1703 dev_priv->chv_phy_control |= PHY_CH_POWER_DOWN_OVRD_EN(phy, ch);
1704 else
1705 dev_priv->chv_phy_control &= ~PHY_CH_POWER_DOWN_OVRD_EN(phy, ch);
1706
1707 intel_de_write(dev_priv, DISPLAY_PHY_CONTROL,
1708 dev_priv->chv_phy_control);
1709
1710 drm_dbg_kms(&dev_priv->drm,
1711 "Power gating DPIO PHY%d CH%d (DPIO_PHY_CONTROL=0x%08x)\n",
1712 phy, ch, dev_priv->chv_phy_control);
1713
1714 assert_chv_phy_status(dev_priv);
1715
1716 out:
1717 mutex_unlock(&power_domains->lock);
1718
1719 return was_override;
1720 }
1721
1722 void chv_phy_powergate_lanes(struct intel_encoder *encoder,
1723 bool override, unsigned int mask)
1724 {
1725 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1726 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1727 enum dpio_phy phy = vlv_dport_to_phy(enc_to_dig_port(encoder));
1728 enum dpio_channel ch = vlv_dport_to_channel(enc_to_dig_port(encoder));
1729
1730 mutex_lock(&power_domains->lock);
1731
1732 dev_priv->chv_phy_control &= ~PHY_CH_POWER_DOWN_OVRD(0xf, phy, ch);
1733 dev_priv->chv_phy_control |= PHY_CH_POWER_DOWN_OVRD(mask, phy, ch);
1734
1735 if (override)
1736 dev_priv->chv_phy_control |= PHY_CH_POWER_DOWN_OVRD_EN(phy, ch);
1737 else
1738 dev_priv->chv_phy_control &= ~PHY_CH_POWER_DOWN_OVRD_EN(phy, ch);
1739
1740 intel_de_write(dev_priv, DISPLAY_PHY_CONTROL,
1741 dev_priv->chv_phy_control);
1742
1743 drm_dbg_kms(&dev_priv->drm,
1744 "Power gating DPIO PHY%d CH%d lanes 0x%x (PHY_CONTROL=0x%08x)\n",
1745 phy, ch, mask, dev_priv->chv_phy_control);
1746
1747 assert_chv_phy_status(dev_priv);
1748
1749 assert_chv_phy_powergate(dev_priv, phy, ch, override, mask);
1750
1751 mutex_unlock(&power_domains->lock);
1752 }
1753
1754 static bool chv_pipe_power_well_enabled(struct drm_i915_private *dev_priv,
1755 struct i915_power_well *power_well)
1756 {
1757 enum pipe pipe = PIPE_A;
1758 bool enabled;
1759 u32 state, ctrl;
1760
1761 vlv_punit_get(dev_priv);
1762
1763 state = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM) & DP_SSS_MASK(pipe);
1764 /*
1765 * We only ever set the power-on and power-gate states, anything
1766 * else is unexpected.
1767 */
1768 drm_WARN_ON(&dev_priv->drm, state != DP_SSS_PWR_ON(pipe) &&
1769 state != DP_SSS_PWR_GATE(pipe));
1770 enabled = state == DP_SSS_PWR_ON(pipe);
1771
1772 /*
1773 * A transient state at this point would mean some unexpected party
1774 * is poking at the power controls too.
1775 */
1776 ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM) & DP_SSC_MASK(pipe);
1777 drm_WARN_ON(&dev_priv->drm, ctrl << 16 != state);
1778
1779 vlv_punit_put(dev_priv);
1780
1781 return enabled;
1782 }
1783
1784 static void chv_set_pipe_power_well(struct drm_i915_private *dev_priv,
1785 struct i915_power_well *power_well,
1786 bool enable)
1787 {
1788 enum pipe pipe = PIPE_A;
1789 u32 state;
1790 u32 ctrl;
1791
1792 state = enable ? DP_SSS_PWR_ON(pipe) : DP_SSS_PWR_GATE(pipe);
1793
1794 vlv_punit_get(dev_priv);
1795
1796 #define COND \
1797 ((vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM) & DP_SSS_MASK(pipe)) == state)
1798
1799 if (COND)
1800 goto out;
1801
1802 ctrl = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
1803 ctrl &= ~DP_SSC_MASK(pipe);
1804 ctrl |= enable ? DP_SSC_PWR_ON(pipe) : DP_SSC_PWR_GATE(pipe);
1805 vlv_punit_write(dev_priv, PUNIT_REG_DSPSSPM, ctrl);
1806
1807 if (wait_for(COND, 100))
1808 drm_err(&dev_priv->drm,
1809 "timeout setting power well state %08x (%08x)\n",
1810 state,
1811 vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM));
1812
1813 #undef COND
1814
1815 out:
1816 vlv_punit_put(dev_priv);
1817 }
1818
1819 static void chv_pipe_power_well_sync_hw(struct drm_i915_private *dev_priv,
1820 struct i915_power_well *power_well)
1821 {
1822 intel_de_write(dev_priv, DISPLAY_PHY_CONTROL,
1823 dev_priv->chv_phy_control);
1824 }
1825
1826 static void chv_pipe_power_well_enable(struct drm_i915_private *dev_priv,
1827 struct i915_power_well *power_well)
1828 {
1829 chv_set_pipe_power_well(dev_priv, power_well, true);
1830
1831 vlv_display_power_well_init(dev_priv);
1832 }
1833
1834 static void chv_pipe_power_well_disable(struct drm_i915_private *dev_priv,
1835 struct i915_power_well *power_well)
1836 {
1837 vlv_display_power_well_deinit(dev_priv);
1838
1839 chv_set_pipe_power_well(dev_priv, power_well, false);
1840 }
1841
1842 static u64 __async_put_domains_mask(struct i915_power_domains *power_domains)
1843 {
1844 return power_domains->async_put_domains[0] |
1845 power_domains->async_put_domains[1];
1846 }
1847
1848 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
1849
1850 static bool
1851 assert_async_put_domain_masks_disjoint(struct i915_power_domains *power_domains)
1852 {
1853 return !WARN_ON(power_domains->async_put_domains[0] &
1854 power_domains->async_put_domains[1]);
1855 }
1856
1857 static bool
1858 __async_put_domains_state_ok(struct i915_power_domains *power_domains)
1859 {
1860 enum intel_display_power_domain domain;
1861 bool err = false;
1862
1863 err |= !assert_async_put_domain_masks_disjoint(power_domains);
1864 err |= WARN_ON(!!power_domains->async_put_wakeref !=
1865 !!__async_put_domains_mask(power_domains));
1866
1867 for_each_power_domain(domain, __async_put_domains_mask(power_domains))
1868 err |= WARN_ON(power_domains->domain_use_count[domain] != 1);
1869
1870 return !err;
1871 }
1872
1873 static void print_power_domains(struct i915_power_domains *power_domains,
1874 const char *prefix, u64 mask)
1875 {
1876 enum intel_display_power_domain domain;
1877
1878 DRM_DEBUG_DRIVER("%s (%lu):\n", prefix, hweight64(mask));
1879 for_each_power_domain(domain, mask)
1880 DRM_DEBUG_DRIVER("%s use_count %d\n",
1881 intel_display_power_domain_str(domain),
1882 power_domains->domain_use_count[domain]);
1883 }
1884
1885 static void
1886 print_async_put_domains_state(struct i915_power_domains *power_domains)
1887 {
1888 DRM_DEBUG_DRIVER("async_put_wakeref %u\n",
1889 power_domains->async_put_wakeref);
1890
1891 print_power_domains(power_domains, "async_put_domains[0]",
1892 power_domains->async_put_domains[0]);
1893 print_power_domains(power_domains, "async_put_domains[1]",
1894 power_domains->async_put_domains[1]);
1895 }
1896
1897 static void
1898 verify_async_put_domains_state(struct i915_power_domains *power_domains)
1899 {
1900 if (!__async_put_domains_state_ok(power_domains))
1901 print_async_put_domains_state(power_domains);
1902 }
1903
1904 #else
1905
1906 static void
1907 assert_async_put_domain_masks_disjoint(struct i915_power_domains *power_domains)
1908 {
1909 }
1910
1911 static void
1912 verify_async_put_domains_state(struct i915_power_domains *power_domains)
1913 {
1914 }
1915
1916 #endif /* CONFIG_DRM_I915_DEBUG_RUNTIME_PM */
1917
1918 static u64 async_put_domains_mask(struct i915_power_domains *power_domains)
1919 {
1920 assert_async_put_domain_masks_disjoint(power_domains);
1921
1922 return __async_put_domains_mask(power_domains);
1923 }
1924
1925 static void
1926 async_put_domains_clear_domain(struct i915_power_domains *power_domains,
1927 enum intel_display_power_domain domain)
1928 {
1929 assert_async_put_domain_masks_disjoint(power_domains);
1930
1931 power_domains->async_put_domains[0] &= ~BIT_ULL(domain);
1932 power_domains->async_put_domains[1] &= ~BIT_ULL(domain);
1933 }
1934
1935 static bool
1936 intel_display_power_grab_async_put_ref(struct drm_i915_private *dev_priv,
1937 enum intel_display_power_domain domain)
1938 {
1939 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1940 bool ret = false;
1941
1942 if (!(async_put_domains_mask(power_domains) & BIT_ULL(domain)))
1943 goto out_verify;
1944
1945 async_put_domains_clear_domain(power_domains, domain);
1946
1947 ret = true;
1948
1949 if (async_put_domains_mask(power_domains))
1950 goto out_verify;
1951
1952 cancel_delayed_work(&power_domains->async_put_work);
1953 intel_runtime_pm_put_raw(&dev_priv->runtime_pm,
1954 fetch_and_zero(&power_domains->async_put_wakeref));
1955 out_verify:
1956 verify_async_put_domains_state(power_domains);
1957
1958 return ret;
1959 }
1960
1961 static void
1962 __intel_display_power_get_domain(struct drm_i915_private *dev_priv,
1963 enum intel_display_power_domain domain)
1964 {
1965 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1966 struct i915_power_well *power_well;
1967
1968 if (intel_display_power_grab_async_put_ref(dev_priv, domain))
1969 return;
1970
1971 for_each_power_domain_well(dev_priv, power_well, BIT_ULL(domain))
1972 intel_power_well_get(dev_priv, power_well);
1973
1974 power_domains->domain_use_count[domain]++;
1975 }
1976
1977 /**
1978 * intel_display_power_get - grab a power domain reference
1979 * @dev_priv: i915 device instance
1980 * @domain: power domain to reference
1981 *
1982 * This function grabs a power domain reference for @domain and ensures that the
1983 * power domain and all its parents are powered up. Therefore users should only
1984 * grab a reference to the innermost power domain they need.
1985 *
1986 * Any power domain reference obtained by this function must have a symmetric
1987 * call to intel_display_power_put() to release the reference again.
1988 */
1989 intel_wakeref_t intel_display_power_get(struct drm_i915_private *dev_priv,
1990 enum intel_display_power_domain domain)
1991 {
1992 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1993 intel_wakeref_t wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
1994
1995 mutex_lock(&power_domains->lock);
1996 __intel_display_power_get_domain(dev_priv, domain);
1997 mutex_unlock(&power_domains->lock);
1998
1999 return wakeref;
2000 }
2001
2002 /**
2003 * intel_display_power_get_if_enabled - grab a reference for an enabled display power domain
2004 * @dev_priv: i915 device instance
2005 * @domain: power domain to reference
2006 *
2007 * This function grabs a power domain reference for @domain and ensures that the
2008 * power domain and all its parents are powered up. Therefore users should only
2009 * grab a reference to the innermost power domain they need.
2010 *
2011 * Any power domain reference obtained by this function must have a symmetric
2012 * call to intel_display_power_put() to release the reference again.
2013 */
2014 intel_wakeref_t
2015 intel_display_power_get_if_enabled(struct drm_i915_private *dev_priv,
2016 enum intel_display_power_domain domain)
2017 {
2018 struct i915_power_domains *power_domains = &dev_priv->power_domains;
2019 intel_wakeref_t wakeref;
2020 bool is_enabled;
2021
2022 wakeref = intel_runtime_pm_get_if_in_use(&dev_priv->runtime_pm);
2023 if (!wakeref)
2024 return false;
2025
2026 mutex_lock(&power_domains->lock);
2027
2028 if (__intel_display_power_is_enabled(dev_priv, domain)) {
2029 __intel_display_power_get_domain(dev_priv, domain);
2030 is_enabled = true;
2031 } else {
2032 is_enabled = false;
2033 }
2034
2035 mutex_unlock(&power_domains->lock);
2036
2037 if (!is_enabled) {
2038 intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
2039 wakeref = 0;
2040 }
2041
2042 return wakeref;
2043 }
2044
2045 static void
2046 __intel_display_power_put_domain(struct drm_i915_private *dev_priv,
2047 enum intel_display_power_domain domain)
2048 {
2049 struct i915_power_domains *power_domains;
2050 struct i915_power_well *power_well;
2051 const char *name = intel_display_power_domain_str(domain);
2052
2053 power_domains = &dev_priv->power_domains;
2054
2055 drm_WARN(&dev_priv->drm, !power_domains->domain_use_count[domain],
2056 "Use count on domain %s is already zero\n",
2057 name);
2058 drm_WARN(&dev_priv->drm,
2059 async_put_domains_mask(power_domains) & BIT_ULL(domain),
2060 "Async disabling of domain %s is pending\n",
2061 name);
2062
2063 power_domains->domain_use_count[domain]--;
2064
2065 for_each_power_domain_well_reverse(dev_priv, power_well, BIT_ULL(domain))
2066 intel_power_well_put(dev_priv, power_well);
2067 }
2068
2069 static void __intel_display_power_put(struct drm_i915_private *dev_priv,
2070 enum intel_display_power_domain domain)
2071 {
2072 struct i915_power_domains *power_domains = &dev_priv->power_domains;
2073
2074 mutex_lock(&power_domains->lock);
2075 __intel_display_power_put_domain(dev_priv, domain);
2076 mutex_unlock(&power_domains->lock);
2077 }
2078
2079 /**
2080 * intel_display_power_put_unchecked - release an unchecked power domain reference
2081 * @dev_priv: i915 device instance
2082 * @domain: power domain to reference
2083 *
2084 * This function drops the power domain reference obtained by
2085 * intel_display_power_get() and might power down the corresponding hardware
2086 * block right away if this is the last reference.
2087 *
2088 * This function exists only for historical reasons and should be avoided in
2089 * new code, as the correctness of its use cannot be checked. Always use
2090 * intel_display_power_put() instead.
2091 */
2092 void intel_display_power_put_unchecked(struct drm_i915_private *dev_priv,
2093 enum intel_display_power_domain domain)
2094 {
2095 __intel_display_power_put(dev_priv, domain);
2096 intel_runtime_pm_put_unchecked(&dev_priv->runtime_pm);
2097 }
2098
2099 static void
2100 queue_async_put_domains_work(struct i915_power_domains *power_domains,
2101 intel_wakeref_t wakeref)
2102 {
2103 WARN_ON(power_domains->async_put_wakeref);
2104 power_domains->async_put_wakeref = wakeref;
2105 WARN_ON(!queue_delayed_work(system_unbound_wq,
2106 &power_domains->async_put_work,
2107 msecs_to_jiffies(100)));
2108 }
2109
2110 static void
2111 release_async_put_domains(struct i915_power_domains *power_domains, u64 mask)
2112 {
2113 struct drm_i915_private *dev_priv =
2114 container_of(power_domains, struct drm_i915_private,
2115 power_domains);
2116 struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
2117 enum intel_display_power_domain domain;
2118 intel_wakeref_t wakeref;
2119
2120 /*
2121 * The caller must hold already raw wakeref, upgrade that to a proper
2122 * wakeref to make the state checker happy about the HW access during
2123 * power well disabling.
2124 */
2125 assert_rpm_raw_wakeref_held(rpm);
2126 wakeref = intel_runtime_pm_get(rpm);
2127
2128 for_each_power_domain(domain, mask) {
2129 /* Clear before put, so put's sanity check is happy. */
2130 async_put_domains_clear_domain(power_domains, domain);
2131 __intel_display_power_put_domain(dev_priv, domain);
2132 }
2133
2134 intel_runtime_pm_put(rpm, wakeref);
2135 }
2136
2137 static void
2138 intel_display_power_put_async_work(struct work_struct *work)
2139 {
2140 struct drm_i915_private *dev_priv =
2141 container_of(work, struct drm_i915_private,
2142 power_domains.async_put_work.work);
2143 struct i915_power_domains *power_domains = &dev_priv->power_domains;
2144 struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
2145 intel_wakeref_t new_work_wakeref = intel_runtime_pm_get_raw(rpm);
2146 intel_wakeref_t old_work_wakeref = 0;
2147
2148 mutex_lock(&power_domains->lock);
2149
2150 /*
2151 * Bail out if all the domain refs pending to be released were grabbed
2152 * by subsequent gets or a flush_work.
2153 */
2154 old_work_wakeref = fetch_and_zero(&power_domains->async_put_wakeref);
2155 if (!old_work_wakeref)
2156 goto out_verify;
2157
2158 release_async_put_domains(power_domains,
2159 power_domains->async_put_domains[0]);
2160
2161 /* Requeue the work if more domains were async put meanwhile. */
2162 if (power_domains->async_put_domains[1]) {
2163 power_domains->async_put_domains[0] =
2164 fetch_and_zero(&power_domains->async_put_domains[1]);
2165 queue_async_put_domains_work(power_domains,
2166 fetch_and_zero(&new_work_wakeref));
2167 }
2168
2169 out_verify:
2170 verify_async_put_domains_state(power_domains);
2171
2172 mutex_unlock(&power_domains->lock);
2173
2174 if (old_work_wakeref)
2175 intel_runtime_pm_put_raw(rpm, old_work_wakeref);
2176 if (new_work_wakeref)
2177 intel_runtime_pm_put_raw(rpm, new_work_wakeref);
2178 }
2179
2180 /**
2181 * intel_display_power_put_async - release a power domain reference asynchronously
2182 * @i915: i915 device instance
2183 * @domain: power domain to reference
2184 * @wakeref: wakeref acquired for the reference that is being released
2185 *
2186 * This function drops the power domain reference obtained by
2187 * intel_display_power_get*() and schedules a work to power down the
2188 * corresponding hardware block if this is the last reference.
2189 */
2190 void __intel_display_power_put_async(struct drm_i915_private *i915,
2191 enum intel_display_power_domain domain,
2192 intel_wakeref_t wakeref)
2193 {
2194 struct i915_power_domains *power_domains = &i915->power_domains;
2195 struct intel_runtime_pm *rpm = &i915->runtime_pm;
2196 intel_wakeref_t work_wakeref = intel_runtime_pm_get_raw(rpm);
2197
2198 mutex_lock(&power_domains->lock);
2199
2200 if (power_domains->domain_use_count[domain] > 1) {
2201 __intel_display_power_put_domain(i915, domain);
2202
2203 goto out_verify;
2204 }
2205
2206 drm_WARN_ON(&i915->drm, power_domains->domain_use_count[domain] != 1);
2207
2208 /* Let a pending work requeue itself or queue a new one. */
2209 if (power_domains->async_put_wakeref) {
2210 power_domains->async_put_domains[1] |= BIT_ULL(domain);
2211 } else {
2212 power_domains->async_put_domains[0] |= BIT_ULL(domain);
2213 queue_async_put_domains_work(power_domains,
2214 fetch_and_zero(&work_wakeref));
2215 }
2216
2217 out_verify:
2218 verify_async_put_domains_state(power_domains);
2219
2220 mutex_unlock(&power_domains->lock);
2221
2222 if (work_wakeref)
2223 intel_runtime_pm_put_raw(rpm, work_wakeref);
2224
2225 intel_runtime_pm_put(rpm, wakeref);
2226 }
2227
2228 /**
2229 * intel_display_power_flush_work - flushes the async display power disabling work
2230 * @i915: i915 device instance
2231 *
2232 * Flushes any pending work that was scheduled by a preceding
2233 * intel_display_power_put_async() call, completing the disabling of the
2234 * corresponding power domains.
2235 *
2236 * Note that the work handler function may still be running after this
2237 * function returns; to ensure that the work handler isn't running use
2238 * intel_display_power_flush_work_sync() instead.
2239 */
2240 void intel_display_power_flush_work(struct drm_i915_private *i915)
2241 {
2242 struct i915_power_domains *power_domains = &i915->power_domains;
2243 intel_wakeref_t work_wakeref;
2244
2245 mutex_lock(&power_domains->lock);
2246
2247 work_wakeref = fetch_and_zero(&power_domains->async_put_wakeref);
2248 if (!work_wakeref)
2249 goto out_verify;
2250
2251 release_async_put_domains(power_domains,
2252 async_put_domains_mask(power_domains));
2253 cancel_delayed_work(&power_domains->async_put_work);
2254
2255 out_verify:
2256 verify_async_put_domains_state(power_domains);
2257
2258 mutex_unlock(&power_domains->lock);
2259
2260 if (work_wakeref)
2261 intel_runtime_pm_put_raw(&i915->runtime_pm, work_wakeref);
2262 }
2263
2264 /**
2265 * intel_display_power_flush_work_sync - flushes and syncs the async display power disabling work
2266 * @i915: i915 device instance
2267 *
2268 * Like intel_display_power_flush_work(), but also ensure that the work
2269 * handler function is not running any more when this function returns.
2270 */
2271 static void
2272 intel_display_power_flush_work_sync(struct drm_i915_private *i915)
2273 {
2274 struct i915_power_domains *power_domains = &i915->power_domains;
2275
2276 intel_display_power_flush_work(i915);
2277 cancel_delayed_work_sync(&power_domains->async_put_work);
2278
2279 verify_async_put_domains_state(power_domains);
2280
2281 drm_WARN_ON(&i915->drm, power_domains->async_put_wakeref);
2282 }
2283
2284 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
2285 /**
2286 * intel_display_power_put - release a power domain reference
2287 * @dev_priv: i915 device instance
2288 * @domain: power domain to reference
2289 * @wakeref: wakeref acquired for the reference that is being released
2290 *
2291 * This function drops the power domain reference obtained by
2292 * intel_display_power_get() and might power down the corresponding hardware
2293 * block right away if this is the last reference.
2294 */
2295 void intel_display_power_put(struct drm_i915_private *dev_priv,
2296 enum intel_display_power_domain domain,
2297 intel_wakeref_t wakeref)
2298 {
2299 __intel_display_power_put(dev_priv, domain);
2300 intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
2301 }
2302 #endif
2303
2304 #define I830_PIPES_POWER_DOMAINS ( \
2305 BIT_ULL(POWER_DOMAIN_PIPE_A) | \
2306 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2307 BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
2308 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2309 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2310 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2311 BIT_ULL(POWER_DOMAIN_INIT))
2312
2313 #define VLV_DISPLAY_POWER_DOMAINS ( \
2314 BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \
2315 BIT_ULL(POWER_DOMAIN_PIPE_A) | \
2316 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2317 BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
2318 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2319 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2320 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2321 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2322 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2323 BIT_ULL(POWER_DOMAIN_PORT_DSI) | \
2324 BIT_ULL(POWER_DOMAIN_PORT_CRT) | \
2325 BIT_ULL(POWER_DOMAIN_VGA) | \
2326 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2327 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2328 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2329 BIT_ULL(POWER_DOMAIN_GMBUS) | \
2330 BIT_ULL(POWER_DOMAIN_INIT))
2331
2332 #define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \
2333 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2334 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2335 BIT_ULL(POWER_DOMAIN_PORT_CRT) | \
2336 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2337 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2338 BIT_ULL(POWER_DOMAIN_INIT))
2339
2340 #define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \
2341 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2342 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2343 BIT_ULL(POWER_DOMAIN_INIT))
2344
2345 #define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \
2346 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2347 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2348 BIT_ULL(POWER_DOMAIN_INIT))
2349
2350 #define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \
2351 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2352 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2353 BIT_ULL(POWER_DOMAIN_INIT))
2354
2355 #define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \
2356 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2357 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2358 BIT_ULL(POWER_DOMAIN_INIT))
2359
2360 #define CHV_DISPLAY_POWER_DOMAINS ( \
2361 BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \
2362 BIT_ULL(POWER_DOMAIN_PIPE_A) | \
2363 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2364 BIT_ULL(POWER_DOMAIN_PIPE_C) | \
2365 BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
2366 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2367 BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
2368 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2369 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2370 BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
2371 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2372 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2373 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
2374 BIT_ULL(POWER_DOMAIN_PORT_DSI) | \
2375 BIT_ULL(POWER_DOMAIN_VGA) | \
2376 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2377 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2378 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2379 BIT_ULL(POWER_DOMAIN_AUX_D) | \
2380 BIT_ULL(POWER_DOMAIN_GMBUS) | \
2381 BIT_ULL(POWER_DOMAIN_INIT))
2382
2383 #define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \
2384 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2385 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2386 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2387 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2388 BIT_ULL(POWER_DOMAIN_INIT))
2389
2390 #define CHV_DPIO_CMN_D_POWER_DOMAINS ( \
2391 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
2392 BIT_ULL(POWER_DOMAIN_AUX_D) | \
2393 BIT_ULL(POWER_DOMAIN_INIT))
2394
2395 #define HSW_DISPLAY_POWER_DOMAINS ( \
2396 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2397 BIT_ULL(POWER_DOMAIN_PIPE_C) | \
2398 BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
2399 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2400 BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
2401 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2402 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2403 BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
2404 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2405 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2406 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
2407 BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \
2408 BIT_ULL(POWER_DOMAIN_VGA) | \
2409 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2410 BIT_ULL(POWER_DOMAIN_INIT))
2411
2412 #define BDW_DISPLAY_POWER_DOMAINS ( \
2413 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2414 BIT_ULL(POWER_DOMAIN_PIPE_C) | \
2415 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2416 BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
2417 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2418 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2419 BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
2420 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2421 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2422 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
2423 BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \
2424 BIT_ULL(POWER_DOMAIN_VGA) | \
2425 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2426 BIT_ULL(POWER_DOMAIN_INIT))
2427
2428 #define SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
2429 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2430 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2431 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2432 BIT_ULL(POWER_DOMAIN_PIPE_C) | \
2433 BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
2434 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2435 BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
2436 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2437 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2438 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
2439 BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \
2440 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2441 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2442 BIT_ULL(POWER_DOMAIN_AUX_D) | \
2443 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2444 BIT_ULL(POWER_DOMAIN_VGA) | \
2445 BIT_ULL(POWER_DOMAIN_INIT))
2446 #define SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS ( \
2447 BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO) | \
2448 BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO) | \
2449 BIT_ULL(POWER_DOMAIN_INIT))
2450 #define SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS ( \
2451 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO) | \
2452 BIT_ULL(POWER_DOMAIN_INIT))
2453 #define SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS ( \
2454 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO) | \
2455 BIT_ULL(POWER_DOMAIN_INIT))
2456 #define SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS ( \
2457 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO) | \
2458 BIT_ULL(POWER_DOMAIN_INIT))
2459 #define SKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
2460 SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
2461 BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
2462 BIT_ULL(POWER_DOMAIN_MODESET) | \
2463 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2464 BIT_ULL(POWER_DOMAIN_INIT))
2465
2466 #define BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
2467 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2468 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2469 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2470 BIT_ULL(POWER_DOMAIN_PIPE_C) | \
2471 BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
2472 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2473 BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
2474 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2475 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2476 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2477 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2478 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2479 BIT_ULL(POWER_DOMAIN_VGA) | \
2480 BIT_ULL(POWER_DOMAIN_INIT))
2481 #define BXT_DISPLAY_DC_OFF_POWER_DOMAINS ( \
2482 BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
2483 BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
2484 BIT_ULL(POWER_DOMAIN_MODESET) | \
2485 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2486 BIT_ULL(POWER_DOMAIN_GMBUS) | \
2487 BIT_ULL(POWER_DOMAIN_INIT))
2488 #define BXT_DPIO_CMN_A_POWER_DOMAINS ( \
2489 BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \
2490 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2491 BIT_ULL(POWER_DOMAIN_INIT))
2492 #define BXT_DPIO_CMN_BC_POWER_DOMAINS ( \
2493 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2494 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2495 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2496 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2497 BIT_ULL(POWER_DOMAIN_INIT))
2498
2499 #define GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
2500 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2501 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2502 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2503 BIT_ULL(POWER_DOMAIN_PIPE_C) | \
2504 BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
2505 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2506 BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
2507 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2508 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2509 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2510 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2511 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2512 BIT_ULL(POWER_DOMAIN_VGA) | \
2513 BIT_ULL(POWER_DOMAIN_INIT))
2514 #define GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS ( \
2515 BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO))
2516 #define GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS ( \
2517 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO))
2518 #define GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS ( \
2519 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO))
2520 #define GLK_DPIO_CMN_A_POWER_DOMAINS ( \
2521 BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \
2522 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2523 BIT_ULL(POWER_DOMAIN_INIT))
2524 #define GLK_DPIO_CMN_B_POWER_DOMAINS ( \
2525 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2526 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2527 BIT_ULL(POWER_DOMAIN_INIT))
2528 #define GLK_DPIO_CMN_C_POWER_DOMAINS ( \
2529 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2530 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2531 BIT_ULL(POWER_DOMAIN_INIT))
2532 #define GLK_DISPLAY_AUX_A_POWER_DOMAINS ( \
2533 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2534 BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \
2535 BIT_ULL(POWER_DOMAIN_INIT))
2536 #define GLK_DISPLAY_AUX_B_POWER_DOMAINS ( \
2537 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2538 BIT_ULL(POWER_DOMAIN_INIT))
2539 #define GLK_DISPLAY_AUX_C_POWER_DOMAINS ( \
2540 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2541 BIT_ULL(POWER_DOMAIN_INIT))
2542 #define GLK_DISPLAY_DC_OFF_POWER_DOMAINS ( \
2543 GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
2544 BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
2545 BIT_ULL(POWER_DOMAIN_MODESET) | \
2546 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2547 BIT_ULL(POWER_DOMAIN_GMBUS) | \
2548 BIT_ULL(POWER_DOMAIN_INIT))
2549
2550 #define CNL_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
2551 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2552 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2553 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2554 BIT_ULL(POWER_DOMAIN_PIPE_C) | \
2555 BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
2556 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2557 BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
2558 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2559 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2560 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
2561 BIT_ULL(POWER_DOMAIN_PORT_DDI_F_LANES) | \
2562 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2563 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2564 BIT_ULL(POWER_DOMAIN_AUX_D) | \
2565 BIT_ULL(POWER_DOMAIN_AUX_F) | \
2566 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2567 BIT_ULL(POWER_DOMAIN_VGA) | \
2568 BIT_ULL(POWER_DOMAIN_INIT))
2569 #define CNL_DISPLAY_DDI_A_IO_POWER_DOMAINS ( \
2570 BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO) | \
2571 BIT_ULL(POWER_DOMAIN_INIT))
2572 #define CNL_DISPLAY_DDI_B_IO_POWER_DOMAINS ( \
2573 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO) | \
2574 BIT_ULL(POWER_DOMAIN_INIT))
2575 #define CNL_DISPLAY_DDI_C_IO_POWER_DOMAINS ( \
2576 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO) | \
2577 BIT_ULL(POWER_DOMAIN_INIT))
2578 #define CNL_DISPLAY_DDI_D_IO_POWER_DOMAINS ( \
2579 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO) | \
2580 BIT_ULL(POWER_DOMAIN_INIT))
2581 #define CNL_DISPLAY_AUX_A_POWER_DOMAINS ( \
2582 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2583 BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \
2584 BIT_ULL(POWER_DOMAIN_INIT))
2585 #define CNL_DISPLAY_AUX_B_POWER_DOMAINS ( \
2586 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2587 BIT_ULL(POWER_DOMAIN_INIT))
2588 #define CNL_DISPLAY_AUX_C_POWER_DOMAINS ( \
2589 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2590 BIT_ULL(POWER_DOMAIN_INIT))
2591 #define CNL_DISPLAY_AUX_D_POWER_DOMAINS ( \
2592 BIT_ULL(POWER_DOMAIN_AUX_D) | \
2593 BIT_ULL(POWER_DOMAIN_INIT))
2594 #define CNL_DISPLAY_AUX_F_POWER_DOMAINS ( \
2595 BIT_ULL(POWER_DOMAIN_AUX_F) | \
2596 BIT_ULL(POWER_DOMAIN_INIT))
2597 #define CNL_DISPLAY_DDI_F_IO_POWER_DOMAINS ( \
2598 BIT_ULL(POWER_DOMAIN_PORT_DDI_F_IO) | \
2599 BIT_ULL(POWER_DOMAIN_INIT))
2600 #define CNL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
2601 CNL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
2602 BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
2603 BIT_ULL(POWER_DOMAIN_MODESET) | \
2604 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2605 BIT_ULL(POWER_DOMAIN_INIT))
2606
2607 /*
2608 * ICL PW_0/PG_0 domains (HW/DMC control):
2609 * - PCI
2610 * - clocks except port PLL
2611 * - central power except FBC
2612 * - shared functions except pipe interrupts, pipe MBUS, DBUF registers
2613 * ICL PW_1/PG_1 domains (HW/DMC control):
2614 * - DBUF function
2615 * - PIPE_A and its planes, except VGA
2616 * - transcoder EDP + PSR
2617 * - transcoder DSI
2618 * - DDI_A
2619 * - FBC
2620 */
2621 #define ICL_PW_4_POWER_DOMAINS ( \
2622 BIT_ULL(POWER_DOMAIN_PIPE_C) | \
2623 BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
2624 BIT_ULL(POWER_DOMAIN_INIT))
2625 /* VDSC/joining */
2626 #define ICL_PW_3_POWER_DOMAINS ( \
2627 ICL_PW_4_POWER_DOMAINS | \
2628 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2629 BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
2630 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2631 BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
2632 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2633 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
2634 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
2635 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
2636 BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \
2637 BIT_ULL(POWER_DOMAIN_PORT_DDI_F_LANES) | \
2638 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2639 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2640 BIT_ULL(POWER_DOMAIN_AUX_D) | \
2641 BIT_ULL(POWER_DOMAIN_AUX_E) | \
2642 BIT_ULL(POWER_DOMAIN_AUX_F) | \
2643 BIT_ULL(POWER_DOMAIN_AUX_C_TBT) | \
2644 BIT_ULL(POWER_DOMAIN_AUX_D_TBT) | \
2645 BIT_ULL(POWER_DOMAIN_AUX_E_TBT) | \
2646 BIT_ULL(POWER_DOMAIN_AUX_F_TBT) | \
2647 BIT_ULL(POWER_DOMAIN_VGA) | \
2648 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2649 BIT_ULL(POWER_DOMAIN_INIT))
2650 /*
2651 * - transcoder WD
2652 * - KVMR (HW control)
2653 */
2654 #define ICL_PW_2_POWER_DOMAINS ( \
2655 ICL_PW_3_POWER_DOMAINS | \
2656 BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \
2657 BIT_ULL(POWER_DOMAIN_INIT))
2658 /*
2659 * - KVMR (HW control)
2660 */
2661 #define ICL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
2662 ICL_PW_2_POWER_DOMAINS | \
2663 BIT_ULL(POWER_DOMAIN_MODESET) | \
2664 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2665 BIT_ULL(POWER_DOMAIN_DPLL_DC_OFF) | \
2666 BIT_ULL(POWER_DOMAIN_INIT))
2667
2668 #define ICL_DDI_IO_A_POWER_DOMAINS ( \
2669 BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO))
2670 #define ICL_DDI_IO_B_POWER_DOMAINS ( \
2671 BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO))
2672 #define ICL_DDI_IO_C_POWER_DOMAINS ( \
2673 BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO))
2674 #define ICL_DDI_IO_D_POWER_DOMAINS ( \
2675 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO))
2676 #define ICL_DDI_IO_E_POWER_DOMAINS ( \
2677 BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO))
2678 #define ICL_DDI_IO_F_POWER_DOMAINS ( \
2679 BIT_ULL(POWER_DOMAIN_PORT_DDI_F_IO))
2680
2681 #define ICL_AUX_A_IO_POWER_DOMAINS ( \
2682 BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \
2683 BIT_ULL(POWER_DOMAIN_AUX_A))
2684 #define ICL_AUX_B_IO_POWER_DOMAINS ( \
2685 BIT_ULL(POWER_DOMAIN_AUX_B))
2686 #define ICL_AUX_C_TC1_IO_POWER_DOMAINS ( \
2687 BIT_ULL(POWER_DOMAIN_AUX_C))
2688 #define ICL_AUX_D_TC2_IO_POWER_DOMAINS ( \
2689 BIT_ULL(POWER_DOMAIN_AUX_D))
2690 #define ICL_AUX_E_TC3_IO_POWER_DOMAINS ( \
2691 BIT_ULL(POWER_DOMAIN_AUX_E))
2692 #define ICL_AUX_F_TC4_IO_POWER_DOMAINS ( \
2693 BIT_ULL(POWER_DOMAIN_AUX_F))
2694 #define ICL_AUX_C_TBT1_IO_POWER_DOMAINS ( \
2695 BIT_ULL(POWER_DOMAIN_AUX_C_TBT))
2696 #define ICL_AUX_D_TBT2_IO_POWER_DOMAINS ( \
2697 BIT_ULL(POWER_DOMAIN_AUX_D_TBT))
2698 #define ICL_AUX_E_TBT3_IO_POWER_DOMAINS ( \
2699 BIT_ULL(POWER_DOMAIN_AUX_E_TBT))
2700 #define ICL_AUX_F_TBT4_IO_POWER_DOMAINS ( \
2701 BIT_ULL(POWER_DOMAIN_AUX_F_TBT))
2702
2703 #define TGL_PW_5_POWER_DOMAINS ( \
2704 BIT_ULL(POWER_DOMAIN_PIPE_D) | \
2705 BIT_ULL(POWER_DOMAIN_TRANSCODER_D) | \
2706 BIT_ULL(POWER_DOMAIN_PIPE_D_PANEL_FITTER) | \
2707 BIT_ULL(POWER_DOMAIN_INIT))
2708
2709 #define TGL_PW_4_POWER_DOMAINS ( \
2710 TGL_PW_5_POWER_DOMAINS | \
2711 BIT_ULL(POWER_DOMAIN_PIPE_C) | \
2712 BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
2713 BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
2714 BIT_ULL(POWER_DOMAIN_INIT))
2715
2716 #define TGL_PW_3_POWER_DOMAINS ( \
2717 TGL_PW_4_POWER_DOMAINS | \
2718 BIT_ULL(POWER_DOMAIN_PIPE_B) | \
2719 BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
2720 BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
2721 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
2722 BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \
2723 BIT_ULL(POWER_DOMAIN_PORT_DDI_F_LANES) | \
2724 BIT_ULL(POWER_DOMAIN_PORT_DDI_G_LANES) | \
2725 BIT_ULL(POWER_DOMAIN_PORT_DDI_H_LANES) | \
2726 BIT_ULL(POWER_DOMAIN_PORT_DDI_I_LANES) | \
2727 BIT_ULL(POWER_DOMAIN_AUX_D) | \
2728 BIT_ULL(POWER_DOMAIN_AUX_E) | \
2729 BIT_ULL(POWER_DOMAIN_AUX_F) | \
2730 BIT_ULL(POWER_DOMAIN_AUX_G) | \
2731 BIT_ULL(POWER_DOMAIN_AUX_H) | \
2732 BIT_ULL(POWER_DOMAIN_AUX_I) | \
2733 BIT_ULL(POWER_DOMAIN_AUX_D_TBT) | \
2734 BIT_ULL(POWER_DOMAIN_AUX_E_TBT) | \
2735 BIT_ULL(POWER_DOMAIN_AUX_F_TBT) | \
2736 BIT_ULL(POWER_DOMAIN_AUX_G_TBT) | \
2737 BIT_ULL(POWER_DOMAIN_AUX_H_TBT) | \
2738 BIT_ULL(POWER_DOMAIN_AUX_I_TBT) | \
2739 BIT_ULL(POWER_DOMAIN_VGA) | \
2740 BIT_ULL(POWER_DOMAIN_AUDIO) | \
2741 BIT_ULL(POWER_DOMAIN_INIT))
2742
2743 #define TGL_PW_2_POWER_DOMAINS ( \
2744 TGL_PW_3_POWER_DOMAINS | \
2745 BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \
2746 BIT_ULL(POWER_DOMAIN_INIT))
2747
2748 #define TGL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
2749 TGL_PW_3_POWER_DOMAINS | \
2750 BIT_ULL(POWER_DOMAIN_MODESET) | \
2751 BIT_ULL(POWER_DOMAIN_AUX_A) | \
2752 BIT_ULL(POWER_DOMAIN_AUX_B) | \
2753 BIT_ULL(POWER_DOMAIN_AUX_C) | \
2754 BIT_ULL(POWER_DOMAIN_INIT))
2755
2756 #define TGL_DDI_IO_D_TC1_POWER_DOMAINS ( \
2757 BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO))
2758 #define TGL_DDI_IO_E_TC2_POWER_DOMAINS ( \
2759 BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO))
2760 #define TGL_DDI_IO_F_TC3_POWER_DOMAINS ( \
2761 BIT_ULL(POWER_DOMAIN_PORT_DDI_F_IO))
2762 #define TGL_DDI_IO_G_TC4_POWER_DOMAINS ( \
2763 BIT_ULL(POWER_DOMAIN_PORT_DDI_G_IO))
2764 #define TGL_DDI_IO_H_TC5_POWER_DOMAINS ( \
2765 BIT_ULL(POWER_DOMAIN_PORT_DDI_H_IO))
2766 #define TGL_DDI_IO_I_TC6_POWER_DOMAINS ( \
2767 BIT_ULL(POWER_DOMAIN_PORT_DDI_I_IO))
2768
2769 #define TGL_AUX_A_IO_POWER_DOMAINS ( \
2770 BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \
2771 BIT_ULL(POWER_DOMAIN_AUX_A))
2772 #define TGL_AUX_B_IO_POWER_DOMAINS ( \
2773 BIT_ULL(POWER_DOMAIN_AUX_B))
2774 #define TGL_AUX_C_IO_POWER_DOMAINS ( \
2775 BIT_ULL(POWER_DOMAIN_AUX_C))
2776 #define TGL_AUX_D_TC1_IO_POWER_DOMAINS ( \
2777 BIT_ULL(POWER_DOMAIN_AUX_D))
2778 #define TGL_AUX_E_TC2_IO_POWER_DOMAINS ( \
2779 BIT_ULL(POWER_DOMAIN_AUX_E))
2780 #define TGL_AUX_F_TC3_IO_POWER_DOMAINS ( \
2781 BIT_ULL(POWER_DOMAIN_AUX_F))
2782 #define TGL_AUX_G_TC4_IO_POWER_DOMAINS ( \
2783 BIT_ULL(POWER_DOMAIN_AUX_G))
2784 #define TGL_AUX_H_TC5_IO_POWER_DOMAINS ( \
2785 BIT_ULL(POWER_DOMAIN_AUX_H))
2786 #define TGL_AUX_I_TC6_IO_POWER_DOMAINS ( \
2787 BIT_ULL(POWER_DOMAIN_AUX_I))
2788 #define TGL_AUX_D_TBT1_IO_POWER_DOMAINS ( \
2789 BIT_ULL(POWER_DOMAIN_AUX_D_TBT))
2790 #define TGL_AUX_E_TBT2_IO_POWER_DOMAINS ( \
2791 BIT_ULL(POWER_DOMAIN_AUX_E_TBT))
2792 #define TGL_AUX_F_TBT3_IO_POWER_DOMAINS ( \
2793 BIT_ULL(POWER_DOMAIN_AUX_F_TBT))
2794 #define TGL_AUX_G_TBT4_IO_POWER_DOMAINS ( \
2795 BIT_ULL(POWER_DOMAIN_AUX_G_TBT))
2796 #define TGL_AUX_H_TBT5_IO_POWER_DOMAINS ( \
2797 BIT_ULL(POWER_DOMAIN_AUX_H_TBT))
2798 #define TGL_AUX_I_TBT6_IO_POWER_DOMAINS ( \
2799 BIT_ULL(POWER_DOMAIN_AUX_I_TBT))
2800
2801 static const struct i915_power_well_ops i9xx_always_on_power_well_ops = {
2802 .sync_hw = i9xx_power_well_sync_hw_noop,
2803 .enable = i9xx_always_on_power_well_noop,
2804 .disable = i9xx_always_on_power_well_noop,
2805 .is_enabled = i9xx_always_on_power_well_enabled,
2806 };
2807
2808 static const struct i915_power_well_ops chv_pipe_power_well_ops = {
2809 .sync_hw = chv_pipe_power_well_sync_hw,
2810 .enable = chv_pipe_power_well_enable,
2811 .disable = chv_pipe_power_well_disable,
2812 .is_enabled = chv_pipe_power_well_enabled,
2813 };
2814
2815 static const struct i915_power_well_ops chv_dpio_cmn_power_well_ops = {
2816 .sync_hw = i9xx_power_well_sync_hw_noop,
2817 .enable = chv_dpio_cmn_power_well_enable,
2818 .disable = chv_dpio_cmn_power_well_disable,
2819 .is_enabled = vlv_power_well_enabled,
2820 };
2821
2822 static const struct i915_power_well_desc i9xx_always_on_power_well[] = {
2823 {
2824 .name = "always-on",
2825 .always_on = true,
2826 .domains = POWER_DOMAIN_MASK,
2827 .ops = &i9xx_always_on_power_well_ops,
2828 .id = DISP_PW_ID_NONE,
2829 },
2830 };
2831
2832 static const struct i915_power_well_ops i830_pipes_power_well_ops = {
2833 .sync_hw = i830_pipes_power_well_sync_hw,
2834 .enable = i830_pipes_power_well_enable,
2835 .disable = i830_pipes_power_well_disable,
2836 .is_enabled = i830_pipes_power_well_enabled,
2837 };
2838
2839 static const struct i915_power_well_desc i830_power_wells[] = {
2840 {
2841 .name = "always-on",
2842 .always_on = true,
2843 .domains = POWER_DOMAIN_MASK,
2844 .ops = &i9xx_always_on_power_well_ops,
2845 .id = DISP_PW_ID_NONE,
2846 },
2847 {
2848 .name = "pipes",
2849 .domains = I830_PIPES_POWER_DOMAINS,
2850 .ops = &i830_pipes_power_well_ops,
2851 .id = DISP_PW_ID_NONE,
2852 },
2853 };
2854
2855 static const struct i915_power_well_ops hsw_power_well_ops = {
2856 .sync_hw = hsw_power_well_sync_hw,
2857 .enable = hsw_power_well_enable,
2858 .disable = hsw_power_well_disable,
2859 .is_enabled = hsw_power_well_enabled,
2860 };
2861
2862 static const struct i915_power_well_ops gen9_dc_off_power_well_ops = {
2863 .sync_hw = i9xx_power_well_sync_hw_noop,
2864 .enable = gen9_dc_off_power_well_enable,
2865 .disable = gen9_dc_off_power_well_disable,
2866 .is_enabled = gen9_dc_off_power_well_enabled,
2867 };
2868
2869 static const struct i915_power_well_ops bxt_dpio_cmn_power_well_ops = {
2870 .sync_hw = i9xx_power_well_sync_hw_noop,
2871 .enable = bxt_dpio_cmn_power_well_enable,
2872 .disable = bxt_dpio_cmn_power_well_disable,
2873 .is_enabled = bxt_dpio_cmn_power_well_enabled,
2874 };
2875
2876 static const struct i915_power_well_regs hsw_power_well_regs = {
2877 .bios = HSW_PWR_WELL_CTL1,
2878 .driver = HSW_PWR_WELL_CTL2,
2879 .kvmr = HSW_PWR_WELL_CTL3,
2880 .debug = HSW_PWR_WELL_CTL4,
2881 };
2882
2883 static const struct i915_power_well_desc hsw_power_wells[] = {
2884 {
2885 .name = "always-on",
2886 .always_on = true,
2887 .domains = POWER_DOMAIN_MASK,
2888 .ops = &i9xx_always_on_power_well_ops,
2889 .id = DISP_PW_ID_NONE,
2890 },
2891 {
2892 .name = "display",
2893 .domains = HSW_DISPLAY_POWER_DOMAINS,
2894 .ops = &hsw_power_well_ops,
2895 .id = HSW_DISP_PW_GLOBAL,
2896 {
2897 .hsw.regs = &hsw_power_well_regs,
2898 .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
2899 .hsw.has_vga = true,
2900 },
2901 },
2902 };
2903
2904 static const struct i915_power_well_desc bdw_power_wells[] = {
2905 {
2906 .name = "always-on",
2907 .always_on = true,
2908 .domains = POWER_DOMAIN_MASK,
2909 .ops = &i9xx_always_on_power_well_ops,
2910 .id = DISP_PW_ID_NONE,
2911 },
2912 {
2913 .name = "display",
2914 .domains = BDW_DISPLAY_POWER_DOMAINS,
2915 .ops = &hsw_power_well_ops,
2916 .id = HSW_DISP_PW_GLOBAL,
2917 {
2918 .hsw.regs = &hsw_power_well_regs,
2919 .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
2920 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
2921 .hsw.has_vga = true,
2922 },
2923 },
2924 };
2925
2926 static const struct i915_power_well_ops vlv_display_power_well_ops = {
2927 .sync_hw = i9xx_power_well_sync_hw_noop,
2928 .enable = vlv_display_power_well_enable,
2929 .disable = vlv_display_power_well_disable,
2930 .is_enabled = vlv_power_well_enabled,
2931 };
2932
2933 static const struct i915_power_well_ops vlv_dpio_cmn_power_well_ops = {
2934 .sync_hw = i9xx_power_well_sync_hw_noop,
2935 .enable = vlv_dpio_cmn_power_well_enable,
2936 .disable = vlv_dpio_cmn_power_well_disable,
2937 .is_enabled = vlv_power_well_enabled,
2938 };
2939
2940 static const struct i915_power_well_ops vlv_dpio_power_well_ops = {
2941 .sync_hw = i9xx_power_well_sync_hw_noop,
2942 .enable = vlv_power_well_enable,
2943 .disable = vlv_power_well_disable,
2944 .is_enabled = vlv_power_well_enabled,
2945 };
2946
2947 static const struct i915_power_well_desc vlv_power_wells[] = {
2948 {
2949 .name = "always-on",
2950 .always_on = true,
2951 .domains = POWER_DOMAIN_MASK,
2952 .ops = &i9xx_always_on_power_well_ops,
2953 .id = DISP_PW_ID_NONE,
2954 },
2955 {
2956 .name = "display",
2957 .domains = VLV_DISPLAY_POWER_DOMAINS,
2958 .ops = &vlv_display_power_well_ops,
2959 .id = VLV_DISP_PW_DISP2D,
2960 {
2961 .vlv.idx = PUNIT_PWGT_IDX_DISP2D,
2962 },
2963 },
2964 {
2965 .name = "dpio-tx-b-01",
2966 .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
2967 VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
2968 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
2969 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
2970 .ops = &vlv_dpio_power_well_ops,
2971 .id = DISP_PW_ID_NONE,
2972 {
2973 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_01,
2974 },
2975 },
2976 {
2977 .name = "dpio-tx-b-23",
2978 .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
2979 VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
2980 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
2981 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
2982 .ops = &vlv_dpio_power_well_ops,
2983 .id = DISP_PW_ID_NONE,
2984 {
2985 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_23,
2986 },
2987 },
2988 {
2989 .name = "dpio-tx-c-01",
2990 .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
2991 VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
2992 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
2993 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
2994 .ops = &vlv_dpio_power_well_ops,
2995 .id = DISP_PW_ID_NONE,
2996 {
2997 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_01,
2998 },
2999 },
3000 {
3001 .name = "dpio-tx-c-23",
3002 .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
3003 VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
3004 VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
3005 VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
3006 .ops = &vlv_dpio_power_well_ops,
3007 .id = DISP_PW_ID_NONE,
3008 {
3009 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_23,
3010 },
3011 },
3012 {
3013 .name = "dpio-common",
3014 .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS,
3015 .ops = &vlv_dpio_cmn_power_well_ops,
3016 .id = VLV_DISP_PW_DPIO_CMN_BC,
3017 {
3018 .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
3019 },
3020 },
3021 };
3022
3023 static const struct i915_power_well_desc chv_power_wells[] = {
3024 {
3025 .name = "always-on",
3026 .always_on = true,
3027 .domains = POWER_DOMAIN_MASK,
3028 .ops = &i9xx_always_on_power_well_ops,
3029 .id = DISP_PW_ID_NONE,
3030 },
3031 {
3032 .name = "display",
3033 /*
3034 * Pipe A power well is the new disp2d well. Pipe B and C
3035 * power wells don't actually exist. Pipe A power well is
3036 * required for any pipe to work.
3037 */
3038 .domains = CHV_DISPLAY_POWER_DOMAINS,
3039 .ops = &chv_pipe_power_well_ops,
3040 .id = DISP_PW_ID_NONE,
3041 },
3042 {
3043 .name = "dpio-common-bc",
3044 .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS,
3045 .ops = &chv_dpio_cmn_power_well_ops,
3046 .id = VLV_DISP_PW_DPIO_CMN_BC,
3047 {
3048 .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
3049 },
3050 },
3051 {
3052 .name = "dpio-common-d",
3053 .domains = CHV_DPIO_CMN_D_POWER_DOMAINS,
3054 .ops = &chv_dpio_cmn_power_well_ops,
3055 .id = CHV_DISP_PW_DPIO_CMN_D,
3056 {
3057 .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_D,
3058 },
3059 },
3060 };
3061
3062 bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,
3063 enum i915_power_well_id power_well_id)
3064 {
3065 struct i915_power_well *power_well;
3066 bool ret;
3067
3068 power_well = lookup_power_well(dev_priv, power_well_id);
3069 ret = power_well->desc->ops->is_enabled(dev_priv, power_well);
3070
3071 return ret;
3072 }
3073
3074 static const struct i915_power_well_desc skl_power_wells[] = {
3075 {
3076 .name = "always-on",
3077 .always_on = true,
3078 .domains = POWER_DOMAIN_MASK,
3079 .ops = &i9xx_always_on_power_well_ops,
3080 .id = DISP_PW_ID_NONE,
3081 },
3082 {
3083 .name = "power well 1",
3084 /* Handled by the DMC firmware */
3085 .always_on = true,
3086 .domains = 0,
3087 .ops = &hsw_power_well_ops,
3088 .id = SKL_DISP_PW_1,
3089 {
3090 .hsw.regs = &hsw_power_well_regs,
3091 .hsw.idx = SKL_PW_CTL_IDX_PW_1,
3092 .hsw.has_fuses = true,
3093 },
3094 },
3095 {
3096 .name = "MISC IO power well",
3097 /* Handled by the DMC firmware */
3098 .always_on = true,
3099 .domains = 0,
3100 .ops = &hsw_power_well_ops,
3101 .id = SKL_DISP_PW_MISC_IO,
3102 {
3103 .hsw.regs = &hsw_power_well_regs,
3104 .hsw.idx = SKL_PW_CTL_IDX_MISC_IO,
3105 },
3106 },
3107 {
3108 .name = "DC off",
3109 .domains = SKL_DISPLAY_DC_OFF_POWER_DOMAINS,
3110 .ops = &gen9_dc_off_power_well_ops,
3111 .id = SKL_DISP_DC_OFF,
3112 },
3113 {
3114 .name = "power well 2",
3115 .domains = SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS,
3116 .ops = &hsw_power_well_ops,
3117 .id = SKL_DISP_PW_2,
3118 {
3119 .hsw.regs = &hsw_power_well_regs,
3120 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
3121 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
3122 .hsw.has_vga = true,
3123 .hsw.has_fuses = true,
3124 },
3125 },
3126 {
3127 .name = "DDI A/E IO power well",
3128 .domains = SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS,
3129 .ops = &hsw_power_well_ops,
3130 .id = DISP_PW_ID_NONE,
3131 {
3132 .hsw.regs = &hsw_power_well_regs,
3133 .hsw.idx = SKL_PW_CTL_IDX_DDI_A_E,
3134 },
3135 },
3136 {
3137 .name = "DDI B IO power well",
3138 .domains = SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS,
3139 .ops = &hsw_power_well_ops,
3140 .id = DISP_PW_ID_NONE,
3141 {
3142 .hsw.regs = &hsw_power_well_regs,
3143 .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
3144 },
3145 },
3146 {
3147 .name = "DDI C IO power well",
3148 .domains = SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS,
3149 .ops = &hsw_power_well_ops,
3150 .id = DISP_PW_ID_NONE,
3151 {
3152 .hsw.regs = &hsw_power_well_regs,
3153 .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
3154 },
3155 },
3156 {
3157 .name = "DDI D IO power well",
3158 .domains = SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS,
3159 .ops = &hsw_power_well_ops,
3160 .id = DISP_PW_ID_NONE,
3161 {
3162 .hsw.regs = &hsw_power_well_regs,
3163 .hsw.idx = SKL_PW_CTL_IDX_DDI_D,
3164 },
3165 },
3166 };
3167
3168 static const struct i915_power_well_desc bxt_power_wells[] = {
3169 {
3170 .name = "always-on",
3171 .always_on = true,
3172 .domains = POWER_DOMAIN_MASK,
3173 .ops = &i9xx_always_on_power_well_ops,
3174 .id = DISP_PW_ID_NONE,
3175 },
3176 {
3177 .name = "power well 1",
3178 /* Handled by the DMC firmware */
3179 .always_on = true,
3180 .domains = 0,
3181 .ops = &hsw_power_well_ops,
3182 .id = SKL_DISP_PW_1,
3183 {
3184 .hsw.regs = &hsw_power_well_regs,
3185 .hsw.idx = SKL_PW_CTL_IDX_PW_1,
3186 .hsw.has_fuses = true,
3187 },
3188 },
3189 {
3190 .name = "DC off",
3191 .domains = BXT_DISPLAY_DC_OFF_POWER_DOMAINS,
3192 .ops = &gen9_dc_off_power_well_ops,
3193 .id = SKL_DISP_DC_OFF,
3194 },
3195 {
3196 .name = "power well 2",
3197 .domains = BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS,
3198 .ops = &hsw_power_well_ops,
3199 .id = SKL_DISP_PW_2,
3200 {
3201 .hsw.regs = &hsw_power_well_regs,
3202 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
3203 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
3204 .hsw.has_vga = true,
3205 .hsw.has_fuses = true,
3206 },
3207 },
3208 {
3209 .name = "dpio-common-a",
3210 .domains = BXT_DPIO_CMN_A_POWER_DOMAINS,
3211 .ops = &bxt_dpio_cmn_power_well_ops,
3212 .id = BXT_DISP_PW_DPIO_CMN_A,
3213 {
3214 .bxt.phy = DPIO_PHY1,
3215 },
3216 },
3217 {
3218 .name = "dpio-common-bc",
3219 .domains = BXT_DPIO_CMN_BC_POWER_DOMAINS,
3220 .ops = &bxt_dpio_cmn_power_well_ops,
3221 .id = VLV_DISP_PW_DPIO_CMN_BC,
3222 {
3223 .bxt.phy = DPIO_PHY0,
3224 },
3225 },
3226 };
3227
3228 static const struct i915_power_well_desc glk_power_wells[] = {
3229 {
3230 .name = "always-on",
3231 .always_on = true,
3232 .domains = POWER_DOMAIN_MASK,
3233 .ops = &i9xx_always_on_power_well_ops,
3234 .id = DISP_PW_ID_NONE,
3235 },
3236 {
3237 .name = "power well 1",
3238 /* Handled by the DMC firmware */
3239 .always_on = true,
3240 .domains = 0,
3241 .ops = &hsw_power_well_ops,
3242 .id = SKL_DISP_PW_1,
3243 {
3244 .hsw.regs = &hsw_power_well_regs,
3245 .hsw.idx = SKL_PW_CTL_IDX_PW_1,
3246 .hsw.has_fuses = true,
3247 },
3248 },
3249 {
3250 .name = "DC off",
3251 .domains = GLK_DISPLAY_DC_OFF_POWER_DOMAINS,
3252 .ops = &gen9_dc_off_power_well_ops,
3253 .id = SKL_DISP_DC_OFF,
3254 },
3255 {
3256 .name = "power well 2",
3257 .domains = GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS,
3258 .ops = &hsw_power_well_ops,
3259 .id = SKL_DISP_PW_2,
3260 {
3261 .hsw.regs = &hsw_power_well_regs,
3262 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
3263 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
3264 .hsw.has_vga = true,
3265 .hsw.has_fuses = true,
3266 },
3267 },
3268 {
3269 .name = "dpio-common-a",
3270 .domains = GLK_DPIO_CMN_A_POWER_DOMAINS,
3271 .ops = &bxt_dpio_cmn_power_well_ops,
3272 .id = BXT_DISP_PW_DPIO_CMN_A,
3273 {
3274 .bxt.phy = DPIO_PHY1,
3275 },
3276 },
3277 {
3278 .name = "dpio-common-b",
3279 .domains = GLK_DPIO_CMN_B_POWER_DOMAINS,
3280 .ops = &bxt_dpio_cmn_power_well_ops,
3281 .id = VLV_DISP_PW_DPIO_CMN_BC,
3282 {
3283 .bxt.phy = DPIO_PHY0,
3284 },
3285 },
3286 {
3287 .name = "dpio-common-c",
3288 .domains = GLK_DPIO_CMN_C_POWER_DOMAINS,
3289 .ops = &bxt_dpio_cmn_power_well_ops,
3290 .id = GLK_DISP_PW_DPIO_CMN_C,
3291 {
3292 .bxt.phy = DPIO_PHY2,
3293 },
3294 },
3295 {
3296 .name = "AUX A",
3297 .domains = GLK_DISPLAY_AUX_A_POWER_DOMAINS,
3298 .ops = &hsw_power_well_ops,
3299 .id = DISP_PW_ID_NONE,
3300 {
3301 .hsw.regs = &hsw_power_well_regs,
3302 .hsw.idx = GLK_PW_CTL_IDX_AUX_A,
3303 },
3304 },
3305 {
3306 .name = "AUX B",
3307 .domains = GLK_DISPLAY_AUX_B_POWER_DOMAINS,
3308 .ops = &hsw_power_well_ops,
3309 .id = DISP_PW_ID_NONE,
3310 {
3311 .hsw.regs = &hsw_power_well_regs,
3312 .hsw.idx = GLK_PW_CTL_IDX_AUX_B,
3313 },
3314 },
3315 {
3316 .name = "AUX C",
3317 .domains = GLK_DISPLAY_AUX_C_POWER_DOMAINS,
3318 .ops = &hsw_power_well_ops,
3319 .id = DISP_PW_ID_NONE,
3320 {
3321 .hsw.regs = &hsw_power_well_regs,
3322 .hsw.idx = GLK_PW_CTL_IDX_AUX_C,
3323 },
3324 },
3325 {
3326 .name = "DDI A IO power well",
3327 .domains = GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS,
3328 .ops = &hsw_power_well_ops,
3329 .id = DISP_PW_ID_NONE,
3330 {
3331 .hsw.regs = &hsw_power_well_regs,
3332 .hsw.idx = GLK_PW_CTL_IDX_DDI_A,
3333 },
3334 },
3335 {
3336 .name = "DDI B IO power well",
3337 .domains = GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS,
3338 .ops = &hsw_power_well_ops,
3339 .id = DISP_PW_ID_NONE,
3340 {
3341 .hsw.regs = &hsw_power_well_regs,
3342 .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
3343 },
3344 },
3345 {
3346 .name = "DDI C IO power well",
3347 .domains = GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS,
3348 .ops = &hsw_power_well_ops,
3349 .id = DISP_PW_ID_NONE,
3350 {
3351 .hsw.regs = &hsw_power_well_regs,
3352 .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
3353 },
3354 },
3355 };
3356
3357 static const struct i915_power_well_desc cnl_power_wells[] = {
3358 {
3359 .name = "always-on",
3360 .always_on = true,
3361 .domains = POWER_DOMAIN_MASK,
3362 .ops = &i9xx_always_on_power_well_ops,
3363 .id = DISP_PW_ID_NONE,
3364 },
3365 {
3366 .name = "power well 1",
3367 /* Handled by the DMC firmware */
3368 .always_on = true,
3369 .domains = 0,
3370 .ops = &hsw_power_well_ops,
3371 .id = SKL_DISP_PW_1,
3372 {
3373 .hsw.regs = &hsw_power_well_regs,
3374 .hsw.idx = SKL_PW_CTL_IDX_PW_1,
3375 .hsw.has_fuses = true,
3376 },
3377 },
3378 {
3379 .name = "AUX A",
3380 .domains = CNL_DISPLAY_AUX_A_POWER_DOMAINS,
3381 .ops = &hsw_power_well_ops,
3382 .id = DISP_PW_ID_NONE,
3383 {
3384 .hsw.regs = &hsw_power_well_regs,
3385 .hsw.idx = GLK_PW_CTL_IDX_AUX_A,
3386 },
3387 },
3388 {
3389 .name = "AUX B",
3390 .domains = CNL_DISPLAY_AUX_B_POWER_DOMAINS,
3391 .ops = &hsw_power_well_ops,
3392 .id = DISP_PW_ID_NONE,
3393 {
3394 .hsw.regs = &hsw_power_well_regs,
3395 .hsw.idx = GLK_PW_CTL_IDX_AUX_B,
3396 },
3397 },
3398 {
3399 .name = "AUX C",
3400 .domains = CNL_DISPLAY_AUX_C_POWER_DOMAINS,
3401 .ops = &hsw_power_well_ops,
3402 .id = DISP_PW_ID_NONE,
3403 {
3404 .hsw.regs = &hsw_power_well_regs,
3405 .hsw.idx = GLK_PW_CTL_IDX_AUX_C,
3406 },
3407 },
3408 {
3409 .name = "AUX D",
3410 .domains = CNL_DISPLAY_AUX_D_POWER_DOMAINS,
3411 .ops = &hsw_power_well_ops,
3412 .id = DISP_PW_ID_NONE,
3413 {
3414 .hsw.regs = &hsw_power_well_regs,
3415 .hsw.idx = CNL_PW_CTL_IDX_AUX_D,
3416 },
3417 },
3418 {
3419 .name = "DC off",
3420 .domains = CNL_DISPLAY_DC_OFF_POWER_DOMAINS,
3421 .ops = &gen9_dc_off_power_well_ops,
3422 .id = SKL_DISP_DC_OFF,
3423 },
3424 {
3425 .name = "power well 2",
3426 .domains = CNL_DISPLAY_POWERWELL_2_POWER_DOMAINS,
3427 .ops = &hsw_power_well_ops,
3428 .id = SKL_DISP_PW_2,
3429 {
3430 .hsw.regs = &hsw_power_well_regs,
3431 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
3432 .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
3433 .hsw.has_vga = true,
3434 .hsw.has_fuses = true,
3435 },
3436 },
3437 {
3438 .name = "DDI A IO power well",
3439 .domains = CNL_DISPLAY_DDI_A_IO_POWER_DOMAINS,
3440 .ops = &hsw_power_well_ops,
3441 .id = DISP_PW_ID_NONE,
3442 {
3443 .hsw.regs = &hsw_power_well_regs,
3444 .hsw.idx = GLK_PW_CTL_IDX_DDI_A,
3445 },
3446 },
3447 {
3448 .name = "DDI B IO power well",
3449 .domains = CNL_DISPLAY_DDI_B_IO_POWER_DOMAINS,
3450 .ops = &hsw_power_well_ops,
3451 .id = DISP_PW_ID_NONE,
3452 {
3453 .hsw.regs = &hsw_power_well_regs,
3454 .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
3455 },
3456 },
3457 {
3458 .name = "DDI C IO power well",
3459 .domains = CNL_DISPLAY_DDI_C_IO_POWER_DOMAINS,
3460 .ops = &hsw_power_well_ops,
3461 .id = DISP_PW_ID_NONE,
3462 {
3463 .hsw.regs = &hsw_power_well_regs,
3464 .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
3465 },
3466 },
3467 {
3468 .name = "DDI D IO power well",
3469 .domains = CNL_DISPLAY_DDI_D_IO_POWER_DOMAINS,
3470 .ops = &hsw_power_well_ops,
3471 .id = DISP_PW_ID_NONE,
3472 {
3473 .hsw.regs = &hsw_power_well_regs,
3474 .hsw.idx = SKL_PW_CTL_IDX_DDI_D,
3475 },
3476 },
3477 {
3478 .name = "DDI F IO power well",
3479 .domains = CNL_DISPLAY_DDI_F_IO_POWER_DOMAINS,
3480 .ops = &hsw_power_well_ops,
3481 .id = DISP_PW_ID_NONE,
3482 {
3483 .hsw.regs = &hsw_power_well_regs,
3484 .hsw.idx = CNL_PW_CTL_IDX_DDI_F,
3485 },
3486 },
3487 {
3488 .name = "AUX F",
3489 .domains = CNL_DISPLAY_AUX_F_POWER_DOMAINS,
3490 .ops = &hsw_power_well_ops,
3491 .id = DISP_PW_ID_NONE,
3492 {
3493 .hsw.regs = &hsw_power_well_regs,
3494 .hsw.idx = CNL_PW_CTL_IDX_AUX_F,
3495 },
3496 },
3497 };
3498
3499 static const struct i915_power_well_ops icl_combo_phy_aux_power_well_ops = {
3500 .sync_hw = hsw_power_well_sync_hw,
3501 .enable = icl_combo_phy_aux_power_well_enable,
3502 .disable = icl_combo_phy_aux_power_well_disable,
3503 .is_enabled = hsw_power_well_enabled,
3504 };
3505
3506 static const struct i915_power_well_ops icl_tc_phy_aux_power_well_ops = {
3507 .sync_hw = hsw_power_well_sync_hw,
3508 .enable = icl_tc_phy_aux_power_well_enable,
3509 .disable = icl_tc_phy_aux_power_well_disable,
3510 .is_enabled = hsw_power_well_enabled,
3511 };
3512
3513 static const struct i915_power_well_regs icl_aux_power_well_regs = {
3514 .bios = ICL_PWR_WELL_CTL_AUX1,
3515 .driver = ICL_PWR_WELL_CTL_AUX2,
3516 .debug = ICL_PWR_WELL_CTL_AUX4,
3517 };
3518
3519 static const struct i915_power_well_regs icl_ddi_power_well_regs = {
3520 .bios = ICL_PWR_WELL_CTL_DDI1,
3521 .driver = ICL_PWR_WELL_CTL_DDI2,
3522 .debug = ICL_PWR_WELL_CTL_DDI4,
3523 };
3524
3525 static const struct i915_power_well_desc icl_power_wells[] = {
3526 {
3527 .name = "always-on",
3528 .always_on = true,
3529 .domains = POWER_DOMAIN_MASK,
3530 .ops = &i9xx_always_on_power_well_ops,
3531 .id = DISP_PW_ID_NONE,
3532 },
3533 {
3534 .name = "power well 1",
3535 /* Handled by the DMC firmware */
3536 .always_on = true,
3537 .domains = 0,
3538 .ops = &hsw_power_well_ops,
3539 .id = SKL_DISP_PW_1,
3540 {
3541 .hsw.regs = &hsw_power_well_regs,
3542 .hsw.idx = ICL_PW_CTL_IDX_PW_1,
3543 .hsw.has_fuses = true,
3544 },
3545 },
3546 {
3547 .name = "DC off",
3548 .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS,
3549 .ops = &gen9_dc_off_power_well_ops,
3550 .id = SKL_DISP_DC_OFF,
3551 },
3552 {
3553 .name = "power well 2",
3554 .domains = ICL_PW_2_POWER_DOMAINS,
3555 .ops = &hsw_power_well_ops,
3556 .id = SKL_DISP_PW_2,
3557 {
3558 .hsw.regs = &hsw_power_well_regs,
3559 .hsw.idx = ICL_PW_CTL_IDX_PW_2,
3560 .hsw.has_fuses = true,
3561 },
3562 },
3563 {
3564 .name = "power well 3",
3565 .domains = ICL_PW_3_POWER_DOMAINS,
3566 .ops = &hsw_power_well_ops,
3567 .id = DISP_PW_ID_NONE,
3568 {
3569 .hsw.regs = &hsw_power_well_regs,
3570 .hsw.idx = ICL_PW_CTL_IDX_PW_3,
3571 .hsw.irq_pipe_mask = BIT(PIPE_B),
3572 .hsw.has_vga = true,
3573 .hsw.has_fuses = true,
3574 },
3575 },
3576 {
3577 .name = "DDI A IO",
3578 .domains = ICL_DDI_IO_A_POWER_DOMAINS,
3579 .ops = &hsw_power_well_ops,
3580 .id = DISP_PW_ID_NONE,
3581 {
3582 .hsw.regs = &icl_ddi_power_well_regs,
3583 .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
3584 },
3585 },
3586 {
3587 .name = "DDI B IO",
3588 .domains = ICL_DDI_IO_B_POWER_DOMAINS,
3589 .ops = &hsw_power_well_ops,
3590 .id = DISP_PW_ID_NONE,
3591 {
3592 .hsw.regs = &icl_ddi_power_well_regs,
3593 .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
3594 },
3595 },
3596 {
3597 .name = "DDI C IO",
3598 .domains = ICL_DDI_IO_C_POWER_DOMAINS,
3599 .ops = &hsw_power_well_ops,
3600 .id = DISP_PW_ID_NONE,
3601 {
3602 .hsw.regs = &icl_ddi_power_well_regs,
3603 .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
3604 },
3605 },
3606 {
3607 .name = "DDI D IO",
3608 .domains = ICL_DDI_IO_D_POWER_DOMAINS,
3609 .ops = &hsw_power_well_ops,
3610 .id = DISP_PW_ID_NONE,
3611 {
3612 .hsw.regs = &icl_ddi_power_well_regs,
3613 .hsw.idx = ICL_PW_CTL_IDX_DDI_D,
3614 },
3615 },
3616 {
3617 .name = "DDI E IO",
3618 .domains = ICL_DDI_IO_E_POWER_DOMAINS,
3619 .ops = &hsw_power_well_ops,
3620 .id = DISP_PW_ID_NONE,
3621 {
3622 .hsw.regs = &icl_ddi_power_well_regs,
3623 .hsw.idx = ICL_PW_CTL_IDX_DDI_E,
3624 },
3625 },
3626 {
3627 .name = "DDI F IO",
3628 .domains = ICL_DDI_IO_F_POWER_DOMAINS,
3629 .ops = &hsw_power_well_ops,
3630 .id = DISP_PW_ID_NONE,
3631 {
3632 .hsw.regs = &icl_ddi_power_well_regs,
3633 .hsw.idx = ICL_PW_CTL_IDX_DDI_F,
3634 },
3635 },
3636 {
3637 .name = "AUX A",
3638 .domains = ICL_AUX_A_IO_POWER_DOMAINS,
3639 .ops = &icl_combo_phy_aux_power_well_ops,
3640 .id = DISP_PW_ID_NONE,
3641 {
3642 .hsw.regs = &icl_aux_power_well_regs,
3643 .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
3644 },
3645 },
3646 {
3647 .name = "AUX B",
3648 .domains = ICL_AUX_B_IO_POWER_DOMAINS,
3649 .ops = &icl_combo_phy_aux_power_well_ops,
3650 .id = DISP_PW_ID_NONE,
3651 {
3652 .hsw.regs = &icl_aux_power_well_regs,
3653 .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
3654 },
3655 },
3656 {
3657 .name = "AUX C TC1",
3658 .domains = ICL_AUX_C_TC1_IO_POWER_DOMAINS,
3659 .ops = &icl_tc_phy_aux_power_well_ops,
3660 .id = DISP_PW_ID_NONE,
3661 {
3662 .hsw.regs = &icl_aux_power_well_regs,
3663 .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
3664 .hsw.is_tc_tbt = false,
3665 },
3666 },
3667 {
3668 .name = "AUX D TC2",
3669 .domains = ICL_AUX_D_TC2_IO_POWER_DOMAINS,
3670 .ops = &icl_tc_phy_aux_power_well_ops,
3671 .id = DISP_PW_ID_NONE,
3672 {
3673 .hsw.regs = &icl_aux_power_well_regs,
3674 .hsw.idx = ICL_PW_CTL_IDX_AUX_D,
3675 .hsw.is_tc_tbt = false,
3676 },
3677 },
3678 {
3679 .name = "AUX E TC3",
3680 .domains = ICL_AUX_E_TC3_IO_POWER_DOMAINS,
3681 .ops = &icl_tc_phy_aux_power_well_ops,
3682 .id = DISP_PW_ID_NONE,
3683 {
3684 .hsw.regs = &icl_aux_power_well_regs,
3685 .hsw.idx = ICL_PW_CTL_IDX_AUX_E,
3686 .hsw.is_tc_tbt = false,
3687 },
3688 },
3689 {
3690 .name = "AUX F TC4",
3691 .domains = ICL_AUX_F_TC4_IO_POWER_DOMAINS,
3692 .ops = &icl_tc_phy_aux_power_well_ops,
3693 .id = DISP_PW_ID_NONE,
3694 {
3695 .hsw.regs = &icl_aux_power_well_regs,
3696 .hsw.idx = ICL_PW_CTL_IDX_AUX_F,
3697 .hsw.is_tc_tbt = false,
3698 },
3699 },
3700 {
3701 .name = "AUX C TBT1",
3702 .domains = ICL_AUX_C_TBT1_IO_POWER_DOMAINS,
3703 .ops = &icl_tc_phy_aux_power_well_ops,
3704 .id = DISP_PW_ID_NONE,
3705 {
3706 .hsw.regs = &icl_aux_power_well_regs,
3707 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1,
3708 .hsw.is_tc_tbt = true,
3709 },
3710 },
3711 {
3712 .name = "AUX D TBT2",
3713 .domains = ICL_AUX_D_TBT2_IO_POWER_DOMAINS,
3714 .ops = &icl_tc_phy_aux_power_well_ops,
3715 .id = DISP_PW_ID_NONE,
3716 {
3717 .hsw.regs = &icl_aux_power_well_regs,
3718 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2,
3719 .hsw.is_tc_tbt = true,
3720 },
3721 },
3722 {
3723 .name = "AUX E TBT3",
3724 .domains = ICL_AUX_E_TBT3_IO_POWER_DOMAINS,
3725 .ops = &icl_tc_phy_aux_power_well_ops,
3726 .id = DISP_PW_ID_NONE,
3727 {
3728 .hsw.regs = &icl_aux_power_well_regs,
3729 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3,
3730 .hsw.is_tc_tbt = true,
3731 },
3732 },
3733 {
3734 .name = "AUX F TBT4",
3735 .domains = ICL_AUX_F_TBT4_IO_POWER_DOMAINS,
3736 .ops = &icl_tc_phy_aux_power_well_ops,
3737 .id = DISP_PW_ID_NONE,
3738 {
3739 .hsw.regs = &icl_aux_power_well_regs,
3740 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4,
3741 .hsw.is_tc_tbt = true,
3742 },
3743 },
3744 {
3745 .name = "power well 4",
3746 .domains = ICL_PW_4_POWER_DOMAINS,
3747 .ops = &hsw_power_well_ops,
3748 .id = DISP_PW_ID_NONE,
3749 {
3750 .hsw.regs = &hsw_power_well_regs,
3751 .hsw.idx = ICL_PW_CTL_IDX_PW_4,
3752 .hsw.has_fuses = true,
3753 .hsw.irq_pipe_mask = BIT(PIPE_C),
3754 },
3755 },
3756 };
3757
3758 static const struct i915_power_well_desc ehl_power_wells[] = {
3759 {
3760 .name = "always-on",
3761 .always_on = true,
3762 .domains = POWER_DOMAIN_MASK,
3763 .ops = &i9xx_always_on_power_well_ops,
3764 .id = DISP_PW_ID_NONE,
3765 },
3766 {
3767 .name = "power well 1",
3768 /* Handled by the DMC firmware */
3769 .always_on = true,
3770 .domains = 0,
3771 .ops = &hsw_power_well_ops,
3772 .id = SKL_DISP_PW_1,
3773 {
3774 .hsw.regs = &hsw_power_well_regs,
3775 .hsw.idx = ICL_PW_CTL_IDX_PW_1,
3776 .hsw.has_fuses = true,
3777 },
3778 },
3779 {
3780 .name = "DC off",
3781 .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS,
3782 .ops = &gen9_dc_off_power_well_ops,
3783 .id = SKL_DISP_DC_OFF,
3784 },
3785 {
3786 .name = "power well 2",
3787 .domains = ICL_PW_2_POWER_DOMAINS,
3788 .ops = &hsw_power_well_ops,
3789 .id = SKL_DISP_PW_2,
3790 {
3791 .hsw.regs = &hsw_power_well_regs,
3792 .hsw.idx = ICL_PW_CTL_IDX_PW_2,
3793 .hsw.has_fuses = true,
3794 },
3795 },
3796 {
3797 .name = "power well 3",
3798 .domains = ICL_PW_3_POWER_DOMAINS,
3799 .ops = &hsw_power_well_ops,
3800 .id = DISP_PW_ID_NONE,
3801 {
3802 .hsw.regs = &hsw_power_well_regs,
3803 .hsw.idx = ICL_PW_CTL_IDX_PW_3,
3804 .hsw.irq_pipe_mask = BIT(PIPE_B),
3805 .hsw.has_vga = true,
3806 .hsw.has_fuses = true,
3807 },
3808 },
3809 {
3810 .name = "DDI A IO",
3811 .domains = ICL_DDI_IO_A_POWER_DOMAINS,
3812 .ops = &hsw_power_well_ops,
3813 .id = DISP_PW_ID_NONE,
3814 {
3815 .hsw.regs = &icl_ddi_power_well_regs,
3816 .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
3817 },
3818 },
3819 {
3820 .name = "DDI B IO",
3821 .domains = ICL_DDI_IO_B_POWER_DOMAINS,
3822 .ops = &hsw_power_well_ops,
3823 .id = DISP_PW_ID_NONE,
3824 {
3825 .hsw.regs = &icl_ddi_power_well_regs,
3826 .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
3827 },
3828 },
3829 {
3830 .name = "DDI C IO",
3831 .domains = ICL_DDI_IO_C_POWER_DOMAINS,
3832 .ops = &hsw_power_well_ops,
3833 .id = DISP_PW_ID_NONE,
3834 {
3835 .hsw.regs = &icl_ddi_power_well_regs,
3836 .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
3837 },
3838 },
3839 {
3840 .name = "DDI D IO",
3841 .domains = ICL_DDI_IO_D_POWER_DOMAINS,
3842 .ops = &hsw_power_well_ops,
3843 .id = DISP_PW_ID_NONE,
3844 {
3845 .hsw.regs = &icl_ddi_power_well_regs,
3846 .hsw.idx = ICL_PW_CTL_IDX_DDI_D,
3847 },
3848 },
3849 {
3850 .name = "AUX A",
3851 .domains = ICL_AUX_A_IO_POWER_DOMAINS,
3852 .ops = &hsw_power_well_ops,
3853 .id = DISP_PW_ID_NONE,
3854 {
3855 .hsw.regs = &icl_aux_power_well_regs,
3856 .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
3857 },
3858 },
3859 {
3860 .name = "AUX B",
3861 .domains = ICL_AUX_B_IO_POWER_DOMAINS,
3862 .ops = &hsw_power_well_ops,
3863 .id = DISP_PW_ID_NONE,
3864 {
3865 .hsw.regs = &icl_aux_power_well_regs,
3866 .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
3867 },
3868 },
3869 {
3870 .name = "AUX C",
3871 .domains = ICL_AUX_C_TC1_IO_POWER_DOMAINS,
3872 .ops = &hsw_power_well_ops,
3873 .id = DISP_PW_ID_NONE,
3874 {
3875 .hsw.regs = &icl_aux_power_well_regs,
3876 .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
3877 },
3878 },
3879 {
3880 .name = "AUX D",
3881 .domains = ICL_AUX_D_TC2_IO_POWER_DOMAINS,
3882 .ops = &hsw_power_well_ops,
3883 .id = DISP_PW_ID_NONE,
3884 {
3885 .hsw.regs = &icl_aux_power_well_regs,
3886 .hsw.idx = ICL_PW_CTL_IDX_AUX_D,
3887 },
3888 },
3889 {
3890 .name = "power well 4",
3891 .domains = ICL_PW_4_POWER_DOMAINS,
3892 .ops = &hsw_power_well_ops,
3893 .id = DISP_PW_ID_NONE,
3894 {
3895 .hsw.regs = &hsw_power_well_regs,
3896 .hsw.idx = ICL_PW_CTL_IDX_PW_4,
3897 .hsw.has_fuses = true,
3898 .hsw.irq_pipe_mask = BIT(PIPE_C),
3899 },
3900 },
3901 };
3902
3903 static const struct i915_power_well_desc tgl_power_wells[] = {
3904 {
3905 .name = "always-on",
3906 .always_on = true,
3907 .domains = POWER_DOMAIN_MASK,
3908 .ops = &i9xx_always_on_power_well_ops,
3909 .id = DISP_PW_ID_NONE,
3910 },
3911 {
3912 .name = "power well 1",
3913 /* Handled by the DMC firmware */
3914 .always_on = true,
3915 .domains = 0,
3916 .ops = &hsw_power_well_ops,
3917 .id = SKL_DISP_PW_1,
3918 {
3919 .hsw.regs = &hsw_power_well_regs,
3920 .hsw.idx = ICL_PW_CTL_IDX_PW_1,
3921 .hsw.has_fuses = true,
3922 },
3923 },
3924 {
3925 .name = "DC off",
3926 .domains = TGL_DISPLAY_DC_OFF_POWER_DOMAINS,
3927 .ops = &gen9_dc_off_power_well_ops,
3928 .id = SKL_DISP_DC_OFF,
3929 },
3930 {
3931 .name = "power well 2",
3932 .domains = TGL_PW_2_POWER_DOMAINS,
3933 .ops = &hsw_power_well_ops,
3934 .id = SKL_DISP_PW_2,
3935 {
3936 .hsw.regs = &hsw_power_well_regs,
3937 .hsw.idx = ICL_PW_CTL_IDX_PW_2,
3938 .hsw.has_fuses = true,
3939 },
3940 },
3941 {
3942 .name = "power well 3",
3943 .domains = TGL_PW_3_POWER_DOMAINS,
3944 .ops = &hsw_power_well_ops,
3945 .id = TGL_DISP_PW_3,
3946 {
3947 .hsw.regs = &hsw_power_well_regs,
3948 .hsw.idx = ICL_PW_CTL_IDX_PW_3,
3949 .hsw.irq_pipe_mask = BIT(PIPE_B),
3950 .hsw.has_vga = true,
3951 .hsw.has_fuses = true,
3952 },
3953 },
3954 {
3955 .name = "DDI A IO",
3956 .domains = ICL_DDI_IO_A_POWER_DOMAINS,
3957 .ops = &hsw_power_well_ops,
3958 .id = DISP_PW_ID_NONE,
3959 {
3960 .hsw.regs = &icl_ddi_power_well_regs,
3961 .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
3962 }
3963 },
3964 {
3965 .name = "DDI B IO",
3966 .domains = ICL_DDI_IO_B_POWER_DOMAINS,
3967 .ops = &hsw_power_well_ops,
3968 .id = DISP_PW_ID_NONE,
3969 {
3970 .hsw.regs = &icl_ddi_power_well_regs,
3971 .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
3972 }
3973 },
3974 {
3975 .name = "DDI C IO",
3976 .domains = ICL_DDI_IO_C_POWER_DOMAINS,
3977 .ops = &hsw_power_well_ops,
3978 .id = DISP_PW_ID_NONE,
3979 {
3980 .hsw.regs = &icl_ddi_power_well_regs,
3981 .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
3982 }
3983 },
3984 {
3985 .name = "DDI D TC1 IO",
3986 .domains = TGL_DDI_IO_D_TC1_POWER_DOMAINS,
3987 .ops = &hsw_power_well_ops,
3988 .id = DISP_PW_ID_NONE,
3989 {
3990 .hsw.regs = &icl_ddi_power_well_regs,
3991 .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
3992 },
3993 },
3994 {
3995 .name = "DDI E TC2 IO",
3996 .domains = TGL_DDI_IO_E_TC2_POWER_DOMAINS,
3997 .ops = &hsw_power_well_ops,
3998 .id = DISP_PW_ID_NONE,
3999 {
4000 .hsw.regs = &icl_ddi_power_well_regs,
4001 .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
4002 },
4003 },
4004 {
4005 .name = "DDI F TC3 IO",
4006 .domains = TGL_DDI_IO_F_TC3_POWER_DOMAINS,
4007 .ops = &hsw_power_well_ops,
4008 .id = DISP_PW_ID_NONE,
4009 {
4010 .hsw.regs = &icl_ddi_power_well_regs,
4011 .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3,
4012 },
4013 },
4014 {
4015 .name = "DDI G TC4 IO",
4016 .domains = TGL_DDI_IO_G_TC4_POWER_DOMAINS,
4017 .ops = &hsw_power_well_ops,
4018 .id = DISP_PW_ID_NONE,
4019 {
4020 .hsw.regs = &icl_ddi_power_well_regs,
4021 .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4,
4022 },
4023 },
4024 {
4025 .name = "DDI H TC5 IO",
4026 .domains = TGL_DDI_IO_H_TC5_POWER_DOMAINS,
4027 .ops = &hsw_power_well_ops,
4028 .id = DISP_PW_ID_NONE,
4029 {
4030 .hsw.regs = &icl_ddi_power_well_regs,
4031 .hsw.idx = TGL_PW_CTL_IDX_DDI_TC5,
4032 },
4033 },
4034 {
4035 .name = "DDI I TC6 IO",
4036 .domains = TGL_DDI_IO_I_TC6_POWER_DOMAINS,
4037 .ops = &hsw_power_well_ops,
4038 .id = DISP_PW_ID_NONE,
4039 {
4040 .hsw.regs = &icl_ddi_power_well_regs,
4041 .hsw.idx = TGL_PW_CTL_IDX_DDI_TC6,
4042 },
4043 },
4044 {
4045 .name = "AUX A",
4046 .domains = TGL_AUX_A_IO_POWER_DOMAINS,
4047 .ops = &hsw_power_well_ops,
4048 .id = DISP_PW_ID_NONE,
4049 {
4050 .hsw.regs = &icl_aux_power_well_regs,
4051 .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
4052 },
4053 },
4054 {
4055 .name = "AUX B",
4056 .domains = TGL_AUX_B_IO_POWER_DOMAINS,
4057 .ops = &hsw_power_well_ops,
4058 .id = DISP_PW_ID_NONE,
4059 {
4060 .hsw.regs = &icl_aux_power_well_regs,
4061 .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
4062 },
4063 },
4064 {
4065 .name = "AUX C",
4066 .domains = TGL_AUX_C_IO_POWER_DOMAINS,
4067 .ops = &hsw_power_well_ops,
4068 .id = DISP_PW_ID_NONE,
4069 {
4070 .hsw.regs = &icl_aux_power_well_regs,
4071 .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
4072 },
4073 },
4074 {
4075 .name = "AUX D TC1",
4076 .domains = TGL_AUX_D_TC1_IO_POWER_DOMAINS,
4077 .ops = &icl_tc_phy_aux_power_well_ops,
4078 .id = DISP_PW_ID_NONE,
4079 {
4080 .hsw.regs = &icl_aux_power_well_regs,
4081 .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
4082 .hsw.is_tc_tbt = false,
4083 },
4084 },
4085 {
4086 .name = "AUX E TC2",
4087 .domains = TGL_AUX_E_TC2_IO_POWER_DOMAINS,
4088 .ops = &icl_tc_phy_aux_power_well_ops,
4089 .id = DISP_PW_ID_NONE,
4090 {
4091 .hsw.regs = &icl_aux_power_well_regs,
4092 .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
4093 .hsw.is_tc_tbt = false,
4094 },
4095 },
4096 {
4097 .name = "AUX F TC3",
4098 .domains = TGL_AUX_F_TC3_IO_POWER_DOMAINS,
4099 .ops = &icl_tc_phy_aux_power_well_ops,
4100 .id = DISP_PW_ID_NONE,
4101 {
4102 .hsw.regs = &icl_aux_power_well_regs,
4103 .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3,
4104 .hsw.is_tc_tbt = false,
4105 },
4106 },
4107 {
4108 .name = "AUX G TC4",
4109 .domains = TGL_AUX_G_TC4_IO_POWER_DOMAINS,
4110 .ops = &icl_tc_phy_aux_power_well_ops,
4111 .id = DISP_PW_ID_NONE,
4112 {
4113 .hsw.regs = &icl_aux_power_well_regs,
4114 .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4,
4115 .hsw.is_tc_tbt = false,
4116 },
4117 },
4118 {
4119 .name = "AUX H TC5",
4120 .domains = TGL_AUX_H_TC5_IO_POWER_DOMAINS,
4121 .ops = &icl_tc_phy_aux_power_well_ops,
4122 .id = DISP_PW_ID_NONE,
4123 {
4124 .hsw.regs = &icl_aux_power_well_regs,
4125 .hsw.idx = TGL_PW_CTL_IDX_AUX_TC5,
4126 .hsw.is_tc_tbt = false,
4127 },
4128 },
4129 {
4130 .name = "AUX I TC6",
4131 .domains = TGL_AUX_I_TC6_IO_POWER_DOMAINS,
4132 .ops = &icl_tc_phy_aux_power_well_ops,
4133 .id = DISP_PW_ID_NONE,
4134 {
4135 .hsw.regs = &icl_aux_power_well_regs,
4136 .hsw.idx = TGL_PW_CTL_IDX_AUX_TC6,
4137 .hsw.is_tc_tbt = false,
4138 },
4139 },
4140 {
4141 .name = "AUX D TBT1",
4142 .domains = TGL_AUX_D_TBT1_IO_POWER_DOMAINS,
4143 .ops = &hsw_power_well_ops,
4144 .id = DISP_PW_ID_NONE,
4145 {
4146 .hsw.regs = &icl_aux_power_well_regs,
4147 .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1,
4148 .hsw.is_tc_tbt = true,
4149 },
4150 },
4151 {
4152 .name = "AUX E TBT2",
4153 .domains = TGL_AUX_E_TBT2_IO_POWER_DOMAINS,
4154 .ops = &hsw_power_well_ops,
4155 .id = DISP_PW_ID_NONE,
4156 {
4157 .hsw.regs = &icl_aux_power_well_regs,
4158 .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2,
4159 .hsw.is_tc_tbt = true,
4160 },
4161 },
4162 {
4163 .name = "AUX F TBT3",
4164 .domains = TGL_AUX_F_TBT3_IO_POWER_DOMAINS,
4165 .ops = &hsw_power_well_ops,
4166 .id = DISP_PW_ID_NONE,
4167 {
4168 .hsw.regs = &icl_aux_power_well_regs,
4169 .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3,
4170 .hsw.is_tc_tbt = true,
4171 },
4172 },
4173 {
4174 .name = "AUX G TBT4",
4175 .domains = TGL_AUX_G_TBT4_IO_POWER_DOMAINS,
4176 .ops = &hsw_power_well_ops,
4177 .id = DISP_PW_ID_NONE,
4178 {
4179 .hsw.regs = &icl_aux_power_well_regs,
4180 .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4,
4181 .hsw.is_tc_tbt = true,
4182 },
4183 },
4184 {
4185 .name = "AUX H TBT5",
4186 .domains = TGL_AUX_H_TBT5_IO_POWER_DOMAINS,
4187 .ops = &hsw_power_well_ops,
4188 .id = DISP_PW_ID_NONE,
4189 {
4190 .hsw.regs = &icl_aux_power_well_regs,
4191 .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT5,
4192 .hsw.is_tc_tbt = true,
4193 },
4194 },
4195 {
4196 .name = "AUX I TBT6",
4197 .domains = TGL_AUX_I_TBT6_IO_POWER_DOMAINS,
4198 .ops = &hsw_power_well_ops,
4199 .id = DISP_PW_ID_NONE,
4200 {
4201 .hsw.regs = &icl_aux_power_well_regs,
4202 .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT6,
4203 .hsw.is_tc_tbt = true,
4204 },
4205 },
4206 {
4207 .name = "power well 4",
4208 .domains = TGL_PW_4_POWER_DOMAINS,
4209 .ops = &hsw_power_well_ops,
4210 .id = DISP_PW_ID_NONE,
4211 {
4212 .hsw.regs = &hsw_power_well_regs,
4213 .hsw.idx = ICL_PW_CTL_IDX_PW_4,
4214 .hsw.has_fuses = true,
4215 .hsw.irq_pipe_mask = BIT(PIPE_C),
4216 }
4217 },
4218 {
4219 .name = "power well 5",
4220 .domains = TGL_PW_5_POWER_DOMAINS,
4221 .ops = &hsw_power_well_ops,
4222 .id = DISP_PW_ID_NONE,
4223 {
4224 .hsw.regs = &hsw_power_well_regs,
4225 .hsw.idx = TGL_PW_CTL_IDX_PW_5,
4226 .hsw.has_fuses = true,
4227 .hsw.irq_pipe_mask = BIT(PIPE_D),
4228 },
4229 },
4230 };
4231
4232 static int
4233 sanitize_disable_power_well_option(const struct drm_i915_private *dev_priv,
4234 int disable_power_well)
4235 {
4236 if (disable_power_well >= 0)
4237 return !!disable_power_well;
4238
4239 return 1;
4240 }
4241
4242 static u32 get_allowed_dc_mask(const struct drm_i915_private *dev_priv,
4243 int enable_dc)
4244 {
4245 u32 mask;
4246 int requested_dc;
4247 int max_dc;
4248
4249 if (INTEL_GEN(dev_priv) >= 12) {
4250 max_dc = 4;
4251 /*
4252 * DC9 has a separate HW flow from the rest of the DC states,
4253 * not depending on the DMC firmware. It's needed by system
4254 * suspend/resume, so allow it unconditionally.
4255 */
4256 mask = DC_STATE_EN_DC9;
4257 } else if (IS_GEN(dev_priv, 11)) {
4258 max_dc = 2;
4259 mask = DC_STATE_EN_DC9;
4260 } else if (IS_GEN(dev_priv, 10) || IS_GEN9_BC(dev_priv)) {
4261 max_dc = 2;
4262 mask = 0;
4263 } else if (IS_GEN9_LP(dev_priv)) {
4264 max_dc = 1;
4265 mask = DC_STATE_EN_DC9;
4266 } else {
4267 max_dc = 0;
4268 mask = 0;
4269 }
4270
4271 if (!i915_modparams.disable_power_well)
4272 max_dc = 0;
4273
4274 if (enable_dc >= 0 && enable_dc <= max_dc) {
4275 requested_dc = enable_dc;
4276 } else if (enable_dc == -1) {
4277 requested_dc = max_dc;
4278 } else if (enable_dc > max_dc && enable_dc <= 4) {
4279 drm_dbg_kms(&dev_priv->drm,
4280 "Adjusting requested max DC state (%d->%d)\n",
4281 enable_dc, max_dc);
4282 requested_dc = max_dc;
4283 } else {
4284 drm_err(&dev_priv->drm,
4285 "Unexpected value for enable_dc (%d)\n", enable_dc);
4286 requested_dc = max_dc;
4287 }
4288
4289 switch (requested_dc) {
4290 case 4:
4291 mask |= DC_STATE_EN_DC3CO | DC_STATE_EN_UPTO_DC6;
4292 break;
4293 case 3:
4294 mask |= DC_STATE_EN_DC3CO | DC_STATE_EN_UPTO_DC5;
4295 break;
4296 case 2:
4297 mask |= DC_STATE_EN_UPTO_DC6;
4298 break;
4299 case 1:
4300 mask |= DC_STATE_EN_UPTO_DC5;
4301 break;
4302 }
4303
4304 drm_dbg_kms(&dev_priv->drm, "Allowed DC state mask %02x\n", mask);
4305
4306 return mask;
4307 }
4308
4309 static int
4310 __set_power_wells(struct i915_power_domains *power_domains,
4311 const struct i915_power_well_desc *power_well_descs,
4312 int power_well_count)
4313 {
4314 u64 power_well_ids = 0;
4315 int i;
4316
4317 power_domains->power_well_count = power_well_count;
4318 power_domains->power_wells =
4319 kcalloc(power_well_count,
4320 sizeof(*power_domains->power_wells),
4321 GFP_KERNEL);
4322 if (!power_domains->power_wells)
4323 return -ENOMEM;
4324
4325 for (i = 0; i < power_well_count; i++) {
4326 enum i915_power_well_id id = power_well_descs[i].id;
4327
4328 power_domains->power_wells[i].desc = &power_well_descs[i];
4329
4330 if (id == DISP_PW_ID_NONE)
4331 continue;
4332
4333 WARN_ON(id >= sizeof(power_well_ids) * 8);
4334 WARN_ON(power_well_ids & BIT_ULL(id));
4335 power_well_ids |= BIT_ULL(id);
4336 }
4337
4338 return 0;
4339 }
4340
4341 #define set_power_wells(power_domains, __power_well_descs) \
4342 __set_power_wells(power_domains, __power_well_descs, \
4343 ARRAY_SIZE(__power_well_descs))
4344
4345 /**
4346 * intel_power_domains_init - initializes the power domain structures
4347 * @dev_priv: i915 device instance
4348 *
4349 * Initializes the power domain structures for @dev_priv depending upon the
4350 * supported platform.
4351 */
4352 int intel_power_domains_init(struct drm_i915_private *dev_priv)
4353 {
4354 struct i915_power_domains *power_domains = &dev_priv->power_domains;
4355 int err;
4356
4357 i915_modparams.disable_power_well =
4358 sanitize_disable_power_well_option(dev_priv,
4359 i915_modparams.disable_power_well);
4360 dev_priv->csr.allowed_dc_mask =
4361 get_allowed_dc_mask(dev_priv, i915_modparams.enable_dc);
4362
4363 dev_priv->csr.target_dc_state =
4364 sanitize_target_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6);
4365
4366 BUILD_BUG_ON(POWER_DOMAIN_NUM > 64);
4367
4368 mutex_init(&power_domains->lock);
4369
4370 INIT_DELAYED_WORK(&power_domains->async_put_work,
4371 intel_display_power_put_async_work);
4372
4373 /*
4374 * The enabling order will be from lower to higher indexed wells,
4375 * the disabling order is reversed.
4376 */
4377 if (IS_GEN(dev_priv, 12)) {
4378 err = set_power_wells(power_domains, tgl_power_wells);
4379 } else if (IS_ELKHARTLAKE(dev_priv)) {
4380 err = set_power_wells(power_domains, ehl_power_wells);
4381 } else if (IS_GEN(dev_priv, 11)) {
4382 err = set_power_wells(power_domains, icl_power_wells);
4383 } else if (IS_CANNONLAKE(dev_priv)) {
4384 err = set_power_wells(power_domains, cnl_power_wells);
4385
4386 /*
4387 * DDI and Aux IO are getting enabled for all ports
4388 * regardless the presence or use. So, in order to avoid
4389 * timeouts, lets remove them from the list
4390 * for the SKUs without port F.
4391 */
4392 if (!IS_CNL_WITH_PORT_F(dev_priv))
4393 power_domains->power_well_count -= 2;
4394 } else if (IS_GEMINILAKE(dev_priv)) {
4395 err = set_power_wells(power_domains, glk_power_wells);
4396 } else if (IS_BROXTON(dev_priv)) {
4397 err = set_power_wells(power_domains, bxt_power_wells);
4398 } else if (IS_GEN9_BC(dev_priv)) {
4399 err = set_power_wells(power_domains, skl_power_wells);
4400 } else if (IS_CHERRYVIEW(dev_priv)) {
4401 err = set_power_wells(power_domains, chv_power_wells);
4402 } else if (IS_BROADWELL(dev_priv)) {
4403 err = set_power_wells(power_domains, bdw_power_wells);
4404 } else if (IS_HASWELL(dev_priv)) {
4405 err = set_power_wells(power_domains, hsw_power_wells);
4406 } else if (IS_VALLEYVIEW(dev_priv)) {
4407 err = set_power_wells(power_domains, vlv_power_wells);
4408 } else if (IS_I830(dev_priv)) {
4409 err = set_power_wells(power_domains, i830_power_wells);
4410 } else {
4411 err = set_power_wells(power_domains, i9xx_always_on_power_well);
4412 }
4413
4414 return err;
4415 }
4416
4417 /**
4418 * intel_power_domains_cleanup - clean up power domains resources
4419 * @dev_priv: i915 device instance
4420 *
4421 * Release any resources acquired by intel_power_domains_init()
4422 */
4423 void intel_power_domains_cleanup(struct drm_i915_private *dev_priv)
4424 {
4425 kfree(dev_priv->power_domains.power_wells);
4426 }
4427
4428 static void intel_power_domains_sync_hw(struct drm_i915_private *dev_priv)
4429 {
4430 struct i915_power_domains *power_domains = &dev_priv->power_domains;
4431 struct i915_power_well *power_well;
4432
4433 mutex_lock(&power_domains->lock);
4434 for_each_power_well(dev_priv, power_well) {
4435 power_well->desc->ops->sync_hw(dev_priv, power_well);
4436 power_well->hw_enabled =
4437 power_well->desc->ops->is_enabled(dev_priv, power_well);
4438 }
4439 mutex_unlock(&power_domains->lock);
4440 }
4441
4442 static inline
4443 bool intel_dbuf_slice_set(struct drm_i915_private *dev_priv,
4444 i915_reg_t reg, bool enable)
4445 {
4446 u32 val, status;
4447
4448 val = intel_de_read(dev_priv, reg);
4449 val = enable ? (val | DBUF_POWER_REQUEST) : (val & ~DBUF_POWER_REQUEST);
4450 intel_de_write(dev_priv, reg, val);
4451 intel_de_posting_read(dev_priv, reg);
4452 udelay(10);
4453
4454 status = intel_de_read(dev_priv, reg) & DBUF_POWER_STATE;
4455 if ((enable && !status) || (!enable && status)) {
4456 drm_err(&dev_priv->drm, "DBus power %s timeout!\n",
4457 enable ? "enable" : "disable");
4458 return false;
4459 }
4460 return true;
4461 }
4462
4463 static void gen9_dbuf_enable(struct drm_i915_private *dev_priv)
4464 {
4465 icl_dbuf_slices_update(dev_priv, BIT(DBUF_S1));
4466 }
4467
4468 static void gen9_dbuf_disable(struct drm_i915_private *dev_priv)
4469 {
4470 icl_dbuf_slices_update(dev_priv, 0);
4471 }
4472
4473 void icl_dbuf_slices_update(struct drm_i915_private *dev_priv,
4474 u8 req_slices)
4475 {
4476 int i;
4477 int max_slices = INTEL_INFO(dev_priv)->num_supported_dbuf_slices;
4478 struct i915_power_domains *power_domains = &dev_priv->power_domains;
4479
4480 drm_WARN(&dev_priv->drm, hweight8(req_slices) > max_slices,
4481 "Invalid number of dbuf slices requested\n");
4482
4483 DRM_DEBUG_KMS("Updating dbuf slices to 0x%x\n", req_slices);
4484
4485 /*
4486 * Might be running this in parallel to gen9_dc_off_power_well_enable
4487 * being called from intel_dp_detect for instance,
4488 * which causes assertion triggered by race condition,
4489 * as gen9_assert_dbuf_enabled might preempt this when registers
4490 * were already updated, while dev_priv was not.
4491 */
4492 mutex_lock(&power_domains->lock);
4493
4494 for (i = 0; i < max_slices; i++) {
4495 intel_dbuf_slice_set(dev_priv,
4496 DBUF_CTL_S(i),
4497 (req_slices & BIT(i)) != 0);
4498 }
4499
4500 dev_priv->enabled_dbuf_slices_mask = req_slices;
4501
4502 mutex_unlock(&power_domains->lock);
4503 }
4504
4505 static void icl_dbuf_enable(struct drm_i915_private *dev_priv)
4506 {
4507 skl_ddb_get_hw_state(dev_priv);
4508 /*
4509 * Just power up at least 1 slice, we will
4510 * figure out later which slices we have and what we need.
4511 */
4512 icl_dbuf_slices_update(dev_priv, dev_priv->enabled_dbuf_slices_mask |
4513 BIT(DBUF_S1));
4514 }
4515
4516 static void icl_dbuf_disable(struct drm_i915_private *dev_priv)
4517 {
4518 icl_dbuf_slices_update(dev_priv, 0);
4519 }
4520
4521 static void icl_mbus_init(struct drm_i915_private *dev_priv)
4522 {
4523 u32 mask, val;
4524
4525 mask = MBUS_ABOX_BT_CREDIT_POOL1_MASK |
4526 MBUS_ABOX_BT_CREDIT_POOL2_MASK |
4527 MBUS_ABOX_B_CREDIT_MASK |
4528 MBUS_ABOX_BW_CREDIT_MASK;
4529 val = MBUS_ABOX_BT_CREDIT_POOL1(16) |
4530 MBUS_ABOX_BT_CREDIT_POOL2(16) |
4531 MBUS_ABOX_B_CREDIT(1) |
4532 MBUS_ABOX_BW_CREDIT(1);
4533
4534 intel_de_rmw(dev_priv, MBUS_ABOX_CTL, mask, val);
4535 if (INTEL_GEN(dev_priv) >= 12) {
4536 intel_de_rmw(dev_priv, MBUS_ABOX1_CTL, mask, val);
4537 intel_de_rmw(dev_priv, MBUS_ABOX2_CTL, mask, val);
4538 }
4539 }
4540
4541 static void hsw_assert_cdclk(struct drm_i915_private *dev_priv)
4542 {
4543 u32 val = intel_de_read(dev_priv, LCPLL_CTL);
4544
4545 /*
4546 * The LCPLL register should be turned on by the BIOS. For now
4547 * let's just check its state and print errors in case
4548 * something is wrong. Don't even try to turn it on.
4549 */
4550
4551 if (val & LCPLL_CD_SOURCE_FCLK)
4552 drm_err(&dev_priv->drm, "CDCLK source is not LCPLL\n");
4553
4554 if (val & LCPLL_PLL_DISABLE)
4555 drm_err(&dev_priv->drm, "LCPLL is disabled\n");
4556
4557 if ((val & LCPLL_REF_MASK) != LCPLL_REF_NON_SSC)
4558 drm_err(&dev_priv->drm, "LCPLL not using non-SSC reference\n");
4559 }
4560
4561 static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
4562 {
4563 struct drm_device *dev = &dev_priv->drm;
4564 struct intel_crtc *crtc;
4565
4566 for_each_intel_crtc(dev, crtc)
4567 I915_STATE_WARN(crtc->active, "CRTC for pipe %c enabled\n",
4568 pipe_name(crtc->pipe));
4569
4570 I915_STATE_WARN(intel_de_read(dev_priv, HSW_PWR_WELL_CTL2),
4571 "Display power well on\n");
4572 I915_STATE_WARN(intel_de_read(dev_priv, SPLL_CTL) & SPLL_PLL_ENABLE,
4573 "SPLL enabled\n");
4574 I915_STATE_WARN(intel_de_read(dev_priv, WRPLL_CTL(0)) & WRPLL_PLL_ENABLE,
4575 "WRPLL1 enabled\n");
4576 I915_STATE_WARN(intel_de_read(dev_priv, WRPLL_CTL(1)) & WRPLL_PLL_ENABLE,
4577 "WRPLL2 enabled\n");
4578 I915_STATE_WARN(intel_de_read(dev_priv, PP_STATUS(0)) & PP_ON,
4579 "Panel power on\n");
4580 I915_STATE_WARN(intel_de_read(dev_priv, BLC_PWM_CPU_CTL2) & BLM_PWM_ENABLE,
4581 "CPU PWM1 enabled\n");
4582 if (IS_HASWELL(dev_priv))
4583 I915_STATE_WARN(intel_de_read(dev_priv, HSW_BLC_PWM2_CTL) & BLM_PWM_ENABLE,
4584 "CPU PWM2 enabled\n");
4585 I915_STATE_WARN(intel_de_read(dev_priv, BLC_PWM_PCH_CTL1) & BLM_PCH_PWM_ENABLE,
4586 "PCH PWM1 enabled\n");
4587 I915_STATE_WARN(intel_de_read(dev_priv, UTIL_PIN_CTL) & UTIL_PIN_ENABLE,
4588 "Utility pin enabled\n");
4589 I915_STATE_WARN(intel_de_read(dev_priv, PCH_GTC_CTL) & PCH_GTC_ENABLE,
4590 "PCH GTC enabled\n");
4591
4592 /*
4593 * In theory we can still leave IRQs enabled, as long as only the HPD
4594 * interrupts remain enabled. We used to check for that, but since it's
4595 * gen-specific and since we only disable LCPLL after we fully disable
4596 * the interrupts, the check below should be enough.
4597 */
4598 I915_STATE_WARN(intel_irqs_enabled(dev_priv), "IRQs enabled\n");
4599 }
4600
4601 static u32 hsw_read_dcomp(struct drm_i915_private *dev_priv)
4602 {
4603 if (IS_HASWELL(dev_priv))
4604 return intel_de_read(dev_priv, D_COMP_HSW);
4605 else
4606 return intel_de_read(dev_priv, D_COMP_BDW);
4607 }
4608
4609 static void hsw_write_dcomp(struct drm_i915_private *dev_priv, u32 val)
4610 {
4611 if (IS_HASWELL(dev_priv)) {
4612 if (sandybridge_pcode_write(dev_priv,
4613 GEN6_PCODE_WRITE_D_COMP, val))
4614 drm_dbg_kms(&dev_priv->drm,
4615 "Failed to write to D_COMP\n");
4616 } else {
4617 intel_de_write(dev_priv, D_COMP_BDW, val);
4618 intel_de_posting_read(dev_priv, D_COMP_BDW);
4619 }
4620 }
4621
4622 /*
4623 * This function implements pieces of two sequences from BSpec:
4624 * - Sequence for display software to disable LCPLL
4625 * - Sequence for display software to allow package C8+
4626 * The steps implemented here are just the steps that actually touch the LCPLL
4627 * register. Callers should take care of disabling all the display engine
4628 * functions, doing the mode unset, fixing interrupts, etc.
4629 */
4630 static void hsw_disable_lcpll(struct drm_i915_private *dev_priv,
4631 bool switch_to_fclk, bool allow_power_down)
4632 {
4633 u32 val;
4634
4635 assert_can_disable_lcpll(dev_priv);
4636
4637 val = intel_de_read(dev_priv, LCPLL_CTL);
4638
4639 if (switch_to_fclk) {
4640 val |= LCPLL_CD_SOURCE_FCLK;
4641 intel_de_write(dev_priv, LCPLL_CTL, val);
4642
4643 if (wait_for_us(intel_de_read(dev_priv, LCPLL_CTL) &
4644 LCPLL_CD_SOURCE_FCLK_DONE, 1))
4645 drm_err(&dev_priv->drm, "Switching to FCLK failed\n");
4646
4647 val = intel_de_read(dev_priv, LCPLL_CTL);
4648 }
4649
4650 val |= LCPLL_PLL_DISABLE;
4651 intel_de_write(dev_priv, LCPLL_CTL, val);
4652 intel_de_posting_read(dev_priv, LCPLL_CTL);
4653
4654 if (intel_de_wait_for_clear(dev_priv, LCPLL_CTL, LCPLL_PLL_LOCK, 1))
4655 drm_err(&dev_priv->drm, "LCPLL still locked\n");
4656
4657 val = hsw_read_dcomp(dev_priv);
4658 val |= D_COMP_COMP_DISABLE;
4659 hsw_write_dcomp(dev_priv, val);
4660 ndelay(100);
4661
4662 if (wait_for((hsw_read_dcomp(dev_priv) &
4663 D_COMP_RCOMP_IN_PROGRESS) == 0, 1))
4664 drm_err(&dev_priv->drm, "D_COMP RCOMP still in progress\n");
4665
4666 if (allow_power_down) {
4667 val = intel_de_read(dev_priv, LCPLL_CTL);
4668 val |= LCPLL_POWER_DOWN_ALLOW;
4669 intel_de_write(dev_priv, LCPLL_CTL, val);
4670 intel_de_posting_read(dev_priv, LCPLL_CTL);
4671 }
4672 }
4673
4674 /*
4675 * Fully restores LCPLL, disallowing power down and switching back to LCPLL
4676 * source.
4677 */
4678 static void hsw_restore_lcpll(struct drm_i915_private *dev_priv)
4679 {
4680 u32 val;
4681
4682 val = intel_de_read(dev_priv, LCPLL_CTL);
4683
4684 if ((val & (LCPLL_PLL_LOCK | LCPLL_PLL_DISABLE | LCPLL_CD_SOURCE_FCLK |
4685 LCPLL_POWER_DOWN_ALLOW)) == LCPLL_PLL_LOCK)
4686 return;
4687
4688 /*
4689 * Make sure we're not on PC8 state before disabling PC8, otherwise
4690 * we'll hang the machine. To prevent PC8 state, just enable force_wake.
4691 */
4692 intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
4693
4694 if (val & LCPLL_POWER_DOWN_ALLOW) {
4695 val &= ~LCPLL_POWER_DOWN_ALLOW;
4696 intel_de_write(dev_priv, LCPLL_CTL, val);
4697 intel_de_posting_read(dev_priv, LCPLL_CTL);
4698 }
4699
4700 val = hsw_read_dcomp(dev_priv);
4701 val |= D_COMP_COMP_FORCE;
4702 val &= ~D_COMP_COMP_DISABLE;
4703 hsw_write_dcomp(dev_priv, val);
4704
4705 val = intel_de_read(dev_priv, LCPLL_CTL);
4706 val &= ~LCPLL_PLL_DISABLE;
4707 intel_de_write(dev_priv, LCPLL_CTL, val);
4708
4709 if (intel_de_wait_for_set(dev_priv, LCPLL_CTL, LCPLL_PLL_LOCK, 5))
4710 drm_err(&dev_priv->drm, "LCPLL not locked yet\n");
4711
4712 if (val & LCPLL_CD_SOURCE_FCLK) {
4713 val = intel_de_read(dev_priv, LCPLL_CTL);
4714 val &= ~LCPLL_CD_SOURCE_FCLK;
4715 intel_de_write(dev_priv, LCPLL_CTL, val);
4716
4717 if (wait_for_us((intel_de_read(dev_priv, LCPLL_CTL) &
4718 LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1))
4719 drm_err(&dev_priv->drm,
4720 "Switching back to LCPLL failed\n");
4721 }
4722
4723 intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
4724
4725 intel_update_cdclk(dev_priv);
4726 intel_dump_cdclk_config(&dev_priv->cdclk.hw, "Current CDCLK");
4727 }
4728
4729 /*
4730 * Package states C8 and deeper are really deep PC states that can only be
4731 * reached when all the devices on the system allow it, so even if the graphics
4732 * device allows PC8+, it doesn't mean the system will actually get to these
4733 * states. Our driver only allows PC8+ when going into runtime PM.
4734 *
4735 * The requirements for PC8+ are that all the outputs are disabled, the power
4736 * well is disabled and most interrupts are disabled, and these are also
4737 * requirements for runtime PM. When these conditions are met, we manually do
4738 * the other conditions: disable the interrupts, clocks and switch LCPLL refclk
4739 * to Fclk. If we're in PC8+ and we get an non-hotplug interrupt, we can hard
4740 * hang the machine.
4741 *
4742 * When we really reach PC8 or deeper states (not just when we allow it) we lose
4743 * the state of some registers, so when we come back from PC8+ we need to
4744 * restore this state. We don't get into PC8+ if we're not in RC6, so we don't
4745 * need to take care of the registers kept by RC6. Notice that this happens even
4746 * if we don't put the device in PCI D3 state (which is what currently happens
4747 * because of the runtime PM support).
4748 *
4749 * For more, read "Display Sequences for Package C8" on the hardware
4750 * documentation.
4751 */
4752 static void hsw_enable_pc8(struct drm_i915_private *dev_priv)
4753 {
4754 u32 val;
4755
4756 drm_dbg_kms(&dev_priv->drm, "Enabling package C8+\n");
4757
4758 if (HAS_PCH_LPT_LP(dev_priv)) {
4759 val = intel_de_read(dev_priv, SOUTH_DSPCLK_GATE_D);
4760 val &= ~PCH_LP_PARTITION_LEVEL_DISABLE;
4761 intel_de_write(dev_priv, SOUTH_DSPCLK_GATE_D, val);
4762 }
4763
4764 lpt_disable_clkout_dp(dev_priv);
4765 hsw_disable_lcpll(dev_priv, true, true);
4766 }
4767
4768 static void hsw_disable_pc8(struct drm_i915_private *dev_priv)
4769 {
4770 u32 val;
4771
4772 drm_dbg_kms(&dev_priv->drm, "Disabling package C8+\n");
4773
4774 hsw_restore_lcpll(dev_priv);
4775 intel_init_pch_refclk(dev_priv);
4776
4777 if (HAS_PCH_LPT_LP(dev_priv)) {
4778 val = intel_de_read(dev_priv, SOUTH_DSPCLK_GATE_D);
4779 val |= PCH_LP_PARTITION_LEVEL_DISABLE;
4780 intel_de_write(dev_priv, SOUTH_DSPCLK_GATE_D, val);
4781 }
4782 }
4783
4784 static void intel_pch_reset_handshake(struct drm_i915_private *dev_priv,
4785 bool enable)
4786 {
4787 i915_reg_t reg;
4788 u32 reset_bits, val;
4789
4790 if (IS_IVYBRIDGE(dev_priv)) {
4791 reg = GEN7_MSG_CTL;
4792 reset_bits = WAIT_FOR_PCH_FLR_ACK | WAIT_FOR_PCH_RESET_ACK;
4793 } else {
4794 reg = HSW_NDE_RSTWRN_OPT;
4795 reset_bits = RESET_PCH_HANDSHAKE_ENABLE;
4796 }
4797
4798 val = intel_de_read(dev_priv, reg);
4799
4800 if (enable)
4801 val |= reset_bits;
4802 else
4803 val &= ~reset_bits;
4804
4805 intel_de_write(dev_priv, reg, val);
4806 }
4807
4808 static void skl_display_core_init(struct drm_i915_private *dev_priv,
4809 bool resume)
4810 {
4811 struct i915_power_domains *power_domains = &dev_priv->power_domains;
4812 struct i915_power_well *well;
4813
4814 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
4815
4816 /* enable PCH reset handshake */
4817 intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
4818
4819 /* enable PG1 and Misc I/O */
4820 mutex_lock(&power_domains->lock);
4821
4822 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
4823 intel_power_well_enable(dev_priv, well);
4824
4825 well = lookup_power_well(dev_priv, SKL_DISP_PW_MISC_IO);
4826 intel_power_well_enable(dev_priv, well);
4827
4828 mutex_unlock(&power_domains->lock);
4829
4830 intel_cdclk_init_hw(dev_priv);
4831
4832 gen9_dbuf_enable(dev_priv);
4833
4834 if (resume && dev_priv->csr.dmc_payload)
4835 intel_csr_load_program(dev_priv);
4836 }
4837
4838 static void skl_display_core_uninit(struct drm_i915_private *dev_priv)
4839 {
4840 struct i915_power_domains *power_domains = &dev_priv->power_domains;
4841 struct i915_power_well *well;
4842
4843 gen9_disable_dc_states(dev_priv);
4844
4845 gen9_dbuf_disable(dev_priv);
4846
4847 intel_cdclk_uninit_hw(dev_priv);
4848
4849 /* The spec doesn't call for removing the reset handshake flag */
4850 /* disable PG1 and Misc I/O */
4851
4852 mutex_lock(&power_domains->lock);
4853
4854 /*
4855 * BSpec says to keep the MISC IO power well enabled here, only
4856 * remove our request for power well 1.
4857 * Note that even though the driver's request is removed power well 1
4858 * may stay enabled after this due to DMC's own request on it.
4859 */
4860 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
4861 intel_power_well_disable(dev_priv, well);
4862
4863 mutex_unlock(&power_domains->lock);
4864
4865 usleep_range(10, 30); /* 10 us delay per Bspec */
4866 }
4867
4868 static void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume)
4869 {
4870 struct i915_power_domains *power_domains = &dev_priv->power_domains;
4871 struct i915_power_well *well;
4872
4873 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
4874
4875 /*
4876 * NDE_RSTWRN_OPT RST PCH Handshake En must always be 0b on BXT
4877 * or else the reset will hang because there is no PCH to respond.
4878 * Move the handshake programming to initialization sequence.
4879 * Previously was left up to BIOS.
4880 */
4881 intel_pch_reset_handshake(dev_priv, false);
4882
4883 /* Enable PG1 */
4884 mutex_lock(&power_domains->lock);
4885
4886 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
4887 intel_power_well_enable(dev_priv, well);
4888
4889 mutex_unlock(&power_domains->lock);
4890
4891 intel_cdclk_init_hw(dev_priv);
4892
4893 gen9_dbuf_enable(dev_priv);
4894
4895 if (resume && dev_priv->csr.dmc_payload)
4896 intel_csr_load_program(dev_priv);
4897 }
4898
4899 static void bxt_display_core_uninit(struct drm_i915_private *dev_priv)
4900 {
4901 struct i915_power_domains *power_domains = &dev_priv->power_domains;
4902 struct i915_power_well *well;
4903
4904 gen9_disable_dc_states(dev_priv);
4905
4906 gen9_dbuf_disable(dev_priv);
4907
4908 intel_cdclk_uninit_hw(dev_priv);
4909
4910 /* The spec doesn't call for removing the reset handshake flag */
4911
4912 /*
4913 * Disable PW1 (PG1).
4914 * Note that even though the driver's request is removed power well 1
4915 * may stay enabled after this due to DMC's own request on it.
4916 */
4917 mutex_lock(&power_domains->lock);
4918
4919 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
4920 intel_power_well_disable(dev_priv, well);
4921
4922 mutex_unlock(&power_domains->lock);
4923
4924 usleep_range(10, 30); /* 10 us delay per Bspec */
4925 }
4926
4927 static void cnl_display_core_init(struct drm_i915_private *dev_priv, bool resume)
4928 {
4929 struct i915_power_domains *power_domains = &dev_priv->power_domains;
4930 struct i915_power_well *well;
4931
4932 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
4933
4934 /* 1. Enable PCH Reset Handshake */
4935 intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
4936
4937 /* 2-3. */
4938 intel_combo_phy_init(dev_priv);
4939
4940 /*
4941 * 4. Enable Power Well 1 (PG1).
4942 * The AUX IO power wells will be enabled on demand.
4943 */
4944 mutex_lock(&power_domains->lock);
4945 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
4946 intel_power_well_enable(dev_priv, well);
4947 mutex_unlock(&power_domains->lock);
4948
4949 /* 5. Enable CD clock */
4950 intel_cdclk_init_hw(dev_priv);
4951
4952 /* 6. Enable DBUF */
4953 gen9_dbuf_enable(dev_priv);
4954
4955 if (resume && dev_priv->csr.dmc_payload)
4956 intel_csr_load_program(dev_priv);
4957 }
4958
4959 static void cnl_display_core_uninit(struct drm_i915_private *dev_priv)
4960 {
4961 struct i915_power_domains *power_domains = &dev_priv->power_domains;
4962 struct i915_power_well *well;
4963
4964 gen9_disable_dc_states(dev_priv);
4965
4966 /* 1. Disable all display engine functions -> aready done */
4967
4968 /* 2. Disable DBUF */
4969 gen9_dbuf_disable(dev_priv);
4970
4971 /* 3. Disable CD clock */
4972 intel_cdclk_uninit_hw(dev_priv);
4973
4974 /*
4975 * 4. Disable Power Well 1 (PG1).
4976 * The AUX IO power wells are toggled on demand, so they are already
4977 * disabled at this point.
4978 */
4979 mutex_lock(&power_domains->lock);
4980 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
4981 intel_power_well_disable(dev_priv, well);
4982 mutex_unlock(&power_domains->lock);
4983
4984 usleep_range(10, 30); /* 10 us delay per Bspec */
4985
4986 /* 5. */
4987 intel_combo_phy_uninit(dev_priv);
4988 }
4989
4990 struct buddy_page_mask {
4991 u32 page_mask;
4992 u8 type;
4993 u8 num_channels;
4994 };
4995
4996 static const struct buddy_page_mask tgl_buddy_page_masks[] = {
4997 { .num_channels = 1, .type = INTEL_DRAM_LPDDR4, .page_mask = 0xE },
4998 { .num_channels = 1, .type = INTEL_DRAM_DDR4, .page_mask = 0xF },
4999 { .num_channels = 2, .type = INTEL_DRAM_LPDDR4, .page_mask = 0x1C },
5000 { .num_channels = 2, .type = INTEL_DRAM_DDR4, .page_mask = 0x1F },
5001 {}
5002 };
5003
5004 static const struct buddy_page_mask wa_1409767108_buddy_page_masks[] = {
5005 { .num_channels = 1, .type = INTEL_DRAM_LPDDR4, .page_mask = 0x1 },
5006 { .num_channels = 1, .type = INTEL_DRAM_DDR4, .page_mask = 0x1 },
5007 { .num_channels = 2, .type = INTEL_DRAM_LPDDR4, .page_mask = 0x3 },
5008 { .num_channels = 2, .type = INTEL_DRAM_DDR4, .page_mask = 0x3 },
5009 {}
5010 };
5011
5012 static void tgl_bw_buddy_init(struct drm_i915_private *dev_priv)
5013 {
5014 enum intel_dram_type type = dev_priv->dram_info.type;
5015 u8 num_channels = dev_priv->dram_info.num_channels;
5016 const struct buddy_page_mask *table;
5017 int i;
5018
5019 if (IS_TGL_REVID(dev_priv, TGL_REVID_A0, TGL_REVID_A0))
5020 /* Wa_1409767108: tgl */
5021 table = wa_1409767108_buddy_page_masks;
5022 else
5023 table = tgl_buddy_page_masks;
5024
5025 for (i = 0; table[i].page_mask != 0; i++)
5026 if (table[i].num_channels == num_channels &&
5027 table[i].type == type)
5028 break;
5029
5030 if (table[i].page_mask == 0) {
5031 drm_dbg(&dev_priv->drm,
5032 "Unknown memory configuration; disabling address buddy logic.\n");
5033 intel_de_write(dev_priv, BW_BUDDY1_CTL, BW_BUDDY_DISABLE);
5034 intel_de_write(dev_priv, BW_BUDDY2_CTL, BW_BUDDY_DISABLE);
5035 } else {
5036 intel_de_write(dev_priv, BW_BUDDY1_PAGE_MASK,
5037 table[i].page_mask);
5038 intel_de_write(dev_priv, BW_BUDDY2_PAGE_MASK,
5039 table[i].page_mask);
5040
5041 /* Wa_22010178259:tgl */
5042 intel_de_rmw(dev_priv, BW_BUDDY1_CTL,
5043 BW_BUDDY_TLB_REQ_TIMER_MASK,
5044 REG_FIELD_PREP(BW_BUDDY_TLB_REQ_TIMER_MASK, 0x8));
5045 intel_de_rmw(dev_priv, BW_BUDDY2_CTL,
5046 BW_BUDDY_TLB_REQ_TIMER_MASK,
5047 REG_FIELD_PREP(BW_BUDDY_TLB_REQ_TIMER_MASK, 0x8));
5048 }
5049 }
5050
5051 static void icl_display_core_init(struct drm_i915_private *dev_priv,
5052 bool resume)
5053 {
5054 struct i915_power_domains *power_domains = &dev_priv->power_domains;
5055 struct i915_power_well *well;
5056
5057 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
5058
5059 /* 1. Enable PCH reset handshake. */
5060 intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
5061
5062 /* 2. Initialize all combo phys */
5063 intel_combo_phy_init(dev_priv);
5064
5065 /*
5066 * 3. Enable Power Well 1 (PG1).
5067 * The AUX IO power wells will be enabled on demand.
5068 */
5069 mutex_lock(&power_domains->lock);
5070 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
5071 intel_power_well_enable(dev_priv, well);
5072 mutex_unlock(&power_domains->lock);
5073
5074 /* 4. Enable CDCLK. */
5075 intel_cdclk_init_hw(dev_priv);
5076
5077 /* 5. Enable DBUF. */
5078 icl_dbuf_enable(dev_priv);
5079
5080 /* 6. Setup MBUS. */
5081 icl_mbus_init(dev_priv);
5082
5083 /* 7. Program arbiter BW_BUDDY registers */
5084 if (INTEL_GEN(dev_priv) >= 12)
5085 tgl_bw_buddy_init(dev_priv);
5086
5087 if (resume && dev_priv->csr.dmc_payload)
5088 intel_csr_load_program(dev_priv);
5089 }
5090
5091 static void icl_display_core_uninit(struct drm_i915_private *dev_priv)
5092 {
5093 struct i915_power_domains *power_domains = &dev_priv->power_domains;
5094 struct i915_power_well *well;
5095
5096 gen9_disable_dc_states(dev_priv);
5097
5098 /* 1. Disable all display engine functions -> aready done */
5099
5100 /* 2. Disable DBUF */
5101 icl_dbuf_disable(dev_priv);
5102
5103 /* 3. Disable CD clock */
5104 intel_cdclk_uninit_hw(dev_priv);
5105
5106 /*
5107 * 4. Disable Power Well 1 (PG1).
5108 * The AUX IO power wells are toggled on demand, so they are already
5109 * disabled at this point.
5110 */
5111 mutex_lock(&power_domains->lock);
5112 well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
5113 intel_power_well_disable(dev_priv, well);
5114 mutex_unlock(&power_domains->lock);
5115
5116 /* 5. */
5117 intel_combo_phy_uninit(dev_priv);
5118 }
5119
5120 static void chv_phy_control_init(struct drm_i915_private *dev_priv)
5121 {
5122 struct i915_power_well *cmn_bc =
5123 lookup_power_well(dev_priv, VLV_DISP_PW_DPIO_CMN_BC);
5124 struct i915_power_well *cmn_d =
5125 lookup_power_well(dev_priv, CHV_DISP_PW_DPIO_CMN_D);
5126
5127 /*
5128 * DISPLAY_PHY_CONTROL can get corrupted if read. As a
5129 * workaround never ever read DISPLAY_PHY_CONTROL, and
5130 * instead maintain a shadow copy ourselves. Use the actual
5131 * power well state and lane status to reconstruct the
5132 * expected initial value.
5133 */
5134 dev_priv->chv_phy_control =
5135 PHY_LDO_SEQ_DELAY(PHY_LDO_DELAY_600NS, DPIO_PHY0) |
5136 PHY_LDO_SEQ_DELAY(PHY_LDO_DELAY_600NS, DPIO_PHY1) |
5137 PHY_CH_POWER_MODE(PHY_CH_DEEP_PSR, DPIO_PHY0, DPIO_CH0) |
5138 PHY_CH_POWER_MODE(PHY_CH_DEEP_PSR, DPIO_PHY0, DPIO_CH1) |
5139 PHY_CH_POWER_MODE(PHY_CH_DEEP_PSR, DPIO_PHY1, DPIO_CH0);
5140
5141 /*
5142 * If all lanes are disabled we leave the override disabled
5143 * with all power down bits cleared to match the state we
5144 * would use after disabling the port. Otherwise enable the
5145 * override and set the lane powerdown bits accding to the
5146 * current lane status.
5147 */
5148 if (cmn_bc->desc->ops->is_enabled(dev_priv, cmn_bc)) {
5149 u32 status = intel_de_read(dev_priv, DPLL(PIPE_A));
5150 unsigned int mask;
5151
5152 mask = status & DPLL_PORTB_READY_MASK;
5153 if (mask == 0xf)
5154 mask = 0x0;
5155 else
5156 dev_priv->chv_phy_control |=
5157 PHY_CH_POWER_DOWN_OVRD_EN(DPIO_PHY0, DPIO_CH0);
5158
5159 dev_priv->chv_phy_control |=
5160 PHY_CH_POWER_DOWN_OVRD(mask, DPIO_PHY0, DPIO_CH0);
5161
5162 mask = (status & DPLL_PORTC_READY_MASK) >> 4;
5163 if (mask == 0xf)
5164 mask = 0x0;
5165 else
5166 dev_priv->chv_phy_control |=
5167 PHY_CH_POWER_DOWN_OVRD_EN(DPIO_PHY0, DPIO_CH1);
5168
5169 dev_priv->chv_phy_control |=
5170 PHY_CH_POWER_DOWN_OVRD(mask, DPIO_PHY0, DPIO_CH1);
5171
5172 dev_priv->chv_phy_control |= PHY_COM_LANE_RESET_DEASSERT(DPIO_PHY0);
5173
5174 dev_priv->chv_phy_assert[DPIO_PHY0] = false;
5175 } else {
5176 dev_priv->chv_phy_assert[DPIO_PHY0] = true;
5177 }
5178
5179 if (cmn_d->desc->ops->is_enabled(dev_priv, cmn_d)) {
5180 u32 status = intel_de_read(dev_priv, DPIO_PHY_STATUS);
5181 unsigned int mask;
5182
5183 mask = status & DPLL_PORTD_READY_MASK;
5184
5185 if (mask == 0xf)
5186 mask = 0x0;
5187 else
5188 dev_priv->chv_phy_control |=
5189 PHY_CH_POWER_DOWN_OVRD_EN(DPIO_PHY1, DPIO_CH0);
5190
5191 dev_priv->chv_phy_control |=
5192 PHY_CH_POWER_DOWN_OVRD(mask, DPIO_PHY1, DPIO_CH0);
5193
5194 dev_priv->chv_phy_control |= PHY_COM_LANE_RESET_DEASSERT(DPIO_PHY1);
5195
5196 dev_priv->chv_phy_assert[DPIO_PHY1] = false;
5197 } else {
5198 dev_priv->chv_phy_assert[DPIO_PHY1] = true;
5199 }
5200
5201 drm_dbg_kms(&dev_priv->drm, "Initial PHY_CONTROL=0x%08x\n",
5202 dev_priv->chv_phy_control);
5203
5204 /* Defer application of initial phy_control to enabling the powerwell */
5205 }
5206
5207 static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv)
5208 {
5209 struct i915_power_well *cmn =
5210 lookup_power_well(dev_priv, VLV_DISP_PW_DPIO_CMN_BC);
5211 struct i915_power_well *disp2d =
5212 lookup_power_well(dev_priv, VLV_DISP_PW_DISP2D);
5213
5214 /* If the display might be already active skip this */
5215 if (cmn->desc->ops->is_enabled(dev_priv, cmn) &&
5216 disp2d->desc->ops->is_enabled(dev_priv, disp2d) &&
5217 intel_de_read(dev_priv, DPIO_CTL) & DPIO_CMNRST)
5218 return;
5219
5220 drm_dbg_kms(&dev_priv->drm, "toggling display PHY side reset\n");
5221
5222 /* cmnlane needs DPLL registers */
5223 disp2d->desc->ops->enable(dev_priv, disp2d);
5224
5225 /*
5226 * From VLV2A0_DP_eDP_HDMI_DPIO_driver_vbios_notes_11.docx:
5227 * Need to assert and de-assert PHY SB reset by gating the
5228 * common lane power, then un-gating it.
5229 * Simply ungating isn't enough to reset the PHY enough to get
5230 * ports and lanes running.
5231 */
5232 cmn->desc->ops->disable(dev_priv, cmn);
5233 }
5234
5235 static bool vlv_punit_is_power_gated(struct drm_i915_private *dev_priv, u32 reg0)
5236 {
5237 bool ret;
5238
5239 vlv_punit_get(dev_priv);
5240 ret = (vlv_punit_read(dev_priv, reg0) & SSPM0_SSC_MASK) == SSPM0_SSC_PWR_GATE;
5241 vlv_punit_put(dev_priv);
5242
5243 return ret;
5244 }
5245
5246 static void assert_ved_power_gated(struct drm_i915_private *dev_priv)
5247 {
5248 drm_WARN(&dev_priv->drm,
5249 !vlv_punit_is_power_gated(dev_priv, PUNIT_REG_VEDSSPM0),
5250 "VED not power gated\n");
5251 }
5252
5253 static void assert_isp_power_gated(struct drm_i915_private *dev_priv)
5254 {
5255 static const struct pci_device_id isp_ids[] = {
5256 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0f38)},
5257 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x22b8)},
5258 {}
5259 };
5260
5261 drm_WARN(&dev_priv->drm, !pci_dev_present(isp_ids) &&
5262 !vlv_punit_is_power_gated(dev_priv, PUNIT_REG_ISPSSPM0),
5263 "ISP not power gated\n");
5264 }
5265
5266 static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv);
5267
5268 /**
5269 * intel_power_domains_init_hw - initialize hardware power domain state
5270 * @i915: i915 device instance
5271 * @resume: Called from resume code paths or not
5272 *
5273 * This function initializes the hardware power domain state and enables all
5274 * power wells belonging to the INIT power domain. Power wells in other
5275 * domains (and not in the INIT domain) are referenced or disabled by
5276 * intel_modeset_readout_hw_state(). After that the reference count of each
5277 * power well must match its HW enabled state, see
5278 * intel_power_domains_verify_state().
5279 *
5280 * It will return with power domains disabled (to be enabled later by
5281 * intel_power_domains_enable()) and must be paired with
5282 * intel_power_domains_driver_remove().
5283 */
5284 void intel_power_domains_init_hw(struct drm_i915_private *i915, bool resume)
5285 {
5286 struct i915_power_domains *power_domains = &i915->power_domains;
5287
5288 power_domains->initializing = true;
5289
5290 if (INTEL_GEN(i915) >= 11) {
5291 icl_display_core_init(i915, resume);
5292 } else if (IS_CANNONLAKE(i915)) {
5293 cnl_display_core_init(i915, resume);
5294 } else if (IS_GEN9_BC(i915)) {
5295 skl_display_core_init(i915, resume);
5296 } else if (IS_GEN9_LP(i915)) {
5297 bxt_display_core_init(i915, resume);
5298 } else if (IS_CHERRYVIEW(i915)) {
5299 mutex_lock(&power_domains->lock);
5300 chv_phy_control_init(i915);
5301 mutex_unlock(&power_domains->lock);
5302 assert_isp_power_gated(i915);
5303 } else if (IS_VALLEYVIEW(i915)) {
5304 mutex_lock(&power_domains->lock);
5305 vlv_cmnlane_wa(i915);
5306 mutex_unlock(&power_domains->lock);
5307 assert_ved_power_gated(i915);
5308 assert_isp_power_gated(i915);
5309 } else if (IS_BROADWELL(i915) || IS_HASWELL(i915)) {
5310 hsw_assert_cdclk(i915);
5311 intel_pch_reset_handshake(i915, !HAS_PCH_NOP(i915));
5312 } else if (IS_IVYBRIDGE(i915)) {
5313 intel_pch_reset_handshake(i915, !HAS_PCH_NOP(i915));
5314 }
5315
5316 /*
5317 * Keep all power wells enabled for any dependent HW access during
5318 * initialization and to make sure we keep BIOS enabled display HW
5319 * resources powered until display HW readout is complete. We drop
5320 * this reference in intel_power_domains_enable().
5321 */
5322 power_domains->wakeref =
5323 intel_display_power_get(i915, POWER_DOMAIN_INIT);
5324
5325 /* Disable power support if the user asked so. */
5326 if (!i915_modparams.disable_power_well)
5327 intel_display_power_get(i915, POWER_DOMAIN_INIT);
5328 intel_power_domains_sync_hw(i915);
5329
5330 power_domains->initializing = false;
5331 }
5332
5333 /**
5334 * intel_power_domains_driver_remove - deinitialize hw power domain state
5335 * @i915: i915 device instance
5336 *
5337 * De-initializes the display power domain HW state. It also ensures that the
5338 * device stays powered up so that the driver can be reloaded.
5339 *
5340 * It must be called with power domains already disabled (after a call to
5341 * intel_power_domains_disable()) and must be paired with
5342 * intel_power_domains_init_hw().
5343 */
5344 void intel_power_domains_driver_remove(struct drm_i915_private *i915)
5345 {
5346 intel_wakeref_t wakeref __maybe_unused =
5347 fetch_and_zero(&i915->power_domains.wakeref);
5348
5349 /* Remove the refcount we took to keep power well support disabled. */
5350 if (!i915_modparams.disable_power_well)
5351 intel_display_power_put_unchecked(i915, POWER_DOMAIN_INIT);
5352
5353 intel_display_power_flush_work_sync(i915);
5354
5355 intel_power_domains_verify_state(i915);
5356
5357 /* Keep the power well enabled, but cancel its rpm wakeref. */
5358 intel_runtime_pm_put(&i915->runtime_pm, wakeref);
5359 }
5360
5361 /**
5362 * intel_power_domains_enable - enable toggling of display power wells
5363 * @i915: i915 device instance
5364 *
5365 * Enable the ondemand enabling/disabling of the display power wells. Note that
5366 * power wells not belonging to POWER_DOMAIN_INIT are allowed to be toggled
5367 * only at specific points of the display modeset sequence, thus they are not
5368 * affected by the intel_power_domains_enable()/disable() calls. The purpose
5369 * of these function is to keep the rest of power wells enabled until the end
5370 * of display HW readout (which will acquire the power references reflecting
5371 * the current HW state).
5372 */
5373 void intel_power_domains_enable(struct drm_i915_private *i915)
5374 {
5375 intel_wakeref_t wakeref __maybe_unused =
5376 fetch_and_zero(&i915->power_domains.wakeref);
5377
5378 intel_display_power_put(i915, POWER_DOMAIN_INIT, wakeref);
5379 intel_power_domains_verify_state(i915);
5380 }
5381
5382 /**
5383 * intel_power_domains_disable - disable toggling of display power wells
5384 * @i915: i915 device instance
5385 *
5386 * Disable the ondemand enabling/disabling of the display power wells. See
5387 * intel_power_domains_enable() for which power wells this call controls.
5388 */
5389 void intel_power_domains_disable(struct drm_i915_private *i915)
5390 {
5391 struct i915_power_domains *power_domains = &i915->power_domains;
5392
5393 drm_WARN_ON(&i915->drm, power_domains->wakeref);
5394 power_domains->wakeref =
5395 intel_display_power_get(i915, POWER_DOMAIN_INIT);
5396
5397 intel_power_domains_verify_state(i915);
5398 }
5399
5400 /**
5401 * intel_power_domains_suspend - suspend power domain state
5402 * @i915: i915 device instance
5403 * @suspend_mode: specifies the target suspend state (idle, mem, hibernation)
5404 *
5405 * This function prepares the hardware power domain state before entering
5406 * system suspend.
5407 *
5408 * It must be called with power domains already disabled (after a call to
5409 * intel_power_domains_disable()) and paired with intel_power_domains_resume().
5410 */
5411 void intel_power_domains_suspend(struct drm_i915_private *i915,
5412 enum i915_drm_suspend_mode suspend_mode)
5413 {
5414 struct i915_power_domains *power_domains = &i915->power_domains;
5415 intel_wakeref_t wakeref __maybe_unused =
5416 fetch_and_zero(&power_domains->wakeref);
5417
5418 intel_display_power_put(i915, POWER_DOMAIN_INIT, wakeref);
5419
5420 /*
5421 * In case of suspend-to-idle (aka S0ix) on a DMC platform without DC9
5422 * support don't manually deinit the power domains. This also means the
5423 * CSR/DMC firmware will stay active, it will power down any HW
5424 * resources as required and also enable deeper system power states
5425 * that would be blocked if the firmware was inactive.
5426 */
5427 if (!(i915->csr.allowed_dc_mask & DC_STATE_EN_DC9) &&
5428 suspend_mode == I915_DRM_SUSPEND_IDLE &&
5429 i915->csr.dmc_payload) {
5430 intel_display_power_flush_work(i915);
5431 intel_power_domains_verify_state(i915);
5432 return;
5433 }
5434
5435 /*
5436 * Even if power well support was disabled we still want to disable
5437 * power wells if power domains must be deinitialized for suspend.
5438 */
5439 if (!i915_modparams.disable_power_well)
5440 intel_display_power_put_unchecked(i915, POWER_DOMAIN_INIT);
5441
5442 intel_display_power_flush_work(i915);
5443 intel_power_domains_verify_state(i915);
5444
5445 if (INTEL_GEN(i915) >= 11)
5446 icl_display_core_uninit(i915);
5447 else if (IS_CANNONLAKE(i915))
5448 cnl_display_core_uninit(i915);
5449 else if (IS_GEN9_BC(i915))
5450 skl_display_core_uninit(i915);
5451 else if (IS_GEN9_LP(i915))
5452 bxt_display_core_uninit(i915);
5453
5454 power_domains->display_core_suspended = true;
5455 }
5456
5457 /**
5458 * intel_power_domains_resume - resume power domain state
5459 * @i915: i915 device instance
5460 *
5461 * This function resume the hardware power domain state during system resume.
5462 *
5463 * It will return with power domain support disabled (to be enabled later by
5464 * intel_power_domains_enable()) and must be paired with
5465 * intel_power_domains_suspend().
5466 */
5467 void intel_power_domains_resume(struct drm_i915_private *i915)
5468 {
5469 struct i915_power_domains *power_domains = &i915->power_domains;
5470
5471 if (power_domains->display_core_suspended) {
5472 intel_power_domains_init_hw(i915, true);
5473 power_domains->display_core_suspended = false;
5474 } else {
5475 drm_WARN_ON(&i915->drm, power_domains->wakeref);
5476 power_domains->wakeref =
5477 intel_display_power_get(i915, POWER_DOMAIN_INIT);
5478 }
5479
5480 intel_power_domains_verify_state(i915);
5481 }
5482
5483 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
5484
5485 static void intel_power_domains_dump_info(struct drm_i915_private *i915)
5486 {
5487 struct i915_power_domains *power_domains = &i915->power_domains;
5488 struct i915_power_well *power_well;
5489
5490 for_each_power_well(i915, power_well) {
5491 enum intel_display_power_domain domain;
5492
5493 drm_dbg(&i915->drm, "%-25s %d\n",
5494 power_well->desc->name, power_well->count);
5495
5496 for_each_power_domain(domain, power_well->desc->domains)
5497 drm_dbg(&i915->drm, " %-23s %d\n",
5498 intel_display_power_domain_str(domain),
5499 power_domains->domain_use_count[domain]);
5500 }
5501 }
5502
5503 /**
5504 * intel_power_domains_verify_state - verify the HW/SW state for all power wells
5505 * @i915: i915 device instance
5506 *
5507 * Verify if the reference count of each power well matches its HW enabled
5508 * state and the total refcount of the domains it belongs to. This must be
5509 * called after modeset HW state sanitization, which is responsible for
5510 * acquiring reference counts for any power wells in use and disabling the
5511 * ones left on by BIOS but not required by any active output.
5512 */
5513 static void intel_power_domains_verify_state(struct drm_i915_private *i915)
5514 {
5515 struct i915_power_domains *power_domains = &i915->power_domains;
5516 struct i915_power_well *power_well;
5517 bool dump_domain_info;
5518
5519 mutex_lock(&power_domains->lock);
5520
5521 verify_async_put_domains_state(power_domains);
5522
5523 dump_domain_info = false;
5524 for_each_power_well(i915, power_well) {
5525 enum intel_display_power_domain domain;
5526 int domains_count;
5527 bool enabled;
5528
5529 enabled = power_well->desc->ops->is_enabled(i915, power_well);
5530 if ((power_well->count || power_well->desc->always_on) !=
5531 enabled)
5532 drm_err(&i915->drm,
5533 "power well %s state mismatch (refcount %d/enabled %d)",
5534 power_well->desc->name,
5535 power_well->count, enabled);
5536
5537 domains_count = 0;
5538 for_each_power_domain(domain, power_well->desc->domains)
5539 domains_count += power_domains->domain_use_count[domain];
5540
5541 if (power_well->count != domains_count) {
5542 drm_err(&i915->drm,
5543 "power well %s refcount/domain refcount mismatch "
5544 "(refcount %d/domains refcount %d)\n",
5545 power_well->desc->name, power_well->count,
5546 domains_count);
5547 dump_domain_info = true;
5548 }
5549 }
5550
5551 if (dump_domain_info) {
5552 static bool dumped;
5553
5554 if (!dumped) {
5555 intel_power_domains_dump_info(i915);
5556 dumped = true;
5557 }
5558 }
5559
5560 mutex_unlock(&power_domains->lock);
5561 }
5562
5563 #else
5564
5565 static void intel_power_domains_verify_state(struct drm_i915_private *i915)
5566 {
5567 }
5568
5569 #endif
5570
5571 void intel_display_power_suspend_late(struct drm_i915_private *i915)
5572 {
5573 if (INTEL_GEN(i915) >= 11 || IS_GEN9_LP(i915))
5574 bxt_enable_dc9(i915);
5575 else if (IS_HASWELL(i915) || IS_BROADWELL(i915))
5576 hsw_enable_pc8(i915);
5577 }
5578
5579 void intel_display_power_resume_early(struct drm_i915_private *i915)
5580 {
5581 if (INTEL_GEN(i915) >= 11 || IS_GEN9_LP(i915)) {
5582 gen9_sanitize_dc_state(i915);
5583 bxt_disable_dc9(i915);
5584 } else if (IS_HASWELL(i915) || IS_BROADWELL(i915)) {
5585 hsw_disable_pc8(i915);
5586 }
5587 }
5588
5589 void intel_display_power_suspend(struct drm_i915_private *i915)
5590 {
5591 if (INTEL_GEN(i915) >= 11) {
5592 icl_display_core_uninit(i915);
5593 bxt_enable_dc9(i915);
5594 } else if (IS_GEN9_LP(i915)) {
5595 bxt_display_core_uninit(i915);
5596 bxt_enable_dc9(i915);
5597 } else if (IS_HASWELL(i915) || IS_BROADWELL(i915)) {
5598 hsw_enable_pc8(i915);
5599 }
5600 }
5601
5602 void intel_display_power_resume(struct drm_i915_private *i915)
5603 {
5604 if (INTEL_GEN(i915) >= 11) {
5605 bxt_disable_dc9(i915);
5606 icl_display_core_init(i915, true);
5607 if (i915->csr.dmc_payload) {
5608 if (i915->csr.allowed_dc_mask &
5609 DC_STATE_EN_UPTO_DC6)
5610 skl_enable_dc6(i915);
5611 else if (i915->csr.allowed_dc_mask &
5612 DC_STATE_EN_UPTO_DC5)
5613 gen9_enable_dc5(i915);
5614 }
5615 } else if (IS_GEN9_LP(i915)) {
5616 bxt_disable_dc9(i915);
5617 bxt_display_core_init(i915, true);
5618 if (i915->csr.dmc_payload &&
5619 (i915->csr.allowed_dc_mask & DC_STATE_EN_UPTO_DC5))
5620 gen9_enable_dc5(i915);
5621 } else if (IS_HASWELL(i915) || IS_BROADWELL(i915)) {
5622 hsw_disable_pc8(i915);
5623 }
5624 }