Thomas Zimmermann 34ce7c
From c45198b163fb5342290144b770a905f0d83821ad Mon Sep 17 00:00:00 2001
Thomas Zimmermann 34ce7c
From: Imre Deak <imre.deak@intel.com>
Thomas Zimmermann 34ce7c
Date: Tue, 6 Nov 2018 18:06:18 +0200
Thomas Zimmermann 34ce7c
Subject: drm/i915/cnl+: Move the combo PHY init/uninit code to a new file
Thomas Zimmermann 34ce7c
MIME-Version: 1.0
Thomas Zimmermann 34ce7c
Content-Type: text/plain; charset=UTF-8
Thomas Zimmermann 34ce7c
Content-Transfer-Encoding: 8bit
Thomas Zimmermann 34ce7c
Git-commit: c45198b163fb5342290144b770a905f0d83821ad
Thomas Zimmermann 34ce7c
Patch-mainline: v5.0-rc1
Thomas Zimmermann 34ce7c
References: fate#326289
Thomas Zimmermann 34ce7c
Thomas Zimmermann 34ce7c
Similarly to the GEN9_LP DPIO PHY code keep the CNL+ combo PHY code in a
Thomas Zimmermann 34ce7c
separate file.
Thomas Zimmermann 34ce7c
Thomas Zimmermann 34ce7c
No functional change.
Thomas Zimmermann 34ce7c
Thomas Zimmermann 34ce7c
v2:
Thomas Zimmermann 34ce7c
- Use SPDX license tag instead of boilerplate. (Rodrigo)
Thomas Zimmermann 34ce7c
v3:
Thomas Zimmermann 34ce7c
- Use MIT instead of GPL-2.0 license. (Ville)
Thomas Zimmermann 34ce7c
Thomas Zimmermann 34ce7c
Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Thomas Zimmermann 34ce7c
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Thomas Zimmermann 34ce7c
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Thomas Zimmermann 34ce7c
Cc: José Roberto de Souza <jose.souza@intel.com>
Thomas Zimmermann 34ce7c
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Thomas Zimmermann 34ce7c
Signed-off-by: Imre Deak <imre.deak@intel.com>
Thomas Zimmermann 34ce7c
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Thomas Zimmermann 34ce7c
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
Thomas Zimmermann 34ce7c
Link: https://patchwork.freedesktop.org/patch/msgid/20181106160621.23057-3-imre.deak@intel.com
Thomas Zimmermann 34ce7c
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Thomas Zimmermann 34ce7c
---
Thomas Zimmermann 34ce7c
 drivers/gpu/drm/i915/Makefile           |    1 
Thomas Zimmermann 34ce7c
 drivers/gpu/drm/i915/i915_drv.h         |    6 +
Thomas Zimmermann 34ce7c
 drivers/gpu/drm/i915/intel_combo_phy.c  |  141 ++++++++++++++++++++++++++++++++
Thomas Zimmermann 34ce7c
 drivers/gpu/drm/i915/intel_runtime_pm.c |  125 +---------------------------
Thomas Zimmermann 34ce7c
 4 files changed, 156 insertions(+), 117 deletions(-)
Thomas Zimmermann 34ce7c
 create mode 100644 drivers/gpu/drm/i915/intel_combo_phy.c
Thomas Zimmermann 34ce7c
Thomas Zimmermann 34ce7c
--- a/drivers/gpu/drm/i915/Makefile
Thomas Zimmermann 34ce7c
+++ b/drivers/gpu/drm/i915/Makefile
Thomas Zimmermann 34ce7c
@@ -111,6 +111,7 @@ i915-y += intel_audio.o \
Thomas Zimmermann 34ce7c
 	  intel_bios.o \
Thomas Zimmermann 34ce7c
 	  intel_cdclk.o \
Thomas Zimmermann 34ce7c
 	  intel_color.o \
Thomas Zimmermann 34ce7c
+	  intel_combo_phy.o \
Thomas Zimmermann 34ce7c
 	  intel_display.o \
Thomas Zimmermann 34ce7c
 	  intel_dpio_phy.o \
Thomas Zimmermann 34ce7c
 	  intel_dpll_mgr.o \
