drm/i915: Parse DP/eDP max lane count from VBT
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 15 Jul 2022 20:20:44 +0000 (23:20 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 5 Sep 2022 12:26:35 +0000 (15:26 +0300)
Limit the DP lane count based on the new VBT DP/eDP max
lane count field.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220715202044.11153-13-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_bios.c
drivers/gpu/drm/i915/display/intel_bios.h
drivers/gpu/drm/i915/display/intel_dp.c

index 0f61896..28bdb93 100644 (file)
@@ -2515,6 +2515,14 @@ static int _intel_bios_dp_max_link_rate(const struct intel_bios_encoder_data *de
                return parse_bdb_216_dp_max_link_rate(devdata->child.dp_max_link_rate);
 }
 
+static int _intel_bios_dp_max_lane_count(const struct intel_bios_encoder_data *devdata)
+{
+       if (!devdata || devdata->i915->display.vbt.version < 244)
+               return 0;
+
+       return devdata->child.dp_max_lane_count + 1;
+}
+
 static void sanitize_device_type(struct intel_bios_encoder_data *devdata,
                                 enum port port)
 {
@@ -3696,6 +3704,14 @@ int intel_bios_dp_max_link_rate(struct intel_encoder *encoder)
        return _intel_bios_dp_max_link_rate(devdata);
 }
 
+int intel_bios_dp_max_lane_count(struct intel_encoder *encoder)
+{
+       struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+       const struct intel_bios_encoder_data *devdata = i915->display.vbt.ports[encoder->port];
+
+       return _intel_bios_dp_max_lane_count(devdata);
+}
+
 int intel_bios_alternate_ddc_pin(struct intel_encoder *encoder)
 {
        struct drm_i915_private *i915 = to_i915(encoder->base.dev);
index e47582b..e375405 100644 (file)
@@ -258,6 +258,7 @@ bool intel_bios_get_dsc_params(struct intel_encoder *encoder,
 int intel_bios_max_tmds_clock(struct intel_encoder *encoder);
 int intel_bios_hdmi_level_shift(struct intel_encoder *encoder);
 int intel_bios_dp_max_link_rate(struct intel_encoder *encoder);
+int intel_bios_dp_max_lane_count(struct intel_encoder *encoder);
 int intel_bios_alternate_ddc_pin(struct intel_encoder *encoder);
 bool intel_bios_port_supports_typec_usb(struct drm_i915_private *i915, enum port port);
 bool intel_bios_port_supports_tbt(struct drm_i915_private *i915, enum port port);
index c63eee3..f52a5f0 100644 (file)
@@ -286,11 +286,22 @@ static int intel_dp_max_common_rate(struct intel_dp *intel_dp)
        return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1);
 }
 
+static int intel_dp_max_source_lane_count(struct intel_digital_port *dig_port)
+{
+       int vbt_max_lanes = intel_bios_dp_max_lane_count(&dig_port->base);
+       int max_lanes = dig_port->max_lanes;
+
+       if (vbt_max_lanes)
+               max_lanes = min(max_lanes, vbt_max_lanes);
+
+       return max_lanes;
+}
+
 /* Theoretical max between source and sink */
 static int intel_dp_max_common_lane_count(struct intel_dp *intel_dp)
 {
        struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
-       int source_max = dig_port->max_lanes;
+       int source_max = intel_dp_max_source_lane_count(dig_port);
        int sink_max = intel_dp->max_sink_lane_count;
        int fia_max = intel_tc_port_fia_max_lane_count(dig_port);
        int lttpr_max = drm_dp_lttpr_max_lane_count(intel_dp->lttpr_common_caps);