Commit 6075546f authored by Paulo Zanoni's avatar Paulo Zanoni

drm/i915/icl: store the port type for TC ports

The type is detected based on the live status bits. Once detected,
it's not supposed to be changed, so we have some sanity checks for
that.

v2: Rebase.

Cc: Animesh Manna <animesh.manna@intel.com>
Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: default avatarPaulo Zanoni <paulo.r.zanoni@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180725002813.6938-3-paulo.r.zanoni@intel.com
parent b9fcddab
...@@ -137,6 +137,13 @@ enum tc_port { ...@@ -137,6 +137,13 @@ enum tc_port {
I915_MAX_TC_PORTS I915_MAX_TC_PORTS
}; };
enum tc_port_type {
TC_PORT_UNKNOWN = 0,
TC_PORT_TYPEC,
TC_PORT_TBT,
TC_PORT_LEGACY,
};
enum dpio_channel { enum dpio_channel {
DPIO_CH0, DPIO_CH0,
DPIO_CH1 DPIO_CH1
......
...@@ -4594,6 +4594,38 @@ static bool icl_combo_port_connected(struct drm_i915_private *dev_priv, ...@@ -4594,6 +4594,38 @@ static bool icl_combo_port_connected(struct drm_i915_private *dev_priv,
return I915_READ(SDEISR) & SDE_DDI_HOTPLUG_ICP(port); return I915_READ(SDEISR) & SDE_DDI_HOTPLUG_ICP(port);
} }
static void icl_update_tc_port_type(struct drm_i915_private *dev_priv,
struct intel_digital_port *intel_dig_port,
bool is_legacy, bool is_typec, bool is_tbt)
{
enum port port = intel_dig_port->base.port;
enum tc_port_type old_type = intel_dig_port->tc_type;
const char *type_str;
WARN_ON(is_legacy + is_typec + is_tbt != 1);
if (is_legacy) {
intel_dig_port->tc_type = TC_PORT_LEGACY;
type_str = "legacy";
} else if (is_typec) {
intel_dig_port->tc_type = TC_PORT_TYPEC;
type_str = "typec";
} else if (is_tbt) {
intel_dig_port->tc_type = TC_PORT_TBT;
type_str = "tbt";
} else {
return;
}
/* Types are not supposed to be changed at runtime. */
WARN_ON(old_type != TC_PORT_UNKNOWN &&
old_type != intel_dig_port->tc_type);
if (old_type != intel_dig_port->tc_type)
DRM_DEBUG_KMS("Port %c has TC type %s\n", port_name(port),
type_str);
}
static bool icl_tc_port_connected(struct drm_i915_private *dev_priv, static bool icl_tc_port_connected(struct drm_i915_private *dev_priv,
struct intel_digital_port *intel_dig_port) struct intel_digital_port *intel_dig_port)
{ {
...@@ -4612,9 +4644,13 @@ static bool icl_tc_port_connected(struct drm_i915_private *dev_priv, ...@@ -4612,9 +4644,13 @@ static bool icl_tc_port_connected(struct drm_i915_private *dev_priv,
is_typec = dpsp & TC_LIVE_STATE_TC(tc_port); is_typec = dpsp & TC_LIVE_STATE_TC(tc_port);
is_tbt = dpsp & TC_LIVE_STATE_TBT(tc_port); is_tbt = dpsp & TC_LIVE_STATE_TBT(tc_port);
WARN_ON(is_legacy + is_typec + is_tbt > 1); if (!is_legacy && !is_typec && !is_tbt)
return false;
icl_update_tc_port_type(dev_priv, intel_dig_port, is_legacy, is_typec,
is_tbt);
return is_legacy || is_typec || is_tbt; return true;
} }
static bool icl_digital_port_connected(struct intel_encoder *encoder) static bool icl_digital_port_connected(struct intel_encoder *encoder)
......
...@@ -1164,6 +1164,7 @@ struct intel_digital_port { ...@@ -1164,6 +1164,7 @@ struct intel_digital_port {
bool release_cl2_override; bool release_cl2_override;
uint8_t max_lanes; uint8_t max_lanes;
enum intel_display_power_domain ddi_io_power_domain; enum intel_display_power_domain ddi_io_power_domain;
enum tc_port_type tc_type;
void (*write_infoframe)(struct drm_encoder *encoder, void (*write_infoframe)(struct drm_encoder *encoder,
const struct intel_crtc_state *crtc_state, const struct intel_crtc_state *crtc_state,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment