[PATCH xf86-video-amdgpu 02/13] Push color properties to kernel DRM on CRTC init

Michel Dänzer michel at daenzer.net
Wed May 16 17:08:50 UTC 2018


On 2018-05-03 08:31 PM, sunpeng.li at amd.com wrote:
> From: "Leo (Sunpeng) Li" <sunpeng.li at amd.com>
> 
> Push staged values on the driver-private CRTC, to kernel DRM when it's
> initialized. This is to flush out any previous state that hardware was
> in, and set them to their default values.
> 
> Signed-off-by: Leo (Sunpeng) Li <sunpeng.li at amd.com>
> ---
>  src/drmmode_display.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 136 insertions(+)
> 
> diff --git a/src/drmmode_display.c b/src/drmmode_display.c
> index 0ffc6ad..85de01e 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -824,6 +824,133 @@ err_allocs:
>  	return 0;
>  }
>  
> +/**
> + * Query DRM for the property ID - as recognized by DRM - for the specified
> + * color management property, on the specified CRTC.
> + *
> + * @crtc: The CRTC to query DRM properties on.
> + * @prop_id: Color management property enum.
> + *
> + * Return the DRM property ID, if the property exists. 0 otherwise.
> + */
> +static uint32_t get_drm_cm_prop_id(xf86CrtcPtr crtc,
> +				   enum drmmode_cm_prop prop_id)
> +{
> +	AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(crtc->scrn);
> +	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> +	drmModeObjectPropertiesPtr drm_props;
> +	int i;
> +
> +	drm_props = drmModeObjectGetProperties(pAMDGPUEnt->fd,
> +					       drmmode_crtc->mode_crtc->crtc_id,
> +					       DRM_MODE_OBJECT_CRTC);
> +	if (!drm_props)
> +		goto err_allocs;
> +
> +	for (i = 0; i < drm_props->count_props; i++) {
> +		drmModePropertyPtr drm_prop;
> +
> +		drm_prop = drmModeGetProperty(pAMDGPUEnt->fd,
> +					      drm_props->props[i]);
> +		if (!drm_prop)
> +			goto err_allocs;
> +
> +		if (get_cm_enum_from_str(drm_prop->name) == prop_id){
> +			drmModeFreeProperty(drm_prop);
> +			return drm_props->props[i];
> +		}
> +
> +		drmModeFreeProperty(drm_prop);
> +	}
> +
> +err_allocs:
> +	drmModeFreeObjectProperties(drm_props);
> +	return 0;
> +}

It seems a bit heavy to call drmModeObjectGetProperties and
drmModeGetProperty (which both in turn call into the kernel) every time
here. Assuming the property IDs don't change at runtime, they could be
cached.


> +/**
> + * Push staged color management properties on the CRTC to DRM.
> + *
> + * @crtc: The CRTC containing staged properties
> + * @cm_prop_index: The color property to push
> + *
> + * Return 0 on success, X-defined error codes on failure.
> + */
> +static int drmmode_crtc_push_cm_prop(xf86CrtcPtr crtc,
> +				     enum drmmode_cm_prop cm_prop_index)
> +{
> +	AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(crtc->scrn);
> +	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> +	size_t expected_bytes = 0;
> +	uint32_t created_blob_id = 0;
> +	void *blob_data = NULL;
> +	uint32_t drm_prop_id;
> +	Bool free_blob_data = FALSE;

free_blob_data is always FALSE. If that's intended, it shouldn't be
added (in this patch yet).


> @@ -1458,6 +1586,14 @@ drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_res
>  	drmmode_crtc->ctm->matrix[0] = drmmode_crtc->ctm->matrix[4] =
>  		drmmode_crtc->ctm->matrix[8] = (uint64_t)1 << 32;
>  
> +	/* Push properties to initialize them */
> +	for (i = 0; i < CM_NUM_PROPS; i++) {
> +		if (i == CM_DEGAMMA_LUT_SIZE || i == CM_GAMMA_LUT_SIZE)
> +			continue;
> +		if (drmmode_crtc_push_cm_prop(crtc, i))
> +			return 0;

Per my follow-up to the cover letter, I don't think this should be
necessary here anyway, but FWIW:

Returning 0 early here breaks the pAMDGPUEnt->assigned_crtcs related
logic in this function and drmmode_pre_init.


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer


More information about the amd-gfx mailing list