Skip to contentSkip to conversation

drm/i915/icl: Fix HDMI on TypeC static ports

PATCH Superseded Imre Deak 5 participants 42 messages Oct 30, 2018 – Oct 31, 2018

Subsystems (2)

v1 of 4 Superseded Latest is v4 →

lore
Share & tools
lore

Imre Deak

author
#0 lore raw

cover drm/i915/icl: Fix HDMI on TypeC static ports

ICL has repurposed some of the AUX HW signals/flags, so that we have to program these for HDMI too. In practice this means enabling the AUX power well for HDMI mode too.

The last patch fixes an issue where BIOS leaves the PLL->port mapping enabled even though the corresponding encoder is disabled. This happens at least on ICL when booting with an HDMI output connected, where the PLL->port mapping will be enabled for eDP, while the eDP encoder is disabled.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>

Imre Deak (8):
drm/i915: Move intel_aux_ch() to intel_bios.c drm/i915: Move aux_ch to intel_digital_port
drm/i915: Init aux_ch for HDMI ports too
drm/i915: Use a helper to get the aux power domain drm/i915: Enable AUX power earlier
drm/i915: Enable AUX power for HDMI DDI/TypeC main link too drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain drm/i915/icl+: Sanitize port to PLL mapping

 drivers/gpu/drm/i915/i915_drv.h         |   2 +
 drivers/gpu/drm/i915/intel_bios.c       |  45 ++++++++++
 drivers/gpu/drm/i915/intel_ddi.c        |  81 +++++++++++++----
 drivers/gpu/drm/i915/intel_display.c    |  28 ++++++
 drivers/gpu/drm/i915/intel_dp.c         | 148 +++++++++++---------------------
 drivers/gpu/drm/i915/intel_drv.h        |   6 +-
 drivers/gpu/drm/i915/intel_hdmi.c       |   1 +
 drivers/gpu/drm/i915/intel_runtime_pm.c |  69 +++++++++++++--
 8 files changed, 257 insertions(+), 123 deletions(-)
Signature · 34 lines
2.13.2




*** BLURB HERE ***

Imre Deak (8):
  drm/i915: Move intel_aux_ch() to intel_bios.c
  drm/i915: Move aux_ch to intel_digital_port
  drm/i915: Init aux_ch for HDMI ports too
  drm/i915: Use a helper to get the aux power domain
  drm/i915: Enable AUX power earlier
  drm/i915: Enable AUX power for HDMI DDI/TypeC main link too
  drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain
  drm/i915/icl+: Sanitize port to PLL mapping

 drivers/gpu/drm/i915/i915_drv.h         |   2 +
 drivers/gpu/drm/i915/intel_bios.c       |  45 ++++++++++
 drivers/gpu/drm/i915/intel_ddi.c        |  81 +++++++++++++----
 drivers/gpu/drm/i915/intel_display.c    |  28 ++++++
 drivers/gpu/drm/i915/intel_dp.c         | 148 +++++++++++---------------------
 drivers/gpu/drm/i915/intel_drv.h        |   6 +-
 drivers/gpu/drm/i915/intel_hdmi.c       |   1 +
 drivers/gpu/drm/i915/intel_runtime_pm.c |  69 +++++++++++++--
 8 files changed, 257 insertions(+), 123 deletions(-)

-- 
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
author
#1 lore raw

PATCH 1/8 drm/i915: Move intel_aux_ch() to intel_bios.c

From ICL onwards all the DDI/TypeC ports - even working in HDMI mode - need to know their corresponding AUX channel, so move the corresponding helper to a common place.

No functional change.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/i915_drv.h   |  1 +
 drivers/gpu/drm/i915/intel_bios.c | 45 +++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_dp.c   | 50 +--------------------------------------
 3 files changed, 47 insertions(+), 49 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index c9e5bab6861b..c57b701f72a7 100644
@@ -3445,6 +3445,7 @@ bool intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
 				     enum port port);
 bool intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,
 				enum port port);
+enum aux_ch intel_aux_ch(struct drm_i915_private *dev_priv, enum port port);
 
 /* intel_acpi.c */
 #ifdef CONFIG_ACPI
drivers/gpu/drm/i915/intel_bios.c +45 -0

48 lines not on this page · raw message

drivers/gpu/drm/i915/intel_dp.c +1 -49

62 lines not on this page · raw message

Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Reviewed-by on v1 1/8
#2 lore raw

Re: [PATCH 1/8] drm/i915: Move intel_aux_ch() to intel_bios.c

Quoted 8 lines · Imre Deak

From ICL onwards all the DDI/TypeC ports - even working in HDMI mode -
need to know their corresponding AUX channel, so move the corresponding
helper to a common place.

No functional change.

Quoted 155 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/i915_drv.h   |  1 +
 drivers/gpu/drm/i915/intel_bios.c | 45
+++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_dp.c   | 50 +--------------------------
------------
 3 files changed, 47 insertions(+), 49 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index c9e5bab6861b..c57b701f72a7 100644
@@ -3445,6 +3445,7 @@ bool intel_bios_is_port_hpd_inverted(struct
 drm_i915_private *dev_priv,
 				     enum port port);
 bool intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,
 				enum port port);
+enum aux_ch intel_aux_ch(struct drm_i915_private *dev_priv, enum
 port port);
 

/* intel_acpi.c */
#ifdef CONFIG_ACPI

drivers/gpu/drm/i915/intel_bios.c +2 -0
index 1faa494e2bc9..c7682a470c6a 100644
@@ -2159,3 +2159,48 @@ intel_bios_is_lspcon_present(struct
 drm_i915_private *dev_priv,
 
 	return false;
 }
+
+enum aux_ch intel_aux_ch(struct drm_i915_private *dev_priv, enum

port port)

drivers/gpu/drm/i915/intel_bios.c +9 -0
+{
+	const struct ddi_vbt_port_info *info =
+		&dev_priv->vbt.ddi_port_info[port];
+	enum aux_ch aux_ch;
+
+	if (!info->alternate_aux_channel) {
+		aux_ch = (enum aux_ch) port;
+
+		DRM_DEBUG_KMS("using AUX %c for port %c (platform

default)\n",

drivers/gpu/drm/i915/intel_bios.c +34 -0
+			      aux_ch_name(aux_ch), port_name(port));
+		return aux_ch;
+	}
+
+	switch (info->alternate_aux_channel) {
+	case DP_AUX_A:
+		aux_ch = AUX_CH_A;
+		break;
+	case DP_AUX_B:
+		aux_ch = AUX_CH_B;
+		break;
+	case DP_AUX_C:
+		aux_ch = AUX_CH_C;
+		break;
+	case DP_AUX_D:
+		aux_ch = AUX_CH_D;
+		break;
+	case DP_AUX_E:
+		aux_ch = AUX_CH_E;
+		break;
+	case DP_AUX_F:
+		aux_ch = AUX_CH_F;
+		break;
+	default:
+		MISSING_CASE(info->alternate_aux_channel);
+		aux_ch = AUX_CH_A;
+		break;
+	}
+
+	DRM_DEBUG_KMS("using AUX %c for port %c (VBT)\n",
+		      aux_ch_name(aux_ch), port_name(port));
+
+	return aux_ch;
+}
drivers/gpu/drm/i915/intel_dp.c +0 -48
index 6b37d66194a3..2445897b8f6c 100644
@@ -1503,54 +1503,6 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux,
 struct drm_dp_aux_msg *msg)
 	return ret;
 }
 
-static enum aux_ch intel_aux_ch(struct intel_dp *intel_dp)
-{
-	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)-
 >base;
-	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
-	enum port port = encoder->port;
-	const struct ddi_vbt_port_info *info =
-		&dev_priv->vbt.ddi_port_info[port];
-	enum aux_ch aux_ch;
-
-	if (!info->alternate_aux_channel) {
-		aux_ch = (enum aux_ch) port;
-
-		DRM_DEBUG_KMS("using AUX %c for port %c (platform
 default)\n",
-			      aux_ch_name(aux_ch), port_name(port));
-		return aux_ch;
-	}
-
-	switch (info->alternate_aux_channel) {
-	case DP_AUX_A:
-		aux_ch = AUX_CH_A;
-		break;
-	case DP_AUX_B:
-		aux_ch = AUX_CH_B;
-		break;
-	case DP_AUX_C:
-		aux_ch = AUX_CH_C;
-		break;
-	case DP_AUX_D:
-		aux_ch = AUX_CH_D;
-		break;
-	case DP_AUX_E:
-		aux_ch = AUX_CH_E;
-		break;
-	case DP_AUX_F:
-		aux_ch = AUX_CH_F;
-		break;
-	default:
-		MISSING_CASE(info->alternate_aux_channel);
-		aux_ch = AUX_CH_A;
-		break;
-	}
-
-	DRM_DEBUG_KMS("using AUX %c for port %c (VBT)\n",
-		      aux_ch_name(aux_ch), port_name(port));
-
-	return aux_ch;
-}
-

static enum intel_display_power_domain intel_aux_power_domain(struct intel_dp *intel_dp) {

drivers/gpu/drm/i915/intel_dp.c +1 -1
@@ -1691,7 +1643,7 @@ intel_dp_aux_init(struct intel_dp *intel_dp)
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)-
 >base;
 
-	intel_dp->aux_ch = intel_aux_ch(intel_dp);
+	intel_dp->aux_ch = intel_aux_ch(dev_priv, encoder->port);
 	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
 
Quoted 1 line