Thomas Zimmermann 34ce7c
--- a/drivers/gpu/drm/i915/i915_drv.h
Thomas Zimmermann 34ce7c
+++ b/drivers/gpu/drm/i915/i915_drv.h
Thomas Zimmermann 34ce7c
@@ -3551,6 +3551,12 @@ void vlv_phy_pre_encoder_enable(struct i
Thomas Zimmermann 34ce7c
 void vlv_phy_reset_lanes(struct intel_encoder *encoder,
Thomas Zimmermann 34ce7c
 			 const struct intel_crtc_state *old_crtc_state);
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
+/* intel_combo_phy.c */
Thomas Zimmermann 34ce7c
+void icl_combo_phys_init(struct drm_i915_private *dev_priv);
Thomas Zimmermann 34ce7c
+void icl_combo_phys_uninit(struct drm_i915_private *dev_priv);
Thomas Zimmermann 34ce7c
+void cnl_combo_phys_init(struct drm_i915_private *dev_priv);
Thomas Zimmermann 34ce7c
+void cnl_combo_phys_uninit(struct drm_i915_private *dev_priv);
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
 int intel_gpu_freq(struct drm_i915_private *dev_priv, int val);
Thomas Zimmermann 34ce7c
 int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
Thomas Zimmermann 34ce7c
 u64 intel_rc6_residency_ns(struct drm_i915_private *dev_priv,
Thomas Zimmermann 34ce7c
--- /dev/null
Thomas Zimmermann 34ce7c
+++ b/drivers/gpu/drm/i915/intel_combo_phy.c
Thomas Zimmermann 34ce7c
@@ -0,0 +1,141 @@
Thomas Zimmermann 34ce7c
+// SPDX-License-Identifier: MIT
Thomas Zimmermann 34ce7c
+/*
Thomas Zimmermann 34ce7c
+ * Copyright © 2018 Intel Corporation
Thomas Zimmermann 34ce7c
+ */
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+#include "intel_drv.h"
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+enum {
Thomas Zimmermann 34ce7c
+	PROCMON_0_85V_DOT_0,
Thomas Zimmermann 34ce7c
+	PROCMON_0_95V_DOT_0,
Thomas Zimmermann 34ce7c
+	PROCMON_0_95V_DOT_1,
Thomas Zimmermann 34ce7c
+	PROCMON_1_05V_DOT_0,
Thomas Zimmermann 34ce7c
+	PROCMON_1_05V_DOT_1,
Thomas Zimmermann 34ce7c
+};
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+static const struct cnl_procmon {
Thomas Zimmermann 34ce7c
+	u32 dw1, dw9, dw10;
Thomas Zimmermann 34ce7c
+} cnl_procmon_values[] = {
Thomas Zimmermann 34ce7c
+	[PROCMON_0_85V_DOT_0] =
Thomas Zimmermann 34ce7c
+		{ .dw1 = 0x00000000, .dw9 = 0x62AB67BB, .dw10 = 0x51914F96, },
Thomas Zimmermann 34ce7c
+	[PROCMON_0_95V_DOT_0] =
Thomas Zimmermann 34ce7c
+		{ .dw1 = 0x00000000, .dw9 = 0x86E172C7, .dw10 = 0x77CA5EAB, },
Thomas Zimmermann 34ce7c
+	[PROCMON_0_95V_DOT_1] =
Thomas Zimmermann 34ce7c
+		{ .dw1 = 0x00000000, .dw9 = 0x93F87FE1, .dw10 = 0x8AE871C5, },
Thomas Zimmermann 34ce7c
+	[PROCMON_1_05V_DOT_0] =
Thomas Zimmermann 34ce7c
+		{ .dw1 = 0x00000000, .dw9 = 0x98FA82DD, .dw10 = 0x89E46DC1, },
Thomas Zimmermann 34ce7c
+	[PROCMON_1_05V_DOT_1] =
Thomas Zimmermann 34ce7c
+		{ .dw1 = 0x00440000, .dw9 = 0x9A00AB25, .dw10 = 0x8AE38FF1, },
Thomas Zimmermann 34ce7c
+};
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+/*
Thomas Zimmermann 34ce7c
+ * CNL has just one set of registers, while ICL has two sets: one for port A and
Thomas Zimmermann 34ce7c
+ * the other for port B. The CNL registers are equivalent to the ICL port A
Thomas Zimmermann 34ce7c
+ * registers, that's why we call the ICL macros even though the function has CNL
Thomas Zimmermann 34ce7c
+ * on its name.
Thomas Zimmermann 34ce7c
+ */
Thomas Zimmermann 34ce7c
+static void cnl_set_procmon_ref_values(struct drm_i915_private *dev_priv,
Thomas Zimmermann 34ce7c
+				       enum port port)
Thomas Zimmermann 34ce7c
+{
Thomas Zimmermann 34ce7c
+	const struct cnl_procmon *procmon;
Thomas Zimmermann 34ce7c
+	u32 val;
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	val = I915_READ(ICL_PORT_COMP_DW3(port));
Thomas Zimmermann 34ce7c
+	switch (val & (PROCESS_INFO_MASK | VOLTAGE_INFO_MASK)) {
Thomas Zimmermann 34ce7c
+	default:
Thomas Zimmermann 34ce7c
+		MISSING_CASE(val);
Thomas Zimmermann 34ce7c
+		/* fall through */
Thomas Zimmermann 34ce7c
+	case VOLTAGE_INFO_0_85V | PROCESS_INFO_DOT_0:
Thomas Zimmermann 34ce7c
+		procmon = &cnl_procmon_values[PROCMON_0_85V_DOT_0];
Thomas Zimmermann 34ce7c
+		break;
Thomas Zimmermann 34ce7c
+	case VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_0:
Thomas Zimmermann 34ce7c
+		procmon = &cnl_procmon_values[PROCMON_0_95V_DOT_0];
Thomas Zimmermann 34ce7c
+		break;
Thomas Zimmermann 34ce7c
+	case VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_1:
Thomas Zimmermann 34ce7c
+		procmon = &cnl_procmon_values[PROCMON_0_95V_DOT_1];
Thomas Zimmermann 34ce7c
+		break;
Thomas Zimmermann 34ce7c
+	case VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_0:
Thomas Zimmermann 34ce7c
+		procmon = &cnl_procmon_values[PROCMON_1_05V_DOT_0];
Thomas Zimmermann 34ce7c
+		break;
Thomas Zimmermann 34ce7c
+	case VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_1:
Thomas Zimmermann 34ce7c
+		procmon = &cnl_procmon_values[PROCMON_1_05V_DOT_1];
Thomas Zimmermann 34ce7c
+		break;
Thomas Zimmermann 34ce7c
+	}
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	val = I915_READ(ICL_PORT_COMP_DW1(port));
Thomas Zimmermann 34ce7c
+	val &= ~((0xff << 16) | 0xff);
Thomas Zimmermann 34ce7c
+	val |= procmon->dw1;
Thomas Zimmermann 34ce7c
+	I915_WRITE(ICL_PORT_COMP_DW1(port), val);
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	I915_WRITE(ICL_PORT_COMP_DW9(port), procmon->dw9);
Thomas Zimmermann 34ce7c
+	I915_WRITE(ICL_PORT_COMP_DW10(port), procmon->dw10);
Thomas Zimmermann 34ce7c
+}
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+void cnl_combo_phys_init(struct drm_i915_private *dev_priv)
Thomas Zimmermann 34ce7c
+{
Thomas Zimmermann 34ce7c
+	u32 val;
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	val = I915_READ(CHICKEN_MISC_2);
Thomas Zimmermann 34ce7c
+	val &= ~CNL_COMP_PWR_DOWN;
Thomas Zimmermann 34ce7c
+	I915_WRITE(CHICKEN_MISC_2, val);
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	/* Dummy PORT_A to get the correct CNL register from the ICL macro */
Thomas Zimmermann 34ce7c
+	cnl_set_procmon_ref_values(dev_priv, PORT_A);
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	val = I915_READ(CNL_PORT_COMP_DW0);
Thomas Zimmermann 34ce7c
+	val |= COMP_INIT;
Thomas Zimmermann 34ce7c
+	I915_WRITE(CNL_PORT_COMP_DW0, val);
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	val = I915_READ(CNL_PORT_CL1CM_DW5);
Thomas Zimmermann 34ce7c
+	val |= CL_POWER_DOWN_ENABLE;
Thomas Zimmermann 34ce7c
+	I915_WRITE(CNL_PORT_CL1CM_DW5, val);
Thomas Zimmermann 34ce7c
+}
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+void cnl_combo_phys_uninit(struct drm_i915_private *dev_priv)
Thomas Zimmermann 34ce7c
+{
Thomas Zimmermann 34ce7c
+	u32 val;
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	val = I915_READ(CHICKEN_MISC_2);
Thomas Zimmermann 34ce7c
+	val |= CNL_COMP_PWR_DOWN;
Thomas Zimmermann 34ce7c
+	I915_WRITE(CHICKEN_MISC_2, val);
Thomas Zimmermann 34ce7c
+}
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+void icl_combo_phys_init(struct drm_i915_private *dev_priv)
Thomas Zimmermann 34ce7c
+{
Thomas Zimmermann 34ce7c
+	enum port port;
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	for (port = PORT_A; port <= PORT_B; port++) {
Thomas Zimmermann 34ce7c
+		u32 val;
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+		val = I915_READ(ICL_PHY_MISC(port));
Thomas Zimmermann 34ce7c
+		val &= ~ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN;
Thomas Zimmermann 34ce7c
+		I915_WRITE(ICL_PHY_MISC(port), val);
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+		cnl_set_procmon_ref_values(dev_priv, port);
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+		val = I915_READ(ICL_PORT_COMP_DW0(port));
Thomas Zimmermann 34ce7c
+		val |= COMP_INIT;
Thomas Zimmermann 34ce7c
+		I915_WRITE(ICL_PORT_COMP_DW0(port), val);
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+		val = I915_READ(ICL_PORT_CL_DW5(port));
Thomas Zimmermann 34ce7c
+		val |= CL_POWER_DOWN_ENABLE;
Thomas Zimmermann 34ce7c
+		I915_WRITE(ICL_PORT_CL_DW5(port), val);
Thomas Zimmermann 34ce7c
+	}
Thomas Zimmermann 34ce7c
+}
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+void icl_combo_phys_uninit(struct drm_i915_private *dev_priv)
Thomas Zimmermann 34ce7c
+{
Thomas Zimmermann 34ce7c
+	enum port port;
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+	for (port = PORT_A; port <= PORT_B; port++) {
Thomas Zimmermann 34ce7c
+		u32 val;
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+		val = I915_READ(ICL_PHY_MISC(port));
Thomas Zimmermann 34ce7c
+		val |= ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN;
Thomas Zimmermann 34ce7c
+		I915_WRITE(ICL_PHY_MISC(port), val);
Thomas Zimmermann 34ce7c
+
Thomas Zimmermann 34ce7c
+		val = I915_READ(ICL_PORT_COMP_DW0(port));
Thomas Zimmermann 34ce7c
+		val &= ~COMP_INIT;
Thomas Zimmermann 34ce7c
+		I915_WRITE(ICL_PORT_COMP_DW0(port), val);
Thomas Zimmermann 34ce7c
+	}
Thomas Zimmermann 34ce7c
+}
Thomas Zimmermann 34ce7c
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
Thomas Zimmermann 34ce7c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
Thomas Zimmermann 34ce7c
@@ -3464,72 +3464,6 @@ void bxt_display_core_uninit(struct drm_
Thomas Zimmermann 34ce7c
 	usleep_range(10, 30);		/* 10 us delay per Bspec */
Thomas Zimmermann 34ce7c
 }
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
-enum {
Thomas Zimmermann 34ce7c
-	PROCMON_0_85V_DOT_0,
Thomas Zimmermann 34ce7c
-	PROCMON_0_95V_DOT_0,
Thomas Zimmermann 34ce7c
-	PROCMON_0_95V_DOT_1,
Thomas Zimmermann 34ce7c
-	PROCMON_1_05V_DOT_0,
Thomas Zimmermann 34ce7c
-	PROCMON_1_05V_DOT_1,
Thomas Zimmermann 34ce7c
-};
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-static const struct cnl_procmon {
Thomas Zimmermann 34ce7c
-	u32 dw1, dw9, dw10;
Thomas Zimmermann 34ce7c
-} cnl_procmon_values[] = {
Thomas Zimmermann 34ce7c
-	[PROCMON_0_85V_DOT_0] =
Thomas Zimmermann 34ce7c
-		{ .dw1 = 0x00000000, .dw9 = 0x62AB67BB, .dw10 = 0x51914F96, },
Thomas Zimmermann 34ce7c
-	[PROCMON_0_95V_DOT_0] =
Thomas Zimmermann 34ce7c
-		{ .dw1 = 0x00000000, .dw9 = 0x86E172C7, .dw10 = 0x77CA5EAB, },
Thomas Zimmermann 34ce7c
-	[PROCMON_0_95V_DOT_1] =
Thomas Zimmermann 34ce7c
-		{ .dw1 = 0x00000000, .dw9 = 0x93F87FE1, .dw10 = 0x8AE871C5, },
Thomas Zimmermann 34ce7c
-	[PROCMON_1_05V_DOT_0] =
Thomas Zimmermann 34ce7c
-		{ .dw1 = 0x00000000, .dw9 = 0x98FA82DD, .dw10 = 0x89E46DC1, },
Thomas Zimmermann 34ce7c
-	[PROCMON_1_05V_DOT_1] =
Thomas Zimmermann 34ce7c
-		{ .dw1 = 0x00440000, .dw9 = 0x9A00AB25, .dw10 = 0x8AE38FF1, },
Thomas Zimmermann 34ce7c
-};
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-/*
Thomas Zimmermann 34ce7c
- * CNL has just one set of registers, while ICL has two sets: one for port A and
Thomas Zimmermann 34ce7c
- * the other for port B. The CNL registers are equivalent to the ICL port A
Thomas Zimmermann 34ce7c
- * registers, that's why we call the ICL macros even though the function has CNL
Thomas Zimmermann 34ce7c
- * on its name.
Thomas Zimmermann 34ce7c
- */
Thomas Zimmermann 34ce7c
-static void cnl_set_procmon_ref_values(struct drm_i915_private *dev_priv,
Thomas Zimmermann 34ce7c
-				       enum port port)
Thomas Zimmermann 34ce7c
-{
Thomas Zimmermann 34ce7c
-	const struct cnl_procmon *procmon;
Thomas Zimmermann 34ce7c
-	u32 val;
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-	val = I915_READ(ICL_PORT_COMP_DW3(port));
Thomas Zimmermann 34ce7c
-	switch (val & (PROCESS_INFO_MASK | VOLTAGE_INFO_MASK)) {
Thomas Zimmermann 34ce7c
-	default:
Thomas Zimmermann 34ce7c
-		MISSING_CASE(val);
Thomas Zimmermann 34ce7c
-		/* fall through */
Thomas Zimmermann 34ce7c
-	case VOLTAGE_INFO_0_85V | PROCESS_INFO_DOT_0:
Thomas Zimmermann 34ce7c
-		procmon = &cnl_procmon_values[PROCMON_0_85V_DOT_0];
Thomas Zimmermann 34ce7c
-		break;
Thomas Zimmermann 34ce7c
-	case VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_0:
Thomas Zimmermann 34ce7c
-		procmon = &cnl_procmon_values[PROCMON_0_95V_DOT_0];
Thomas Zimmermann 34ce7c
-		break;
Thomas Zimmermann 34ce7c
-	case VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_1:
Thomas Zimmermann 34ce7c
-		procmon = &cnl_procmon_values[PROCMON_0_95V_DOT_1];
Thomas Zimmermann 34ce7c
-		break;
Thomas Zimmermann 34ce7c
-	case VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_0:
Thomas Zimmermann 34ce7c
-		procmon = &cnl_procmon_values[PROCMON_1_05V_DOT_0];
Thomas Zimmermann 34ce7c
-		break;
Thomas Zimmermann 34ce7c
-	case VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_1:
Thomas Zimmermann 34ce7c
-		procmon = &cnl_procmon_values[PROCMON_1_05V_DOT_1];
Thomas Zimmermann 34ce7c
-		break;
Thomas Zimmermann 34ce7c
-	}
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-	val = I915_READ(ICL_PORT_COMP_DW1(port));
Thomas Zimmermann 34ce7c
-	val &= ~((0xff << 16) | 0xff);
Thomas Zimmermann 34ce7c
-	val |= procmon->dw1;
Thomas Zimmermann 34ce7c
-	I915_WRITE(ICL_PORT_COMP_DW1(port), val);
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-	I915_WRITE(ICL_PORT_COMP_DW9(port), procmon->dw9);
Thomas Zimmermann 34ce7c
-	I915_WRITE(ICL_PORT_COMP_DW10(port), procmon->dw10);
Thomas Zimmermann 34ce7c
-}
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
 static void cnl_display_core_init(struct drm_i915_private *dev_priv, bool resume)
Thomas Zimmermann 34ce7c
 {
Thomas Zimmermann 34ce7c
 	struct i915_power_domains *power_domains = &dev_priv->power_domains;
Thomas Zimmermann 34ce7c
@@ -3543,22 +3477,8 @@ static void cnl_display_core_init(struct
Thomas Zimmermann 34ce7c
 	val |= RESET_PCH_HANDSHAKE_ENABLE;
Thomas Zimmermann 34ce7c
 	I915_WRITE(HSW_NDE_RSTWRN_OPT, val);
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
-	/* 2. Enable Comp */
Thomas Zimmermann 34ce7c
-	val = I915_READ(CHICKEN_MISC_2);
Thomas Zimmermann 34ce7c
-	val &= ~CNL_COMP_PWR_DOWN;
Thomas Zimmermann 34ce7c
-	I915_WRITE(CHICKEN_MISC_2, val);
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-	/* Dummy PORT_A to get the correct CNL register from the ICL macro */
Thomas Zimmermann 34ce7c
-	cnl_set_procmon_ref_values(dev_priv, PORT_A);
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-	val = I915_READ(CNL_PORT_COMP_DW0);
Thomas Zimmermann 34ce7c
-	val |= COMP_INIT;
Thomas Zimmermann 34ce7c
-	I915_WRITE(CNL_PORT_COMP_DW0, val);
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-	/* 3. */
Thomas Zimmermann 34ce7c
-	val = I915_READ(CNL_PORT_CL1CM_DW5);
Thomas Zimmermann 34ce7c
-	val |= CL_POWER_DOWN_ENABLE;
Thomas Zimmermann 34ce7c
-	I915_WRITE(CNL_PORT_CL1CM_DW5, val);
Thomas Zimmermann 34ce7c
+	/* 2-3. */
Thomas Zimmermann 34ce7c
+	cnl_combo_phys_init(dev_priv);
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
 	/*
Thomas Zimmermann 34ce7c
 	 * 4. Enable Power Well 1 (PG1).
Thomas Zimmermann 34ce7c
@@ -3583,7 +3503,6 @@ static void cnl_display_core_uninit(stru
Thomas Zimmermann 34ce7c
 {
Thomas Zimmermann 34ce7c
 	struct i915_power_domains *power_domains = &dev_priv->power_domains;
Thomas Zimmermann 34ce7c
 	struct i915_power_well *well;
Thomas Zimmermann 34ce7c
-	u32 val;
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
 	gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
@@ -3607,10 +3526,8 @@ static void cnl_display_core_uninit(stru
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
 	usleep_range(10, 30);		/* 10 us delay per Bspec */
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
-	/* 5. Disable Comp */
Thomas Zimmermann 34ce7c
-	val = I915_READ(CHICKEN_MISC_2);
Thomas Zimmermann 34ce7c
-	val |= CNL_COMP_PWR_DOWN;
Thomas Zimmermann 34ce7c
-	I915_WRITE(CHICKEN_MISC_2, val);
Thomas Zimmermann 34ce7c
+	/* 5. */
Thomas Zimmermann 34ce7c
+	cnl_combo_phys_uninit(dev_priv);
Thomas Zimmermann 34ce7c
 }
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
 void icl_display_core_init(struct drm_i915_private *dev_priv,
Thomas Zimmermann 34ce7c
@@ -3618,7 +3535,6 @@ void icl_display_core_init(struct drm_i9
Thomas Zimmermann 34ce7c
 {
Thomas Zimmermann 34ce7c
 	struct i915_power_domains *power_domains = &dev_priv->power_domains;
Thomas Zimmermann 34ce7c
 	struct i915_power_well *well;
Thomas Zimmermann 34ce7c
-	enum port port;
Thomas Zimmermann 34ce7c
 	u32 val;
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
 	gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
Thomas Zimmermann 34ce7c
@@ -3628,23 +3544,8 @@ void icl_display_core_init(struct drm_i9
Thomas Zimmermann 34ce7c
 	val |= RESET_PCH_HANDSHAKE_ENABLE;
Thomas Zimmermann 34ce7c
 	I915_WRITE(HSW_NDE_RSTWRN_OPT, val);
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
-	for (port = PORT_A; port <= PORT_B; port++) {
Thomas Zimmermann 34ce7c
-		/* 2. Enable DDI combo PHY comp. */
Thomas Zimmermann 34ce7c
-		val = I915_READ(ICL_PHY_MISC(port));
Thomas Zimmermann 34ce7c
-		val &= ~ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN;
Thomas Zimmermann 34ce7c
-		I915_WRITE(ICL_PHY_MISC(port), val);
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-		cnl_set_procmon_ref_values(dev_priv, port);
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-		val = I915_READ(ICL_PORT_COMP_DW0(port));
Thomas Zimmermann 34ce7c
-		val |= COMP_INIT;
Thomas Zimmermann 34ce7c
-		I915_WRITE(ICL_PORT_COMP_DW0(port), val);
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-		/* 3. Set power down enable. */
Thomas Zimmermann 34ce7c
-		val = I915_READ(ICL_PORT_CL_DW5(port));
Thomas Zimmermann 34ce7c
-		val |= CL_POWER_DOWN_ENABLE;
Thomas Zimmermann 34ce7c
-		I915_WRITE(ICL_PORT_CL_DW5(port), val);
Thomas Zimmermann 34ce7c
-	}
Thomas Zimmermann 34ce7c
+	/* 2-3. */
Thomas Zimmermann 34ce7c
+	icl_combo_phys_init(dev_priv);
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
 	/*
Thomas Zimmermann 34ce7c
 	 * 4. Enable Power Well 1 (PG1).
Thomas Zimmermann 34ce7c
@@ -3672,8 +3573,6 @@ void icl_display_core_uninit(struct drm_
Thomas Zimmermann 34ce7c
 {
Thomas Zimmermann 34ce7c
 	struct i915_power_domains *power_domains = &dev_priv->power_domains;
Thomas Zimmermann 34ce7c
 	struct i915_power_well *well;
Thomas Zimmermann 34ce7c
-	enum port port;
Thomas Zimmermann 34ce7c
-	u32 val;
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
 	gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
@@ -3695,16 +3594,8 @@ void icl_display_core_uninit(struct drm_
Thomas Zimmermann 34ce7c
 	intel_power_well_disable(dev_priv, well);
Thomas Zimmermann 34ce7c
 	mutex_unlock(&power_domains->lock);
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
-	/* 5. Disable Comp */
Thomas Zimmermann 34ce7c
-	for (port = PORT_A; port <= PORT_B; port++) {
Thomas Zimmermann 34ce7c
-		val = I915_READ(ICL_PHY_MISC(port));
Thomas Zimmermann 34ce7c
-		val |= ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN;
Thomas Zimmermann 34ce7c
-		I915_WRITE(ICL_PHY_MISC(port), val);
Thomas Zimmermann 34ce7c
-
Thomas Zimmermann 34ce7c
-		val = I915_READ(ICL_PORT_COMP_DW0(port));
Thomas Zimmermann 34ce7c
-		val &= ~COMP_INIT;
Thomas Zimmermann 34ce7c
-		I915_WRITE(ICL_PORT_COMP_DW0(port), val);
Thomas Zimmermann 34ce7c
-	}
Thomas Zimmermann 34ce7c
+	/* 5. */
Thomas Zimmermann 34ce7c
+	icl_combo_phys_uninit(dev_priv);
Thomas Zimmermann 34ce7c
 }
Thomas Zimmermann 34ce7c
 
Thomas Zimmermann 34ce7c
 static void chv_phy_control_init(struct drm_i915_private *dev_priv)