[PATCH] drm: don't override possible_crtcs for primary/cursor planes
Sean Paul
seanpaul at chromium.org
Thu Oct 20 19:22:04 UTC 2016
On Thu, Oct 20, 2016 at 3:06 PM, Rob Clark <robdclark at gmail.com> wrote:
> It is kind of a pointless restriction. If userspace does silly things
> like using crtcA's cursor plane on crtcB, and then setcursor on crtcA,
> it will end up with the overlay disabled on crtcB. But userspace is
> allowed to shoot itself like this.
>
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
> Note that cursor and primary planes are slightly useless to non-atomic
> userspace, since userspace has no way to know *which* crtc a primary
> or cursor plane belongs to. So lighting up a 2nd display may or may
> not make your overlay planes go *poof*.
>
> So basically use of cursor/primary planes plus legacy ioctls is an
> undefined behavior if we go with this patch.
>
> *Maybe* we want to restrict this to atomic userspace. (Ie. advertise
> the more limited possible_crtcs for legacy userspace.) Depends on
> whether we can (slightly retroactively) declare that mixing atomic
> and legacy APIs is undefined behavior. Or if really needed, add
> DRM_CLIENT_CAP_REALLY_REALLY_ATOMIC_NO_LEGACY_PLS. (Or just pass in
> value 2 for existing DRM_CLIENT_CAP_ATOMIC)
Being biased and selfish, I'd like to avoid adding another behavior
bit. So I'm fine with this path.
Sean
>
> drivers/gpu/drm/drm_crtc.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index c215802..1e6d37f 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -707,9 +707,9 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
> crtc->primary = primary;
> crtc->cursor = cursor;
> if (primary)
> - primary->possible_crtcs = 1 << drm_crtc_index(crtc);
> + WARN_ON(!(primary->possible_crtcs & (1 << drm_crtc_index(crtc))));
> if (cursor)
> - cursor->possible_crtcs = 1 << drm_crtc_index(crtc);
> + WARN_ON(!(cursor->possible_crtcs & (1 << drm_crtc_index(crtc))));
>
> if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
> drm_object_attach_property(&crtc->base, config->prop_active, 0);
> --
> 2.7.4
>
More information about the dri-devel
mailing list