if (INTEL_GEN(dev_priv) >= 9) {

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#3 lore raw

PATCH 2/8 drm/i915: Move aux_ch to intel_digital_port

In reply to Imre Deak

From ICL onwards all DDI/TypeC ports - even working in HDMI mode - need to know their corresponding AUX CH, so move the field to a common struct.

No functional change.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c |  4 +++-
 drivers/gpu/drm/i915/intel_dp.c  | 35 +++++++++++++++++++++++------------
 drivers/gpu/drm/i915/intel_drv.h |  2 +-
 3 files changed, 27 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +3 -1
index e40a8c97d34b..32a080265d03 100644
@@ -2084,6 +2084,8 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
 static inline enum intel_display_power_domain
 intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
 {
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for PSR with
 	 * DC states enabled at the same time, while for driver initiated AUX
 	 * transfers we need the same AUX IOs to be powered but with DC states
@@ -2096,7 +2098,7 @@ intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
 	 * Note that PSR is enabled only on Port A even though this function
 	 * returns the correct domain for other ports too.
 	 */
-	return intel_dp->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
+	return dig_port->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
 					      intel_dp->aux_power_domain;
 }
 
drivers/gpu/drm/i915/intel_dp.c +23 -12
index 2445897b8f6c..5530c604c694 100644
@@ -1156,6 +1156,7 @@ static uint32_t g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 
 	if (index)
 		return 0;
@@ -1165,7 +1166,7 @@ static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 	 * like to run at 2MHz.  So, take the cdclk or PCH rawclk value and
 	 * divide by 2000 and use that
 	 */
-	if (intel_dp->aux_ch == AUX_CH_A)
+	if (dig_port->aux_ch == AUX_CH_A)
 		return DIV_ROUND_CLOSEST(dev_priv->cdclk.hw.cdclk, 2000);
 	else
 		return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
@@ -1174,8 +1175,9 @@ static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 
-	if (intel_dp->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) {
+	if (dig_port->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) {
 		/* Workaround for non-ULT HSW */
 		switch (index) {
 		case 0: return 63;
@@ -1506,7 +1508,9 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 static enum intel_display_power_domain
 intel_aux_power_domain(struct intel_dp *intel_dp)
 {
-	switch (intel_dp->aux_ch) {
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+
+	switch (dig_port->aux_ch) {
 	case AUX_CH_A:
 		return POWER_DOMAIN_AUX_A;
 	case AUX_CH_B:
@@ -1520,7 +1524,7 @@ intel_aux_power_domain(struct intel_dp *intel_dp)
 	case AUX_CH_F:
 		return POWER_DOMAIN_AUX_F;
 	default:
-		MISSING_CASE(intel_dp->aux_ch);
+		MISSING_CASE(dig_port->aux_ch);
 		return POWER_DOMAIN_AUX_A;
 	}
 }
@@ -1528,7 +1532,8 @@ intel_aux_power_domain(struct intel_dp *intel_dp)
 static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
 	case AUX_CH_B:
@@ -1544,7 +1549,8 @@ static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
 static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
 	case AUX_CH_B:
@@ -1560,7 +1566,8 @@ static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index)
 static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
 	case AUX_CH_A:
@@ -1578,7 +1585,8 @@ static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
 static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
 	case AUX_CH_A:
@@ -1596,7 +1604,8 @@ static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index)
 static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
 	case AUX_CH_A:
@@ -1615,7 +1624,8 @@ static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
 static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
 	case AUX_CH_A:
@@ -1641,9 +1651,10 @@ static void
 intel_dp_aux_init(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	struct intel_encoder *encoder = &dig_port->base;
 
-	intel_dp->aux_ch = intel_aux_ch(dev_priv, encoder->port);
+	dig_port->aux_ch = intel_aux_ch(dev_priv, encoder->port);
 	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
 
 	if (INTEL_GEN(dev_priv) >= 9) {
drivers/gpu/drm/i915/intel_drv.h +1 -1
index 268afb6d2746..a242a118389d 100644
@@ -1109,7 +1109,6 @@ struct intel_dp {
 	bool link_trained;
 	bool has_audio;
 	bool reset_link_params;
-	enum aux_ch aux_ch;
 	uint8_t dpcd[DP_RECEIVER_CAP_SIZE];
 	uint8_t psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE];
 	uint8_t downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
@@ -1213,6 +1212,7 @@ struct intel_digital_port {
 	enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool);
 	bool release_cl2_override;
 	uint8_t max_lanes;
+	enum aux_ch aux_ch;
 	enum intel_display_power_domain ddi_io_power_domain;
 	enum tc_port_type tc_type;
 
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#4 lore raw

Re: [PATCH 2/8] drm/i915: Move aux_ch to intel_digital_port

Quoted 206 lines · Imre Deak

From ICL onwards all DDI/TypeC ports - even working in HDMI mode - need
to know their corresponding AUX CH, so move the field to a common struct.

No functional change.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c |  4 +++-
 drivers/gpu/drm/i915/intel_dp.c  | 35 +++++++++++++++++++++++-------
-----
 drivers/gpu/drm/i915/intel_drv.h |  2 +-
 3 files changed, 27 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +2 -0
index e40a8c97d34b..32a080265d03 100644
@@ -2084,6 +2084,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 static inline enum intel_display_power_domain
 intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
 {
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for

PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but with DC
states

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2096,7 +2098,7 @@ intel_ddi_main_link_aux_domain(struct intel_dp
 *intel_dp)
 	 * Note that PSR is enabled only on Port A even though this

function

drivers/gpu/drm/i915/intel_ddi.c +1 -1
 	 * returns the correct domain for other ports too.
 	 */
-	return intel_dp->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
+	return dig_port->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
 					      intel_dp-
Quoted 1 line

aux_power_domain;

}

drivers/gpu/drm/i915/intel_dp.c +1 -0
index 2445897b8f6c..5530c604c694 100644
@@ -1156,6 +1156,7 @@ static uint32_t
 g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp,
 int index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 
drivers/gpu/drm/i915/intel_dp.c +0 -0
 	if (index)
 		return 0;
@@ -1165,7 +1166,7 @@ static uint32_t
 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 	 * like to run at 2MHz.  So, take the cdclk or PCH rawclk value

and

drivers/gpu/drm/i915/intel_dp.c +1 -1
 	 * divide by 2000 and use that
 	 */
-	if (intel_dp->aux_ch == AUX_CH_A)
+	if (dig_port->aux_ch == AUX_CH_A)
 		return DIV_ROUND_CLOSEST(dev_priv->cdclk.hw.cdclk,

2000);

drivers/gpu/drm/i915/intel_dp.c +2 -1
 	else
 		return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
@@ -1174,8 +1175,9 @@ static uint32_t
 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp,
 int index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 
-	if (intel_dp->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) {
+	if (dig_port->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) {
 		/* Workaround for non-ULT HSW */
drivers/gpu/drm/i915/intel_dp.c +3 -1
 		switch (index) {
 		case 0: return 63;
@@ -1506,7 +1508,9 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux,
 struct drm_dp_aux_msg *msg)
 static enum intel_display_power_domain
 intel_aux_power_domain(struct intel_dp *intel_dp)
 {
-	switch (intel_dp->aux_ch) {
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+
+	switch (dig_port->aux_ch) {
 	case AUX_CH_A:
 		return POWER_DOMAIN_AUX_A;
drivers/gpu/drm/i915/intel_dp.c +1 -1
 	case AUX_CH_B:
@@ -1520,7 +1524,7 @@ intel_aux_power_domain(struct intel_dp
 *intel_dp)
 	case AUX_CH_F:
 		return POWER_DOMAIN_AUX_F;
 	default:
-		MISSING_CASE(intel_dp->aux_ch);
+		MISSING_CASE(dig_port->aux_ch);
 		return POWER_DOMAIN_AUX_A;
 	}

}

drivers/gpu/drm/i915/intel_dp.c +2 -1
@@ -1528,7 +1532,8 @@ intel_aux_power_domain(struct intel_dp
 *intel_dp)
 static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	case AUX_CH_B:
@@ -1544,7 +1549,8 @@ static i915_reg_t g4x_aux_ctl_reg(struct
 intel_dp *intel_dp)
 static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int
 index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	switch (aux_ch) {
 	case AUX_CH_B:
@@ -1560,7 +1566,8 @@ static i915_reg_t g4x_aux_data_reg(struct
 intel_dp *intel_dp, int index)
 static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	case AUX_CH_A:
@@ -1578,7 +1585,8 @@ static i915_reg_t ilk_aux_ctl_reg(struct
 intel_dp *intel_dp)
 static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int
 index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	switch (aux_ch) {
 	case AUX_CH_A:
@@ -1596,7 +1604,8 @@ static i915_reg_t ilk_aux_data_reg(struct
 intel_dp *intel_dp, int index)
 static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	case AUX_CH_A:
@@ -1615,7 +1624,8 @@ static i915_reg_t skl_aux_ctl_reg(struct
 intel_dp *intel_dp)
 static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int
 index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
drivers/gpu/drm/i915/intel_dp.c +3 -2
 	switch (aux_ch) {
 	case AUX_CH_A:
@@ -1641,9 +1651,10 @@ static void
 intel_dp_aux_init(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)-
 >base;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	struct intel_encoder *encoder = &dig_port->base;
 
-	intel_dp->aux_ch = intel_aux_ch(dev_priv, encoder->port);
+	dig_port->aux_ch = intel_aux_ch(dev_priv, encoder->port);
 	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
 
drivers/gpu/drm/i915/intel_dp.c +0 -0
 	if (INTEL_GEN(dev_priv) >= 9) {
drivers/gpu/drm/i915/intel_drv.h +0 -1
index 268afb6d2746..a242a118389d 100644
@@ -1109,7 +1109,6 @@ struct intel_dp {
 	bool link_trained;
 	bool has_audio;
 	bool reset_link_params;
-	enum aux_ch aux_ch;
 	uint8_t dpcd[DP_RECEIVER_CAP_SIZE];
 	uint8_t psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE];
 	uint8_t downstream_ports[DP_MAX_DOWNSTREAM_PORTS];

drivers/gpu/drm/i915/intel_drv.h struct intel_digital_port { · line 1214

Quoted 3 lines
drivers/gpu/drm/i915/intel_drv.h +0 -0
@@ -1213,6 +1212,7 @@ struct intel_digital_port {
 	enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool);
 	bool release_cl2_override;
 	uint8_t max_lanes;

Please leave a comment here, with the commit message explanation so no one uses it my mistake like using for HDMI in combophy ports.

drivers/gpu/drm/i915/intel_drv.h struct intel_digital_port { · line 1218

Quoted 4 lines
drivers/gpu/drm/i915/intel_drv.h +1 -0
+	enum aux_ch aux_ch;
 	enum intel_display_power_domain ddi_io_power_domain;
 	enum tc_port_type tc_type;
 

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#5 lore raw

Re: [PATCH 2/8] drm/i915: Move aux_ch to intel_digital_port

Quoted 205 lines · Jose
Quoted 204 lines · Imre Deak

From ICL onwards all DDI/TypeC ports - even working in HDMI mode - need
to know their corresponding AUX CH, so move the field to a common struct.

No functional change.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c |  4 +++-
 drivers/gpu/drm/i915/intel_dp.c  | 35 +++++++++++++++++++++++-------
-----
 drivers/gpu/drm/i915/intel_drv.h |  2 +-
 3 files changed, 27 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +2 -0
index e40a8c97d34b..32a080265d03 100644
@@ -2084,6 +2084,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 static inline enum intel_display_power_domain
 intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
 {
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for

PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but with DC
states

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2096,7 +2098,7 @@ intel_ddi_main_link_aux_domain(struct intel_dp
 *intel_dp)
 	 * Note that PSR is enabled only on Port A even though this

function

drivers/gpu/drm/i915/intel_ddi.c +1 -1
 	 * returns the correct domain for other ports too.
 	 */
-	return intel_dp->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
+	return dig_port->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
 					      intel_dp-
Quoted 1 line

aux_power_domain;

}

drivers/gpu/drm/i915/intel_dp.c +1 -0
index 2445897b8f6c..5530c604c694 100644
@@ -1156,6 +1156,7 @@ static uint32_t
 g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp,
 int index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 
drivers/gpu/drm/i915/intel_dp.c +0 -0
 	if (index)
 		return 0;
@@ -1165,7 +1166,7 @@ static uint32_t
 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 	 * like to run at 2MHz.  So, take the cdclk or PCH rawclk value

and

drivers/gpu/drm/i915/intel_dp.c +1 -1
 	 * divide by 2000 and use that
 	 */
-	if (intel_dp->aux_ch == AUX_CH_A)
+	if (dig_port->aux_ch == AUX_CH_A)
 		return DIV_ROUND_CLOSEST(dev_priv->cdclk.hw.cdclk,

2000);

drivers/gpu/drm/i915/intel_dp.c +2 -1
 	else
 		return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
@@ -1174,8 +1175,9 @@ static uint32_t
 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp,
 int index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 
-	if (intel_dp->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) {
+	if (dig_port->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) {
 		/* Workaround for non-ULT HSW */
drivers/gpu/drm/i915/intel_dp.c +3 -1
 		switch (index) {
 		case 0: return 63;
@@ -1506,7 +1508,9 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux,
 struct drm_dp_aux_msg *msg)
 static enum intel_display_power_domain
 intel_aux_power_domain(struct intel_dp *intel_dp)
 {
-	switch (intel_dp->aux_ch) {
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+
+	switch (dig_port->aux_ch) {
 	case AUX_CH_A:
 		return POWER_DOMAIN_AUX_A;
drivers/gpu/drm/i915/intel_dp.c +1 -1
 	case AUX_CH_B:
@@ -1520,7 +1524,7 @@ intel_aux_power_domain(struct intel_dp
 *intel_dp)
 	case AUX_CH_F:
 		return POWER_DOMAIN_AUX_F;
 	default:
-		MISSING_CASE(intel_dp->aux_ch);
+		MISSING_CASE(dig_port->aux_ch);
 		return POWER_DOMAIN_AUX_A;
 	}

}

drivers/gpu/drm/i915/intel_dp.c +2 -1
@@ -1528,7 +1532,8 @@ intel_aux_power_domain(struct intel_dp
 *intel_dp)
 static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	case AUX_CH_B:
@@ -1544,7 +1549,8 @@ static i915_reg_t g4x_aux_ctl_reg(struct
 intel_dp *intel_dp)
 static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int
 index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	switch (aux_ch) {
 	case AUX_CH_B:
@@ -1560,7 +1566,8 @@ static i915_reg_t g4x_aux_data_reg(struct
 intel_dp *intel_dp, int index)
 static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	case AUX_CH_A:
@@ -1578,7 +1585,8 @@ static i915_reg_t ilk_aux_ctl_reg(struct
 intel_dp *intel_dp)
 static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int
 index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	switch (aux_ch) {
 	case AUX_CH_A:
@@ -1596,7 +1604,8 @@ static i915_reg_t ilk_aux_data_reg(struct
 intel_dp *intel_dp, int index)
 static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
 	switch (aux_ch) {
drivers/gpu/drm/i915/intel_dp.c +2 -1
 	case AUX_CH_A:
@@ -1615,7 +1624,8 @@ static i915_reg_t skl_aux_ctl_reg(struct
 intel_dp *intel_dp)
 static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int
 index)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	enum aux_ch aux_ch = intel_dp->aux_ch;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	enum aux_ch aux_ch = dig_port->aux_ch;
 
drivers/gpu/drm/i915/intel_dp.c +3 -2
 	switch (aux_ch) {
 	case AUX_CH_A:
@@ -1641,9 +1651,10 @@ static void
 intel_dp_aux_init(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)-
 >base;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	struct intel_encoder *encoder = &dig_port->base;
 
-	intel_dp->aux_ch = intel_aux_ch(dev_priv, encoder->port);
+	dig_port->aux_ch = intel_aux_ch(dev_priv, encoder->port);
 	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
 
drivers/gpu/drm/i915/intel_dp.c +0 -0
 	if (INTEL_GEN(dev_priv) >= 9) {
drivers/gpu/drm/i915/intel_drv.h +0 -1
index 268afb6d2746..a242a118389d 100644
@@ -1109,7 +1109,6 @@ struct intel_dp {
 	bool link_trained;
 	bool has_audio;
 	bool reset_link_params;
-	enum aux_ch aux_ch;
 	uint8_t dpcd[DP_RECEIVER_CAP_SIZE];
 	uint8_t psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE];
Quoted 8 lines

drivers/gpu/drm/i915/intel_drv.h struct intel_digital_port { · line 1214

Quoted 5 lines
drivers/gpu/drm/i915/intel_drv.h +0 -0
 	uint8_t downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
@@ -1213,6 +1212,7 @@ struct intel_digital_port {
 	enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool);
 	bool release_cl2_override;
 	uint8_t max_lanes;

Please leave a comment here, with the commit message explanation so no one uses it my mistake like using for HDMI in combophy ports.

Ok.

Quoted 5 lines

drivers/gpu/drm/i915/intel_drv.h struct intel_digital_port { · line 1218

Quoted 5 lines
drivers/gpu/drm/i915/intel_drv.h +1 -0
+	enum aux_ch aux_ch;
 	enum intel_display_power_domain ddi_io_power_domain;
 	enum tc_port_type tc_type;
 

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#6 lore raw

PATCH 3/8 drm/i915: Init aux_ch for HDMI ports too

In reply to Imre Deak

From ICL onwards DDI/TypeC ports - even in HDMI static mode - need to know which AUX CH belongs to them, so initialize aux_ch for those ports too. For consistency do this for all HDMI ports, not only for DDI/TypeC ones.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c  | 1 +
 drivers/gpu/drm/i915/intel_dp.c   | 2 +-
 drivers/gpu/drm/i915/intel_hdmi.c | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -0
index 32a080265d03..3739ef003819 100644
@@ -3852,6 +3852,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
 			(DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES);
 	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
 	intel_dig_port->max_lanes = intel_ddi_max_lanes(intel_dig_port);
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);
 
 	switch (port) {
 	case PORT_A:
drivers/gpu/drm/i915/intel_dp.c +1 -1
index 5530c604c694..6645c9faca9a 100644
@@ -1654,7 +1654,6 @@ intel_dp_aux_init(struct intel_dp *intel_dp)
 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	struct intel_encoder *encoder = &dig_port->base;
 
-	dig_port->aux_ch = intel_aux_ch(dev_priv, encoder->port);
 	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
 
 	if (INTEL_GEN(dev_priv) >= 9) {
@@ -6706,6 +6705,7 @@ bool intel_dp_init(struct drm_i915_private *dev_priv,
 	if (port != PORT_A)
 		intel_infoframe_init(intel_dig_port);
 
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);
 	if (!intel_dp_init_connector(intel_dig_port, intel_connector))
 		goto err_init_connector;
 
drivers/gpu/drm/i915/intel_hdmi.c +1 -0
index 129b880bce64..b50c5497048a 100644
@@ -2506,5 +2506,6 @@ void intel_hdmi_init(struct drm_i915_private *dev_priv,
 
 	intel_infoframe_init(intel_dig_port);
 
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);
 	intel_hdmi_init_connector(intel_dig_port, intel_connector);
 }
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#7 lore raw

Re: [PATCH 3/8] drm/i915: Init aux_ch for HDMI ports too

Quoted 59 lines · Imre Deak

From ICL onwards DDI/TypeC ports - even in HDMI static mode - need to know
which AUX CH belongs to them, so initialize aux_ch for those ports too.
For consistency do this for all HDMI ports, not only for DDI/TypeC ones.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c  | 1 +
 drivers/gpu/drm/i915/intel_dp.c   | 2 +-
 drivers/gpu/drm/i915/intel_hdmi.c | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -0
index 32a080265d03..3739ef003819 100644
@@ -3852,6 +3852,7 @@ void intel_ddi_init(struct drm_i915_private
 *dev_priv, enum port port)
 			(DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES);
 	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
 	intel_dig_port->max_lanes =
 intel_ddi_max_lanes(intel_dig_port);
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);
 
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	switch (port) {
 	case PORT_A:
drivers/gpu/drm/i915/intel_dp.c +1 -1
index 5530c604c694..6645c9faca9a 100644
@@ -1654,7 +1654,6 @@ intel_dp_aux_init(struct intel_dp *intel_dp)
 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	struct intel_encoder *encoder = &dig_port->base;
 
-	dig_port->aux_ch = intel_aux_ch(dev_priv, encoder->port);
 	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
 
 	if (INTEL_GEN(dev_priv) >= 9) {
@@ -6706,6 +6705,7 @@ bool intel_dp_init(struct drm_i915_private
 *dev_priv,
 	if (port != PORT_A)
 		intel_infoframe_init(intel_dig_port);
 
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);
 	if (!intel_dp_init_connector(intel_dig_port, intel_connector))
 		goto err_init_connector;
drivers/gpu/drm/i915/intel_hdmi.c +0 -0
index 129b880bce64..b50c5497048a 100644

drivers/gpu/drm/i915/intel_hdmi.c void intel_hdmi_init(struct drm_i915_private · line 2510

Quoted 5 lines
drivers/gpu/drm/i915/intel_hdmi.c +1 -0
@@ -2506,5 +2506,6 @@ void intel_hdmi_init(struct drm_i915_private
 *dev_priv,
 
 	intel_infoframe_init(intel_dig_port);
 
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);

All ICL ports are DDI ports and aux_ch will not be used in previous gens so I don't see the point to set it here and in intel_dp_init().

Quoted 2 lines
drivers/gpu/drm/i915/intel_hdmi.c +0 -0
 	intel_hdmi_init_connector(intel_dig_port, intel_connector);

}

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#8 lore raw

Re: [PATCH 3/8] drm/i915: Init aux_ch for HDMI ports too

Quoted 62 lines · Jose
Quoted 61 lines · Imre Deak

From ICL onwards DDI/TypeC ports - even in HDMI static mode - need to know
which AUX CH belongs to them, so initialize aux_ch for those ports too.
For consistency do this for all HDMI ports, not only for DDI/TypeC ones.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c  | 1 +
 drivers/gpu/drm/i915/intel_dp.c   | 2 +-
 drivers/gpu/drm/i915/intel_hdmi.c | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -0
index 32a080265d03..3739ef003819 100644
@@ -3852,6 +3852,7 @@ void intel_ddi_init(struct drm_i915_private
 *dev_priv, enum port port)
 			(DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES);
 	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
 	intel_dig_port->max_lanes =
 intel_ddi_max_lanes(intel_dig_port);
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);
 
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	switch (port) {
 	case PORT_A:
drivers/gpu/drm/i915/intel_dp.c +1 -1
index 5530c604c694..6645c9faca9a 100644
@@ -1654,7 +1654,6 @@ intel_dp_aux_init(struct intel_dp *intel_dp)
 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	struct intel_encoder *encoder = &dig_port->base;
 
-	dig_port->aux_ch = intel_aux_ch(dev_priv, encoder->port);
 	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
 
 	if (INTEL_GEN(dev_priv) >= 9) {
@@ -6706,6 +6705,7 @@ bool intel_dp_init(struct drm_i915_private
 *dev_priv,
 	if (port != PORT_A)
 		intel_infoframe_init(intel_dig_port);
 
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);
 	if (!intel_dp_init_connector(intel_dig_port, intel_connector))
 		goto err_init_connector;
drivers/gpu/drm/i915/intel_hdmi.c +0 -0
index 129b880bce64..b50c5497048a 100644
@@ -2506,5 +2506,6 @@ void intel_hdmi_init(struct drm_i915_private
 *dev_priv,
 
Quoted 6 lines

drivers/gpu/drm/i915/intel_hdmi.c void intel_hdmi_init(struct drm_i915_private · line 2510

Quoted 3 lines
drivers/gpu/drm/i915/intel_hdmi.c +1 -0
 	intel_infoframe_init(intel_dig_port);
 
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);

All ICL ports are DDI ports and aux_ch will not be used in previous gens so I don't see the point to set it here and in intel_dp_init().

aux_ch is used on all GENs for DP ports. As I mentioned in the commit message I initialize it for HDMI ports too for consistency.

Quoted 3 lines
Quoted 3 lines
drivers/gpu/drm/i915/intel_hdmi.c +0 -0
 	intel_hdmi_init_connector(intel_dig_port, intel_connector);

}

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#9 lore raw

Re: [PATCH 3/8] drm/i915: Init aux_ch for HDMI ports too

Quoted 70 lines · Imre Deak
Quoted 69 lines · Jose
Quoted 68 lines · Imre Deak

From ICL onwards DDI/TypeC ports - even in HDMI static mode - need to
know
which AUX CH belongs to them, so initialize aux_ch for those ports
too.
For consistency do this for all HDMI ports, not only for DDI/TypeC
ones.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c  | 1 +
 drivers/gpu/drm/i915/intel_dp.c   | 2 +-
 drivers/gpu/drm/i915/intel_hdmi.c | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -0
index 32a080265d03..3739ef003819 100644
@@ -3852,6 +3852,7 @@ void intel_ddi_init(struct drm_i915_private
 *dev_priv, enum port port)
 			(DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES);
 	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
 	intel_dig_port->max_lanes =
 intel_ddi_max_lanes(intel_dig_port);
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);
 
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	switch (port) {
 	case PORT_A:
drivers/gpu/drm/i915/intel_dp.c +0 -1
index 5530c604c694..6645c9faca9a 100644
@@ -1654,7 +1654,6 @@ intel_dp_aux_init(struct intel_dp
 *intel_dp)
 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	struct intel_encoder *encoder = &dig_port->base;
 
-	dig_port->aux_ch = intel_aux_ch(dev_priv, encoder->port);
 	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
 
drivers/gpu/drm/i915/intel_dp.c +1 -0
 	if (INTEL_GEN(dev_priv) >= 9) {
@@ -6706,6 +6705,7 @@ bool intel_dp_init(struct drm_i915_private
 *dev_priv,
 	if (port != PORT_A)
 		intel_infoframe_init(intel_dig_port);
 
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);
 	if (!intel_dp_init_connector(intel_dig_port, intel_connector))
 		goto err_init_connector;
drivers/gpu/drm/i915/intel_hdmi.c +0 -0
index 129b880bce64..b50c5497048a 100644
@@ -2506,5 +2506,6 @@ void intel_hdmi_init(struct

drm_i915_private
*dev_priv,

intel_infoframe_init(intel_dig_port);

Quoted 8 lines
Quoted 5 lines

drivers/gpu/drm/i915/intel_hdmi.c

Quoted 1 line
drivers/gpu/drm/i915/intel_hdmi.c +1 -0
+	intel_dig_port->aux_ch = intel_aux_ch(dev_priv, port);

All ICL ports are DDI ports and aux_ch will not be used in previous gens so I don't see the point to set it here and in intel_dp_init().

aux_ch is used on all GENs for DP ports. As I mentioned in the message I initialize it for HDMI ports too for consistency.

Huuum you are right but I still have mixed feelings about adding it to intel_hdmi_init(), I will leave to someone else to comment on that.

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

intel_hdmi_init_connector(intel_dig_port, intel_connector);
}

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#10 lore raw

PATCH 4/8 drm/i915: Use a helper to get the aux power domain

In reply to Imre Deak

From ICL onwards the AUX power domain may change dynamically based on whether a DDI/TypeC port is in thunderbolt or non-thunderbolt mode, so use a helper function instead of a static field to get the current domain.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     |  2 +-
 drivers/gpu/drm/i915/intel_display.c | 22 +++++++++++
 drivers/gpu/drm/i915/intel_dp.c      | 73 +++++++++++++++---------------------
 drivers/gpu/drm/i915/intel_drv.h     |  3 +-
 4 files changed, 56 insertions(+), 44 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -1
index 3739ef003819..5bb459011a49 100644
@@ -2099,7 +2099,7 @@ intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
 	 * returns the correct domain for other ports too.
 	 */
 	return dig_port->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
-					      intel_dp->aux_power_domain;
+					      intel_aux_power_domain(dig_port);
 }
 
 static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
drivers/gpu/drm/i915/intel_display.c +22 -0
index c3cadc09f859..36710a30fb37 100644
@@ -5949,6 +5949,28 @@ enum intel_display_power_domain intel_port_to_power_domain(enum port port)
 	}
 }
 
+enum intel_display_power_domain
+intel_aux_power_domain(struct intel_digital_port *dig_port)
+{
+	switch (dig_port->aux_ch) {
+	case AUX_CH_A:
+		return POWER_DOMAIN_AUX_A;
+	case AUX_CH_B:
+		return POWER_DOMAIN_AUX_B;
+	case AUX_CH_C:
+		return POWER_DOMAIN_AUX_C;
+	case AUX_CH_D:
+		return POWER_DOMAIN_AUX_D;
+	case AUX_CH_E:
+		return POWER_DOMAIN_AUX_E;
+	case AUX_CH_F:
+		return POWER_DOMAIN_AUX_F;
+	default:
+		MISSING_CASE(dig_port->aux_ch);
+		return POWER_DOMAIN_AUX_A;
+	}
+}
+
 static u64 get_crtc_power_domains(struct drm_crtc *crtc,
 				  struct intel_crtc_state *crtc_state)
 {
drivers/gpu/drm/i915/intel_dp.c +31 -42

193 lines not on this page · raw message

drivers/gpu/drm/i915/intel_drv.h +2 -1
index a242a118389d..a3d7b93ecddd 100644
@@ -1130,7 +1130,6 @@ struct intel_dp {
 	/* sink or branch descriptor */
 	struct drm_dp_desc desc;
 	struct drm_dp_aux aux;
-	enum intel_display_power_domain aux_power_domain;
 	uint8_t train_set[4];
 	int panel_power_up_delay;
 	int panel_power_down_delay;
@@ -1709,6 +1708,8 @@ bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state);
 void hsw_enable_ips(const struct intel_crtc_state *crtc_state);
 void hsw_disable_ips(const struct intel_crtc_state *crtc_state);
 enum intel_display_power_domain intel_port_to_power_domain(enum port port);
+enum intel_display_power_domain
+intel_aux_power_domain(struct intel_digital_port *dig_port);
 void intel_mode_from_pipe_config(struct drm_display_mode *mode,
 				 struct intel_crtc_state *pipe_config);
 void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc,
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#11 lore raw

Re: [PATCH 4/8] drm/i915: Use a helper to get the aux power domain

Quoted 33 lines · Imre Deak

From ICL onwards the AUX power domain may change dynamically based on whether a DDI/TypeC port is in thunderbolt or non-thunderbolt mode, so use a helper function instead of a static field to get the current domain.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     |  2 +-
 drivers/gpu/drm/i915/intel_display.c | 22 +++++++++++
 drivers/gpu/drm/i915/intel_dp.c      | 73 +++++++++++++++---------------------
 drivers/gpu/drm/i915/intel_drv.h     |  3 +-
 4 files changed, 56 insertions(+), 44 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -1
index 3739ef003819..5bb459011a49 100644
@@ -2099,7 +2099,7 @@ intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
 	 * returns the correct domain for other ports too.
 	 */
 	return dig_port->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
-					      intel_dp->aux_power_domain;
+					      intel_aux_power_domain(dig_port);
 }
 
 static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
drivers/gpu/drm/i915/intel_display.c +0 -0
index c3cadc09f859..36710a30fb37 100644

drivers/gpu/drm/i915/intel_display.c enum intel_display_power_domain intel_port_to_power_domain(enum port port) · line 5954

Quoted 6 lines
drivers/gpu/drm/i915/intel_display.c +3 -0
@@ -5949,6 +5949,28 @@ enum intel_display_power_domain intel_port_to_power_domain(enum port port)
 	}
 }
 
+enum intel_display_power_domain
+intel_aux_power_domain(struct intel_digital_port *dig_port)
+{

couldn't we just move aux_power_domain up like yod did for aux_ch? This way we initialize the power domain bassed on the aux channel, and just use it on the other functions. I think this is more future-proof for platforms changing the mapping aux <-> power domain. And avoids passing dev_priv around later just for checking that.

Lucas De Marchi

Quoted 265 lines
drivers/gpu/drm/i915/intel_display.c +19 -0
+	switch (dig_port->aux_ch) {
+	case AUX_CH_A:
+		return POWER_DOMAIN_AUX_A;
+	case AUX_CH_B:
+		return POWER_DOMAIN_AUX_B;
+	case AUX_CH_C:
+		return POWER_DOMAIN_AUX_C;
+	case AUX_CH_D:
+		return POWER_DOMAIN_AUX_D;
+	case AUX_CH_E:
+		return POWER_DOMAIN_AUX_E;
+	case AUX_CH_F:
+		return POWER_DOMAIN_AUX_F;
+	default:
+		MISSING_CASE(dig_port->aux_ch);
+		return POWER_DOMAIN_AUX_A;
+	}
+}
+
 static u64 get_crtc_power_domains(struct drm_crtc *crtc,
 				  struct intel_crtc_state *crtc_state)
 {
drivers/gpu/drm/i915/intel_dp.c +31 -42
index 6645c9faca9a..e6f59ef59be6 100644
@@ -690,7 +690,8 @@ static void pps_lock(struct intel_dp *intel_dp)
 	 * See intel_power_sequencer_reset() why we need
 	 * a power domain reference here.
 	 */
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv,
+				intel_aux_power_domain(dp_to_dig_port(intel_dp)));
 
 	mutex_lock(&dev_priv->pps_mutex);
 }
@@ -701,7 +702,8 @@ static void pps_unlock(struct intel_dp *intel_dp)
 
 	mutex_unlock(&dev_priv->pps_mutex);
 
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv,
+				intel_aux_power_domain(dp_to_dig_port(intel_dp)));
 }
 
 static void
@@ -1505,29 +1507,6 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 	return ret;
 }
 
-static enum intel_display_power_domain
-intel_aux_power_domain(struct intel_dp *intel_dp)
-{
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
-	switch (dig_port->aux_ch) {
-	case AUX_CH_A:
-		return POWER_DOMAIN_AUX_A;
-	case AUX_CH_B:
-		return POWER_DOMAIN_AUX_B;
-	case AUX_CH_C:
-		return POWER_DOMAIN_AUX_C;
-	case AUX_CH_D:
-		return POWER_DOMAIN_AUX_D;
-	case AUX_CH_E:
-		return POWER_DOMAIN_AUX_E;
-	case AUX_CH_F:
-		return POWER_DOMAIN_AUX_F;
-	default:
-		MISSING_CASE(dig_port->aux_ch);
-		return POWER_DOMAIN_AUX_A;
-	}
-}
 
 static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
 {
@@ -1654,8 +1633,6 @@ intel_dp_aux_init(struct intel_dp *intel_dp)
 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	struct intel_encoder *encoder = &dig_port->base;
 
-	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
-
 	if (INTEL_GEN(dev_priv) >= 9) {
 		intel_dp->aux_ch_ctl_reg = skl_aux_ctl_reg;
 		intel_dp->aux_ch_data_reg = skl_aux_data_reg;
@@ -2356,7 +2333,8 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
 	if (edp_have_panel_vdd(intel_dp))
 		return need_to_disable;
 
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv,
+				intel_aux_power_domain(intel_dig_port));
 
 	DRM_DEBUG_KMS("Turning eDP port %c VDD on\n",
 		      port_name(intel_dig_port->base.port));
@@ -2442,7 +2420,8 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
 	if ((pp & PANEL_POWER_ON) == 0)
 		intel_dp->panel_power_off_time = ktime_get_boottime();
 
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv,
+				intel_aux_power_domain(intel_dig_port));
 }
 
 static void edp_panel_vdd_work(struct work_struct *__work)
@@ -2555,6 +2534,7 @@ void intel_edp_panel_on(struct intel_dp *intel_dp)
 static void edp_panel_off(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	u32 pp;
 	i915_reg_t pp_ctrl_reg;
 
@@ -2564,10 +2544,10 @@ static void edp_panel_off(struct intel_dp *intel_dp)
 		return;
 
 	DRM_DEBUG_KMS("Turn eDP port %c panel power off\n",
-		      port_name(dp_to_dig_port(intel_dp)->base.port));
+		      port_name(dig_port->base.port));
 
 	WARN(!intel_dp->want_panel_vdd, "Need eDP port %c VDD to turn off panel\n",
-	     port_name(dp_to_dig_port(intel_dp)->base.port));
+	     port_name(dig_port->base.port));
 
 	pp = ironlake_get_pp_control(intel_dp);
 	/* We need to switch off panel power _and_ force vdd, for otherwise some
@@ -2586,7 +2566,7 @@ static void edp_panel_off(struct intel_dp *intel_dp)
 	intel_dp->panel_power_off_time = ktime_get_boottime();
 
 	/* We got a reference when we enabled the VDD. */
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv, intel_aux_power_domain(dig_port));
 }
 
 void intel_edp_panel_off(struct intel_dp *intel_dp)
@@ -5069,14 +5049,17 @@ intel_dp_detect(struct drm_connector *connector,
 {
 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	struct intel_encoder *encoder = &dig_port->base;
 	enum drm_connector_status status;
+	enum intel_display_power_domain aux_domain =
+		intel_aux_power_domain(dig_port);
 
 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
 		      connector->base.id, connector->name);
 	WARN_ON(!drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
 
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv, aux_domain);
 
 	/* Can't disconnect eDP */
 	if (intel_dp_is_edp(intel_dp))
@@ -5138,7 +5121,7 @@ intel_dp_detect(struct drm_connector *connector,
 		ret = intel_dp_retrain_link(encoder, ctx);
 		if (ret) {
 			intel_display_power_put(dev_priv,
-						intel_dp->aux_power_domain);
+						intel_aux_power_domain(dig_port));
 			return ret;
 		}
 	}
@@ -5162,7 +5145,7 @@ intel_dp_detect(struct drm_connector *connector,
 	if (status != connector_status_connected && !intel_dp->is_mst)
 		intel_dp_unset_edid(intel_dp);
 
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv, aux_domain);
 	return status;
 }
 
@@ -5170,8 +5153,11 @@ static void
 intel_dp_force(struct drm_connector *connector)
 {
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	struct intel_encoder *intel_encoder = &dig_port->base;
 	struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
+	enum intel_display_power_domain aux_domain =
+		intel_aux_power_domain(dig_port);
 
 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
 		      connector->base.id, connector->name);
@@ -5180,11 +5166,11 @@ intel_dp_force(struct drm_connector *connector)
 	if (connector->status != connector_status_connected)
 		return;
 
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv, aux_domain);
 
 	intel_dp_set_edid(intel_dp);
 
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv, aux_domain);
 }
 
 static int intel_dp_get_modes(struct drm_connector *connector)
@@ -5530,6 +5516,7 @@ static const struct intel_hdcp_shim intel_dp_hdcp_shim = {
 static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 
 	lockdep_assert_held(&dev_priv->pps_mutex);
 
@@ -5543,7 +5530,7 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
 	 * indefinitely.
 	 */
 	DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n");
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv, intel_aux_power_domain(dig_port));
 
 	edp_panel_vdd_schedule_off(intel_dp);
 }
@@ -5641,7 +5628,8 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
 		return IRQ_NONE;
 	}
 
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv,
+				intel_aux_power_domain(intel_dig_port));
 
 	if (intel_dp->is_mst) {
 		if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
@@ -5670,7 +5658,8 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
 	ret = IRQ_HANDLED;
 
 put_power:
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv,
+				intel_aux_power_domain(intel_dig_port));
 
 	return ret;
 }
drivers/gpu/drm/i915/intel_drv.h +2 -1
index a242a118389d..a3d7b93ecddd 100644
@@ -1130,7 +1130,6 @@ struct intel_dp {
 	/* sink or branch descriptor */
 	struct drm_dp_desc desc;
 	struct drm_dp_aux aux;
-	enum intel_display_power_domain aux_power_domain;
 	uint8_t train_set[4];
 	int panel_power_up_delay;
 	int panel_power_down_delay;
@@ -1709,6 +1708,8 @@ bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state);
 void hsw_enable_ips(const struct intel_crtc_state *crtc_state);
 void hsw_disable_ips(const struct intel_crtc_state *crtc_state);
 enum intel_display_power_domain intel_port_to_power_domain(enum port port);
+enum intel_display_power_domain
+intel_aux_power_domain(struct intel_digital_port *dig_port);
 void intel_mode_from_pipe_config(struct drm_display_mode *mode,
 				 struct intel_crtc_state *pipe_config);
 void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc,
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#12 lore raw

Re: [PATCH 4/8] drm/i915: Use a helper to get the aux power domain

Quoted 37 lines · Lucas De Marchi
Quoted 36 lines · Imre Deak

From ICL onwards the AUX power domain may change dynamically based on whether a DDI/TypeC port is in thunderbolt or non-thunderbolt mode, so use a helper function instead of a static field to get the current domain.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     |  2 +-
 drivers/gpu/drm/i915/intel_display.c | 22 +++++++++++
 drivers/gpu/drm/i915/intel_dp.c      | 73 +++++++++++++++---------------------
 drivers/gpu/drm/i915/intel_drv.h     |  3 +-
 4 files changed, 56 insertions(+), 44 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -1
index 3739ef003819..5bb459011a49 100644
@@ -2099,7 +2099,7 @@ intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
 	 * returns the correct domain for other ports too.
 	 */
 	return dig_port->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
-					      intel_dp->aux_power_domain;
+					      intel_aux_power_domain(dig_port);
 }
 
 static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
drivers/gpu/drm/i915/intel_display.c +0 -0
index c3cadc09f859..36710a30fb37 100644
@@ -5949,6 +5949,28 @@ enum intel_display_power_domain intel_port_to_power_domain(enum port port)
 	}
 }
 
Quoted 8 lines

drivers/gpu/drm/i915/intel_display.c enum intel_display_power_domain intel_port_to_power_domain(enum port port) · line 5954

Quoted 3 lines
drivers/gpu/drm/i915/intel_display.c +3 -0
+enum intel_display_power_domain
+intel_aux_power_domain(struct intel_digital_port *dig_port)
+{

couldn't we just move aux_power_domain up like yod did for aux_ch? This way we initialize the power domain bassed on the aux channel, and just use it on the other functions. I think this is more future-proof for platforms changing the mapping aux <-> power domain. And avoids passing dev_priv around later just for checking that.

Well, the fact that the mapping can change dynamically is the reason I chose to have a helper. Once Thunderbolt support is added we would check in this function something like dig_port->is_tbt and return POWER_DOMAIN_AUX_TBT_[1-4] instead of AUX_[A-D].

Quoted 264 lines

Lucas De Marchi

Quoted 261 lines
drivers/gpu/drm/i915/intel_display.c +19 -0
+	switch (dig_port->aux_ch) {
+	case AUX_CH_A:
+		return POWER_DOMAIN_AUX_A;
+	case AUX_CH_B:
+		return POWER_DOMAIN_AUX_B;
+	case AUX_CH_C:
+		return POWER_DOMAIN_AUX_C;
+	case AUX_CH_D:
+		return POWER_DOMAIN_AUX_D;
+	case AUX_CH_E:
+		return POWER_DOMAIN_AUX_E;
+	case AUX_CH_F:
+		return POWER_DOMAIN_AUX_F;
+	default:
+		MISSING_CASE(dig_port->aux_ch);
+		return POWER_DOMAIN_AUX_A;
+	}
+}
+
 static u64 get_crtc_power_domains(struct drm_crtc *crtc,
 				  struct intel_crtc_state *crtc_state)
 {
drivers/gpu/drm/i915/intel_dp.c +31 -42
index 6645c9faca9a..e6f59ef59be6 100644
@@ -690,7 +690,8 @@ static void pps_lock(struct intel_dp *intel_dp)
 	 * See intel_power_sequencer_reset() why we need
 	 * a power domain reference here.
 	 */
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv,
+				intel_aux_power_domain(dp_to_dig_port(intel_dp)));
 
 	mutex_lock(&dev_priv->pps_mutex);
 }
@@ -701,7 +702,8 @@ static void pps_unlock(struct intel_dp *intel_dp)
 
 	mutex_unlock(&dev_priv->pps_mutex);
 
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv,
+				intel_aux_power_domain(dp_to_dig_port(intel_dp)));
 }
 
 static void
