On Wed, Nov 22, 2023 at 7:25 AM Thomas Zimmermann <tzimmermann@xxxxxxx> wrote: > > DRM drivers with user-space mode setting have been removed in Linux > v6.3. [1] Now remove the ioctl entry points for these drivers. Invoking > any of the ioctl ops will unconditionally return -EINVAL to user space. > > Invoking DRM_IOCTL_MODESET_CTL is different from the other legacy > ioctl ops as it returns 0 even without CONFIG_DRM_LEGACY set. From the > original commit 29935554b384 ("drm: Disallow DRM_IOCTL_MODESET_CTL for > KMS drivers") it is not apparent how or why the operation differs from > the others. It is likely just an oversight in commit 61ae227032e7 > ("drm: allow removal of legacy codepaths (v4.1)"), which allowed > disabling leagacy ioctls in the first place. Still keep this removal > separate from the other ioctls to allow an easy revert, if necessary. > > Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx> > Link: https://patchwork.freedesktop.org/series/111602/ # [1] Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > drivers/gpu/drm/drm_internal.h | 2 - > drivers/gpu/drm/drm_ioctl.c | 2 - > drivers/gpu/drm/drm_vblank.c | 82 ---------------------------------- > 3 files changed, 86 deletions(-) > > diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h > index b12c463bc4605..a538a48c7d952 100644 > --- a/drivers/gpu/drm/drm_internal.h > +++ b/drivers/gpu/drm/drm_internal.h > @@ -117,8 +117,6 @@ void drm_handle_vblank_works(struct drm_vblank_crtc *vblank); > /* IOCTLS */ > int drm_wait_vblank_ioctl(struct drm_device *dev, void *data, > struct drm_file *filp); > -int drm_legacy_modeset_ctl_ioctl(struct drm_device *dev, void *data, > - struct drm_file *file_priv); > > /* drm_irq.c */ > > diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c > index e6c32f76c7452..9c6326b908e74 100644 > --- a/drivers/gpu/drm/drm_ioctl.c > +++ b/drivers/gpu/drm/drm_ioctl.c > @@ -585,8 +585,6 @@ static const struct drm_ioctl_desc drm_ioctls[] = { > > DRM_IOCTL_DEF(DRM_IOCTL_WAIT_VBLANK, drm_wait_vblank_ioctl, DRM_UNLOCKED), > > - DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_legacy_modeset_ctl_ioctl, 0), > - > DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), > > DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_RENDER_ALLOW), > diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c > index 877e2067534fa..a11f164b2384f 100644 > --- a/drivers/gpu/drm/drm_vblank.c > +++ b/drivers/gpu/drm/drm_vblank.c > @@ -1574,88 +1574,6 @@ void drm_crtc_vblank_restore(struct drm_crtc *crtc) > } > EXPORT_SYMBOL(drm_crtc_vblank_restore); > > -static void drm_legacy_vblank_pre_modeset(struct drm_device *dev, > - unsigned int pipe) > -{ > - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > - > - /* vblank is not initialized (IRQ not installed ?), or has been freed */ > - if (!drm_dev_has_vblank(dev)) > - return; > - > - if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) > - return; > - > - /* > - * To avoid all the problems that might happen if interrupts > - * were enabled/disabled around or between these calls, we just > - * have the kernel take a reference on the CRTC (just once though > - * to avoid corrupting the count if multiple, mismatch calls occur), > - * so that interrupts remain enabled in the interim. > - */ > - if (!vblank->inmodeset) { > - vblank->inmodeset = 0x1; > - if (drm_vblank_get(dev, pipe) == 0) > - vblank->inmodeset |= 0x2; > - } > -} > - > -static void drm_legacy_vblank_post_modeset(struct drm_device *dev, > - unsigned int pipe) > -{ > - struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > - > - /* vblank is not initialized (IRQ not installed ?), or has been freed */ > - if (!drm_dev_has_vblank(dev)) > - return; > - > - if (drm_WARN_ON(dev, pipe >= dev->num_crtcs)) > - return; > - > - if (vblank->inmodeset) { > - spin_lock_irq(&dev->vbl_lock); > - drm_reset_vblank_timestamp(dev, pipe); > - spin_unlock_irq(&dev->vbl_lock); > - > - if (vblank->inmodeset & 0x2) > - drm_vblank_put(dev, pipe); > - > - vblank->inmodeset = 0; > - } > -} > - > -int drm_legacy_modeset_ctl_ioctl(struct drm_device *dev, void *data, > - struct drm_file *file_priv) > -{ > - struct drm_modeset_ctl *modeset = data; > - unsigned int pipe; > - > - /* If drm_vblank_init() hasn't been called yet, just no-op */ > - if (!drm_dev_has_vblank(dev)) > - return 0; > - > - /* KMS drivers handle this internally */ > - if (!drm_core_check_feature(dev, DRIVER_LEGACY)) > - return 0; > - > - pipe = modeset->crtc; > - if (pipe >= dev->num_crtcs) > - return -EINVAL; > - > - switch (modeset->cmd) { > - case _DRM_PRE_MODESET: > - drm_legacy_vblank_pre_modeset(dev, pipe); > - break; > - case _DRM_POST_MODESET: > - drm_legacy_vblank_post_modeset(dev, pipe); > - break; > - default: > - return -EINVAL; > - } > - > - return 0; > -} > - > static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe, > u64 req_seq, > union drm_wait_vblank *vblwait, > -- > 2.42.1 >