aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/rcar-du
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2015-02-22 18:04:21 -0500
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2015-03-03 09:16:22 -0500
commitd5746642f480c134e8e76a3104b987c08f790283 (patch)
tree30c65ae7c30acc726fb3f87423bae0b647d15e91 /drivers/gpu/drm/rcar-du
parent8d3f9b22891acbc1fd06df80c62f5ac0e3b3d3a5 (diff)
drm: rcar-du: Switch page flip to atomic helpers
The atomic page flip helper implements the page flip operation using asynchronous commits. As the legacy page flip was the last CRTC operation that needed direct access to plane setup, the plane setup functions can now become private to the plane implementation. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Diffstat (limited to 'drivers/gpu/drm/rcar-du')
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_crtc.c55
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_plane.c6
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_plane.h3
3 files changed, 17 insertions, 47 deletions
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
index 8a44d37f1716..2a1119b52c2a 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
@@ -436,14 +436,6 @@ void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc)
436 rcar_du_crtc_start(rcrtc); 436 rcar_du_crtc_start(rcrtc);
437} 437}
438 438
439static void rcar_du_crtc_update_base(struct rcar_du_crtc *rcrtc)
440{
441 struct drm_crtc *crtc = &rcrtc->crtc;
442
443 rcar_du_plane_compute_base(rcrtc->plane, crtc->primary->fb);
444 rcar_du_plane_update_base(rcrtc->plane);
445}
446
447/* ----------------------------------------------------------------------------- 439/* -----------------------------------------------------------------------------
448 * CRTC Functions 440 * CRTC Functions
449 */ 441 */
@@ -485,12 +477,25 @@ static bool rcar_du_crtc_mode_fixup(struct drm_crtc *crtc,
485 477
486static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc) 478static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc)
487{ 479{
480 struct drm_pending_vblank_event *event = crtc->state->event;
488 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); 481 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
482 struct drm_device *dev = rcrtc->crtc.dev;
483 unsigned long flags;
489 484
490 /* We need to access the hardware during atomic update, acquire a 485 /* We need to access the hardware during atomic update, acquire a
491 * reference to the CRTC. 486 * reference to the CRTC.
492 */ 487 */
493 rcar_du_crtc_get(rcrtc); 488 rcar_du_crtc_get(rcrtc);
489
490 if (event) {
491 event->pipe = rcrtc->index;
492
493 WARN_ON(drm_crtc_vblank_get(crtc) != 0);
494
495 spin_lock_irqsave(&dev->event_lock, flags);
496 rcrtc->event = event;
497 spin_unlock_irqrestore(&dev->event_lock, flags);
498 }
494} 499}
495 500
496static void rcar_du_crtc_atomic_flush(struct drm_crtc *crtc) 501static void rcar_du_crtc_atomic_flush(struct drm_crtc *crtc)
@@ -515,43 +520,11 @@ static const struct drm_crtc_helper_funcs crtc_helper_funcs = {
515 .atomic_flush = rcar_du_crtc_atomic_flush, 520 .atomic_flush = rcar_du_crtc_atomic_flush,
516}; 521};
517 522
518static int rcar_du_crtc_page_flip(struct drm_crtc *crtc,
519 struct drm_framebuffer *fb,
520 struct drm_pending_vblank_event *event,
521 uint32_t page_flip_flags)
522{
523 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
524 struct drm_device *dev = rcrtc->crtc.dev;
525 unsigned long flags;
526
527 spin_lock_irqsave(&dev->event_lock, flags);
528 if (rcrtc->event != NULL) {
529 spin_unlock_irqrestore(&dev->event_lock, flags);
530 return -EBUSY;
531 }
532 spin_unlock_irqrestore(&dev->event_lock, flags);
533
534 drm_atomic_set_fb_for_plane(crtc->primary->state, fb);
535
536 crtc->primary->fb = fb;
537 rcar_du_crtc_update_base(rcrtc);
538
539 if (event) {
540 event->pipe = rcrtc->index;
541 drm_crtc_vblank_get(crtc);
542 spin_lock_irqsave(&dev->event_lock, flags);
543 rcrtc->event = event;
544 spin_unlock_irqrestore(&dev->event_lock, flags);
545 }
546
547 return 0;
548}
549
550static const struct drm_crtc_funcs crtc_funcs = { 523static const struct drm_crtc_funcs crtc_funcs = {
551 .reset = drm_atomic_helper_crtc_reset, 524 .reset = drm_atomic_helper_crtc_reset,
552 .destroy = drm_crtc_cleanup, 525 .destroy = drm_crtc_cleanup,
553 .set_config = drm_atomic_helper_set_config, 526 .set_config = drm_atomic_helper_set_config,
554 .page_flip = rcar_du_crtc_page_flip, 527 .page_flip = drm_atomic_helper_page_flip,
555 .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, 528 .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
556 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, 529 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
557}; 530};
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
index ff087f7de88e..9176ac451438 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
@@ -129,7 +129,7 @@ static void rcar_du_plane_release(struct rcar_du_plane *plane)
129 plane->hwindex = -1; 129 plane->hwindex = -1;
130} 130}
131 131
132void rcar_du_plane_update_base(struct rcar_du_plane *plane) 132static void rcar_du_plane_update_base(struct rcar_du_plane *plane)
133{ 133{
134 struct rcar_du_group *rgrp = plane->group; 134 struct rcar_du_group *rgrp = plane->group;
135 unsigned int src_x = plane->plane.state->src_x >> 16; 135 unsigned int src_x = plane->plane.state->src_x >> 16;
@@ -182,8 +182,8 @@ void rcar_du_plane_update_base(struct rcar_du_plane *plane)
182 } 182 }
183} 183}
184 184
185void rcar_du_plane_compute_base(struct rcar_du_plane *plane, 185static void rcar_du_plane_compute_base(struct rcar_du_plane *plane,
186 struct drm_framebuffer *fb) 186 struct drm_framebuffer *fb)
187{ 187{
188 struct drm_gem_cma_object *gem; 188 struct drm_gem_cma_object *gem;
189 189
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
index 3420ff07f2c6..9b77a638863f 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
@@ -62,8 +62,5 @@ struct rcar_du_planes {
62int rcar_du_planes_init(struct rcar_du_group *rgrp); 62int rcar_du_planes_init(struct rcar_du_group *rgrp);
63 63
64void rcar_du_plane_setup(struct rcar_du_plane *plane); 64void rcar_du_plane_setup(struct rcar_du_plane *plane);
65void rcar_du_plane_update_base(struct rcar_du_plane *plane);
66void rcar_du_plane_compute_base(struct rcar_du_plane *plane,
67 struct drm_framebuffer *fb);
68 65
69#endif /* __RCAR_DU_PLANE_H__ */ 66#endif /* __RCAR_DU_PLANE_H__ */