@@ -1505,29 +1507,6 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 	return ret;
 }
 
-static enum intel_display_power_domain
-intel_aux_power_domain(struct intel_dp *intel_dp)
-{
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
-	switch (dig_port->aux_ch) {
-	case AUX_CH_A:
-		return POWER_DOMAIN_AUX_A;
-	case AUX_CH_B:
-		return POWER_DOMAIN_AUX_B;
-	case AUX_CH_C:
-		return POWER_DOMAIN_AUX_C;
-	case AUX_CH_D:
-		return POWER_DOMAIN_AUX_D;
-	case AUX_CH_E:
-		return POWER_DOMAIN_AUX_E;
-	case AUX_CH_F:
-		return POWER_DOMAIN_AUX_F;
-	default:
-		MISSING_CASE(dig_port->aux_ch);
-		return POWER_DOMAIN_AUX_A;
-	}
-}
 
 static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
 {
@@ -1654,8 +1633,6 @@ intel_dp_aux_init(struct intel_dp *intel_dp)
 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	struct intel_encoder *encoder = &dig_port->base;
 
-	intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
-
 	if (INTEL_GEN(dev_priv) >= 9) {
 		intel_dp->aux_ch_ctl_reg = skl_aux_ctl_reg;
 		intel_dp->aux_ch_data_reg = skl_aux_data_reg;
@@ -2356,7 +2333,8 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
 	if (edp_have_panel_vdd(intel_dp))
 		return need_to_disable;
 
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv,
+				intel_aux_power_domain(intel_dig_port));
 
 	DRM_DEBUG_KMS("Turning eDP port %c VDD on\n",
 		      port_name(intel_dig_port->base.port));
@@ -2442,7 +2420,8 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
 	if ((pp & PANEL_POWER_ON) == 0)
 		intel_dp->panel_power_off_time = ktime_get_boottime();
 
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv,
+				intel_aux_power_domain(intel_dig_port));
 }
 
 static void edp_panel_vdd_work(struct work_struct *__work)
@@ -2555,6 +2534,7 @@ void intel_edp_panel_on(struct intel_dp *intel_dp)
 static void edp_panel_off(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 	u32 pp;
 	i915_reg_t pp_ctrl_reg;
 
@@ -2564,10 +2544,10 @@ static void edp_panel_off(struct intel_dp *intel_dp)
 		return;
 
 	DRM_DEBUG_KMS("Turn eDP port %c panel power off\n",
-		      port_name(dp_to_dig_port(intel_dp)->base.port));
+		      port_name(dig_port->base.port));
 
 	WARN(!intel_dp->want_panel_vdd, "Need eDP port %c VDD to turn off panel\n",
-	     port_name(dp_to_dig_port(intel_dp)->base.port));
+	     port_name(dig_port->base.port));
 
 	pp = ironlake_get_pp_control(intel_dp);
 	/* We need to switch off panel power _and_ force vdd, for otherwise some
@@ -2586,7 +2566,7 @@ static void edp_panel_off(struct intel_dp *intel_dp)
 	intel_dp->panel_power_off_time = ktime_get_boottime();
 
 	/* We got a reference when we enabled the VDD. */
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv, intel_aux_power_domain(dig_port));
 }
 
 void intel_edp_panel_off(struct intel_dp *intel_dp)
@@ -5069,14 +5049,17 @@ intel_dp_detect(struct drm_connector *connector,
 {
 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	struct intel_encoder *encoder = &dig_port->base;
 	enum drm_connector_status status;
+	enum intel_display_power_domain aux_domain =
+		intel_aux_power_domain(dig_port);
 
 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
 		      connector->base.id, connector->name);
 	WARN_ON(!drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
 
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv, aux_domain);
 
 	/* Can't disconnect eDP */
 	if (intel_dp_is_edp(intel_dp))
@@ -5138,7 +5121,7 @@ intel_dp_detect(struct drm_connector *connector,
 		ret = intel_dp_retrain_link(encoder, ctx);
 		if (ret) {
 			intel_display_power_put(dev_priv,
-						intel_dp->aux_power_domain);
+						intel_aux_power_domain(dig_port));
 			return ret;
 		}
 	}
@@ -5162,7 +5145,7 @@ intel_dp_detect(struct drm_connector *connector,
 	if (status != connector_status_connected && !intel_dp->is_mst)
 		intel_dp_unset_edid(intel_dp);
 
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv, aux_domain);
 	return status;
 }
 
@@ -5170,8 +5153,11 @@ static void
 intel_dp_force(struct drm_connector *connector)
 {
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+	struct intel_encoder *intel_encoder = &dig_port->base;
 	struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
+	enum intel_display_power_domain aux_domain =
+		intel_aux_power_domain(dig_port);
 
 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
 		      connector->base.id, connector->name);
@@ -5180,11 +5166,11 @@ intel_dp_force(struct drm_connector *connector)
 	if (connector->status != connector_status_connected)
 		return;
 
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv, aux_domain);
 
 	intel_dp_set_edid(intel_dp);
 
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv, aux_domain);
 }
 
 static int intel_dp_get_modes(struct drm_connector *connector)
@@ -5530,6 +5516,7 @@ static const struct intel_hdcp_shim intel_dp_hdcp_shim = {
 static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
 {
 	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
+	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
 
 	lockdep_assert_held(&dev_priv->pps_mutex);
 
@@ -5543,7 +5530,7 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
 	 * indefinitely.
 	 */
 	DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n");
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv, intel_aux_power_domain(dig_port));
 
 	edp_panel_vdd_schedule_off(intel_dp);
 }
@@ -5641,7 +5628,8 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
 		return IRQ_NONE;
 	}
 
-	intel_display_power_get(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_get(dev_priv,
+				intel_aux_power_domain(intel_dig_port));
 
 	if (intel_dp->is_mst) {
 		if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
@@ -5670,7 +5658,8 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
 	ret = IRQ_HANDLED;
 
 put_power:
-	intel_display_power_put(dev_priv, intel_dp->aux_power_domain);
+	intel_display_power_put(dev_priv,
+				intel_aux_power_domain(intel_dig_port));
 
 	return ret;
 }
drivers/gpu/drm/i915/intel_drv.h +2 -1
index a242a118389d..a3d7b93ecddd 100644
@@ -1130,7 +1130,6 @@ struct intel_dp {
 	/* sink or branch descriptor */
 	struct drm_dp_desc desc;
 	struct drm_dp_aux aux;
-	enum intel_display_power_domain aux_power_domain;
 	uint8_t train_set[4];
 	int panel_power_up_delay;
 	int panel_power_down_delay;
@@ -1709,6 +1708,8 @@ bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state);
 void hsw_enable_ips(const struct intel_crtc_state *crtc_state);
 void hsw_disable_ips(const struct intel_crtc_state *crtc_state);
 enum intel_display_power_domain intel_port_to_power_domain(enum port port);
+enum intel_display_power_domain
+intel_aux_power_domain(struct intel_digital_port *dig_port);
 void intel_mode_from_pipe_config(struct drm_display_mode *mode,
 				 struct intel_crtc_state *pipe_config);
 void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc,
Signature · 1 line
2.13.2
Quoted 4 lines
Quoted 4 lines

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#13 lore raw

PATCH 5/8 drm/i915: Enable AUX power earlier

In reply to Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled before the port's PLL is enabled, so move the enabling earlier accordingly.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46 +++++++++++++++++++++++++-----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +32 -14
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port *dig_port)
 {
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for PSR with
 	 * DC states enabled at the same time, while for driver initiated AUX
 	 * transfers we need the same AUX IOs to be powered but with DC states
@@ -2120,11 +2118,8 @@ static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |= BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |= BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));
 
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void intel_ddi_clk_disable(struct intel_encoder *encoder)
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state *crtc_state,
+			 const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux_domain(dig_port));
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state *crtc_state,
+			   const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux_domain(dig_port));
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 				    const struct intel_crtc_state *crtc_state,
 				    const struct drm_connector_state *conn_state)
