Commit a8b4114d authored by Imre Deak's avatar Imre Deak
Browse files

drm/i915/tc: Make the TC mode readout consistent in all PHY states



For consistency detect the initial TC mode in the PHY owned state the
same way this is done in the not owned state (w/o changing the
behavior). While at it, add more details to the PHY state debug print.

Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230316131724.359612-11-imre.deak@intel.com
parent 2983b869
Loading
Loading
Loading
Loading
+33 −10
Original line number Diff line number Diff line
@@ -619,6 +619,26 @@ tc_phy_hpd_live_mode(struct intel_digital_port *dig_port)
	return hpd_mask_to_tc_mode(live_status_mask);
}

static enum tc_port_mode
get_tc_mode_in_phy_owned_state(struct intel_digital_port *dig_port,
			       enum tc_port_mode live_mode)
{
	switch (live_mode) {
	case TC_PORT_LEGACY:
	case TC_PORT_DP_ALT:
		return live_mode;
	default:
		MISSING_CASE(live_mode);
		fallthrough;
	case TC_PORT_TBT_ALT:
	case TC_PORT_DISCONNECTED:
		if (dig_port->tc_legacy_port)
			return TC_PORT_LEGACY;
		else
			return TC_PORT_DP_ALT;
	}
}

static enum tc_port_mode
get_tc_mode_in_phy_not_owned_state(struct intel_digital_port *dig_port,
				   enum tc_port_mode live_mode)
@@ -660,13 +680,20 @@ intel_tc_port_get_current_mode(struct intel_digital_port *dig_port)
	phy_is_ready = tc_phy_status_complete(dig_port);
	phy_is_owned = tc_phy_is_owned(dig_port);

	if (!tc_phy_is_ready_and_owned(dig_port, phy_is_ready, phy_is_owned))
		return get_tc_mode_in_phy_not_owned_state(dig_port, live_mode);
	if (!tc_phy_is_ready_and_owned(dig_port, phy_is_ready, phy_is_owned)) {
		mode = get_tc_mode_in_phy_not_owned_state(dig_port, live_mode);
	} else {
		drm_WARN_ON(&i915->drm, live_mode == TC_PORT_TBT_ALT);
		mode = get_tc_mode_in_phy_owned_state(dig_port, live_mode);
	}

	mode = dig_port->tc_legacy_port ? TC_PORT_LEGACY : TC_PORT_DP_ALT;
	if (live_mode != TC_PORT_DISCONNECTED &&
	    !drm_WARN_ON(&i915->drm, live_mode == TC_PORT_TBT_ALT))
		mode = live_mode;
	drm_dbg_kms(&i915->drm,
		    "Port %s: PHY mode: %s (ready: %s, owned: %s, HPD: %s)\n",
		    dig_port->tc_port_name,
		    tc_port_mode_name(mode),
		    str_yes_no(phy_is_ready),
		    str_yes_no(phy_is_owned),
		    tc_port_mode_name(live_mode));

	return mode;
}
@@ -842,10 +869,6 @@ void intel_tc_port_init_mode(struct intel_digital_port *dig_port)

	tc_cold_unblock(dig_port, domain, tc_cold_wref);

	drm_dbg_kms(&i915->drm, "Port %s: init mode (%s)\n",
		    dig_port->tc_port_name,
		    tc_port_mode_name(dig_port->tc_mode));

	mutex_unlock(&dig_port->tc_lock);
}