Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions drivers/dma-buf/dma-fence.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);

Expand Down
42 changes: 27 additions & 15 deletions drivers/gpu/drm/drm_atomic_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);

Expand All @@ -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;
Expand Down Expand Up @@ -1884,29 +1896,29 @@ 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;
}

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;
Expand All @@ -1919,15 +1931,15 @@ 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;
}

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;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand All @@ -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);

Expand Down
7 changes: 4 additions & 3 deletions drivers/gpu/drm/drm_atomic_uapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand All @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/drm_crtc_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down
6 changes: 3 additions & 3 deletions drivers/gpu/drm/drm_framebuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);

Expand All @@ -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);
Expand Down
43 changes: 42 additions & 1 deletion drivers/gpu/drm/virtio/virtgpu_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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)
{
Expand All @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
}

Expand Down