drm/i915/xelpd: Add XE_LPD power wells
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / display / intel_display_power.c
index c11c37c..ec55616 100644 (file)
@@ -11,6 +11,7 @@
 #include "intel_combo_phy.h"
 #include "intel_csr.h"
 #include "intel_display_power.h"
+#include "intel_de.h"
 #include "intel_display_types.h"
 #include "intel_dpio_phy.h"
 #include "intel_hotplug.h"
@@ -408,7 +409,7 @@ static void hsw_power_well_enable(struct drm_i915_private *dev_priv,
        if (power_well->desc->hsw.has_fuses) {
                enum skl_power_gate pg;
 
-               pg = INTEL_GEN(dev_priv) >= 11 ? ICL_PW_CTL_IDX_TO_PG(pw_idx) :
+               pg = DISPLAY_VER(dev_priv) >= 11 ? ICL_PW_CTL_IDX_TO_PG(pw_idx) :
                                                 SKL_PW_CTL_IDX_TO_PG(pw_idx);
                /*
                 * For PW1 we have to wait both for the PW0/PG0 fuse state
@@ -441,7 +442,7 @@ static void hsw_power_well_enable(struct drm_i915_private *dev_priv,
        if (power_well->desc->hsw.has_fuses) {
                enum skl_power_gate pg;
 
-               pg = INTEL_GEN(dev_priv) >= 11 ? ICL_PW_CTL_IDX_TO_PG(pw_idx) :
+               pg = DISPLAY_VER(dev_priv) >= 11 ? ICL_PW_CTL_IDX_TO_PG(pw_idx) :
                                                 SKL_PW_CTL_IDX_TO_PG(pw_idx);
                gen9_wait_for_power_well_fuses(dev_priv, pg);
        }
@@ -484,7 +485,7 @@ icl_combo_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
        intel_de_write(dev_priv, regs->driver,
                       val | HSW_PWR_WELL_CTL_REQ(pw_idx));
 
-       if (INTEL_GEN(dev_priv) < 12) {
+       if (DISPLAY_VER(dev_priv) < 12) {
                val = intel_de_read(dev_priv, ICL_PORT_CL_DW12(phy));
                intel_de_write(dev_priv, ICL_PORT_CL_DW12(phy),
                               val | ICL_LANE_ENABLE_AUX);
@@ -550,7 +551,7 @@ static void icl_tc_port_assert_ref_held(struct drm_i915_private *dev_priv,
        if (drm_WARN_ON(&dev_priv->drm, !dig_port))
                return;
 
-       if (INTEL_GEN(dev_priv) == 11 && dig_port->tc_legacy_port)
+       if (DISPLAY_VER(dev_priv) == 11 && dig_port->tc_legacy_port)
                return;
 
        drm_WARN_ON(&dev_priv->drm, !intel_tc_port_ref_held(dig_port));
@@ -619,14 +620,14 @@ icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
         * exit sequence.
         */
        timeout_expected = is_tbt;
-       if (INTEL_GEN(dev_priv) == 11 && dig_port->tc_legacy_port) {
+       if (DISPLAY_VER(dev_priv) == 11 && dig_port->tc_legacy_port) {
                icl_tc_cold_exit(dev_priv);
                timeout_expected = true;
        }
 
        hsw_wait_for_power_well_enable(dev_priv, power_well, timeout_expected);
 
-       if (INTEL_GEN(dev_priv) >= 12 && !is_tbt) {
+       if (DISPLAY_VER(dev_priv) >= 12 && !is_tbt) {
                enum tc_port tc_port;
 
                tc_port = TGL_AUX_PW_TO_TC_PORT(power_well->desc->hsw.idx);
@@ -709,7 +710,7 @@ static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv,
         * BIOS's own request bits, which are forced-on for these power wells
         * when exiting DC5/6.
         */
-       if (IS_GEN(dev_priv, 9) && !IS_GEN9_LP(dev_priv) &&
+       if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv) &&
            (id == SKL_DISP_PW_1 || id == SKL_DISP_PW_MISC_IO))
                val |= intel_de_read(dev_priv, regs->bios);
 
@@ -804,12 +805,12 @@ static u32 gen9_dc_mask(struct drm_i915_private *dev_priv)
 
        mask = DC_STATE_EN_UPTO_DC5;
 
-       if (INTEL_GEN(dev_priv) >= 12)
+       if (DISPLAY_VER(dev_priv) >= 12)
                mask |= DC_STATE_EN_DC3CO | DC_STATE_EN_UPTO_DC6
                                          | DC_STATE_EN_DC9;
-       else if (IS_GEN(dev_priv, 11))
+       else if (DISPLAY_VER(dev_priv) == 11)
                mask |= DC_STATE_EN_UPTO_DC6 | DC_STATE_EN_DC9;
-       else if (IS_GEN9_LP(dev_priv))
+       else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
                mask |= DC_STATE_EN_DC9;
        else
                mask |= DC_STATE_EN_UPTO_DC6;
@@ -821,6 +822,9 @@ static void gen9_sanitize_dc_state(struct drm_i915_private *dev_priv)
 {
        u32 val;
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        val = intel_de_read(dev_priv, DC_STATE_EN) & gen9_dc_mask(dev_priv);
 
        drm_dbg_kms(&dev_priv->drm,
@@ -857,6 +861,9 @@ static void gen9_set_dc_state(struct drm_i915_private *dev_priv, u32 state)
        u32 val;
        u32 mask;
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        if (drm_WARN_ON_ONCE(&dev_priv->drm,
                             state & ~dev_priv->csr.allowed_dc_mask))
                state &= dev_priv->csr.allowed_dc_mask;
@@ -1035,7 +1042,7 @@ static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)
        enum i915_power_well_id high_pg;
 
        /* Power wells at this level and above must be disabled for DC5 entry */
-       if (INTEL_GEN(dev_priv) >= 12)
+       if (DISPLAY_VER(dev_priv) == 12)
                high_pg = ICL_DISP_PW_3;
        else
                high_pg = SKL_DISP_PW_2;
@@ -1060,7 +1067,7 @@ static void gen9_enable_dc5(struct drm_i915_private *dev_priv)
        drm_dbg_kms(&dev_priv->drm, "Enabling DC5\n");
 
        /* Wa Display #1183: skl,kbl,cfl */
-       if (IS_GEN9_BC(dev_priv))
+       if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv))
                intel_de_write(dev_priv, GEN8_CHICKEN_DCPR_1,
                               intel_de_read(dev_priv, GEN8_CHICKEN_DCPR_1) | SKL_SELECT_ALTERNATE_DC_EXIT);
 
@@ -1087,7 +1094,7 @@ static void skl_enable_dc6(struct drm_i915_private *dev_priv)
        drm_dbg_kms(&dev_priv->drm, "Enabling DC6\n");
 
        /* Wa Display #1183: skl,kbl,cfl */
-       if (IS_GEN9_BC(dev_priv))
+       if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv))
                intel_de_write(dev_priv, GEN8_CHICKEN_DCPR_1,
                               intel_de_read(dev_priv, GEN8_CHICKEN_DCPR_1) | SKL_SELECT_ALTERNATE_DC_EXIT);
 
@@ -1181,6 +1188,9 @@ static void gen9_disable_dc_states(struct drm_i915_private *dev_priv)
 
        gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        dev_priv->display.get_cdclk(dev_priv, &cdclk_config);
        /* Can't read out voltage_level so can't use intel_cdclk_changed() */
        drm_WARN_ON(&dev_priv->drm,
@@ -1189,10 +1199,10 @@ static void gen9_disable_dc_states(struct drm_i915_private *dev_priv)
 
        gen9_assert_dbuf_enabled(dev_priv);
 
-       if (IS_GEN9_LP(dev_priv))
+       if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
                bxt_verify_ddi_phy_power_wells(dev_priv);
 
-       if (INTEL_GEN(dev_priv) >= 11)
+       if (DISPLAY_VER(dev_priv) >= 11)
                /*
                 * DMC retains HW context only for port A, the other combo
                 * PHY's HW context for port B is lost after DC transitions,
@@ -2886,24 +2896,24 @@ intel_display_power_put_mask_in_set(struct drm_i915_private *i915,
        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_D_LANES) |        \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) |        \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_F_LANES) |        \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_G_LANES) |        \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_H_LANES) |        \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_I_LANES) |        \
-       BIT_ULL(POWER_DOMAIN_AUX_D) |                   \
-       BIT_ULL(POWER_DOMAIN_AUX_E) |                   \
-       BIT_ULL(POWER_DOMAIN_AUX_F) |                   \
-       BIT_ULL(POWER_DOMAIN_AUX_G) |                   \
-       BIT_ULL(POWER_DOMAIN_AUX_H) |                   \
-       BIT_ULL(POWER_DOMAIN_AUX_I) |                   \
-       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_AUX_G_TBT) |               \
-       BIT_ULL(POWER_DOMAIN_AUX_H_TBT) |               \
-       BIT_ULL(POWER_DOMAIN_AUX_I_TBT) |               \
+       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) |                   \
        BIT_ULL(POWER_DOMAIN_INIT))
@@ -2921,18 +2931,12 @@ intel_display_power_put_mask_in_set(struct drm_i915_private *i915,
        BIT_ULL(POWER_DOMAIN_AUX_C) |                   \
        BIT_ULL(POWER_DOMAIN_INIT))
 
-#define TGL_DDI_IO_D_TC1_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO))
-#define TGL_DDI_IO_E_TC2_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO))
-#define TGL_DDI_IO_F_TC3_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_F_IO))
-#define TGL_DDI_IO_G_TC4_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_G_IO))
-#define TGL_DDI_IO_H_TC5_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_H_IO))
-#define TGL_DDI_IO_I_TC6_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_I_IO))
+#define TGL_DDI_IO_TC1_POWER_DOMAINS   BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC1)
+#define TGL_DDI_IO_TC2_POWER_DOMAINS   BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC2)
+#define TGL_DDI_IO_TC3_POWER_DOMAINS   BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC3)
+#define TGL_DDI_IO_TC4_POWER_DOMAINS   BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC4)
+#define TGL_DDI_IO_TC5_POWER_DOMAINS   BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC5)
+#define TGL_DDI_IO_TC6_POWER_DOMAINS   BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC6)
 
 #define TGL_AUX_A_IO_POWER_DOMAINS (           \
        BIT_ULL(POWER_DOMAIN_AUX_IO_A) |        \
@@ -2941,44 +2945,34 @@ intel_display_power_put_mask_in_set(struct drm_i915_private *i915,
        BIT_ULL(POWER_DOMAIN_AUX_B))
 #define TGL_AUX_C_IO_POWER_DOMAINS (           \
        BIT_ULL(POWER_DOMAIN_AUX_C))
-#define TGL_AUX_D_TC1_IO_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_AUX_D))
-#define TGL_AUX_E_TC2_IO_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_AUX_E))
-#define TGL_AUX_F_TC3_IO_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_AUX_F))
-#define TGL_AUX_G_TC4_IO_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_AUX_G))
-#define TGL_AUX_H_TC5_IO_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_AUX_H))
-#define TGL_AUX_I_TC6_IO_POWER_DOMAINS (       \
-       BIT_ULL(POWER_DOMAIN_AUX_I))
-#define TGL_AUX_D_TBT1_IO_POWER_DOMAINS (      \
-       BIT_ULL(POWER_DOMAIN_AUX_D_TBT))
-#define TGL_AUX_E_TBT2_IO_POWER_DOMAINS (      \
-       BIT_ULL(POWER_DOMAIN_AUX_E_TBT))
-#define TGL_AUX_F_TBT3_IO_POWER_DOMAINS (      \
-       BIT_ULL(POWER_DOMAIN_AUX_F_TBT))
-#define TGL_AUX_G_TBT4_IO_POWER_DOMAINS (      \
-       BIT_ULL(POWER_DOMAIN_AUX_G_TBT))
-#define TGL_AUX_H_TBT5_IO_POWER_DOMAINS (      \
-       BIT_ULL(POWER_DOMAIN_AUX_H_TBT))
-#define TGL_AUX_I_TBT6_IO_POWER_DOMAINS (      \
-       BIT_ULL(POWER_DOMAIN_AUX_I_TBT))
+
+#define TGL_AUX_IO_USBC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC1)
+#define TGL_AUX_IO_USBC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC2)
+#define TGL_AUX_IO_USBC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC3)
+#define TGL_AUX_IO_USBC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC4)
+#define TGL_AUX_IO_USBC5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC5)
+#define TGL_AUX_IO_USBC6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC6)
+
+#define TGL_AUX_IO_TBT1_POWER_DOMAINS  BIT_ULL(POWER_DOMAIN_AUX_TBT1)
+#define TGL_AUX_IO_TBT2_POWER_DOMAINS  BIT_ULL(POWER_DOMAIN_AUX_TBT2)
+#define TGL_AUX_IO_TBT3_POWER_DOMAINS  BIT_ULL(POWER_DOMAIN_AUX_TBT3)
+#define TGL_AUX_IO_TBT4_POWER_DOMAINS  BIT_ULL(POWER_DOMAIN_AUX_TBT4)
+#define TGL_AUX_IO_TBT5_POWER_DOMAINS  BIT_ULL(POWER_DOMAIN_AUX_TBT5)
+#define TGL_AUX_IO_TBT6_POWER_DOMAINS  BIT_ULL(POWER_DOMAIN_AUX_TBT6)
 
 #define TGL_TC_COLD_OFF_POWER_DOMAINS (                \
-       BIT_ULL(POWER_DOMAIN_AUX_D)     |       \
-       BIT_ULL(POWER_DOMAIN_AUX_E)     |       \
-       BIT_ULL(POWER_DOMAIN_AUX_F)     |       \
-       BIT_ULL(POWER_DOMAIN_AUX_G)     |       \
-       BIT_ULL(POWER_DOMAIN_AUX_H)     |       \
-       BIT_ULL(POWER_DOMAIN_AUX_I)     |       \
-       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_AUX_G_TBT) |       \
-       BIT_ULL(POWER_DOMAIN_AUX_H_TBT) |       \
-       BIT_ULL(POWER_DOMAIN_AUX_I_TBT) |       \
+       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 (                       \
@@ -2994,10 +2988,10 @@ intel_display_power_put_mask_in_set(struct drm_i915_private *i915,
        BIT_ULL(POWER_DOMAIN_AUDIO) |                   \
        BIT_ULL(POWER_DOMAIN_VGA) |                     \
        BIT_ULL(POWER_DOMAIN_TRANSCODER_B) |            \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) |        \
-       BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) |        \
-       BIT_ULL(POWER_DOMAIN_AUX_D) |                   \
-       BIT_ULL(POWER_DOMAIN_AUX_E) |                   \
+       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))
 
 /*
@@ -3028,6 +3022,113 @@ intel_display_power_put_mask_in_set(struct drm_i915_private *i915,
        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) |                   \
+       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_AUX_C) |                   \
+       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_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_MODESET) |                 \
+       BIT_ULL(POWER_DOMAIN_AUX_A) |                   \
+       BIT_ULL(POWER_DOMAIN_AUX_B) |                   \
+       BIT_ULL(POWER_DOMAIN_INIT))
+
+#define XELPD_AUX_IO_D_XELPD_POWER_DOMAINS     BIT_ULL(POWER_DOMAIN_AUX_D_XELPD)
+#define XELPD_AUX_IO_E_XELPD_POWER_DOMAINS     BIT_ULL(POWER_DOMAIN_AUX_E_XELPD)
+#define XELPD_AUX_IO_USBC1_POWER_DOMAINS       BIT_ULL(POWER_DOMAIN_AUX_USBC1)
+#define XELPD_AUX_IO_USBC2_POWER_DOMAINS       BIT_ULL(POWER_DOMAIN_AUX_USBC2)
+#define XELPD_AUX_IO_USBC3_POWER_DOMAINS       BIT_ULL(POWER_DOMAIN_AUX_USBC3)
+#define XELPD_AUX_IO_USBC4_POWER_DOMAINS       BIT_ULL(POWER_DOMAIN_AUX_USBC4)
+
+#define XELPD_AUX_IO_TBT1_POWER_DOMAINS                BIT_ULL(POWER_DOMAIN_AUX_TBT1)
+#define XELPD_AUX_IO_TBT2_POWER_DOMAINS                BIT_ULL(POWER_DOMAIN_AUX_TBT2)
+#define XELPD_AUX_IO_TBT3_POWER_DOMAINS                BIT_ULL(POWER_DOMAIN_AUX_TBT3)
+#define XELPD_AUX_IO_TBT4_POWER_DOMAINS                BIT_ULL(POWER_DOMAIN_AUX_TBT4)
+
+#define XELPD_DDI_IO_D_XELPD_POWER_DOMAINS     BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_D_XELPD)
+#define XELPD_DDI_IO_E_XELPD_POWER_DOMAINS     BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_E_XELPD)
+#define XELPD_DDI_IO_TC1_POWER_DOMAINS         BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC1)
+#define XELPD_DDI_IO_TC2_POWER_DOMAINS         BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC2)
+#define XELPD_DDI_IO_TC3_POWER_DOMAINS         BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC3)
+#define XELPD_DDI_IO_TC4_POWER_DOMAINS         BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC4)
+
 static const struct i915_power_well_ops i9xx_always_on_power_well_ops = {
        .sync_hw = i9xx_power_well_sync_hw_noop,
        .enable = i9xx_always_on_power_well_noop,
@@ -4145,8 +4246,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                }
        },
        {
-               .name = "DDI D TC1 IO",
-               .domains = TGL_DDI_IO_D_TC1_POWER_DOMAINS,
+               .name = "DDI IO TC1",
+               .domains = TGL_DDI_IO_TC1_POWER_DOMAINS,
                .ops = &hsw_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4155,8 +4256,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "DDI E TC2 IO",
-               .domains = TGL_DDI_IO_E_TC2_POWER_DOMAINS,
+               .name = "DDI IO TC2",
+               .domains = TGL_DDI_IO_TC2_POWER_DOMAINS,
                .ops = &hsw_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4165,8 +4266,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "DDI F TC3 IO",
-               .domains = TGL_DDI_IO_F_TC3_POWER_DOMAINS,
+               .name = "DDI IO TC3",
+               .domains = TGL_DDI_IO_TC3_POWER_DOMAINS,
                .ops = &hsw_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4175,8 +4276,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "DDI G TC4 IO",
-               .domains = TGL_DDI_IO_G_TC4_POWER_DOMAINS,
+               .name = "DDI IO TC4",
+               .domains = TGL_DDI_IO_TC4_POWER_DOMAINS,
                .ops = &hsw_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4185,8 +4286,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "DDI H TC5 IO",
-               .domains = TGL_DDI_IO_H_TC5_POWER_DOMAINS,
+               .name = "DDI IO TC5",
+               .domains = TGL_DDI_IO_TC5_POWER_DOMAINS,
                .ops = &hsw_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4195,8 +4296,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "DDI I TC6 IO",
-               .domains = TGL_DDI_IO_I_TC6_POWER_DOMAINS,
+               .name = "DDI IO TC6",
+               .domains = TGL_DDI_IO_TC6_POWER_DOMAINS,
                .ops = &hsw_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4241,8 +4342,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX D TC1",
-               .domains = TGL_AUX_D_TC1_IO_POWER_DOMAINS,
+               .name = "AUX USBC1",
+               .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4252,8 +4353,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX E TC2",
-               .domains = TGL_AUX_E_TC2_IO_POWER_DOMAINS,
+               .name = "AUX USBC2",
+               .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4263,8 +4364,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX F TC3",
-               .domains = TGL_AUX_F_TC3_IO_POWER_DOMAINS,
+               .name = "AUX USBC3",
+               .domains = TGL_AUX_IO_USBC3_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4274,8 +4375,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX G TC4",
-               .domains = TGL_AUX_G_TC4_IO_POWER_DOMAINS,
+               .name = "AUX USBC4",
+               .domains = TGL_AUX_IO_USBC4_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4285,8 +4386,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX H TC5",
-               .domains = TGL_AUX_H_TC5_IO_POWER_DOMAINS,
+               .name = "AUX USBC5",
+               .domains = TGL_AUX_IO_USBC5_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4296,8 +4397,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX I TC6",
-               .domains = TGL_AUX_I_TC6_IO_POWER_DOMAINS,
+               .name = "AUX USBC6",
+               .domains = TGL_AUX_IO_USBC6_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4307,8 +4408,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX TBT1",
-               .domains = TGL_AUX_D_TBT1_IO_POWER_DOMAINS,
+               .name = "AUX TBT1",
+               .domains = TGL_AUX_IO_TBT1_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4318,8 +4419,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX TBT2",
-               .domains = TGL_AUX_E_TBT2_IO_POWER_DOMAINS,
+               .name = "AUX TBT2",
+               .domains = TGL_AUX_IO_TBT2_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4329,8 +4430,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX TBT3",
-               .domains = TGL_AUX_F_TBT3_IO_POWER_DOMAINS,
+               .name = "AUX TBT3",
+               .domains = TGL_AUX_IO_TBT3_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4340,8 +4441,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX TBT4",
-               .domains = TGL_AUX_G_TBT4_IO_POWER_DOMAINS,
+               .name = "AUX TBT4",
+               .domains = TGL_AUX_IO_TBT4_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4351,8 +4452,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX TBT5",
-               .domains = TGL_AUX_H_TBT5_IO_POWER_DOMAINS,
+               .name = "AUX TBT5",
+               .domains = TGL_AUX_IO_TBT5_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4362,8 +4463,8 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
                },
        },
        {
-               .name = "AUX TBT6",
-               .domains = TGL_AUX_I_TBT6_IO_POWER_DOMAINS,
+               .name = "AUX TBT6",
+               .domains = TGL_AUX_IO_TBT6_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4471,8 +4572,8 @@ static const struct i915_power_well_desc rkl_power_wells[] = {
                }
        },
        {
-               .name = "DDI D TC1 IO",
-               .domains = TGL_DDI_IO_D_TC1_POWER_DOMAINS,
+               .name = "DDI IO TC1",
+               .domains = TGL_DDI_IO_TC1_POWER_DOMAINS,
                .ops = &hsw_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4481,8 +4582,8 @@ static const struct i915_power_well_desc rkl_power_wells[] = {
                },
        },
        {
-               .name = "DDI E TC2 IO",
-               .domains = TGL_DDI_IO_E_TC2_POWER_DOMAINS,
+               .name = "DDI IO TC2",
+               .domains = TGL_DDI_IO_TC2_POWER_DOMAINS,
                .ops = &hsw_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4511,8 +4612,257 @@ static const struct i915_power_well_desc rkl_power_wells[] = {
                },
        },
        {
-               .name = "AUX D TC1",
-               .domains = TGL_AUX_D_TC1_IO_POWER_DOMAINS,
+               .name = "AUX USBC1",
+               .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS,
+               .ops = &icl_aux_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_aux_power_well_regs,
+                       .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.regs = &icl_aux_power_well_regs,
+                       .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2,
+               },
+       },
+};
+
+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.regs = &hsw_power_well_regs,
+                       .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.regs = &hsw_power_well_regs,
+                       .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.regs = &hsw_power_well_regs,
+                       .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.regs = &hsw_power_well_regs,
+                       .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.regs = &hsw_power_well_regs,
+                       .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.regs = &hsw_power_well_regs,
+                       .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 = &hsw_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_ddi_power_well_regs,
+                       .hsw.idx = ICL_PW_CTL_IDX_DDI_A,
+               }
+       },
+       {
+               .name = "DDI B IO",
+               .domains = ICL_DDI_IO_B_POWER_DOMAINS,
+               .ops = &hsw_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_ddi_power_well_regs,
+                       .hsw.idx = ICL_PW_CTL_IDX_DDI_B,
+               }
+       },
+       {
+               .name = "DDI C IO",
+               .domains = ICL_DDI_IO_C_POWER_DOMAINS,
+               .ops = &hsw_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_ddi_power_well_regs,
+                       .hsw.idx = ICL_PW_CTL_IDX_DDI_C,
+               }
+       },
+       {
+               .name = "DDI IO D_XELPD",
+               .domains = XELPD_DDI_IO_D_XELPD_POWER_DOMAINS,
+               .ops = &hsw_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_ddi_power_well_regs,
+                       .hsw.idx = XELPD_PW_CTL_IDX_DDI_D,
+               }
+       },
+       {
+               .name = "DDI IO E_XELPD",
+               .domains = XELPD_DDI_IO_E_XELPD_POWER_DOMAINS,
+               .ops = &hsw_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_ddi_power_well_regs,
+                       .hsw.idx = XELPD_PW_CTL_IDX_DDI_E,
+               }
+       },
+       {
+               .name = "DDI IO TC1",
+               .domains = XELPD_DDI_IO_TC1_POWER_DOMAINS,
+               .ops = &hsw_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_ddi_power_well_regs,
+                       .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1,
+               }
+       },
+       {
+               .name = "DDI IO TC2",
+               .domains = XELPD_DDI_IO_TC2_POWER_DOMAINS,
+               .ops = &hsw_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_ddi_power_well_regs,
+                       .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2,
+               }
+       },
+       {
+               .name = "DDI IO TC3",
+               .domains = XELPD_DDI_IO_TC3_POWER_DOMAINS,
+               .ops = &hsw_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_ddi_power_well_regs,
+                       .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3,
+               }
+       },
+       {
+               .name = "DDI IO TC4",
+               .domains = XELPD_DDI_IO_TC4_POWER_DOMAINS,
+               .ops = &hsw_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_ddi_power_well_regs,
+                       .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.regs = &icl_aux_power_well_regs,
+                       .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.regs = &icl_aux_power_well_regs,
+                       .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.regs = &icl_aux_power_well_regs,
+                       .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
+               },
+       },
+       {
+               .name = "AUX D_XELPD",
+               .domains = XELPD_AUX_IO_D_XELPD_POWER_DOMAINS,
+               .ops = &icl_aux_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_aux_power_well_regs,
+                       .hsw.idx = XELPD_PW_CTL_IDX_AUX_D,
+               },
+       },
+       {
+               .name = "AUX E_XELPD",
+               .domains = XELPD_AUX_IO_E_XELPD_POWER_DOMAINS,
+               .ops = &icl_aux_power_well_ops,
+               .id = DISP_PW_ID_NONE,
+               {
+                       .hsw.regs = &icl_aux_power_well_regs,
+                       .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,
                {
@@ -4521,8 +4871,8 @@ static const struct i915_power_well_desc rkl_power_wells[] = {
                },
        },
        {
-               .name = "AUX E TC2",
-               .domains = TGL_AUX_E_TC2_IO_POWER_DOMAINS,
+               .name = "AUX USBC2",
+               .domains = XELPD_AUX_IO_USBC2_POWER_DOMAINS,
                .ops = &icl_aux_power_well_ops,
                .id = DISP_PW_ID_NONE,
                {
@@ -4530,6 +4880,70 @@ static const struct i915_power_well_desc rkl_power_wells[] = {
                        .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.regs = &icl_aux_power_well_regs,
+                       .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.regs = &icl_aux_power_well_regs,
+                       .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.regs = &icl_aux_power_well_regs,
+                       .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.regs = &icl_aux_power_well_regs,
+                       .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.regs = &icl_aux_power_well_regs,
+                       .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.regs = &icl_aux_power_well_regs,
+                       .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4,
+                       .hsw.is_tc_tbt = true,
+               },
+       },
 };
 
 static int
@@ -4549,14 +4963,17 @@ static u32 get_allowed_dc_mask(const struct drm_i915_private *dev_priv,
        int requested_dc;
        int max_dc;
 
+       if (!HAS_DISPLAY(dev_priv))
+               return 0;
+
        if (IS_DG1(dev_priv))
                max_dc = 3;
-       else if (INTEL_GEN(dev_priv) >= 12)
+       else if (DISPLAY_VER(dev_priv) >= 12)
                max_dc = 4;
-       else if (INTEL_GEN(dev_priv) >= 10 || IS_GEN9_BC(dev_priv))
-               max_dc = 2;
-       else if (IS_GEN9_LP(dev_priv))
+       else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
                max_dc = 1;
+       else if (DISPLAY_VER(dev_priv) >= 9)
+               max_dc = 2;
        else
                max_dc = 0;
 
@@ -4565,7 +4982,8 @@ static u32 get_allowed_dc_mask(const struct drm_i915_private *dev_priv,
         * not depending on the DMC firmware. It's needed by system
         * suspend/resume, so allow it unconditionally.
         */
-       mask = IS_GEN9_LP(dev_priv) || INTEL_GEN(dev_priv) >= 11 ?
+       mask = IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv) ||
+               DISPLAY_VER(dev_priv) >= 11 ?
               DC_STATE_EN_DC9 : 0;
 
        if (!dev_priv->params.disable_power_well)
@@ -4689,14 +5107,19 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
         * The enabling order will be from lower to higher indexed wells,
         * the disabling order is reversed.
         */
-       if (IS_DG1(dev_priv)) {
+       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_ALDERLAKE_S(dev_priv) || IS_DG1(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 (IS_GEN(dev_priv, 12)) {
+       } else if (DISPLAY_VER(dev_priv) == 12) {
                err = set_power_wells(power_domains, tgl_power_wells);
-       } else if (IS_GEN(dev_priv, 11)) {
+       } else if (DISPLAY_VER(dev_priv) == 11) {
                err = set_power_wells(power_domains, icl_power_wells);
        } else if (IS_CNL_WITH_PORT_F(dev_priv)) {
                err = set_power_wells(power_domains, cnl_power_wells);
@@ -4708,7 +5131,7 @@ int intel_power_domains_init(struct drm_i915_private *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 (IS_GEN9_BC(dev_priv)) {
+       } 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);
@@ -4757,33 +5180,28 @@ static void gen9_dbuf_slice_set(struct drm_i915_private *dev_priv,
 {
        i915_reg_t reg = DBUF_CTL_S(slice);
        bool state;
-       u32 val;
 
-       val = intel_de_read(dev_priv, reg);
-       if (enable)
-               val |= DBUF_POWER_REQUEST;
-       else
-               val &= ~DBUF_POWER_REQUEST;
-       intel_de_write(dev_priv, reg, val);
+       intel_de_rmw(dev_priv, reg, DBUF_POWER_REQUEST,
+                    enable ? DBUF_POWER_REQUEST : 0);
        intel_de_posting_read(dev_priv, reg);
        udelay(10);
 
        state = intel_de_read(dev_priv, reg) & DBUF_POWER_STATE;
        drm_WARN(&dev_priv->drm, enable != state,
                 "DBuf slice %d power %s timeout!\n",
-                slice, enable ? "enable" : "disable");
+                slice, enabledisable(enable));
 }
 
 void gen9_dbuf_slices_update(struct drm_i915_private *dev_priv,
                             u8 req_slices)
 {
-       int num_slices = INTEL_INFO(dev_priv)->num_supported_dbuf_slices;
        struct i915_power_domains *power_domains = &dev_priv->power_domains;
+       u8 slice_mask = INTEL_INFO(dev_priv)->dbuf.slice_mask;
        enum dbuf_slice slice;
 
-       drm_WARN(&dev_priv->drm, req_slices & ~(BIT(num_slices) - 1),
-                "Invalid set of dbuf slices (0x%x) requested (num dbuf slices %d)\n",
-                req_slices, num_slices);
+       drm_WARN(&dev_priv->drm, req_slices & ~slice_mask,
+                "Invalid set of dbuf slices (0x%x) requested (total dbuf slices 0x%x)\n",
+                req_slices, slice_mask);
 
        drm_dbg_kms(&dev_priv->drm, "Updating dbuf slices to 0x%x\n",
                    req_slices);
@@ -4797,7 +5215,7 @@ void gen9_dbuf_slices_update(struct drm_i915_private *dev_priv,
         */
        mutex_lock(&power_domains->lock);
 
-       for (slice = DBUF_S1; slice < num_slices; slice++)
+       for_each_dbuf_slice(dev_priv, slice)
                gen9_dbuf_slice_set(dev_priv, slice, req_slices & BIT(slice));
 
        dev_priv->dbuf.enabled_slices = req_slices;
@@ -4825,10 +5243,9 @@ static void gen9_dbuf_disable(struct drm_i915_private *dev_priv)
 
 static void gen12_dbuf_slices_config(struct drm_i915_private *dev_priv)
 {
-       const int num_slices = INTEL_INFO(dev_priv)->num_supported_dbuf_slices;
        enum dbuf_slice slice;
 
-       for (slice = DBUF_S1; slice < (DBUF_S1 + num_slices); slice++)
+       for_each_dbuf_slice(dev_priv, slice)
                intel_de_rmw(dev_priv, DBUF_CTL_S(slice),
                             DBUF_TRACKER_STATE_SERVICE_MASK,
                             DBUF_TRACKER_STATE_SERVICE(8));
@@ -4853,7 +5270,7 @@ static void icl_mbus_init(struct drm_i915_private *dev_priv)
         * expect us to program the abox_ctl0 register as well, even though
         * we don't have to program other instance-0 registers like BW_BUDDY.
         */
-       if (IS_GEN(dev_priv, 12))
+       if (DISPLAY_VER(dev_priv) == 12)
                abox_regs |= BIT(0);
 
        for_each_set_bit(i, &abox_regs, sizeof(abox_regs))
@@ -5138,6 +5555,9 @@ static void skl_display_core_init(struct drm_i915_private *dev_priv,
        /* enable PCH reset handshake */
        intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        /* enable PG1 and Misc I/O */
        mutex_lock(&power_domains->lock);
 
@@ -5162,6 +5582,9 @@ static void skl_display_core_uninit(struct drm_i915_private *dev_priv)
        struct i915_power_domains *power_domains = &dev_priv->power_domains;
        struct i915_power_well *well;
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        gen9_disable_dc_states(dev_priv);
 
        gen9_dbuf_disable(dev_priv);
@@ -5202,6 +5625,9 @@ static void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume
         */
        intel_pch_reset_handshake(dev_priv, false);
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        /* Enable PG1 */
        mutex_lock(&power_domains->lock);
 
@@ -5223,6 +5649,9 @@ static void bxt_display_core_uninit(struct drm_i915_private *dev_priv)
        struct i915_power_domains *power_domains = &dev_priv->power_domains;
        struct i915_power_well *well;
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        gen9_disable_dc_states(dev_priv);
 
        gen9_dbuf_disable(dev_priv);
@@ -5256,6 +5685,9 @@ static void cnl_display_core_init(struct drm_i915_private *dev_priv, bool resume
        /* 1. Enable PCH Reset Handshake */
        intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        /* 2-3. */
        intel_combo_phy_init(dev_priv);
 
@@ -5283,6 +5715,9 @@ static void cnl_display_core_uninit(struct drm_i915_private *dev_priv)
        struct i915_power_domains *power_domains = &dev_priv->power_domains;
        struct i915_power_well *well;
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        gen9_disable_dc_states(dev_priv);
 
        /* 1. Disable all display engine functions -> aready done */
@@ -5317,17 +5752,25 @@ struct buddy_page_mask {
 
 static const struct buddy_page_mask tgl_buddy_page_masks[] = {
        { .num_channels = 1, .type = INTEL_DRAM_DDR4,   .page_mask = 0xF },
+       { .num_channels = 1, .type = INTEL_DRAM_DDR5,   .page_mask = 0xF },
        { .num_channels = 2, .type = INTEL_DRAM_LPDDR4, .page_mask = 0x1C },
+       { .num_channels = 2, .type = INTEL_DRAM_LPDDR5, .page_mask = 0x1C },
        { .num_channels = 2, .type = INTEL_DRAM_DDR4,   .page_mask = 0x1F },
+       { .num_channels = 2, .type = INTEL_DRAM_DDR5,   .page_mask = 0x1E },
        { .num_channels = 4, .type = INTEL_DRAM_LPDDR4, .page_mask = 0x38 },
+       { .num_channels = 4, .type = INTEL_DRAM_LPDDR5, .page_mask = 0x38 },
        {}
 };
 
 static const struct buddy_page_mask wa_1409767108_buddy_page_masks[] = {
        { .num_channels = 1, .type = INTEL_DRAM_LPDDR4, .page_mask = 0x1 },
        { .num_channels = 1, .type = INTEL_DRAM_DDR4,   .page_mask = 0x1 },
+       { .num_channels = 1, .type = INTEL_DRAM_DDR5,   .page_mask = 0x1 },
+       { .num_channels = 1, .type = INTEL_DRAM_LPDDR5, .page_mask = 0x1 },
        { .num_channels = 2, .type = INTEL_DRAM_LPDDR4, .page_mask = 0x3 },
        { .num_channels = 2, .type = INTEL_DRAM_DDR4,   .page_mask = 0x3 },
+       { .num_channels = 2, .type = INTEL_DRAM_DDR5,   .page_mask = 0x3 },
+       { .num_channels = 2, .type = INTEL_DRAM_LPDDR5, .page_mask = 0x3 },
        {}
 };
 
@@ -5339,9 +5782,10 @@ static void tgl_bw_buddy_init(struct drm_i915_private *dev_priv)
        unsigned long abox_mask = INTEL_INFO(dev_priv)->abox_mask;
        int config, i;
 
-       if (IS_DG1_REVID(dev_priv, DG1_REVID_A0, DG1_REVID_A0) ||
-           IS_TGL_DISP_REVID(dev_priv, TGL_REVID_A0, TGL_REVID_B0))
-               /* Wa_1409767108:tgl,dg1 */
+       if (IS_ALDERLAKE_S(dev_priv) ||
+           IS_DG1_REVID(dev_priv, DG1_REVID_A0, DG1_REVID_A0) ||
+           IS_TGL_DISPLAY_STEP(dev_priv, STEP_A0, STEP_B0))
+               /* Wa_1409767108:tgl,dg1,adl-s */
                table = wa_1409767108_buddy_page_masks;
        else
                table = tgl_buddy_page_masks;
@@ -5379,7 +5823,7 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv,
 
        gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
 
-       /* Wa_14011294188:ehl,jsl,tgl,rkl */
+       /* Wa_14011294188:ehl,jsl,tgl,rkl,adl-s */
        if (INTEL_PCH_TYPE(dev_priv) >= PCH_JSP &&
            INTEL_PCH_TYPE(dev_priv) < PCH_DG1)
                intel_de_rmw(dev_priv, SOUTH_DSPCLK_GATE_D, 0,
@@ -5388,6 +5832,9 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv,
        /* 1. Enable PCH reset handshake. */
        intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        /* 2. Initialize all combo phys */
        intel_combo_phy_init(dev_priv);
 
@@ -5403,7 +5850,7 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv,
        /* 4. Enable CDCLK. */
        intel_cdclk_init_hw(dev_priv);
 
-       if (INTEL_GEN(dev_priv) >= 12)
+       if (DISPLAY_VER(dev_priv) >= 12)
                gen12_dbuf_slices_config(dev_priv);
 
        /* 5. Enable DBUF. */
@@ -5413,14 +5860,14 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv,
        icl_mbus_init(dev_priv);
 
        /* 7. Program arbiter BW_BUDDY registers */
-       if (INTEL_GEN(dev_priv) >= 12)
+       if (DISPLAY_VER(dev_priv) >= 12)
                tgl_bw_buddy_init(dev_priv);
 
        if (resume && dev_priv->csr.dmc_payload)
                intel_csr_load_program(dev_priv);
 
        /* Wa_14011508470 */
-       if (IS_GEN(dev_priv, 12)) {
+       if (DISPLAY_VER(dev_priv) == 12) {
                val = DCPR_CLEAR_MEMSTAT_DIS | DCPR_SEND_RESP_IMM |
                      DCPR_MASK_LPMODE | DCPR_MASK_MAXLATENCY_MEMUP_CLR;
                intel_uncore_rmw(&dev_priv->uncore, GEN11_CHICKEN_DCPR_2, 0, val);
@@ -5432,6 +5879,9 @@ static void icl_display_core_uninit(struct drm_i915_private *dev_priv)
        struct i915_power_domains *power_domains = &dev_priv->power_domains;
        struct i915_power_well *well;
 
+       if (!HAS_DISPLAY(dev_priv))
+               return;
+
        gen9_disable_dc_states(dev_priv);
 
        /* 1. Disable all display engine functions -> aready done */
@@ -5626,14 +6076,14 @@ void intel_power_domains_init_hw(struct drm_i915_private *i915, bool resume)
 
        power_domains->initializing = true;
 
-       if (INTEL_GEN(i915) >= 11) {
+       if (DISPLAY_VER(i915) >= 11) {
                icl_display_core_init(i915, resume);
        } else if (IS_CANNONLAKE(i915)) {
                cnl_display_core_init(i915, resume);
-       } else if (IS_GEN9_BC(i915)) {
-               skl_display_core_init(i915, resume);
-       } else if (IS_GEN9_LP(i915)) {
+       } else if (IS_GEMINILAKE(i915) || IS_BROXTON(i915)) {
                bxt_display_core_init(i915, resume);
+       } else if (DISPLAY_VER(i915) == 9) {
+               skl_display_core_init(i915, resume);
        } else if (IS_CHERRYVIEW(i915)) {
                mutex_lock(&power_domains->lock);
                chv_phy_control_init(i915);
@@ -5787,14 +6237,14 @@ void intel_power_domains_suspend(struct drm_i915_private *i915,
        intel_display_power_flush_work(i915);
        intel_power_domains_verify_state(i915);
 
-       if (INTEL_GEN(i915) >= 11)
+       if (DISPLAY_VER(i915) >= 11)
                icl_display_core_uninit(i915);
        else if (IS_CANNONLAKE(i915))
                cnl_display_core_uninit(i915);
-       else if (IS_GEN9_BC(i915))
-               skl_display_core_uninit(i915);
-       else if (IS_GEN9_LP(i915))
+       else if (IS_GEMINILAKE(i915) || IS_BROXTON(i915))
                bxt_display_core_uninit(i915);
+       else if (DISPLAY_VER(i915) == 9)
+               skl_display_core_uninit(i915);
 
        power_domains->display_core_suspended = true;
 }
@@ -5915,7 +6365,8 @@ static void intel_power_domains_verify_state(struct drm_i915_private *i915)
 
 void intel_display_power_suspend_late(struct drm_i915_private *i915)
 {
-       if (INTEL_GEN(i915) >= 11 || IS_GEN9_LP(i915)) {
+       if (DISPLAY_VER(i915) >= 11 || IS_GEMINILAKE(i915) ||
+           IS_BROXTON(i915)) {
                bxt_enable_dc9(i915);
                /* Tweaked Wa_14010685332:icp,jsp,mcc */
                if (INTEL_PCH_TYPE(i915) >= PCH_ICP && INTEL_PCH_TYPE(i915) <= PCH_MCC)
@@ -5928,7 +6379,8 @@ void intel_display_power_suspend_late(struct drm_i915_private *i915)
 
 void intel_display_power_resume_early(struct drm_i915_private *i915)
 {
-       if (INTEL_GEN(i915) >= 11 || IS_GEN9_LP(i915)) {
+       if (DISPLAY_VER(i915) >= 11 || IS_GEMINILAKE(i915) ||
+           IS_BROXTON(i915)) {
                gen9_sanitize_dc_state(i915);
                bxt_disable_dc9(i915);
                /* Tweaked Wa_14010685332:icp,jsp,mcc */
@@ -5942,10 +6394,10 @@ void intel_display_power_resume_early(struct drm_i915_private *i915)
 
 void intel_display_power_suspend(struct drm_i915_private *i915)
 {
-       if (INTEL_GEN(i915) >= 11) {
+       if (DISPLAY_VER(i915) >= 11) {
                icl_display_core_uninit(i915);
                bxt_enable_dc9(i915);
-       } else if (IS_GEN9_LP(i915)) {
+       } else if (IS_GEMINILAKE(i915) || IS_BROXTON(i915)) {
                bxt_display_core_uninit(i915);
                bxt_enable_dc9(i915);
        } else if (IS_HASWELL(i915) || IS_BROADWELL(i915)) {
@@ -5955,7 +6407,7 @@ void intel_display_power_suspend(struct drm_i915_private *i915)
 
 void intel_display_power_resume(struct drm_i915_private *i915)
 {
-       if (INTEL_GEN(i915) >= 11) {
+       if (DISPLAY_VER(i915) >= 11) {
                bxt_disable_dc9(i915);
                icl_display_core_init(i915, true);
                if (i915->csr.dmc_payload) {
@@ -5966,7 +6418,7 @@ void intel_display_power_resume(struct drm_i915_private *i915)
                                 DC_STATE_EN_UPTO_DC5)
                                gen9_enable_dc5(i915);
                }
-       } else if (IS_GEN9_LP(i915)) {
+       } else if (IS_GEMINILAKE(i915) || IS_BROXTON(i915)) {
                bxt_disable_dc9(i915);
                bxt_display_core_init(i915, true);
                if (i915->csr.dmc_payload &&