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%. -- Ville Syrjälä Intel _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx