[Intel-gfx] [PATCH v2 02/23] drm/i915/dp: Cache the DP/eDP DSC DPCD register set on Hotplug/eDP Init

Singh, Gaurav K gaurav.k.singh at intel.com
Tue Sep 11 11:22:30 UTC 2018



On 8/1/2018 2:36 AM, Manasi Navare wrote:
> DSC is supported on eDP starting GEN 10 display and on DP starting
> GEN 11.
> This patch implements the discovery phase of DSC. On hotplug,
> source reads the DSC DPCD register set (0x00060 - 0x006F) to

Please correct it to 0x0006F in order to match the spec

> read the decompression capabilities of the sink device.
> This entire block of registers is cached in intel_dp so that
> capability information can be used during DSC configuration
> phase during compute_config phase of the modeset.
> For eDP, this caching happens during the eDP initialization.
> This caching is done only for eDP and DP rev >= 1.4
>
> v5:
> * Fix the block comment (Gaurav)
> * Use DRM_ERROR for dpcd_read fail (Gaurav,Anusha)
> v4:
> * Cache these only for Gen >= 11
> v3:
> * Remove the dsc_sink_support field in intel_dp (Jani N)
> v2:
> * Clear the cached registers on hotplug always (Jani N)
> * Combine the eDP and DP caching in same function (Jani N)
>
> Cc: Jani Nikula <jani.nikula at linux.intel.com>
> Cc: Ville Syrjala <ville.syrjala at linux.intel.com>
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
> Cc: Anusha Srivatsa <anusha.srivatsa at intel.com>
> Cc: Gaurav K Singh <gaurav.k.singh at intel.com>
> Signed-off-by: Manasi Navare <manasi.d.navare at intel.com>

Except the above comment, this patch looks good to me..

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

> ---
>   drivers/gpu/drm/i915/intel_dp.c  | 32 ++++++++++++++++++++++++++++++++
>   drivers/gpu/drm/i915/intel_drv.h |  1 +
>   2 files changed, 33 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 8e0e14b..afa4e2d 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -3877,6 +3877,29 @@ intel_dp_read_dpcd(struct intel_dp *intel_dp)
>   	return intel_dp->dpcd[DP_DPCD_REV] != 0;
>   }
>   
> +static void intel_dp_get_dsc_sink_cap(struct intel_dp *intel_dp)
> +{
> +	/*
> +	 *Clear the cached register set to avoid using stale values
> +	 * for the sinks that do not support DSC.
> +	 */
> +	memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd));
> +
> +	/* Cache the DSC DPCD if eDP or DP rev >= 1.4 */
> +	if (intel_dp->dpcd[DP_DPCD_REV] >= 0x14 ||
> +	    intel_dp->edp_dpcd[0] >= DP_EDP_14) {
> +		if (drm_dp_dpcd_read(&intel_dp->aux, DP_DSC_SUPPORT,
> +				     intel_dp->dsc_dpcd,
> +				     sizeof(intel_dp->dsc_dpcd)) < 0)
> +			DRM_ERROR("Failed to read DPCD register 0x%x\n",
> +				  DP_DSC_SUPPORT);
> +
> +		DRM_DEBUG_KMS("DSC DPCD: %*ph\n",
> +			      (int)sizeof(intel_dp->dsc_dpcd),
> +			      intel_dp->dsc_dpcd);
> +	}
> +}
> +
>   static bool
>   intel_edp_init_dpcd(struct intel_dp *intel_dp)
>   {
> @@ -3953,6 +3976,10 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
>   
>   	intel_dp_set_common_rates(intel_dp);
>   
> +	/* Read the eDP DSC DPCD registers */
> +	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
> +		intel_dp_get_dsc_sink_cap(intel_dp);
> +
>   	return true;
>   }
>   
> @@ -4944,6 +4971,7 @@ intel_dp_long_pulse(struct intel_connector *connector)
>   
>   	if (status == connector_status_disconnected) {
>   		memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
> +		memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd));
>   
>   		if (intel_dp->is_mst) {
>   			DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
> @@ -4969,6 +4997,10 @@ intel_dp_long_pulse(struct intel_connector *connector)
>   
>   	intel_dp_print_rates(intel_dp);
>   
> +	/* Read DP Sink DSC Cap DPCD regs for DP v1.4 */
> +	if (INTEL_GEN(dev_priv) >= 11)
> +		intel_dp_get_dsc_sink_cap(intel_dp);
> +
>   	drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
>   			 drm_dp_is_branch(intel_dp->dpcd));
>   
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 99a5f5b..29abe7a 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1070,6 +1070,7 @@ struct intel_dp {
>   	uint8_t psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE];
>   	uint8_t downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
>   	uint8_t edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE];
> +	u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE];
>   	/* source rates */
>   	int num_source_rates;
>   	const int *source_rates;



More information about the Intel-gfx mailing list