[Intel-gfx] [PATCH v3 03/18] drm/i915: Move the power domain->well mappings to intel_display_power_map.c
Hogander, Jouni
jouni.hogander at intel.com
Thu Mar 31 07:14:29 UTC 2022
On Tue, 2022-03-29 at 19:43 +0300, Imre Deak wrote:
> Move the list of platform specific power domain -> power well
> definitions to intel_display_power_map.c. While at it group the
> platforms' power domain macros with the corresponding power well
> lists
> and keep all the power domain lists in the same order (matching the
> enum
> order).
>
> No functional changes.
Reviewed-by: Jouni Högander <jouni.hogander at intel.com>
>
> v2:
> - s/intel_display_power_internal.h/intel_display_power_map.h/ (Jani)
> - Simplify intel_cleanup_power_wells().
> - Don't move intel_display_power_domain_str().
> v3:
> - Rename intel_init/cleanup_power_wells() to
> intel_display_power_map_init/cleanup().
> - Add documentation to intel_display_power_map_init/cleanup().
>
> Cc: Jani Nikula <jani.nikula at intel.com>
> Signed-off-by: Imre Deak <imre.deak at intel.com>
> Reviewed-by: Jouni Högander <jouni.hogander at intel.com> (v2)
> ---
> drivers/gpu/drm/i915/Makefile | 1 +
> .../drm/i915/display/intel_display_power.c | 2260 +------------
> ----
> .../i915/display/intel_display_power_map.c | 2150
> ++++++++++++++++
> .../i915/display/intel_display_power_map.h | 14 +
> 4 files changed, 2168 insertions(+), 2257 deletions(-)
> create mode 100644
> drivers/gpu/drm/i915/display/intel_display_power_map.c
> create mode 100644
> drivers/gpu/drm/i915/display/intel_display_power_map.h
>
> diff --git a/drivers/gpu/drm/i915/Makefile
> b/drivers/gpu/drm/i915/Makefile
> index c1d5540f60529..469ee62982b4b 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -216,6 +216,7 @@ i915-y += \
> display/intel_cursor.o \
> display/intel_display.o \
> display/intel_display_power.o \
> + display/intel_display_power_map.o \
> display/intel_display_power_well.o \
> display/intel_dmc.o \
> display/intel_dpio_phy.o \
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c
> b/drivers/gpu/drm/i915/display/intel_display_power.c
> index 25b614bf09d83..e999433589715 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> @@ -11,6 +11,7 @@
> #include "intel_combo_phy.h"
> #include "intel_de.h"
> #include "intel_display_power.h"
> +#include "intel_display_power_map.h"
> #include "intel_display_power_well.h"
> #include "intel_display_types.h"
> #include "intel_dmc.h"
> @@ -848,2169 +849,6 @@ intel_display_power_put_mask_in_set(struct
> drm_i915_private *i915,
> }
> }
>
> -#define I830_PIPES_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_A) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define VLV_DISPLAY_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_A) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DSI) | \
> - BIT_ULL(POWER_DOMAIN_PORT_CRT) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_GMBUS) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_CRT) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define CHV_DISPLAY_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_A) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DSI) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_AUX_D) | \
> - BIT_ULL(POWER_DOMAIN_GMBUS) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define CHV_DPIO_CMN_D_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_D) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define HSW_DISPLAY_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define BDW_DISPLAY_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_AUX_D) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define SKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> - SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
> - BIT_ULL(POWER_DOMAIN_MODESET) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define BXT_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> - BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
> - BIT_ULL(POWER_DOMAIN_MODESET) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_GMBUS) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define BXT_DPIO_CMN_A_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define BXT_DPIO_CMN_BC_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO))
> -#define GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO))
> -#define GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO))
> -#define GLK_DPIO_CMN_A_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define GLK_DPIO_CMN_B_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define GLK_DPIO_CMN_C_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define GLK_DISPLAY_AUX_A_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define GLK_DISPLAY_AUX_B_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define GLK_DISPLAY_AUX_C_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -#define GLK_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> - GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
> - BIT_ULL(POWER_DOMAIN_MODESET) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_GMBUS) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -/*
> - * ICL PW_0/PG_0 domains (HW/DMC control):
> - * - PCI
> - * - clocks except port PLL
> - * - central power except FBC
> - * - shared functions except pipe interrupts, pipe MBUS, DBUF
> registers
> - * ICL PW_1/PG_1 domains (HW/DMC control):
> - * - DBUF function
> - * - PIPE_A and its planes, except VGA
> - * - transcoder EDP + PSR
> - * - transcoder DSI
> - * - DDI_A
> - * - FBC
> - */
> -#define ICL_PW_4_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> - /* VDSC/joining */
> -#define ICL_PW_3_POWER_DOMAINS ( \
> - ICL_PW_4_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_F_LANES) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_AUX_D) | \
> - BIT_ULL(POWER_DOMAIN_AUX_E) | \
> - BIT_ULL(POWER_DOMAIN_AUX_F) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C_TBT) | \
> - BIT_ULL(POWER_DOMAIN_AUX_D_TBT) | \
> - BIT_ULL(POWER_DOMAIN_AUX_E_TBT) | \
> - BIT_ULL(POWER_DOMAIN_AUX_F_TBT) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> - /*
> - * - transcoder WD
> - * - KVMR (HW control)
> - */
> -#define ICL_PW_2_POWER_DOMAINS ( \
> - ICL_PW_3_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> - /*
> - * - KVMR (HW control)
> - */
> -#define ICL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> - ICL_PW_2_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_MODESET) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_DC_OFF) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define ICL_DDI_IO_A_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO))
> -#define ICL_DDI_IO_B_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO))
> -#define ICL_DDI_IO_C_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO))
> -#define ICL_DDI_IO_D_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO))
> -#define ICL_DDI_IO_E_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO))
> -#define ICL_DDI_IO_F_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_F_IO))
> -
> -#define ICL_AUX_A_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A))
> -#define ICL_AUX_B_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_B))
> -#define ICL_AUX_C_TC1_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_C))
> -#define ICL_AUX_D_TC2_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_D))
> -#define ICL_AUX_E_TC3_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_E))
> -#define ICL_AUX_F_TC4_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_F))
> -#define ICL_AUX_C_TBT1_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_C_TBT))
> -#define ICL_AUX_D_TBT2_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_D_TBT))
> -#define ICL_AUX_E_TBT3_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_E_TBT))
> -#define ICL_AUX_F_TBT4_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_F_TBT))
> -
> -#define TGL_PW_5_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_D) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_D) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_D_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define TGL_PW_4_POWER_DOMAINS ( \
> - TGL_PW_5_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define TGL_PW_3_POWER_DOMAINS ( \
> - TGL_PW_4_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC3) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC4) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC5) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC6) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC5) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC6) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT5) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT6) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define TGL_PW_2_POWER_DOMAINS ( \
> - TGL_PW_3_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define TGL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> - TGL_PW_3_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_MODESET) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define TGL_DDI_IO_TC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC1)
> -#define TGL_DDI_IO_TC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC2)
> -#define TGL_DDI_IO_TC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC3)
> -#define TGL_DDI_IO_TC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC4)
> -#define TGL_DDI_IO_TC5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC5)
> -#define TGL_DDI_IO_TC6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC6)
> -
> -#define TGL_AUX_A_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A))
> -#define TGL_AUX_B_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_B))
> -#define TGL_AUX_C_IO_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_C))
> -
> -#define TGL_AUX_IO_USBC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC1)
> -#define TGL_AUX_IO_USBC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC2)
> -#define TGL_AUX_IO_USBC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC3)
> -#define TGL_AUX_IO_USBC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC4)
> -#define TGL_AUX_IO_USBC5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC5)
> -#define TGL_AUX_IO_USBC6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC6)
> -
> -#define TGL_AUX_IO_TBT1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT1)
> -#define TGL_AUX_IO_TBT2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT2)
> -#define TGL_AUX_IO_TBT3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT3)
> -#define TGL_AUX_IO_TBT4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT4)
> -#define TGL_AUX_IO_TBT5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT5)
> -#define TGL_AUX_IO_TBT6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT6)
> -
> -#define TGL_TC_COLD_OFF_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC5) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC6) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT5) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT6) | \
> - BIT_ULL(POWER_DOMAIN_TC_COLD_OFF))
> -
> -#define RKL_PW_4_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define RKL_PW_3_POWER_DOMAINS ( \
> - RKL_PW_4_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -/*
> - * There is no PW_2/PG_2 on RKL.
> - *
> - * RKL PW_1/PG_1 domains (under HW/DMC control):
> - * - DBUF function (note: registers are in PW0)
> - * - PIPE_A and its planes and VDSC/joining, except VGA
> - * - transcoder A
> - * - DDI_A and DDI_B
> - * - FBC
> - *
> - * RKL PW_0/PG_0 domains (under HW/DMC control):
> - * - PCI
> - * - clocks except port PLL
> - * - shared functions:
> - * * interrupts except pipe interrupts
> - * * MBus except PIPE_MBUS_DBOX_CTL
> - * * DBUF registers
> - * - central power except FBC
> - * - top-level GTC (DDI-level GTC is in the well associated with the
> DDI)
> - */
> -
> -#define RKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> - RKL_PW_3_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_MODESET) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -/*
> - * DG1 onwards Audio MMIO/VERBS lies in PG0 power well.
> - */
> -#define DG1_PW_3_POWER_DOMAINS ( \
> - TGL_PW_4_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define DG1_PW_2_POWER_DOMAINS ( \
> - DG1_PW_3_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define DG1_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> - DG1_PW_3_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_MODESET) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -/*
> - * XE_LPD Power Domains
> - *
> - * Previous platforms required that PG(n-1) be enabled before
> PG(n). That
> - * dependency chain turns into a dependency tree on XE_LPD:
> - *
> - * PG0
> - * |
> - * --PG1--
> - * / \
> - * PGA --PG2--
> - * / | \
> - * PGB PGC PGD
> - *
> - * Power wells must be enabled from top to bottom and disabled from
> bottom
> - * to top. This allows pipes to be power gated independently.
> - */
> -
> -#define XELPD_PW_D_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_D) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_D_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_D) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define XELPD_PW_C_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define XELPD_PW_B_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define XELPD_PW_A_POWER_DOMAINS ( \
> - BIT_ULL(POWER_DOMAIN_PIPE_A) | \
> - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define XELPD_PW_2_POWER_DOMAINS ( \
> - XELPD_PW_B_POWER_DOMAINS | \
> - XELPD_PW_C_POWER_DOMAINS | \
> - XELPD_PW_D_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> - BIT_ULL(POWER_DOMAIN_VGA) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_D_XELPD) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_E_XELPD) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC3) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC4) | \
> - BIT_ULL(POWER_DOMAIN_AUX_C) | \
> - BIT_ULL(POWER_DOMAIN_AUX_D_XELPD) | \
> - BIT_ULL(POWER_DOMAIN_AUX_E_XELPD) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \
> - BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \
> - BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -/*
> - * XELPD PW_1/PG_1 domains (under HW/DMC control):
> - * - DBUF function (registers are in PW0)
> - * - Transcoder A
> - * - DDI_A and DDI_B
> - *
> - * XELPD PW_0/PW_1 domains (under HW/DMC control):
> - * - PCI
> - * - Clocks except port PLL
> - * - Shared functions:
> - * * interrupts except pipe interrupts
> - * * MBus except PIPE_MBUS_DBOX_CTL
> - * * DBUF registers
> - * - Central power except FBC
> - * - Top-level GTC (DDI-level GTC is in the well associated with
> the DDI)
> - */
> -
> -#define XELPD_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> - XELPD_PW_2_POWER_DOMAINS | \
> - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> - BIT_ULL(POWER_DOMAIN_MODESET) | \
> - BIT_ULL(POWER_DOMAIN_AUX_A) | \
> - BIT_ULL(POWER_DOMAIN_AUX_B) | \
> - BIT_ULL(POWER_DOMAIN_PORT_DSI) | \
> - BIT_ULL(POWER_DOMAIN_INIT))
> -
> -#define XELPD_AUX_IO_D_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_D_XELPD)
> -#define XELPD_AUX_IO_E_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_E_XELPD)
> -#define XELPD_AUX_IO_USBC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC1)
> -#define XELPD_AUX_IO_USBC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC2)
> -#define XELPD_AUX_IO_USBC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC3)
> -#define XELPD_AUX_IO_USBC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC4)
> -
> -#define XELPD_AUX_IO_TBT1_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_TBT1)
> -#define XELPD_AUX_IO_TBT2_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_TBT2)
> -#define XELPD_AUX_IO_TBT3_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_TBT3)
> -#define XELPD_AUX_IO_TBT4_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_TBT4)
> -
> -#define XELPD_DDI_IO_D_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_IO_D_XELPD)
> -#define XELPD_DDI_IO_E_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_IO_E_XELPD)
> -#define XELPD_DDI_IO_TC1_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_PORT_DDI_IO_TC1)
> -#define XELPD_DDI_IO_TC2_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_PORT_DDI_IO_TC2)
> -#define XELPD_DDI_IO_TC3_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_PORT_DDI_IO_TC3)
> -#define XELPD_DDI_IO_TC4_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_PORT_DDI_IO_TC4)
> -
> -static const struct i915_power_well_desc i9xx_always_on_power_well[]
> = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> -};
> -
> -static const struct i915_power_well_desc i830_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "pipes",
> - .domains = I830_PIPES_POWER_DOMAINS,
> - .ops = &i830_pipes_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> -};
> -
> -static const struct i915_power_well_desc hsw_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "display",
> - .domains = HSW_DISPLAY_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = HSW_DISP_PW_GLOBAL,
> - {
> - .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
> - .hsw.has_vga = true,
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc bdw_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "display",
> - .domains = BDW_DISPLAY_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = HSW_DISP_PW_GLOBAL,
> - {
> - .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
> - .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
> - .hsw.has_vga = true,
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc vlv_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "display",
> - .domains = VLV_DISPLAY_POWER_DOMAINS,
> - .ops = &vlv_display_power_well_ops,
> - .id = VLV_DISP_PW_DISP2D,
> - {
> - .vlv.idx = PUNIT_PWGT_IDX_DISP2D,
> - },
> - },
> - {
> - .name = "dpio-tx-b-01",
> - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
> - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
> - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
> - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
> - .ops = &vlv_dpio_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_01,
> - },
> - },
> - {
> - .name = "dpio-tx-b-23",
> - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
> - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
> - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
> - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
> - .ops = &vlv_dpio_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_23,
> - },
> - },
> - {
> - .name = "dpio-tx-c-01",
> - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
> - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
> - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
> - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
> - .ops = &vlv_dpio_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_01,
> - },
> - },
> - {
> - .name = "dpio-tx-c-23",
> - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
> - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
> - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
> - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
> - .ops = &vlv_dpio_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_23,
> - },
> - },
> - {
> - .name = "dpio-common",
> - .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS,
> - .ops = &vlv_dpio_cmn_power_well_ops,
> - .id = VLV_DISP_PW_DPIO_CMN_BC,
> - {
> - .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc chv_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "display",
> - /*
> - * Pipe A power well is the new disp2d well. Pipe B and
> C
> - * power wells don't actually exist. Pipe A power well
> is
> - * required for any pipe to work.
> - */
> - .domains = CHV_DISPLAY_POWER_DOMAINS,
> - .ops = &chv_pipe_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "dpio-common-bc",
> - .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS,
> - .ops = &chv_dpio_cmn_power_well_ops,
> - .id = VLV_DISP_PW_DPIO_CMN_BC,
> - {
> - .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
> - },
> - },
> - {
> - .name = "dpio-common-d",
> - .domains = CHV_DPIO_CMN_D_POWER_DOMAINS,
> - .ops = &chv_dpio_cmn_power_well_ops,
> - .id = CHV_DISP_PW_DPIO_CMN_D,
> - {
> - .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_D,
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc skl_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "power well 1",
> - /* Handled by the DMC firmware */
> - .always_on = true,
> - .domains = 0,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_1,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_PW_1,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "MISC IO power well",
> - /* Handled by the DMC firmware */
> - .always_on = true,
> - .domains = 0,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_MISC_IO,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_MISC_IO,
> - },
> - },
> - {
> - .name = "DC off",
> - .domains = SKL_DISPLAY_DC_OFF_POWER_DOMAINS,
> - .ops = &gen9_dc_off_power_well_ops,
> - .id = SKL_DISP_DC_OFF,
> - },
> - {
> - .name = "power well 2",
> - .domains = SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_2,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_PW_2,
> - .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
> - .hsw.has_vga = true,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DDI A/E IO power well",
> - .domains = SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_DDI_A_E,
> - },
> - },
> - {
> - .name = "DDI B IO power well",
> - .domains = SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
> - },
> - },
> - {
> - .name = "DDI C IO power well",
> - .domains = SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
> - },
> - },
> - {
> - .name = "DDI D IO power well",
> - .domains = SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_DDI_D,
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc bxt_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "power well 1",
> - /* Handled by the DMC firmware */
> - .always_on = true,
> - .domains = 0,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_1,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_PW_1,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DC off",
> - .domains = BXT_DISPLAY_DC_OFF_POWER_DOMAINS,
> - .ops = &gen9_dc_off_power_well_ops,
> - .id = SKL_DISP_DC_OFF,
> - },
> - {
> - .name = "power well 2",
> - .domains = BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_2,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_PW_2,
> - .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
> - .hsw.has_vga = true,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "dpio-common-a",
> - .domains = BXT_DPIO_CMN_A_POWER_DOMAINS,
> - .ops = &bxt_dpio_cmn_power_well_ops,
> - .id = BXT_DISP_PW_DPIO_CMN_A,
> - {
> - .bxt.phy = DPIO_PHY1,
> - },
> - },
> - {
> - .name = "dpio-common-bc",
> - .domains = BXT_DPIO_CMN_BC_POWER_DOMAINS,
> - .ops = &bxt_dpio_cmn_power_well_ops,
> - .id = VLV_DISP_PW_DPIO_CMN_BC,
> - {
> - .bxt.phy = DPIO_PHY0,
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc glk_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "power well 1",
> - /* Handled by the DMC firmware */
> - .always_on = true,
> - .domains = 0,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_1,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_PW_1,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DC off",
> - .domains = GLK_DISPLAY_DC_OFF_POWER_DOMAINS,
> - .ops = &gen9_dc_off_power_well_ops,
> - .id = SKL_DISP_DC_OFF,
> - },
> - {
> - .name = "power well 2",
> - .domains = GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_2,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_PW_2,
> - .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
> - .hsw.has_vga = true,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "dpio-common-a",
> - .domains = GLK_DPIO_CMN_A_POWER_DOMAINS,
> - .ops = &bxt_dpio_cmn_power_well_ops,
> - .id = BXT_DISP_PW_DPIO_CMN_A,
> - {
> - .bxt.phy = DPIO_PHY1,
> - },
> - },
> - {
> - .name = "dpio-common-b",
> - .domains = GLK_DPIO_CMN_B_POWER_DOMAINS,
> - .ops = &bxt_dpio_cmn_power_well_ops,
> - .id = VLV_DISP_PW_DPIO_CMN_BC,
> - {
> - .bxt.phy = DPIO_PHY0,
> - },
> - },
> - {
> - .name = "dpio-common-c",
> - .domains = GLK_DPIO_CMN_C_POWER_DOMAINS,
> - .ops = &bxt_dpio_cmn_power_well_ops,
> - .id = GLK_DISP_PW_DPIO_CMN_C,
> - {
> - .bxt.phy = DPIO_PHY2,
> - },
> - },
> - {
> - .name = "AUX A",
> - .domains = GLK_DISPLAY_AUX_A_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = GLK_PW_CTL_IDX_AUX_A,
> - },
> - },
> - {
> - .name = "AUX B",
> - .domains = GLK_DISPLAY_AUX_B_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = GLK_PW_CTL_IDX_AUX_B,
> - },
> - },
> - {
> - .name = "AUX C",
> - .domains = GLK_DISPLAY_AUX_C_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = GLK_PW_CTL_IDX_AUX_C,
> - },
> - },
> - {
> - .name = "DDI A IO power well",
> - .domains = GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = GLK_PW_CTL_IDX_DDI_A,
> - },
> - },
> - {
> - .name = "DDI B IO power well",
> - .domains = GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
> - },
> - },
> - {
> - .name = "DDI C IO power well",
> - .domains = GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc icl_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "power well 1",
> - /* Handled by the DMC firmware */
> - .always_on = true,
> - .domains = 0,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_1,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DC off",
> - .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS,
> - .ops = &gen9_dc_off_power_well_ops,
> - .id = SKL_DISP_DC_OFF,
> - },
> - {
> - .name = "power well 2",
> - .domains = ICL_PW_2_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_2,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_2,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "power well 3",
> - .domains = ICL_PW_3_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = ICL_DISP_PW_3,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_3,
> - .hsw.irq_pipe_mask = BIT(PIPE_B),
> - .hsw.has_vga = true,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DDI A IO",
> - .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> - },
> - },
> - {
> - .name = "DDI B IO",
> - .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> - },
> - },
> - {
> - .name = "DDI C IO",
> - .domains = ICL_DDI_IO_C_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
> - },
> - },
> - {
> - .name = "DDI D IO",
> - .domains = ICL_DDI_IO_D_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_D,
> - },
> - },
> - {
> - .name = "DDI E IO",
> - .domains = ICL_DDI_IO_E_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_E,
> - },
> - },
> - {
> - .name = "DDI F IO",
> - .domains = ICL_DDI_IO_F_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_F,
> - },
> - },
> - {
> - .name = "AUX A",
> - .domains = ICL_AUX_A_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> - },
> - },
> - {
> - .name = "AUX B",
> - .domains = ICL_AUX_B_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> - },
> - },
> - {
> - .name = "AUX C TC1",
> - .domains = ICL_AUX_C_TC1_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX D TC2",
> - .domains = ICL_AUX_D_TC2_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_D,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX E TC3",
> - .domains = ICL_AUX_E_TC3_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_E,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX F TC4",
> - .domains = ICL_AUX_F_TC4_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_F,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX C TBT1",
> - .domains = ICL_AUX_C_TBT1_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX D TBT2",
> - .domains = ICL_AUX_D_TBT2_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX E TBT3",
> - .domains = ICL_AUX_E_TBT3_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX F TBT4",
> - .domains = ICL_AUX_F_TBT4_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "power well 4",
> - .domains = ICL_PW_4_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_4,
> - .hsw.has_fuses = true,
> - .hsw.irq_pipe_mask = BIT(PIPE_C),
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc tgl_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "power well 1",
> - /* Handled by the DMC firmware */
> - .always_on = true,
> - .domains = 0,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_1,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DC off",
> - .domains = TGL_DISPLAY_DC_OFF_POWER_DOMAINS,
> - .ops = &gen9_dc_off_power_well_ops,
> - .id = SKL_DISP_DC_OFF,
> - },
> - {
> - .name = "power well 2",
> - .domains = TGL_PW_2_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_2,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_2,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "power well 3",
> - .domains = TGL_PW_3_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = ICL_DISP_PW_3,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_3,
> - .hsw.irq_pipe_mask = BIT(PIPE_B),
> - .hsw.has_vga = true,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DDI A IO",
> - .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> - }
> - },
> - {
> - .name = "DDI B IO",
> - .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> - }
> - },
> - {
> - .name = "DDI C IO",
> - .domains = ICL_DDI_IO_C_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
> - }
> - },
> - {
> - .name = "DDI IO TC1",
> - .domains = TGL_DDI_IO_TC1_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
> - },
> - },
> - {
> - .name = "DDI IO TC2",
> - .domains = TGL_DDI_IO_TC2_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
> - },
> - },
> - {
> - .name = "DDI IO TC3",
> - .domains = TGL_DDI_IO_TC3_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3,
> - },
> - },
> - {
> - .name = "DDI IO TC4",
> - .domains = TGL_DDI_IO_TC4_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4,
> - },
> - },
> - {
> - .name = "DDI IO TC5",
> - .domains = TGL_DDI_IO_TC5_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC5,
> - },
> - },
> - {
> - .name = "DDI IO TC6",
> - .domains = TGL_DDI_IO_TC6_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC6,
> - },
> - },
> - {
> - .name = "TC cold off",
> - .domains = TGL_TC_COLD_OFF_POWER_DOMAINS,
> - .ops = &tgl_tc_cold_off_ops,
> - .id = TGL_DISP_PW_TC_COLD_OFF,
> - },
> - {
> - .name = "AUX A",
> - .domains = TGL_AUX_A_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> - },
> - },
> - {
> - .name = "AUX B",
> - .domains = TGL_AUX_B_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> - },
> - },
> - {
> - .name = "AUX C",
> - .domains = TGL_AUX_C_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
> - },
> - },
> - {
> - .name = "AUX USBC1",
> - .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX USBC2",
> - .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX USBC3",
> - .domains = TGL_AUX_IO_USBC3_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX USBC4",
> - .domains = TGL_AUX_IO_USBC4_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX USBC5",
> - .domains = TGL_AUX_IO_USBC5_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC5,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX USBC6",
> - .domains = TGL_AUX_IO_USBC6_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC6,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX TBT1",
> - .domains = TGL_AUX_IO_TBT1_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX TBT2",
> - .domains = TGL_AUX_IO_TBT2_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX TBT3",
> - .domains = TGL_AUX_IO_TBT3_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX TBT4",
> - .domains = TGL_AUX_IO_TBT4_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX TBT5",
> - .domains = TGL_AUX_IO_TBT5_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT5,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX TBT6",
> - .domains = TGL_AUX_IO_TBT6_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT6,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "power well 4",
> - .domains = TGL_PW_4_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_4,
> - .hsw.has_fuses = true,
> - .hsw.irq_pipe_mask = BIT(PIPE_C),
> - }
> - },
> - {
> - .name = "power well 5",
> - .domains = TGL_PW_5_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_PW_5,
> - .hsw.has_fuses = true,
> - .hsw.irq_pipe_mask = BIT(PIPE_D),
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc rkl_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "power well 1",
> - /* Handled by the DMC firmware */
> - .always_on = true,
> - .domains = 0,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_1,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DC off",
> - .domains = RKL_DISPLAY_DC_OFF_POWER_DOMAINS,
> - .ops = &gen9_dc_off_power_well_ops,
> - .id = SKL_DISP_DC_OFF,
> - },
> - {
> - .name = "power well 3",
> - .domains = RKL_PW_3_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = ICL_DISP_PW_3,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_3,
> - .hsw.irq_pipe_mask = BIT(PIPE_B),
> - .hsw.has_vga = true,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "power well 4",
> - .domains = RKL_PW_4_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_4,
> - .hsw.has_fuses = true,
> - .hsw.irq_pipe_mask = BIT(PIPE_C),
> - }
> - },
> - {
> - .name = "DDI A IO",
> - .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> - }
> - },
> - {
> - .name = "DDI B IO",
> - .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> - }
> - },
> - {
> - .name = "DDI IO TC1",
> - .domains = TGL_DDI_IO_TC1_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
> - },
> - },
> - {
> - .name = "DDI IO TC2",
> - .domains = TGL_DDI_IO_TC2_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
> - },
> - },
> - {
> - .name = "AUX A",
> - .domains = ICL_AUX_A_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> - },
> - },
> - {
> - .name = "AUX B",
> - .domains = ICL_AUX_B_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> - },
> - },
> - {
> - .name = "AUX USBC1",
> - .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
> - },
> - },
> - {
> - .name = "AUX USBC2",
> - .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc dg1_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "power well 1",
> - /* Handled by the DMC firmware */
> - .always_on = true,
> - .domains = 0,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_1,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DC off",
> - .domains = DG1_DISPLAY_DC_OFF_POWER_DOMAINS,
> - .ops = &gen9_dc_off_power_well_ops,
> - .id = SKL_DISP_DC_OFF,
> - },
> - {
> - .name = "power well 2",
> - .domains = DG1_PW_2_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_2,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_2,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "power well 3",
> - .domains = DG1_PW_3_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = ICL_DISP_PW_3,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_3,
> - .hsw.irq_pipe_mask = BIT(PIPE_B),
> - .hsw.has_vga = true,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DDI A IO",
> - .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> - }
> - },
> - {
> - .name = "DDI B IO",
> - .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> - }
> - },
> - {
> - .name = "DDI IO TC1",
> - .domains = TGL_DDI_IO_TC1_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
> - },
> - },
> - {
> - .name = "DDI IO TC2",
> - .domains = TGL_DDI_IO_TC2_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
> - },
> - },
> - {
> - .name = "AUX A",
> - .domains = TGL_AUX_A_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> - },
> - },
> - {
> - .name = "AUX B",
> - .domains = TGL_AUX_B_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> - },
> - },
> - {
> - .name = "AUX USBC1",
> - .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "AUX USBC2",
> - .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
> - .hsw.is_tc_tbt = false,
> - },
> - },
> - {
> - .name = "power well 4",
> - .domains = TGL_PW_4_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_4,
> - .hsw.has_fuses = true,
> - .hsw.irq_pipe_mask = BIT(PIPE_C),
> - }
> - },
> - {
> - .name = "power well 5",
> - .domains = TGL_PW_5_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_PW_5,
> - .hsw.has_fuses = true,
> - .hsw.irq_pipe_mask = BIT(PIPE_D),
> - },
> - },
> -};
> -
> -static const struct i915_power_well_desc xelpd_power_wells[] = {
> - {
> - .name = "always-on",
> - .always_on = true,
> - .domains = POWER_DOMAIN_MASK,
> - .ops = &i9xx_always_on_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - },
> - {
> - .name = "power well 1",
> - /* Handled by the DMC firmware */
> - .always_on = true,
> - .domains = 0,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_1,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DC off",
> - .domains = XELPD_DISPLAY_DC_OFF_POWER_DOMAINS,
> - .ops = &gen9_dc_off_power_well_ops,
> - .id = SKL_DISP_DC_OFF,
> - },
> - {
> - .name = "power well 2",
> - .domains = XELPD_PW_2_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = SKL_DISP_PW_2,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_PW_2,
> - .hsw.has_vga = true,
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "power well A",
> - .domains = XELPD_PW_A_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = XELPD_PW_CTL_IDX_PW_A,
> - .hsw.irq_pipe_mask = BIT(PIPE_A),
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "power well B",
> - .domains = XELPD_PW_B_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = XELPD_PW_CTL_IDX_PW_B,
> - .hsw.irq_pipe_mask = BIT(PIPE_B),
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "power well C",
> - .domains = XELPD_PW_C_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = XELPD_PW_CTL_IDX_PW_C,
> - .hsw.irq_pipe_mask = BIT(PIPE_C),
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "power well D",
> - .domains = XELPD_PW_D_POWER_DOMAINS,
> - .ops = &hsw_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = XELPD_PW_CTL_IDX_PW_D,
> - .hsw.irq_pipe_mask = BIT(PIPE_D),
> - .hsw.has_fuses = true,
> - },
> - },
> - {
> - .name = "DDI A IO",
> - .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> - }
> - },
> - {
> - .name = "DDI B IO",
> - .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> - }
> - },
> - {
> - .name = "DDI C IO",
> - .domains = ICL_DDI_IO_C_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
> - }
> - },
> - {
> - .name = "DDI IO D_XELPD",
> - .domains = XELPD_DDI_IO_D_XELPD_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = XELPD_PW_CTL_IDX_DDI_D,
> - }
> - },
> - {
> - .name = "DDI IO E_XELPD",
> - .domains = XELPD_DDI_IO_E_XELPD_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = XELPD_PW_CTL_IDX_DDI_E,
> - }
> - },
> - {
> - .name = "DDI IO TC1",
> - .domains = XELPD_DDI_IO_TC1_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
> - }
> - },
> - {
> - .name = "DDI IO TC2",
> - .domains = XELPD_DDI_IO_TC2_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
> - }
> - },
> - {
> - .name = "DDI IO TC3",
> - .domains = XELPD_DDI_IO_TC3_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3,
> - }
> - },
> - {
> - .name = "DDI IO TC4",
> - .domains = XELPD_DDI_IO_TC4_POWER_DOMAINS,
> - .ops = &icl_ddi_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4,
> - }
> - },
> - {
> - .name = "AUX A",
> - .domains = ICL_AUX_A_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> - .hsw.fixed_enable_delay = 600,
> - },
> - },
> - {
> - .name = "AUX B",
> - .domains = ICL_AUX_B_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> - .hsw.fixed_enable_delay = 600,
> - },
> - },
> - {
> - .name = "AUX C",
> - .domains = TGL_AUX_C_IO_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
> - .hsw.fixed_enable_delay = 600,
> - },
> - },
> - {
> - .name = "AUX D_XELPD",
> - .domains = XELPD_AUX_IO_D_XELPD_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = XELPD_PW_CTL_IDX_AUX_D,
> - .hsw.fixed_enable_delay = 600,
> - },
> - },
> - {
> - .name = "AUX E_XELPD",
> - .domains = XELPD_AUX_IO_E_XELPD_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = XELPD_PW_CTL_IDX_AUX_E,
> - },
> - },
> - {
> - .name = "AUX USBC1",
> - .domains = XELPD_AUX_IO_USBC1_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
> - .hsw.fixed_enable_delay = 600,
> - },
> - },
> - {
> - .name = "AUX USBC2",
> - .domains = XELPD_AUX_IO_USBC2_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
> - },
> - },
> - {
> - .name = "AUX USBC3",
> - .domains = XELPD_AUX_IO_USBC3_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3,
> - },
> - },
> - {
> - .name = "AUX USBC4",
> - .domains = XELPD_AUX_IO_USBC4_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4,
> - },
> - },
> - {
> - .name = "AUX TBT1",
> - .domains = XELPD_AUX_IO_TBT1_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX TBT2",
> - .domains = XELPD_AUX_IO_TBT2_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX TBT3",
> - .domains = XELPD_AUX_IO_TBT3_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> - {
> - .name = "AUX TBT4",
> - .domains = XELPD_AUX_IO_TBT4_POWER_DOMAINS,
> - .ops = &icl_aux_power_well_ops,
> - .id = DISP_PW_ID_NONE,
> - {
> - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4,
> - .hsw.is_tc_tbt = true,
> - },
> - },
> -};
> -
> static int
> sanitize_disable_power_well_option(const struct drm_i915_private
> *dev_priv,
> int disable_power_well)
> @@ -3089,57 +927,6 @@ static u32 get_allowed_dc_mask(const struct
> drm_i915_private *dev_priv,
> return mask;
> }
>
> -static int
> -__set_power_wells(struct i915_power_domains *power_domains,
> - const struct i915_power_well_desc *power_well_descs,
> - int power_well_descs_sz, u64 skip_mask)
> -{
> - struct drm_i915_private *i915 = container_of(power_domains,
> - struct
> drm_i915_private,
> - power_domains);
> - u64 power_well_ids = 0;
> - int power_well_count = 0;
> - int i, plt_idx = 0;
> -
> - for (i = 0; i < power_well_descs_sz; i++)
> - if (!(BIT_ULL(power_well_descs[i].id) & skip_mask))
> - power_well_count++;
> -
> - power_domains->power_well_count = power_well_count;
> - power_domains->power_wells =
> - kcalloc(power_well_count,
> - sizeof(*power_domains-
> >power_wells),
> - GFP_KERNEL);
> - if (!power_domains->power_wells)
> - return -ENOMEM;
> -
> - for (i = 0; i < power_well_descs_sz; i++) {
> - enum i915_power_well_id id = power_well_descs[i].id;
> -
> - if (BIT_ULL(id) & skip_mask)
> - continue;
> -
> - power_domains->power_wells[plt_idx++].desc =
> - &power_well_descs[i];
> -
> - if (id == DISP_PW_ID_NONE)
> - continue;
> -
> - drm_WARN_ON(&i915->drm, id >= sizeof(power_well_ids) *
> 8);
> - drm_WARN_ON(&i915->drm, power_well_ids & BIT_ULL(id));
> - power_well_ids |= BIT_ULL(id);
> - }
> -
> - return 0;
> -}
> -
> -#define set_power_wells_mask(power_domains, __power_well_descs,
> skip_mask) \
> - __set_power_wells(power_domains, __power_well_descs, \
> - ARRAY_SIZE(__power_well_descs), skip_mask)
> -
> -#define set_power_wells(power_domains, __power_well_descs) \
> - set_power_wells_mask(power_domains, __power_well_descs, 0)
> -
> /**
> * intel_power_domains_init - initializes the power domain
> structures
> * @dev_priv: i915 device instance
> @@ -3150,7 +937,6 @@ __set_power_wells(struct i915_power_domains
> *power_domains,
> int intel_power_domains_init(struct drm_i915_private *dev_priv)
> {
> struct i915_power_domains *power_domains = &dev_priv-
> >power_domains;
> - int err;
>
> dev_priv->params.disable_power_well =
> sanitize_disable_power_well_option(dev_priv,
> @@ -3168,47 +954,7 @@ int intel_power_domains_init(struct
> drm_i915_private *dev_priv)
> INIT_DELAYED_WORK(&power_domains->async_put_work,
> intel_display_power_put_async_work);
>
> - /*
> - * The enabling order will be from lower to higher indexed
> wells,
> - * the disabling order is reversed.
> - */
> - if (!HAS_DISPLAY(dev_priv)) {
> - power_domains->power_well_count = 0;
> - err = 0;
> - } else if (DISPLAY_VER(dev_priv) >= 13) {
> - err = set_power_wells(power_domains,
> xelpd_power_wells);
> - } else if (IS_DG1(dev_priv)) {
> - err = set_power_wells(power_domains, dg1_power_wells);
> - } else if (IS_ALDERLAKE_S(dev_priv)) {
> - err = set_power_wells_mask(power_domains,
> tgl_power_wells,
> - BIT_ULL(TGL_DISP_PW_TC_COLD_
> OFF));
> - } else if (IS_ROCKETLAKE(dev_priv)) {
> - err = set_power_wells(power_domains, rkl_power_wells);
> - } else if (DISPLAY_VER(dev_priv) == 12) {
> - err = set_power_wells(power_domains, tgl_power_wells);
> - } else if (DISPLAY_VER(dev_priv) == 11) {
> - err = set_power_wells(power_domains, icl_power_wells);
> - } else if (IS_GEMINILAKE(dev_priv)) {
> - err = set_power_wells(power_domains, glk_power_wells);
> - } else if (IS_BROXTON(dev_priv)) {
> - err = set_power_wells(power_domains, bxt_power_wells);
> - } else if (DISPLAY_VER(dev_priv) == 9) {
> - err = set_power_wells(power_domains, skl_power_wells);
> - } else if (IS_CHERRYVIEW(dev_priv)) {
> - err = set_power_wells(power_domains, chv_power_wells);
> - } else if (IS_BROADWELL(dev_priv)) {
> - err = set_power_wells(power_domains, bdw_power_wells);
> - } else if (IS_HASWELL(dev_priv)) {
> - err = set_power_wells(power_domains, hsw_power_wells);
> - } else if (IS_VALLEYVIEW(dev_priv)) {
> - err = set_power_wells(power_domains, vlv_power_wells);
> - } else if (IS_I830(dev_priv)) {
> - err = set_power_wells(power_domains, i830_power_wells);
> - } else {
> - err = set_power_wells(power_domains,
> i9xx_always_on_power_well);
> - }
> -
> - return err;
> + return intel_display_power_map_init(power_domains);
> }
>
> /**
> @@ -3219,7 +965,7 @@ int intel_power_domains_init(struct
> drm_i915_private *dev_priv)
> */
> void intel_power_domains_cleanup(struct drm_i915_private *dev_priv)
> {
> - kfree(dev_priv->power_domains.power_wells);
> + intel_display_power_map_cleanup(&dev_priv->power_domains);
> }
>
> static void intel_power_domains_sync_hw(struct drm_i915_private
> *dev_priv)
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power_map.c
> b/drivers/gpu/drm/i915/display/intel_display_power_map.c
> new file mode 100644
> index 0000000000000..97e0daec95449
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_display_power_map.c
> @@ -0,0 +1,2150 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2022 Intel Corporation
> + */
> +
> +#include "i915_drv.h"
> +#include "i915_reg.h"
> +
> +#include "vlv_sideband_reg.h"
> +
> +#include "intel_display_power_map.h"
> +#include "intel_display_power_well.h"
> +
> +#define POWER_DOMAIN_MASK (GENMASK_ULL(POWER_DOMAIN_NUM - 1, 0))
> +
> +static const struct i915_power_well_desc i9xx_always_on_power_well[]
> = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + },
> +};
> +
> +#define I830_PIPES_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_A) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc i830_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "pipes",
> + .domains = I830_PIPES_POWER_DOMAINS,
> + .ops = &i830_pipes_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + },
> +};
> +
> +#define HSW_DISPLAY_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc hsw_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "display",
> + .domains = HSW_DISPLAY_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = HSW_DISP_PW_GLOBAL,
> + {
> + .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
> + .hsw.has_vga = true,
> + },
> + },
> +};
> +
> +#define BDW_DISPLAY_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc bdw_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "display",
> + .domains = BDW_DISPLAY_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = HSW_DISP_PW_GLOBAL,
> + {
> + .hsw.idx = HSW_PW_CTL_IDX_GLOBAL,
> + .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
> + .hsw.has_vga = true,
> + },
> + },
> +};
> +
> +#define VLV_DISPLAY_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_A) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DSI) | \
> + BIT_ULL(POWER_DOMAIN_PORT_CRT) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_GMBUS) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_CRT) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc vlv_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "display",
> + .domains = VLV_DISPLAY_POWER_DOMAINS,
> + .ops = &vlv_display_power_well_ops,
> + .id = VLV_DISP_PW_DISP2D,
> + {
> + .vlv.idx = PUNIT_PWGT_IDX_DISP2D,
> + },
> + }, {
> + .name = "dpio-tx-b-01",
> + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
> + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
> + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
> + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
> + .ops = &vlv_dpio_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_01,
> + },
> + }, {
> + .name = "dpio-tx-b-23",
> + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
> + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
> + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
> + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
> + .ops = &vlv_dpio_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_23,
> + },
> + }, {
> + .name = "dpio-tx-c-01",
> + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
> + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
> + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
> + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
> + .ops = &vlv_dpio_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_01,
> + },
> + }, {
> + .name = "dpio-tx-c-23",
> + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
> + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
> + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS |
> + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS,
> + .ops = &vlv_dpio_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_23,
> + },
> + }, {
> + .name = "dpio-common",
> + .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS,
> + .ops = &vlv_dpio_cmn_power_well_ops,
> + .id = VLV_DISP_PW_DPIO_CMN_BC,
> + {
> + .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
> + },
> + },
> +};
> +
> +#define CHV_DISPLAY_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_A) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DSI) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_AUX_D) | \
> + BIT_ULL(POWER_DOMAIN_GMBUS) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define CHV_DPIO_CMN_D_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_D) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc chv_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "display",
> + /*
> + * Pipe A power well is the new disp2d well. Pipe B and
> C
> + * power wells don't actually exist. Pipe A power well
> is
> + * required for any pipe to work.
> + */
> + .domains = CHV_DISPLAY_POWER_DOMAINS,
> + .ops = &chv_pipe_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "dpio-common-bc",
> + .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS,
> + .ops = &chv_dpio_cmn_power_well_ops,
> + .id = VLV_DISP_PW_DPIO_CMN_BC,
> + {
> + .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC,
> + },
> + }, {
> + .name = "dpio-common-d",
> + .domains = CHV_DPIO_CMN_D_POWER_DOMAINS,
> + .ops = &chv_dpio_cmn_power_well_ops,
> + .id = CHV_DISP_PW_DPIO_CMN_D,
> + {
> + .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_D,
> + },
> + },
> +};
> +
> +#define SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_AUX_D) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define SKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> + SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_MODESET) | \
> + BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc skl_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "power well 1",
> + /* Handled by the DMC firmware */
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .always_on = true,
> + .id = SKL_DISP_PW_1,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_PW_1,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "MISC IO power well",
> + /* Handled by the DMC firmware */
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .always_on = true,
> + .id = SKL_DISP_PW_MISC_IO,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_MISC_IO,
> + },
> + }, {
> + .name = "DC off",
> + .domains = SKL_DISPLAY_DC_OFF_POWER_DOMAINS,
> + .ops = &gen9_dc_off_power_well_ops,
> + .id = SKL_DISP_DC_OFF,
> + }, {
> + .name = "power well 2",
> + .domains = SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = SKL_DISP_PW_2,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_PW_2,
> + .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
> + .hsw.has_vga = true,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DDI A/E IO power well",
> + .domains = SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_DDI_A_E,
> + },
> + }, {
> + .name = "DDI B IO power well",
> + .domains = SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
> + },
> + }, {
> + .name = "DDI C IO power well",
> + .domains = SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
> + },
> + }, {
> + .name = "DDI D IO power well",
> + .domains = SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_DDI_D,
> + },
> + },
> +};
> +
> +#define BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define BXT_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> + BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_GMBUS) | \
> + BIT_ULL(POWER_DOMAIN_MODESET) | \
> + BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define BXT_DPIO_CMN_A_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define BXT_DPIO_CMN_BC_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc bxt_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "power well 1",
> + /* Handled by the DMC firmware */
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .always_on = true,
> + .id = SKL_DISP_PW_1,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_PW_1,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DC off",
> + .domains = BXT_DISPLAY_DC_OFF_POWER_DOMAINS,
> + .ops = &gen9_dc_off_power_well_ops,
> + .id = SKL_DISP_DC_OFF,
> + }, {
> + .name = "power well 2",
> + .domains = BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = SKL_DISP_PW_2,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_PW_2,
> + .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
> + .hsw.has_vga = true,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "dpio-common-a",
> + .domains = BXT_DPIO_CMN_A_POWER_DOMAINS,
> + .ops = &bxt_dpio_cmn_power_well_ops,
> + .id = BXT_DISP_PW_DPIO_CMN_A,
> + {
> + .bxt.phy = DPIO_PHY1,
> + },
> + }, {
> + .name = "dpio-common-bc",
> + .domains = BXT_DPIO_CMN_BC_POWER_DOMAINS,
> + .ops = &bxt_dpio_cmn_power_well_ops,
> + .id = VLV_DISP_PW_DPIO_CMN_BC,
> + {
> + .bxt.phy = DPIO_PHY0,
> + },
> + },
> +};
> +
> +#define GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define GLK_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> + GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_GMBUS) | \
> + BIT_ULL(POWER_DOMAIN_MODESET) | \
> + BIT_ULL(POWER_DOMAIN_GT_IRQ) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_A_IO)
> +#define GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_B_IO)
> +#define GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_C_IO)
> +
> +#define GLK_DPIO_CMN_A_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define GLK_DPIO_CMN_B_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define GLK_DPIO_CMN_C_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define GLK_DISPLAY_AUX_A_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define GLK_DISPLAY_AUX_B_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define GLK_DISPLAY_AUX_C_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc glk_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "power well 1",
> + /* Handled by the DMC firmware */
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .always_on = true,
> + .id = SKL_DISP_PW_1,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_PW_1,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DC off",
> + .domains = GLK_DISPLAY_DC_OFF_POWER_DOMAINS,
> + .ops = &gen9_dc_off_power_well_ops,
> + .id = SKL_DISP_DC_OFF,
> + }, {
> + .name = "power well 2",
> + .domains = GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = SKL_DISP_PW_2,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_PW_2,
> + .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C),
> + .hsw.has_vga = true,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "dpio-common-a",
> + .domains = GLK_DPIO_CMN_A_POWER_DOMAINS,
> + .ops = &bxt_dpio_cmn_power_well_ops,
> + .id = BXT_DISP_PW_DPIO_CMN_A,
> + {
> + .bxt.phy = DPIO_PHY1,
> + },
> + }, {
> + .name = "dpio-common-b",
> + .domains = GLK_DPIO_CMN_B_POWER_DOMAINS,
> + .ops = &bxt_dpio_cmn_power_well_ops,
> + .id = VLV_DISP_PW_DPIO_CMN_BC,
> + {
> + .bxt.phy = DPIO_PHY0,
> + },
> + }, {
> + .name = "dpio-common-c",
> + .domains = GLK_DPIO_CMN_C_POWER_DOMAINS,
> + .ops = &bxt_dpio_cmn_power_well_ops,
> + .id = GLK_DISP_PW_DPIO_CMN_C,
> + {
> + .bxt.phy = DPIO_PHY2,
> + },
> + }, {
> + .name = "AUX A",
> + .domains = GLK_DISPLAY_AUX_A_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = GLK_PW_CTL_IDX_AUX_A,
> + },
> + }, {
> + .name = "AUX B",
> + .domains = GLK_DISPLAY_AUX_B_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = GLK_PW_CTL_IDX_AUX_B,
> + },
> + }, {
> + .name = "AUX C",
> + .domains = GLK_DISPLAY_AUX_C_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = GLK_PW_CTL_IDX_AUX_C,
> + },
> + }, {
> + .name = "DDI A IO power well",
> + .domains = GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = GLK_PW_CTL_IDX_DDI_A,
> + },
> + }, {
> + .name = "DDI B IO power well",
> + .domains = GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_DDI_B,
> + },
> + }, {
> + .name = "DDI C IO power well",
> + .domains = GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = SKL_PW_CTL_IDX_DDI_C,
> + },
> + },
> +};
> +
> +/*
> + * ICL PW_0/PG_0 domains (HW/DMC control):
> + * - PCI
> + * - clocks except port PLL
> + * - central power except FBC
> + * - shared functions except pipe interrupts, pipe MBUS, DBUF
> registers
> + * ICL PW_1/PG_1 domains (HW/DMC control):
> + * - DBUF function
> + * - PIPE_A and its planes, except VGA
> + * - transcoder EDP + PSR
> + * - transcoder DSI
> + * - DDI_A
> + * - FBC
> + */
> +#define ICL_PW_4_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> + /* VDSC/joining */
> +
> +#define ICL_PW_3_POWER_DOMAINS ( \
> + ICL_PW_4_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_F_LANES) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_AUX_D) | \
> + BIT_ULL(POWER_DOMAIN_AUX_E) | \
> + BIT_ULL(POWER_DOMAIN_AUX_F) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C_TBT) | \
> + BIT_ULL(POWER_DOMAIN_AUX_D_TBT) | \
> + BIT_ULL(POWER_DOMAIN_AUX_E_TBT) | \
> + BIT_ULL(POWER_DOMAIN_AUX_F_TBT) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> + /*
> + * - transcoder WD
> + * - KVMR (HW control)
> + */
> +
> +#define ICL_PW_2_POWER_DOMAINS ( \
> + ICL_PW_3_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> + /*
> + * - KVMR (HW control)
> + */
> +
> +#define ICL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> + ICL_PW_2_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_MODESET) | \
> + BIT_ULL(POWER_DOMAIN_DC_OFF) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define ICL_DDI_IO_A_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_A_IO)
> +#define ICL_DDI_IO_B_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_B_IO)
> +#define ICL_DDI_IO_C_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_C_IO)
> +#define ICL_DDI_IO_D_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_D_IO)
> +#define ICL_DDI_IO_E_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_E_IO)
> +#define ICL_DDI_IO_F_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_F_IO)
> +
> +#define ICL_AUX_A_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_AUX_IO_A))
> +
> +#define ICL_AUX_B_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_B)
> +#define ICL_AUX_C_TC1_IO_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_C)
> +#define ICL_AUX_D_TC2_IO_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_D)
> +#define ICL_AUX_E_TC3_IO_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_E)
> +#define ICL_AUX_F_TC4_IO_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_F)
> +#define ICL_AUX_C_TBT1_IO_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_C_TBT)
> +#define ICL_AUX_D_TBT2_IO_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_D_TBT)
> +#define ICL_AUX_E_TBT3_IO_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_E_TBT)
> +#define ICL_AUX_F_TBT4_IO_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_F_TBT)
> +
> +static const struct i915_power_well_desc icl_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "power well 1",
> + /* Handled by the DMC firmware */
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .always_on = true,
> + .id = SKL_DISP_PW_1,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DC off",
> + .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS,
> + .ops = &gen9_dc_off_power_well_ops,
> + .id = SKL_DISP_DC_OFF,
> + }, {
> + .name = "power well 2",
> + .domains = ICL_PW_2_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = SKL_DISP_PW_2,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_2,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "power well 3",
> + .domains = ICL_PW_3_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = ICL_DISP_PW_3,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_3,
> + .hsw.irq_pipe_mask = BIT(PIPE_B),
> + .hsw.has_vga = true,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DDI A IO",
> + .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> + },
> + }, {
> + .name = "DDI B IO",
> + .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> + },
> + }, {
> + .name = "DDI C IO",
> + .domains = ICL_DDI_IO_C_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
> + },
> + }, {
> + .name = "DDI D IO",
> + .domains = ICL_DDI_IO_D_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_D,
> + },
> + }, {
> + .name = "DDI E IO",
> + .domains = ICL_DDI_IO_E_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_E,
> + },
> + }, {
> + .name = "DDI F IO",
> + .domains = ICL_DDI_IO_F_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_F,
> + },
> + }, {
> + .name = "AUX A",
> + .domains = ICL_AUX_A_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> + },
> + }, {
> + .name = "AUX B",
> + .domains = ICL_AUX_B_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> + },
> + }, {
> + .name = "AUX C TC1",
> + .domains = ICL_AUX_C_TC1_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX D TC2",
> + .domains = ICL_AUX_D_TC2_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_D,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX E TC3",
> + .domains = ICL_AUX_E_TC3_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_E,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX F TC4",
> + .domains = ICL_AUX_F_TC4_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_F,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX C TBT1",
> + .domains = ICL_AUX_C_TBT1_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX D TBT2",
> + .domains = ICL_AUX_D_TBT2_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX E TBT3",
> + .domains = ICL_AUX_E_TBT3_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX F TBT4",
> + .domains = ICL_AUX_F_TBT4_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "power well 4",
> + .domains = ICL_PW_4_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_4,
> + .hsw.has_fuses = true,
> + .hsw.irq_pipe_mask = BIT(PIPE_C),
> + },
> + },
> +};
> +
> +#define TGL_PW_5_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_D) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_D_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_D) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define TGL_PW_4_POWER_DOMAINS ( \
> + TGL_PW_5_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define TGL_PW_3_POWER_DOMAINS ( \
> + TGL_PW_4_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC3) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC4) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC5) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC6) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC5) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC6) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT5) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT6) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define TGL_PW_2_POWER_DOMAINS ( \
> + TGL_PW_3_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define TGL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> + TGL_PW_3_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_MODESET) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define TGL_DDI_IO_TC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC1)
> +#define TGL_DDI_IO_TC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC2)
> +#define TGL_DDI_IO_TC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC3)
> +#define TGL_DDI_IO_TC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC4)
> +#define TGL_DDI_IO_TC5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC5)
> +#define TGL_DDI_IO_TC6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_I
> O_TC6)
> +
> +#define TGL_AUX_A_IO_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_AUX_IO_A))
> +#define TGL_AUX_B_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_B)
> +#define TGL_AUX_C_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_C)
> +
> +#define TGL_AUX_IO_USBC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC1)
> +#define TGL_AUX_IO_USBC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC2)
> +#define TGL_AUX_IO_USBC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC3)
> +#define TGL_AUX_IO_USBC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC4)
> +#define TGL_AUX_IO_USBC5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC5)
> +#define TGL_AUX_IO_USBC6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC6)
> +
> +#define TGL_AUX_IO_TBT1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT1)
> +#define TGL_AUX_IO_TBT2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT2)
> +#define TGL_AUX_IO_TBT3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT3)
> +#define TGL_AUX_IO_TBT4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT4)
> +#define TGL_AUX_IO_TBT5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT5)
> +#define TGL_AUX_IO_TBT6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_TBT6)
> +
> +#define TGL_TC_COLD_OFF_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC5) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC6) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT5) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT6) | \
> + BIT_ULL(POWER_DOMAIN_TC_COLD_OFF))
> +
> +static const struct i915_power_well_desc tgl_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "power well 1",
> + /* Handled by the DMC firmware */
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .always_on = true,
> + .id = SKL_DISP_PW_1,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DC off",
> + .domains = TGL_DISPLAY_DC_OFF_POWER_DOMAINS,
> + .ops = &gen9_dc_off_power_well_ops,
> + .id = SKL_DISP_DC_OFF,
> + }, {
> + .name = "power well 2",
> + .domains = TGL_PW_2_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = SKL_DISP_PW_2,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_2,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "power well 3",
> + .domains = TGL_PW_3_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = ICL_DISP_PW_3,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_3,
> + .hsw.irq_pipe_mask = BIT(PIPE_B),
> + .hsw.has_vga = true,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DDI A IO",
> + .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> + }
> + }, {
> + .name = "DDI B IO",
> + .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> + }
> + }, {
> + .name = "DDI C IO",
> + .domains = ICL_DDI_IO_C_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
> + }
> + }, {
> + .name = "DDI IO TC1",
> + .domains = TGL_DDI_IO_TC1_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
> + },
> + }, {
> + .name = "DDI IO TC2",
> + .domains = TGL_DDI_IO_TC2_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
> + },
> + }, {
> + .name = "DDI IO TC3",
> + .domains = TGL_DDI_IO_TC3_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3,
> + },
> + }, {
> + .name = "DDI IO TC4",
> + .domains = TGL_DDI_IO_TC4_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4,
> + },
> + }, {
> + .name = "DDI IO TC5",
> + .domains = TGL_DDI_IO_TC5_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC5,
> + },
> + }, {
> + .name = "DDI IO TC6",
> + .domains = TGL_DDI_IO_TC6_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC6,
> + },
> + }, {
> + .name = "TC cold off",
> + .domains = TGL_TC_COLD_OFF_POWER_DOMAINS,
> + .ops = &tgl_tc_cold_off_ops,
> + .id = TGL_DISP_PW_TC_COLD_OFF,
> + }, {
> + .name = "AUX A",
> + .domains = TGL_AUX_A_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> + },
> + }, {
> + .name = "AUX B",
> + .domains = TGL_AUX_B_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> + },
> + }, {
> + .name = "AUX C",
> + .domains = TGL_AUX_C_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
> + },
> + }, {
> + .name = "AUX USBC1",
> + .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX USBC2",
> + .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX USBC3",
> + .domains = TGL_AUX_IO_USBC3_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX USBC4",
> + .domains = TGL_AUX_IO_USBC4_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX USBC5",
> + .domains = TGL_AUX_IO_USBC5_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC5,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX USBC6",
> + .domains = TGL_AUX_IO_USBC6_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC6,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX TBT1",
> + .domains = TGL_AUX_IO_TBT1_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX TBT2",
> + .domains = TGL_AUX_IO_TBT2_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX TBT3",
> + .domains = TGL_AUX_IO_TBT3_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX TBT4",
> + .domains = TGL_AUX_IO_TBT4_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX TBT5",
> + .domains = TGL_AUX_IO_TBT5_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT5,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX TBT6",
> + .domains = TGL_AUX_IO_TBT6_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT6,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "power well 4",
> + .domains = TGL_PW_4_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_4,
> + .hsw.has_fuses = true,
> + .hsw.irq_pipe_mask = BIT(PIPE_C),
> + }
> + }, {
> + .name = "power well 5",
> + .domains = TGL_PW_5_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_PW_5,
> + .hsw.has_fuses = true,
> + .hsw.irq_pipe_mask = BIT(PIPE_D),
> + },
> + },
> +};
> +
> +#define RKL_PW_4_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define RKL_PW_3_POWER_DOMAINS ( \
> + RKL_PW_4_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +/*
> + * There is no PW_2/PG_2 on RKL.
> + *
> + * RKL PW_1/PG_1 domains (under HW/DMC control):
> + * - DBUF function (note: registers are in PW0)
> + * - PIPE_A and its planes and VDSC/joining, except VGA
> + * - transcoder A
> + * - DDI_A and DDI_B
> + * - FBC
> + *
> + * RKL PW_0/PG_0 domains (under HW/DMC control):
> + * - PCI
> + * - clocks except port PLL
> + * - shared functions:
> + * * interrupts except pipe interrupts
> + * * MBus except PIPE_MBUS_DBOX_CTL
> + * * DBUF registers
> + * - central power except FBC
> + * - top-level GTC (DDI-level GTC is in the well associated with the
> DDI)
> + */
> +
> +#define RKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> + RKL_PW_3_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_MODESET) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc rkl_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "power well 1",
> + /* Handled by the DMC firmware */
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .always_on = true,
> + .id = SKL_DISP_PW_1,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DC off",
> + .domains = RKL_DISPLAY_DC_OFF_POWER_DOMAINS,
> + .ops = &gen9_dc_off_power_well_ops,
> + .id = SKL_DISP_DC_OFF,
> + }, {
> + .name = "power well 3",
> + .domains = RKL_PW_3_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = ICL_DISP_PW_3,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_3,
> + .hsw.irq_pipe_mask = BIT(PIPE_B),
> + .hsw.has_vga = true,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "power well 4",
> + .domains = RKL_PW_4_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_4,
> + .hsw.has_fuses = true,
> + .hsw.irq_pipe_mask = BIT(PIPE_C),
> + }
> + }, {
> + .name = "DDI A IO",
> + .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> + }
> + }, {
> + .name = "DDI B IO",
> + .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> + }
> + }, {
> + .name = "DDI IO TC1",
> + .domains = TGL_DDI_IO_TC1_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
> + },
> + }, {
> + .name = "DDI IO TC2",
> + .domains = TGL_DDI_IO_TC2_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
> + },
> + }, {
> + .name = "AUX A",
> + .domains = ICL_AUX_A_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> + },
> + }, {
> + .name = "AUX B",
> + .domains = ICL_AUX_B_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> + },
> + }, {
> + .name = "AUX USBC1",
> + .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
> + },
> + }, {
> + .name = "AUX USBC2",
> + .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
> + },
> + },
> +};
> +
> +/*
> + * DG1 onwards Audio MMIO/VERBS lies in PG0 power well.
> + */
> +#define DG1_PW_3_POWER_DOMAINS ( \
> + TGL_PW_4_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define DG1_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> + DG1_PW_3_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_MODESET) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define DG1_PW_2_POWER_DOMAINS ( \
> + DG1_PW_3_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +static const struct i915_power_well_desc dg1_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "power well 1",
> + /* Handled by the DMC firmware */
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .always_on = true,
> + .id = SKL_DISP_PW_1,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DC off",
> + .domains = DG1_DISPLAY_DC_OFF_POWER_DOMAINS,
> + .ops = &gen9_dc_off_power_well_ops,
> + .id = SKL_DISP_DC_OFF,
> + }, {
> + .name = "power well 2",
> + .domains = DG1_PW_2_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = SKL_DISP_PW_2,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_2,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "power well 3",
> + .domains = DG1_PW_3_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = ICL_DISP_PW_3,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_3,
> + .hsw.irq_pipe_mask = BIT(PIPE_B),
> + .hsw.has_vga = true,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DDI A IO",
> + .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> + }
> + }, {
> + .name = "DDI B IO",
> + .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> + }
> + }, {
> + .name = "DDI IO TC1",
> + .domains = TGL_DDI_IO_TC1_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
> + },
> + }, {
> + .name = "DDI IO TC2",
> + .domains = TGL_DDI_IO_TC2_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
> + },
> + }, {
> + .name = "AUX A",
> + .domains = TGL_AUX_A_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> + },
> + }, {
> + .name = "AUX B",
> + .domains = TGL_AUX_B_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> + },
> + }, {
> + .name = "AUX USBC1",
> + .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "AUX USBC2",
> + .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
> + .hsw.is_tc_tbt = false,
> + },
> + }, {
> + .name = "power well 4",
> + .domains = TGL_PW_4_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_4,
> + .hsw.has_fuses = true,
> + .hsw.irq_pipe_mask = BIT(PIPE_C),
> + }
> + }, {
> + .name = "power well 5",
> + .domains = TGL_PW_5_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_PW_5,
> + .hsw.has_fuses = true,
> + .hsw.irq_pipe_mask = BIT(PIPE_D),
> + },
> + },
> +};
> +
> +/*
> + * XE_LPD Power Domains
> + *
> + * Previous platforms required that PG(n-1) be enabled before
> PG(n). That
> + * dependency chain turns into a dependency tree on XE_LPD:
> + *
> + * PG0
> + * |
> + * --PG1--
> + * / \
> + * PGA --PG2--
> + * / | \
> + * PGB PGC PGD
> + *
> + * Power wells must be enabled from top to bottom and disabled from
> bottom
> + * to top. This allows pipes to be power gated independently.
> + */
> +
> +#define XELPD_PW_D_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_D) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_D_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_D) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define XELPD_PW_C_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_C) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define XELPD_PW_B_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_B) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define XELPD_PW_A_POWER_DOMAINS ( \
> + BIT_ULL(POWER_DOMAIN_PIPE_A) | \
> + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define XELPD_PW_2_POWER_DOMAINS ( \
> + XELPD_PW_B_POWER_DOMAINS | \
> + XELPD_PW_C_POWER_DOMAINS | \
> + XELPD_PW_D_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_D_XELPD) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_E_XELPD) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC3) | \
> + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC4) | \
> + BIT_ULL(POWER_DOMAIN_VGA) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \
> + BIT_ULL(POWER_DOMAIN_AUX_C) | \
> + BIT_ULL(POWER_DOMAIN_AUX_D_XELPD) | \
> + BIT_ULL(POWER_DOMAIN_AUX_E_XELPD) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \
> + BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \
> + BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +/*
> + * XELPD PW_1/PG_1 domains (under HW/DMC control):
> + * - DBUF function (registers are in PW0)
> + * - Transcoder A
> + * - DDI_A and DDI_B
> + *
> + * XELPD PW_0/PW_1 domains (under HW/DMC control):
> + * - PCI
> + * - Clocks except port PLL
> + * - Shared functions:
> + * * interrupts except pipe interrupts
> + * * MBus except PIPE_MBUS_DBOX_CTL
> + * * DBUF registers
> + * - Central power except FBC
> + * - Top-level GTC (DDI-level GTC is in the well associated with
> the DDI)
> + */
> +
> +#define XELPD_DISPLAY_DC_OFF_POWER_DOMAINS ( \
> + XELPD_PW_2_POWER_DOMAINS | \
> + BIT_ULL(POWER_DOMAIN_PORT_DSI) | \
> + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \
> + BIT_ULL(POWER_DOMAIN_AUX_A) | \
> + BIT_ULL(POWER_DOMAIN_AUX_B) | \
> + BIT_ULL(POWER_DOMAIN_MODESET) | \
> + BIT_ULL(POWER_DOMAIN_INIT))
> +
> +#define XELPD_AUX_IO_D_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_D_XELPD)
> +#define XELPD_AUX_IO_E_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_E_XELPD)
> +#define XELPD_AUX_IO_USBC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC1)
> +#define XELPD_AUX_IO_USBC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC2)
> +#define XELPD_AUX_IO_USBC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC3)
> +#define XELPD_AUX_IO_USBC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AU
> X_USBC4)
> +
> +#define XELPD_AUX_IO_TBT1_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_TBT1)
> +#define XELPD_AUX_IO_TBT2_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_TBT2)
> +#define XELPD_AUX_IO_TBT3_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_TBT3)
> +#define XELPD_AUX_IO_TBT4_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_AUX_TBT4)
> +
> +#define XELPD_DDI_IO_D_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_IO_D_XELPD)
> +#define XELPD_DDI_IO_E_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PO
> RT_DDI_IO_E_XELPD)
> +#define XELPD_DDI_IO_TC1_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_PORT_DDI_IO_TC1)
> +#define XELPD_DDI_IO_TC2_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_PORT_DDI_IO_TC2)
> +#define XELPD_DDI_IO_TC3_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_PORT_DDI_IO_TC3)
> +#define XELPD_DDI_IO_TC4_POWER_DOMAINS BIT_ULL(POWER_D
> OMAIN_PORT_DDI_IO_TC4)
> +
> +static const struct i915_power_well_desc xelpd_power_wells[] = {
> + {
> + .name = "always-on",
> + .domains = POWER_DOMAIN_MASK,
> + .ops = &i9xx_always_on_power_well_ops,
> + .always_on = true,
> + .id = DISP_PW_ID_NONE,
> + }, {
> + .name = "power well 1",
> + /* Handled by the DMC firmware */
> + .domains = 0,
> + .ops = &hsw_power_well_ops,
> + .always_on = true,
> + .id = SKL_DISP_PW_1,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_1,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DC off",
> + .domains = XELPD_DISPLAY_DC_OFF_POWER_DOMAINS,
> + .ops = &gen9_dc_off_power_well_ops,
> + .id = SKL_DISP_DC_OFF,
> + }, {
> + .name = "power well 2",
> + .domains = XELPD_PW_2_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = SKL_DISP_PW_2,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_PW_2,
> + .hsw.has_vga = true,
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "power well A",
> + .domains = XELPD_PW_A_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = XELPD_PW_CTL_IDX_PW_A,
> + .hsw.irq_pipe_mask = BIT(PIPE_A),
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "power well B",
> + .domains = XELPD_PW_B_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = XELPD_PW_CTL_IDX_PW_B,
> + .hsw.irq_pipe_mask = BIT(PIPE_B),
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "power well C",
> + .domains = XELPD_PW_C_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = XELPD_PW_CTL_IDX_PW_C,
> + .hsw.irq_pipe_mask = BIT(PIPE_C),
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "power well D",
> + .domains = XELPD_PW_D_POWER_DOMAINS,
> + .ops = &hsw_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = XELPD_PW_CTL_IDX_PW_D,
> + .hsw.irq_pipe_mask = BIT(PIPE_D),
> + .hsw.has_fuses = true,
> + },
> + }, {
> + .name = "DDI A IO",
> + .domains = ICL_DDI_IO_A_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
> + }
> + }, {
> + .name = "DDI B IO",
> + .domains = ICL_DDI_IO_B_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
> + }
> + }, {
> + .name = "DDI C IO",
> + .domains = ICL_DDI_IO_C_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
> + }
> + }, {
> + .name = "DDI IO D_XELPD",
> + .domains = XELPD_DDI_IO_D_XELPD_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = XELPD_PW_CTL_IDX_DDI_D,
> + }
> + }, {
> + .name = "DDI IO E_XELPD",
> + .domains = XELPD_DDI_IO_E_XELPD_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = XELPD_PW_CTL_IDX_DDI_E,
> + }
> + }, {
> + .name = "DDI IO TC1",
> + .domains = XELPD_DDI_IO_TC1_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
> + }
> + }, {
> + .name = "DDI IO TC2",
> + .domains = XELPD_DDI_IO_TC2_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
> + }
> + }, {
> + .name = "DDI IO TC3",
> + .domains = XELPD_DDI_IO_TC3_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3,
> + }
> + }, {
> + .name = "DDI IO TC4",
> + .domains = XELPD_DDI_IO_TC4_POWER_DOMAINS,
> + .ops = &icl_ddi_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4,
> + }
> + }, {
> + .name = "AUX A",
> + .domains = ICL_AUX_A_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_A,
> + .hsw.fixed_enable_delay = 600,
> + },
> + }, {
> + .name = "AUX B",
> + .domains = ICL_AUX_B_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_B,
> + .hsw.fixed_enable_delay = 600,
> + },
> + }, {
> + .name = "AUX C",
> + .domains = TGL_AUX_C_IO_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
> + .hsw.fixed_enable_delay = 600,
> + },
> + }, {
> + .name = "AUX D_XELPD",
> + .domains = XELPD_AUX_IO_D_XELPD_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = XELPD_PW_CTL_IDX_AUX_D,
> + .hsw.fixed_enable_delay = 600,
> + },
> + }, {
> + .name = "AUX E_XELPD",
> + .domains = XELPD_AUX_IO_E_XELPD_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = XELPD_PW_CTL_IDX_AUX_E,
> + },
> + }, {
> + .name = "AUX USBC1",
> + .domains = XELPD_AUX_IO_USBC1_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1,
> + .hsw.fixed_enable_delay = 600,
> + },
> + }, {
> + .name = "AUX USBC2",
> + .domains = XELPD_AUX_IO_USBC2_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
> + },
> + }, {
> + .name = "AUX USBC3",
> + .domains = XELPD_AUX_IO_USBC3_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3,
> + },
> + }, {
> + .name = "AUX USBC4",
> + .domains = XELPD_AUX_IO_USBC4_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4,
> + },
> + }, {
> + .name = "AUX TBT1",
> + .domains = XELPD_AUX_IO_TBT1_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX TBT2",
> + .domains = XELPD_AUX_IO_TBT2_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX TBT3",
> + .domains = XELPD_AUX_IO_TBT3_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3,
> + .hsw.is_tc_tbt = true,
> + },
> + }, {
> + .name = "AUX TBT4",
> + .domains = XELPD_AUX_IO_TBT4_POWER_DOMAINS,
> + .ops = &icl_aux_power_well_ops,
> + .id = DISP_PW_ID_NONE,
> + {
> + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4,
> + .hsw.is_tc_tbt = true,
> + },
> + },
> +};
> +
> +static int
> +__set_power_wells(struct i915_power_domains *power_domains,
> + const struct i915_power_well_desc *power_well_descs,
> + int power_well_descs_sz, u64 skip_mask)
> +{
> + struct drm_i915_private *i915 = container_of(power_domains,
> + struct
> drm_i915_private,
> + power_domains);
> + u64 power_well_ids = 0;
> + int power_well_count = 0;
> + int i, plt_idx = 0;
> +
> + for (i = 0; i < power_well_descs_sz; i++)
> + if (!(BIT_ULL(power_well_descs[i].id) & skip_mask))
> + power_well_count++;
> +
> + power_domains->power_well_count = power_well_count;
> + power_domains->power_wells =
> + kcalloc(power_well_count,
> + sizeof(*power_domains-
> >power_wells),
> + GFP_KERNEL);
> + if (!power_domains->power_wells)
> + return -ENOMEM;
> +
> + for (i = 0; i < power_well_descs_sz; i++) {
> + enum i915_power_well_id id = power_well_descs[i].id;
> +
> + if (BIT_ULL(id) & skip_mask)
> + continue;
> +
> + power_domains->power_wells[plt_idx++].desc =
> + &power_well_descs[i];
> +
> + if (id == DISP_PW_ID_NONE)
> + continue;
> +
> + drm_WARN_ON(&i915->drm, id >= sizeof(power_well_ids) *
> 8);
> + drm_WARN_ON(&i915->drm, power_well_ids & BIT_ULL(id));
> + power_well_ids |= BIT_ULL(id);
> + }
> +
> + return 0;
> +}
> +
> +#define set_power_wells_mask(power_domains, __power_well_descs,
> skip_mask) \
> + __set_power_wells(power_domains, __power_well_descs, \
> + ARRAY_SIZE(__power_well_descs), skip_mask)
> +
> +#define set_power_wells(power_domains, __power_well_descs) \
> + set_power_wells_mask(power_domains, __power_well_descs, 0)
> +
> +/**
> + * intel_display_power_map_init - initialize power domain -> power
> well mappings
> + * @power_domains: power domain state
> + *
> + * Creates all the power wells for the current platform, initializes
> the
> + * dynamic state for them and initializes the mapping of each power
> well to
> + * all the power domains the power well belongs to.
> + */
> +int intel_display_power_map_init(struct i915_power_domains
> *power_domains)
> +{
> + struct drm_i915_private *i915 = container_of(power_domains,
> + struct
> drm_i915_private,
> + power_domains);
> + /*
> + * The enabling order will be from lower to higher indexed
> wells,
> + * the disabling order is reversed.
> + */
> + if (!HAS_DISPLAY(i915)) {
> + power_domains->power_well_count = 0;
> + return 0;
> + }
> +
> + if (DISPLAY_VER(i915) >= 13)
> + return set_power_wells(power_domains,
> xelpd_power_wells);
> + else if (IS_DG1(i915))
> + return set_power_wells(power_domains, dg1_power_wells);
> + else if (IS_ALDERLAKE_S(i915))
> + return set_power_wells_mask(power_domains,
> tgl_power_wells,
> + BIT_ULL(TGL_DISP_PW_TC_COLD_
> OFF));
> + else if (IS_ROCKETLAKE(i915))
> + return set_power_wells(power_domains, rkl_power_wells);
> + else if (DISPLAY_VER(i915) == 12)
> + return set_power_wells(power_domains, tgl_power_wells);
> + else if (DISPLAY_VER(i915) == 11)
> + return set_power_wells(power_domains, icl_power_wells);
> + else if (IS_GEMINILAKE(i915))
> + return set_power_wells(power_domains, glk_power_wells);
> + else if (IS_BROXTON(i915))
> + return set_power_wells(power_domains, bxt_power_wells);
> + else if (DISPLAY_VER(i915) == 9)
> + return set_power_wells(power_domains, skl_power_wells);
> + else if (IS_CHERRYVIEW(i915))
> + return set_power_wells(power_domains, chv_power_wells);
> + else if (IS_BROADWELL(i915))
> + return set_power_wells(power_domains, bdw_power_wells);
> + else if (IS_HASWELL(i915))
> + return set_power_wells(power_domains, hsw_power_wells);
> + else if (IS_VALLEYVIEW(i915))
> + return set_power_wells(power_domains, vlv_power_wells);
> + else if (IS_I830(i915))
> + return set_power_wells(power_domains,
> i830_power_wells);
> + else
> + return set_power_wells(power_domains,
> i9xx_always_on_power_well);
> +}
> +
> +/**
> + * intel_display_power_map_cleanup - clean up power domain -> power
> well mappings
> + * @power_domains: power domain state
> + *
> + * Cleans up all the state that was initialized by
> intel_display_power_map_init().
> + */
> +void intel_display_power_map_cleanup(struct i915_power_domains
> *power_domains)
> +{
> + kfree(power_domains->power_wells);
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power_map.h
> b/drivers/gpu/drm/i915/display/intel_display_power_map.h
> new file mode 100644
> index 0000000000000..da8f7055a44c6
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_display_power_map.h
> @@ -0,0 +1,14 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2022 Intel Corporation
> + */
> +
> +#ifndef __INTEL_DISPLAY_POWER_MAP_H__
> +#define __INTEL_DISPLAY_POWER_MAP_H__
> +
> +struct i915_power_domains;
> +
> +int intel_display_power_map_init(struct i915_power_domains
> *power_domains);
> +void intel_display_power_map_cleanup(struct i915_power_domains
> *power_domains);
> +
> +#endif
More information about the Intel-gfx
mailing list