[PATCH v3 2/4] drm: Add drm_atomic_set_mode_for_crtc

Daniel Vetter daniel at ffwll.ch
Tue May 26 06:56:44 PDT 2015


On Tue, May 26, 2015 at 02:36:48PM +0100, Daniel Stone wrote:
> Add a new helper, to be used later for blob property management, that
> sets the mode for a CRTC state, as well as updating the CRTC enable/active
> state at the same time.
> 
> v2: Do not touch active/mode_changed in CRTC state. Document return
>     value. Remove stray drm_atomic_set_mode_prop_for_crtc declaration.
> 
> v3: Remove i915 changes, and leave it directly bashing crtc_state->mode
>     for the meantime.
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> Tested-by: Sean Paul <seanpaul at chromium.org>

Pulled in all the patches from this series, thanks.
-Daniel

> ---
>  drivers/gpu/drm/drm_atomic.c        | 36 ++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/drm_atomic_helper.c | 11 ++++++++---
>  drivers/gpu/drm/drm_crtc_helper.c   |  5 +++--
>  include/drm/drm_atomic.h            |  3 +++
>  4 files changed, 50 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> index 3134f50..e749287 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -290,6 +290,42 @@ drm_atomic_get_crtc_state(struct drm_atomic_state *state,
>  EXPORT_SYMBOL(drm_atomic_get_crtc_state);
>  
>  /**
> + * drm_atomic_set_mode_for_crtc - set mode for CRTC
> + * @state: the CRTC whose incoming state to update
> + * @mode: kernel-internal mode to use for the CRTC, or NULL to disable
> + *
> + * Set a mode (originating from the kernel) on the desired CRTC state. Does
> + * not change any other state properties, including enable, active, or
> + * mode_changed.
> + *
> + * RETURNS:
> + * Zero on success, error code on failure. Cannot return -EDEADLK.
> + */
> +int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,
> +				 struct drm_display_mode *mode)
> +{
> +	/* Early return for no change. */
> +	if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0)
> +		return 0;
> +
> +	if (mode) {
> +		drm_mode_copy(&state->mode, mode);
> +		state->enable = true;
> +		DRM_DEBUG_ATOMIC("Set [MODE:%s] for CRTC state %p\n",
> +				 mode->name, state);
> +	} else {
> +		memset(&state->mode, 0, sizeof(state->mode));
> +		state->enable = false;
> +		DRM_DEBUG_ATOMIC("Set [NOMODE] for CRTC state %p\n",
> +				 state);
> +	}
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(drm_atomic_set_mode_for_crtc);
> +
> +
> +/**
>   * drm_atomic_crtc_set_property - set property on CRTC
>   * @crtc: the drm CRTC to set a property on
>   * @state: the state object to update with the new property value
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
> index a64bacd..e69d484 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
> @@ -1607,7 +1607,10 @@ retry:
>  		WARN_ON(set->fb);
>  		WARN_ON(set->num_connectors);
>  
> -		crtc_state->enable = false;
> +		ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
> +		if (ret != 0)
> +			goto fail;
> +
>  		crtc_state->active = false;
>  
>  		ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
> @@ -1622,9 +1625,11 @@ retry:
>  	WARN_ON(!set->fb);
>  	WARN_ON(!set->num_connectors);
>  
> -	crtc_state->enable = true;
> +	ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
> +	if (ret != 0)
> +		goto fail;
> +
>  	crtc_state->active = true;
> -	drm_mode_copy(&crtc_state->mode, set->mode);
>  
>  	ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
>  	if (ret != 0)
> diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
> index 9297a61..393114d 100644
> --- a/drivers/gpu/drm/drm_crtc_helper.c
> +++ b/drivers/gpu/drm/drm_crtc_helper.c
> @@ -937,10 +937,11 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod
>  			crtc_state->crtc = crtc;
>  	}
>  
> -	crtc_state->enable = true;
>  	crtc_state->planes_changed = true;
>  	crtc_state->mode_changed = true;
> -	drm_mode_copy(&crtc_state->mode, mode);
> +	ret = drm_atomic_set_mode_for_crtc(crtc_state, mode);
> +	if (ret)
> +		goto out;
>  	drm_mode_copy(&crtc_state->adjusted_mode, adjusted_mode);
>  
>  	if (crtc_funcs->atomic_check) {
> diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
> index e89db0c..1e8c61f 100644
> --- a/include/drm/drm_atomic.h
> +++ b/include/drm/drm_atomic.h
> @@ -110,6 +110,9 @@ drm_atomic_get_existing_connector_state(struct drm_atomic_state *state,
>  }
>  
>  int __must_check
> +drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,
> +			     struct drm_display_mode *mode);
> +int __must_check
>  drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,
>  			      struct drm_crtc *crtc);
>  void drm_atomic_set_fb_for_plane(struct drm_plane_state *plane_state,
> -- 
> 2.4.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list