]> Git Repo - linux.git/blob - drivers/gpu/drm/i915/display/intel_display_power_map.c
net: wan: Add framer framework support
[linux.git] / drivers / gpu / drm / i915 / display / intel_display_power_map.c
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2022 Intel Corporation
4  */
5
6 #include "i915_drv.h"
7 #include "i915_reg.h"
8
9 #include "vlv_sideband_reg.h"
10
11 #include "intel_display_power_map.h"
12 #include "intel_display_power_well.h"
13 #include "intel_display_types.h"
14
15 #define __LIST_INLINE_ELEMS(__elem_type, ...) \
16         ((__elem_type[]) { __VA_ARGS__ })
17
18 #define __LIST(__elems) { \
19         .list = __elems, \
20         .count = ARRAY_SIZE(__elems), \
21 }
22
23 #define I915_PW_DOMAINS(...) \
24         (const struct i915_power_domain_list) \
25                 __LIST(__LIST_INLINE_ELEMS(const enum intel_display_power_domain, __VA_ARGS__))
26
27 #define I915_DECL_PW_DOMAINS(__name, ...) \
28         static const struct i915_power_domain_list __name = I915_PW_DOMAINS(__VA_ARGS__)
29
30 /* Zero-length list assigns all power domains, a NULL list assigns none. */
31 #define I915_PW_DOMAINS_NONE    NULL
32 #define I915_PW_DOMAINS_ALL     /* zero-length list */
33
34 #define I915_PW_INSTANCES(...) \
35         (const struct i915_power_well_instance_list) \
36                 __LIST(__LIST_INLINE_ELEMS(const struct i915_power_well_instance, __VA_ARGS__))
37
38 #define I915_PW(_name, _domain_list, ...) \
39         { .name = _name, .domain_list = _domain_list, ## __VA_ARGS__ }
40
41
42 struct i915_power_well_desc_list {
43         const struct i915_power_well_desc *list;
44         u8 count;
45 };
46
47 #define I915_PW_DESCRIPTORS(x) __LIST(x)
48
49
50 I915_DECL_PW_DOMAINS(i9xx_pwdoms_always_on, I915_PW_DOMAINS_ALL);
51
52 static const struct i915_power_well_desc i9xx_power_wells_always_on[] = {
53         {
54                 .instances = &I915_PW_INSTANCES(
55                         I915_PW("always-on", &i9xx_pwdoms_always_on),
56                 ),
57                 .ops = &i9xx_always_on_power_well_ops,
58                 .always_on = true,
59         },
60 };
61
62 static const struct i915_power_well_desc_list i9xx_power_wells[] = {
63         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
64 };
65
66 I915_DECL_PW_DOMAINS(i830_pwdoms_pipes,
67         POWER_DOMAIN_PIPE_A,
68         POWER_DOMAIN_PIPE_B,
69         POWER_DOMAIN_PIPE_PANEL_FITTER_A,
70         POWER_DOMAIN_PIPE_PANEL_FITTER_B,
71         POWER_DOMAIN_TRANSCODER_A,
72         POWER_DOMAIN_TRANSCODER_B,
73         POWER_DOMAIN_INIT);
74
75 static const struct i915_power_well_desc i830_power_wells_main[] = {
76         {
77                 .instances = &I915_PW_INSTANCES(
78                         I915_PW("pipes", &i830_pwdoms_pipes),
79                 ),
80                 .ops = &i830_pipes_power_well_ops,
81         },
82 };
83
84 static const struct i915_power_well_desc_list i830_power_wells[] = {
85         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
86         I915_PW_DESCRIPTORS(i830_power_wells_main),
87 };
88
89 I915_DECL_PW_DOMAINS(hsw_pwdoms_display,
90         POWER_DOMAIN_PIPE_B,
91         POWER_DOMAIN_PIPE_C,
92         POWER_DOMAIN_PIPE_PANEL_FITTER_A,
93         POWER_DOMAIN_PIPE_PANEL_FITTER_B,
94         POWER_DOMAIN_PIPE_PANEL_FITTER_C,
95         POWER_DOMAIN_TRANSCODER_A,
96         POWER_DOMAIN_TRANSCODER_B,
97         POWER_DOMAIN_TRANSCODER_C,
98         POWER_DOMAIN_PORT_DDI_LANES_B,
99         POWER_DOMAIN_PORT_DDI_LANES_C,
100         POWER_DOMAIN_PORT_DDI_LANES_D,
101         POWER_DOMAIN_PORT_CRT, /* DDI E */
102         POWER_DOMAIN_VGA,
103         POWER_DOMAIN_AUDIO_MMIO,
104         POWER_DOMAIN_AUDIO_PLAYBACK,
105         POWER_DOMAIN_INIT);
106
107 static const struct i915_power_well_desc hsw_power_wells_main[] = {
108         {
109                 .instances = &I915_PW_INSTANCES(
110                         I915_PW("display", &hsw_pwdoms_display,
111                                 .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
112                                 .id = HSW_DISP_PW_GLOBAL),
113                 ),
114                 .ops = &hsw_power_well_ops,
115                 .has_vga = true,
116         },
117 };
118
119 static const struct i915_power_well_desc_list hsw_power_wells[] = {
120         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
121         I915_PW_DESCRIPTORS(hsw_power_wells_main),
122 };
123
124 I915_DECL_PW_DOMAINS(bdw_pwdoms_display,
125         POWER_DOMAIN_PIPE_B,
126         POWER_DOMAIN_PIPE_C,
127         POWER_DOMAIN_PIPE_PANEL_FITTER_B,
128         POWER_DOMAIN_PIPE_PANEL_FITTER_C,
129         POWER_DOMAIN_TRANSCODER_A,
130         POWER_DOMAIN_TRANSCODER_B,
131         POWER_DOMAIN_TRANSCODER_C,
132         POWER_DOMAIN_PORT_DDI_LANES_B,
133         POWER_DOMAIN_PORT_DDI_LANES_C,
134         POWER_DOMAIN_PORT_DDI_LANES_D,
135         POWER_DOMAIN_PORT_CRT, /* DDI E */
136         POWER_DOMAIN_VGA,
137         POWER_DOMAIN_AUDIO_MMIO,
138         POWER_DOMAIN_AUDIO_PLAYBACK,
139         POWER_DOMAIN_INIT);
140
141 static const struct i915_power_well_desc bdw_power_wells_main[] = {
142         {
143                 .instances = &I915_PW_INSTANCES(
144                         I915_PW("display", &bdw_pwdoms_display,
145                                 .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
146                                 .id = HSW_DISP_PW_GLOBAL),
147                 ),
148                 .ops = &hsw_power_well_ops,
149                 .has_vga = true,
150                 .irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
151         },
152 };
153
154 static const struct i915_power_well_desc_list bdw_power_wells[] = {
155         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
156         I915_PW_DESCRIPTORS(bdw_power_wells_main),
157 };
158
159 I915_DECL_PW_DOMAINS(vlv_pwdoms_display,
160         POWER_DOMAIN_DISPLAY_CORE,
161         POWER_DOMAIN_PIPE_A,
162         POWER_DOMAIN_PIPE_B,
163         POWER_DOMAIN_PIPE_PANEL_FITTER_A,
164         POWER_DOMAIN_PIPE_PANEL_FITTER_B,
165         POWER_DOMAIN_TRANSCODER_A,
166         POWER_DOMAIN_TRANSCODER_B,
167         POWER_DOMAIN_PORT_DDI_LANES_B,
168         POWER_DOMAIN_PORT_DDI_LANES_C,
169         POWER_DOMAIN_PORT_DSI,
170         POWER_DOMAIN_PORT_CRT,
171         POWER_DOMAIN_VGA,
172         POWER_DOMAIN_AUDIO_MMIO,
173         POWER_DOMAIN_AUDIO_PLAYBACK,
174         POWER_DOMAIN_AUX_IO_B,
175         POWER_DOMAIN_AUX_IO_C,
176         POWER_DOMAIN_AUX_B,
177         POWER_DOMAIN_AUX_C,
178         POWER_DOMAIN_GMBUS,
179         POWER_DOMAIN_INIT);
180
181 I915_DECL_PW_DOMAINS(vlv_pwdoms_dpio_cmn_bc,
182         POWER_DOMAIN_PORT_DDI_LANES_B,
183         POWER_DOMAIN_PORT_DDI_LANES_C,
184         POWER_DOMAIN_PORT_CRT,
185         POWER_DOMAIN_AUX_IO_B,
186         POWER_DOMAIN_AUX_IO_C,
187         POWER_DOMAIN_AUX_B,
188         POWER_DOMAIN_AUX_C,
189         POWER_DOMAIN_INIT);
190
191 I915_DECL_PW_DOMAINS(vlv_pwdoms_dpio_tx_bc_lanes,
192         POWER_DOMAIN_PORT_DDI_LANES_B,
193         POWER_DOMAIN_PORT_DDI_LANES_C,
194         POWER_DOMAIN_AUX_IO_B,
195         POWER_DOMAIN_AUX_IO_C,
196         POWER_DOMAIN_AUX_B,
197         POWER_DOMAIN_AUX_C,
198         POWER_DOMAIN_INIT);
199
200 static const struct i915_power_well_desc vlv_power_wells_main[] = {
201         {
202                 .instances = &I915_PW_INSTANCES(
203                         I915_PW("display", &vlv_pwdoms_display,
204                                 .vlv.idx = PUNIT_PWGT_IDX_DISP2D,
205                                 .id = VLV_DISP_PW_DISP2D),
206                 ),
207                 .ops = &vlv_display_power_well_ops,
208         }, {
209                 .instances = &I915_PW_INSTANCES(
210                         I915_PW("dpio-tx-b-01", &vlv_pwdoms_dpio_tx_bc_lanes,
211                                 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_01),
212                         I915_PW("dpio-tx-b-23", &vlv_pwdoms_dpio_tx_bc_lanes,
213                                 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_23),
214                         I915_PW("dpio-tx-c-01", &vlv_pwdoms_dpio_tx_bc_lanes,
215                                 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_01),
216                         I915_PW("dpio-tx-c-23", &vlv_pwdoms_dpio_tx_bc_lanes,
217                                 .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_23),
218                 ),
219                 .ops = &vlv_dpio_power_well_ops,
220         }, {
221                 .instances = &I915_PW_INSTANCES(
222                         I915_PW("dpio-common", &vlv_pwdoms_dpio_cmn_bc,
223                                 .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
224                                 .id = VLV_DISP_PW_DPIO_CMN_BC),
225                 ),
226                 .ops = &vlv_dpio_cmn_power_well_ops,
227         },
228 };
229
230 static const struct i915_power_well_desc_list vlv_power_wells[] = {
231         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
232         I915_PW_DESCRIPTORS(vlv_power_wells_main),
233 };
234
235 I915_DECL_PW_DOMAINS(chv_pwdoms_display,
236         POWER_DOMAIN_DISPLAY_CORE,
237         POWER_DOMAIN_PIPE_A,
238         POWER_DOMAIN_PIPE_B,
239         POWER_DOMAIN_PIPE_C,
240         POWER_DOMAIN_PIPE_PANEL_FITTER_A,
241         POWER_DOMAIN_PIPE_PANEL_FITTER_B,
242         POWER_DOMAIN_PIPE_PANEL_FITTER_C,
243         POWER_DOMAIN_TRANSCODER_A,
244         POWER_DOMAIN_TRANSCODER_B,
245         POWER_DOMAIN_TRANSCODER_C,
246         POWER_DOMAIN_PORT_DDI_LANES_B,
247         POWER_DOMAIN_PORT_DDI_LANES_C,
248         POWER_DOMAIN_PORT_DDI_LANES_D,
249         POWER_DOMAIN_PORT_DSI,
250         POWER_DOMAIN_VGA,
251         POWER_DOMAIN_AUDIO_MMIO,
252         POWER_DOMAIN_AUDIO_PLAYBACK,
253         POWER_DOMAIN_AUX_IO_B,
254         POWER_DOMAIN_AUX_IO_C,
255         POWER_DOMAIN_AUX_IO_D,
256         POWER_DOMAIN_AUX_B,
257         POWER_DOMAIN_AUX_C,
258         POWER_DOMAIN_AUX_D,
259         POWER_DOMAIN_GMBUS,
260         POWER_DOMAIN_INIT);
261
262 I915_DECL_PW_DOMAINS(chv_pwdoms_dpio_cmn_bc,
263         POWER_DOMAIN_PORT_DDI_LANES_B,
264         POWER_DOMAIN_PORT_DDI_LANES_C,
265         POWER_DOMAIN_AUX_IO_B,
266         POWER_DOMAIN_AUX_IO_C,
267         POWER_DOMAIN_AUX_B,
268         POWER_DOMAIN_AUX_C,
269         POWER_DOMAIN_INIT);
270
271 I915_DECL_PW_DOMAINS(chv_pwdoms_dpio_cmn_d,
272         POWER_DOMAIN_PORT_DDI_LANES_D,
273         POWER_DOMAIN_AUX_IO_D,
274         POWER_DOMAIN_AUX_D,
275         POWER_DOMAIN_INIT);
276
277 static const struct i915_power_well_desc chv_power_wells_main[] = {
278         {
279                 /*
280                  * Pipe A power well is the new disp2d well. Pipe B and C
281                  * power wells don't actually exist. Pipe A power well is
282                  * required for any pipe to work.
283                  */
284                 .instances = &I915_PW_INSTANCES(
285                         I915_PW("display", &chv_pwdoms_display),
286                 ),
287                 .ops = &chv_pipe_power_well_ops,
288         }, {
289                 .instances = &I915_PW_INSTANCES(
290                         I915_PW("dpio-common-bc", &chv_pwdoms_dpio_cmn_bc,
291                                 .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
292                                 .id = VLV_DISP_PW_DPIO_CMN_BC),
293                         I915_PW("dpio-common-d", &chv_pwdoms_dpio_cmn_d,
294                                 .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_D,
295                                 .id = CHV_DISP_PW_DPIO_CMN_D),
296                 ),
297                 .ops = &chv_dpio_cmn_power_well_ops,
298         },
299 };
300
301 static const struct i915_power_well_desc_list chv_power_wells[] = {
302         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
303         I915_PW_DESCRIPTORS(chv_power_wells_main),
304 };
305
306 #define SKL_PW_2_POWER_DOMAINS \
307         POWER_DOMAIN_PIPE_B, \
308         POWER_DOMAIN_PIPE_C, \
309         POWER_DOMAIN_PIPE_PANEL_FITTER_B, \
310         POWER_DOMAIN_PIPE_PANEL_FITTER_C, \
311         POWER_DOMAIN_TRANSCODER_A, \
312         POWER_DOMAIN_TRANSCODER_B, \
313         POWER_DOMAIN_TRANSCODER_C, \
314         POWER_DOMAIN_PORT_DDI_LANES_B, \
315         POWER_DOMAIN_PORT_DDI_LANES_C, \
316         POWER_DOMAIN_PORT_DDI_LANES_D, \
317         POWER_DOMAIN_PORT_DDI_LANES_E, \
318         POWER_DOMAIN_VGA, \
319         POWER_DOMAIN_AUDIO_MMIO, \
320         POWER_DOMAIN_AUDIO_PLAYBACK, \
321         POWER_DOMAIN_AUX_IO_B, \
322         POWER_DOMAIN_AUX_IO_C, \
323         POWER_DOMAIN_AUX_IO_D, \
324         POWER_DOMAIN_AUX_B, \
325         POWER_DOMAIN_AUX_C, \
326         POWER_DOMAIN_AUX_D
327
328 I915_DECL_PW_DOMAINS(skl_pwdoms_pw_2,
329         SKL_PW_2_POWER_DOMAINS,
330         POWER_DOMAIN_INIT);
331
332 I915_DECL_PW_DOMAINS(skl_pwdoms_dc_off,
333         SKL_PW_2_POWER_DOMAINS,
334         POWER_DOMAIN_AUX_A,
335         POWER_DOMAIN_GT_IRQ,
336         POWER_DOMAIN_DC_OFF,
337         POWER_DOMAIN_INIT);
338
339 I915_DECL_PW_DOMAINS(skl_pwdoms_ddi_io_a_e,
340         POWER_DOMAIN_PORT_DDI_IO_A,
341         POWER_DOMAIN_PORT_DDI_IO_E,
342         POWER_DOMAIN_INIT);
343
344 I915_DECL_PW_DOMAINS(skl_pwdoms_ddi_io_b,
345         POWER_DOMAIN_PORT_DDI_IO_B,
346         POWER_DOMAIN_INIT);
347
348 I915_DECL_PW_DOMAINS(skl_pwdoms_ddi_io_c,
349         POWER_DOMAIN_PORT_DDI_IO_C,
350         POWER_DOMAIN_INIT);
351
352 I915_DECL_PW_DOMAINS(skl_pwdoms_ddi_io_d,
353         POWER_DOMAIN_PORT_DDI_IO_D,
354         POWER_DOMAIN_INIT);
355
356 static const struct i915_power_well_desc skl_power_wells_pw_1[] = {
357         {
358                 /* Handled by the DMC firmware */
359                 .instances = &I915_PW_INSTANCES(
360                         I915_PW("PW_1", I915_PW_DOMAINS_NONE,
361                                 .hsw.idx = SKL_PW_CTL_IDX_PW_1,
362                                 .id = SKL_DISP_PW_1),
363                 ),
364                 .ops = &hsw_power_well_ops,
365                 .always_on = true,
366                 .has_fuses = true,
367         },
368 };
369
370 static const struct i915_power_well_desc skl_power_wells_main[] = {
371         {
372                 /* Handled by the DMC firmware */
373                 .instances = &I915_PW_INSTANCES(
374                         I915_PW("MISC_IO", I915_PW_DOMAINS_NONE,
375                                 .hsw.idx = SKL_PW_CTL_IDX_MISC_IO,
376                                 .id = SKL_DISP_PW_MISC_IO),
377                 ),
378                 .ops = &hsw_power_well_ops,
379                 .always_on = true,
380         }, {
381                 .instances = &I915_PW_INSTANCES(
382                         I915_PW("DC_off", &skl_pwdoms_dc_off,
383                                 .id = SKL_DISP_DC_OFF),
384                 ),
385                 .ops = &gen9_dc_off_power_well_ops,
386         }, {
387                 .instances = &I915_PW_INSTANCES(
388                         I915_PW("PW_2", &skl_pwdoms_pw_2,
389                                 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
390                                 .id = SKL_DISP_PW_2),
391                 ),
392                 .ops = &hsw_power_well_ops,
393                 .has_vga = true,
394                 .irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
395                 .has_fuses = true,
396         }, {
397                 .instances = &I915_PW_INSTANCES(
398                         I915_PW("DDI_IO_A_E", &skl_pwdoms_ddi_io_a_e, .hsw.idx = SKL_PW_CTL_IDX_DDI_A_E),
399                         I915_PW("DDI_IO_B", &skl_pwdoms_ddi_io_b, .hsw.idx = SKL_PW_CTL_IDX_DDI_B),
400                         I915_PW("DDI_IO_C", &skl_pwdoms_ddi_io_c, .hsw.idx = SKL_PW_CTL_IDX_DDI_C),
401                         I915_PW("DDI_IO_D", &skl_pwdoms_ddi_io_d, .hsw.idx = SKL_PW_CTL_IDX_DDI_D),
402                 ),
403                 .ops = &hsw_power_well_ops,
404         },
405 };
406
407 static const struct i915_power_well_desc_list skl_power_wells[] = {
408         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
409         I915_PW_DESCRIPTORS(skl_power_wells_pw_1),
410         I915_PW_DESCRIPTORS(skl_power_wells_main),
411 };
412
413 #define BXT_PW_2_POWER_DOMAINS \
414         POWER_DOMAIN_PIPE_B, \
415         POWER_DOMAIN_PIPE_C, \
416         POWER_DOMAIN_PIPE_PANEL_FITTER_B, \
417         POWER_DOMAIN_PIPE_PANEL_FITTER_C, \
418         POWER_DOMAIN_TRANSCODER_A, \
419         POWER_DOMAIN_TRANSCODER_B, \
420         POWER_DOMAIN_TRANSCODER_C, \
421         POWER_DOMAIN_PORT_DDI_LANES_B, \
422         POWER_DOMAIN_PORT_DDI_LANES_C, \
423         POWER_DOMAIN_VGA, \
424         POWER_DOMAIN_AUDIO_MMIO, \
425         POWER_DOMAIN_AUDIO_PLAYBACK, \
426         POWER_DOMAIN_AUX_IO_B, \
427         POWER_DOMAIN_AUX_IO_C, \
428         POWER_DOMAIN_AUX_B, \
429         POWER_DOMAIN_AUX_C
430
431 I915_DECL_PW_DOMAINS(bxt_pwdoms_pw_2,
432         BXT_PW_2_POWER_DOMAINS,
433         POWER_DOMAIN_INIT);
434
435 I915_DECL_PW_DOMAINS(bxt_pwdoms_dc_off,
436         BXT_PW_2_POWER_DOMAINS,
437         POWER_DOMAIN_AUX_A,
438         POWER_DOMAIN_GMBUS,
439         POWER_DOMAIN_GT_IRQ,
440         POWER_DOMAIN_DC_OFF,
441         POWER_DOMAIN_INIT);
442
443 I915_DECL_PW_DOMAINS(bxt_pwdoms_dpio_cmn_a,
444         POWER_DOMAIN_PORT_DDI_LANES_A,
445         POWER_DOMAIN_AUX_IO_A,
446         POWER_DOMAIN_AUX_A,
447         POWER_DOMAIN_INIT);
448
449 I915_DECL_PW_DOMAINS(bxt_pwdoms_dpio_cmn_bc,
450         POWER_DOMAIN_PORT_DDI_LANES_B,
451         POWER_DOMAIN_PORT_DDI_LANES_C,
452         POWER_DOMAIN_AUX_IO_B,
453         POWER_DOMAIN_AUX_IO_C,
454         POWER_DOMAIN_AUX_B,
455         POWER_DOMAIN_AUX_C,
456         POWER_DOMAIN_INIT);
457
458 static const struct i915_power_well_desc bxt_power_wells_main[] = {
459         {
460                 .instances = &I915_PW_INSTANCES(
461                         I915_PW("DC_off", &bxt_pwdoms_dc_off,
462                                 .id = SKL_DISP_DC_OFF),
463                 ),
464                 .ops = &gen9_dc_off_power_well_ops,
465         }, {
466                 .instances = &I915_PW_INSTANCES(
467                         I915_PW("PW_2", &bxt_pwdoms_pw_2,
468                                 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
469                                 .id = SKL_DISP_PW_2),
470                 ),
471                 .ops = &hsw_power_well_ops,
472                 .has_vga = true,
473                 .irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
474                 .has_fuses = true,
475         }, {
476                 .instances = &I915_PW_INSTANCES(
477                         I915_PW("dpio-common-a", &bxt_pwdoms_dpio_cmn_a,
478                                 .bxt.phy = DPIO_PHY1,
479                                 .id = BXT_DISP_PW_DPIO_CMN_A),
480                         I915_PW("dpio-common-bc", &bxt_pwdoms_dpio_cmn_bc,
481                                 .bxt.phy = DPIO_PHY0,
482                                 .id = VLV_DISP_PW_DPIO_CMN_BC),
483                 ),
484                 .ops = &bxt_dpio_cmn_power_well_ops,
485         },
486 };
487
488 static const struct i915_power_well_desc_list bxt_power_wells[] = {
489         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
490         I915_PW_DESCRIPTORS(skl_power_wells_pw_1),
491         I915_PW_DESCRIPTORS(bxt_power_wells_main),
492 };
493
494 #define GLK_PW_2_POWER_DOMAINS \
495         POWER_DOMAIN_PIPE_B, \
496         POWER_DOMAIN_PIPE_C, \
497         POWER_DOMAIN_PIPE_PANEL_FITTER_B, \
498         POWER_DOMAIN_PIPE_PANEL_FITTER_C, \
499         POWER_DOMAIN_TRANSCODER_A, \
500         POWER_DOMAIN_TRANSCODER_B, \
501         POWER_DOMAIN_TRANSCODER_C, \
502         POWER_DOMAIN_PORT_DDI_LANES_B, \
503         POWER_DOMAIN_PORT_DDI_LANES_C, \
504         POWER_DOMAIN_VGA, \
505         POWER_DOMAIN_AUDIO_MMIO, \
506         POWER_DOMAIN_AUDIO_PLAYBACK, \
507         POWER_DOMAIN_AUX_IO_B, \
508         POWER_DOMAIN_AUX_IO_C, \
509         POWER_DOMAIN_AUX_B, \
510         POWER_DOMAIN_AUX_C
511
512 I915_DECL_PW_DOMAINS(glk_pwdoms_pw_2,
513         GLK_PW_2_POWER_DOMAINS,
514         POWER_DOMAIN_INIT);
515
516 I915_DECL_PW_DOMAINS(glk_pwdoms_dc_off,
517         GLK_PW_2_POWER_DOMAINS,
518         POWER_DOMAIN_AUX_A,
519         POWER_DOMAIN_GMBUS,
520         POWER_DOMAIN_GT_IRQ,
521         POWER_DOMAIN_DC_OFF,
522         POWER_DOMAIN_INIT);
523
524 I915_DECL_PW_DOMAINS(glk_pwdoms_ddi_io_a,       POWER_DOMAIN_PORT_DDI_IO_A);
525 I915_DECL_PW_DOMAINS(glk_pwdoms_ddi_io_b,       POWER_DOMAIN_PORT_DDI_IO_B);
526 I915_DECL_PW_DOMAINS(glk_pwdoms_ddi_io_c,       POWER_DOMAIN_PORT_DDI_IO_C);
527
528 I915_DECL_PW_DOMAINS(glk_pwdoms_dpio_cmn_a,
529         POWER_DOMAIN_PORT_DDI_LANES_A,
530         POWER_DOMAIN_AUX_IO_A,
531         POWER_DOMAIN_AUX_A,
532         POWER_DOMAIN_INIT);
533
534 I915_DECL_PW_DOMAINS(glk_pwdoms_dpio_cmn_b,
535         POWER_DOMAIN_PORT_DDI_LANES_B,
536         POWER_DOMAIN_AUX_IO_B,
537         POWER_DOMAIN_AUX_B,
538         POWER_DOMAIN_INIT);
539
540 I915_DECL_PW_DOMAINS(glk_pwdoms_dpio_cmn_c,
541         POWER_DOMAIN_PORT_DDI_LANES_C,
542         POWER_DOMAIN_AUX_IO_C,
543         POWER_DOMAIN_AUX_C,
544         POWER_DOMAIN_INIT);
545
546 I915_DECL_PW_DOMAINS(glk_pwdoms_aux_a,
547         POWER_DOMAIN_AUX_IO_A,
548         POWER_DOMAIN_AUX_A,
549         POWER_DOMAIN_INIT);
550
551 I915_DECL_PW_DOMAINS(glk_pwdoms_aux_b,
552         POWER_DOMAIN_AUX_IO_B,
553         POWER_DOMAIN_AUX_B,
554         POWER_DOMAIN_INIT);
555
556 I915_DECL_PW_DOMAINS(glk_pwdoms_aux_c,
557         POWER_DOMAIN_AUX_IO_C,
558         POWER_DOMAIN_AUX_C,
559         POWER_DOMAIN_INIT);
560
561 static const struct i915_power_well_desc glk_power_wells_main[] = {
562         {
563                 .instances = &I915_PW_INSTANCES(
564                         I915_PW("DC_off", &glk_pwdoms_dc_off,
565                                 .id = SKL_DISP_DC_OFF),
566                 ),
567                 .ops = &gen9_dc_off_power_well_ops,
568         }, {
569                 .instances = &I915_PW_INSTANCES(
570                         I915_PW("PW_2", &glk_pwdoms_pw_2,
571                                 .hsw.idx = SKL_PW_CTL_IDX_PW_2,
572                                 .id = SKL_DISP_PW_2),
573                 ),
574                 .ops = &hsw_power_well_ops,
575                 .has_vga = true,
576                 .irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
577                 .has_fuses = true,
578         }, {
579                 .instances = &I915_PW_INSTANCES(
580                         I915_PW("dpio-common-a", &glk_pwdoms_dpio_cmn_a,
581                                 .bxt.phy = DPIO_PHY1,
582                                 .id = BXT_DISP_PW_DPIO_CMN_A),
583                         I915_PW("dpio-common-b", &glk_pwdoms_dpio_cmn_b,
584                                 .bxt.phy = DPIO_PHY0,
585                                 .id = VLV_DISP_PW_DPIO_CMN_BC),
586                         I915_PW("dpio-common-c", &glk_pwdoms_dpio_cmn_c,
587                                 .bxt.phy = DPIO_PHY2,
588                                 .id = GLK_DISP_PW_DPIO_CMN_C),
589                 ),
590                 .ops = &bxt_dpio_cmn_power_well_ops,
591         }, {
592                 .instances = &I915_PW_INSTANCES(
593                         I915_PW("AUX_A", &glk_pwdoms_aux_a, .hsw.idx = GLK_PW_CTL_IDX_AUX_A),
594                         I915_PW("AUX_B", &glk_pwdoms_aux_b, .hsw.idx = GLK_PW_CTL_IDX_AUX_B),
595                         I915_PW("AUX_C", &glk_pwdoms_aux_c, .hsw.idx = GLK_PW_CTL_IDX_AUX_C),
596                         I915_PW("DDI_IO_A", &glk_pwdoms_ddi_io_a, .hsw.idx = GLK_PW_CTL_IDX_DDI_A),
597                         I915_PW("DDI_IO_B", &glk_pwdoms_ddi_io_b, .hsw.idx = SKL_PW_CTL_IDX_DDI_B),
598                         I915_PW("DDI_IO_C", &glk_pwdoms_ddi_io_c, .hsw.idx = SKL_PW_CTL_IDX_DDI_C),
599                 ),
600                 .ops = &hsw_power_well_ops,
601         },
602 };
603
604 static const struct i915_power_well_desc_list glk_power_wells[] = {
605         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
606         I915_PW_DESCRIPTORS(skl_power_wells_pw_1),
607         I915_PW_DESCRIPTORS(glk_power_wells_main),
608 };
609
610 /*
611  * ICL PW_0/PG_0 domains (HW/DMC control):
612  * - PCI
613  * - clocks except port PLL
614  * - central power except FBC
615  * - shared functions except pipe interrupts, pipe MBUS, DBUF registers
616  * ICL PW_1/PG_1 domains (HW/DMC control):
617  * - DBUF function
618  * - PIPE_A and its planes, except VGA
619  * - transcoder EDP + PSR
620  * - transcoder DSI
621  * - DDI_A
622  * - FBC
623  */
624 #define ICL_PW_4_POWER_DOMAINS \
625         POWER_DOMAIN_PIPE_C, \
626         POWER_DOMAIN_PIPE_PANEL_FITTER_C
627
628 I915_DECL_PW_DOMAINS(icl_pwdoms_pw_4,
629         ICL_PW_4_POWER_DOMAINS,
630         POWER_DOMAIN_INIT);
631         /* VDSC/joining */
632
633 #define ICL_PW_3_POWER_DOMAINS \
634         ICL_PW_4_POWER_DOMAINS, \
635         POWER_DOMAIN_PIPE_B, \
636         POWER_DOMAIN_PIPE_PANEL_FITTER_B, \
637         POWER_DOMAIN_TRANSCODER_A, \
638         POWER_DOMAIN_TRANSCODER_B, \
639         POWER_DOMAIN_TRANSCODER_C, \
640         POWER_DOMAIN_PORT_DDI_LANES_B, \
641         POWER_DOMAIN_PORT_DDI_LANES_C, \
642         POWER_DOMAIN_PORT_DDI_LANES_D, \
643         POWER_DOMAIN_PORT_DDI_LANES_E, \
644         POWER_DOMAIN_PORT_DDI_LANES_F, \
645         POWER_DOMAIN_VGA, \
646         POWER_DOMAIN_AUDIO_MMIO, \
647         POWER_DOMAIN_AUDIO_PLAYBACK, \
648         POWER_DOMAIN_AUX_IO_B, \
649         POWER_DOMAIN_AUX_IO_C, \
650         POWER_DOMAIN_AUX_IO_D, \
651         POWER_DOMAIN_AUX_IO_E, \
652         POWER_DOMAIN_AUX_IO_F, \
653         POWER_DOMAIN_AUX_B, \
654         POWER_DOMAIN_AUX_C, \
655         POWER_DOMAIN_AUX_D, \
656         POWER_DOMAIN_AUX_E, \
657         POWER_DOMAIN_AUX_F, \
658         POWER_DOMAIN_AUX_TBT1, \
659         POWER_DOMAIN_AUX_TBT2, \
660         POWER_DOMAIN_AUX_TBT3, \
661         POWER_DOMAIN_AUX_TBT4
662
663 I915_DECL_PW_DOMAINS(icl_pwdoms_pw_3,
664         ICL_PW_3_POWER_DOMAINS,
665         POWER_DOMAIN_INIT);
666         /*
667          * - transcoder WD
668          * - KVMR (HW control)
669          */
670
671 #define ICL_PW_2_POWER_DOMAINS \
672         ICL_PW_3_POWER_DOMAINS, \
673         POWER_DOMAIN_TRANSCODER_VDSC_PW2
674
675 I915_DECL_PW_DOMAINS(icl_pwdoms_pw_2,
676         ICL_PW_2_POWER_DOMAINS,
677         POWER_DOMAIN_INIT);
678         /*
679          * - KVMR (HW control)
680          */
681
682 I915_DECL_PW_DOMAINS(icl_pwdoms_dc_off,
683         ICL_PW_2_POWER_DOMAINS,
684         POWER_DOMAIN_AUX_A,
685         POWER_DOMAIN_DC_OFF,
686         POWER_DOMAIN_INIT);
687
688 I915_DECL_PW_DOMAINS(icl_pwdoms_ddi_io_d,       POWER_DOMAIN_PORT_DDI_IO_D);
689 I915_DECL_PW_DOMAINS(icl_pwdoms_ddi_io_e,       POWER_DOMAIN_PORT_DDI_IO_E);
690 I915_DECL_PW_DOMAINS(icl_pwdoms_ddi_io_f,       POWER_DOMAIN_PORT_DDI_IO_F);
691
692 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_a,
693         POWER_DOMAIN_AUX_IO_A,
694         POWER_DOMAIN_AUX_A);
695 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_b,
696         POWER_DOMAIN_AUX_IO_B,
697         POWER_DOMAIN_AUX_B);
698 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_c,
699         POWER_DOMAIN_AUX_IO_C,
700         POWER_DOMAIN_AUX_C);
701 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_d,
702         POWER_DOMAIN_AUX_IO_D,
703         POWER_DOMAIN_AUX_D);
704 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_e,
705         POWER_DOMAIN_AUX_IO_E,
706         POWER_DOMAIN_AUX_E);
707 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_f,
708         POWER_DOMAIN_AUX_IO_F,
709         POWER_DOMAIN_AUX_F);
710 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_tbt1,       POWER_DOMAIN_AUX_TBT1);
711 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_tbt2,       POWER_DOMAIN_AUX_TBT2);
712 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_tbt3,       POWER_DOMAIN_AUX_TBT3);
713 I915_DECL_PW_DOMAINS(icl_pwdoms_aux_tbt4,       POWER_DOMAIN_AUX_TBT4);
714
715 static const struct i915_power_well_desc icl_power_wells_pw_1[] = {
716         {
717                 /* Handled by the DMC firmware */
718                 .instances = &I915_PW_INSTANCES(
719                         I915_PW("PW_1", I915_PW_DOMAINS_NONE,
720                                 .hsw.idx = ICL_PW_CTL_IDX_PW_1,
721                                 .id = SKL_DISP_PW_1),
722                 ),
723                 .ops = &hsw_power_well_ops,
724                 .always_on = true,
725                 .has_fuses = true,
726         },
727 };
728
729 static const struct i915_power_well_desc icl_power_wells_main[] = {
730         {
731                 .instances = &I915_PW_INSTANCES(
732                         I915_PW("DC_off", &icl_pwdoms_dc_off,
733                                 .id = SKL_DISP_DC_OFF),
734                 ),
735                 .ops = &gen9_dc_off_power_well_ops,
736         }, {
737                 .instances = &I915_PW_INSTANCES(
738                         I915_PW("PW_2", &icl_pwdoms_pw_2,
739                                 .hsw.idx = ICL_PW_CTL_IDX_PW_2,
740                                 .id = SKL_DISP_PW_2),
741                 ),
742                 .ops = &hsw_power_well_ops,
743                 .has_fuses = true,
744         }, {
745                 .instances = &I915_PW_INSTANCES(
746                         I915_PW("PW_3", &icl_pwdoms_pw_3,
747                                 .hsw.idx = ICL_PW_CTL_IDX_PW_3,
748                                 .id = ICL_DISP_PW_3),
749                 ),
750                 .ops = &hsw_power_well_ops,
751                 .has_vga = true,
752                 .irq_pipe_mask = BIT(PIPE_B),
753                 .has_fuses = true,
754         }, {
755                 .instances = &I915_PW_INSTANCES(
756                         I915_PW("DDI_IO_A", &glk_pwdoms_ddi_io_a, .hsw.idx = ICL_PW_CTL_IDX_DDI_A),
757                         I915_PW("DDI_IO_B", &glk_pwdoms_ddi_io_b, .hsw.idx = ICL_PW_CTL_IDX_DDI_B),
758                         I915_PW("DDI_IO_C", &glk_pwdoms_ddi_io_c, .hsw.idx = ICL_PW_CTL_IDX_DDI_C),
759                         I915_PW("DDI_IO_D", &icl_pwdoms_ddi_io_d, .hsw.idx = ICL_PW_CTL_IDX_DDI_D),
760                         I915_PW("DDI_IO_E", &icl_pwdoms_ddi_io_e, .hsw.idx = ICL_PW_CTL_IDX_DDI_E),
761                         I915_PW("DDI_IO_F", &icl_pwdoms_ddi_io_f, .hsw.idx = ICL_PW_CTL_IDX_DDI_F),
762                 ),
763                 .ops = &icl_ddi_power_well_ops,
764         }, {
765                 .instances = &I915_PW_INSTANCES(
766                         I915_PW("AUX_A", &icl_pwdoms_aux_a, .hsw.idx = ICL_PW_CTL_IDX_AUX_A),
767                         I915_PW("AUX_B", &icl_pwdoms_aux_b, .hsw.idx = ICL_PW_CTL_IDX_AUX_B),
768                         I915_PW("AUX_C", &icl_pwdoms_aux_c, .hsw.idx = ICL_PW_CTL_IDX_AUX_C),
769                         I915_PW("AUX_D", &icl_pwdoms_aux_d, .hsw.idx = ICL_PW_CTL_IDX_AUX_D),
770                         I915_PW("AUX_E", &icl_pwdoms_aux_e, .hsw.idx = ICL_PW_CTL_IDX_AUX_E),
771                         I915_PW("AUX_F", &icl_pwdoms_aux_f, .hsw.idx = ICL_PW_CTL_IDX_AUX_F),
772                 ),
773                 .ops = &icl_aux_power_well_ops,
774         }, {
775                 .instances = &I915_PW_INSTANCES(
776                         I915_PW("AUX_TBT1", &icl_pwdoms_aux_tbt1, .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1),
777                         I915_PW("AUX_TBT2", &icl_pwdoms_aux_tbt2, .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2),
778                         I915_PW("AUX_TBT3", &icl_pwdoms_aux_tbt3, .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3),
779                         I915_PW("AUX_TBT4", &icl_pwdoms_aux_tbt4, .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4),
780                 ),
781                 .ops = &icl_aux_power_well_ops,
782                 .is_tc_tbt = true,
783         }, {
784                 .instances = &I915_PW_INSTANCES(
785                         I915_PW("PW_4", &icl_pwdoms_pw_4,
786                                 .hsw.idx = ICL_PW_CTL_IDX_PW_4),
787                 ),
788                 .ops = &hsw_power_well_ops,
789                 .irq_pipe_mask = BIT(PIPE_C),
790                 .has_fuses = true,
791         },
792 };
793
794 static const struct i915_power_well_desc_list icl_power_wells[] = {
795         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
796         I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
797         I915_PW_DESCRIPTORS(icl_power_wells_main),
798 };
799
800 #define TGL_PW_5_POWER_DOMAINS \
801         POWER_DOMAIN_PIPE_D, \
802         POWER_DOMAIN_PIPE_PANEL_FITTER_D, \
803         POWER_DOMAIN_TRANSCODER_D
804
805 I915_DECL_PW_DOMAINS(tgl_pwdoms_pw_5,
806         TGL_PW_5_POWER_DOMAINS,
807         POWER_DOMAIN_INIT);
808
809 #define TGL_PW_4_POWER_DOMAINS \
810         TGL_PW_5_POWER_DOMAINS, \
811         POWER_DOMAIN_PIPE_C, \
812         POWER_DOMAIN_PIPE_PANEL_FITTER_C, \
813         POWER_DOMAIN_TRANSCODER_C
814
815 I915_DECL_PW_DOMAINS(tgl_pwdoms_pw_4,
816         TGL_PW_4_POWER_DOMAINS,
817         POWER_DOMAIN_INIT);
818
819 #define TGL_PW_3_POWER_DOMAINS \
820         TGL_PW_4_POWER_DOMAINS, \
821         POWER_DOMAIN_PIPE_B, \
822         POWER_DOMAIN_PIPE_PANEL_FITTER_B, \
823         POWER_DOMAIN_TRANSCODER_B, \
824         POWER_DOMAIN_PORT_DDI_LANES_TC1, \
825         POWER_DOMAIN_PORT_DDI_LANES_TC2, \
826         POWER_DOMAIN_PORT_DDI_LANES_TC3, \
827         POWER_DOMAIN_PORT_DDI_LANES_TC4, \
828         POWER_DOMAIN_PORT_DDI_LANES_TC5, \
829         POWER_DOMAIN_PORT_DDI_LANES_TC6, \
830         POWER_DOMAIN_VGA, \
831         POWER_DOMAIN_AUDIO_MMIO, \
832         POWER_DOMAIN_AUDIO_PLAYBACK, \
833         POWER_DOMAIN_AUX_USBC1, \
834         POWER_DOMAIN_AUX_USBC2, \
835         POWER_DOMAIN_AUX_USBC3, \
836         POWER_DOMAIN_AUX_USBC4, \
837         POWER_DOMAIN_AUX_USBC5, \
838         POWER_DOMAIN_AUX_USBC6, \
839         POWER_DOMAIN_AUX_TBT1, \
840         POWER_DOMAIN_AUX_TBT2, \
841         POWER_DOMAIN_AUX_TBT3, \
842         POWER_DOMAIN_AUX_TBT4, \
843         POWER_DOMAIN_AUX_TBT5, \
844         POWER_DOMAIN_AUX_TBT6
845
846 I915_DECL_PW_DOMAINS(tgl_pwdoms_pw_3,
847         TGL_PW_3_POWER_DOMAINS,
848         POWER_DOMAIN_INIT);
849
850 I915_DECL_PW_DOMAINS(tgl_pwdoms_pw_2,
851         TGL_PW_3_POWER_DOMAINS,
852         POWER_DOMAIN_TRANSCODER_VDSC_PW2,
853         POWER_DOMAIN_INIT);
854
855 I915_DECL_PW_DOMAINS(tgl_pwdoms_dc_off,
856         TGL_PW_3_POWER_DOMAINS,
857         POWER_DOMAIN_AUX_A,
858         POWER_DOMAIN_AUX_B,
859         POWER_DOMAIN_AUX_C,
860         POWER_DOMAIN_DC_OFF,
861         POWER_DOMAIN_INIT);
862
863 I915_DECL_PW_DOMAINS(tgl_pwdoms_ddi_io_tc1,     POWER_DOMAIN_PORT_DDI_IO_TC1);
864 I915_DECL_PW_DOMAINS(tgl_pwdoms_ddi_io_tc2,     POWER_DOMAIN_PORT_DDI_IO_TC2);
865 I915_DECL_PW_DOMAINS(tgl_pwdoms_ddi_io_tc3,     POWER_DOMAIN_PORT_DDI_IO_TC3);
866 I915_DECL_PW_DOMAINS(tgl_pwdoms_ddi_io_tc4,     POWER_DOMAIN_PORT_DDI_IO_TC4);
867 I915_DECL_PW_DOMAINS(tgl_pwdoms_ddi_io_tc5,     POWER_DOMAIN_PORT_DDI_IO_TC5);
868 I915_DECL_PW_DOMAINS(tgl_pwdoms_ddi_io_tc6,     POWER_DOMAIN_PORT_DDI_IO_TC6);
869
870 I915_DECL_PW_DOMAINS(tgl_pwdoms_aux_usbc1,      POWER_DOMAIN_AUX_USBC1);
871 I915_DECL_PW_DOMAINS(tgl_pwdoms_aux_usbc2,      POWER_DOMAIN_AUX_USBC2);
872 I915_DECL_PW_DOMAINS(tgl_pwdoms_aux_usbc3,      POWER_DOMAIN_AUX_USBC3);
873 I915_DECL_PW_DOMAINS(tgl_pwdoms_aux_usbc4,      POWER_DOMAIN_AUX_USBC4);
874 I915_DECL_PW_DOMAINS(tgl_pwdoms_aux_usbc5,      POWER_DOMAIN_AUX_USBC5);
875 I915_DECL_PW_DOMAINS(tgl_pwdoms_aux_usbc6,      POWER_DOMAIN_AUX_USBC6);
876
877 I915_DECL_PW_DOMAINS(tgl_pwdoms_aux_tbt5,       POWER_DOMAIN_AUX_TBT5);
878 I915_DECL_PW_DOMAINS(tgl_pwdoms_aux_tbt6,       POWER_DOMAIN_AUX_TBT6);
879
880 I915_DECL_PW_DOMAINS(tgl_pwdoms_tc_cold_off,
881         POWER_DOMAIN_AUX_USBC1,
882         POWER_DOMAIN_AUX_USBC2,
883         POWER_DOMAIN_AUX_USBC3,
884         POWER_DOMAIN_AUX_USBC4,
885         POWER_DOMAIN_AUX_USBC5,
886         POWER_DOMAIN_AUX_USBC6,
887         POWER_DOMAIN_AUX_TBT1,
888         POWER_DOMAIN_AUX_TBT2,
889         POWER_DOMAIN_AUX_TBT3,
890         POWER_DOMAIN_AUX_TBT4,
891         POWER_DOMAIN_AUX_TBT5,
892         POWER_DOMAIN_AUX_TBT6,
893         POWER_DOMAIN_TC_COLD_OFF);
894
895 static const struct i915_power_well_desc tgl_power_wells_main[] = {
896         {
897                 .instances = &I915_PW_INSTANCES(
898                         I915_PW("DC_off", &tgl_pwdoms_dc_off,
899                                 .id = SKL_DISP_DC_OFF),
900                 ),
901                 .ops = &gen9_dc_off_power_well_ops,
902         }, {
903                 .instances = &I915_PW_INSTANCES(
904                         I915_PW("PW_2", &tgl_pwdoms_pw_2,
905                                 .hsw.idx = ICL_PW_CTL_IDX_PW_2,
906                                 .id = SKL_DISP_PW_2),
907                 ),
908                 .ops = &hsw_power_well_ops,
909                 .has_fuses = true,
910         }, {
911                 .instances = &I915_PW_INSTANCES(
912                         I915_PW("PW_3", &tgl_pwdoms_pw_3,
913                                 .hsw.idx = ICL_PW_CTL_IDX_PW_3,
914                                 .id = ICL_DISP_PW_3),
915                 ),
916                 .ops = &hsw_power_well_ops,
917                 .has_vga = true,
918                 .irq_pipe_mask = BIT(PIPE_B),
919                 .has_fuses = true,
920         }, {
921                 .instances = &I915_PW_INSTANCES(
922                         I915_PW("DDI_IO_A", &glk_pwdoms_ddi_io_a, .hsw.idx = ICL_PW_CTL_IDX_DDI_A),
923                         I915_PW("DDI_IO_B", &glk_pwdoms_ddi_io_b, .hsw.idx = ICL_PW_CTL_IDX_DDI_B),
924                         I915_PW("DDI_IO_C", &glk_pwdoms_ddi_io_c, .hsw.idx = ICL_PW_CTL_IDX_DDI_C),
925                         I915_PW("DDI_IO_TC1", &tgl_pwdoms_ddi_io_tc1, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1),
926                         I915_PW("DDI_IO_TC2", &tgl_pwdoms_ddi_io_tc2, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2),
927                         I915_PW("DDI_IO_TC3", &tgl_pwdoms_ddi_io_tc3, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3),
928                         I915_PW("DDI_IO_TC4", &tgl_pwdoms_ddi_io_tc4, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4),
929                         I915_PW("DDI_IO_TC5", &tgl_pwdoms_ddi_io_tc5, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC5),
930                         I915_PW("DDI_IO_TC6", &tgl_pwdoms_ddi_io_tc6, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC6),
931                 ),
932                 .ops = &icl_ddi_power_well_ops,
933         }, {
934                 .instances = &I915_PW_INSTANCES(
935                         I915_PW("PW_4", &tgl_pwdoms_pw_4,
936                                 .hsw.idx = ICL_PW_CTL_IDX_PW_4),
937                 ),
938                 .ops = &hsw_power_well_ops,
939                 .has_fuses = true,
940                 .irq_pipe_mask = BIT(PIPE_C),
941         }, {
942                 .instances = &I915_PW_INSTANCES(
943                         I915_PW("PW_5", &tgl_pwdoms_pw_5,
944                                 .hsw.idx = TGL_PW_CTL_IDX_PW_5),
945                 ),
946                 .ops = &hsw_power_well_ops,
947                 .has_fuses = true,
948                 .irq_pipe_mask = BIT(PIPE_D),
949         },
950 };
951
952 static const struct i915_power_well_desc tgl_power_wells_tc_cold_off[] = {
953         {
954                 .instances = &I915_PW_INSTANCES(
955                         I915_PW("TC_cold_off", &tgl_pwdoms_tc_cold_off,
956                                 .id = TGL_DISP_PW_TC_COLD_OFF),
957                 ),
958                 .ops = &tgl_tc_cold_off_ops,
959         },
960 };
961
962 static const struct i915_power_well_desc tgl_power_wells_aux[] = {
963         {
964                 .instances = &I915_PW_INSTANCES(
965                         I915_PW("AUX_A", &icl_pwdoms_aux_a, .hsw.idx = ICL_PW_CTL_IDX_AUX_A),
966                         I915_PW("AUX_B", &icl_pwdoms_aux_b, .hsw.idx = ICL_PW_CTL_IDX_AUX_B),
967                         I915_PW("AUX_C", &icl_pwdoms_aux_c, .hsw.idx = ICL_PW_CTL_IDX_AUX_C),
968                         I915_PW("AUX_USBC1", &tgl_pwdoms_aux_usbc1, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1),
969                         I915_PW("AUX_USBC2", &tgl_pwdoms_aux_usbc2, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2),
970                         I915_PW("AUX_USBC3", &tgl_pwdoms_aux_usbc3, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3),
971                         I915_PW("AUX_USBC4", &tgl_pwdoms_aux_usbc4, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4),
972                         I915_PW("AUX_USBC5", &tgl_pwdoms_aux_usbc5, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC5),
973                         I915_PW("AUX_USBC6", &tgl_pwdoms_aux_usbc6, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC6),
974                 ),
975                 .ops = &icl_aux_power_well_ops,
976         }, {
977                 .instances = &I915_PW_INSTANCES(
978                         I915_PW("AUX_TBT1", &icl_pwdoms_aux_tbt1, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1),
979                         I915_PW("AUX_TBT2", &icl_pwdoms_aux_tbt2, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2),
980                         I915_PW("AUX_TBT3", &icl_pwdoms_aux_tbt3, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3),
981                         I915_PW("AUX_TBT4", &icl_pwdoms_aux_tbt4, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4),
982                         I915_PW("AUX_TBT5", &tgl_pwdoms_aux_tbt5, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT5),
983                         I915_PW("AUX_TBT6", &tgl_pwdoms_aux_tbt6, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT6),
984                 ),
985                 .ops = &icl_aux_power_well_ops,
986                 .is_tc_tbt = true,
987         },
988 };
989
990 static const struct i915_power_well_desc_list tgl_power_wells[] = {
991         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
992         I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
993         I915_PW_DESCRIPTORS(tgl_power_wells_main),
994         I915_PW_DESCRIPTORS(tgl_power_wells_tc_cold_off),
995         I915_PW_DESCRIPTORS(tgl_power_wells_aux),
996 };
997
998 static const struct i915_power_well_desc_list adls_power_wells[] = {
999         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
1000         I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
1001         I915_PW_DESCRIPTORS(tgl_power_wells_main),
1002         I915_PW_DESCRIPTORS(tgl_power_wells_aux),
1003 };
1004
1005 #define RKL_PW_4_POWER_DOMAINS \
1006         POWER_DOMAIN_PIPE_C, \
1007         POWER_DOMAIN_PIPE_PANEL_FITTER_C, \
1008         POWER_DOMAIN_TRANSCODER_C
1009
1010 I915_DECL_PW_DOMAINS(rkl_pwdoms_pw_4,
1011         RKL_PW_4_POWER_DOMAINS,
1012         POWER_DOMAIN_INIT);
1013
1014 #define RKL_PW_3_POWER_DOMAINS \
1015         RKL_PW_4_POWER_DOMAINS, \
1016         POWER_DOMAIN_PIPE_B, \
1017         POWER_DOMAIN_PIPE_PANEL_FITTER_B, \
1018         POWER_DOMAIN_TRANSCODER_B, \
1019         POWER_DOMAIN_PORT_DDI_LANES_TC1, \
1020         POWER_DOMAIN_PORT_DDI_LANES_TC2, \
1021         POWER_DOMAIN_VGA, \
1022         POWER_DOMAIN_AUDIO_MMIO, \
1023         POWER_DOMAIN_AUDIO_PLAYBACK, \
1024         POWER_DOMAIN_AUX_USBC1, \
1025         POWER_DOMAIN_AUX_USBC2
1026
1027 I915_DECL_PW_DOMAINS(rkl_pwdoms_pw_3,
1028         RKL_PW_3_POWER_DOMAINS,
1029         POWER_DOMAIN_INIT);
1030
1031 /*
1032  * There is no PW_2/PG_2 on RKL.
1033  *
1034  * RKL PW_1/PG_1 domains (under HW/DMC control):
1035  * - DBUF function (note: registers are in PW0)
1036  * - PIPE_A and its planes and VDSC/joining, except VGA
1037  * - transcoder A
1038  * - DDI_A and DDI_B
1039  * - FBC
1040  *
1041  * RKL PW_0/PG_0 domains (under HW/DMC control):
1042  * - PCI
1043  * - clocks except port PLL
1044  * - shared functions:
1045  *     * interrupts except pipe interrupts
1046  *     * MBus except PIPE_MBUS_DBOX_CTL
1047  *     * DBUF registers
1048  * - central power except FBC
1049  * - top-level GTC (DDI-level GTC is in the well associated with the DDI)
1050  */
1051
1052 I915_DECL_PW_DOMAINS(rkl_pwdoms_dc_off,
1053         RKL_PW_3_POWER_DOMAINS,
1054         POWER_DOMAIN_AUX_A,
1055         POWER_DOMAIN_AUX_B,
1056         POWER_DOMAIN_DC_OFF,
1057         POWER_DOMAIN_INIT);
1058
1059 static const struct i915_power_well_desc rkl_power_wells_main[] = {
1060         {
1061                 .instances = &I915_PW_INSTANCES(
1062                         I915_PW("DC_off", &rkl_pwdoms_dc_off,
1063                                 .id = SKL_DISP_DC_OFF),
1064                 ),
1065                 .ops = &gen9_dc_off_power_well_ops,
1066         }, {
1067                 .instances = &I915_PW_INSTANCES(
1068                         I915_PW("PW_3", &rkl_pwdoms_pw_3,
1069                                 .hsw.idx = ICL_PW_CTL_IDX_PW_3,
1070                                 .id = ICL_DISP_PW_3),
1071                 ),
1072                 .ops = &hsw_power_well_ops,
1073                 .irq_pipe_mask = BIT(PIPE_B),
1074                 .has_vga = true,
1075                 .has_fuses = true,
1076         }, {
1077                 .instances = &I915_PW_INSTANCES(
1078                         I915_PW("PW_4", &rkl_pwdoms_pw_4,
1079                                 .hsw.idx = ICL_PW_CTL_IDX_PW_4),
1080                 ),
1081                 .ops = &hsw_power_well_ops,
1082                 .has_fuses = true,
1083                 .irq_pipe_mask = BIT(PIPE_C),
1084         },
1085 };
1086
1087 static const struct i915_power_well_desc rkl_power_wells_ddi_aux[] = {
1088         {
1089                 .instances = &I915_PW_INSTANCES(
1090                         I915_PW("DDI_IO_A", &glk_pwdoms_ddi_io_a, .hsw.idx = ICL_PW_CTL_IDX_DDI_A),
1091                         I915_PW("DDI_IO_B", &glk_pwdoms_ddi_io_b, .hsw.idx = ICL_PW_CTL_IDX_DDI_B),
1092                         I915_PW("DDI_IO_TC1", &tgl_pwdoms_ddi_io_tc1, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1),
1093                         I915_PW("DDI_IO_TC2", &tgl_pwdoms_ddi_io_tc2, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2),
1094                 ),
1095                 .ops = &icl_ddi_power_well_ops,
1096         }, {
1097                 .instances = &I915_PW_INSTANCES(
1098                         I915_PW("AUX_A", &icl_pwdoms_aux_a, .hsw.idx = ICL_PW_CTL_IDX_AUX_A),
1099                         I915_PW("AUX_B", &icl_pwdoms_aux_b, .hsw.idx = ICL_PW_CTL_IDX_AUX_B),
1100                         I915_PW("AUX_USBC1", &tgl_pwdoms_aux_usbc1, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1),
1101                         I915_PW("AUX_USBC2", &tgl_pwdoms_aux_usbc2, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2),
1102                 ),
1103                 .ops = &icl_aux_power_well_ops,
1104         },
1105 };
1106
1107 static const struct i915_power_well_desc_list rkl_power_wells[] = {
1108         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
1109         I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
1110         I915_PW_DESCRIPTORS(rkl_power_wells_main),
1111         I915_PW_DESCRIPTORS(rkl_power_wells_ddi_aux),
1112 };
1113
1114 /*
1115  * DG1 onwards Audio MMIO/VERBS lies in PG0 power well.
1116  */
1117 #define DG1_PW_3_POWER_DOMAINS \
1118         TGL_PW_4_POWER_DOMAINS, \
1119         POWER_DOMAIN_PIPE_B, \
1120         POWER_DOMAIN_PIPE_PANEL_FITTER_B, \
1121         POWER_DOMAIN_TRANSCODER_B, \
1122         POWER_DOMAIN_PORT_DDI_LANES_TC1, \
1123         POWER_DOMAIN_PORT_DDI_LANES_TC2, \
1124         POWER_DOMAIN_VGA, \
1125         POWER_DOMAIN_AUDIO_PLAYBACK, \
1126         POWER_DOMAIN_AUX_USBC1, \
1127         POWER_DOMAIN_AUX_USBC2
1128
1129 I915_DECL_PW_DOMAINS(dg1_pwdoms_pw_3,
1130         DG1_PW_3_POWER_DOMAINS,
1131         POWER_DOMAIN_INIT);
1132
1133 I915_DECL_PW_DOMAINS(dg1_pwdoms_dc_off,
1134         DG1_PW_3_POWER_DOMAINS,
1135         POWER_DOMAIN_AUDIO_MMIO,
1136         POWER_DOMAIN_AUX_A,
1137         POWER_DOMAIN_AUX_B,
1138         POWER_DOMAIN_DC_OFF,
1139         POWER_DOMAIN_INIT);
1140
1141 I915_DECL_PW_DOMAINS(dg1_pwdoms_pw_2,
1142         DG1_PW_3_POWER_DOMAINS,
1143         POWER_DOMAIN_TRANSCODER_VDSC_PW2,
1144         POWER_DOMAIN_INIT);
1145
1146 static const struct i915_power_well_desc dg1_power_wells_main[] = {
1147         {
1148                 .instances = &I915_PW_INSTANCES(
1149                         I915_PW("DC_off", &dg1_pwdoms_dc_off,
1150                                 .id = SKL_DISP_DC_OFF),
1151                 ),
1152                 .ops = &gen9_dc_off_power_well_ops,
1153         }, {
1154                 .instances = &I915_PW_INSTANCES(
1155                         I915_PW("PW_2", &dg1_pwdoms_pw_2,
1156                                 .hsw.idx = ICL_PW_CTL_IDX_PW_2,
1157                                 .id = SKL_DISP_PW_2),
1158                 ),
1159                 .ops = &hsw_power_well_ops,
1160                 .has_fuses = true,
1161         }, {
1162                 .instances = &I915_PW_INSTANCES(
1163                         I915_PW("PW_3", &dg1_pwdoms_pw_3,
1164                                 .hsw.idx = ICL_PW_CTL_IDX_PW_3,
1165                                 .id = ICL_DISP_PW_3),
1166                 ),
1167                 .ops = &hsw_power_well_ops,
1168                 .irq_pipe_mask = BIT(PIPE_B),
1169                 .has_vga = true,
1170                 .has_fuses = true,
1171         }, {
1172                 .instances = &I915_PW_INSTANCES(
1173                         I915_PW("PW_4", &tgl_pwdoms_pw_4,
1174                                 .hsw.idx = ICL_PW_CTL_IDX_PW_4),
1175                 ),
1176                 .ops = &hsw_power_well_ops,
1177                 .has_fuses = true,
1178                 .irq_pipe_mask = BIT(PIPE_C),
1179         }, {
1180                 .instances = &I915_PW_INSTANCES(
1181                         I915_PW("PW_5", &tgl_pwdoms_pw_5,
1182                                 .hsw.idx = TGL_PW_CTL_IDX_PW_5),
1183                 ),
1184                 .ops = &hsw_power_well_ops,
1185                 .has_fuses = true,
1186                 .irq_pipe_mask = BIT(PIPE_D),
1187         },
1188 };
1189
1190 static const struct i915_power_well_desc_list dg1_power_wells[] = {
1191         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
1192         I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
1193         I915_PW_DESCRIPTORS(dg1_power_wells_main),
1194         I915_PW_DESCRIPTORS(rkl_power_wells_ddi_aux),
1195 };
1196
1197 /*
1198  * XE_LPD Power Domains
1199  *
1200  * Previous platforms required that PG(n-1) be enabled before PG(n).  That
1201  * dependency chain turns into a dependency tree on XE_LPD:
1202  *
1203  *       PG0
1204  *        |
1205  *     --PG1--
1206  *    /       \
1207  *  PGA     --PG2--
1208  *         /   |   \
1209  *       PGB  PGC  PGD
1210  *
1211  * Power wells must be enabled from top to bottom and disabled from bottom
1212  * to top.  This allows pipes to be power gated independently.
1213  */
1214
1215 #define XELPD_PW_D_POWER_DOMAINS \
1216         POWER_DOMAIN_PIPE_D, \
1217         POWER_DOMAIN_PIPE_PANEL_FITTER_D, \
1218         POWER_DOMAIN_TRANSCODER_D
1219
1220 I915_DECL_PW_DOMAINS(xelpd_pwdoms_pw_d,
1221         XELPD_PW_D_POWER_DOMAINS,
1222         POWER_DOMAIN_INIT);
1223
1224 #define XELPD_PW_C_POWER_DOMAINS \
1225         POWER_DOMAIN_PIPE_C, \
1226         POWER_DOMAIN_PIPE_PANEL_FITTER_C, \
1227         POWER_DOMAIN_TRANSCODER_C
1228
1229 I915_DECL_PW_DOMAINS(xelpd_pwdoms_pw_c,
1230         XELPD_PW_C_POWER_DOMAINS,
1231         POWER_DOMAIN_INIT);
1232
1233 #define XELPD_PW_B_POWER_DOMAINS \
1234         POWER_DOMAIN_PIPE_B, \
1235         POWER_DOMAIN_PIPE_PANEL_FITTER_B, \
1236         POWER_DOMAIN_TRANSCODER_B
1237
1238 I915_DECL_PW_DOMAINS(xelpd_pwdoms_pw_b,
1239         XELPD_PW_B_POWER_DOMAINS,
1240         POWER_DOMAIN_INIT);
1241
1242 I915_DECL_PW_DOMAINS(xelpd_pwdoms_pw_a,
1243         POWER_DOMAIN_PIPE_A,
1244         POWER_DOMAIN_PIPE_PANEL_FITTER_A,
1245         POWER_DOMAIN_INIT);
1246
1247 #define XELPD_DC_OFF_PORT_POWER_DOMAINS \
1248         POWER_DOMAIN_PORT_DDI_LANES_C, \
1249         POWER_DOMAIN_PORT_DDI_LANES_D, \
1250         POWER_DOMAIN_PORT_DDI_LANES_E, \
1251         POWER_DOMAIN_PORT_DDI_LANES_TC1, \
1252         POWER_DOMAIN_PORT_DDI_LANES_TC2, \
1253         POWER_DOMAIN_PORT_DDI_LANES_TC3, \
1254         POWER_DOMAIN_PORT_DDI_LANES_TC4, \
1255         POWER_DOMAIN_VGA, \
1256         POWER_DOMAIN_AUDIO_PLAYBACK, \
1257         POWER_DOMAIN_AUX_IO_C, \
1258         POWER_DOMAIN_AUX_IO_D, \
1259         POWER_DOMAIN_AUX_IO_E, \
1260         POWER_DOMAIN_AUX_C, \
1261         POWER_DOMAIN_AUX_D, \
1262         POWER_DOMAIN_AUX_E, \
1263         POWER_DOMAIN_AUX_USBC1, \
1264         POWER_DOMAIN_AUX_USBC2, \
1265         POWER_DOMAIN_AUX_USBC3, \
1266         POWER_DOMAIN_AUX_USBC4, \
1267         POWER_DOMAIN_AUX_TBT1, \
1268         POWER_DOMAIN_AUX_TBT2, \
1269         POWER_DOMAIN_AUX_TBT3, \
1270         POWER_DOMAIN_AUX_TBT4
1271
1272 #define XELPD_PW_2_POWER_DOMAINS \
1273         XELPD_PW_B_POWER_DOMAINS, \
1274         XELPD_PW_C_POWER_DOMAINS, \
1275         XELPD_PW_D_POWER_DOMAINS, \
1276         XELPD_DC_OFF_PORT_POWER_DOMAINS
1277
1278 I915_DECL_PW_DOMAINS(xelpd_pwdoms_pw_2,
1279         XELPD_PW_2_POWER_DOMAINS,
1280         POWER_DOMAIN_INIT);
1281
1282 /*
1283  * XELPD PW_1/PG_1 domains (under HW/DMC control):
1284  *  - DBUF function (registers are in PW0)
1285  *  - Transcoder A
1286  *  - DDI_A and DDI_B
1287  *
1288  * XELPD PW_0/PW_1 domains (under HW/DMC control):
1289  *  - PCI
1290  *  - Clocks except port PLL
1291  *  - Shared functions:
1292  *     * interrupts except pipe interrupts
1293  *     * MBus except PIPE_MBUS_DBOX_CTL
1294  *     * DBUF registers
1295  *  - Central power except FBC
1296  *  - Top-level GTC (DDI-level GTC is in the well associated with the DDI)
1297  */
1298
1299 I915_DECL_PW_DOMAINS(xelpd_pwdoms_dc_off,
1300         XELPD_DC_OFF_PORT_POWER_DOMAINS,
1301         XELPD_PW_C_POWER_DOMAINS,
1302         XELPD_PW_D_POWER_DOMAINS,
1303         POWER_DOMAIN_PORT_DSI,
1304         POWER_DOMAIN_AUDIO_MMIO,
1305         POWER_DOMAIN_AUX_A,
1306         POWER_DOMAIN_AUX_B,
1307         POWER_DOMAIN_DC_OFF,
1308         POWER_DOMAIN_INIT);
1309
1310 static const struct i915_power_well_desc xelpd_power_wells_dc_off[] = {
1311         {
1312                 .instances = &I915_PW_INSTANCES(
1313                         I915_PW("DC_off", &xelpd_pwdoms_dc_off,
1314                                 .id = SKL_DISP_DC_OFF),
1315                 ),
1316                 .ops = &gen9_dc_off_power_well_ops,
1317         }
1318 };
1319
1320 static const struct i915_power_well_desc xelpd_power_wells_main[] = {
1321         {
1322                 .instances = &I915_PW_INSTANCES(
1323                         I915_PW("PW_2", &xelpd_pwdoms_pw_2,
1324                                 .hsw.idx = ICL_PW_CTL_IDX_PW_2,
1325                                 .id = SKL_DISP_PW_2),
1326                 ),
1327                 .ops = &hsw_power_well_ops,
1328                 .has_vga = true,
1329                 .has_fuses = true,
1330         }, {
1331                 .instances = &I915_PW_INSTANCES(
1332                         I915_PW("PW_A", &xelpd_pwdoms_pw_a,
1333                                 .hsw.idx = XELPD_PW_CTL_IDX_PW_A),
1334                 ),
1335                 .ops = &hsw_power_well_ops,
1336                 .irq_pipe_mask = BIT(PIPE_A),
1337                 .has_fuses = true,
1338         }, {
1339                 .instances = &I915_PW_INSTANCES(
1340                         I915_PW("PW_B", &xelpd_pwdoms_pw_b,
1341                                 .hsw.idx = XELPD_PW_CTL_IDX_PW_B),
1342                 ),
1343                 .ops = &hsw_power_well_ops,
1344                 .irq_pipe_mask = BIT(PIPE_B),
1345                 .has_fuses = true,
1346         }, {
1347                 .instances = &I915_PW_INSTANCES(
1348                         I915_PW("PW_C", &xelpd_pwdoms_pw_c,
1349                                 .hsw.idx = XELPD_PW_CTL_IDX_PW_C),
1350                 ),
1351                 .ops = &hsw_power_well_ops,
1352                 .irq_pipe_mask = BIT(PIPE_C),
1353                 .has_fuses = true,
1354         }, {
1355                 .instances = &I915_PW_INSTANCES(
1356                         I915_PW("PW_D", &xelpd_pwdoms_pw_d,
1357                                 .hsw.idx = XELPD_PW_CTL_IDX_PW_D),
1358                 ),
1359                 .ops = &hsw_power_well_ops,
1360                 .irq_pipe_mask = BIT(PIPE_D),
1361                 .has_fuses = true,
1362         }, {
1363                 .instances = &I915_PW_INSTANCES(
1364                         I915_PW("DDI_IO_A", &glk_pwdoms_ddi_io_a, .hsw.idx = ICL_PW_CTL_IDX_DDI_A),
1365                         I915_PW("DDI_IO_B", &glk_pwdoms_ddi_io_b, .hsw.idx = ICL_PW_CTL_IDX_DDI_B),
1366                         I915_PW("DDI_IO_C", &glk_pwdoms_ddi_io_c, .hsw.idx = ICL_PW_CTL_IDX_DDI_C),
1367                         I915_PW("DDI_IO_D", &icl_pwdoms_ddi_io_d, .hsw.idx = XELPD_PW_CTL_IDX_DDI_D),
1368                         I915_PW("DDI_IO_E", &icl_pwdoms_ddi_io_e, .hsw.idx = XELPD_PW_CTL_IDX_DDI_E),
1369                         I915_PW("DDI_IO_TC1", &tgl_pwdoms_ddi_io_tc1, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1),
1370                         I915_PW("DDI_IO_TC2", &tgl_pwdoms_ddi_io_tc2, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2),
1371                         I915_PW("DDI_IO_TC3", &tgl_pwdoms_ddi_io_tc3, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3),
1372                         I915_PW("DDI_IO_TC4", &tgl_pwdoms_ddi_io_tc4, .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4),
1373                 ),
1374                 .ops = &icl_ddi_power_well_ops,
1375         }, {
1376                 .instances = &I915_PW_INSTANCES(
1377                         I915_PW("AUX_A", &icl_pwdoms_aux_a, .hsw.idx = ICL_PW_CTL_IDX_AUX_A),
1378                         I915_PW("AUX_B", &icl_pwdoms_aux_b, .hsw.idx = ICL_PW_CTL_IDX_AUX_B),
1379                         I915_PW("AUX_C", &icl_pwdoms_aux_c, .hsw.idx = ICL_PW_CTL_IDX_AUX_C),
1380                         I915_PW("AUX_D", &icl_pwdoms_aux_d, .hsw.idx = XELPD_PW_CTL_IDX_AUX_D),
1381                         I915_PW("AUX_E", &icl_pwdoms_aux_e, .hsw.idx = XELPD_PW_CTL_IDX_AUX_E),
1382                 ),
1383                 .ops = &icl_aux_power_well_ops,
1384                 .fixed_enable_delay = true,
1385         }, {
1386                 .instances = &I915_PW_INSTANCES(
1387                         I915_PW("AUX_USBC1", &tgl_pwdoms_aux_usbc1, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1),
1388                         I915_PW("AUX_USBC2", &tgl_pwdoms_aux_usbc2, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2),
1389                         I915_PW("AUX_USBC3", &tgl_pwdoms_aux_usbc3, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3),
1390                         I915_PW("AUX_USBC4", &tgl_pwdoms_aux_usbc4, .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4),
1391                 ),
1392                 .ops = &icl_aux_power_well_ops,
1393                 .fixed_enable_delay = true,
1394                 /* WA_14017248603: adlp */
1395                 .enable_timeout = 500,
1396         }, {
1397                 .instances = &I915_PW_INSTANCES(
1398                         I915_PW("AUX_TBT1", &icl_pwdoms_aux_tbt1, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1),
1399                         I915_PW("AUX_TBT2", &icl_pwdoms_aux_tbt2, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2),
1400                         I915_PW("AUX_TBT3", &icl_pwdoms_aux_tbt3, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3),
1401                         I915_PW("AUX_TBT4", &icl_pwdoms_aux_tbt4, .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4),
1402                 ),
1403                 .ops = &icl_aux_power_well_ops,
1404                 .is_tc_tbt = true,
1405         },
1406 };
1407
1408 static const struct i915_power_well_desc_list xelpd_power_wells[] = {
1409         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
1410         I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
1411         I915_PW_DESCRIPTORS(xelpd_power_wells_dc_off),
1412         I915_PW_DESCRIPTORS(xelpd_power_wells_main),
1413 };
1414
1415 I915_DECL_PW_DOMAINS(xehpd_pwdoms_dc_off,
1416         XELPD_PW_2_POWER_DOMAINS,
1417         POWER_DOMAIN_PORT_DSI,
1418         POWER_DOMAIN_AUDIO_MMIO,
1419         POWER_DOMAIN_AUX_A,
1420         POWER_DOMAIN_AUX_B,
1421         POWER_DOMAIN_DC_OFF,
1422         POWER_DOMAIN_INIT);
1423
1424 static const struct i915_power_well_desc xehpd_power_wells_dc_off[] = {
1425         {
1426                 .instances = &I915_PW_INSTANCES(
1427                         I915_PW("DC_off", &xehpd_pwdoms_dc_off,
1428                                 .id = SKL_DISP_DC_OFF),
1429                 ),
1430                 .ops = &gen9_dc_off_power_well_ops,
1431         }
1432 };
1433
1434 static const struct i915_power_well_desc_list xehpd_power_wells[] = {
1435         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
1436         I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
1437         I915_PW_DESCRIPTORS(xehpd_power_wells_dc_off),
1438         I915_PW_DESCRIPTORS(xelpd_power_wells_main),
1439 };
1440
1441 /*
1442  * MTL is based on XELPD power domains with the exception of power gating for:
1443  * - DDI_IO (moved to PLL logic)
1444  * - AUX and AUX_IO functionality and register access for USBC1-4 (PICA always-on)
1445  */
1446 #define XELPDP_PW_2_POWER_DOMAINS \
1447         XELPD_PW_B_POWER_DOMAINS, \
1448         XELPD_PW_C_POWER_DOMAINS, \
1449         XELPD_PW_D_POWER_DOMAINS, \
1450         POWER_DOMAIN_AUDIO_PLAYBACK, \
1451         POWER_DOMAIN_VGA, \
1452         POWER_DOMAIN_PORT_DDI_LANES_TC1, \
1453         POWER_DOMAIN_PORT_DDI_LANES_TC2, \
1454         POWER_DOMAIN_PORT_DDI_LANES_TC3, \
1455         POWER_DOMAIN_PORT_DDI_LANES_TC4
1456
1457 I915_DECL_PW_DOMAINS(xelpdp_pwdoms_pw_2,
1458         XELPDP_PW_2_POWER_DOMAINS,
1459         POWER_DOMAIN_INIT);
1460
1461 I915_DECL_PW_DOMAINS(xelpdp_pwdoms_aux_tc1,
1462         POWER_DOMAIN_AUX_USBC1,
1463         POWER_DOMAIN_AUX_TBT1);
1464
1465 I915_DECL_PW_DOMAINS(xelpdp_pwdoms_aux_tc2,
1466         POWER_DOMAIN_AUX_USBC2,
1467         POWER_DOMAIN_AUX_TBT2);
1468
1469 I915_DECL_PW_DOMAINS(xelpdp_pwdoms_aux_tc3,
1470         POWER_DOMAIN_AUX_USBC3,
1471         POWER_DOMAIN_AUX_TBT3);
1472
1473 I915_DECL_PW_DOMAINS(xelpdp_pwdoms_aux_tc4,
1474         POWER_DOMAIN_AUX_USBC4,
1475         POWER_DOMAIN_AUX_TBT4);
1476
1477 static const struct i915_power_well_desc xelpdp_power_wells_main[] = {
1478         {
1479                 .instances = &I915_PW_INSTANCES(
1480                         I915_PW("PW_2", &xelpdp_pwdoms_pw_2,
1481                                 .hsw.idx = ICL_PW_CTL_IDX_PW_2,
1482                                 .id = SKL_DISP_PW_2),
1483                 ),
1484                 .ops = &hsw_power_well_ops,
1485                 .has_vga = true,
1486                 .has_fuses = true,
1487         }, {
1488                 .instances = &I915_PW_INSTANCES(
1489                         I915_PW("PW_A", &xelpd_pwdoms_pw_a,
1490                                 .hsw.idx = XELPD_PW_CTL_IDX_PW_A),
1491                 ),
1492                 .ops = &hsw_power_well_ops,
1493                 .irq_pipe_mask = BIT(PIPE_A),
1494                 .has_fuses = true,
1495         }, {
1496                 .instances = &I915_PW_INSTANCES(
1497                         I915_PW("PW_B", &xelpd_pwdoms_pw_b,
1498                                 .hsw.idx = XELPD_PW_CTL_IDX_PW_B),
1499                 ),
1500                 .ops = &hsw_power_well_ops,
1501                 .irq_pipe_mask = BIT(PIPE_B),
1502                 .has_fuses = true,
1503         }, {
1504                 .instances = &I915_PW_INSTANCES(
1505                         I915_PW("PW_C", &xelpd_pwdoms_pw_c,
1506                                 .hsw.idx = XELPD_PW_CTL_IDX_PW_C),
1507                 ),
1508                 .ops = &hsw_power_well_ops,
1509                 .irq_pipe_mask = BIT(PIPE_C),
1510                 .has_fuses = true,
1511         }, {
1512                 .instances = &I915_PW_INSTANCES(
1513                         I915_PW("PW_D", &xelpd_pwdoms_pw_d,
1514                                 .hsw.idx = XELPD_PW_CTL_IDX_PW_D),
1515                 ),
1516                 .ops = &hsw_power_well_ops,
1517                 .irq_pipe_mask = BIT(PIPE_D),
1518                 .has_fuses = true,
1519         }, {
1520                 .instances = &I915_PW_INSTANCES(
1521                         I915_PW("AUX_A", &icl_pwdoms_aux_a, .xelpdp.aux_ch = AUX_CH_A),
1522                         I915_PW("AUX_B", &icl_pwdoms_aux_b, .xelpdp.aux_ch = AUX_CH_B),
1523                         I915_PW("AUX_TC1", &xelpdp_pwdoms_aux_tc1, .xelpdp.aux_ch = AUX_CH_USBC1),
1524                         I915_PW("AUX_TC2", &xelpdp_pwdoms_aux_tc2, .xelpdp.aux_ch = AUX_CH_USBC2),
1525                         I915_PW("AUX_TC3", &xelpdp_pwdoms_aux_tc3, .xelpdp.aux_ch = AUX_CH_USBC3),
1526                         I915_PW("AUX_TC4", &xelpdp_pwdoms_aux_tc4, .xelpdp.aux_ch = AUX_CH_USBC4),
1527                 ),
1528                 .ops = &xelpdp_aux_power_well_ops,
1529         },
1530 };
1531
1532 static const struct i915_power_well_desc_list xelpdp_power_wells[] = {
1533         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
1534         I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
1535         I915_PW_DESCRIPTORS(xelpd_power_wells_dc_off),
1536         I915_PW_DESCRIPTORS(xelpdp_power_wells_main),
1537 };
1538
1539 I915_DECL_PW_DOMAINS(xe2lpd_pwdoms_pica_tc,
1540                      POWER_DOMAIN_PORT_DDI_LANES_TC1,
1541                      POWER_DOMAIN_PORT_DDI_LANES_TC2,
1542                      POWER_DOMAIN_PORT_DDI_LANES_TC3,
1543                      POWER_DOMAIN_PORT_DDI_LANES_TC4,
1544                      POWER_DOMAIN_AUX_USBC1,
1545                      POWER_DOMAIN_AUX_USBC2,
1546                      POWER_DOMAIN_AUX_USBC3,
1547                      POWER_DOMAIN_AUX_USBC4,
1548                      POWER_DOMAIN_AUX_TBT1,
1549                      POWER_DOMAIN_AUX_TBT2,
1550                      POWER_DOMAIN_AUX_TBT3,
1551                      POWER_DOMAIN_AUX_TBT4,
1552                      POWER_DOMAIN_INIT);
1553
1554 static const struct i915_power_well_desc xe2lpd_power_wells_pica[] = {
1555         {
1556                 .instances = &I915_PW_INSTANCES(I915_PW("PICA_TC",
1557                                                         &xe2lpd_pwdoms_pica_tc,
1558                                                         .id = DISP_PW_ID_NONE),
1559                                                ),
1560                 .ops = &xe2lpd_pica_power_well_ops,
1561         },
1562 };
1563
1564 I915_DECL_PW_DOMAINS(xe2lpd_pwdoms_dc_off,
1565         POWER_DOMAIN_DC_OFF,
1566         XELPD_PW_C_POWER_DOMAINS,
1567         XELPD_PW_D_POWER_DOMAINS,
1568         POWER_DOMAIN_AUDIO_MMIO,
1569         POWER_DOMAIN_INIT);
1570
1571 static const struct i915_power_well_desc xe2lpd_power_wells_dcoff[] = {
1572         {
1573                 .instances = &I915_PW_INSTANCES(
1574                         I915_PW("DC_off", &xe2lpd_pwdoms_dc_off,
1575                                 .id = SKL_DISP_DC_OFF),
1576                 ),
1577                 .ops = &gen9_dc_off_power_well_ops,
1578         },
1579 };
1580
1581 static const struct i915_power_well_desc_list xe2lpd_power_wells[] = {
1582         I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
1583         I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
1584         I915_PW_DESCRIPTORS(xe2lpd_power_wells_dcoff),
1585         I915_PW_DESCRIPTORS(xelpdp_power_wells_main),
1586         I915_PW_DESCRIPTORS(xe2lpd_power_wells_pica),
1587 };
1588
1589 static void init_power_well_domains(const struct i915_power_well_instance *inst,
1590                                     struct i915_power_well *power_well)
1591 {
1592         int j;
1593
1594         if (!inst->domain_list)
1595                 return;
1596
1597         if (inst->domain_list->count == 0) {
1598                 bitmap_fill(power_well->domains.bits, POWER_DOMAIN_NUM);
1599
1600                 return;
1601         }
1602
1603         for (j = 0; j < inst->domain_list->count; j++)
1604                 set_bit(inst->domain_list->list[j], power_well->domains.bits);
1605 }
1606
1607 #define for_each_power_well_instance_in_desc_list(_desc_list, _desc_count, _desc, _inst) \
1608         for ((_desc) = (_desc_list); (_desc) - (_desc_list) < (_desc_count); (_desc)++) \
1609                 for ((_inst) = (_desc)->instances->list; \
1610                      (_inst) - (_desc)->instances->list < (_desc)->instances->count; \
1611                      (_inst)++)
1612
1613 #define for_each_power_well_instance(_desc_list, _desc_count, _descs, _desc, _inst) \
1614         for ((_descs) = (_desc_list); \
1615              (_descs) - (_desc_list) < (_desc_count); \
1616              (_descs)++) \
1617                 for_each_power_well_instance_in_desc_list((_descs)->list, (_descs)->count, \
1618                                                           (_desc), (_inst))
1619
1620 static int
1621 __set_power_wells(struct i915_power_domains *power_domains,
1622                   const struct i915_power_well_desc_list *power_well_descs,
1623                   int power_well_descs_sz)
1624 {
1625         struct drm_i915_private *i915 = container_of(power_domains,
1626                                                      struct drm_i915_private,
1627                                                      display.power.domains);
1628         u64 power_well_ids = 0;
1629         const struct i915_power_well_desc_list *desc_list;
1630         const struct i915_power_well_desc *desc;
1631         const struct i915_power_well_instance *inst;
1632         int power_well_count = 0;
1633         int plt_idx = 0;
1634
1635         for_each_power_well_instance(power_well_descs, power_well_descs_sz, desc_list, desc, inst)
1636                 power_well_count++;
1637
1638         power_domains->power_well_count = power_well_count;
1639         power_domains->power_wells =
1640                                 kcalloc(power_well_count,
1641                                         sizeof(*power_domains->power_wells),
1642                                         GFP_KERNEL);
1643         if (!power_domains->power_wells)
1644                 return -ENOMEM;
1645
1646         for_each_power_well_instance(power_well_descs, power_well_descs_sz, desc_list, desc, inst) {
1647                 struct i915_power_well *pw = &power_domains->power_wells[plt_idx];
1648                 enum i915_power_well_id id = inst->id;
1649
1650                 pw->desc = desc;
1651                 drm_WARN_ON(&i915->drm,
1652                             overflows_type(inst - desc->instances->list, pw->instance_idx));
1653                 pw->instance_idx = inst - desc->instances->list;
1654
1655                 init_power_well_domains(inst, pw);
1656
1657                 plt_idx++;
1658
1659                 if (id == DISP_PW_ID_NONE)
1660                         continue;
1661
1662                 drm_WARN_ON(&i915->drm, id >= sizeof(power_well_ids) * 8);
1663                 drm_WARN_ON(&i915->drm, power_well_ids & BIT_ULL(id));
1664                 power_well_ids |= BIT_ULL(id);
1665         }
1666
1667         return 0;
1668 }
1669
1670 #define set_power_wells(power_domains, __power_well_descs) \
1671         __set_power_wells(power_domains, __power_well_descs, \
1672                           ARRAY_SIZE(__power_well_descs))
1673
1674 /**
1675  * intel_display_power_map_init - initialize power domain -> power well mappings
1676  * @power_domains: power domain state
1677  *
1678  * Creates all the power wells for the current platform, initializes the
1679  * dynamic state for them and initializes the mapping of each power well to
1680  * all the power domains the power well belongs to.
1681  */
1682 int intel_display_power_map_init(struct i915_power_domains *power_domains)
1683 {
1684         struct drm_i915_private *i915 = container_of(power_domains,
1685                                                      struct drm_i915_private,
1686                                                      display.power.domains);
1687         /*
1688          * The enabling order will be from lower to higher indexed wells,
1689          * the disabling order is reversed.
1690          */
1691         if (!HAS_DISPLAY(i915)) {
1692                 power_domains->power_well_count = 0;
1693                 return 0;
1694         }
1695
1696         if (DISPLAY_VER(i915) >= 20)
1697                 return set_power_wells(power_domains, xe2lpd_power_wells);
1698         else if (DISPLAY_VER(i915) >= 14)
1699                 return set_power_wells(power_domains, xelpdp_power_wells);
1700         else if (IS_DG2(i915))
1701                 return set_power_wells(power_domains, xehpd_power_wells);
1702         else if (DISPLAY_VER(i915) >= 13)
1703                 return set_power_wells(power_domains, xelpd_power_wells);
1704         else if (IS_DG1(i915))
1705                 return set_power_wells(power_domains, dg1_power_wells);
1706         else if (IS_ALDERLAKE_S(i915))
1707                 return set_power_wells(power_domains, adls_power_wells);
1708         else if (IS_ROCKETLAKE(i915))
1709                 return set_power_wells(power_domains, rkl_power_wells);
1710         else if (DISPLAY_VER(i915) == 12)
1711                 return set_power_wells(power_domains, tgl_power_wells);
1712         else if (DISPLAY_VER(i915) == 11)
1713                 return set_power_wells(power_domains, icl_power_wells);
1714         else if (IS_GEMINILAKE(i915))
1715                 return set_power_wells(power_domains, glk_power_wells);
1716         else if (IS_BROXTON(i915))
1717                 return set_power_wells(power_domains, bxt_power_wells);
1718         else if (DISPLAY_VER(i915) == 9)
1719                 return set_power_wells(power_domains, skl_power_wells);
1720         else if (IS_CHERRYVIEW(i915))
1721                 return set_power_wells(power_domains, chv_power_wells);
1722         else if (IS_BROADWELL(i915))
1723                 return set_power_wells(power_domains, bdw_power_wells);
1724         else if (IS_HASWELL(i915))
1725                 return set_power_wells(power_domains, hsw_power_wells);
1726         else if (IS_VALLEYVIEW(i915))
1727                 return set_power_wells(power_domains, vlv_power_wells);
1728         else if (IS_I830(i915))
1729                 return set_power_wells(power_domains, i830_power_wells);
1730         else
1731                 return set_power_wells(power_domains, i9xx_power_wells);
1732 }
1733
1734 /**
1735  * intel_display_power_map_cleanup - clean up power domain -> power well mappings
1736  * @power_domains: power domain state
1737  *
1738  * Cleans up all the state that was initialized by intel_display_power_map_init().
1739  */
1740 void intel_display_power_map_cleanup(struct i915_power_domains *power_domains)
1741 {
1742         kfree(power_domains->power_wells);
1743 }
This page took 0.146786 seconds and 4 git commands to generate.