[Intel-gfx] [PATCH] drm/i915: Check require bandwidth did not exceed LSPCON limitation

Ville Syrjälä ville.syrjala at linux.intel.com
Fri Jan 17 14:04:14 UTC 2020


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 at intel.com>
> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Cc: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> Cc: Jani Nikula <jani.nikula at linux.intel.com>
> Cc: Cooper Chiou <cooper.chiou at intel.com>
> Cc: Sam McNally <sammc at google.com>
> Signed-off-by: Lee Shawn C <shawn.c.lee at intel.com>
> ---
>  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


More information about the Intel-gfx mailing list