@@ -2904,9 +2925,6 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp));
-
 	intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
 				 crtc_state->lane_count, is_mst);
 
@@ -3071,9 +3089,6 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder,
 	intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain);
 
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp));
 }
 
 static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder,
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable;
+
+	intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
+	intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state, old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state, old_state);
 }
 
 static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state)
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
author
#14 lore raw

PATCH v2 5/8 drm/i915: Enable AUX power earlier

For DDI/TypeC ports the AUX power domain needs to be enabled before the port's PLL is enabled, so move the enabling earlier accordingly.

v2:
- Preserve the pre_pll hook for GEN9_LP. (Ville)

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 60 +++++++++++++++++++++---------------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 37 insertions(+), 25 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +35 -25
index 5bb459011a49..9554da06e19a 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port *dig_port)
 {
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for PSR with
 	 * DC states enabled at the same time, while for driver initiated AUX
 	 * transfers we need the same AUX IOs to be powered but with DC states
@@ -2120,11 +2118,8 @@ static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |= BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |= BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));
 
 	return domains;
 }
@@ -2891,6 +2886,36 @@ static void intel_ddi_clk_disable(struct intel_encoder *encoder)
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state *crtc_state,
+			 const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux_domain(dig_port));
+
+	if (IS_GEN9_LP(dev_priv))
+		bxt_ddi_phy_set_lane_optim_mask(encoder,
+					       crtc_state->lane_lat_optim_mask);
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state *crtc_state,
+			   const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux_domain(dig_port));
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 				    const struct intel_crtc_state *crtc_state,
 				    const struct drm_connector_state *conn_state)
@@ -2904,9 +2929,6 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp));
-
 	intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
 				 crtc_state->lane_count, is_mst);
 
@@ -3071,9 +3093,6 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder,
 	intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain);
 
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp));
 }
 
 static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder,
@@ -3304,15 +3323,6 @@ static void intel_disable_ddi(struct intel_encoder *encoder,
 		intel_disable_ddi_dp(encoder, old_crtc_state, old_conn_state);
 }
 
-static void bxt_ddi_pre_pll_enable(struct intel_encoder *encoder,
-				   const struct intel_crtc_state *pipe_config,
-				   const struct drm_connector_state *conn_state)
-{
-	uint8_t mask = pipe_config->lane_lat_optim_mask;
-
-	bxt_ddi_phy_set_lane_optim_mask(encoder, mask);
-}
-
 void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
 {
 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
@@ -3828,8 +3838,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
 	intel_encoder->compute_output_type = intel_ddi_compute_output_type;
 	intel_encoder->compute_config = intel_ddi_compute_config;
 	intel_encoder->enable = intel_enable_ddi;
-	if (IS_GEN9_LP(dev_priv))
-		intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable;
+	intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
+	intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state, old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state, old_state);
 }
 
 static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state)
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#15 lore raw

Re: [PATCH v2 5/8] drm/i915: Enable AUX power earlier

Quoted 45 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled before the port's PLL is enabled, so move the enabling earlier accordingly.

v2:
- Preserve the pre_pll hook for GEN9_LP. (Ville)

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 60 +++++++++++++++++++++---------------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 37 insertions(+), 25 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +3 -8
index 5bb459011a49..9554da06e19a 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port *dig_port)
 {
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for PSR with
 	 * DC states enabled at the same time, while for driver initiated AUX
 	 * transfers we need the same AUX IOs to be powered but with DC states
@@ -2120,11 +2118,8 @@ static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |= BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |= BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));
 
 	return domains;
 }

drivers/gpu/drm/i915/intel_ddi.c static void intel_ddi_clk_disable(struct intel_encoder *encoder) · line 2888

Quoted 3 lines
drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2891,6 +2886,36 @@ static void intel_ddi_clk_disable(struct intel_encoder *encoder)
 	}
 }
 

I just realized while merging that my previous patches that are reviewed-by add icl_ddi_pre_pll_enable hook for Gen 11.
Either the below pre_pll_enable should be part of that or I will have to respin those before merging and call it intel_ddi_pre_pll_enable() hook.
https://patchwork.freedesktop.org/patch/258008/

Manasi

Quoted 100 lines
drivers/gpu/drm/i915/intel_ddi.c +32 -17
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state *crtc_state,
+			 const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux_domain(dig_port));
+
+	if (IS_GEN9_LP(dev_priv))
+		bxt_ddi_phy_set_lane_optim_mask(encoder,
+					       crtc_state->lane_lat_optim_mask);
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state *crtc_state,
+			   const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux_domain(dig_port));
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 				    const struct intel_crtc_state *crtc_state,
 				    const struct drm_connector_state *conn_state)
@@ -2904,9 +2929,6 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp));
-
 	intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
 				 crtc_state->lane_count, is_mst);
 
@@ -3071,9 +3093,6 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder,
 	intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain);
 
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp));
 }
 
 static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder,
@@ -3304,15 +3323,6 @@ static void intel_disable_ddi(struct intel_encoder *encoder,
 		intel_disable_ddi_dp(encoder, old_crtc_state, old_conn_state);
 }
 
-static void bxt_ddi_pre_pll_enable(struct intel_encoder *encoder,
-				   const struct intel_crtc_state *pipe_config,
-				   const struct drm_connector_state *conn_state)
-{
-	uint8_t mask = pipe_config->lane_lat_optim_mask;
-
-	bxt_ddi_phy_set_lane_optim_mask(encoder, mask);
-}
-
 void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
 {
 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
@@ -3828,8 +3838,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
 	intel_encoder->compute_output_type = intel_ddi_compute_output_type;
 	intel_encoder->compute_config = intel_ddi_compute_config;
 	intel_encoder->enable = intel_enable_ddi;
-	if (IS_GEN9_LP(dev_priv))
-		intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable;
+	intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
+	intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state, old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state, old_state);
 }
 
 static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state)
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#16 lore raw

Re: [PATCH v2 5/8] drm/i915: Enable AUX power earlier

Quoted 43 lines · Manasi Navare
Quoted 42 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled before the port's PLL is enabled, so move the enabling earlier accordingly.

v2:
- Preserve the pre_pll hook for GEN9_LP. (Ville)

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 60 +++++++++++++++++++++---------------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 37 insertions(+), 25 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +3 -8
index 5bb459011a49..9554da06e19a 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port *dig_port)
 {
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for PSR with
 	 * DC states enabled at the same time, while for driver initiated AUX
 	 * transfers we need the same AUX IOs to be powered but with DC states
@@ -2120,11 +2118,8 @@ static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |= BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |= BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));
 
Quoted 12 lines

drivers/gpu/drm/i915/intel_ddi.c static void intel_ddi_clk_disable(struct intel_encoder *encoder) · line 2888

Quoted 6 lines
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	return domains;
 }
@@ -2891,6 +2886,36 @@ static void intel_ddi_clk_disable(struct intel_encoder *encoder)
 	}
 }
 

I just realized while merging that my previous patches that are reviewed-by add icl_ddi_pre_pll_enable hook for Gen 11.
Either the below pre_pll_enable should be part of that or I will have to respin those before merging and call it intel_ddi_pre_pll_enable() hook.
https://patchwork.freedesktop.org/patch/258008/

I'm fine with merging either patchset first, it's a simple rebase in both cases.

Quoted 95 lines

Manasi

Quoted 92 lines
drivers/gpu/drm/i915/intel_ddi.c +32 -17
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state *crtc_state,
+			 const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux_domain(dig_port));
+
+	if (IS_GEN9_LP(dev_priv))
+		bxt_ddi_phy_set_lane_optim_mask(encoder,
+					       crtc_state->lane_lat_optim_mask);
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state *crtc_state,
+			   const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux_domain(dig_port));
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 				    const struct intel_crtc_state *crtc_state,
 				    const struct drm_connector_state *conn_state)
@@ -2904,9 +2929,6 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp));
-
 	intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
 				 crtc_state->lane_count, is_mst);
 
@@ -3071,9 +3093,6 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder,
 	intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain);
 
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp));
 }
 
 static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder,
@@ -3304,15 +3323,6 @@ static void intel_disable_ddi(struct intel_encoder *encoder,
 		intel_disable_ddi_dp(encoder, old_crtc_state, old_conn_state);
 }
 
-static void bxt_ddi_pre_pll_enable(struct intel_encoder *encoder,
-				   const struct intel_crtc_state *pipe_config,
-				   const struct drm_connector_state *conn_state)
-{
-	uint8_t mask = pipe_config->lane_lat_optim_mask;
-
-	bxt_ddi_phy_set_lane_optim_mask(encoder, mask);
-}
-
 void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
 {
 	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
@@ -3828,8 +3838,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
 	intel_encoder->compute_output_type = intel_ddi_compute_output_type;
 	intel_encoder->compute_config = intel_ddi_compute_config;
 	intel_encoder->enable = intel_enable_ddi;
-	if (IS_GEN9_LP(dev_priv))
-		intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable;
+	intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
+	intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state, old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state, old_state);
 }
 
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/i915/intel_display.c +0 -0
 static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state)
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reviewed-by on v1 5/8
#17 lore raw

Re: [PATCH 5/8] drm/i915: Enable AUX power earlier

In reply to Imre Deak
Quoted 3 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled before the
port's PLL is enabled, so move the enabling earlier accordingly.

Could you just pointed out where did you got this information? I checked in this Bspec pages 20845, 20598 and 21750 and I did not found.

With that:

Quoted 142 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46 +++++++++++++++++++++++++-
----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -3
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port *dig_port)
 {
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for

PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but with DC
states

drivers/gpu/drm/i915/intel_ddi.c +2 -5
@@ -2120,11 +2118,8 @@ static u64 intel_ddi_get_power_domains(struct
 intel_encoder *encoder,
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |=
 BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |=
 BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));
drivers/gpu/drm/i915/intel_ddi.c +17 -0
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void intel_ddi_clk_disable(struct
 intel_encoder *encoder)
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state *crtc_state,
+			 const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
 >base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux_domain(
 dig_port));
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state *crtc_state,
+			   const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +3 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux_domain(

dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 				    const struct intel_crtc_state

*crtc_state,
const struct drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +0 -3
@@ -2904,9 +2925,6 @@ static void intel_ddi_pre_enable_dp(struct
 intel_encoder *encoder,
 
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp
 ));
-
 	intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
drivers/gpu/drm/i915/intel_ddi.c +0 -3
 				 crtc_state->lane_count, is_mst);
@@ -3071,9 +3089,6 @@ static void intel_ddi_post_disable_dp(struct
 intel_encoder *encoder,
 	intel_display_power_put(dev_priv, dig_port-
 >ddi_io_power_domain);
 
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp
 ));

}

static void intel_ddi_post_disable_hdmi(struct intel_encoder
*encoder,

drivers/gpu/drm/i915/intel_ddi.c +3 -0
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct drm_i915_private
 *dev_priv, enum port port)
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable;
+
+	intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
+	intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct
 intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state,
 old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state,
 old_state);

}

Quoted 2 lines

static void i9xx_pfit_enable(const struct intel_crtc_state
*crtc_state)

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#18 lore raw

Re: [PATCH 5/8] drm/i915: Enable AUX power earlier

Quoted 7 lines · Jose
Quoted 3 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled before the
port's PLL is enabled, so move the enabling earlier accordingly.

Could you just pointed out where did you got this information? I checked in this Bspec pages 20845, 20598 and 21750 and I did not found.

It's at 21750, connect/disconnect flows.

Quoted 146 lines

With that:

Quoted 142 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46 +++++++++++++++++++++++++-
----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -3
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port *dig_port)
 {
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for

PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but with DC
states

drivers/gpu/drm/i915/intel_ddi.c +2 -5
@@ -2120,11 +2118,8 @@ static u64 intel_ddi_get_power_domains(struct
 intel_encoder *encoder,
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |=
 BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |=
 BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));
drivers/gpu/drm/i915/intel_ddi.c +17 -0
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void intel_ddi_clk_disable(struct
 intel_encoder *encoder)
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state *crtc_state,
+			 const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
 >base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux_domain(
 dig_port));
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state *crtc_state,
+			   const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +3 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux_domain(

dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
 				    const struct intel_crtc_state

*crtc_state,
const struct drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +0 -3
@@ -2904,9 +2925,6 @@ static void intel_ddi_pre_enable_dp(struct
 intel_encoder *encoder,
 
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp
 ));
-
 	intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
drivers/gpu/drm/i915/intel_ddi.c +0 -3
 				 crtc_state->lane_count, is_mst);
@@ -3071,9 +3089,6 @@ static void intel_ddi_post_disable_dp(struct
 intel_encoder *encoder,
 	intel_display_power_put(dev_priv, dig_port-
 >ddi_io_power_domain);
 
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp
 ));

}

static void intel_ddi_post_disable_hdmi(struct intel_encoder
*encoder,

drivers/gpu/drm/i915/intel_ddi.c +3 -0
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct drm_i915_private
 *dev_priv, enum port port)
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable;
+
+	intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
+	intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct
 intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state,
 old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state,
 old_state);

}

Quoted 2 lines
Quoted 2 lines

static void i9xx_pfit_enable(const struct intel_crtc_state
*crtc_state)

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#19 lore raw

Re: [PATCH 5/8] drm/i915: Enable AUX power earlier

Quoted 7 lines · Imre Deak
Quoted 6 lines · Jose
Quoted 4 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled before
the
port's PLL is enabled, so move the enabling earlier accordingly.

Quoted 5 lines
Quoted 3 lines

Could you just pointed out where did you got this information? I checked in this Bspec pages 20845, 20598 and 21750 and I did not found.

It's at 21750, connect/disconnect flows.

What piece specifically?
The only related that I can find is this one:
"Aux power must be enabled while using Aux channel or the main link (including HDMI). It should be disabled to save power when not using Aux channel or main link."

Quoted 150 lines
Quoted 150 lines

With that:

Quoted 146 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46
+++++++++++++++++++++++++-
----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -3
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port
 *dig_port)
 {
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for

PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but with DC
states

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2120,11 +2118,8 @@ static u64

intel_ddi_get_power_domains(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -4
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));

drivers/gpu/drm/i915/intel_ddi.c +2 -1
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));

drivers/gpu/drm/i915/intel_ddi.c +17 -0
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void intel_ddi_clk_disable(struct
 intel_encoder *encoder)
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state *crtc_state,
+			 const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
 > base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux_domain(
 dig_port));
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state *crtc_state,
+			   const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +3 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux_domain(

dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder

*encoder,
const struct intel_crtc_state
*crtc_state,
const struct drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +0 -3
@@ -2904,9 +2925,6 @@ static void intel_ddi_pre_enable_dp(struct
 intel_encoder *encoder,
 
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp
 ));
-
 	intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 				 crtc_state->lane_count, is_mst);
@@ -3071,9 +3089,6 @@ static void

intel_ddi_post_disable_dp(struct intel_encoder *encoder,
intel_display_power_put(dev_priv, dig_port-

Quoted 1 line

ddi_io_power_domain);

drivers/gpu/drm/i915/intel_ddi.c +0 -3
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp

));
}

static void intel_ddi_post_disable_hdmi(struct intel_encoder
*encoder,

drivers/gpu/drm/i915/intel_ddi.c +3 -0
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct drm_i915_private
 *dev_priv, enum port port)
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable;
+
+	intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
+	intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct
 intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state,
 old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state,
 old_state);

}

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

static void i9xx_pfit_enable(const struct intel_crtc_state
*crtc_state)

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#20 lore raw

Re: [PATCH 5/8] drm/i915: Enable AUX power earlier

Quoted 12 lines · Jose
Quoted 11 lines · Imre Deak
Quoted 9 lines · Jose
Quoted 4 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled before
the
port's PLL is enabled, so move the enabling earlier accordingly.

Could you just pointed out where did you got this information? I checked in this Bspec pages 20845, 20598 and 21750 and I did not found.

Quoted 7 lines
Quoted 1 line

It's at 21750, connect/disconnect flows.

What piece specifically?
The only related that I can find is this one:
"Aux power must be enabled while using Aux channel or the main link (including HDMI). It should be disabled to save power when not using Aux channel or main link."

We can do AUX transfers even before enabling the main link, where we enable already AUX power. In fact all the connect flows have:

"Display software issues AUX reads for EDID/DPCD."

So now if we enabled it after PLL programming we'd have the two things happen in both orders, which I'd rather not do, if not necessary.

Quoted 151 lines
Quoted 151 lines
Quoted 151 lines

With that:

Quoted 146 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46
+++++++++++++++++++++++++-
----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -3
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port
 *dig_port)
 {
-	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered up for

PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but with DC
states

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2120,11 +2118,8 @@ static u64

intel_ddi_get_power_domains(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -4
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));

drivers/gpu/drm/i915/intel_ddi.c +2 -1
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));

drivers/gpu/drm/i915/intel_ddi.c +17 -0
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void intel_ddi_clk_disable(struct
 intel_encoder *encoder)
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state *crtc_state,
+			 const struct drm_connector_state *conn_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
 > base);
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux_domain(
 dig_port));
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state *crtc_state,
+			   const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +3 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux_domain(

dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder

*encoder,
const struct intel_crtc_state
*crtc_state,
const struct drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +0 -3
@@ -2904,9 +2925,6 @@ static void intel_ddi_pre_enable_dp(struct
 intel_encoder *encoder,
 
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp
 ));
-
 	intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 				 crtc_state->lane_count, is_mst);
@@ -3071,9 +3089,6 @@ static void

intel_ddi_post_disable_dp(struct intel_encoder *encoder,
intel_display_power_put(dev_priv, dig_port-

Quoted 1 line

ddi_io_power_domain);

drivers/gpu/drm/i915/intel_ddi.c +0 -3
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(intel_dp

));
}

static void intel_ddi_post_disable_hdmi(struct intel_encoder
*encoder,

drivers/gpu/drm/i915/intel_ddi.c +3 -0
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct drm_i915_private
 *dev_priv, enum port port)
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable;
+
+	intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
+	intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct
 intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state,
 old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state,
 old_state);

}

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

static void i9xx_pfit_enable(const struct intel_crtc_state
*crtc_state)

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#21 lore raw

Re: [PATCH 5/8] drm/i915: Enable AUX power earlier

Quoted 25 lines · Imre Deak
Quoted 15 lines · Jose
Quoted 14 lines · Imre Deak
Quoted 12 lines · Jose
Quoted 5 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled before
the
port's PLL is enabled, so move the enabling earlier accordingly.

Could you just pointed out where did you got this information? I
checked in this Bspec pages 20845, 20598 and 21750 and I did not
found.

Quoted 8 lines
Quoted 1 line

It's at 21750, connect/disconnect flows.

What piece specifically?
The only related that I can find is this one:
"Aux power must be enabled while using Aux channel or the main link (including HDMI). It should be disabled to save power when not using
Aux channel or main link."

Quoted 8 lines

We can do AUX transfers even before enabling the main link, where we enable already AUX power. In fact all the connect flows have:

"Display software issues AUX reads for EDID/DPCD."

So now if we enabled it after PLL programming we'd have the two things
happen in both orders, which I'd rather not do, if not necessary.

I still don't get your point.

The reads for EDID/DPCD is executed way before PLL programming, so it will still enable and disable power aux power wells.
Also I did not found any aux transactions between the current places that gets and puts a aux power well reference.

haswell_crtc_enable()

	intel_encoders_pre_pll_enable(crtc, pipe_config, old_state);

	if (pipe_config->shared_dpll)
		intel_enable_shared_dpll(pipe_config);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_map_plls_to_ports(crtc, pipe_config, old_state);

	intel_encoders_pre_enable(crtc, pipe_config, old_state);

haswell_crtc_disable()

	intel_encoders_post_disable(crtc, old_crtc_state, old_state);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_unmap_plls_to_ports(crtc, old_crtc_state,

old_state);

intel_encoders_post_pll_disable(crtc, old_crtc_state,
old_state);

So if it is not sequence or requirement I don't see why we should enable earlier.

Quoted 175 lines
Quoted 175 lines
Quoted 175 lines
Quoted 175 lines

With that:

