1/*
2 * Copyright (C) STMicroelectronics SA 2014
3 * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
4 *          Fabien Dessenne <fabien.dessenne@st.com>
5 *          for STMicroelectronics.
6 * License terms:  GNU General Public License (GPL), version 2
7 */
8
9#ifndef _STI_LAYER_H_
10#define _STI_LAYER_H_
11
12#include <drm/drmP.h>
13
14#define to_sti_layer(x) container_of(x, struct sti_layer, plane)
15
16#define STI_LAYER_TYPE_SHIFT 8
17#define STI_LAYER_TYPE_MASK (~((1<<STI_LAYER_TYPE_SHIFT)-1))
18
19struct sti_layer;
20
21enum sti_layer_type {
22	STI_GDP = 1 << STI_LAYER_TYPE_SHIFT,
23	STI_VID = 2 << STI_LAYER_TYPE_SHIFT,
24	STI_CUR = 3 << STI_LAYER_TYPE_SHIFT,
25	STI_BCK = 4 << STI_LAYER_TYPE_SHIFT,
26	STI_VDP = 5 << STI_LAYER_TYPE_SHIFT
27};
28
29enum sti_layer_id_of_type {
30	STI_ID_0 = 0,
31	STI_ID_1 = 1,
32	STI_ID_2 = 2,
33	STI_ID_3 = 3
34};
35
36enum sti_layer_desc {
37	STI_GDP_0       = STI_GDP | STI_ID_0,
38	STI_GDP_1       = STI_GDP | STI_ID_1,
39	STI_GDP_2       = STI_GDP | STI_ID_2,
40	STI_GDP_3       = STI_GDP | STI_ID_3,
41	STI_VID_0       = STI_VID | STI_ID_0,
42	STI_VID_1       = STI_VID | STI_ID_1,
43	STI_HQVDP_0     = STI_VDP | STI_ID_0,
44	STI_CURSOR      = STI_CUR,
45	STI_BACK        = STI_BCK
46};
47
48/**
49 * STI layer functions structure
50 *
51 * @get_formats:	get layer supported formats
52 * @get_nb_formats:	get number of format supported
53 * @init:               initialize the layer
54 * @prepare:		prepare layer before rendering
55 * @commit:		set layer for rendering
56 * @disable:		disable layer
57 */
58struct sti_layer_funcs {
59	const uint32_t* (*get_formats)(struct sti_layer *layer);
60	unsigned int (*get_nb_formats)(struct sti_layer *layer);
61	void (*init)(struct sti_layer *layer);
62	int (*prepare)(struct sti_layer *layer, bool first_prepare);
63	int (*commit)(struct sti_layer *layer);
64	int (*disable)(struct sti_layer *layer);
65};
66
67/**
68 * STI layer structure
69 *
70 * @plane:              drm plane it is bound to (if any)
71 * @fb:                 drm fb it is bound to
72 * @crtc:               crtc it is bound to
73 * @mode:               display mode
74 * @desc:               layer type & id
75 * @device:		driver device
76 * @regs:		layer registers
77 * @ops:                layer functions
78 * @zorder:             layer z-order
79 * @mixer_id:           id of the mixer used to display the layer
80 * @enabled:            to know if the layer is active or not
81 * @src_x src_y:        coordinates of the input (fb) area
82 * @src_w src_h:        size of the input (fb) area
83 * @dst_x dst_y:        coordinates of the output (crtc) area
84 * @dst_w dst_h:        size of the output (crtc) area
85 * @format:             format
86 * @pitches:            pitch of 'planes' (eg: Y, U, V)
87 * @offsets:            offset of 'planes'
88 * @vaddr:              virtual address of the input buffer
89 * @paddr:              physical address of the input buffer
90 */
91struct sti_layer {
92	struct drm_plane plane;
93	struct drm_framebuffer *fb;
94	struct drm_crtc *crtc;
95	struct drm_display_mode *mode;
96	enum sti_layer_desc desc;
97	struct device *dev;
98	void __iomem *regs;
99	const struct sti_layer_funcs *ops;
100	int zorder;
101	int mixer_id;
102	bool enabled;
103	int src_x, src_y;
104	int src_w, src_h;
105	int dst_x, dst_y;
106	int dst_w, dst_h;
107	uint32_t format;
108	unsigned int pitches[4];
109	unsigned int offsets[4];
110	void *vaddr;
111	dma_addr_t paddr;
112};
113
114struct sti_layer *sti_layer_create(struct device *dev, int desc,
115			void __iomem *baseaddr);
116int sti_layer_prepare(struct sti_layer *layer,
117			struct drm_crtc *crtc,
118			struct drm_framebuffer *fb,
119			struct drm_display_mode *mode,
120			int mixer_id,
121			int dest_x, int dest_y,
122			int dest_w, int dest_h,
123			int src_x, int src_y,
124			int src_w, int src_h);
125int sti_layer_commit(struct sti_layer *layer);
126int sti_layer_disable(struct sti_layer *layer);
127const uint32_t *sti_layer_get_formats(struct sti_layer *layer);
128unsigned int sti_layer_get_nb_formats(struct sti_layer *layer);
129const char *sti_layer_to_str(struct sti_layer *layer);
130
131#endif
132