forked from Minki/linux
b33b547488
The old implementation of placing planes on the CRTC while configuring the planes was naive and relied on the order in which the planes were configured, enabled, and disabled. The situation where a plane's zpos was changed on the fly was completely broken. The usual symptoms of this problem was scrambled display and a flood of sync lost errors, when a plane was active in two layers at the same time, or a missing plane, in case when a layer was accidentally disabled. The rewrite takes a more straight forward approach when HW is concerned. The plane positioning registers are in the CRTC (or actually OVR) register space and it is more natural to configure them in a one go when configuring the CRTC. To do this we need make sure we have all the planes on the updated CRTCs in the new atomic state. The untouched planes on CRTCs that need plane position update are added to the atomic state in tidss_atomic_check(). Signed-off-by: Jyri Sarha <jsarha@ti.com> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200227120052.23168-1-jsarha@ti.com
49 lines
1.0 KiB
C
49 lines
1.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
|
|
* Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
|
|
*/
|
|
|
|
#ifndef __TIDSS_CRTC_H__
|
|
#define __TIDSS_CRTC_H__
|
|
|
|
#include <linux/completion.h>
|
|
#include <linux/wait.h>
|
|
|
|
#include <drm/drm_crtc.h>
|
|
|
|
#define to_tidss_crtc(c) container_of((c), struct tidss_crtc, crtc)
|
|
|
|
struct tidss_device;
|
|
|
|
struct tidss_crtc {
|
|
struct drm_crtc crtc;
|
|
|
|
u32 hw_videoport;
|
|
|
|
struct drm_pending_vblank_event *event;
|
|
|
|
struct completion framedone_completion;
|
|
};
|
|
|
|
#define to_tidss_crtc_state(x) container_of(x, struct tidss_crtc_state, base)
|
|
|
|
struct tidss_crtc_state {
|
|
/* Must be first. */
|
|
struct drm_crtc_state base;
|
|
|
|
bool plane_pos_changed;
|
|
|
|
u32 bus_format;
|
|
u32 bus_flags;
|
|
};
|
|
|
|
void tidss_crtc_vblank_irq(struct drm_crtc *crtc);
|
|
void tidss_crtc_framedone_irq(struct drm_crtc *crtc);
|
|
void tidss_crtc_error_irq(struct drm_crtc *crtc, u64 irqstatus);
|
|
|
|
struct tidss_crtc *tidss_crtc_create(struct tidss_device *tidss,
|
|
u32 hw_videoport,
|
|
struct drm_plane *primary);
|
|
#endif
|