diff options
Diffstat (limited to 'drivers/gpu/drm/vc4/vc4_crtc.c')
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_crtc.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c index 904d0754ad78..0f18b76c7906 100644 --- a/drivers/gpu/drm/vc4/vc4_crtc.c +++ b/drivers/gpu/drm/vc4/vc4_crtc.c | |||
@@ -456,14 +456,6 @@ static void vc4_crtc_atomic_flush(struct drm_crtc *crtc, | |||
456 | 456 | ||
457 | WARN_ON_ONCE(dlist_next - dlist_start != vc4_state->mm.size); | 457 | WARN_ON_ONCE(dlist_next - dlist_start != vc4_state->mm.size); |
458 | 458 | ||
459 | HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel), | ||
460 | vc4_state->mm.start); | ||
461 | |||
462 | if (debug_dump_regs) { | ||
463 | DRM_INFO("CRTC %d HVS after:\n", drm_crtc_index(crtc)); | ||
464 | vc4_hvs_dump_state(dev); | ||
465 | } | ||
466 | |||
467 | if (crtc->state->event) { | 459 | if (crtc->state->event) { |
468 | unsigned long flags; | 460 | unsigned long flags; |
469 | 461 | ||
@@ -473,8 +465,20 @@ static void vc4_crtc_atomic_flush(struct drm_crtc *crtc, | |||
473 | 465 | ||
474 | spin_lock_irqsave(&dev->event_lock, flags); | 466 | spin_lock_irqsave(&dev->event_lock, flags); |
475 | vc4_crtc->event = crtc->state->event; | 467 | vc4_crtc->event = crtc->state->event; |
476 | spin_unlock_irqrestore(&dev->event_lock, flags); | ||
477 | crtc->state->event = NULL; | 468 | crtc->state->event = NULL; |
469 | |||
470 | HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel), | ||
471 | vc4_state->mm.start); | ||
472 | |||
473 | spin_unlock_irqrestore(&dev->event_lock, flags); | ||
474 | } else { | ||
475 | HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel), | ||
476 | vc4_state->mm.start); | ||
477 | } | ||
478 | |||
479 | if (debug_dump_regs) { | ||
480 | DRM_INFO("CRTC %d HVS after:\n", drm_crtc_index(crtc)); | ||
481 | vc4_hvs_dump_state(dev); | ||
478 | } | 482 | } |
479 | } | 483 | } |
480 | 484 | ||
@@ -500,12 +504,17 @@ static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc) | |||
500 | { | 504 | { |
501 | struct drm_crtc *crtc = &vc4_crtc->base; | 505 | struct drm_crtc *crtc = &vc4_crtc->base; |
502 | struct drm_device *dev = crtc->dev; | 506 | struct drm_device *dev = crtc->dev; |
507 | struct vc4_dev *vc4 = to_vc4_dev(dev); | ||
508 | struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc->state); | ||
509 | u32 chan = vc4_crtc->channel; | ||
503 | unsigned long flags; | 510 | unsigned long flags; |
504 | 511 | ||
505 | spin_lock_irqsave(&dev->event_lock, flags); | 512 | spin_lock_irqsave(&dev->event_lock, flags); |
506 | if (vc4_crtc->event) { | 513 | if (vc4_crtc->event && |
514 | (vc4_state->mm.start == HVS_READ(SCALER_DISPLACTX(chan)))) { | ||
507 | drm_crtc_send_vblank_event(crtc, vc4_crtc->event); | 515 | drm_crtc_send_vblank_event(crtc, vc4_crtc->event); |
508 | vc4_crtc->event = NULL; | 516 | vc4_crtc->event = NULL; |
517 | drm_crtc_vblank_put(crtc); | ||
509 | } | 518 | } |
510 | spin_unlock_irqrestore(&dev->event_lock, flags); | 519 | spin_unlock_irqrestore(&dev->event_lock, flags); |
511 | } | 520 | } |
@@ -556,6 +565,7 @@ vc4_async_page_flip_complete(struct vc4_seqno_cb *cb) | |||
556 | spin_unlock_irqrestore(&dev->event_lock, flags); | 565 | spin_unlock_irqrestore(&dev->event_lock, flags); |
557 | } | 566 | } |
558 | 567 | ||
568 | drm_crtc_vblank_put(crtc); | ||
559 | drm_framebuffer_unreference(flip_state->fb); | 569 | drm_framebuffer_unreference(flip_state->fb); |
560 | kfree(flip_state); | 570 | kfree(flip_state); |
561 | 571 | ||
@@ -598,6 +608,8 @@ static int vc4_async_page_flip(struct drm_crtc *crtc, | |||
598 | return ret; | 608 | return ret; |
599 | } | 609 | } |
600 | 610 | ||
611 | WARN_ON(drm_crtc_vblank_get(crtc) != 0); | ||
612 | |||
601 | /* Immediately update the plane's legacy fb pointer, so that later | 613 | /* Immediately update the plane's legacy fb pointer, so that later |
602 | * modeset prep sees the state that will be present when the semaphore | 614 | * modeset prep sees the state that will be present when the semaphore |
603 | * is released. | 615 | * is released. |