Linux Audio

Check our new training course

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