[PATCH v4 06/25] drm/i915/dp: Validate modes using max Output BPP and slice count when DSC supported

Singh, Gaurav K gaurav.k.singh at intel.com
Fri Sep 14 06:45:59 UTC 2018



On 9/12/2018 6:25 AM, Manasi Navare wrote:
> When DSC is supported we need to validate the modes based on the
> maximum supported compressed BPP and maximum supported slice count.
> This allows us to allow the modes with pixel clock greater than the
> available link BW as long as it meets the compressed BPP
> and slice count requirements.
>
> v3:
> * Use the macro for dsc sink support (Jani N)
> v2:
> * Properly comment why we are right shifting the bpp value (Anusha)
>
> Cc: Gaurav K Singh <gaurav.k.singh at intel.com>
> Cc: Jani Nikula <jani.nikula at linux.intel.com>
> Cc: Ville Syrjala <ville.syrjala at linux.intel.com>
> Cc: Anusha Srivatsa <anusha.srivatsa at intel.com>
> Signed-off-by: Manasi Navare <manasi.d.navare at intel.com>
> Reviewed-by: Anusha Srivatsa <anusha.srivatsa at intel.com>
> ---
>   drivers/gpu/drm/i915/intel_dp.c | 31 ++++++++++++++++++++++++++++++-
>   1 file changed, 30 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 719c2e426c28..63b7efa10a0f 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -605,9 +605,12 @@ intel_dp_mode_valid(struct drm_connector *connector,
>   	struct intel_dp *intel_dp = intel_attached_dp(connector);
>   	struct intel_connector *intel_connector = to_intel_connector(connector);
>   	struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
> +	struct drm_i915_private *dev_priv = to_i915(connector->dev);
>   	int target_clock = mode->clock;
>   	int max_rate, mode_rate, max_lanes, max_link_clock;
>   	int max_dotclk;
> +	u16 dsc_max_output_bpp = 0;
> +	u8 dsc_slice_count = 0;
>   
>   	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
>   		return MODE_NO_DBLESCAN;
> @@ -630,7 +633,33 @@ intel_dp_mode_valid(struct drm_connector *connector,
>   	max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
>   	mode_rate = intel_dp_link_required(target_clock, 18);
>   
> -	if (mode_rate > max_rate || target_clock > max_dotclk)
> +	/*
> +	 * Output bpp is stored in 6.4 format so right shift by 4 to get the
> +	 * integer value since we support only integer values of bpp.
> +	 */
> +	if ((INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) &&
> +	    drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
> +		if (intel_dp_is_edp(intel_dp)) {
> +			dsc_max_output_bpp =
> +				drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd) >> 4;
> +			dsc_slice_count =
> +				drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
> +								true);
> +		} else {
> +			dsc_max_output_bpp =
> +				intel_dp_dsc_get_output_bpp(max_link_clock,
> +							    max_lanes,
> +							    target_clock,
> +							    mode->hdisplay) >> 4;
> +			dsc_slice_count =
> +				intel_dp_dsc_get_slice_count(intel_dp,
> +							     target_clock,
> +							     mode->hdisplay);
> +		}
> +	}
> +
> +	if ((mode_rate > max_rate && !(dsc_max_output_bpp && dsc_slice_count)) ||
> +	    target_clock > max_dotclk)
>   		return MODE_CLOCK_HIGH;
>   
>   	if (mode->clock < 10000)

This patch looks good to me.

Reviewed-by: Gaurav K Singh <gaurav.k.singh at intel.com>

With regards,
Gaurav


More information about the dri-devel mailing list