|
@@ -2696,6 +2696,111 @@ void bxt_display_core_uninit(struct drm_i915_private *dev_priv)
|
|
|
mutex_unlock(&power_domains->lock);
|
|
|
}
|
|
|
|
|
|
+#define CNL_PROCMON_IDX(val) \
|
|
|
+ (((val) & (PROCESS_INFO_MASK | VOLTAGE_INFO_MASK)) >> VOLTAGE_INFO_SHIFT)
|
|
|
+#define NUM_CNL_PROCMON \
|
|
|
+ (CNL_PROCMON_IDX(VOLTAGE_INFO_MASK | PROCESS_INFO_MASK) + 1)
|
|
|
+
|
|
|
+static const struct cnl_procmon {
|
|
|
+ u32 dw1, dw9, dw10;
|
|
|
+} cnl_procmon_values[NUM_CNL_PROCMON] = {
|
|
|
+ [CNL_PROCMON_IDX(VOLTAGE_INFO_0_85V | PROCESS_INFO_DOT_0)] =
|
|
|
+ { .dw1 = 0x00 << 16, .dw9 = 0x62AB67BB, .dw10 = 0x51914F96, },
|
|
|
+ [CNL_PROCMON_IDX(VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_0)] =
|
|
|
+ { .dw1 = 0x00 << 16, .dw9 = 0x86E172C7, .dw10 = 0x77CA5EAB, },
|
|
|
+ [CNL_PROCMON_IDX(VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_1)] =
|
|
|
+ { .dw1 = 0x00 << 16, .dw9 = 0x93F87FE1, .dw10 = 0x8AE871C5, },
|
|
|
+ [CNL_PROCMON_IDX(VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_0)] =
|
|
|
+ { .dw1 = 0x00 << 16, .dw9 = 0x98FA82DD, .dw10 = 0x89E46DC1, },
|
|
|
+ [CNL_PROCMON_IDX(VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_1)] =
|
|
|
+ { .dw1 = 0x44 << 16, .dw9 = 0x9A00AB25, .dw10 = 0x8AE38FF1, },
|
|
|
+};
|
|
|
+
|
|
|
+static void cnl_display_core_init(struct drm_i915_private *dev_priv, bool resume)
|
|
|
+{
|
|
|
+ struct i915_power_domains *power_domains = &dev_priv->power_domains;
|
|
|
+ const struct cnl_procmon *procmon;
|
|
|
+ struct i915_power_well *well;
|
|
|
+ u32 val;
|
|
|
+
|
|
|
+ gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
|
|
|
+
|
|
|
+ /* 1. Enable PCH Reset Handshake */
|
|
|
+ val = I915_READ(HSW_NDE_RSTWRN_OPT);
|
|
|
+ val |= RESET_PCH_HANDSHAKE_ENABLE;
|
|
|
+ I915_WRITE(HSW_NDE_RSTWRN_OPT, val);
|
|
|
+
|
|
|
+ /* 2. Enable Comp */
|
|
|
+ val = I915_READ(CHICKEN_MISC_2);
|
|
|
+ val &= ~COMP_PWR_DOWN;
|
|
|
+ I915_WRITE(CHICKEN_MISC_2, val);
|
|
|
+
|
|
|
+ val = I915_READ(CNL_PORT_COMP_DW3);
|
|
|
+ procmon = &cnl_procmon_values[CNL_PROCMON_IDX(val)];
|
|
|
+
|
|
|
+ WARN_ON(procmon->dw10 == 0);
|
|
|
+
|
|
|
+ val = I915_READ(CNL_PORT_COMP_DW1);
|
|
|
+ val &= ~((0xff << 16) | 0xff);
|
|
|
+ val |= procmon->dw1;
|
|
|
+ I915_WRITE(CNL_PORT_COMP_DW1, val);
|
|
|
+
|
|
|
+ I915_WRITE(CNL_PORT_COMP_DW9, procmon->dw9);
|
|
|
+ I915_WRITE(CNL_PORT_COMP_DW10, procmon->dw10);
|
|
|
+
|
|
|
+ val = I915_READ(CNL_PORT_COMP_DW0);
|
|
|
+ val |= COMP_INIT;
|
|
|
+ I915_WRITE(CNL_PORT_COMP_DW0, val);
|
|
|
+
|
|
|
+ /* 3. */
|
|
|
+ val = I915_READ(CNL_PORT_CL1CM_DW5);
|
|
|
+ val |= CL_POWER_DOWN_ENABLE;
|
|
|
+ I915_WRITE(CNL_PORT_CL1CM_DW5, val);
|
|
|
+
|
|
|
+ /* 4. Enable Power Well 1 (PG1) and Aux IO Power */
|
|
|
+ mutex_lock(&power_domains->lock);
|
|
|
+ well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
|
|
|
+ intel_power_well_enable(dev_priv, well);
|
|
|
+ mutex_unlock(&power_domains->lock);
|
|
|
+
|
|
|
+ /* 5. Enable CD clock */
|
|
|
+ cnl_init_cdclk(dev_priv);
|
|
|
+
|
|
|
+ /* 6. Enable DBUF */
|
|
|
+ gen9_dbuf_enable(dev_priv);
|
|
|
+}
|
|
|
+
|
|
|
+#undef CNL_PROCMON_IDX
|
|
|
+#undef NUM_CNL_PROCMON
|
|
|
+
|
|
|
+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;
|
|
|
+ u32 val;
|
|
|
+
|
|
|
+ gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
|
|
|
+
|
|
|
+ /* 1. Disable all display engine functions -> aready done */
|
|
|
+
|
|
|
+ /* 2. Disable DBUF */
|
|
|
+ gen9_dbuf_disable(dev_priv);
|
|
|
+
|
|
|
+ /* 3. Disable CD clock */
|
|
|
+ cnl_uninit_cdclk(dev_priv);
|
|
|
+
|
|
|
+ /* 4. Disable Power Well 1 (PG1) and Aux IO Power */
|
|
|
+ mutex_lock(&power_domains->lock);
|
|
|
+ well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
|
|
|
+ intel_power_well_disable(dev_priv, well);
|
|
|
+ mutex_unlock(&power_domains->lock);
|
|
|
+
|
|
|
+ /* 5. Disable Comp */
|
|
|
+ val = I915_READ(CHICKEN_MISC_2);
|
|
|
+ val |= COMP_PWR_DOWN;
|
|
|
+ I915_WRITE(CHICKEN_MISC_2, val);
|
|
|
+}
|
|
|
+
|
|
|
static void chv_phy_control_init(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
struct i915_power_well *cmn_bc =
|
|
@@ -2828,7 +2933,9 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
|
|
|
|
|
|
power_domains->initializing = true;
|
|
|
|
|
|
- if (IS_GEN9_BC(dev_priv)) {
|
|
|
+ if (IS_CANNONLAKE(dev_priv)) {
|
|
|
+ cnl_display_core_init(dev_priv, resume);
|
|
|
+ } else if (IS_GEN9_BC(dev_priv)) {
|
|
|
skl_display_core_init(dev_priv, resume);
|
|
|
} else if (IS_GEN9_LP(dev_priv)) {
|
|
|
bxt_display_core_init(dev_priv, resume);
|
|
@@ -2867,7 +2974,9 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv)
|
|
|
if (!i915.disable_power_well)
|
|
|
intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
|
|
|
|
|
|
- if (IS_GEN9_BC(dev_priv))
|
|
|
+ if (IS_CANNONLAKE(dev_priv))
|
|
|
+ cnl_display_core_uninit(dev_priv);
|
|
|
+ else if (IS_GEN9_BC(dev_priv))
|
|
|
skl_display_core_uninit(dev_priv);
|
|
|
else if (IS_GEN9_LP(dev_priv))
|
|
|
bxt_display_core_uninit(dev_priv);
|