12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
25bb5f5daSJernej Skrabec /*
35bb5f5daSJernej Skrabec  * Copyright (C) Icenowy Zheng <icenowy@aosc.io>
45bb5f5daSJernej Skrabec  *
55bb5f5daSJernej Skrabec  * Based on sun4i_layer.h, which is:
65bb5f5daSJernej Skrabec  *   Copyright (C) 2015 Free Electrons
75bb5f5daSJernej Skrabec  *   Copyright (C) 2015 NextThing Co
85bb5f5daSJernej Skrabec  *
95bb5f5daSJernej Skrabec  *   Maxime Ripard <maxime.ripard@free-electrons.com>
105bb5f5daSJernej Skrabec  */
115bb5f5daSJernej Skrabec 
125bb5f5daSJernej Skrabec #ifndef _SUN8I_UI_LAYER_H_
135bb5f5daSJernej Skrabec #define _SUN8I_UI_LAYER_H_
145bb5f5daSJernej Skrabec 
155bb5f5daSJernej Skrabec #include <drm/drm_plane.h>
165bb5f5daSJernej Skrabec 
174b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR(base, layer) \
184b09c073SJernej Skrabec 			((base) + 0x20 * (layer) + 0x0)
194b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_SIZE(base, layer) \
204b09c073SJernej Skrabec 			((base) + 0x20 * (layer) + 0x4)
214b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_COORD(base, layer) \
224b09c073SJernej Skrabec 			((base) + 0x20 * (layer) + 0x8)
234b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_PITCH(base, layer) \
244b09c073SJernej Skrabec 			((base) + 0x20 * (layer) + 0xc)
254b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_TOP_LADDR(base, layer) \
264b09c073SJernej Skrabec 			((base) + 0x20 * (layer) + 0x10)
274b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_BOT_LADDR(base, layer) \
284b09c073SJernej Skrabec 			((base) + 0x20 * (layer) + 0x14)
294b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_FCOLOR(base, layer) \
304b09c073SJernej Skrabec 			((base) + 0x20 * (layer) + 0x18)
314b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_TOP_HADDR(base) \
324b09c073SJernej Skrabec 			((base) + 0x80)
334b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_BOT_HADDR(base) \
344b09c073SJernej Skrabec 			((base) + 0x84)
354b09c073SJernej Skrabec #define SUN8I_MIXER_CHAN_UI_OVL_SIZE(base) \
364b09c073SJernej Skrabec 			((base) + 0x88)
375bb5f5daSJernej Skrabec 
385bb5f5daSJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_EN		BIT(0)
395bb5f5daSJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA_MODE_MASK	GENMASK(2, 1)
405bb5f5daSJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_FBFMT_MASK	GENMASK(12, 8)
415bb5f5daSJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_FBFMT_OFFSET	8
425bb5f5daSJernej Skrabec #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA_MASK	GENMASK(31, 24)
43*0ee29373SRoman Stratiienko #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA(x)		((x) << 24)
44*0ee29373SRoman Stratiienko 
45*0ee29373SRoman Stratiienko #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA_MODE_PIXEL		((0) << 1)
46*0ee29373SRoman Stratiienko #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA_MODE_LAYER		((1) << 1)
47*0ee29373SRoman Stratiienko #define SUN8I_MIXER_CHAN_UI_LAYER_ATTR_ALPHA_MODE_COMBINED	((2) << 1)
485bb5f5daSJernej Skrabec 
495bb5f5daSJernej Skrabec struct sun8i_mixer;
505bb5f5daSJernej Skrabec 
515bb5f5daSJernej Skrabec struct sun8i_ui_layer {
525bb5f5daSJernej Skrabec 	struct drm_plane	plane;
535bb5f5daSJernej Skrabec 	struct sun8i_mixer	*mixer;
545bb5f5daSJernej Skrabec 	int			channel;
555bb5f5daSJernej Skrabec 	int			overlay;
565bb5f5daSJernej Skrabec };
575bb5f5daSJernej Skrabec 
585bb5f5daSJernej Skrabec static inline struct sun8i_ui_layer *
plane_to_sun8i_ui_layer(struct drm_plane * plane)595bb5f5daSJernej Skrabec plane_to_sun8i_ui_layer(struct drm_plane *plane)
605bb5f5daSJernej Skrabec {
615bb5f5daSJernej Skrabec 	return container_of(plane, struct sun8i_ui_layer, plane);
625bb5f5daSJernej Skrabec }
635bb5f5daSJernej Skrabec 
645bb5f5daSJernej Skrabec struct sun8i_ui_layer *sun8i_ui_layer_init_one(struct drm_device *drm,
655bb5f5daSJernej Skrabec 					       struct sun8i_mixer *mixer,
665bb5f5daSJernej Skrabec 					       int index);
675bb5f5daSJernej Skrabec #endif /* _SUN8I_UI_LAYER_H_ */
68