Commit b011941f authored by Inki Dae's avatar Inki Dae
Browse files

drm/exynos: add wait_for_vblank callback interface.



Changelog v2:
fixed comments.

Changelog v1:
this interface can be used to make sure that hardware overlay is disabled
to avoid that memory region is accessed by dma after gem buffer was released.

Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
parent 50caf25c
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -37,6 +37,20 @@
#define MAX_FB_BUFFER	4
#define DEFAULT_ZPOS	-1

#define _wait_for(COND, MS) ({ \
	unsigned long timeout__ = jiffies + msecs_to_jiffies(MS);	\
	int ret__ = 0;							\
	while (!(COND)) {						\
		if (time_after(jiffies, timeout__)) {			\
			ret__ = -ETIMEDOUT;				\
			break;						\
		}							\
	}								\
	ret__;								\
})

#define wait_for(COND, MS) _wait_for(COND, MS)

struct drm_device;
struct exynos_drm_overlay;
struct drm_connector;
@@ -61,6 +75,8 @@ enum exynos_drm_output_type {
 * @commit: apply hardware specific overlay data to registers.
 * @enable: enable hardware specific overlay.
 * @disable: disable hardware specific overlay.
 * @wait_for_vblank: wait for vblank interrupt to make sure that
 *	hardware overlay is disabled.
 */
struct exynos_drm_overlay_ops {
	void (*mode_set)(struct device *subdrv_dev,
@@ -68,6 +84,7 @@ struct exynos_drm_overlay_ops {
	void (*commit)(struct device *subdrv_dev, int zpos);
	void (*enable)(struct device *subdrv_dev, int zpos);
	void (*disable)(struct device *subdrv_dev, int zpos);
	void (*wait_for_vblank)(struct device *subdrv_dev);
};

/*
+10 −0
Original line number Diff line number Diff line
@@ -430,4 +430,14 @@ void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data)

	if (overlay_ops && overlay_ops->disable)
		overlay_ops->disable(manager->dev, zpos);

	/*
	 * wait for vblank interrupt
	 * - this makes sure that hardware overlay is disabled to avoid
	 * for the dma accesses to memory after gem buffer was released
	 * because the setting for disabling the overlay will be updated
	 * at vsync.
	 */
	if (overlay_ops->wait_for_vblank)
		overlay_ops->wait_for_vblank(manager->dev);
}