Quoted 171 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46
+++++++++++++++++++++++++-
----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -3
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port
 *dig_port)
 {
-	struct intel_digital_port *dig_port =
 dp_to_dig_port(intel_dp);
-

/* CNL+ HW requires corresponding AUX IOs to be powered
up for
PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but
with DC
states

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2120,11 +2118,8 @@ static u64

intel_ddi_get_power_domains(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for

HDMI. */

drivers/gpu/drm/i915/intel_ddi.c +0 -4
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));

drivers/gpu/drm/i915/intel_ddi.c +2 -1
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void

intel_ddi_clk_disable(struct
intel_encoder *encoder)

drivers/gpu/drm/i915/intel_ddi.c +3 -0
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state

*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			 const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder-
Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux

_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +5 -0
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state

*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			   const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder-
Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux

_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder

*encoder,
const struct
intel_crtc_state
*crtc_state,
const struct
drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2904,9 +2925,6 @@ static void

intel_ddi_pre_enable_dp(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -2
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(

intel_dp
));

drivers/gpu/drm/i915/intel_ddi.c +0 -1
-
 	intel_dp_set_link_params(intel_dp, crtc_state-
Quoted 1 line

port_clock,

crtc_state->lane_count,
is_mst);

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3071,9 +3089,6 @@ static void

intel_ddi_post_disable_dp(struct intel_encoder *encoder,
intel_display_power_put(dev_priv, dig_port-

Quoted 1 line

ddi_io_power_domain);

drivers/gpu/drm/i915/intel_ddi.c +0 -3
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(

intel_dp
));
}

static void intel_ddi_post_disable_hdmi(struct intel_encoder
*encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct

drm_i915_private
*dev_priv, enum port port)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable =

bxt_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+
+	intel_encoder->pre_pll_enable =

intel_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	intel_encoder->post_pll_disable =

intel_ddi_post_pll_disable;

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct
 intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state,
 old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state,
 old_state);

}

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

static void i9xx_pfit_enable(const struct intel_crtc_state
*crtc_state)

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#22 lore raw

Re: [PATCH 5/8] drm/i915: Enable AUX power earlier

Quoted 31 lines · Jose
Quoted 30 lines · Imre Deak
Quoted 15 lines · Jose
Quoted 14 lines · Imre Deak
Quoted 12 lines · Jose
Quoted 5 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled before
the
port's PLL is enabled, so move the enabling earlier accordingly.

Could you just pointed out where did you got this information? I
checked in this Bspec pages 20845, 20598 and 21750 and I did not
found.

Quoted 8 lines
Quoted 1 line

It's at 21750, connect/disconnect flows.

What piece specifically?
The only related that I can find is this one:
"Aux power must be enabled while using Aux channel or the main link (including HDMI). It should be disabled to save power when not using
Aux channel or main link."

We can do AUX transfers even before enabling the main link, where we enable already AUX power. In fact all the connect flows have:

"Display software issues AUX reads for EDID/DPCD."

Quoted 8 lines
Quoted 3 lines

So now if we enabled it after PLL programming we'd have the two things
happen in both orders, which I'd rather not do, if not necessary.

I still don't get your point.

The reads for EDID/DPCD is executed way before PLL programming, so it will still enable and disable power aux power wells.

Yes, so here PLL is not yet programmed and we enable AUX power. I want to have only this sequence and avoid having also the opposite, where we first program the PLL then enable AUX power.

Quoted 20 lines

Also I did not found any aux transactions between the current places that gets and puts a aux power well reference.

haswell_crtc_enable()

	intel_encoders_pre_pll_enable(crtc, pipe_config, old_state);

	if (pipe_config->shared_dpll)
		intel_enable_shared_dpll(pipe_config);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_map_plls_to_ports(crtc, pipe_config, old_state);

	intel_encoders_pre_enable(crtc, pipe_config, old_state);

haswell_crtc_disable()

	intel_encoders_post_disable(crtc, old_crtc_state, old_state);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_unmap_plls_to_ports(crtc, old_crtc_state,
Quoted 7 lines

old_state);

intel_encoders_post_pll_disable(crtc, old_crtc_state,
old_state);

So if it is not sequence or requirement I don't see why we should enable earlier.

To have only one order of AUX enabling wrt. PLL programming.

Quoted 176 lines
Quoted 176 lines
Quoted 176 lines
Quoted 176 lines
Quoted 176 lines

With that:

Quoted 171 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46
+++++++++++++++++++++++++-
----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -3
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port
 *dig_port)
 {
-	struct intel_digital_port *dig_port =
 dp_to_dig_port(intel_dp);
-

/* CNL+ HW requires corresponding AUX IOs to be powered
up for
PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but
with DC
states

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2120,11 +2118,8 @@ static u64

intel_ddi_get_power_domains(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for

HDMI. */

drivers/gpu/drm/i915/intel_ddi.c +0 -4
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));

drivers/gpu/drm/i915/intel_ddi.c +2 -1
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void

intel_ddi_clk_disable(struct
intel_encoder *encoder)

drivers/gpu/drm/i915/intel_ddi.c +3 -0
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state

*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			 const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder-
Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux

_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +5 -0
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder *encoder,
+			   const struct intel_crtc_state

*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			   const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder-
Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux

_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder

*encoder,
const struct
intel_crtc_state
*crtc_state,
const struct
drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2904,9 +2925,6 @@ static void

intel_ddi_pre_enable_dp(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -2
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(

intel_dp
));

drivers/gpu/drm/i915/intel_ddi.c +0 -1
-
 	intel_dp_set_link_params(intel_dp, crtc_state-
Quoted 1 line

port_clock,

crtc_state->lane_count,
is_mst);

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3071,9 +3089,6 @@ static void

intel_ddi_post_disable_dp(struct intel_encoder *encoder,
intel_display_power_put(dev_priv, dig_port-

Quoted 1 line

ddi_io_power_domain);

drivers/gpu/drm/i915/intel_ddi.c +0 -3
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(

intel_dp
));
}

static void intel_ddi_post_disable_hdmi(struct intel_encoder
*encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct

drm_i915_private
*dev_priv, enum port port)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable =

bxt_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+
+	intel_encoder->pre_pll_enable =

intel_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	intel_encoder->post_pll_disable =

intel_ddi_post_pll_disable;

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +2 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void haswell_crtc_disable(struct
 intel_crtc_state *old_crtc_state,
 
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state,
 old_state);
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state,
 old_state);

}

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

static void i9xx_pfit_enable(const struct intel_crtc_state
*crtc_state)

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#23 lore raw

Re: [PATCH 5/8] drm/i915: Enable AUX power earlier

Quoted 47 lines · Imre Deak
Quoted 40 lines · Jose
Quoted 33 lines · Imre Deak
Quoted 20 lines · Jose
Quoted 17 lines · Imre Deak
Quoted 8 lines · Jose
Quoted 6 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled
before
the
port's PLL is enabled, so move the enabling earlier accordingly.

Quoted 7 lines

Could you just pointed out where did you got this information?
I
checked in this Bspec pages 20845, 20598 and 21750 and I did
not
found.

Quoted 1 line

It's at 21750, connect/disconnect flows.

Quoted 7 lines

What piece specifically?
The only related that I can find is this one:
"Aux power must be enabled while using Aux channel or the main link
(including HDMI). It should be disabled to save power when not using
Aux channel or main link."

We can do AUX transfers even before enabling the main link, where we
enable already AUX power. In fact all the connect flows have:

Quoted 5 lines

"Display software issues AUX reads for EDID/DPCD."

So now if we enabled it after PLL programming we'd have the two things
happen in both orders, which I'd rather not do, if not necessary.

Quoted 5 lines

I still don't get your point.

The reads for EDID/DPCD is executed way before PLL programming, so it
will still enable and disable power aux power wells.

Quoted 5 lines

Yes, so here PLL is not yet programmed and we enable AUX power. I want
to have only this sequence and avoid having also the opposite, where we
first program the PLL then enable AUX power.

In what case aux power will be enabled when doing the PLL programming?

If this cases exits I agree in going forward with this change if the commit message is updated, reading it looks like is a hardware requirement.

Quoted 210 lines
Quoted 22 lines

Also I did not found any aux transactions between the current places
that gets and puts a aux power well reference.

haswell_crtc_enable()

	intel_encoders_pre_pll_enable(crtc, pipe_config, old_state);

	if (pipe_config->shared_dpll)
		intel_enable_shared_dpll(pipe_config);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_map_plls_to_ports(crtc, pipe_config, old_state);

	intel_encoders_pre_enable(crtc, pipe_config, old_state);

haswell_crtc_disable()

	intel_encoders_post_disable(crtc, old_crtc_state, old_state);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_unmap_plls_to_ports(crtc, old_crtc_state,
Quoted 7 lines

old_state);

intel_encoders_post_pll_disable(crtc, old_crtc_state,
old_state);

So if it is not sequence or requirement I don't see why we should enable earlier.

To have only one order of AUX enabling wrt. PLL programming.

Quoted 178 lines
Quoted 178 lines
Quoted 178 lines
Quoted 178 lines
Quoted 178 lines

With that:

Quoted 175 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46
+++++++++++++++++++++++++-
----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -2
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp
 *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port
 *dig_port)
 {
-	struct intel_digital_port *dig_port =

dp_to_dig_port(intel_dp);

drivers/gpu/drm/i915/intel_ddi.c +0 -1
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered

up for
PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but
with DC
states

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2120,11 +2118,8 @@ static u64

intel_ddi_get_power_domains(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for

HDMI. */

drivers/gpu/drm/i915/intel_ddi.c +0 -4
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));

drivers/gpu/drm/i915/intel_ddi.c +2 -1
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void

intel_ddi_clk_disable(struct
intel_encoder *encoder)

drivers/gpu/drm/i915/intel_ddi.c +3 -0
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state

*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			 const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder-
Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux

_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder

*encoder,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			   const struct intel_crtc_state

*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			   const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder-
Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux

_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder

*encoder,
const struct
intel_crtc_state
*crtc_state,
const struct
drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2904,9 +2925,6 @@ static void

intel_ddi_pre_enable_dp(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -2
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(

intel_dp
));

drivers/gpu/drm/i915/intel_ddi.c +0 -1
-
 	intel_dp_set_link_params(intel_dp, crtc_state-
Quoted 1 line

port_clock,

crtc_state->lane_count,
is_mst);

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3071,9 +3089,6 @@ static void

intel_ddi_post_disable_dp(struct intel_encoder *encoder,
intel_display_power_put(dev_priv, dig_port-

Quoted 1 line

ddi_io_power_domain);

drivers/gpu/drm/i915/intel_ddi.c +0 -3
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(

intel_dp
));
}

static void intel_ddi_post_disable_hdmi(struct
intel_encoder
*encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct

drm_i915_private
*dev_priv, enum port port)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable =

bxt_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+
+	intel_encoder->pre_pll_enable =

intel_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	intel_encoder->post_pll_disable =

intel_ddi_post_pll_disable;

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +0 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void

haswell_crtc_disable(struct
intel_crtc_state *old_crtc_state,

drivers/gpu/drm/i915/intel_display.c +0 -0
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state,

old_state);

drivers/gpu/drm/i915/intel_display.c +2 -0
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state,

old_state);
}

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

static void i9xx_pfit_enable(const struct
intel_crtc_state
*crtc_state)

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#24 lore raw

Re: [PATCH 5/8] drm/i915: Enable AUX power earlier

Quoted 48 lines · Jose
Quoted 47 lines · Imre Deak
Quoted 45 lines · Jose
Quoted 33 lines · Imre Deak
Quoted 20 lines · Jose
Quoted 17 lines · Imre Deak
Quoted 8 lines · Jose
Quoted 6 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled
before
the
port's PLL is enabled, so move the enabling earlier accordingly.

Quoted 7 lines

Could you just pointed out where did you got this information?
I
checked in this Bspec pages 20845, 20598 and 21750 and I did
not
found.

Quoted 1 line

It's at 21750, connect/disconnect flows.

Quoted 7 lines

What piece specifically?
The only related that I can find is this one:
"Aux power must be enabled while using Aux channel or the main link
(including HDMI). It should be disabled to save power when not using
Aux channel or main link."

We can do AUX transfers even before enabling the main link, where we
enable already AUX power. In fact all the connect flows have:

Quoted 5 lines

"Display software issues AUX reads for EDID/DPCD."

So now if we enabled it after PLL programming we'd have the two things
happen in both orders, which I'd rather not do, if not necessary.

I still don't get your point.

The reads for EDID/DPCD is executed way before PLL programming, so it
will still enable and disable power aux power wells.

Quoted 7 lines
Quoted 5 lines

Yes, so here PLL is not yet programmed and we enable AUX power. I want
to have only this sequence and avoid having also the opposite, where we
first program the PLL then enable AUX power.

In what case aux power will be enabled when doing the PLL programming?

That case doesn't have to exist for my point to be valid. But nothing prevents us doing delayed AUX power disabling in the future.

Quoted 3 lines

If this cases exits I agree in going forward with this change if the commit message is updated, reading it looks like is a hardware requirement.

In fact I found another point at 22243:

1. Enable Power Wells
a. Based on the resources to be used, enable the appropriate power wells following the Sequences for Power Wel
b. Type-C: Note that AUX power is required for running main link.

...

4. Enable Port PLL

Quoted 211 lines
Quoted 211 lines
Quoted 23 lines

Also I did not found any aux transactions between the current places
that gets and puts a aux power well reference.

haswell_crtc_enable()

	intel_encoders_pre_pll_enable(crtc, pipe_config, old_state);

	if (pipe_config->shared_dpll)
		intel_enable_shared_dpll(pipe_config);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_map_plls_to_ports(crtc, pipe_config, old_state);

	intel_encoders_pre_enable(crtc, pipe_config, old_state);

haswell_crtc_disable()

	intel_encoders_post_disable(crtc, old_crtc_state, old_state);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_unmap_plls_to_ports(crtc, old_crtc_state,
Quoted 7 lines

old_state);

intel_encoders_post_pll_disable(crtc, old_crtc_state,
old_state);

So if it is not sequence or requirement I don't see why we should enable earlier.

To have only one order of AUX enabling wrt. PLL programming.

Quoted 178 lines
Quoted 178 lines
Quoted 178 lines
Quoted 178 lines
Quoted 178 lines

With that:

Quoted 175 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46
+++++++++++++++++++++++++-
----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -2
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool intel_ddi_get_hw_state(struct
 intel_encoder *encoder,
 }
 
 static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp
 *intel_dp)
+intel_ddi_main_link_aux_domain(struct intel_digital_port
 *dig_port)
 {
-	struct intel_digital_port *dig_port =

dp_to_dig_port(intel_dp);

drivers/gpu/drm/i915/intel_ddi.c +0 -1
-
 	/* CNL+ HW requires corresponding AUX IOs to be powered

up for
PSR with
* DC states enabled at the same time, while for driver
initiated AUX
* transfers we need the same AUX IOs to be powered but
with DC
states

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2120,11 +2118,8 @@ static u64

intel_ddi_get_power_domains(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
 	/* AUX power is only needed for (e)DP mode, not for

HDMI. */

drivers/gpu/drm/i915/intel_ddi.c +0 -4
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port->dp;
-
-		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));

drivers/gpu/drm/i915/intel_ddi.c +2 -1
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void

intel_ddi_clk_disable(struct
intel_encoder *encoder)

drivers/gpu/drm/i915/intel_ddi.c +3 -0
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
+			 const struct intel_crtc_state

*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			 const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder-
Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_link_aux

_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder

*encoder,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			   const struct intel_crtc_state

*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			   const struct drm_connector_state

*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder-
Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_link_aux

_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+}
+
 static void intel_ddi_pre_enable_dp(struct intel_encoder

*encoder,
const struct
intel_crtc_state
*crtc_state,
const struct
drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2904,9 +2925,6 @@ static void

intel_ddi_pre_enable_dp(struct
intel_encoder *encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -2
 	WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
 
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux_domain(

intel_dp
));

drivers/gpu/drm/i915/intel_ddi.c +0 -1
-
 	intel_dp_set_link_params(intel_dp, crtc_state-
Quoted 1 line

port_clock,

crtc_state->lane_count,
is_mst);

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3071,9 +3089,6 @@ static void

intel_ddi_post_disable_dp(struct intel_encoder *encoder,
intel_display_power_put(dev_priv, dig_port-

Quoted 1 line

ddi_io_power_domain);

drivers/gpu/drm/i915/intel_ddi.c +0 -3
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux_domain(

intel_dp
));
}

static void intel_ddi_post_disable_hdmi(struct
intel_encoder
*encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct

drm_i915_private
*dev_priv, enum port port)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable =

bxt_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+
+	intel_encoder->pre_pll_enable =

intel_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	intel_encoder->post_pll_disable =

intel_ddi_post_pll_disable;

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->pre_enable = intel_ddi_pre_enable;
 	intel_encoder->disable = intel_disable_ddi;
 	intel_encoder->post_disable = intel_ddi_post_disable;
drivers/gpu/drm/i915/intel_display.c +0 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void

haswell_crtc_disable(struct
intel_crtc_state *old_crtc_state,

drivers/gpu/drm/i915/intel_display.c +0 -0
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc, old_crtc_state,

old_state);

drivers/gpu/drm/i915/intel_display.c +2 -0
+
+	intel_encoders_post_pll_disable(crtc, old_crtc_state,

old_state);
}

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

static void i9xx_pfit_enable(const struct
intel_crtc_state
*crtc_state)

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reviewed-by
#25 lore raw

Re: [PATCH 5/8] drm/i915: Enable AUX power earlier

Quoted 77 lines · Imre Deak
Quoted 63 lines · Jose
Quoted 55 lines · Imre Deak
Quoted 47 lines · Jose
Quoted 38 lines · Imre Deak
Quoted 22 lines · Jose
Quoted 19 lines · Imre Deak
Quoted 8 lines · Jose
Quoted 6 lines · Imre Deak

For DDI/TypeC ports the AUX power domain needs to be enabled
before
the
port's PLL is enabled, so move the enabling earlier accordingly.

Quoted 8 lines

Could you just pointed out where did you got this information?
I
checked in this Bspec pages 20845, 20598 and 21750 and I
did
not
found.

Quoted 1 line

It's at 21750, connect/disconnect flows.

Quoted 9 lines

What piece specifically?
The only related that I can find is this one:
"Aux power must be enabled while using Aux channel or the main
link
(including HDMI). It should be disabled to save power when not
using
Aux channel or main link."

We can do AUX transfers even before enabling the main link, where
we
enable already AUX power. In fact all the connect flows have:

Quoted 7 lines

"Display software issues AUX reads for EDID/DPCD."

So now if we enabled it after PLL programming we'd have the two
things
happen in both orders, which I'd rather not do, if not necessary.

Quoted 6 lines

I still don't get your point.

The reads for EDID/DPCD is executed way before PLL programming, so
it
will still enable and disable power aux power wells.

Quoted 6 lines

Yes, so here PLL is not yet programmed and we enable AUX power. I want
to have only this sequence and avoid having also the opposite, where
we
first program the PLL then enable AUX power.

Quoted 2 lines

In what case aux power will be enabled when doing the PLL programming?

That case doesn't have to exist for my point to be valid. But nothing prevents us doing delayed AUX power disabling in the future.

Quoted 4 lines

If this cases exits I agree in going forward with this change if the
commit message is updated, reading it looks like is a hardware requirement.

In fact I found another point at 22243:

Quoted 8 lines

1. Enable Power Wells
a. Based on the resources to be used, enable the appropriate power
wells following the Sequences for Power Wel
b. Type-C: Note that AUX power is required for running main link.

...

4. Enable Port PLL

Nice, please just add some of it to the commit message.

Quoted 241 lines
Quoted 241 lines
Quoted 241 lines
Quoted 26 lines

Also I did not found any aux transactions between the current places
that gets and puts a aux power well reference.

haswell_crtc_enable()
intel_encoders_pre_pll_enable(crtc, pipe_config,
old_state);

	if (pipe_config->shared_dpll)
		intel_enable_shared_dpll(pipe_config);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_map_plls_to_ports(crtc, pipe_config,

old_state);

intel_encoders_pre_enable(crtc, pipe_config,
old_state);

haswell_crtc_disable()
intel_encoders_post_disable(crtc, old_crtc_state,
old_state);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_unmap_plls_to_ports(crtc, old_crtc_state,
Quoted 8 lines

old_state);

intel_encoders_post_pll_disable(crtc, old_crtc_state,
old_state);

