On Fri, Jan 17, 2020, Ville Syrjälä wrote: >On Fri, Jan 17, 2020 at 09:47:17PM +0800, Lee Shawn C wrote: >> While mode setting, driver would calculate mode rate based on >> resolution and bpp. And choose the best bpp that did not exceed DP >> bandwidtd. >> >> But LSPCON had more restriction due to it convert DP to HDMI. >> Driver should respect HDMI's bandwidth limitation if LSPCON was >> active. This change would ignore the bpp when its required output >> bandwidth already over HDMI 2.0 or 1.4 spec. >> >> Cc: Imre Deak <imre.deak@xxxxxxxxx> >> Cc: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> >> Cc: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> >> Cc: Jani Nikula <jani.nikula@xxxxxxxxxxxxxxx> >> Cc: Cooper Chiou <cooper.chiou@xxxxxxxxx> >> Cc: Sam McNally <sammc@xxxxxxxxxx> >> Signed-off-by: Lee Shawn C <shawn.c.lee@xxxxxxxxx> >> --- >> drivers/gpu/drm/i915/display/intel_dp.c | 45 +++++++++++++++++++++ >> drivers/gpu/drm/i915/display/intel_lspcon.c | 5 +++ >> drivers/gpu/drm/i915/display/intel_lspcon.h | 1 + >> 3 files changed, 51 insertions(+) >> >> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c >> b/drivers/gpu/drm/i915/display/intel_dp.c >> index c7424e2a04a3..c27d3e7ac219 100644 >> --- a/drivers/gpu/drm/i915/display/intel_dp.c >> +++ b/drivers/gpu/drm/i915/display/intel_dp.c >> @@ -1976,6 +1976,47 @@ static int intel_dp_output_bpp(const struct intel_crtc_state *crtc_state, int bp >> return bpp; >> } >> >> +static bool >> +intel_dp_lspcon_exceed_bandwidth_limitation(struct intel_dp *intel_dp, >> + struct intel_crtc_state *pipe_config, >> + int bpp) >> +{ >> + struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp); >> + struct intel_connector *connector = intel_dp->attached_connector; >> + const struct drm_display_info *info = &connector->base.display_info; >> + enum drm_lspcon_mode lspcon_current_mode = lspcon_get_mode(lspcon); >> + const int pcon_mode_max_tmds_clock = 600000; >> + const int ls_mode_max_tmds_clock = 340000; >> + int mode_rate, max_tmds_clock = pcon_mode_max_tmds_clock; >> + >> + if (lspcon->active) { >> + switch (bpp) { >> + case 36: >> + mode_rate = pipe_config->hw.adjusted_mode.crtc_clock * 3 / 2; >> + break; >> + case 30: >> + mode_rate = pipe_config->hw.adjusted_mode.crtc_clock * 5 / 4; >> + break; >> + case 24: >> + default: >> + mode_rate = pipe_config->hw.adjusted_mode.crtc_clock; >> + break; >> + } >> + >> + if (lspcon_current_mode == DRM_LSPCON_MODE_LS) >> + max_tmds_clock = ls_mode_max_tmds_clock; >> + >> + if (info->max_tmds_clock) >> + max_tmds_clock = min(max_tmds_clock, >> + info->max_tmds_clock); >> + >> + if (mode_rate > max_tmds_clock) >> + return true; >> + } >> + >> + return false; >> +} > >That's rather ad-hoc. I've been cooking a much more generic solution to deal with all kinds of DP DFPs. It should handle the TMDS limits for HDMI/DVI DFPs (and on board LSPCON too IIRC), as well as hooking up YUV 444->420 conversion if supported by the dongle (though those old on board LSPCON chips do that differently so shouldn't affect them). > >Rebased version available here: >git://github.com/vsyrjala/linux.git dp_downstream_ports_4 > >One caveat is that I've not re-tested it in maybe half a year, so not entirely sure it still works 100%. > >-- Thanks for comments. Below change just like what this patch did but it's more complicated. https://github.com/vsyrjala/linux/commit/45779beb3ebbe6d4d36b8ff1de97f45076fc8d90 Here we got an issue to connect HDMI 2.0 external monitor with 12 bpc capability. Connect to a HDMI port with LSPCON, driver would output 36 bpp because of bandwidth did not exceed DP's. We can resolve the problem by this patch. Do you think maybe we should go through yours? Could you share any other idea how we solve issue like this? Best regards, Shawn >Ville Syrjälä >Intel _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx