diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c index e40c12fabbde..d3b92eaa481c 100644 --- a/drivers/gpu/drm/drm_plane.c +++ b/drivers/gpu/drm/drm_plane.c @@ -806,23 +806,34 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, struct drm_modeset_acquire_ctx ctx; int ret = -EINVAL; - if (!drm_core_check_feature(dev, DRIVER_MODESET)) + if (!drm_core_check_feature(dev, DRIVER_MODESET)) { + DRM_WARN_ONCE("DRIVER_MODESET feature not enabled\n"); return -EINVAL; + } - if (page_flip->flags & ~DRM_MODE_PAGE_FLIP_FLAGS) + if (page_flip->flags & ~DRM_MODE_PAGE_FLIP_FLAGS) { + DRM_WARN_ONCE("Invalid page flip flags 0x%x\n", + page_flip->flags & ~DRM_MODE_PAGE_FLIP_FLAGS); return -EINVAL; + } - if (page_flip->sequence != 0 && !(page_flip->flags & DRM_MODE_PAGE_FLIP_TARGET)) + if (page_flip->sequence != 0 && !(page_flip->flags & DRM_MODE_PAGE_FLIP_TARGET)) { + DRM_WARN_ONCE("page_flip->sequence=%u != 0, but DRM_MODE_PAGE_FLIP_TARGET flag set\n"); return -EINVAL; + } /* Only one of the DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE/RELATIVE flags * can be specified */ - if ((page_flip->flags & DRM_MODE_PAGE_FLIP_TARGET) == DRM_MODE_PAGE_FLIP_TARGET) + if ((page_flip->flags & DRM_MODE_PAGE_FLIP_TARGET) == DRM_MODE_PAGE_FLIP_TARGET) { + DRM_WARN_ONCE("Both DRM_MODE_PAGE_FLIP_TARGET flags set\n"); return -EINVAL; + } - if ((page_flip->flags & DRM_MODE_PAGE_FLIP_ASYNC) && !dev->mode_config.async_page_flip) + if ((page_flip->flags & DRM_MODE_PAGE_FLIP_ASYNC) && !dev->mode_config.async_page_flip) { + DRM_WARN_ONCE("DRM_MODE_PAGE_FLIP_ASYNC set, but not supported\n"); return -EINVAL; + } crtc = drm_crtc_find(dev, page_flip->crtc_id); if (!crtc) @@ -833,15 +844,18 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, int r; r = drm_crtc_vblank_get(crtc); - if (r) + if (r) { + if (r == -EINVAL) + DRM_WARN_ONCE("drm_crtc_vblank_get returned -EINVAL\n"); return r; + } current_vblank = drm_crtc_vblank_count(crtc); switch (page_flip->flags & DRM_MODE_PAGE_FLIP_TARGET) { case DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE: if ((int)(target_vblank - current_vblank) > 1) { - DRM_DEBUG("Invalid absolute flip target %u, " + DRM_WARN_ONCE("Invalid absolute flip target %u, " "must be <= %u\n", target_vblank, current_vblank + 1); drm_crtc_vblank_put(crtc); @@ -850,7 +864,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, break; case DRM_MODE_PAGE_FLIP_TARGET_RELATIVE: if (target_vblank != 0 && target_vblank != 1) { - DRM_DEBUG("Invalid relative flip target %u, " + DRM_WARN_ONCE("Invalid relative flip target %u, " "must be 0 or 1\n", target_vblank); drm_crtc_vblank_put(crtc); return -EINVAL; @@ -864,18 +878,27 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, } } else if (crtc->funcs->page_flip == NULL || (page_flip->flags & DRM_MODE_PAGE_FLIP_TARGET)) { + if (!crtc->funcs->page_flip) + DRM_WARN_ONCE("Neither page_flip_target nor page_flip hook set\n"); + else + DRM_WARN_ONCE("DRM_MODE_PAGE_FLIP_TARGET set, but page_flip_target hook not\n"); return -EINVAL; } drm_modeset_acquire_init(&ctx, 0); retry: ret = drm_modeset_lock(&crtc->mutex, &ctx); - if (ret) + if (ret) { + if (ret == -EINVAL) + DRM_WARN_ONCE("drm_modeset_lock returned -EINVAL for crtc->mutex\n"); goto out; + } ret = drm_modeset_lock(&crtc->primary->mutex, &ctx); - if (ret) + if (ret) { + if (ret == -EINVAL) + DRM_WARN_ONCE("drm_modeset_lock returned -EINVAL for crtc->primary->mutex\n"); goto out; - + } if (crtc->primary->fb == NULL) { /* The framebuffer is currently unbound, presumably * due to a hotplug event, that userspace has not @@ -902,11 +925,15 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, } else { ret = drm_crtc_check_viewport(crtc, crtc->x, crtc->y, &crtc->mode, fb); } - if (ret) + if (ret) { + if (ret == -EINVAL) { + DRM_WARN_ONCE("%s returned -EINVAL\n", crtc->state ? + "drm_framebuffer_check_src_coords" : "drm_crtc_check_viewport"); goto out; + } if (crtc->primary->fb->format != fb->format) { - DRM_DEBUG_KMS("Page flip is not allowed to change frame buffer format.\n"); + DRM_WARN_ONCE("Page flip is not allowed to change frame buffer format.\n"); ret = -EINVAL; goto out; } @@ -924,6 +951,8 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, if (ret) { kfree(e); e = NULL; + if (ret == -EINVAL) + DRM_WARN_ONCE("drm_event_reserve_init returned -EINVAL\n"); goto out; } } @@ -942,6 +971,8 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev, drm_event_cancel_free(dev, &e->base); /* Keep the old fb, don't unref it. */ crtc->primary->old_fb = NULL; + if (ret == -EINVAL) + DRM_WARN_ONCE("page_flip(_target) hook returned -EINVAL\n"); } else { crtc->primary->fb = fb; /* Unref only the old framebuffer. */ diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c index e9f33cd805dd..34a68f757bcf 100644 --- a/drivers/gpu/drm/drm_vblank.c +++ b/drivers/gpu/drm/drm_vblank.c @@ -1441,11 +1441,15 @@ int drm_wait_vblank(struct drm_device *dev, void *data, int ret; unsigned int flags, seq, pipe, high_pipe; - if (!dev->irq_enabled) + if (!dev->irq_enabled) { + DRM_WARN_ONCE("IRQs not enabled\n"); return -EINVAL; + } - if (vblwait->request.type & _DRM_VBLANK_SIGNAL) + if (vblwait->request.type & _DRM_VBLANK_SIGNAL) { + DRM_WARN_ONCE("DRM_VBLANK_SIGNAL set\n"); return -EINVAL; + } if (vblwait->request.type & ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK | @@ -1463,8 +1467,11 @@ int drm_wait_vblank(struct drm_device *dev, void *data, pipe = high_pipe >> _DRM_VBLANK_HIGH_CRTC_SHIFT; else pipe = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; - if (pipe >= dev->num_crtcs) + if (pipe >= dev->num_crtcs) { + DRM_WARN_ONCE("pipe == %u >= dev->num_crtcs == %u\n", + pipe, dev->num_crtcs); return -EINVAL; + } vblank = &dev->vblank[pipe]; @@ -1485,7 +1492,8 @@ int drm_wait_vblank(struct drm_device *dev, void *data, ret = drm_vblank_get(dev, pipe); if (ret) { - DRM_DEBUG("crtc %d failed to acquire vblank counter, %d\n", pipe, ret); + if (ret == -EINVAL) + DRM_WARN_ONCE("crtc %d failed to acquire vblank counter, %d\n", pipe, ret); return ret; } seq = drm_vblank_count(dev, pipe); @@ -1497,6 +1505,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, case _DRM_VBLANK_ABSOLUTE: break; default: + DRM_WARN_ONCE("Neither DRM_VBLANK_RELATIVE nor _ABSOLUTE set\n"); ret = -EINVAL; goto done; } @@ -1509,7 +1518,10 @@ int drm_wait_vblank(struct drm_device *dev, void *data, /* must hold on to the vblank ref until the event fires * drm_vblank_put will be called asynchronously */ - return drm_queue_vblank_event(dev, pipe, vblwait, file_priv); + ret = drm_queue_vblank_event(dev, pipe, vblwait, file_priv); + if (ret == -EINVAL) + DRM_WARN_ONCE("drm_queue_vblank_event returned -EINVAL\n"); + return ret; } if (vblwait->request.sequence != seq) {