So if it is not sequence or requirement I don't see why we should
enable earlier.

To have only one order of AUX enabling wrt. PLL programming.

Quoted 204 lines
Quoted 204 lines
Quoted 204 lines
Quoted 204 lines
Quoted 204 lines

With that:
Reviewed-by: José Roberto de Souza <
[email protected]>

Quoted 200 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 46
+++++++++++++++++++++++++-
----------
 drivers/gpu/drm/i915/intel_display.c |  2 ++
 2 files changed, 34 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +0 -0
index 5bb459011a49..7731ca704862 100644
@@ -2082,10 +2082,8 @@ bool

intel_ddi_get_hw_state(struct
intel_encoder *encoder,
}

static inline enum intel_display_power_domain
-intel_ddi_main_link_aux_domain(struct intel_dp
*intel_dp)
+intel_ddi_main_link_aux_domain(struct
intel_digital_port
*dig_port)
{

drivers/gpu/drm/i915/intel_ddi.c +0 -1
-	struct intel_digital_port *dig_port =

dp_to_dig_port(intel_dp);

drivers/gpu/drm/i915/intel_ddi.c +0 -1
-
 	/* CNL+ HW requires corresponding AUX IOs to be

powered
up for
PSR with
* DC states enabled at the same time, while
for driver
initiated AUX
* transfers we need the same AUX IOs to be
powered but
with DC
states

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2120,11 +2118,8 @@ static u64

intel_ddi_get_power_domains(struct
intel_encoder *encoder,
domains = BIT_ULL(dig_port-

Quoted 1 line

ddi_io_power_domain);

/* AUX power is only needed for (e)DP mode, not
for
HDMI. */

drivers/gpu/drm/i915/intel_ddi.c +0 -2
-	if (intel_crtc_has_dp_encoder(crtc_state)) {
-		struct intel_dp *intel_dp = &dig_port-
Quoted 1 line

dp;

drivers/gpu/drm/i915/intel_ddi.c +0 -2
-
-		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp));

drivers/gpu/drm/i915/intel_ddi.c +2 -1
-	}
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	return domains;
 }
@@ -2891,6 +2886,32 @@ static void

intel_ddi_clk_disable(struct
intel_encoder *encoder)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
 	}
 }
 
+static void
+intel_ddi_pre_pll_enable(struct intel_encoder

*encoder,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			 const struct intel_crtc_state

*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			 const struct

drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv =

to_i915(encoder-

Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_get(dev_priv,
+					intel_ddi_main_

link_aux
_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+}
+
+static void
+intel_ddi_post_pll_disable(struct intel_encoder

*encoder,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			   const struct

intel_crtc_state
*crtc_state,

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+			   const struct

drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+{
+	struct drm_i915_private *dev_priv =

to_i915(encoder-

Quoted 1 line

base.dev);

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	struct intel_digital_port *dig_port =

enc_to_dig_port(&encoder-

Quoted 1 line

base);

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+
+	if (intel_crtc_has_dp_encoder(crtc_state))
+		intel_display_power_put(dev_priv,
+					intel_ddi_main_

link_aux
_domain(
dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+}
+
 static void intel_ddi_pre_enable_dp(struct

intel_encoder
*encoder,
const struct
intel_crtc_state
*crtc_state,
const struct
drm_connector_state
*conn_state)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -2904,9 +2925,6 @@ static void

intel_ddi_pre_enable_dp(struct
intel_encoder *encoder,

WARN_ON(is_mst && (port == PORT_A || port ==
PORT_E));

drivers/gpu/drm/i915/intel_ddi.c +0 -2
-	intel_display_power_get(dev_priv,
-				intel_ddi_main_link_aux

_domain(
intel_dp
));

drivers/gpu/drm/i915/intel_ddi.c +0 -1
-
 	intel_dp_set_link_params(intel_dp, crtc_state-
Quoted 1 line

port_clock,

crtc_state-

Quoted 1 line

lane_count,

is_mst);

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3071,9 +3089,6 @@ static void

intel_ddi_post_disable_dp(struct intel_encoder *encoder,
intel_display_power_put(dev_priv, dig_port-

Quoted 1 line

ddi_io_power_domain);

drivers/gpu/drm/i915/intel_ddi.c +0 -3
 	intel_ddi_clk_disable(encoder);
-
-	intel_display_power_put(dev_priv,
-				intel_ddi_main_link_aux

_domain(
intel_dp
));
}

static void intel_ddi_post_disable_hdmi(struct
intel_encoder
*encoder,

drivers/gpu/drm/i915/intel_ddi.c +0 -0
@@ -3830,6 +3845,9 @@ void intel_ddi_init(struct

drm_i915_private
*dev_priv, enum port port)

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->enable = intel_enable_ddi;
 	if (IS_GEN9_LP(dev_priv))
 		intel_encoder->pre_pll_enable =

bxt_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +2 -0
+
+	intel_encoder->pre_pll_enable =

intel_ddi_pre_pll_enable;

drivers/gpu/drm/i915/intel_ddi.c +1 -0
+	intel_encoder->post_pll_disable =

intel_ddi_post_pll_disable;
intel_encoder->pre_enable =
intel_ddi_pre_enable;

drivers/gpu/drm/i915/intel_ddi.c +0 -0
 	intel_encoder->disable = intel_disable_ddi;
 	intel_encoder->post_disable =

intel_ddi_post_disable;

drivers/gpu/drm/i915/intel_display.c +0 -0
index 36710a30fb37..12ba2b923e6b 100644
@@ -5876,6 +5876,8 @@ static void

haswell_crtc_disable(struct
intel_crtc_state *old_crtc_state,

drivers/gpu/drm/i915/intel_display.c +0 -0
 	if (INTEL_GEN(dev_priv) >= 11)
 		icl_unmap_plls_to_ports(crtc,

old_crtc_state,
old_state);

drivers/gpu/drm/i915/intel_display.c +2 -0
+
+	intel_encoders_post_pll_disable(crtc,

old_crtc_state,
old_state);
}

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

static void i9xx_pfit_enable(const struct
intel_crtc_state
*crtc_state)

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#26 lore raw

PATCH 6/8 drm/i915: Enable AUX power for HDMI DDI/TypeC main link too

In reply to Imre Deak

DDI/TypeC ports need the AUX power domain for main link functionality even when they operate in HDMI static mode, so enable the power domain for these ports too.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +11 -4
index 7731ca704862..bf58816ed59c 100644
@@ -2103,6 +2103,7 @@ intel_ddi_main_link_aux_domain(struct intel_digital_port *dig_port)
 static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
 				       struct intel_crtc_state *crtc_state)
 {
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	struct intel_digital_port *dig_port;
 	u64 domains;
 
@@ -2117,8 +2118,12 @@ static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
 	dig_port = enc_to_dig_port(&encoder->base);
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
-	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state))
+	/*
+	 * AUX power is only needed for (e)DP mode, and for HDMI mode on TC
+	 * ports.
+	 */
+	if (intel_crtc_has_dp_encoder(crtc_state) ||
+	    intel_port_is_tc(dev_priv, encoder->port))
 		domains |= BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));
 
 	return domains;
@@ -2894,7 +2899,8 @@ intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
 
-	if (intel_crtc_has_dp_encoder(crtc_state))
+	if (intel_crtc_has_dp_encoder(crtc_state) ||
+	    intel_port_is_tc(dev_priv, encoder->port))
 		intel_display_power_get(dev_priv,
 					intel_ddi_main_link_aux_domain(dig_port));
 }
@@ -2907,7 +2913,8 @@ intel_ddi_post_pll_disable(struct intel_encoder *encoder,
 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
 
-	if (intel_crtc_has_dp_encoder(crtc_state))
+	if (intel_crtc_has_dp_encoder(crtc_state) ||
+	    intel_port_is_tc(dev_priv, encoder->port))
 		intel_display_power_put(dev_priv,
 					intel_ddi_main_link_aux_domain(dig_port));
 }
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Reviewed-by on v1 6/8
#27 lore raw

Re: [PATCH 6/8] drm/i915: Enable AUX power for HDMI DDI/TypeC main link too

Quoted 5 lines · Imre Deak

DDI/TypeC ports need the AUX power domain for main link functionality even when they operate in HDMI static mode, so enable the power domain
for these ports too.

Quoted 64 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)
drivers/gpu/drm/i915/intel_ddi.c +1 -0
index 7731ca704862..bf58816ed59c 100644
@@ -2103,6 +2103,7 @@ intel_ddi_main_link_aux_domain(struct
 intel_digital_port *dig_port)
 static u64 intel_ddi_get_power_domains(struct intel_encoder
 *encoder,
 				       struct intel_crtc_state
 *crtc_state)
 {
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
drivers/gpu/drm/i915/intel_ddi.c +2 -2
 	struct intel_digital_port *dig_port;
 	u64 domains;
@@ -2117,8 +2118,12 @@ static u64 intel_ddi_get_power_domains(struct
 intel_encoder *encoder,
 	dig_port = enc_to_dig_port(&encoder->base);
 	domains = BIT_ULL(dig_port->ddi_io_power_domain);
 
-	/* AUX power is only needed for (e)DP mode, not for HDMI. */
-	if (intel_crtc_has_dp_encoder(crtc_state))
+	/*
+	 * AUX power is only needed for (e)DP mode, and for HDMI mode

on TC

drivers/gpu/drm/i915/intel_ddi.c +4 -0
+	 * ports.
+	 */
+	if (intel_crtc_has_dp_encoder(crtc_state) ||
+	    intel_port_is_tc(dev_priv, encoder->port))
 		domains |=

BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));

drivers/gpu/drm/i915/intel_ddi.c +2 -1
 	return domains;
@@ -2894,7 +2899,8 @@ intel_ddi_pre_pll_enable(struct intel_encoder
 *encoder,
 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
 >base);
 
-	if (intel_crtc_has_dp_encoder(crtc_state))
+	if (intel_crtc_has_dp_encoder(crtc_state) ||
+	    intel_port_is_tc(dev_priv, encoder->port))
 		intel_display_power_get(dev_priv,

intel_ddi_main_link_aux_domain(
dig_port));
}

drivers/gpu/drm/i915/intel_ddi.c +2 -1
@@ -2907,7 +2913,8 @@ intel_ddi_post_pll_disable(struct intel_encoder
 *encoder,
 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	struct intel_digital_port *dig_port = enc_to_dig_port(&encoder-
 >base);
 
-	if (intel_crtc_has_dp_encoder(crtc_state))
+	if (intel_crtc_has_dp_encoder(crtc_state) ||
+	    intel_port_is_tc(dev_priv, encoder->port))
 		intel_display_power_put(dev_priv,
Quoted 3 lines

intel_ddi_main_link_aux_domain(
dig_port));
}

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#28 lore raw

PATCH 7/8 drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain

In reply to Imre Deak

Most of the AUX_CH_CTL flags are concerned with DP AUX transfer parameters. As opposed to this the flag specifying the thunderbolt vs. non-thunderbolt mode of the port is not related to AUX transfers at all (rather it's repurposed to enable either TBT or non-TBT PHY HW blocks). The programming has to be done before enabling the corresponding AUX power well, so make it part of the power well code.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108548

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/intel_runtime_pm.c | 69 +++++++++++++++++++++++++++++----
 2 files changed, 62 insertions(+), 8 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index c57b701f72a7..dbf894835cb2 100644
@@ -921,6 +921,7 @@ struct i915_power_well_desc {
 			/* The pw is backing the VGA functionality */
 			bool has_vga:1;
 			bool has_fuses:1;
+			bool is_tc_tbt;
 		} hsw;
 	};
 	const struct i915_power_well_ops *ops;
drivers/gpu/drm/i915/intel_runtime_pm.c +61 -8

154 lines not on this page · raw message

Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#29 lore raw

Re: [PATCH 7/8] drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain

Quoted 21 lines · Imre Deak

Most of the AUX_CH_CTL flags are concerned with DP AUX transfer parameters. As opposed to this the flag specifying the thunderbolt vs. non-thunderbolt mode of the port is not related to AUX transfers at all (rather it's repurposed to enable either TBT or non-TBT PHY HW blocks). The programming has to be done before enabling the corresponding AUX power well, so make it part of the power well code.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108548

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/intel_runtime_pm.c | 69 +++++++++++++++++++++++++++++----
 2 files changed, 62 insertions(+), 8 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +0 -0
index c57b701f72a7..dbf894835cb2 100644

drivers/gpu/drm/i915/i915_drv.h struct i915_power_well_desc { · line 924

Quoted 4 lines
drivers/gpu/drm/i915/i915_drv.h +1 -0
@@ -921,6 +921,7 @@ struct i915_power_well_desc {
 			/* The pw is backing the VGA functionality */
 			bool has_vga:1;
 			bool has_fuses:1;
+			bool is_tc_tbt;

what's up with the bitfield just above? Eitehr make this a bitfield or turn the others into !bitfield ?

We also may want to do:

struct {
        struct _hsw;
        bool is_tc_tbt;
} icl;

to clarify this is icl+...

ugh, but that needs a "subdir-ccflags-y += -fms-extensions" :(.

Lucas De Marchi

Quoted 171 lines
drivers/gpu/drm/i915/i915_drv.h +0 -0
 		} hsw;
 	};
 	const struct i915_power_well_ops *ops;
drivers/gpu/drm/i915/intel_runtime_pm.c +61 -8
index 5f5416eb9644..eed17440a4a7 100644
@@ -465,6 +465,44 @@ icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
 	hsw_wait_for_power_well_disable(dev_priv, power_well);
 }
 
+#define ICL_AUX_PW_TO_CH(pw_idx)	\
+	((pw_idx) - ICL_PW_CTL_IDX_AUX_A + AUX_CH_A)
+
+static void
+icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
+				 struct i915_power_well *power_well)
+{
+	const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
+	int pw_idx = power_well->desc->hsw.idx;
+	enum aux_ch aux_ch = ICL_AUX_PW_TO_CH(pw_idx);
+	u32 val;
+
+	val = I915_READ(DP_AUX_CH_CTL(aux_ch));
+	val &= ~DP_AUX_CH_CTL_TBT_IO;
+	if (power_well->desc->hsw.is_tc_tbt)
+		val |= DP_AUX_CH_CTL_TBT_IO;
+	I915_WRITE(DP_AUX_CH_CTL(aux_ch), val);
+
+	val = I915_READ(regs->driver);
+	I915_WRITE(regs->driver, val | HSW_PWR_WELL_CTL_REQ(pw_idx));
+
+	hsw_wait_for_power_well_enable(dev_priv, power_well);
+}
+
+static void
+icl_tc_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
+				  struct i915_power_well *power_well)
+{
+	const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
+	int pw_idx = power_well->desc->hsw.idx;
+	u32 val;
+
+	val = I915_READ(regs->driver);
+	I915_WRITE(regs->driver, val & ~HSW_PWR_WELL_CTL_REQ(pw_idx));
+
+	hsw_wait_for_power_well_disable(dev_priv, power_well);
+}
+
 /*
  * We should only use the power well if we explicitly asked the hardware to
  * enable it, so check if it's enabled and also check if we've requested it to
@@ -2725,6 +2763,13 @@ static const struct i915_power_well_ops icl_combo_phy_aux_power_well_ops = {
 	.is_enabled = hsw_power_well_enabled,
 };
 
+static const struct i915_power_well_ops icl_tc_phy_aux_power_well_ops = {
+	.sync_hw = hsw_power_well_sync_hw,
+	.enable = icl_tc_phy_aux_power_well_enable,
+	.disable = icl_tc_phy_aux_power_well_disable,
+	.is_enabled = hsw_power_well_enabled,
+};
+
 static const struct i915_power_well_regs icl_aux_power_well_regs = {
 	.bios	= ICL_PWR_WELL_CTL_AUX1,
 	.driver	= ICL_PWR_WELL_CTL_AUX2,
@@ -2870,81 +2915,89 @@ static const struct i915_power_well_desc icl_power_wells[] = {
 	{
 		.name = "AUX C",
 		.domains = ICL_AUX_C_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_C,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX D",
 		.domains = ICL_AUX_D_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_D,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX E",
 		.domains = ICL_AUX_E_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_E,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX F",
 		.domains = ICL_AUX_F_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_F,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX TBT1",
 		.domains = ICL_AUX_TBT1_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT2",
 		.domains = ICL_AUX_TBT2_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT3",
 		.domains = ICL_AUX_TBT3_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT4",
 		.domains = ICL_AUX_TBT4_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#30 lore raw

Re: [PATCH 7/8] drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain

Quoted 17 lines · Lucas De Marchi
Quoted 16 lines · Imre Deak

Most of the AUX_CH_CTL flags are concerned with DP AUX transfer parameters. As opposed to this the flag specifying the thunderbolt vs. non-thunderbolt mode of the port is not related to AUX transfers at all (rather it's repurposed to enable either TBT or non-TBT PHY HW blocks). The programming has to be done before enabling the corresponding AUX power well, so make it part of the power well code.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108548

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/intel_runtime_pm.c | 69 +++++++++++++++++++++++++++++----
 2 files changed, 62 insertions(+), 8 deletions(-)
Quoted 12 lines

drivers/gpu/drm/i915/i915_drv.h struct i915_power_well_desc { · line 924

Quoted 9 lines
drivers/gpu/drm/i915/i915_drv.h +1 -0
index c57b701f72a7..dbf894835cb2 100644
@@ -921,6 +921,7 @@ struct i915_power_well_desc {
 			/* The pw is backing the VGA functionality */
 			bool has_vga:1;
 			bool has_fuses:1;
+			bool is_tc_tbt;

what's up with the bitfield just above? Eitehr make this a bitfield or turn the others into !bitfield ?

Yes, typoed it, thanks for catching it. It should remain a bitfield.

Quoted 9 lines

We also may want to do:

struct {
        struct _hsw;
        bool is_tc_tbt;
} icl;

to clarify this is icl+...

Not sure, since we'd still use power_well->desc->hsw if calling a helper like hsw_wait_for_power_well_enable(). I can add a comment that the field is for ICL TC PHYs.

Quoted 173 lines

ugh, but that needs a "subdir-ccflags-y += -fms-extensions" :(.

Lucas De Marchi

Quoted 167 lines
drivers/gpu/drm/i915/i915_drv.h +0 -0
 		} hsw;
 	};
 	const struct i915_power_well_ops *ops;
drivers/gpu/drm/i915/intel_runtime_pm.c +61 -8
index 5f5416eb9644..eed17440a4a7 100644
@@ -465,6 +465,44 @@ icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
 	hsw_wait_for_power_well_disable(dev_priv, power_well);
 }
 
