1 /*
2  * Copyright Samsung Electronics Co.,LTD.
3  * Copyright (C) 2017 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef __UAPI_G2D_H__
19 #define __UAPI_G2D_H__
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 #define G2D_SWZ_MASK           0xFFFF
26 
27 #define G2D_SWZ_ARGB           0x3210
28 #define G2D_SWZ_ABGR           0x3012
29 #define G2D_SWZ_xBGR           0x5012
30 #define G2D_SWZ_xRGB           0x5210
31 
32 #define G2D_SWZ_ALPHA_MASK     (0xF << 12)
33 #define G2D_SWZ_ALPHA_ONE      (0x5 << 12)
34 
35 #define G2D_YUVORDER_MASK      (0x3 << 24)
36 
37 #define G2D_YUV_UV             ((1 << 24) | G2D_SWZ_ARGB)
38 #define G2D_YUV_VU             ((0 << 24) | G2D_SWZ_ARGB)
39 #define G2D_YUV_YC             (0 << 25)
40 #define G2D_YUV_CY             (1 << 25)
41 
42 #define G2D_DATAFORMAT_AFBC    (1 << 20)
43 #define G2D_DATAFORMAT_UORDER  (1 << 21)
44 #define G2D_DATAFORMAT_SBWC    (1 << 22)
45 
46 #define G2D_DATAFMT_SHIFT      16
47 #define G2D_DATAFMT_MASK       (0xF << G2D_DATAFMT_SHIFT)
48 
49 #define G2D_DATAFMT_8888       (0 << G2D_DATAFMT_SHIFT)
50 #define G2D_DATAFMT_565        (1 << G2D_DATAFMT_SHIFT)
51 #define G2D_DATAFMT_4444       (2 << G2D_DATAFMT_SHIFT)
52 #define G2D_DATAFMT_888        (3 << G2D_DATAFMT_SHIFT)
53 #define G2D_DATAFMT_1555       (4 << G2D_DATAFMT_SHIFT)
54 #define G2D_DATAFMT_5551       (5 << G2D_DATAFMT_SHIFT)
55 #define G2D_DATAFMT_RGB8_MAX   (5 << G2D_DATAFMT_SHIFT)
56 #define G2D_DATAFMT_8          (6 << G2D_DATAFMT_SHIFT)
57 #define G2D_DATAFMT_RESERVED   (7 << G2D_DATAFMT_SHIFT)
58 #define G2D_DATAFMT_YUV_MIN    (8 << G2D_DATAFMT_SHIFT)
59 #define G2D_DATAFMT_YUV420SP   (8 << G2D_DATAFMT_SHIFT)
60 #define G2D_DATAFMT_YUV420P    (9 << G2D_DATAFMT_SHIFT)
61 #define G2D_DATAFMT_YUV422I    (10 << G2D_DATAFMT_SHIFT)
62 #define G2D_DATAFMT_YUV422SP   (11 << G2D_DATAFMT_SHIFT)
63 #define G2D_DATAFMT_P010_LGCY  (12 << G2D_DATAFMT_SHIFT)
64 #define G2D_DATAFMT_YUV_MAX    (12 << G2D_DATAFMT_SHIFT)
65 #define G2D_DATAFMT_ABGR2101010 (14 << G2D_DATAFMT_SHIFT)
66 
67 #define G2D_FMT_YCBCR_BITDEPTH_SHIFT 28
68 #define G2D_FMT_YCBCR_BITDEPTH_MASK  (0x3 << G2D_FMT_YCBCR_BITDEPTH_SHIFT)
69 #define G2D_FMT_YCBCR_8BIT     (0 << G2D_FMT_YCBCR_BITDEPTH_SHIFT)
70 #define G2D_FMT_YCBCR_10BIT    (1 << G2D_FMT_YCBCR_BITDEPTH_SHIFT)
71 
72 #define G2D_FMT_ARGB8888       (G2D_DATAFMT_8888 | G2D_SWZ_ARGB)
73 #define G2D_FMT_ABGR8888       (G2D_DATAFMT_8888 | G2D_SWZ_ABGR)
74 #define G2D_FMT_XBGR8888       (G2D_DATAFMT_8888 | G2D_SWZ_xBGR)
75 #define G2D_FMT_RGB565         (G2D_DATAFMT_565 | G2D_SWZ_xRGB)
76 #define G2D_FMT_BGR565         (G2D_DATAFMT_565 | G2D_SWZ_xBGR)
77 #define G2D_FMT_RGB888         (G2D_DATAFMT_888 | G2D_SWZ_xRGB)
78 #define G2D_FMT_NV12           (G2D_DATAFMT_YUV420SP | G2D_YUV_UV)
79 #define G2D_FMT_NV21           (G2D_DATAFMT_YUV420SP | G2D_YUV_VU)
80 #define G2D_FMT_YUV420P        (G2D_DATAFMT_YUV420P | G2D_YUV_UV)
81 #define G2D_FMT_YV12           (G2D_DATAFMT_YUV420P | G2D_YUV_VU)
82 #define G2D_FMT_YUYV           (G2D_DATAFMT_YUV422I | G2D_YUV_YC | G2D_YUV_UV)
83 #define G2D_FMT_YVYU           (G2D_DATAFMT_YUV422I | G2D_YUV_YC | G2D_YUV_VU)
84 #define G2D_FMT_UYVY           (G2D_DATAFMT_YUV422I | G2D_YUV_CY | G2D_YUV_UV)
85 #define G2D_FMT_VYUY           (G2D_DATAFMT_YUV422I | G2D_YUV_CY | G2D_YUV_VU)
86 #define G2D_FMT_NV16           (G2D_DATAFMT_YUV422SP | G2D_YUV_UV)
87 #define G2D_FMT_NV61           (G2D_DATAFMT_YUV422SP | G2D_YUV_VU)
88 #define G2D_FMT_NV12_P010_LGCY (G2D_DATAFMT_P010_LGCY | G2D_YUV_UV)
89 #define G2D_FMT_NV21_P010_LGCY (G2D_DATAFMT_P010_LGCY | G2D_YUV_VU)
90 #define G2D_FMT_NV12_P010      (G2D_DATAFMT_YUV420SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_UV)
91 #define G2D_FMT_NV21_P010      (G2D_DATAFMT_YUV420SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_VU)
92 #define G2D_FMT_NV16_P210      (G2D_DATAFMT_YUV422SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_UV)
93 #define G2D_FMT_NV61_P210      (G2D_DATAFMT_YUV422SP | G2D_FMT_YCBCR_10BIT | G2D_YUV_VU)
94 #define G2D_FMT_ABGR2101010    (G2D_DATAFMT_ABGR2101010 | G2D_SWZ_ABGR)
95 #define G2D_FMT_NV12_SBWC      (G2D_FMT_NV12 | G2D_DATAFORMAT_SBWC)
96 #define G2D_FMT_NV21_SBWC      (G2D_FMT_NV21 | G2D_DATAFORMAT_SBWC)
97 #define G2D_FMT_NV12_SBWC_10B  (G2D_FMT_NV12_P010 | G2D_DATAFORMAT_SBWC)
98 #define G2D_FMT_NV21_SBWC_10B  (G2D_FMT_NV21_P010 | G2D_DATAFORMAT_SBWC)
99 
100 #define G2D_YCBCRMODE_DITHER   (1 << 2)
101 
102 #define IS_YUV(fmt) ((((fmt) & G2D_DATAFMT_MASK) >= G2D_DATAFMT_YUV_MIN) && (((fmt) & G2D_DATAFMT_MASK) <= G2D_DATAFMT_YUV_MAX))
103 #define IS_RGB(fmt) ((((fmt) & G2D_DATAFMT_MASK) <= G2D_DATAFMT_RGB8_MAX) || (((fmt) & G2D_DATAFMT_MASK) > G2D_DATAFMT_YUV_MAX))
104 
105 #define G2D_IMGFMT(value) ((value) & \
106             (G2D_DATAFMT_MASK | G2D_YUVORDER_MASK | G2D_SWZ_MASK))
107 
108 #define G2D_MAX_PLANES    4
109 
110 #define G2D_ROTATEDIR_FLIP_SHIFT    4
111 #define G2D_ROTATEDIR_ROT90CCW      (1 << 0)
112 
113 #define G2D_BLEND_NONE    (2 | (2 << 4) | (2 << 8) | (2 << 12) | (1 << 18)) // Ga*Sa*Sc + (1-Sa*Ga)*Dc
114 #define G2D_BLEND_SRCOVER (6 |            (2 << 8) | (2 << 12) | (1 << 18)) // Ga*Sc + (1-Sa*Ga)*Dc
115 #define G2D_BLEND_SRCCOPY (6 |            (1 << 8)                        ) // Ga*Sc
116 
117 #define G2D_LAYERCMD_PREMULT_GLOBALALPHA   (2 << 24)
118 #define G2D_LAYERCMD_PREMULT_ALPHA         (1 << 24)
119 
120 #define G2D_LAYERCMD_ALPHABLEND (1 << 20)
121 #define G2D_LAYERCMD_OPAQUE     (1 << 1)
122 #define G2D_LAYERCMD_VALID      (1 << 0)
123 
124 #define G2D_LAYERSEL_COLORFILL   1
125 
126 #define G2D_LAYER_YCBCRMODE_WIDE (1 << 4)
127 #define G2D_LAYER_YCBCRMODE_OFFX (2 << 8)
128 #define G2D_LAYER_YCBCRMODE_OFFY (2 << 12)
129 
130 #define G2D_SCALECONTROL_BILINEAR 2
131 #define G2D_SCALECONTROL_POLYPHASE 3
132 #define G2D_SCALECONTROL_FILTERCOEF_SHIFT 4
133 #define G2D_SCALEFACTOR_FRACBITS  16
134 
135 #define G2D_LAYER_HDRMODE_DEMULT_ALPHA (1 << 12)
136 
137 struct g2d_reg {
138     uint32_t offset;
139     uint32_t value;
140 };
141 
142 enum g2dsfr_img_register {
143     G2DSFR_IMG_STRIDE,
144     G2DSFR_IMG_COLORMODE,
145     G2DSFR_IMG_LEFT,
146     G2DSFR_IMG_TOP,
147     G2DSFR_IMG_RIGHT,
148     G2DSFR_IMG_BOTTOM,
149     G2DSFR_IMG_WIDTH,
150     G2DSFR_IMG_HEIGHT,
151 
152     G2DSFR_IMG_FIELD_COUNT,
153 };
154 
155 /*
156  * The order of command list should be fixed.
157  * The new command item must be added from the bottom.
158  */
159 enum g2dsfr_src_register {
160     G2DSFR_SRC_COMMAND = G2DSFR_IMG_FIELD_COUNT,
161     G2DSFR_SRC_SELECT,
162     G2DSFR_SRC_ROTATE,
163     G2DSFR_SRC_DSTLEFT,
164     G2DSFR_SRC_DSTTOP,
165     G2DSFR_SRC_DSTRIGHT,
166     G2DSFR_SRC_DSTBOTTOM,
167     G2DSFR_SRC_SCALECONTROL,
168     G2DSFR_SRC_XSCALE,
169     G2DSFR_SRC_YSCALE,
170     G2DSFR_SRC_XPHASE,
171     G2DSFR_SRC_YPHASE,
172     G2DSFR_SRC_COLOR,
173     G2DSFR_SRC_ALPHA,
174     G2DSFR_SRC_BLEND,
175     G2DSFR_SRC_YCBCRMODE,
176     G2DSFR_SRC_HDRMODE,
177     G2DSFR_SRC_Y_HEADER_STRIDE,
178     G2DSFR_SRC_Y_PAYLOAD_STRIDE,
179     G2DSFR_SRC_C_HEADER_STRIDE,
180     G2DSFR_SRC_C_PAYLOAD_STRIDE,
181     G2DSFR_SRC_SBWCINFO,
182 
183     G2DSFR_SRC_FIELD_COUNT
184 };
185 
186 enum g2dsfr_dst_register {
187     G2DSFR_DST_YCBCRMODE = G2DSFR_IMG_FIELD_COUNT,
188 
189     G2DSFR_DST_COMPAT_FIELD_COUNT,
190 
191     G2DSFR_DST_Y_HEADER_STRIDE = G2DSFR_DST_COMPAT_FIELD_COUNT,
192     G2DSFR_DST_Y_PAYLOAD_STRIDE,
193     G2DSFR_DST_C_HEADER_STRIDE,
194     G2DSFR_DST_C_PAYLOAD_STRIDE,
195     G2DSFR_DST_SBWCINFO,
196 
197     G2DSFR_DST_FIELD_COUNT,
198 };
199 
200 #define G2D_MAX_PLANES         4
201 #define G2D_MAX_SFR_COUNT      1024
202 #define G2D_MAX_BUFFERS        4
203 #define G2D_MAX_IMAGES         16
204 #define G2D_MAX_PRIORITY       3
205 #define G2D_MAX_RELEASE_FENCES (G2D_MAX_IMAGES + 1)
206 
207 struct g2d_compat_commands {
208     uint32_t       target[G2DSFR_DST_COMPAT_FIELD_COUNT];
209     uint32_t       *source[G2D_MAX_IMAGES];
210     struct g2d_reg *extra;
211     uint32_t       num_extra_regs;
212 };
213 
214 #define G2D_BUFTYPE_NONE    0
215 #define G2D_BUFTYPE_EMPTY   1
216 #define G2D_BUFTYPE_USERPTR 2
217 #define G2D_BUFTYPE_DMABUF  3
218 
219 #define G2D_BUFTYPE_VALID(type) !(((type) & G2D_BUFTYPE_DMABUF) == 0)
220 
221 struct g2d_buffer {
222     union {
223         void *userptr;
224         struct {
225             int32_t  fd;
226             uint32_t offset;
227         } dmabuf;
228     };
229     uint32_t      length;
230 };
231 
232 #define G2D_LAYERFLAG_ACQUIRE_FENCE (1 << 1)
233 #define G2D_LAYERFLAG_SECURE        (1 << 2)
234 #define G2D_LAYERFLAG_COLORFILL     (1 << 3)
235 #define G2D_LAYERFLAG_MFC_STRIDE    (1 << 4)
236 #define G2D_LAYERFLAG_NO_CACHECLEAN (1 << 16)
237 #define G2D_LAYERFLAG_NO_CACHEINV   (1 << 17)
238 
239 struct g2d_layer {
240     uint32_t          flags;
241     int32_t           fence;
242     uint32_t          buffer_type;
243     uint32_t          num_buffers;
244     struct g2d_buffer buffer[G2D_MAX_BUFFERS];
245 };
246 
247 #define G2D_FLAG_DITHER   (1 << 1)
248 #define G2D_FLAG_NONBLOCK (1 << 2)
249 #define G2D_FLAG_HWFC     (1 << 3)
250 #define G2D_FLAG_APB      (1 << 4)
251 #define G2D_FLAG_ERROR    (1 << 5)
252 
253 struct g2d_compat_task {
254     uint32_t            version;
255     uint32_t            flags;
256     uint32_t            laptime_in_usec;
257     uint32_t            priority;
258     uint32_t            num_source;
259     uint32_t            num_release_fences;
260     int32_t             *release_fence;
261     struct g2d_layer    target;
262     struct g2d_layer    *source;
263     struct g2d_compat_commands commands;
264 };
265 
266 /*
267  * Commands must be flexible because it may change according to H/W changes.
268  * The commands must be written in the promised order as version.
269  */
270 struct g2d_commands {
271     uint32_t       *target;
272     uint32_t       *source[G2D_MAX_IMAGES];
273     struct g2d_reg *extra;
274     uint32_t       num_extra_regs;
275 };
276 
277 struct g2d_task {
278     uint32_t            version;
279     uint32_t            flags;
280     uint32_t            laptime_in_usec;
281     uint32_t            priority;
282     uint32_t            num_source;
283     uint32_t            num_release_fences;
284     int32_t             *release_fence;
285     struct g2d_layer    target;
286     struct g2d_layer    *source;
287     struct g2d_commands commands;
288 };
289 
290 #define G2D_PERF_LAYER_ROTATE     (1 << 0)
291 #define G2D_PERF_LAYER_SCALING    (1 << 1)
292 #define G2D_PERF_LAYER_YUV2P      (1 << 4)
293 #define G2D_PERF_LAYER_SBWC       (1 << 5)
294 #define G2D_PERF_LAYER_RGB_AFBC   (1 << 6)
295 #define G2D_PERF_LAYER_YUV_AFBC   (1 << 7)
296 
297 struct g2d_performance_layer {
298     uint16_t crop_width;
299     uint16_t crop_height;
300     uint16_t window_width;
301     uint16_t window_height;
302     uint32_t layer_attr;
303 };
304 
305 #define G2D_PERF_FRAME_SOLIDCOLORFILL    (1 << 0)
306 
307 struct g2d_performance_frame {
308     struct g2d_performance_layer layer[G2D_MAX_IMAGES];
309     uint32_t bandwidth_read;
310     uint32_t bandwidth_write;
311     uint32_t target_pixelcount;
312     uint32_t frame_rate;
313     uint32_t frame_attr;
314     uint32_t num_layers;
315 };
316 
317 #define G2D_PERF_MAX_FRAMES 4
318 
319 struct g2d_performance {
320     struct g2d_performance_frame frame[G2D_PERF_MAX_FRAMES];
321     uint32_t num_frame;
322     uint32_t reserved;
323 };
324 
325 enum g2d_priority {
326     G2D_LOW_PRIORITY,
327     G2D_MEDIUM_PRIORITY,
328     G2D_DEFAULT_PRIORITY = G2D_MEDIUM_PRIORITY,
329     G2D_HIGH_PRIORITY,
330     G2D_HIGHEST_PRIORITY,
331     G2D_PRIORITY_END
332 };
333 
334 #define G2D_IOC_PROCESS        _IOWR('M', 3, struct g2d_task)
335 #define G2D_IOC_COMPAT_PROCESS _IOWR('M', 4, struct g2d_compat_task)
336 #define G2D_IOC_PRIORITY       _IOR('M', 5, int32_t)
337 #define G2D_IOC_PERFORMANCE    _IOR('M', 6, struct g2d_performance)
338 #define G2D_IOC_VERSION		_IOR('M', 7, uint32_t)
339 
340 #ifdef __cplusplus
341 }
342 #endif
343 
344 #endif /* __UAPI_G2D_H__ */
345