diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c index 8aa8f8cb7071..6b9e45bacccc 100644 --- a/drivers/dma-buf/dma-fence.c +++ b/drivers/dma-buf/dma-fence.c @@ -27,6 +27,8 @@ EXPORT_TRACEPOINT_SYMBOL(dma_fence_signaled); static DEFINE_SPINLOCK(dma_fence_stub_lock); static struct dma_fence dma_fence_stub; +static u64 seqno_crtc_0 = 0; +static u64 seqno_crtc_1 = 0; /* * fence context counter: each execution context should have its own * fence context, this allows checking if fences belong to the same @@ -369,6 +371,27 @@ int dma_fence_signal_timestamp_locked(struct dma_fence *fence, { struct dma_fence_cb *cur, *tmp; struct list_head cb_list; + const char *timeline = NULL; + + timeline = fence->ops->get_timeline_name(fence); + if (timeline) { + if (strstr(timeline, "crtc-0")) { + if (seqno_crtc_0 == 0) + seqno_crtc_0 = fence->seqno; + if (fence->seqno != (seqno_crtc_0 +1)) { + printk("signal crtc-0 miss seq from %llx to %llx\n", seqno_crtc_0, fence->seqno); + } + seqno_crtc_0 = fence->seqno; + } + if (strstr(timeline, "crtc-1")) { + if (seqno_crtc_1 == 0) + seqno_crtc_1 = fence->seqno; + if (fence->seqno != (seqno_crtc_1 +1)) { + printk("signal crtc-1 miss seq from %llx to %llx\n", seqno_crtc_1, fence->seqno); + } + seqno_crtc_1 = fence->seqno; + } + } lockdep_assert_held(fence->lock); diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 554d4468aa7c..84cbbb92c0c6 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -827,7 +827,7 @@ drm_atomic_helper_check_wb_encoder_state(struct drm_encoder *encoder, if (fb->format->format == formats[i]) return 0; - drm_dbg_kms(encoder->dev, "Invalid pixel format %p4cc\n", &fb->format->format); + drm_warn(encoder->dev, "Invalid pixel format %p4cc\n", &fb->format->format); return -EINVAL; } @@ -885,7 +885,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, } if (!crtc_state->enable && !can_update_disabled) { - drm_dbg_kms(plane_state->plane->dev, + drm_warn(plane_state->plane->dev, "Cannot update plane of a disabled CRTC.\n"); return -EINVAL; } @@ -896,7 +896,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale); vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale); if (hscale < 0 || vscale < 0) { - drm_dbg_kms(plane_state->plane->dev, + drm_warn(plane_state->plane->dev, "Invalid scaling of plane\n"); drm_rect_debug_print("src: ", &plane_state->src, true); drm_rect_debug_print("dst: ", &plane_state->dst, false); @@ -921,7 +921,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, return 0; if (!can_position && !drm_rect_equals(dst, &clip)) { - drm_dbg_kms(plane_state->plane->dev, + drm_warn(plane_state->plane->dev, "Plane must cover entire CRTC\n"); drm_rect_debug_print("dst: ", dst, false); drm_rect_debug_print("clip: ", &clip, false); @@ -1598,6 +1598,7 @@ int drm_atomic_helper_wait_for_fences(struct drm_device *dev, struct drm_plane *plane; struct drm_plane_state *new_plane_state; int i, ret; + struct dma_fence *fence ; set_fence_deadline(dev, state); @@ -1612,9 +1613,20 @@ int drm_atomic_helper_wait_for_fences(struct drm_device *dev, * still interrupt the operation. Instead of blocking until the * timer expires, make the wait interruptible. */ - ret = dma_fence_wait(new_plane_state->fence, pre_swap); - if (ret) +// ret = dma_fence_wait(new_plane_state->fence, pre_swap); +// if (ret) +// return ret; + fence = new_plane_state->fence; + ret = dma_fence_wait_timeout(fence, pre_swap, msecs_to_jiffies(5000)); + if (ret = 0) { + DRM_ERROR("drm_atomic_helper_wait_for_fences timeout, fence:%s:%s\n",fence->ops->get_driver_name(fence), + fence->ops->get_timeline_name(fence)); + } + if (ret < 0) { + DRM_ERROR("drm_atomic_helper_wait_for_fences error:%d\n, fence:%s:%s", ret,fence->ops->get_driver_name(fence), + fence->ops->get_timeline_name(fence)); return ret; + } dma_fence_put(new_plane_state->fence); new_plane_state->fence = NULL; @@ -1884,14 +1896,14 @@ int drm_atomic_helper_async_check(struct drm_device *dev, /* FIXME: we support only single plane updates for now */ if (n_planes != 1) { - drm_dbg_atomic(dev, + drm_warn(dev, "only single plane async updates are supported\n"); return -EINVAL; } if (!new_plane_state->crtc || old_plane_state->crtc != new_plane_state->crtc) { - drm_dbg_atomic(dev, + drm_warn(dev, "[PLANE:%d:%s] async update cannot change CRTC\n", plane->base.id, plane->name); return -EINVAL; @@ -1899,14 +1911,14 @@ int drm_atomic_helper_async_check(struct drm_device *dev, funcs = plane->helper_private; if (!funcs->atomic_async_update) { - drm_dbg_atomic(dev, + drm_warn(dev, "[PLANE:%d:%s] driver does not support async updates\n", plane->base.id, plane->name); return -EINVAL; } if (new_plane_state->fence) { - drm_dbg_atomic(dev, + drm_warn(dev, "[PLANE:%d:%s] missing fence for async update\n", plane->base.id, plane->name); return -EINVAL; @@ -1919,7 +1931,7 @@ int drm_atomic_helper_async_check(struct drm_device *dev, */ if (old_plane_state->commit && !try_wait_for_completion(&old_plane_state->commit->hw_done)) { - drm_dbg_atomic(dev, + drm_warn(dev, "[PLANE:%d:%s] inflight previous commit preventing async commit\n", plane->base.id, plane->name); return -EBUSY; @@ -1927,7 +1939,7 @@ int drm_atomic_helper_async_check(struct drm_device *dev, ret = funcs->atomic_async_check(plane, state); if (ret != 0) - drm_dbg_atomic(dev, + drm_warn(dev, "[PLANE:%d:%s] driver async check failed\n", plane->base.id, plane->name); return ret; @@ -2148,7 +2160,7 @@ static int stall_checks(struct drm_crtc *crtc, bool nonblock) */ if (!completed && nonblock) { spin_unlock(&crtc->commit_lock); - drm_dbg_atomic(crtc->dev, + drm_warn(crtc->dev, "[CRTC:%d:%s] busy with a previous commit\n", crtc->base.id, crtc->name); @@ -2337,7 +2349,7 @@ int drm_atomic_helper_setup_commit(struct drm_atomic_state *state, */ if (nonblock && old_conn_state->commit && !try_wait_for_completion(&old_conn_state->commit->flip_done)) { - drm_dbg_atomic(conn->dev, + drm_warn(conn->dev, "[CONNECTOR:%d:%s] busy with a previous commit\n", conn->base.id, conn->name); @@ -2359,7 +2371,7 @@ int drm_atomic_helper_setup_commit(struct drm_atomic_state *state, */ if (nonblock && old_plane_state->commit && !try_wait_for_completion(&old_plane_state->commit->flip_done)) { - drm_dbg_atomic(plane->dev, + drm_warn(plane->dev, "[PLANE:%d:%s] busy with a previous commit\n", plane->base.id, plane->name); diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index 38d7dd27e2a4..1296db6f8c59 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -217,7 +217,7 @@ drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state, plane->base.id, plane->name, plane_state, crtc->base.id, crtc->name); else - drm_dbg_atomic(plane->dev, + drm_warn(plane->dev, "Link [PLANE:%d:%s] state %p to [NOCRTC]\n", plane->base.id, plane->name, plane_state); @@ -306,7 +306,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state, connector->base.id, connector->name, conn_state, crtc->base.id, crtc->name); } else { - drm_dbg_atomic(connector->dev, + drm_warn(connector->dev, "Link [CONNECTOR:%d:%s] state %p to [NOCRTC]\n", connector->base.id, connector->name, conn_state); @@ -1313,6 +1313,7 @@ static void complete_signaling(struct drm_device *dev, * to prevent a double free in drm_atomic_state_clear. */ if (event && (event->base.fence || event->base.file_priv)) { + DRM_ERROR("complete_signaling event cancel\n"); drm_event_cancel_free(dev, &event->base); crtc_state->event = NULL; } @@ -1330,7 +1331,7 @@ static void complete_signaling(struct drm_device *dev, /* If this fails log error to the user */ if (fence_state[i].out_fence_ptr && put_user(-1, fence_state[i].out_fence_ptr)) - drm_dbg_atomic(dev, "Couldn't clear out_fence_ptr\n"); + drm_warn(dev, "Couldn't clear out_fence_ptr\n"); } kfree(fence_state); diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index a209659a996c..6f94b04f6824 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c @@ -749,7 +749,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set, connector->base.id, connector->name, new_crtc->base.id, new_crtc->name); } else { - DRM_DEBUG_KMS("[CONNECTOR:%d:%s] to [NOCRTC]\n", + DRM_ERROR("[CONNECTOR:%d:%s] to [NOCRTC]\n", connector->base.id, connector->name); } } diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c index 1955eaeba0ab..293b90e1a229 100644 --- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c @@ -404,7 +404,7 @@ static void drm_mode_rmfb_work_fn(struct work_struct *w) struct drm_framebuffer *fb = list_first_entry(&arg->fbs, typeof(*fb), filp_head); - drm_dbg_kms(fb->dev, + drm_warn(fb->dev, "Removing [FB:%d] from all active usage due to RMFB ioctl\n", fb->base.id); list_del_init(&fb->filp_head); @@ -984,7 +984,7 @@ static int atomic_remove_fb(struct drm_framebuffer *fb) if (plane->state->fb != fb) continue; - drm_dbg_kms(dev, + drm_warn(dev, "Disabling [PLANE:%d:%s] because [FB:%d] is removed\n", plane->base.id, plane->name, fb->base.id); @@ -997,7 +997,7 @@ static int atomic_remove_fb(struct drm_framebuffer *fb) if (disable_crtcs && plane_state->crtc->primary == plane) { struct drm_crtc_state *crtc_state; - drm_dbg_kms(dev, + drm_warn(dev, "Disabling [CRTC:%d:%s] because [FB:%d] is removed\n", plane_state->crtc->base.id, plane_state->crtc->name, fb->base.id); diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c index 8fa5b37f90d4..d7b4ba11a746 100644 --- a/drivers/gpu/drm/virtio/virtgpu_display.c +++ b/drivers/gpu/drm/virtio/virtgpu_display.c @@ -131,6 +131,14 @@ static void virtio_gpu_crtc_atomic_disable(struct drm_crtc *crtc, drm_crtc_vblank_put(crtc); } + if (crtc->state->event) { + DRM_INFO("event clean in atomic disable\n"); + spin_lock_irq(&dev->event_lock); + drm_crtc_send_vblank_event(crtc, crtc->state->event); + crtc->state->event = NULL; + spin_unlock_irq(&dev->event_lock); + } + if (vgdev->has_vblank) { drm_crtc_vblank_off(crtc); } @@ -139,6 +147,9 @@ static void virtio_gpu_crtc_atomic_disable(struct drm_crtc *crtc, virtio_gpu_notify(vgdev); } +static u64 seqno_crtc_0 = 0; +static u64 seqno_crtc_1 = 0; + static void virtio_gpu_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_atomic_state *state) { @@ -150,6 +161,30 @@ static void virtio_gpu_crtc_atomic_begin(struct drm_crtc *crtc, if (!vgdev->has_vblank || !crtc->state->event) return; + const char *timeline = NULL; + struct dma_fence *fence = NULL; + fence = e->base.fence; + if (fence) + timeline = fence->ops->get_timeline_name(fence); + if (timeline) { + if (strstr(timeline, "crtc-0")) { + if (seqno_crtc_0 == 0) + seqno_crtc_0 = fence->seqno; + if (fence->seqno != (seqno_crtc_0 +1)) { + printk("atomic begin crtc-0 miss seq from %llx to %llx\n", seqno_crtc_0, fence->seqno); + } + seqno_crtc_0 = fence->seqno; + } + if (strstr(timeline, "crtc-1")) { + if (seqno_crtc_1 == 0) + seqno_crtc_1 = fence->seqno; + if (fence->seqno != (seqno_crtc_1 +1)) { + printk("atomic begin crtc-1 miss seq from %llx to %llx\n", seqno_crtc_1, fence->seqno); + } + seqno_crtc_1 = fence->seqno; + } + } + if (drm_crtc_vblank_get(crtc)) { /* Cannot enable vblank, send it right now. */ spin_lock_irq(&drm->event_lock); @@ -518,8 +553,10 @@ virtio_gpu_wait_for_vblanks(struct drm_device *dev, return; for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) { - if (!new_crtc_state->active) + if (!new_crtc_state->active) { + DRM_ERROR("crtc is not active in wait for vblank\n"); continue; + } ret = drm_crtc_vblank_get(crtc); if (ret != 0) @@ -605,6 +642,10 @@ static void virtio_gpu_commit_tail(struct drm_atomic_state *old_state) virtio_gpu_wait_for_vblanks(dev, old_state); + if (old_state->fake_commit){ + DRM_ERROR("signal fake commit flip done\n"); + complete_all(&old_state->fake_commit->flip_done); + } drm_atomic_helper_cleanup_planes(dev, old_state); }