+#define ICL_AUX_PW_TO_CH(pw_idx)	\
+	((pw_idx) - ICL_PW_CTL_IDX_AUX_A + AUX_CH_A)
+
+static void
+icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
+				 struct i915_power_well *power_well)
+{
+	const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
+	int pw_idx = power_well->desc->hsw.idx;
+	enum aux_ch aux_ch = ICL_AUX_PW_TO_CH(pw_idx);
+	u32 val;
+
+	val = I915_READ(DP_AUX_CH_CTL(aux_ch));
+	val &= ~DP_AUX_CH_CTL_TBT_IO;
+	if (power_well->desc->hsw.is_tc_tbt)
+		val |= DP_AUX_CH_CTL_TBT_IO;
+	I915_WRITE(DP_AUX_CH_CTL(aux_ch), val);
+
+	val = I915_READ(regs->driver);
+	I915_WRITE(regs->driver, val | HSW_PWR_WELL_CTL_REQ(pw_idx));
+
+	hsw_wait_for_power_well_enable(dev_priv, power_well);
+}
+
+static void
+icl_tc_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
+				  struct i915_power_well *power_well)
+{
+	const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
+	int pw_idx = power_well->desc->hsw.idx;
+	u32 val;
+
+	val = I915_READ(regs->driver);
+	I915_WRITE(regs->driver, val & ~HSW_PWR_WELL_CTL_REQ(pw_idx));
+
+	hsw_wait_for_power_well_disable(dev_priv, power_well);
+}
+
 /*
  * We should only use the power well if we explicitly asked the hardware to
  * enable it, so check if it's enabled and also check if we've requested it to
@@ -2725,6 +2763,13 @@ static const struct i915_power_well_ops icl_combo_phy_aux_power_well_ops = {
 	.is_enabled = hsw_power_well_enabled,
 };
 
+static const struct i915_power_well_ops icl_tc_phy_aux_power_well_ops = {
+	.sync_hw = hsw_power_well_sync_hw,
+	.enable = icl_tc_phy_aux_power_well_enable,
+	.disable = icl_tc_phy_aux_power_well_disable,
+	.is_enabled = hsw_power_well_enabled,
+};
+
 static const struct i915_power_well_regs icl_aux_power_well_regs = {
 	.bios	= ICL_PWR_WELL_CTL_AUX1,
 	.driver	= ICL_PWR_WELL_CTL_AUX2,
@@ -2870,81 +2915,89 @@ static const struct i915_power_well_desc icl_power_wells[] = {
 	{
 		.name = "AUX C",
 		.domains = ICL_AUX_C_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_C,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX D",
 		.domains = ICL_AUX_D_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_D,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX E",
 		.domains = ICL_AUX_E_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_E,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX F",
 		.domains = ICL_AUX_F_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_F,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX TBT1",
 		.domains = ICL_AUX_TBT1_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT2",
 		.domains = ICL_AUX_TBT2_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT3",
 		.domains = ICL_AUX_TBT3_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT4",
 		.domains = ICL_AUX_TBT4_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
Signature · 1 line
2.13.2
Quoted 4 lines
Quoted 4 lines

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reviewed-by on v1 7/8
#31 lore raw

Re: [PATCH 7/8] drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain

In reply to Imre Deak
Quoted 10 lines · Imre Deak

Most of the AUX_CH_CTL flags are concerned with DP AUX transfer parameters. As opposed to this the flag specifying the thunderbolt vs.
non-thunderbolt mode of the port is not related to AUX transfers at all
(rather it's repurposed to enable either TBT or non-TBT PHY HW blocks).
The programming has to be done before enabling the corresponding AUX power well, so make it part of the power well code.

Quoted 3 lines

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108548
Cc: Paulo Zanoni <[email protected]>
Cc: Ville Syrjälä <[email protected]>

If respinning this patch please consider the comments bellow but nice catch.

Quoted 43 lines
---
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/intel_runtime_pm.c | 69
+++++++++++++++++++++++++++++----
 2 files changed, 62 insertions(+), 8 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index c57b701f72a7..dbf894835cb2 100644
@@ -921,6 +921,7 @@ struct i915_power_well_desc {
 			/* The pw is backing the VGA functionality */
 			bool has_vga:1;
 			bool has_fuses:1;
+			bool is_tc_tbt;
 		} hsw;
 	};
 	const struct i915_power_well_ops *ops;
drivers/gpu/drm/i915/intel_runtime_pm.c +12 -0
index 5f5416eb9644..eed17440a4a7 100644
@@ -465,6 +465,44 @@ icl_combo_phy_aux_power_well_disable(struct
 drm_i915_private *dev_priv,
 	hsw_wait_for_power_well_disable(dev_priv, power_well);
 }
 
+#define ICL_AUX_PW_TO_CH(pw_idx)	\
+	((pw_idx) - ICL_PW_CTL_IDX_AUX_A + AUX_CH_A)
+
+static void
+icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
+				 struct i915_power_well *power_well)
+{
+	const struct i915_power_well_regs *regs = power_well->desc-
 >hsw.regs;
+	int pw_idx = power_well->desc->hsw.idx;
+	enum aux_ch aux_ch = ICL_AUX_PW_TO_CH(pw_idx);
+	u32 val;
+

drivers/gpu/drm/i915/intel_runtime_pm.c icl_combo_phy_aux_power_well_disable(struct · line 491

Quoted 10 lines
drivers/gpu/drm/i915/intel_runtime_pm.c +10 -0
+	val = I915_READ(DP_AUX_CH_CTL(aux_ch));
+	val &= ~DP_AUX_CH_CTL_TBT_IO;
+	if (power_well->desc->hsw.is_tc_tbt)
+		val |= DP_AUX_CH_CTL_TBT_IO;
+	I915_WRITE(DP_AUX_CH_CTL(aux_ch), val);
+
+	val = I915_READ(regs->driver);
+	I915_WRITE(regs->driver, val | HSW_PWR_WELL_CTL_REQ(pw_idx));
+
+	hsw_wait_for_power_well_enable(dev_priv, power_well);

Minor but you could call hsw_power_well_enable() after write to DP_AUX_CH_CTL instead of duplicate code.

Quoted 6 lines
drivers/gpu/drm/i915/intel_runtime_pm.c +6 -0
+}
+
+static void
+icl_tc_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
+				  struct i915_power_well *power_well)
+{

drivers/gpu/drm/i915/intel_runtime_pm.c icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv, · line 504

Quoted 10 lines
drivers/gpu/drm/i915/intel_runtime_pm.c +9 -0
+	const struct i915_power_well_regs *regs = power_well->desc-
 >hsw.regs;
+	int pw_idx = power_well->desc->hsw.idx;
+	u32 val;
+
+	val = I915_READ(regs->driver);
+	I915_WRITE(regs->driver, val & ~HSW_PWR_WELL_CTL_REQ(pw_idx));
+
+	hsw_wait_for_power_well_disable(dev_priv, power_well);
+}

Minor too you could use the hsw_power_well_disable() instead of duplicate code.

Quoted 120 lines
drivers/gpu/drm/i915/intel_runtime_pm.c +1 -0
+

/*
* We should only use the power well if we explicitly asked the
hardware to
* enable it, so check if it's enabled and also check if we've
requested it to

drivers/gpu/drm/i915/intel_runtime_pm.c +7 -0
@@ -2725,6 +2763,13 @@ static const struct i915_power_well_ops
 icl_combo_phy_aux_power_well_ops = {
 	.is_enabled = hsw_power_well_enabled,
 };
 
+static const struct i915_power_well_ops
 icl_tc_phy_aux_power_well_ops = {
+	.sync_hw = hsw_power_well_sync_hw,
+	.enable = icl_tc_phy_aux_power_well_enable,
+	.disable = icl_tc_phy_aux_power_well_disable,
+	.is_enabled = hsw_power_well_enabled,
+};
+
 static const struct i915_power_well_regs icl_aux_power_well_regs = {
drivers/gpu/drm/i915/intel_runtime_pm.c +16 -8
 	.bios	= ICL_PWR_WELL_CTL_AUX1,
 	.driver	= ICL_PWR_WELL_CTL_AUX2,
@@ -2870,81 +2915,89 @@ static const struct i915_power_well_desc
 icl_power_wells[] = {
 	{
 		.name = "AUX C",
 		.domains = ICL_AUX_C_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_C,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX D",
 		.domains = ICL_AUX_D_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_D,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX E",
 		.domains = ICL_AUX_E_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_E,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX F",
 		.domains = ICL_AUX_F_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_F,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX TBT1",
 		.domains = ICL_AUX_TBT1_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT2",
 		.domains = ICL_AUX_TBT2_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT3",
 		.domains = ICL_AUX_TBT3_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT4",
 		.domains = ICL_AUX_TBT4_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4,
+			.hsw.is_tc_tbt = true,
 		},
 	},
Quoted 1 line

{

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#32 lore raw

Re: [PATCH 7/8] drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain

Quoted 85 lines · Jose
Quoted 10 lines · Imre Deak

Most of the AUX_CH_CTL flags are concerned with DP AUX transfer parameters. As opposed to this the flag specifying the thunderbolt vs.
non-thunderbolt mode of the port is not related to AUX transfers at all
(rather it's repurposed to enable either TBT or non-TBT PHY HW blocks).
The programming has to be done before enabling the corresponding AUX power well, so make it part of the power well code.

Quoted 3 lines

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108548
Cc: Paulo Zanoni <[email protected]>
Cc: Ville Syrjälä <[email protected]>

If respinning this patch please consider the comments bellow but nice catch.

Quoted 43 lines
---
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/intel_runtime_pm.c | 69
+++++++++++++++++++++++++++++----
 2 files changed, 62 insertions(+), 8 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +1 -0
index c57b701f72a7..dbf894835cb2 100644
@@ -921,6 +921,7 @@ struct i915_power_well_desc {
 			/* The pw is backing the VGA functionality */
 			bool has_vga:1;
 			bool has_fuses:1;
+			bool is_tc_tbt;
 		} hsw;
 	};
 	const struct i915_power_well_ops *ops;
drivers/gpu/drm/i915/intel_runtime_pm.c +12 -0
index 5f5416eb9644..eed17440a4a7 100644
@@ -465,6 +465,44 @@ icl_combo_phy_aux_power_well_disable(struct
 drm_i915_private *dev_priv,
 	hsw_wait_for_power_well_disable(dev_priv, power_well);
 }
 
+#define ICL_AUX_PW_TO_CH(pw_idx)	\
+	((pw_idx) - ICL_PW_CTL_IDX_AUX_A + AUX_CH_A)
+
+static void
+icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
+				 struct i915_power_well *power_well)
+{
+	const struct i915_power_well_regs *regs = power_well->desc-
 >hsw.regs;
+	int pw_idx = power_well->desc->hsw.idx;
+	enum aux_ch aux_ch = ICL_AUX_PW_TO_CH(pw_idx);
+	u32 val;
+

drivers/gpu/drm/i915/intel_runtime_pm.c icl_combo_phy_aux_power_well_disable(struct · line 491

Quoted 10 lines
drivers/gpu/drm/i915/intel_runtime_pm.c +10 -0
+	val = I915_READ(DP_AUX_CH_CTL(aux_ch));
+	val &= ~DP_AUX_CH_CTL_TBT_IO;
+	if (power_well->desc->hsw.is_tc_tbt)
+		val |= DP_AUX_CH_CTL_TBT_IO;
+	I915_WRITE(DP_AUX_CH_CTL(aux_ch), val);
+
+	val = I915_READ(regs->driver);
+	I915_WRITE(regs->driver, val | HSW_PWR_WELL_CTL_REQ(pw_idx));
+
+	hsw_wait_for_power_well_enable(dev_priv, power_well);

Minor but you could call hsw_power_well_enable() after write to DP_AUX_CH_CTL instead of duplicate code.

Quoted 8 lines
drivers/gpu/drm/i915/intel_runtime_pm.c +7 -0
+}
+
+static void
+icl_tc_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
+				  struct i915_power_well *power_well)
+{
+	const struct i915_power_well_regs *regs = power_well->desc-
 >hsw.regs;
Quoted 11 lines

drivers/gpu/drm/i915/intel_runtime_pm.c icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv, · line 504

Quoted 8 lines
drivers/gpu/drm/i915/intel_runtime_pm.c +8 -0
+	int pw_idx = power_well->desc->hsw.idx;
+	u32 val;
+
+	val = I915_READ(regs->driver);
+	I915_WRITE(regs->driver, val & ~HSW_PWR_WELL_CTL_REQ(pw_idx));
+
+	hsw_wait_for_power_well_disable(dev_priv, power_well);
+}

Minor too you could use the hsw_power_well_disable() instead of duplicate code.

Ok, will change these.

Quoted 114 lines
Quoted 114 lines
drivers/gpu/drm/i915/intel_runtime_pm.c +1 -0
+

/*
* We should only use the power well if we explicitly asked the
hardware to
* enable it, so check if it's enabled and also check if we've
requested it to

drivers/gpu/drm/i915/intel_runtime_pm.c +7 -0
@@ -2725,6 +2763,13 @@ static const struct i915_power_well_ops
 icl_combo_phy_aux_power_well_ops = {
 	.is_enabled = hsw_power_well_enabled,
 };
 
+static const struct i915_power_well_ops
 icl_tc_phy_aux_power_well_ops = {
+	.sync_hw = hsw_power_well_sync_hw,
+	.enable = icl_tc_phy_aux_power_well_enable,
+	.disable = icl_tc_phy_aux_power_well_disable,
+	.is_enabled = hsw_power_well_enabled,
+};
+
 static const struct i915_power_well_regs icl_aux_power_well_regs = {
drivers/gpu/drm/i915/intel_runtime_pm.c +15 -8
 	.bios	= ICL_PWR_WELL_CTL_AUX1,
 	.driver	= ICL_PWR_WELL_CTL_AUX2,
@@ -2870,81 +2915,89 @@ static const struct i915_power_well_desc
 icl_power_wells[] = {
 	{
 		.name = "AUX C",
 		.domains = ICL_AUX_C_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_C,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX D",
 		.domains = ICL_AUX_D_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_D,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX E",
 		.domains = ICL_AUX_E_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_E,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX F",
 		.domains = ICL_AUX_F_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_F,
+			.hsw.is_tc_tbt = false,
 		},
 	},
 	{
 		.name = "AUX TBT1",
 		.domains = ICL_AUX_TBT1_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT2",
 		.domains = ICL_AUX_TBT2_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT3",
 		.domains = ICL_AUX_TBT3_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3,
+			.hsw.is_tc_tbt = true,
 		},
 	},
 	{
 		.name = "AUX TBT4",
 		.domains = ICL_AUX_TBT4_IO_POWER_DOMAINS,
-		.ops = &hsw_power_well_ops,
+		.ops = &icl_tc_phy_aux_power_well_ops,
Quoted 8 lines
Quoted 8 lines
drivers/gpu/drm/i915/intel_runtime_pm.c +1 -0
 		.id = DISP_PW_ID_NONE,
 		{
 			.hsw.regs = &icl_aux_power_well_regs,
 			.hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4,
+			.hsw.is_tc_tbt = true,
 		},
 	},

{

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

author
#33 lore raw

PATCH 8/8 drm/i915/icl+: Sanitize port to PLL mapping

In reply to Imre Deak

BIOS can leave the PLL to port mapping enabled, even if the corresponding encoder is disabled. Disable the port mapping in this case.

Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 23 +++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_display.c |  4 ++++
 drivers/gpu/drm/i915/intel_drv.h     |  1 +
 3 files changed, 28 insertions(+)
drivers/gpu/drm/i915/intel_ddi.c +23 -0
index bf58816ed59c..8b7289af7558 100644
@@ -2822,6 +2822,29 @@ void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
 	}
 }
 
+void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	u32 val = I915_READ(DPCLKA_CFGCR0_ICL);
+	enum port port = encoder->port;
+	bool clk_enabled = !(val & icl_dpclka_cfgcr0_clk_off(dev_priv, port));
+
+	if (clk_enabled == !!encoder->base.crtc)
+		return;
+
+	/*
+	 * Punt on the case now where clock is disabled, but the encoder is
+	 * enabled, something else is really broken then.
+	 */
+	if (WARN_ON(!clk_enabled))
+		return;
+
+	DRM_NOTE("Port %c is disabled but it has a mapped PLL, unmap it\n",
+		 port_name(port));
+	val |= icl_dpclka_cfgcr0_clk_off(dev_priv, port);
+	I915_WRITE(DPCLKA_CFGCR0_ICL, val);
+}
+
 static void intel_ddi_clk_select(struct intel_encoder *encoder,
 				 const struct intel_crtc_state *crtc_state)
 {
drivers/gpu/drm/i915/intel_display.c +4 -0
index 12ba2b923e6b..2534263ebb41 100644
@@ -15368,6 +15368,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,
 
 static void intel_sanitize_encoder(struct intel_encoder *encoder)
 {
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	struct intel_connector *connector;
 
 	/* We need to check both for a crtc link (meaning that the
@@ -15409,6 +15410,9 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
 
 	/* notify opregion of the sanitized encoder state */
 	intel_opregion_notify_encoder(encoder, connector && has_active_crtc);
+
+	if (INTEL_GEN(dev_priv) >= 11)
+		icl_sanitize_encoder_pll_mapping(encoder);
 }
 
 void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv)
drivers/gpu/drm/i915/intel_drv.h +1 -0
index a3d7b93ecddd..224edb1a95d5 100644
@@ -1519,6 +1519,7 @@ void icl_map_plls_to_ports(struct drm_crtc *crtc,
 void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
 			     struct intel_crtc_state *crtc_state,
 			     struct drm_atomic_state *old_state);
+void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder);
 
 unsigned int intel_fb_align_height(const struct drm_framebuffer *fb,
 				   int color_plane, unsigned int height);
Signature · 6 lines
2.13.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Reviewed-by on v1 8/8
#34 lore raw

Re: [PATCH 8/8] drm/i915/icl+: Sanitize port to PLL mapping

Quoted 4 lines · Imre Deak

BIOS can leave the PLL to port mapping enabled, even if the corresponding encoder is disabled. Disable the port mapping in this case.

Quoted 88 lines
Cc Paulo Zanoni <[email protected]>
Cc Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_ddi.c     | 23 +++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_display.c |  4 ++++
 drivers/gpu/drm/i915/intel_drv.h     |  1 +
 3 files changed, 28 insertions(+)
drivers/gpu/drm/i915/intel_ddi.c +12 -0
index bf58816ed59c..8b7289af7558 100644
@@ -2822,6 +2822,29 @@ void icl_unmap_plls_to_ports(struct drm_crtc
 *crtc,
 	}
 }
 
