blob: 58951581ebd94d4491f020d9ea69721bac130392 [file] [log] [blame]
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -04001/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040013#include <uapi/drm/drm_fourcc.h>
14
Clarence Ipc475b082016-06-26 09:27:23 -040015#include "sde_kms.h"
16#include "sde_formats.h"
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040017
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040018#define SDE_UBWC_META_MACRO_W_H 16
19#define SDE_UBWC_META_BLOCK_SIZE 256
20#define SDE_MAX_IMG_WIDTH 0x3FFF
21#define SDE_MAX_IMG_HEIGHT 0x3FFF
22
23/**
24 * SDE supported format packing, bpp, and other format
25 * information.
26 * SDE currently only supports interleaved RGB formats
27 * UBWC support for a pixel format is indicated by the flag,
28 * there is additional meta data plane for such formats
29 */
30
31#define INTERLEAVED_RGB_FMT(fmt, a, r, g, b, e0, e1, e2, e3, uc, alpha, \
32bp, flg, fm, np) \
33{ \
34 .base.pixel_format = DRM_FORMAT_ ## fmt, \
35 .fetch_planes = SDE_PLANE_INTERLEAVED, \
36 .alpha_enable = alpha, \
37 .element = { (e0), (e1), (e2), (e3) }, \
38 .bits = { g, b, r, a }, \
39 .chroma_sample = SDE_CHROMA_RGB, \
40 .unpack_align_msb = 0, \
41 .unpack_tight = 1, \
42 .unpack_count = uc, \
43 .bpp = bp, \
44 .fetch_mode = fm, \
45 .flag = flg, \
46 .num_planes = np \
47}
48
49#define INTERLEAVED_YUV_FMT(fmt, a, r, g, b, e0, e1, e2, e3, \
50alpha, chroma, count, bp, flg, fm, np) \
51{ \
52 .base.pixel_format = DRM_FORMAT_ ## fmt, \
53 .fetch_planes = SDE_PLANE_INTERLEAVED, \
54 .alpha_enable = alpha, \
55 .element = { (e0), (e1), (e2), (e3)}, \
56 .bits = { g, b, r, a }, \
57 .chroma_sample = chroma, \
58 .unpack_align_msb = 0, \
59 .unpack_tight = 1, \
60 .unpack_count = count, \
61 .bpp = bp, \
62 .fetch_mode = fm, \
63 .flag = flg, \
64 .num_planes = np \
65}
66
67#define PSEDUO_YUV_FMT(fmt, a, r, g, b, e0, e1, chroma, flg, fm, np) \
68{ \
69 .base.pixel_format = DRM_FORMAT_ ## fmt, \
70 .fetch_planes = SDE_PLANE_PSEUDO_PLANAR, \
71 .alpha_enable = false, \
72 .element = { (e0), (e1), 0, 0 }, \
73 .bits = { g, b, r, a }, \
74 .chroma_sample = chroma, \
75 .unpack_align_msb = 0, \
76 .unpack_tight = 1, \
77 .unpack_count = 2, \
78 .bpp = 2, \
79 .fetch_mode = fm, \
80 .flag = flg, \
81 .num_planes = np \
82}
83
84#define PLANAR_YUV_FMT(fmt, a, r, g, b, e0, e1, e2, alpha, chroma, bp, \
85flg, fm, np) \
86{ \
87 .base.pixel_format = DRM_FORMAT_ ## fmt, \
88 .fetch_planes = SDE_PLANE_PLANAR, \
89 .alpha_enable = alpha, \
90 .element = { (e0), (e1), (e2), 0 }, \
91 .bits = { g, b, r, a }, \
92 .chroma_sample = chroma, \
93 .unpack_align_msb = 0, \
94 .unpack_tight = 1, \
95 .unpack_count = 1, \
96 .bpp = bp, \
97 .fetch_mode = fm, \
98 .flag = flg, \
99 .num_planes = np \
100}
101
102static const struct sde_format sde_format_map[] = {
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400103 INTERLEAVED_RGB_FMT(ARGB8888,
104 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700105 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400106 true, 4, 0,
107 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400108
109 INTERLEAVED_RGB_FMT(ABGR8888,
110 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700111 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400112 true, 4, 0,
113 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400114
115 INTERLEAVED_RGB_FMT(RGBA8888,
116 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700117 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400118 true, 4, 0,
119 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400120
121 INTERLEAVED_RGB_FMT(BGRA8888,
122 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700123 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400124 true, 4, 0,
125 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400126
Alan Kwong3232ca52016-07-29 02:27:47 -0400127 INTERLEAVED_RGB_FMT(BGRX8888,
128 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700129 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Alan Kwong3232ca52016-07-29 02:27:47 -0400130 false, 4, 0,
131 SDE_FETCH_LINEAR, 1),
132
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400133 INTERLEAVED_RGB_FMT(XRGB8888,
134 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700135 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400136 false, 4, 0,
137 SDE_FETCH_LINEAR, 1),
138
139 INTERLEAVED_RGB_FMT(RGBX8888,
140 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700141 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400142 false, 4, 0,
143 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400144
145 INTERLEAVED_RGB_FMT(RGB888,
146 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700147 C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400148 false, 3, 0,
149 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400150
151 INTERLEAVED_RGB_FMT(BGR888,
152 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700153 C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400154 false, 3, 0,
155 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400156
157 INTERLEAVED_RGB_FMT(RGB565,
158 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700159 C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400160 false, 2, 0,
161 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400162
163 INTERLEAVED_RGB_FMT(BGR565,
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400164 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700165 C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400166 false, 2, 0,
167 SDE_FETCH_LINEAR, 1),
168
169 INTERLEAVED_RGB_FMT(ARGB1555,
170 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700171 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400172 true, 2, 0,
173 SDE_FETCH_LINEAR, 1),
174
175 INTERLEAVED_RGB_FMT(ABGR1555,
176 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700177 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400178 true, 2, 0,
179 SDE_FETCH_LINEAR, 1),
180
181 INTERLEAVED_RGB_FMT(RGBA5551,
182 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700183 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400184 true, 2, 0,
185 SDE_FETCH_LINEAR, 1),
186
187 INTERLEAVED_RGB_FMT(BGRA5551,
188 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700189 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400190 true, 2, 0,
191 SDE_FETCH_LINEAR, 1),
192
193 INTERLEAVED_RGB_FMT(XRGB1555,
194 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700195 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400196 false, 2, 0,
197 SDE_FETCH_LINEAR, 1),
198
199 INTERLEAVED_RGB_FMT(XBGR1555,
200 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700201 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400202 false, 2, 0,
203 SDE_FETCH_LINEAR, 1),
204
205 INTERLEAVED_RGB_FMT(RGBX5551,
206 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700207 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400208 false, 2, 0,
209 SDE_FETCH_LINEAR, 1),
210
211 INTERLEAVED_RGB_FMT(BGRX5551,
212 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700213 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400214 false, 2, 0,
215 SDE_FETCH_LINEAR, 1),
216
217 INTERLEAVED_RGB_FMT(ARGB4444,
218 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700219 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400220 true, 2, 0,
221 SDE_FETCH_LINEAR, 1),
222
223 INTERLEAVED_RGB_FMT(ABGR4444,
224 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700225 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400226 true, 2, 0,
227 SDE_FETCH_LINEAR, 1),
228
229 INTERLEAVED_RGB_FMT(RGBA4444,
230 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700231 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400232 true, 2, 0,
233 SDE_FETCH_LINEAR, 1),
234
235 INTERLEAVED_RGB_FMT(BGRA4444,
236 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700237 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400238 true, 2, 0,
239 SDE_FETCH_LINEAR, 1),
240
241 INTERLEAVED_RGB_FMT(XRGB4444,
242 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700243 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400244 false, 2, 0,
245 SDE_FETCH_LINEAR, 1),
246
247 INTERLEAVED_RGB_FMT(XBGR4444,
248 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700249 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400250 false, 2, 0,
251 SDE_FETCH_LINEAR, 1),
252
253 INTERLEAVED_RGB_FMT(RGBX4444,
254 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700255 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400256 false, 2, 0,
257 SDE_FETCH_LINEAR, 1),
258
259 INTERLEAVED_RGB_FMT(BGRX4444,
260 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700261 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400262 false, 2, 0,
263 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400264
265 PSEDUO_YUV_FMT(NV12,
266 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
267 C1_B_Cb, C2_R_Cr,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400268 SDE_CHROMA_420, SDE_FORMAT_FLAG_YUV,
269 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400270
271 PSEDUO_YUV_FMT(NV21,
272 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
273 C2_R_Cr, C1_B_Cb,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400274 SDE_CHROMA_420, SDE_FORMAT_FLAG_YUV,
275 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400276
277 PSEDUO_YUV_FMT(NV16,
278 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
279 C1_B_Cb, C2_R_Cr,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400280 SDE_CHROMA_H2V1, SDE_FORMAT_FLAG_YUV,
281 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400282
283 PSEDUO_YUV_FMT(NV61,
284 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
285 C2_R_Cr, C1_B_Cb,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400286 SDE_CHROMA_H2V1, SDE_FORMAT_FLAG_YUV,
287 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400288
289 INTERLEAVED_YUV_FMT(VYUY,
290 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
291 C2_R_Cr, C0_G_Y, C1_B_Cb, C0_G_Y,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400292 false, SDE_CHROMA_H2V1, 4, 2, SDE_FORMAT_FLAG_YUV,
293 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400294
295 INTERLEAVED_YUV_FMT(UYVY,
296 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
297 C1_B_Cb, C0_G_Y, C2_R_Cr, C0_G_Y,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400298 false, SDE_CHROMA_H2V1, 4, 2, SDE_FORMAT_FLAG_YUV,
299 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400300
301 INTERLEAVED_YUV_FMT(YUYV,
302 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
303 C0_G_Y, C1_B_Cb, C0_G_Y, C2_R_Cr,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400304 false, SDE_CHROMA_H2V1, 4, 2, SDE_FORMAT_FLAG_YUV,
305 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400306
307 INTERLEAVED_YUV_FMT(YVYU,
308 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
309 C0_G_Y, C2_R_Cr, C0_G_Y, C1_B_Cb,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400310 false, SDE_CHROMA_H2V1, 4, 2, SDE_FORMAT_FLAG_YUV,
311 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400312
313 PLANAR_YUV_FMT(YUV420,
314 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700315 C0_G_Y, C1_B_Cb, C2_R_Cr,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400316 false, SDE_CHROMA_420, 1, SDE_FORMAT_FLAG_YUV,
317 SDE_FETCH_LINEAR, 3),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400318
319 PLANAR_YUV_FMT(YVU420,
320 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patel17ec9152016-08-30 17:49:07 -0700321 C0_G_Y, C2_R_Cr, C1_B_Cb,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400322 false, SDE_CHROMA_420, 1, SDE_FORMAT_FLAG_YUV,
323 SDE_FETCH_LINEAR, 3),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400324};
325
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400326/*
327 * UBWC formats table:
328 * This table holds the UBWC formats supported.
329 * If a compression ratio needs to be used for this or any other format,
330 * the data will be passed by user-space.
331 */
332static const struct sde_format sde_format_map_ubwc[] = {
Dhaval Patel17ec9152016-08-30 17:49:07 -0700333 INTERLEAVED_RGB_FMT(RGB565,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400334 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
335 C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
336 false, 2, 0,
337 SDE_FETCH_UBWC, 2),
338
Dhaval Patel17ec9152016-08-30 17:49:07 -0700339 INTERLEAVED_RGB_FMT(RGBA8888,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400340 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
341 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
342 true, 4, 0,
343 SDE_FETCH_UBWC, 2),
344
Dhaval Patel17ec9152016-08-30 17:49:07 -0700345 INTERLEAVED_RGB_FMT(RGBX8888,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400346 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
347 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
348 false, 4, 0,
349 SDE_FETCH_UBWC, 2),
350
351 PSEDUO_YUV_FMT(NV12,
352 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
353 C1_B_Cb, C2_R_Cr,
354 SDE_CHROMA_420, SDE_FORMAT_FLAG_YUV,
355 SDE_FETCH_UBWC, 4),
356};
357
358/* _sde_get_v_h_subsample_rate - Get subsample rates for all formats we support
359 * Note: Not using the drm_format_*_subsampling since we have formats
360 */
361static void _sde_get_v_h_subsample_rate(
362 enum sde_chroma_samp_type chroma_sample,
363 uint32_t *v_sample,
364 uint32_t *h_sample)
365{
Alan Kwongbb27c092016-07-20 16:41:25 -0400366 if (!v_sample || !h_sample)
367 return;
368
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400369 switch (chroma_sample) {
370 case SDE_CHROMA_H2V1:
371 *v_sample = 1;
372 *h_sample = 2;
373 break;
374 case SDE_CHROMA_H1V2:
375 *v_sample = 2;
376 *h_sample = 1;
377 break;
378 case SDE_CHROMA_420:
379 *v_sample = 2;
380 *h_sample = 2;
381 break;
382 default:
383 *v_sample = 1;
384 *h_sample = 1;
385 break;
386 }
387}
388
389static int _sde_format_get_plane_sizes_ubwc(
390 const struct sde_format *fmt,
391 const uint32_t width,
392 const uint32_t height,
393 struct sde_hw_fmt_layout *layout)
394{
395 int i;
396
397 memset(layout, 0, sizeof(struct sde_hw_fmt_layout));
398 layout->format = fmt;
399 layout->width = width;
400 layout->height = height;
401 layout->num_planes = fmt->num_planes;
402
403 if (fmt->base.pixel_format == DRM_FORMAT_NV12) {
404 uint32_t y_stride_alignment, uv_stride_alignment;
405 uint32_t y_height_alignment, uv_height_alignment;
406 uint32_t y_tile_width = 32;
407 uint32_t y_tile_height = 8;
408 uint32_t uv_tile_width = y_tile_width / 2;
409 uint32_t uv_tile_height = y_tile_height;
410 uint32_t y_bpp_numer = 1, y_bpp_denom = 1;
411 uint32_t uv_bpp_numer = 1, uv_bpp_denom = 1;
412
413 y_stride_alignment = 128;
414 uv_stride_alignment = 64;
415 y_height_alignment = 32;
416 uv_height_alignment = 32;
417 y_bpp_numer = 1;
418 uv_bpp_numer = 2;
419 y_bpp_denom = 1;
420 uv_bpp_denom = 1;
421
422 layout->num_planes = 4;
423 /* Y bitstream stride and plane size */
424 layout->plane_pitch[0] = ALIGN(width, y_stride_alignment);
425 layout->plane_pitch[0] = (layout->plane_pitch[0] * y_bpp_numer)
426 / y_bpp_denom;
427 layout->plane_size[0] = ALIGN(layout->plane_pitch[0] *
428 ALIGN(height, y_height_alignment), 4096);
429
430 /* CbCr bitstream stride and plane size */
431 layout->plane_pitch[1] = ALIGN(width / 2, uv_stride_alignment);
432 layout->plane_pitch[1] = (layout->plane_pitch[1] * uv_bpp_numer)
433 / uv_bpp_denom;
434 layout->plane_size[1] = ALIGN(layout->plane_pitch[1] *
435 ALIGN(height / 2, uv_height_alignment), 4096);
436
437 /* Y meta data stride and plane size */
438 layout->plane_pitch[2] = ALIGN(
439 DIV_ROUND_UP(width, y_tile_width), 64);
440 layout->plane_size[2] = ALIGN(layout->plane_pitch[2] *
441 ALIGN(DIV_ROUND_UP(height, y_tile_height), 16), 4096);
442
443 /* CbCr meta data stride and plane size */
444 layout->plane_pitch[3] = ALIGN(
445 DIV_ROUND_UP(width / 2, uv_tile_width), 64);
446 layout->plane_size[3] = ALIGN(layout->plane_pitch[3] *
447 ALIGN(DIV_ROUND_UP(height / 2, uv_tile_height), 16),
448 4096);
449
Dhaval Patel17ec9152016-08-30 17:49:07 -0700450 } else if (fmt->base.pixel_format == DRM_FORMAT_RGBA8888 ||
451 fmt->base.pixel_format == DRM_FORMAT_RGBX8888 ||
452 fmt->base.pixel_format == DRM_FORMAT_RGB565) {
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400453 uint32_t stride_alignment, aligned_bitstream_width;
454
Dhaval Patel17ec9152016-08-30 17:49:07 -0700455 if (fmt->base.pixel_format == DRM_FORMAT_RGB565)
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400456 stride_alignment = 128;
457 else
458 stride_alignment = 64;
459 layout->num_planes = 3;
460
461 /* Nothing in plane[1] */
462
463 /* RGB bitstream stride and plane size */
464 aligned_bitstream_width = ALIGN(width, stride_alignment);
465 layout->plane_pitch[0] = aligned_bitstream_width * fmt->bpp;
466 layout->plane_size[0] = ALIGN(fmt->bpp * aligned_bitstream_width
467 * ALIGN(height, 16), 4096);
468
469 /* RGB meta data stride and plane size */
470 layout->plane_pitch[2] = ALIGN(DIV_ROUND_UP(
471 aligned_bitstream_width, 16), 64);
472 layout->plane_size[2] = ALIGN(layout->plane_pitch[2] *
473 ALIGN(DIV_ROUND_UP(height, 4), 16), 4096);
474 } else {
475 DRM_ERROR("UBWC format not supported for fmt:0x%X\n",
476 fmt->base.pixel_format);
477 return -EINVAL;
478 }
479
480 for (i = 0; i < SDE_MAX_PLANES; i++)
481 layout->total_size += layout->plane_size[i];
482
483 return 0;
484}
485
486static int _sde_format_get_plane_sizes_linear(
487 const struct sde_format *fmt,
488 const uint32_t width,
489 const uint32_t height,
490 struct sde_hw_fmt_layout *layout)
491{
492 int i;
493
494 memset(layout, 0, sizeof(struct sde_hw_fmt_layout));
495 layout->format = fmt;
496 layout->width = width;
497 layout->height = height;
498 layout->num_planes = fmt->num_planes;
499
500 /* Due to memset above, only need to set planes of interest */
501 if (fmt->fetch_planes == SDE_PLANE_INTERLEAVED) {
502 layout->num_planes = 1;
503 layout->plane_size[0] = width * height * layout->format->bpp;
504 layout->plane_pitch[0] = width * layout->format->bpp;
505 } else {
506 uint32_t v_subsample, h_subsample;
507 uint32_t chroma_samp;
508
509 chroma_samp = fmt->chroma_sample;
510 _sde_get_v_h_subsample_rate(chroma_samp, &v_subsample,
511 &h_subsample);
512
513 if (width % h_subsample || height % v_subsample) {
514 DRM_ERROR("mismatch in subsample vs dimensions\n");
515 return -EINVAL;
516 }
517
518 layout->plane_pitch[0] = width;
519 layout->plane_pitch[1] = width / h_subsample;
520 layout->plane_size[0] = layout->plane_pitch[0] * height;
521 layout->plane_size[1] = layout->plane_pitch[1] *
522 (height / v_subsample);
523
524 if (fmt->fetch_planes == SDE_PLANE_PSEUDO_PLANAR) {
525 layout->num_planes = 2;
526 layout->plane_size[1] *= 2;
527 layout->plane_pitch[1] *= 2;
528 } else {
529 /* planar */
530 layout->num_planes = 3;
531 layout->plane_size[2] = layout->plane_size[1];
532 layout->plane_pitch[2] = layout->plane_pitch[1];
533 }
534 }
535
536 for (i = 0; i < SDE_MAX_PLANES; i++)
537 layout->total_size += layout->plane_size[i];
538
539 return 0;
540}
541
542static int _sde_format_get_plane_sizes(
543 const struct sde_format *fmt,
544 const uint32_t w,
545 const uint32_t h,
546 struct sde_hw_fmt_layout *layout)
547{
548 if (!layout || !fmt) {
549 DRM_ERROR("invalid pointer\n");
550 return -EINVAL;
551 }
552
553 if ((w > SDE_MAX_IMG_WIDTH) || (h > SDE_MAX_IMG_HEIGHT)) {
554 DRM_ERROR("image dimensions outside max range\n");
555 return -ERANGE;
556 }
557
558 if (SDE_FORMAT_IS_UBWC(fmt))
559 return _sde_format_get_plane_sizes_ubwc(fmt, w, h, layout);
560
561 return _sde_format_get_plane_sizes_linear(fmt, w, h, layout);
562}
563
564static int _sde_format_populate_addrs_ubwc(
565 int mmu_id,
566 struct drm_framebuffer *fb,
567 struct sde_hw_fmt_layout *layout)
568{
569 uint32_t base_addr;
570
571 if (!fb || !layout) {
572 DRM_ERROR("invalid pointers\n");
573 return -EINVAL;
574 }
575
576 base_addr = msm_framebuffer_iova(fb, mmu_id, 0);
577 if (!base_addr) {
578 DRM_ERROR("failed to retrieve base addr\n");
579 return -EFAULT;
580 }
581
582 /* Per-format logic for verifying active planes */
583 if (SDE_FORMAT_IS_YUV(layout->format)) {
584 /************************************************/
585 /* UBWC ** */
586 /* buffer ** SDE PLANE */
587 /* format ** */
588 /************************************************/
589 /* ------------------- ** -------------------- */
590 /* | Y meta | ** | Y bitstream | */
591 /* | data | ** | plane | */
592 /* ------------------- ** -------------------- */
593 /* | Y bitstream | ** | CbCr bitstream | */
594 /* | data | ** | plane | */
595 /* ------------------- ** -------------------- */
596 /* | Cbcr metadata | ** | Y meta | */
597 /* | data | ** | plane | */
598 /* ------------------- ** -------------------- */
599 /* | CbCr bitstream | ** | CbCr meta | */
600 /* | data | ** | plane | */
601 /* ------------------- ** -------------------- */
602 /************************************************/
603
604 /* configure Y bitstream plane */
605 layout->plane_addr[0] = base_addr + layout->plane_size[2];
606
607 /* configure CbCr bitstream plane */
608 layout->plane_addr[1] = base_addr + layout->plane_size[0]
609 + layout->plane_size[2] + layout->plane_size[3];
610
611 /* configure Y metadata plane */
612 layout->plane_addr[2] = base_addr;
613
614 /* configure CbCr metadata plane */
615 layout->plane_addr[3] = base_addr + layout->plane_size[0]
616 + layout->plane_size[2];
617
618 } else {
619 /************************************************/
620 /* UBWC ** */
621 /* buffer ** SDE PLANE */
622 /* format ** */
623 /************************************************/
624 /* ------------------- ** -------------------- */
625 /* | RGB meta | ** | RGB bitstream | */
626 /* | data | ** | plane | */
627 /* ------------------- ** -------------------- */
628 /* | RGB bitstream | ** | NONE | */
629 /* | data | ** | | */
630 /* ------------------- ** -------------------- */
631 /* ** | RGB meta | */
632 /* ** | plane | */
633 /* ** -------------------- */
634 /************************************************/
635
636 layout->plane_addr[0] = base_addr + layout->plane_size[2];
637 layout->plane_addr[1] = 0;
638 layout->plane_addr[2] = base_addr;
639 layout->plane_addr[3] = 0;
640 }
641
642 return 0;
643}
644
645static int _sde_format_populate_addrs_linear(
646 int mmu_id,
647 struct drm_framebuffer *fb,
648 struct sde_hw_fmt_layout *layout)
649{
650 unsigned int i;
651
652 /* Can now check the pitches given vs pitches expected */
653 for (i = 0; i < layout->num_planes; ++i) {
654 if (layout->plane_pitch[i] != fb->pitches[i]) {
655 DRM_ERROR("plane %u expected pitch %u, fb %u\n",
656 i, layout->plane_pitch[i], fb->pitches[i]);
657 return -EINVAL;
658 }
659 }
660
661 /* Populate addresses for simple formats here */
662 for (i = 0; i < layout->num_planes; ++i) {
663 layout->plane_addr[i] = msm_framebuffer_iova(fb, mmu_id, i);
664 if (!layout->plane_addr[i]) {
665 DRM_ERROR("failed to retrieve base addr\n");
666 return -EFAULT;
667 }
668 }
669
670 return 0;
671}
672
673int sde_format_populate_layout(
674 int mmu_id,
675 struct drm_framebuffer *fb,
676 struct sde_hw_fmt_layout *layout)
677{
Clarence Ipb6eb2362016-09-08 16:18:13 -0400678 uint32_t plane_addr[SDE_MAX_PLANES];
679 int i, ret;
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400680
681 if (!fb || !layout) {
682 DRM_ERROR("invalid arguments\n");
683 return -EINVAL;
684 }
685
686 if ((fb->width > SDE_MAX_IMG_WIDTH) ||
687 (fb->height > SDE_MAX_IMG_HEIGHT)) {
688 DRM_ERROR("image dimensions outside max range\n");
689 return -ERANGE;
690 }
691
692 layout->format = to_sde_format(msm_framebuffer_format(fb));
693
694 /* Populate the plane sizes etc via get_format */
695 ret = _sde_format_get_plane_sizes(layout->format, fb->width, fb->height,
696 layout);
697 if (ret)
698 return ret;
699
Clarence Ipb6eb2362016-09-08 16:18:13 -0400700 for (i = 0; i < SDE_MAX_PLANES; ++i)
701 plane_addr[i] = layout->plane_addr[i];
702
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400703 /* Populate the addresses given the fb */
704 if (SDE_FORMAT_IS_UBWC(layout->format))
705 ret = _sde_format_populate_addrs_ubwc(mmu_id, fb, layout);
706 else
707 ret = _sde_format_populate_addrs_linear(mmu_id, fb, layout);
708
Clarence Ipb6eb2362016-09-08 16:18:13 -0400709 /* check if anything changed */
710 if (!ret && !memcmp(plane_addr, layout->plane_addr, sizeof(plane_addr)))
711 ret = -EAGAIN;
712
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400713 return ret;
714}
715
Alan Kwongbb27c092016-07-20 16:41:25 -0400716static void _sde_format_calc_offset_linear(struct sde_hw_fmt_layout *source,
717 u32 x, u32 y)
718{
719 if ((x == 0) && (y == 0))
720 return;
721
722 source->plane_addr[0] += y * source->plane_pitch[0];
723
724 if (source->num_planes == 1) {
725 source->plane_addr[0] += x * source->format->bpp;
726 } else {
727 uint32_t xoff, yoff;
728 uint32_t v_subsample = 1;
729 uint32_t h_subsample = 1;
730
731 _sde_get_v_h_subsample_rate(source->format->chroma_sample,
732 &v_subsample, &h_subsample);
733
734 xoff = x / h_subsample;
735 yoff = y / v_subsample;
736
737 source->plane_addr[0] += x;
738 source->plane_addr[1] += xoff +
739 (yoff * source->plane_pitch[1]);
740 if (source->num_planes == 2) /* pseudo planar */
741 source->plane_addr[1] += xoff;
742 else /* planar */
743 source->plane_addr[2] += xoff +
744 (yoff * source->plane_pitch[2]);
745 }
746}
747
748int sde_format_populate_layout_with_roi(
749 int mmu_id,
750 struct drm_framebuffer *fb,
751 struct sde_rect *roi,
752 struct sde_hw_fmt_layout *layout)
753{
754 int ret;
755
756 ret = sde_format_populate_layout(mmu_id, fb, layout);
757 if (ret || !roi)
758 return ret;
759
760 if (!roi->w || !roi->h || (roi->x + roi->w > fb->width) ||
761 (roi->y + roi->h > fb->height)) {
762 DRM_ERROR("invalid roi=[%d,%d,%d,%d], fb=[%u,%u]\n",
763 roi->x, roi->y, roi->w, roi->h,
764 fb->width, fb->height);
765 ret = -EINVAL;
766 } else if (SDE_FORMAT_IS_LINEAR(layout->format)) {
767 _sde_format_calc_offset_linear(layout, roi->x, roi->y);
768 layout->width = roi->w;
769 layout->height = roi->h;
770 } else if (roi->x || roi->y || (roi->w != fb->width) ||
771 (roi->h != fb->height)) {
772 DRM_ERROR("non-linear layout with roi not supported\n");
773 ret = -EINVAL;
774 }
775
776 return ret;
777}
778
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400779int sde_format_check_modified_format(
780 const struct msm_kms *kms,
781 const struct msm_format *msm_fmt,
782 const struct drm_mode_fb_cmd2 *cmd,
783 struct drm_gem_object **bos)
784{
785 int ret, i, num_base_fmt_planes;
786 const struct sde_format *fmt;
787 struct sde_hw_fmt_layout layout;
788 uint32_t bos_total_size = 0;
789
790 if (!msm_fmt || !cmd || !bos) {
791 DRM_ERROR("invalid arguments\n");
792 return -EINVAL;
793 }
794
795 fmt = to_sde_format(msm_fmt);
796 num_base_fmt_planes = drm_format_num_planes(fmt->base.pixel_format);
797
798 ret = _sde_format_get_plane_sizes(fmt, cmd->width, cmd->height,
799 &layout);
800 if (ret)
801 return ret;
802
803 for (i = 0; i < num_base_fmt_planes; i++) {
804 if (!bos[i]) {
805 DRM_ERROR("invalid handle for plane %d\n", i);
806 return -EINVAL;
807 }
808 bos_total_size += bos[i]->size;
809 }
810
811 if (bos_total_size < layout.total_size) {
812 DRM_ERROR("buffers total size too small %u expected %u\n",
813 bos_total_size, layout.total_size);
814 return -EINVAL;
815 }
816
817 return 0;
818}
819
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400820const struct sde_format *sde_get_sde_format_ext(
821 const uint32_t format,
822 const uint64_t *modifiers,
823 const uint32_t modifiers_len)
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400824{
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400825 uint32_t i = 0;
826 uint64_t mod0 = 0;
827 const struct sde_format *fmt = NULL;
828 const struct sde_format *map = NULL;
829 ssize_t map_size = 0;
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400830
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400831 /*
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400832 * Currently only support exactly zero or one modifier.
833 * All planes used must specify the same modifier.
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400834 */
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400835 if (modifiers_len && !modifiers) {
836 DRM_ERROR("invalid modifiers array\n");
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400837 return NULL;
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400838 } else if (modifiers && modifiers_len && modifiers[0]) {
839 mod0 = modifiers[0];
840 DBG("plane format modifier 0x%llX", mod0);
841 for (i = 1; i < modifiers_len; i++) {
842 if (modifiers[i] != mod0) {
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400843 DRM_ERROR("bad fmt mod 0x%llX on plane %d\n",
844 modifiers[i], i);
845 return NULL;
846 }
847 }
848 }
849
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400850 switch (mod0) {
851 case 0:
852 map = sde_format_map;
853 map_size = ARRAY_SIZE(sde_format_map);
854 break;
855 case DRM_FORMAT_MOD_QCOM_COMPRESSED:
856 map = sde_format_map_ubwc;
857 map_size = ARRAY_SIZE(sde_format_map_ubwc);
858 DBG("found fmt 0x%X DRM_FORMAT_MOD_QCOM_COMPRESSED", format);
859 break;
860 default:
861 DRM_ERROR("unsupported format modifier %llX\n", mod0);
862 return NULL;
863 }
864
865 for (i = 0; i < map_size; i++) {
866 if (format == map[i].base.pixel_format) {
867 fmt = &map[i];
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400868 break;
869 }
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400870 }
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400871
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400872 if (fmt == NULL)
873 DRM_ERROR("unsupported fmt 0x%X modifier 0x%llX\n",
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400874 format, mod0);
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400875 else
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400876 DBG("fmt %s mod 0x%llX ubwc %d yuv %d",
877 drm_get_format_name(format), mod0,
878 SDE_FORMAT_IS_UBWC(fmt),
879 SDE_FORMAT_IS_YUV(fmt));
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400880
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400881 return fmt;
882}
883
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400884const struct msm_format *sde_get_msm_format(
885 struct msm_kms *kms,
886 const uint32_t format,
887 const uint64_t *modifiers,
888 const uint32_t modifiers_len)
889{
890 const struct sde_format *fmt = sde_get_sde_format_ext(format,
891 modifiers, modifiers_len);
892 if (fmt)
893 return &fmt->base;
894 return NULL;
895}
896
Clarence Ipea3d6262016-07-15 16:20:11 -0400897uint32_t sde_populate_formats(
898 const struct sde_format_extended *format_list,
899 uint32_t *pixel_formats,
900 uint64_t *pixel_modifiers,
901 uint32_t pixel_formats_max)
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400902{
Clarence Ipea3d6262016-07-15 16:20:11 -0400903 uint32_t i, fourcc_format;
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400904
Clarence Ipea3d6262016-07-15 16:20:11 -0400905 if (!format_list || !pixel_formats)
906 return 0;
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400907
Clarence Ipea3d6262016-07-15 16:20:11 -0400908 for (i = 0, fourcc_format = 0;
909 format_list->fourcc_format && i < pixel_formats_max;
910 ++format_list) {
911 /* verify if listed format is in sde_format_map? */
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400912
Clarence Ipea3d6262016-07-15 16:20:11 -0400913 /* optionally return modified formats */
914 if (pixel_modifiers) {
915 /* assume same modifier for all fb planes */
916 pixel_formats[i] = format_list->fourcc_format;
917 pixel_modifiers[i++] = format_list->modifier;
918 } else {
919 /* assume base formats grouped together */
920 if (fourcc_format != format_list->fourcc_format) {
921 fourcc_format = format_list->fourcc_format;
922 pixel_formats[i++] = fourcc_format;
923 }
924 }
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400925 }
926
927 return i;
928}