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: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180725002813.6938-3-paulo.r.zanoni@intel.com
This commit is contained in:
Paulo Zanoni 2018-07-24 17:28:10 -07:00
parent b9fcddab4a
commit 6075546f57
3 changed files with 46 additions and 2 deletions

View File

@ -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

View File

@ -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,
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;
return is_legacy || is_typec || is_tbt; icl_update_tc_port_type(dev_priv, intel_dig_port, 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)

View File

@ -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,