video: tegra: dc: Add support to SCAN_COLUMN.
[linux-3.10.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 #define TEGRA_DC_EXT_CURSOR_IMAGE_FLAGS_SIZE_32x32      1
126 #define TEGRA_DC_EXT_CURSOR_IMAGE_FLAGS_SIZE_64x64      2
127 struct tegra_dc_ext_cursor_image {
128         struct {
129                 __u8    r;
130                 __u8    g;
131                 __u8    b;
132         } foreground, background;
133         __u32   buff_id;
134         __u32   flags;
135 };
136
137 /* Possible flags for struct nvdc_cursor's flags field */
138 #define TEGRA_DC_EXT_CURSOR_FLAGS_VISIBLE       1
139
140 struct tegra_dc_ext_cursor {
141         __s16 x;
142         __s16 y;
143         __u32 flags;
144 };
145
146 /*
147  * Color conversion is performed as follows:
148  *
149  * r = sat(kyrgb * sat(y + yof) + kur * u + kvr * v)
150  * g = sat(kyrgb * sat(y + yof) + kug * u + kvg * v)
151  * b = sat(kyrgb * sat(y + yof) + kub * u + kvb * v)
152  *
153  * Coefficients should be specified as fixed-point values; the exact format
154  * varies for each coefficient.
155  * The format for each coefficient is listed below with the syntax:
156  * - A "s." prefix means that the coefficient has a sign bit (twos complement).
157  * - The first number is the number of bits in the integer component (not
158  *   including the optional sign bit).
159  * - The second number is the number of bits in the fractional component.
160  *
161  * All three fields should be tightly packed, justified to the LSB of the
162  * 16-bit value.  For example, the "s.2.8" value should be packed as:
163  * (MSB) 5 bits of 0, 1 bit of sign, 2 bits of integer, 8 bits of frac (LSB)
164  */
165 struct tegra_dc_ext_csc {
166         __u32 win_index;
167         __u16 yof;      /* s.7.0 */
168         __u16 kyrgb;    /*   2.8 */
169         __u16 kur;      /* s.2.8 */
170         __u16 kvr;      /* s.2.8 */
171         __u16 kug;      /* s.1.8 */
172         __u16 kvg;      /* s.1.8 */
173         __u16 kub;      /* s.2.8 */
174         __u16 kvb;      /* s.2.8 */
175 };
176
177 /*
178  * RGB Lookup table
179  *
180  * In true-color and YUV modes this is used for post-CSC RGB->RGB lookup, i.e.
181  * gamma-correction. In palette-indexed RGB modes, this table designates the
182  * mode's color palette.
183  *
184  * To convert 8-bit per channel RGB values to 16-bit, duplicate the 8 bits
185  * in low and high byte, e.g. r=r|(r<<8)
186  *
187  * To just update flags, set len to 0.
188  *
189  * Current Tegra DC hardware supports 8-bit per channel to 8-bit per channel,
190  * and each hardware window (overlay) uses its own lookup table.
191  *
192  */
193 struct tegra_dc_ext_lut {
194         __u32  win_index; /* window index to set lut for */
195         __u32  flags;     /* Flag bitmask, see TEGRA_DC_EXT_LUT_FLAGS_* */
196         __u32  start;     /* start index to update lut from */
197         __u32  len;       /* number of valid lut entries */
198         __u16 *r;         /* array of 16-bit red values, 0 to reset */
199         __u16 *g;         /* array of 16-bit green values, 0 to reset */
200         __u16 *b;         /* array of 16-bit blue values, 0 to reset */
201 };
202
203 /* tegra_dc_ext_lut.flags - override global fb device lookup table.
204  * Default behaviour is double-lookup.
205  */
206 #define TEGRA_DC_EXT_LUT_FLAGS_FBOVERRIDE 0x01
207
208 #define TEGRA_DC_EXT_FLAGS_ENABLED      1
209 struct tegra_dc_ext_status {
210         __u32 flags;
211         /* Leave some wiggle room for future expansion */
212         __u32 pad[3];
213 };
214
215 struct tegra_dc_ext_feature {
216         __u32 length;
217         __u32 *entries;
218 };
219
220 #define TEGRA_DC_EXT_SET_NVMAP_FD \
221         _IOW('D', 0x00, __s32)
222
223 #define TEGRA_DC_EXT_GET_WINDOW \
224         _IOW('D', 0x01, __u32)
225 #define TEGRA_DC_EXT_PUT_WINDOW \
226         _IOW('D', 0x02, __u32)
227
228 #define TEGRA_DC_EXT_FLIP \
229         _IOWR('D', 0x03, struct tegra_dc_ext_flip)
230
231 #define TEGRA_DC_EXT_GET_CURSOR \
232         _IO('D', 0x04)
233 #define TEGRA_DC_EXT_PUT_CURSOR \
234         _IO('D', 0x05)
235 #define TEGRA_DC_EXT_SET_CURSOR_IMAGE \
236         _IOW('D', 0x06, struct tegra_dc_ext_cursor_image)
237 #define TEGRA_DC_EXT_SET_CURSOR \
238         _IOW('D', 0x07, struct tegra_dc_ext_cursor)
239
240 #define TEGRA_DC_EXT_SET_CSC \
241         _IOW('D', 0x08, struct tegra_dc_ext_csc)
242
243 #define TEGRA_DC_EXT_GET_STATUS \
244         _IOR('D', 0x09, struct tegra_dc_ext_status)
245
246 /*
247  * Returns the auto-incrementing vblank syncpoint for the head associated with
248  * this device node
249  */
250 #define TEGRA_DC_EXT_GET_VBLANK_SYNCPT \
251         _IOR('D', 0x09, __u32)
252
253 #define TEGRA_DC_EXT_SET_LUT \
254         _IOW('D', 0x0A, struct tegra_dc_ext_lut)
255
256 #define TEGRA_DC_EXT_GET_FEATURES \
257         _IOW('D', 0x0B, struct tegra_dc_ext_feature)
258
259 enum tegra_dc_ext_control_output_type {
260         TEGRA_DC_EXT_DSI,
261         TEGRA_DC_EXT_LVDS,
262         TEGRA_DC_EXT_VGA,
263         TEGRA_DC_EXT_HDMI,
264         TEGRA_DC_EXT_DVI,
265 };
266
267 /*
268  * Get the properties for a given output.
269  *
270  * handle (in): Which output to query
271  * type (out): Describes the type of the output
272  * connected (out): Non-zero iff the output is currently connected
273  * associated_head (out): The head number that the output is currently
274  *      bound to.  -1 iff the output is not associated with any head.
275  * head_mask (out): Bitmask of which heads the output may be bound to (some
276  *      outputs are permanently bound to a single head).
277  */
278 struct tegra_dc_ext_control_output_properties {
279         __u32 handle;
280         enum tegra_dc_ext_control_output_type type;
281         __u32 connected;
282         __s32 associated_head;
283         __u32 head_mask;
284 };
285
286 /*
287  * This allows userspace to query the raw EDID data for the specified output
288  * handle.
289  *
290  * Here, the size parameter is both an input and an output:
291  * 1. Userspace passes in the size of the buffer allocated for data.
292  * 2. If size is too small, the call fails with the error EFBIG; otherwise, the
293  *    raw EDID data is written to the buffer pointed to by data.  In both
294  *    cases, size will be filled in with the size of the data.
295  */
296 struct tegra_dc_ext_control_output_edid {
297         __u32 handle;
298         __u32 size;
299         void *data;
300 };
301
302 struct tegra_dc_ext_event {
303         __u32   type;
304         ssize_t data_size;
305         char    data[0];
306 };
307
308 #define TEGRA_DC_EXT_EVENT_HOTPLUG      0x1
309 struct tegra_dc_ext_control_event_hotplug {
310         __u32 handle;
311 };
312
313
314 #define TEGRA_DC_EXT_CAPABILITIES_CURSOR_MODE   (1 << 0)
315 struct tegra_dc_ext_control_capabilities {
316         __u32 caps;
317         /* Leave some wiggle room for future expansion */
318         __u32 pad[3];
319 };
320
321 #define TEGRA_DC_EXT_CONTROL_GET_NUM_OUTPUTS \
322         _IOR('C', 0x00, __u32)
323 #define TEGRA_DC_EXT_CONTROL_GET_OUTPUT_PROPERTIES \
324         _IOWR('C', 0x01, struct tegra_dc_ext_control_output_properties)
325 #define TEGRA_DC_EXT_CONTROL_GET_OUTPUT_EDID \
326         _IOWR('C', 0x02, struct tegra_dc_ext_control_output_edid)
327 #define TEGRA_DC_EXT_CONTROL_SET_EVENT_MASK \
328         _IOW('C', 0x03, __u32)
329 #define TEGRA_DC_EXT_CONTROL_GET_CAPABILITIES \
330         _IOR('C', 0x04, struct tegra_dc_ext_control_capabilities)
331
332 #endif /* __TEGRA_DC_EXT_H */