+void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder)
+{
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+	u32 val = I915_READ(DPCLKA_CFGCR0_ICL);
+	enum port port = encoder->port;
+	bool clk_enabled = !(val & icl_dpclka_cfgcr0_clk_off(dev_priv,
 port));
+
+	if (clk_enabled == !!encoder->base.crtc)
+		return;
+
+	/*
+	 * Punt on the case now where clock is disabled, but the

encoder is

drivers/gpu/drm/i915/intel_ddi.c +6 -0
+	 * enabled, something else is really broken then.
+	 */
+	if (WARN_ON(!clk_enabled))
+		return;
+
+	DRM_NOTE("Port %c is disabled but it has a mapped PLL, unmap

it\n",

drivers/gpu/drm/i915/intel_ddi.c +5 -0
+		 port_name(port));
+	val |= icl_dpclka_cfgcr0_clk_off(dev_priv, port);
+	I915_WRITE(DPCLKA_CFGCR0_ICL, val);
+}
+
 static void intel_ddi_clk_select(struct intel_encoder *encoder,
 				 const struct intel_crtc_state

*crtc_state)
{

drivers/gpu/drm/i915/intel_display.c +1 -0
index 12ba2b923e6b..2534263ebb41 100644
@@ -15368,6 +15368,7 @@ static void intel_sanitize_crtc(struct
 intel_crtc *crtc,
 
 static void intel_sanitize_encoder(struct intel_encoder *encoder)
 {
+	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	struct intel_connector *connector;
 
drivers/gpu/drm/i915/intel_display.c +3 -0
 	/* We need to check both for a crtc link (meaning that the
@@ -15409,6 +15410,9 @@ static void intel_sanitize_encoder(struct
 intel_encoder *encoder)
 
 	/* notify opregion of the sanitized encoder state */
 	intel_opregion_notify_encoder(encoder, connector &&
 has_active_crtc);
+
+	if (INTEL_GEN(dev_priv) >= 11)
+		icl_sanitize_encoder_pll_mapping(encoder);
 }

void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv)

drivers/gpu/drm/i915/intel_drv.h +1 -0
index a3d7b93ecddd..224edb1a95d5 100644
@@ -1519,6 +1519,7 @@ void icl_map_plls_to_ports(struct drm_crtc
 *crtc,
 void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
 			     struct intel_crtc_state *crtc_state,
 			     struct drm_atomic_state *old_state);
+void icl_sanitize_encoder_pll_mapping(struct intel_encoder
 *encoder);
 
Quoted 3 lines

unsigned int intel_fb_align_height(const struct drm_framebuffer *fb,
int color_plane, unsigned int
height);

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#35 lore raw

✗ Fi.CI.CHECKPATCH: warning for drm/i915/icl: Fix HDMI on TypeC static ports

In reply to Imre Deak
== Series Details ==

== Series Details ==

Series: drm/i915/icl: Fix HDMI on TypeC static ports
URL : https://patchwork.freedesktop.org/series/51765/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
83eb4def4751 drm/i915: Move intel_aux_ch() to intel_bios.c
-:47: CHECK:SPACING: No space is necessary after a cast
#47: FILE: drivers/gpu/drm/i915/intel_bios.c:2170:
+		aux_ch = (enum aux_ch) port;

total: 0 errors, 0 warnings, 1 checks, 117 lines checked
0b6dfef45914 drm/i915: Move aux_ch to intel_digital_port
53ffb8f38693 drm/i915: Init aux_ch for HDMI ports too
220df38c6c99 drm/i915: Use a helper to get the aux power domain
f4b2a2abef1f drm/i915: Enable AUX power earlier
de78682eb1be drm/i915: Enable AUX power for HDMI DDI/TypeC main link too
95c39a9a3a65 drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain
-:30: CHECK:BOOL_MEMBER: Avoid using bool structure members because of possible alignment issues - see: https://lkml.org/lkml/2017/11/21/384
#30: FILE: drivers/gpu/drm/i915/i915_drv.h:924:
+ bool is_tc_tbt;

total: 0 errors, 0 warnings, 1 checks, 161 lines checked ef4031503b26 drm/i915/icl+: Sanitize port to PLL mapping

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#36 lore raw

✗ Fi.CI.SPARSE: warning for drm/i915/icl: Fix HDMI on TypeC static ports

In reply to Imre Deak
== Series Details ==

== Series Details ==

Series: drm/i915/icl: Fix HDMI on TypeC static ports
URL : https://patchwork.freedesktop.org/series/51765/
State : warning

== Summary ==

$ dim sparse origin/drm-tip
Sparse version: v0.5.2
Commit: drm/i915: Move intel_aux_ch() to intel_bios.c
-drivers/gpu/drm/i915/selftests/../i915_drv.h:3699:16: warning: expression using sizeof(void)
+drivers/gpu/drm/i915/selftests/../i915_drv.h:3700:16: warning: expression using sizeof(void)

Commit: drm/i915: Move aux_ch to intel_digital_port Okay!

Commit: drm/i915: Init aux_ch for HDMI ports too
Okay!

Commit: drm/i915: Use a helper to get the aux power domain Okay!

Commit: drm/i915: Enable AUX power earlier
Okay!

Commit: drm/i915: Enable AUX power for HDMI DDI/TypeC main link too Okay!

Commit: drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain -drivers/gpu/drm/i915/selftests/../i915_drv.h:3700:16: warning: expression using sizeof(void) +drivers/gpu/drm/i915/selftests/../i915_drv.h:3701:16: warning: expression using sizeof(void)

Commit: drm/i915/icl+: Sanitize port to PLL mapping Okay!

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#37 lore raw

✗ Fi.CI.BAT: failure for drm/i915/icl: Fix HDMI on TypeC static ports

In reply to Imre Deak
== Series Details ==

== Series Details ==

Series: drm/i915/icl: Fix HDMI on TypeC static ports
URL : https://patchwork.freedesktop.org/series/51765/
State : failure

== Summary ==

= CI Bug Log - changes from CI_DRM_5055 -> Patchwork_10652 =

== Summary - FAILURE ==

Serious unknown changes coming with Patchwork_10652 absolutely need to be verified manually.

If you think the reported changes have nothing to do with the changes introduced in Patchwork_10652, please notify your bug team to allow them to document this new failure mode, which will reduce false positives in CI.

External URL: https://patchwork.freedesktop.org/api/1.0/series/51765/revisions/1/mbox/

== Possible new issues ==

Here are the unknown changes that may have been introduced in Patchwork_10652:

=== IGT changes ===

    ==== Possible regressions ====

    igt@kms_busy@basic-flip-a:
      fi-apl-guc:         PASS -> DMESG-WARN +28

    igt@kms_pipe_crc_basic@hang-read-crc-pipe-b:
      fi-bxt-j4205:       PASS -> DMESG-WARN +25

    igt@pm_rpm@basic-rte:
      fi-glk-j4005:       PASS -> DMESG-WARN +27

    
    ==== Warnings ====

    igt@pm_rpm@module-reload:
      fi-hsw-4770r:       PASS -> SKIP

== Known issues ==

Here are the changes found in Patchwork_10652 that come from known issues:

=== IGT changes ===

    ==== Issues hit ====

    igt@drv_module_reload@basic-reload-inject:
      fi-bxt-j4205:       PASS -> DMESG-WARN (fdo#107821)
      fi-hsw-4770r:       PASS -> DMESG-WARN (fdo#107924, fdo#107425)

    igt@drv_selftest@live_contexts:
      fi-icl-u:           NOTRUN -> DMESG-FAIL (fdo#108569)

    igt@drv_selftest@live_hangcheck:
      fi-icl-u2:          PASS -> INCOMPLETE (fdo#108315)

    igt@kms_flip@basic-flip-vs-modeset:
      fi-skl-6700hq:      PASS -> DMESG-WARN (fdo#105998)

    
    ==== Possible fixes ====

    igt@debugfs_test@read_all_entries:
      fi-icl-u2:          DMESG-WARN (fdo#108070) -> PASS

    igt@gem_ctx_switch@basic-default:
      fi-icl-u:           INCOMPLETE (fdo#108315) -> PASS

    igt@gem_exec_suspend@basic-s3:
      fi-icl-u2:          DMESG-WARN (fdo#106612) -> PASS
      fi-skl-6700k2:      INCOMPLETE (fdo#107773, k.org#199541, fdo#105524, fdo#104108) -> PASS
      fi-blb-e6850:       INCOMPLETE (fdo#107718) -> PASS

    
    ==== Warnings ====

    igt@drv_selftest@live_contexts:
      fi-icl-u2:          DMESG-FAIL (fdo#108569) -> INCOMPLETE (fdo#108315)

fdo#104108 https://bugs.freedesktop.org/show_bug.cgi?id=104108
fdo#105524 https://bugs.freedesktop.org/show_bug.cgi?id=105524
fdo#105998 https://bugs.freedesktop.org/show_bug.cgi?id=105998
fdo#106612 https://bugs.freedesktop.org/show_bug.cgi?id=106612
fdo#107425 https://bugs.freedesktop.org/show_bug.cgi?id=107425
fdo#107718 https://bugs.freedesktop.org/show_bug.cgi?id=107718
fdo#107773 https://bugs.freedesktop.org/show_bug.cgi?id=107773
fdo#107821 https://bugs.freedesktop.org/show_bug.cgi?id=107821
fdo#107924 https://bugs.freedesktop.org/show_bug.cgi?id=107924
fdo#108070 https://bugs.freedesktop.org/show_bug.cgi?id=108070
fdo#108315 https://bugs.freedesktop.org/show_bug.cgi?id=108315
fdo#108569 https://bugs.freedesktop.org/show_bug.cgi?id=108569
k.org#199541 https://bugzilla.kernel.org/show_bug.cgi?id=199541

== Participating hosts (48 -> 42) ==

Missing (6): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-pnv-d510 fi-kbl-7560u

== Build changes ==

* Linux: CI_DRM_5055 -> Patchwork_10652

CI_DRM_5055: 9471771fb0a56bb6559279fcdbb445d270036af3 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_4700: b517f6533671552166c11748ee48019093ebd069 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
Patchwork_10652: ef4031503b26a3020e60e377a81856b3f6488f3a @ git://anongit.freedesktop.org/gfx-ci/linux

== Linux commits ==

ef4031503b26 drm/i915/icl+: Sanitize port to PLL mapping 95c39a9a3a65 drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain de78682eb1be drm/i915: Enable AUX power for HDMI DDI/TypeC main link too f4b2a2abef1f drm/i915: Enable AUX power earlier
220df38c6c99 drm/i915: Use a helper to get the aux power domain 53ffb8f38693 drm/i915: Init aux_ch for HDMI ports too 0b6dfef45914 drm/i915: Move aux_ch to intel_digital_port 83eb4def4751 drm/i915: Move intel_aux_ch() to intel_bios.c

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_10652/issues.html
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#38 lore raw

✗ Fi.CI.CHECKPATCH: warning for drm/i915/icl: Fix HDMI on TypeC static ports (rev2)

In reply to Imre Deak
== Series Details ==

== Series Details ==

Series: drm/i915/icl: Fix HDMI on TypeC static ports (rev2)
URL : https://patchwork.freedesktop.org/series/51765/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
e4ad990a6870 drm/i915: Move intel_aux_ch() to intel_bios.c
-:47: CHECK:SPACING: No space is necessary after a cast
#47: FILE: drivers/gpu/drm/i915/intel_bios.c:2170:
+		aux_ch = (enum aux_ch) port;

total: 0 errors, 0 warnings, 1 checks, 117 lines checked 37f979051573 drm/i915: Move aux_ch to intel_digital_port 205acdca75bf drm/i915: Init aux_ch for HDMI ports too d1f98d2d87ee drm/i915: Use a helper to get the aux power domain 4c39cbbf1d03 drm/i915: Enable AUX power earlier
-:67: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis #67: FILE: drivers/gpu/drm/i915/intel_ddi.c:2903:
+ bxt_ddi_phy_set_lane_optim_mask(encoder,
+ crtc_state->lane_lat_optim_mask);

total: 0 errors, 0 warnings, 1 checks, 111 lines checked
add3b19aab49 drm/i915: Enable AUX power for HDMI DDI/TypeC main link too
4241d974c2d7 drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain
-:30: CHECK:BOOL_MEMBER: Avoid using bool structure members because of possible alignment issues - see: https://lkml.org/lkml/2017/11/21/384
#30: FILE: drivers/gpu/drm/i915/i915_drv.h:924:
+ bool is_tc_tbt;

total: 0 errors, 0 warnings, 1 checks, 161 lines checked cb36ad65b0b1 drm/i915/icl+: Sanitize port to PLL mapping

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#39 lore raw

✗ Fi.CI.SPARSE: warning for drm/i915/icl: Fix HDMI on TypeC static ports (rev2)

In reply to Imre Deak
== Series Details ==

== Series Details ==

Series: drm/i915/icl: Fix HDMI on TypeC static ports (rev2)
URL : https://patchwork.freedesktop.org/series/51765/
State : warning

== Summary ==

$ dim sparse origin/drm-tip
Sparse version: v0.5.2
Commit: drm/i915: Move intel_aux_ch() to intel_bios.c
-drivers/gpu/drm/i915/selftests/../i915_drv.h:3699:16: warning: expression using sizeof(void)
+drivers/gpu/drm/i915/selftests/../i915_drv.h:3700:16: warning: expression using sizeof(void)

Commit: drm/i915: Move aux_ch to intel_digital_port Okay!

Commit: drm/i915: Init aux_ch for HDMI ports too
Okay!

Commit: drm/i915: Use a helper to get the aux power domain Okay!

Commit: drm/i915: Enable AUX power earlier
Okay!

Commit: drm/i915: Enable AUX power for HDMI DDI/TypeC main link too Okay!

Commit: drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain -drivers/gpu/drm/i915/selftests/../i915_drv.h:3700:16: warning: expression using sizeof(void) +drivers/gpu/drm/i915/selftests/../i915_drv.h:3701:16: warning: expression using sizeof(void)

Commit: drm/i915/icl+: Sanitize port to PLL mapping Okay!

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#40 lore raw

✓ Fi.CI.BAT: success for drm/i915/icl: Fix HDMI on TypeC static ports (rev2)

In reply to Imre Deak
== Series Details ==

== Series Details ==

Series: drm/i915/icl: Fix HDMI on TypeC static ports (rev2)
URL : https://patchwork.freedesktop.org/series/51765/
State : success

== Summary ==

= CI Bug Log - changes from CI_DRM_5057 -> Patchwork_10653 =

== Summary - SUCCESS ==

No regressions found.

External URL: https://patchwork.freedesktop.org/api/1.0/series/51765/revisions/2/mbox/

== Known issues ==

Here are the changes found in Patchwork_10653 that come from known issues:

=== IGT changes ===

    ==== Issues hit ====

    igt@kms_busy@basic-flip-c:
      fi-skl-6700hq:      PASS -> DMESG-WARN (fdo#105998)

    igt@kms_frontbuffer_tracking@basic:
      fi-icl-u2:          PASS -> FAIL (fdo#103167)
      fi-byt-clapper:     PASS -> FAIL (fdo#103167)

    igt@kms_pipe_crc_basic@nonblocking-crc-pipe-a-frame-sequence:
      fi-byt-clapper:     PASS -> FAIL (fdo#103191, fdo#107362) +1

    
    ==== Possible fixes ====

    igt@drv_selftest@live_coherency:
      fi-gdg-551:         DMESG-FAIL (fdo#107164) -> PASS

    igt@drv_selftest@live_hangcheck:
      fi-icl-u2:          INCOMPLETE (fdo#108315) -> PASS

    igt@kms_flip@basic-flip-vs-modeset:
      fi-skl-6700hq:      DMESG-WARN (fdo#105998) -> PASS

    
    ==== Warnings ====

    igt@drv_selftest@live_contexts:
      fi-icl-u2:          INCOMPLETE (fdo#108315) -> DMESG-FAIL (fdo#108569)

fdo#103167 https://bugs.freedesktop.org/show_bug.cgi?id=103167
fdo#103191 https://bugs.freedesktop.org/show_bug.cgi?id=103191
fdo#105998 https://bugs.freedesktop.org/show_bug.cgi?id=105998
fdo#107164 https://bugs.freedesktop.org/show_bug.cgi?id=107164
fdo#107362 https://bugs.freedesktop.org/show_bug.cgi?id=107362
fdo#108315 https://bugs.freedesktop.org/show_bug.cgi?id=108315
fdo#108569 https://bugs.freedesktop.org/show_bug.cgi?id=108569

== Participating hosts (49 -> 42) ==

Missing (7): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-ctg-p8600 fi-pnv-d510 fi-icl-u

== Build changes ==

* Linux: CI_DRM_5057 -> Patchwork_10653

CI_DRM_5057: fd1827d4a1cb142452a3107f5e337043cabd56f4 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_4701: 3aedf1b000e27abfa1bf179205a81efe2b76a508 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
Patchwork_10653: cb36ad65b0b148dc379988005841a5b155a198bd @ git://anongit.freedesktop.org/gfx-ci/linux

== Linux commits ==

cb36ad65b0b1 drm/i915/icl+: Sanitize port to PLL mapping 4241d974c2d7 drm/i915: Configure AUX_CH_CTL when enabling the AUX power domain add3b19aab49 drm/i915: Enable AUX power for HDMI DDI/TypeC main link too 4c39cbbf1d03 drm/i915: Enable AUX power earlier
d1f98d2d87ee drm/i915: Use a helper to get the aux power domain 205acdca75bf drm/i915: Init aux_ch for HDMI ports too 37f979051573 drm/i915: Move aux_ch to intel_digital_port e4ad990a6870 drm/i915: Move intel_aux_ch() to intel_bios.c

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_10653/issues.html
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#41 lore raw

✓ Fi.CI.IGT: success for drm/i915/icl: Fix HDMI on TypeC static ports (rev2)

In reply to Imre Deak
== Series Details ==

== Series Details ==

Series: drm/i915/icl: Fix HDMI on TypeC static ports (rev2)
URL : https://patchwork.freedesktop.org/series/51765/
State : success

== Summary ==

= CI Bug Log - changes from CI_DRM_5057_full -> Patchwork_10653_full =

== Summary - SUCCESS ==

No regressions found.

== Known issues ==

Here are the changes found in Patchwork_10653_full that come from known issues:

=== IGT changes ===

    ==== Issues hit ====

    igt@gem_ctx_isolation@bcs0-s3:
      shard-skl:          PASS -> INCOMPLETE (fdo#107773, fdo#104108)

    igt@gem_ppgtt@blt-vs-render-ctxn:
      shard-skl:          NOTRUN -> TIMEOUT (fdo#108039)

    igt@kms_color@pipe-c-ctm-green-to-red:
      shard-skl:          PASS -> FAIL (fdo#107201)

    igt@kms_cursor_crc@cursor-128x42-random:
      shard-glk:          PASS -> FAIL (fdo#103232) +1

    igt@kms_cursor_crc@cursor-256x256-offscreen:
      shard-skl:          PASS -> FAIL (fdo#103232)

    igt@kms_cursor_crc@cursor-64x21-onscreen:
      shard-apl:          PASS -> FAIL (fdo#103232)

    igt@kms_cursor_crc@cursor-64x64-suspend:
      shard-apl:          PASS -> FAIL (fdo#103191, fdo#103232)

    igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-render:
      shard-apl:          PASS -> FAIL (fdo#103167) +2

    igt@kms_frontbuffer_tracking@fbc-2p-primscrn-cur-indfb-draw-mmap-cpu:
      shard-glk:          PASS -> FAIL (fdo#103167) +4

    igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-move:
      shard-skl:          NOTRUN -> FAIL (fdo#103167)

    igt@kms_frontbuffer_tracking@fbcpsr-stridechange:
      shard-skl:          NOTRUN -> FAIL (fdo#105683)

    igt@kms_plane@plane-position-covered-pipe-b-planes:
      shard-glk:          PASS -> FAIL (fdo#103166) +1

    igt@kms_plane_alpha_blend@pipe-a-alpha-7efc:
      shard-apl:          NOTRUN -> FAIL (fdo#108145) +1

    igt@kms_plane_alpha_blend@pipe-b-alpha-transparant-fb:
      shard-skl:          NOTRUN -> FAIL (fdo#108145)

    igt@kms_plane_multiple@atomic-pipe-b-tiling-x:
      shard-apl:          PASS -> FAIL (fdo#103166) +3

    igt@kms_setmode@basic:
      shard-skl:          NOTRUN -> FAIL (fdo#99912)

    
    ==== Possible fixes ====

    igt@gem_ctx_isolation@rcs0-none:
      shard-snb:          INCOMPLETE (fdo#105411) -> PASS

    igt@gem_ppgtt@blt-vs-render-ctxn:
      shard-kbl:          INCOMPLETE (fdo#106023, fdo#103665, fdo#106887) -> PASS

    igt@kms_color@pipe-a-ctm-max:
      shard-apl:          FAIL (fdo#108147) -> PASS

    igt@kms_cursor_crc@cursor-256x85-onscreen:
      shard-glk:          FAIL (fdo#103232) -> PASS +1

    igt@kms_cursor_crc@cursor-256x85-random:
      shard-apl:          FAIL (fdo#103232) -> PASS +1

    igt@kms_fbcon_fbt@fbc-suspend:
      shard-apl:          INCOMPLETE (fdo#103927) -> PASS +2

    igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-blt:
      shard-glk:          FAIL (fdo#103167) -> PASS +2

    igt@kms_frontbuffer_tracking@fbc-2p-rte:
      shard-glk:          FAIL (fdo#105682, fdo#103167) -> PASS

    igt@kms_plane_multiple@atomic-pipe-a-tiling-yf:
      shard-glk:          FAIL (fdo#103166) -> PASS

    igt@kms_plane_multiple@atomic-pipe-c-tiling-yf:
      shard-apl:          FAIL (fdo#103166) -> PASS +2

    igt@kms_setmode@basic:
      shard-kbl:          FAIL (fdo#99912) -> PASS

fdo#103166 https://bugs.freedesktop.org/show_bug.cgi?id=103166
fdo#103167 https://bugs.freedesktop.org/show_bug.cgi?id=103167
fdo#103191 https://bugs.freedesktop.org/show_bug.cgi?id=103191
fdo#103232 https://bugs.freedesktop.org/show_bug.cgi?id=103232
fdo#103665 https://bugs.freedesktop.org/show_bug.cgi?id=103665
fdo#103927 https://bugs.freedesktop.org/show_bug.cgi?id=103927
fdo#104108 https://bugs.freedesktop.org/show_bug.cgi?id=104108
fdo#105411 https://bugs.freedesktop.org/show_bug.cgi?id=105411
fdo#105682 https://bugs.freedesktop.org/show_bug.cgi?id=105682
fdo#105683 https://bugs.freedesktop.org/show_bug.cgi?id=105683
fdo#106023 https://bugs.freedesktop.org/show_bug.cgi?id=106023
fdo#106887 https://bugs.freedesktop.org/show_bug.cgi?id=106887
fdo#107201 https://bugs.freedesktop.org/show_bug.cgi?id=107201
fdo#107773 https://bugs.freedesktop.org/show_bug.cgi?id=107773
fdo#108039 https://bugs.freedesktop.org/show_bug.cgi?id=108039
fdo#108145 https://bugs.freedesktop.org/show_bug.cgi?id=108145
fdo#108147 https://bugs.freedesktop.org/show_bug.cgi?id=108147
fdo#99912 https://bugs.freedesktop.org/show_bug.cgi?id=99912

== Participating hosts (6 -> 6) ==

No changes in participating hosts

== Build changes ==

* Linux: CI_DRM_5057 -> Patchwork_10653

CI_DRM_5057: fd1827d4a1cb142452a3107f5e337043cabd56f4 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_4701: 3aedf1b000e27abfa1bf179205a81efe2b76a508 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
Patchwork_10653: cb36ad65b0b148dc379988005841a5b155a198bd @ git://anongit.freedesktop.org/gfx-ci/linux
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_10653/shards.html
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx