mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 14:34:28 +08:00
drm: rcar-du: Register a completion callback with VSP1
Currently we process page flip events on every display interrupt, however this does not take into consideration the processing time needed by the VSP1 utilised in the pipeline. Register a callback with the VSP driver to obtain completion events, and track them so that we only perform page flips when the full display pipeline has completed for the frame. Signed-off-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
This commit is contained in:
parent
d7ade201ae
commit
d503a43ac0
@ -378,7 +378,7 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc)
|
||||
* Page Flip
|
||||
*/
|
||||
|
||||
static void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc)
|
||||
void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc)
|
||||
{
|
||||
struct drm_pending_vblank_event *event;
|
||||
struct drm_device *dev = rcrtc->crtc.dev;
|
||||
@ -650,6 +650,7 @@ static const struct drm_crtc_funcs crtc_funcs = {
|
||||
static irqreturn_t rcar_du_crtc_irq(int irq, void *arg)
|
||||
{
|
||||
struct rcar_du_crtc *rcrtc = arg;
|
||||
struct rcar_du_device *rcdu = rcrtc->group->dev;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
u32 status;
|
||||
|
||||
@ -658,7 +659,10 @@ static irqreturn_t rcar_du_crtc_irq(int irq, void *arg)
|
||||
|
||||
if (status & DSSR_FRM) {
|
||||
drm_crtc_handle_vblank(&rcrtc->crtc);
|
||||
rcar_du_crtc_finish_page_flip(rcrtc);
|
||||
|
||||
if (rcdu->info->gen < 3)
|
||||
rcar_du_crtc_finish_page_flip(rcrtc);
|
||||
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -73,5 +73,6 @@ void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc);
|
||||
|
||||
void rcar_du_crtc_route_output(struct drm_crtc *crtc,
|
||||
enum rcar_du_output output);
|
||||
void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc);
|
||||
|
||||
#endif /* __RCAR_DU_CRTC_H__ */
|
||||
|
@ -28,6 +28,13 @@
|
||||
#include "rcar_du_kms.h"
|
||||
#include "rcar_du_vsp.h"
|
||||
|
||||
static void rcar_du_vsp_complete(void *private)
|
||||
{
|
||||
struct rcar_du_crtc *crtc = private;
|
||||
|
||||
rcar_du_crtc_finish_page_flip(crtc);
|
||||
}
|
||||
|
||||
void rcar_du_vsp_enable(struct rcar_du_crtc *crtc)
|
||||
{
|
||||
const struct drm_display_mode *mode = &crtc->crtc.state->adjusted_mode;
|
||||
@ -35,6 +42,8 @@ void rcar_du_vsp_enable(struct rcar_du_crtc *crtc)
|
||||
struct vsp1_du_lif_config cfg = {
|
||||
.width = mode->hdisplay,
|
||||
.height = mode->vdisplay,
|
||||
.callback = rcar_du_vsp_complete,
|
||||
.callback_data = crtc,
|
||||
};
|
||||
struct rcar_du_plane_state state = {
|
||||
.state = {
|
||||
|
Loading…
Reference in New Issue
Block a user