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@xxxxxxxxx> > Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxx> Yeah, I agree this is probably a better way to go. Reviewed-by: Matt Roper <matthew.d.roper@xxxxxxxxx> Matt > --- > 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 > -- Matt Roper Graphics Software Engineer IoTG Platform Enabling & Development Intel Corporation (916) 356-2795 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel