video: tegra: dc: add advanced cursor support
[linux-2.6.git] / include / video / tegra_dc_ext.h
1 /*
2  * Copyright (C) 2011, NVIDIA Corporation
3  *
4  * Author: Robert Morell <rmorell@nvidia.com>
5  * Some code based on fbdev extensions written by:
6  *      Erik Gilling <konkers@android.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  * more details.
17  */
18
19 #ifndef __TEGRA_DC_EXT_H
20 #define __TEGRA_DC_EXT_H
21
22 #include <linux/types.h>
23 #include <linux/ioctl.h>
24 #if defined(__KERNEL__)
25 # include <linux/time.h>
26 #else
27 # include <time.h>
28 # include <unistd.h>
29 #endif
30
31 #define TEGRA_DC_EXT_FMT_P1             0
32 #define TEGRA_DC_EXT_FMT_P2             1
33 #define TEGRA_DC_EXT_FMT_P4             2
34 #define TEGRA_DC_EXT_FMT_P8             3
35 #define TEGRA_DC_EXT_FMT_B4G4R4A4       4
36 #define TEGRA_DC_EXT_FMT_B5G5R5A        5
37 #define TEGRA_DC_EXT_FMT_B5G6R5         6
38 #define TEGRA_DC_EXT_FMT_AB5G5R5        7
39 #define TEGRA_DC_EXT_FMT_B8G8R8A8       12
40 #define TEGRA_DC_EXT_FMT_R8G8B8A8       13
41 #define TEGRA_DC_EXT_FMT_B6x2G6x2R6x2A8 14
42 #define TEGRA_DC_EXT_FMT_R6x2G6x2B6x2A8 15
43 #define TEGRA_DC_EXT_FMT_YCbCr422       16
44 #define TEGRA_DC_EXT_FMT_YUV422         17
45 #define TEGRA_DC_EXT_FMT_YCbCr420P      18
46 #define TEGRA_DC_EXT_FMT_YUV420P        19
47 #define TEGRA_DC_EXT_FMT_YCbCr422P      20
48 #define TEGRA_DC_EXT_FMT_YUV422P        21
49 #define TEGRA_DC_EXT_FMT_YCbCr422R      22
50 #define TEGRA_DC_EXT_FMT_YUV422R        23
51 #define TEGRA_DC_EXT_FMT_YCbCr422RA     24
52 #define TEGRA_DC_EXT_FMT_YUV422RA       25
53
54 #define TEGRA_DC_EXT_BLEND_NONE         0
55 #define TEGRA_DC_EXT_BLEND_PREMULT      1
56 #define TEGRA_DC_EXT_BLEND_COVERAGE     2
57
58 #define TEGRA_DC_EXT_FLIP_FLAG_INVERT_H (1 << 0)
59 #define TEGRA_DC_EXT_FLIP_FLAG_INVERT_V (1 << 1)
60 #define TEGRA_DC_EXT_FLIP_FLAG_TILED    (1 << 2)
61 #define TEGRA_DC_EXT_FLIP_FLAG_CURSOR   (1 << 3)
62 #define TEGRA_DC_EXT_FLIP_FLAG_GLOBAL_ALPHA     (1 << 4)
63 #define TEGRA_DC_EXT_FLIP_FLAG_SCAN_COLUMN      (1 << 6)
64
65 struct tegra_dc_ext_flip_windowattr {
66         __s32   index;
67         __u32   buff_id;
68         __u32   blend;
69         __u32   offset;
70         __u32   offset_u;
71         __u32   offset_v;
72         __u32   stride;
73         __u32   stride_uv;
74         __u32   pixformat;
75         /*
76          * x, y, w, h are fixed-point: 20 bits of integer (MSB) and 12 bits of
77          * fractional (LSB)
78          */
79         __u32   x;
80         __u32   y;
81         __u32   w;
82         __u32   h;
83         __u32   out_x;
84         __u32   out_y;
85         __u32   out_w;
86         __u32   out_h;
87         __u32   z;
88         __u32   swap_interval;
89         struct timespec timestamp;
90         __u32   pre_syncpt_id;
91         __u32   pre_syncpt_val;
92         /* These two are optional; if zero, U and V are taken from buff_id */
93         __u32   buff_id_u;
94         __u32   buff_id_v;
95         __u32   flags;
96         __u8    global_alpha; /* requires TEGRA_DC_EXT_FLIP_FLAG_GLOBAL_ALPHA */
97         /* Leave some wiggle room for future expansion */
98         __u8    pad1[3];
99         __u32   pad2[4];
100 };
101
102 #define TEGRA_DC_EXT_FLIP_N_WINDOWS     3
103
104 struct tegra_dc_ext_flip {
105         struct tegra_dc_ext_flip_windowattr win[TEGRA_DC_EXT_FLIP_N_WINDOWS];
106         __u32   post_syncpt_id;
107         __u32   post_syncpt_val;
108 };
109
110 /*
111  * Cursor image format:
112  * - Tegra hardware supports two colors: foreground and background, specified
113  *   by the client in RGB8.
114  * - The image should be specified as two 1bpp bitmaps immediately following
115  *   each other in memory.  Each pixel in the final cursor will be constructed
116  *   from the bitmaps with the following logic:
117  *              bitmap1 bitmap0
118  *              (mask)  (color)
119  *                1        0    transparent
120  *                1        1    inverted
121  *                0        0    background color
122  *                0        1    foreground color
123  * - Exactly one of the SIZE flags must be specified.
124  */
125
126 #define TEGRA_DC_EXT_CURSOR_IMAGE_FLAGS_SIZE_32x32      ((1 & 0x7) << 0)
127 #define TEGRA_DC_EXT_CURSOR_IMAGE_FLAGS_SIZE_64x64      ((2 & 0x7) << 0)
128 #define TEGRA_DC_EXT_CURSOR_IMAGE_FLAGS_SIZE_128x128    ((3 & 0x7) << 0)
129 #define TEGRA_DC_EXT_CURSOR_IMAGE_FLAGS_SIZE_256x256    ((4 & 0x7) << 0)
130 #define TEGRA_DC_EXT_CURSOR_IMAGE_FLAGS_SIZE(x)         (((x) & 0x7) >> 0)
131 #define TEGRA_DC_EXT_CURSOR_FLAGS_2BIT_LEGACY           (0 << 16)
132 #define TEGRA_DC_EXT_CURSOR_FLAGS_RGBA_NORMAL           (1 << 16)
133 struct tegra_dc_ext_cursor_image {
134         struct {
135                 __u8    r;
136                 __u8    g;
137                 __u8    b;
138         } foreground, background;
139         __u32   buff_id;
140         __u32   flags;
141 };
142
143 /* Possible flags for struct nvdc_cursor's flags field */
144 #define TEGRA_DC_EXT_CURSOR_FLAGS_VISIBLE       (1 << 0)
145
146 struct tegra_dc_ext_cursor {
147         __s16 x;
148         __s16 y;
149         __u32 flags;
150 };
151
152 /*
153  * Color conversion is performed as follows:
154  *
155  * r = sat(kyrgb * sat(y + yof) + kur * u + kvr * v)
156  * g = sat(kyrgb * sat(y + yof) + kug * u + kvg * v)
157  * b = sat(kyrgb * sat(y + yof) + kub * u + kvb * v)
158  *
159  * Coefficients should be specified as fixed-point values; the exact format
160  * varies for each coefficient.
161  * The format for each coefficient is listed below with the syntax:
162  * - A "s." prefix means that the coefficient has a sign bit (twos complement).
163  * - The first number is the number of bits in the integer component (not
164  *   including the optional sign bit).
165  * - The second number is the number of bits in the fractional component.
166  *
167  * All three fields should be tightly packed, justified to the LSB of the
168  * 16-bit value.  For example, the "s.2.8" value should be packed as:
169  * (MSB) 5 bits of 0, 1 bit of sign, 2 bits of integer, 8 bits of frac (LSB)
170  */
171 struct tegra_dc_ext_csc {
172         __u32 win_index;
173         __u16 yof;      /* s.7.0 */
174         __u16 kyrgb;    /*   2.8 */
175         __u16 kur;      /* s.2.8 */
176         __u16 kvr;      /* s.2.8 */
177         __u16 kug;      /* s.1.8 */
178         __u16 kvg;      /* s.1.8 */
179         __u16 kub;      /* s.2.8 */
180         __u16 kvb;      /* s.2.8 */
181 };
182
183 struct tegra_dc_ext_cmu {
184         __u16 cmu_enable;
185         __u16 csc[9];
186         __u16 lut1[256];
187         __u16 lut2[960];
188 };
189
190 /*
191  * RGB Lookup table
192  *
193  * In true-color and YUV modes this is used for post-CSC RGB->RGB lookup, i.e.
194  * gamma-correction. In palette-indexed RGB modes, this table designates the
195  * mode's color palette.
196  *
197  * To convert 8-bit per channel RGB values to 16-bit, duplicate the 8 bits
198  * in low and high byte, e.g. r=r|(r<<8)
199  *
200  * To just update flags, set len to 0.
201  *
202  * Current Tegra DC hardware supports 8-bit per channel to 8-bit per channel,
203  * and each hardware window (overlay) uses its own lookup table.
204  *
205  */
206 struct tegra_dc_ext_lut {
207         __u32  win_index; /* window index to set lut for */
208         __u32  flags;     /* Flag bitmask, see TEGRA_DC_EXT_LUT_FLAGS_* */
209         __u32  start;     /* start index to update lut from */
210         __u32  len;       /* number of valid lut entries */
211         __u16 *r;         /* array of 16-bit red values, 0 to reset */
212         __u16 *g;         /* array of 16-bit green values, 0 to reset */
213         __u16 *b;         /* array of 16-bit blue values, 0 to reset */
214 };
215
216 /* tegra_dc_ext_lut.flags - override global fb device lookup table.
217  * Default behaviour is double-lookup.
218  */
219 #define TEGRA_DC_EXT_LUT_FLAGS_FBOVERRIDE 0x01
220
221 #define TEGRA_DC_EXT_FLAGS_ENABLED      1
222 struct tegra_dc_ext_status {
223         __u32 flags;
224         /* Leave some wiggle room for future expansion */
225         __u32 pad[3];
226 };
227
228 struct tegra_dc_ext_feature {
229         __u32 length;
230         __u32 *entries;
231 };
232
233 #define TEGRA_DC_EXT_SET_NVMAP_FD \
234         _IOW('D', 0x00, __s32)
235
236 #define TEGRA_DC_EXT_GET_WINDOW \
237         _IOW('D', 0x01, __u32)
238 #define TEGRA_DC_EXT_PUT_WINDOW \
239         _IOW('D', 0x02, __u32)
240
241 #define TEGRA_DC_EXT_FLIP \
242         _IOWR('D', 0x03, struct tegra_dc_ext_flip)
243
244 #define TEGRA_DC_EXT_GET_CURSOR \
245         _IO('D', 0x04)
246 #define TEGRA_DC_EXT_PUT_CURSOR \
247         _IO('D', 0x05)
248 #define TEGRA_DC_EXT_SET_CURSOR_IMAGE \
249         _IOW('D', 0x06, struct tegra_dc_ext_cursor_image)
250 #define TEGRA_DC_EXT_SET_CURSOR \
251         _IOW('D', 0x07, struct tegra_dc_ext_cursor)
252
253 #define TEGRA_DC_EXT_SET_CSC \
254         _IOW('D', 0x08, struct tegra_dc_ext_csc)
255
256 #define TEGRA_DC_EXT_GET_STATUS \
257         _IOR('D', 0x09, struct tegra_dc_ext_status)
258
259 /*
260  * Returns the auto-incrementing vblank syncpoint for the head associated with
261  * this device node
262  */
263 #define TEGRA_DC_EXT_GET_VBLANK_SYNCPT \
264         _IOR('D', 0x09, __u32)
265
266 #define TEGRA_DC_EXT_SET_LUT \
267         _IOW('D', 0x0A, struct tegra_dc_ext_lut)
268
269 #define TEGRA_DC_EXT_GET_FEATURES \
270         _IOW('D', 0x0B, struct tegra_dc_ext_feature)
271
272 #define TEGRA_DC_EXT_CURSOR_CLIP \
273         _IOW('D', 0x0C, __s32)
274
275 #define TEGRA_DC_EXT_SET_CMU \
276         _IOW('D', 0x0D, struct tegra_dc_ext_cmu)
277
278 enum tegra_dc_ext_control_output_type {
279         TEGRA_DC_EXT_DSI,
280         TEGRA_DC_EXT_LVDS,
281         TEGRA_DC_EXT_VGA,
282         TEGRA_DC_EXT_HDMI,
283         TEGRA_DC_EXT_DVI,
284 };
285
286 /*
287  * Get the properties for a given output.
288  *
289  * handle (in): Which output to query
290  * type (out): Describes the type of the output
291  * connected (out): Non-zero iff the output is currently connected
292  * associated_head (out): The head number that the output is currently
293  *      bound to.  -1 iff the output is not associated with any head.
294  * head_mask (out): Bitmask of which heads the output may be bound to (some
295  *      outputs are permanently bound to a single head).
296  */
297 struct tegra_dc_ext_control_output_properties {
298         __u32 handle;
299         enum tegra_dc_ext_control_output_type type;
300         __u32 connected;
301         __s32 associated_head;
302         __u32 head_mask;
303 };
304
305 /*
306  * This allows userspace to query the raw EDID data for the specified output
307  * handle.
308  *
309  * Here, the size parameter is both an input and an output:
310  * 1. Userspace passes in the size of the buffer allocated for data.
311  * 2. If size is too small, the call fails with the error EFBIG; otherwise, the
312  *    raw EDID data is written to the buffer pointed to by data.  In both
313  *    cases, size will be filled in with the size of the data.
314  */
315 struct tegra_dc_ext_control_output_edid {
316         __u32 handle;
317         __u32 size;
318         void *data;
319 };
320
321 struct tegra_dc_ext_event {
322         __u32   type;
323         ssize_t data_size;
324         char    data[0];
325 };
326
327 #define TEGRA_DC_EXT_EVENT_HOTPLUG      0x1
328 struct tegra_dc_ext_control_event_hotplug {
329         __u32 handle;
330 };
331
332
333 #define TEGRA_DC_EXT_CAPABILITIES_CURSOR_MODE   (1 << 0)
334 struct tegra_dc_ext_control_capabilities {
335         __u32 caps;
336         /* Leave some wiggle room for future expansion */
337         __u32 pad[3];
338 };
339
340 #define TEGRA_DC_EXT_CONTROL_GET_NUM_OUTPUTS \
341         _IOR('C', 0x00, __u32)
342 #define TEGRA_DC_EXT_CONTROL_GET_OUTPUT_PROPERTIES \
343         _IOWR('C', 0x01, struct tegra_dc_ext_control_output_properties)
344 #define TEGRA_DC_EXT_CONTROL_GET_OUTPUT_EDID \
345         _IOWR('C', 0x02, struct tegra_dc_ext_control_output_edid)
346 #define TEGRA_DC_EXT_CONTROL_SET_EVENT_MASK \
347         _IOW('C', 0x03, __u32)
348 #define TEGRA_DC_EXT_CONTROL_GET_CAPABILITIES \
349         _IOR('C', 0x04, struct tegra_dc_ext_control_capabilities)
350
351 #endif /* __TEGRA_DC_EXT_H */