[PATCH] drm/plane-helper: Don't fake-implement primary plane disabling

Ville Syrjälä ville.syrjala at linux.intel.com
Tue Apr 15 03:22:24 PDT 2014


On Tue, Apr 15, 2014 at 10:02:43AM +0200, Daniel Vetter wrote:
> After thinking about this topic a bit more I've reached the conclusion
> that implementing this doesn't make sense:
> 
> - The locking is all wrong: set_config(NULL) will also unlink encoders
>   and connectors, but those links are protected with the mode_config
>   mutex. In the ->disable_plane callback we only hold all modeset
>   locks, but eventually we want to switch to just grabbing the
>   per-crtc (and maybe per-plane) locks as needed, maybe based on
>   ww_mutexes. Having a callback which absolutely needs all modeset
>   locks is bad for this conversion.
> 
>   Note that the same isn't true for the provided ->update_plane since
>   we've audited the crtc helpers to make sure that not encoder or
>   connector links are changed.
> 
> - There's no way to re-enable the plane with an ->update_plane: The
>   connectors/encoder links are lost and so we can't re-enable the
>   CRTC. Even without that issue the driver might have reassigned some
>   shared resources (as opposed to e.g. DPMS off, where drivers are not
>   allowed to do that to make sure the CRTC can be enabled again).
> 
> - The semantics don't make much sense: Userspace asked to scan out
>   black (or some other color if the driver supports a background
>   color), not that the screen be disabled.
> 
> - Implementing proper primary plane support (i.e. actually disabling
>   the primary plane without disabling the CRTC) is really simple, at
>   least if all the hw needs is flipping a bit. The big task is
>   auditing all the interactions with other ioctls when the CRTC is on
>   but there's no primary plane (e.g. pageflips). And some of that work
>   still needs to be done.
> 
> Cc: Matt Roper <matthew.d.roper at intel.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Although I'm not sure EINVAL is the best choice here. Maybe ENOSYS?

> ---
>  drivers/gpu/drm/drm_plane_helper.c | 33 +++++----------------------------
>  1 file changed, 5 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
> index 9263fd5efa58..9540ff9f97fe 100644
> --- a/drivers/gpu/drm/drm_plane_helper.c
> +++ b/drivers/gpu/drm/drm_plane_helper.c
> @@ -205,9 +205,9 @@ EXPORT_SYMBOL(drm_primary_helper_update);
>   *
>   * Provides a default plane disable handler for primary planes.  This is handler
>   * is called in response to a userspace SetPlane operation on the plane with a
> - * NULL framebuffer parameter.  We call the driver's modeset handler with a NULL
> - * framebuffer to disable the CRTC if no other planes are currently enabled.
> - * If other planes are still enabled on the same CRTC, we return -EBUSY.
> + * NULL framebuffer parameter.  It unconditionally fails the disable call with
> + * -EINVAL the only way to disable the primary plane without driver support is
> + * to disable the entier CRTC. Which does not match the plane ->disable hook.
>   *
>   * Note that some hardware may be able to disable the primary plane without
>   * disabling the whole CRTC.  Drivers for such hardware should provide their
> @@ -216,34 +216,11 @@ EXPORT_SYMBOL(drm_primary_helper_update);
>   * disabled primary plane).
>   *
>   * RETURNS:
> - * Zero on success, error code on failure
> + * Unconditionally returns -EINVAL.
>   */
>  int drm_primary_helper_disable(struct drm_plane *plane)
>  {
> -	struct drm_plane *p;
> -	struct drm_mode_set set = {
> -		.crtc = plane->crtc,
> -		.fb = NULL,
> -	};
> -
> -	if (plane->crtc == NULL || plane->fb == NULL)
> -		/* Already disabled */
> -		return 0;
> -
> -	list_for_each_entry(p, &plane->dev->mode_config.plane_list, head)
> -		if (p != plane && p->fb) {
> -			DRM_DEBUG_KMS("Cannot disable primary plane while other planes are still active on CRTC.\n");
> -			return -EBUSY;
> -		}
> -
> -	/*
> -	 * N.B.  We call set_config() directly here rather than
> -	 * drm_mode_set_config_internal() since drm_mode_setplane() already
> -	 * handles the basic refcounting and we don't need the special
> -	 * cross-CRTC refcounting (no chance of stealing connectors from
> -	 * other CRTC's with this update).
> -	 */
> -	return plane->crtc->funcs->set_config(&set);
> +	return -EINVAL;
>  }
>  EXPORT_SYMBOL(drm_primary_helper_disable);
>  
> -- 
> 1.9.2
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel OTC


More information about the dri-devel mailing list