Linux-libre 3.14.42-gnu
[librecmc/linux-libre.git] / include / uapi / drm / exynos_drm.h
1 /* exynos_drm.h
2  *
3  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4  * Authors:
5  *      Inki Dae <inki.dae@samsung.com>
6  *      Joonyoung Shim <jy0922.shim@samsung.com>
7  *      Seung-Woo Kim <sw0312.kim@samsung.com>
8  *
9  * This program is free software; you can redistribute  it and/or modify it
10  * under  the terms of  the GNU General  Public License as published by the
11  * Free Software Foundation;  either version 2 of the  License, or (at your
12  * option) any later version.
13  */
14
15 #ifndef _UAPI_EXYNOS_DRM_H_
16 #define _UAPI_EXYNOS_DRM_H_
17
18 #include <drm/drm.h>
19
20 /**
21  * User-desired buffer creation information structure.
22  *
23  * @size: user-desired memory allocation size.
24  *      - this size value would be page-aligned internally.
25  * @flags: user request for setting memory type or cache attributes.
26  * @handle: returned a handle to created gem object.
27  *      - this handle will be set by gem module of kernel side.
28  */
29 struct drm_exynos_gem_create {
30         uint64_t size;
31         unsigned int flags;
32         unsigned int handle;
33 };
34
35 /**
36  * A structure for getting buffer offset.
37  *
38  * @handle: a pointer to gem object created.
39  * @pad: just padding to be 64-bit aligned.
40  * @offset: relatived offset value of the memory region allocated.
41  *      - this value should be set by user.
42  */
43 struct drm_exynos_gem_map_off {
44         unsigned int handle;
45         unsigned int pad;
46         uint64_t offset;
47 };
48
49 /**
50  * A structure for mapping buffer.
51  *
52  * @handle: a handle to gem object created.
53  * @pad: just padding to be 64-bit aligned.
54  * @size: memory size to be mapped.
55  * @mapped: having user virtual address mmaped.
56  *      - this variable would be filled by exynos gem module
57  *      of kernel side with user virtual address which is allocated
58  *      by do_mmap().
59  */
60 struct drm_exynos_gem_mmap {
61         unsigned int handle;
62         unsigned int pad;
63         uint64_t size;
64         uint64_t mapped;
65 };
66
67 /**
68  * A structure to gem information.
69  *
70  * @handle: a handle to gem object created.
71  * @flags: flag value including memory type and cache attribute and
72  *      this value would be set by driver.
73  * @size: size to memory region allocated by gem and this size would
74  *      be set by driver.
75  */
76 struct drm_exynos_gem_info {
77         unsigned int handle;
78         unsigned int flags;
79         uint64_t size;
80 };
81
82 /**
83  * A structure for user connection request of virtual display.
84  *
85  * @connection: indicate whether doing connetion or not by user.
86  * @extensions: if this value is 1 then the vidi driver would need additional
87  *      128bytes edid data.
88  * @edid: the edid data pointer from user side.
89  */
90 struct drm_exynos_vidi_connection {
91         unsigned int connection;
92         unsigned int extensions;
93         uint64_t edid;
94 };
95
96 /* memory type definitions. */
97 enum e_drm_exynos_gem_mem_type {
98         /* Physically Continuous memory and used as default. */
99         EXYNOS_BO_CONTIG        = 0 << 0,
100         /* Physically Non-Continuous memory. */
101         EXYNOS_BO_NONCONTIG     = 1 << 0,
102         /* non-cachable mapping and used as default. */
103         EXYNOS_BO_NONCACHABLE   = 0 << 1,
104         /* cachable mapping. */
105         EXYNOS_BO_CACHABLE      = 1 << 1,
106         /* write-combine mapping. */
107         EXYNOS_BO_WC            = 1 << 2,
108         EXYNOS_BO_MASK          = EXYNOS_BO_NONCONTIG | EXYNOS_BO_CACHABLE |
109                                         EXYNOS_BO_WC
110 };
111
112 struct drm_exynos_g2d_get_ver {
113         __u32   major;
114         __u32   minor;
115 };
116
117 struct drm_exynos_g2d_cmd {
118         __u32   offset;
119         __u32   data;
120 };
121
122 enum drm_exynos_g2d_buf_type {
123         G2D_BUF_USERPTR = 1 << 31,
124 };
125
126 enum drm_exynos_g2d_event_type {
127         G2D_EVENT_NOT,
128         G2D_EVENT_NONSTOP,
129         G2D_EVENT_STOP,         /* not yet */
130 };
131
132 struct drm_exynos_g2d_userptr {
133         unsigned long userptr;
134         unsigned long size;
135 };
136
137 struct drm_exynos_g2d_set_cmdlist {
138         __u64                                   cmd;
139         __u64                                   cmd_buf;
140         __u32                                   cmd_nr;
141         __u32                                   cmd_buf_nr;
142
143         /* for g2d event */
144         __u64                                   event_type;
145         __u64                                   user_data;
146 };
147
148 struct drm_exynos_g2d_exec {
149         __u64                                   async;
150 };
151
152 enum drm_exynos_ops_id {
153         EXYNOS_DRM_OPS_SRC,
154         EXYNOS_DRM_OPS_DST,
155         EXYNOS_DRM_OPS_MAX,
156 };
157
158 struct drm_exynos_sz {
159         __u32   hsize;
160         __u32   vsize;
161 };
162
163 struct drm_exynos_pos {
164         __u32   x;
165         __u32   y;
166         __u32   w;
167         __u32   h;
168 };
169
170 enum drm_exynos_flip {
171         EXYNOS_DRM_FLIP_NONE = (0 << 0),
172         EXYNOS_DRM_FLIP_VERTICAL = (1 << 0),
173         EXYNOS_DRM_FLIP_HORIZONTAL = (1 << 1),
174         EXYNOS_DRM_FLIP_BOTH = EXYNOS_DRM_FLIP_VERTICAL |
175                         EXYNOS_DRM_FLIP_HORIZONTAL,
176 };
177
178 enum drm_exynos_degree {
179         EXYNOS_DRM_DEGREE_0,
180         EXYNOS_DRM_DEGREE_90,
181         EXYNOS_DRM_DEGREE_180,
182         EXYNOS_DRM_DEGREE_270,
183 };
184
185 enum drm_exynos_planer {
186         EXYNOS_DRM_PLANAR_Y,
187         EXYNOS_DRM_PLANAR_CB,
188         EXYNOS_DRM_PLANAR_CR,
189         EXYNOS_DRM_PLANAR_MAX,
190 };
191
192 /**
193  * A structure for ipp supported property list.
194  *
195  * @version: version of this structure.
196  * @ipp_id: id of ipp driver.
197  * @count: count of ipp driver.
198  * @writeback: flag of writeback supporting.
199  * @flip: flag of flip supporting.
200  * @degree: flag of degree information.
201  * @csc: flag of csc supporting.
202  * @crop: flag of crop supporting.
203  * @scale: flag of scale supporting.
204  * @refresh_min: min hz of refresh.
205  * @refresh_max: max hz of refresh.
206  * @crop_min: crop min resolution.
207  * @crop_max: crop max resolution.
208  * @scale_min: scale min resolution.
209  * @scale_max: scale max resolution.
210  */
211 struct drm_exynos_ipp_prop_list {
212         __u32   version;
213         __u32   ipp_id;
214         __u32   count;
215         __u32   writeback;
216         __u32   flip;
217         __u32   degree;
218         __u32   csc;
219         __u32   crop;
220         __u32   scale;
221         __u32   refresh_min;
222         __u32   refresh_max;
223         __u32   reserved;
224         struct drm_exynos_sz    crop_min;
225         struct drm_exynos_sz    crop_max;
226         struct drm_exynos_sz    scale_min;
227         struct drm_exynos_sz    scale_max;
228 };
229
230 /**
231  * A structure for ipp config.
232  *
233  * @ops_id: property of operation directions.
234  * @flip: property of mirror, flip.
235  * @degree: property of rotation degree.
236  * @fmt: property of image format.
237  * @sz: property of image size.
238  * @pos: property of image position(src-cropped,dst-scaler).
239  */
240 struct drm_exynos_ipp_config {
241         enum drm_exynos_ops_id ops_id;
242         enum drm_exynos_flip    flip;
243         enum drm_exynos_degree  degree;
244         __u32   fmt;
245         struct drm_exynos_sz    sz;
246         struct drm_exynos_pos   pos;
247 };
248
249 enum drm_exynos_ipp_cmd {
250         IPP_CMD_NONE,
251         IPP_CMD_M2M,
252         IPP_CMD_WB,
253         IPP_CMD_OUTPUT,
254         IPP_CMD_MAX,
255 };
256
257 /**
258  * A structure for ipp property.
259  *
260  * @config: source, destination config.
261  * @cmd: definition of command.
262  * @ipp_id: id of ipp driver.
263  * @prop_id: id of property.
264  * @refresh_rate: refresh rate.
265  */
266 struct drm_exynos_ipp_property {
267         struct drm_exynos_ipp_config config[EXYNOS_DRM_OPS_MAX];
268         enum drm_exynos_ipp_cmd cmd;
269         __u32   ipp_id;
270         __u32   prop_id;
271         __u32   refresh_rate;
272 };
273
274 enum drm_exynos_ipp_buf_type {
275         IPP_BUF_ENQUEUE,
276         IPP_BUF_DEQUEUE,
277 };
278
279 /**
280  * A structure for ipp buffer operations.
281  *
282  * @ops_id: operation directions.
283  * @buf_type: definition of buffer.
284  * @prop_id: id of property.
285  * @buf_id: id of buffer.
286  * @handle: Y, Cb, Cr each planar handle.
287  * @user_data: user data.
288  */
289 struct drm_exynos_ipp_queue_buf {
290         enum drm_exynos_ops_id  ops_id;
291         enum drm_exynos_ipp_buf_type    buf_type;
292         __u32   prop_id;
293         __u32   buf_id;
294         __u32   handle[EXYNOS_DRM_PLANAR_MAX];
295         __u32   reserved;
296         __u64   user_data;
297 };
298
299 enum drm_exynos_ipp_ctrl {
300         IPP_CTRL_PLAY,
301         IPP_CTRL_STOP,
302         IPP_CTRL_PAUSE,
303         IPP_CTRL_RESUME,
304         IPP_CTRL_MAX,
305 };
306
307 /**
308  * A structure for ipp start/stop operations.
309  *
310  * @prop_id: id of property.
311  * @ctrl: definition of control.
312  */
313 struct drm_exynos_ipp_cmd_ctrl {
314         __u32   prop_id;
315         enum drm_exynos_ipp_ctrl        ctrl;
316 };
317
318 #define DRM_EXYNOS_GEM_CREATE           0x00
319 #define DRM_EXYNOS_GEM_MAP_OFFSET       0x01
320 #define DRM_EXYNOS_GEM_MMAP             0x02
321 /* Reserved 0x03 ~ 0x05 for exynos specific gem ioctl */
322 #define DRM_EXYNOS_GEM_GET              0x04
323 #define DRM_EXYNOS_VIDI_CONNECTION      0x07
324
325 /* G2D */
326 #define DRM_EXYNOS_G2D_GET_VER          0x20
327 #define DRM_EXYNOS_G2D_SET_CMDLIST      0x21
328 #define DRM_EXYNOS_G2D_EXEC             0x22
329
330 /* IPP - Image Post Processing */
331 #define DRM_EXYNOS_IPP_GET_PROPERTY     0x30
332 #define DRM_EXYNOS_IPP_SET_PROPERTY     0x31
333 #define DRM_EXYNOS_IPP_QUEUE_BUF        0x32
334 #define DRM_EXYNOS_IPP_CMD_CTRL 0x33
335
336 #define DRM_IOCTL_EXYNOS_GEM_CREATE             DRM_IOWR(DRM_COMMAND_BASE + \
337                 DRM_EXYNOS_GEM_CREATE, struct drm_exynos_gem_create)
338
339 #define DRM_IOCTL_EXYNOS_GEM_MAP_OFFSET DRM_IOWR(DRM_COMMAND_BASE + \
340                 DRM_EXYNOS_GEM_MAP_OFFSET, struct drm_exynos_gem_map_off)
341
342 #define DRM_IOCTL_EXYNOS_GEM_MMAP       DRM_IOWR(DRM_COMMAND_BASE + \
343                 DRM_EXYNOS_GEM_MMAP, struct drm_exynos_gem_mmap)
344
345 #define DRM_IOCTL_EXYNOS_GEM_GET        DRM_IOWR(DRM_COMMAND_BASE + \
346                 DRM_EXYNOS_GEM_GET,     struct drm_exynos_gem_info)
347
348 #define DRM_IOCTL_EXYNOS_VIDI_CONNECTION        DRM_IOWR(DRM_COMMAND_BASE + \
349                 DRM_EXYNOS_VIDI_CONNECTION, struct drm_exynos_vidi_connection)
350
351 #define DRM_IOCTL_EXYNOS_G2D_GET_VER            DRM_IOWR(DRM_COMMAND_BASE + \
352                 DRM_EXYNOS_G2D_GET_VER, struct drm_exynos_g2d_get_ver)
353 #define DRM_IOCTL_EXYNOS_G2D_SET_CMDLIST        DRM_IOWR(DRM_COMMAND_BASE + \
354                 DRM_EXYNOS_G2D_SET_CMDLIST, struct drm_exynos_g2d_set_cmdlist)
355 #define DRM_IOCTL_EXYNOS_G2D_EXEC               DRM_IOWR(DRM_COMMAND_BASE + \
356                 DRM_EXYNOS_G2D_EXEC, struct drm_exynos_g2d_exec)
357
358 #define DRM_IOCTL_EXYNOS_IPP_GET_PROPERTY       DRM_IOWR(DRM_COMMAND_BASE + \
359                 DRM_EXYNOS_IPP_GET_PROPERTY, struct drm_exynos_ipp_prop_list)
360 #define DRM_IOCTL_EXYNOS_IPP_SET_PROPERTY       DRM_IOWR(DRM_COMMAND_BASE + \
361                 DRM_EXYNOS_IPP_SET_PROPERTY, struct drm_exynos_ipp_property)
362 #define DRM_IOCTL_EXYNOS_IPP_QUEUE_BUF  DRM_IOWR(DRM_COMMAND_BASE + \
363                 DRM_EXYNOS_IPP_QUEUE_BUF, struct drm_exynos_ipp_queue_buf)
364 #define DRM_IOCTL_EXYNOS_IPP_CMD_CTRL           DRM_IOWR(DRM_COMMAND_BASE + \
365                 DRM_EXYNOS_IPP_CMD_CTRL, struct drm_exynos_ipp_cmd_ctrl)
366
367 /* EXYNOS specific events */
368 #define DRM_EXYNOS_G2D_EVENT            0x80000000
369 #define DRM_EXYNOS_IPP_EVENT            0x80000001
370
371 struct drm_exynos_g2d_event {
372         struct drm_event        base;
373         __u64                   user_data;
374         __u32                   tv_sec;
375         __u32                   tv_usec;
376         __u32                   cmdlist_no;
377         __u32                   reserved;
378 };
379
380 struct drm_exynos_ipp_event {
381         struct drm_event        base;
382         __u64                   user_data;
383         __u32                   tv_sec;
384         __u32                   tv_usec;
385         __u32                   prop_id;
386         __u32                   reserved;
387         __u32                   buf_id[EXYNOS_DRM_OPS_MAX];
388 };
389
390 #endif /* _UAPI_EXYNOS_DRM_H_ */