blob: 3acf4c9819de1a7d40bc042cfe7f84b46e9c6ab6 [file] [log] [blame]
abeykunadfec292016-08-26 10:48:09 -04001/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -04002 *
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
Alan Kwong4fc006e2017-01-29 18:19:34 -080013#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
14
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040015#include <uapi/drm/drm_fourcc.h>
abeykunadfec292016-08-26 10:48:09 -040016#include <uapi/media/msm_media_info.h>
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040017
Clarence Ipc475b082016-06-26 09:27:23 -040018#include "sde_kms.h"
19#include "sde_formats.h"
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040020
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040021#define SDE_UBWC_META_MACRO_W_H 16
22#define SDE_UBWC_META_BLOCK_SIZE 256
abeykunadfec292016-08-26 10:48:09 -040023#define SDE_UBWC_PLANE_SIZE_ALIGNMENT 4096
24
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040025#define SDE_MAX_IMG_WIDTH 0x3FFF
26#define SDE_MAX_IMG_HEIGHT 0x3FFF
27
28/**
29 * SDE supported format packing, bpp, and other format
30 * information.
31 * SDE currently only supports interleaved RGB formats
32 * UBWC support for a pixel format is indicated by the flag,
33 * there is additional meta data plane for such formats
34 */
35
36#define INTERLEAVED_RGB_FMT(fmt, a, r, g, b, e0, e1, e2, e3, uc, alpha, \
37bp, flg, fm, np) \
38{ \
39 .base.pixel_format = DRM_FORMAT_ ## fmt, \
40 .fetch_planes = SDE_PLANE_INTERLEAVED, \
41 .alpha_enable = alpha, \
42 .element = { (e0), (e1), (e2), (e3) }, \
43 .bits = { g, b, r, a }, \
44 .chroma_sample = SDE_CHROMA_RGB, \
45 .unpack_align_msb = 0, \
46 .unpack_tight = 1, \
47 .unpack_count = uc, \
48 .bpp = bp, \
49 .fetch_mode = fm, \
abeykun2997c812016-10-04 11:34:15 -040050 .flag = {(flg)}, \
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040051 .num_planes = np \
52}
53
54#define INTERLEAVED_YUV_FMT(fmt, a, r, g, b, e0, e1, e2, e3, \
55alpha, chroma, count, bp, flg, fm, np) \
56{ \
57 .base.pixel_format = DRM_FORMAT_ ## fmt, \
58 .fetch_planes = SDE_PLANE_INTERLEAVED, \
59 .alpha_enable = alpha, \
60 .element = { (e0), (e1), (e2), (e3)}, \
61 .bits = { g, b, r, a }, \
62 .chroma_sample = chroma, \
63 .unpack_align_msb = 0, \
64 .unpack_tight = 1, \
65 .unpack_count = count, \
66 .bpp = bp, \
67 .fetch_mode = fm, \
abeykun2997c812016-10-04 11:34:15 -040068 .flag = {(flg)}, \
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040069 .num_planes = np \
70}
71
abeykun5ed42e12016-08-24 17:09:26 -040072#define PSEUDO_YUV_FMT(fmt, a, r, g, b, e0, e1, chroma, flg, fm, np) \
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040073{ \
74 .base.pixel_format = DRM_FORMAT_ ## fmt, \
75 .fetch_planes = SDE_PLANE_PSEUDO_PLANAR, \
76 .alpha_enable = false, \
77 .element = { (e0), (e1), 0, 0 }, \
78 .bits = { g, b, r, a }, \
79 .chroma_sample = chroma, \
80 .unpack_align_msb = 0, \
81 .unpack_tight = 1, \
82 .unpack_count = 2, \
83 .bpp = 2, \
84 .fetch_mode = fm, \
abeykun2997c812016-10-04 11:34:15 -040085 .flag = {(flg)}, \
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -040086 .num_planes = np \
87}
88
abeykunadfec292016-08-26 10:48:09 -040089#define PSEUDO_YUV_FMT_LOOSE(fmt, a, r, g, b, e0, e1, chroma, flg, fm, np)\
90{ \
91 .base.pixel_format = DRM_FORMAT_ ## fmt, \
92 .fetch_planes = SDE_PLANE_PSEUDO_PLANAR, \
93 .alpha_enable = false, \
94 .element = { (e0), (e1), 0, 0 }, \
95 .bits = { g, b, r, a }, \
96 .chroma_sample = chroma, \
97 .unpack_align_msb = 1, \
98 .unpack_tight = 0, \
99 .unpack_count = 2, \
100 .bpp = 2, \
101 .fetch_mode = fm, \
abeykun2997c812016-10-04 11:34:15 -0400102 .flag = {(flg)}, \
abeykunadfec292016-08-26 10:48:09 -0400103 .num_planes = np \
104}
105
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400106#define PLANAR_YUV_FMT(fmt, a, r, g, b, e0, e1, e2, alpha, chroma, bp, \
107flg, fm, np) \
108{ \
109 .base.pixel_format = DRM_FORMAT_ ## fmt, \
110 .fetch_planes = SDE_PLANE_PLANAR, \
111 .alpha_enable = alpha, \
112 .element = { (e0), (e1), (e2), 0 }, \
113 .bits = { g, b, r, a }, \
114 .chroma_sample = chroma, \
115 .unpack_align_msb = 0, \
116 .unpack_tight = 1, \
117 .unpack_count = 1, \
118 .bpp = bp, \
119 .fetch_mode = fm, \
abeykun2997c812016-10-04 11:34:15 -0400120 .flag = {(flg)}, \
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400121 .num_planes = np \
122}
123
abeykunadfec292016-08-26 10:48:09 -0400124/*
125 * struct sde_media_color_map - maps drm format to media format
126 * @format: DRM base pixel format
127 * @color: Media API color related to DRM format
128 */
129struct sde_media_color_map {
130 uint32_t format;
131 uint32_t color;
132};
133
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400134static const struct sde_format sde_format_map[] = {
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400135 INTERLEAVED_RGB_FMT(ARGB8888,
136 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700137 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400138 true, 4, 0,
139 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400140
141 INTERLEAVED_RGB_FMT(ABGR8888,
142 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700143 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400144 true, 4, 0,
145 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400146
Narendra Muppalla88ad7262016-10-31 18:14:21 -0700147 INTERLEAVED_RGB_FMT(XBGR8888,
148 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700149 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Narendra Muppalla88ad7262016-10-31 18:14:21 -0700150 true, 4, 0,
151 SDE_FETCH_LINEAR, 1),
152
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400153 INTERLEAVED_RGB_FMT(RGBA8888,
154 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700155 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400156 true, 4, 0,
157 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400158
159 INTERLEAVED_RGB_FMT(BGRA8888,
160 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700161 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400162 true, 4, 0,
163 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400164
Alan Kwong3232ca52016-07-29 02:27:47 -0400165 INTERLEAVED_RGB_FMT(BGRX8888,
166 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700167 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Alan Kwong3232ca52016-07-29 02:27:47 -0400168 false, 4, 0,
169 SDE_FETCH_LINEAR, 1),
170
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400171 INTERLEAVED_RGB_FMT(XRGB8888,
172 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700173 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400174 false, 4, 0,
175 SDE_FETCH_LINEAR, 1),
176
177 INTERLEAVED_RGB_FMT(RGBX8888,
178 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700179 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400180 false, 4, 0,
181 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400182
183 INTERLEAVED_RGB_FMT(RGB888,
184 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700185 C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400186 false, 3, 0,
187 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400188
189 INTERLEAVED_RGB_FMT(BGR888,
190 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700191 C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400192 false, 3, 0,
193 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400194
195 INTERLEAVED_RGB_FMT(RGB565,
196 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700197 C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400198 false, 2, 0,
199 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400200
201 INTERLEAVED_RGB_FMT(BGR565,
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400202 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700203 C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400204 false, 2, 0,
205 SDE_FETCH_LINEAR, 1),
206
207 INTERLEAVED_RGB_FMT(ARGB1555,
208 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700209 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400210 true, 2, 0,
211 SDE_FETCH_LINEAR, 1),
212
213 INTERLEAVED_RGB_FMT(ABGR1555,
214 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700215 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400216 true, 2, 0,
217 SDE_FETCH_LINEAR, 1),
218
219 INTERLEAVED_RGB_FMT(RGBA5551,
220 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700221 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400222 true, 2, 0,
223 SDE_FETCH_LINEAR, 1),
224
225 INTERLEAVED_RGB_FMT(BGRA5551,
226 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700227 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400228 true, 2, 0,
229 SDE_FETCH_LINEAR, 1),
230
231 INTERLEAVED_RGB_FMT(XRGB1555,
232 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700233 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400234 false, 2, 0,
235 SDE_FETCH_LINEAR, 1),
236
237 INTERLEAVED_RGB_FMT(XBGR1555,
238 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700239 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400240 false, 2, 0,
241 SDE_FETCH_LINEAR, 1),
242
243 INTERLEAVED_RGB_FMT(RGBX5551,
244 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700245 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400246 false, 2, 0,
247 SDE_FETCH_LINEAR, 1),
248
249 INTERLEAVED_RGB_FMT(BGRX5551,
250 COLOR_ALPHA_1BIT, COLOR_5BIT, COLOR_5BIT, COLOR_5BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700251 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400252 false, 2, 0,
253 SDE_FETCH_LINEAR, 1),
254
255 INTERLEAVED_RGB_FMT(ARGB4444,
256 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700257 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400258 true, 2, 0,
259 SDE_FETCH_LINEAR, 1),
260
261 INTERLEAVED_RGB_FMT(ABGR4444,
262 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700263 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400264 true, 2, 0,
265 SDE_FETCH_LINEAR, 1),
266
267 INTERLEAVED_RGB_FMT(RGBA4444,
268 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700269 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400270 true, 2, 0,
271 SDE_FETCH_LINEAR, 1),
272
273 INTERLEAVED_RGB_FMT(BGRA4444,
274 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700275 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400276 true, 2, 0,
277 SDE_FETCH_LINEAR, 1),
278
279 INTERLEAVED_RGB_FMT(XRGB4444,
280 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700281 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400282 false, 2, 0,
283 SDE_FETCH_LINEAR, 1),
284
285 INTERLEAVED_RGB_FMT(XBGR4444,
286 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700287 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400288 false, 2, 0,
289 SDE_FETCH_LINEAR, 1),
290
291 INTERLEAVED_RGB_FMT(RGBX4444,
292 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700293 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400294 false, 2, 0,
295 SDE_FETCH_LINEAR, 1),
296
297 INTERLEAVED_RGB_FMT(BGRX4444,
298 COLOR_ALPHA_4BIT, COLOR_4BIT, COLOR_4BIT, COLOR_4BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700299 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400300 false, 2, 0,
301 SDE_FETCH_LINEAR, 1),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400302
abeykun5ed42e12016-08-24 17:09:26 -0400303 INTERLEAVED_RGB_FMT(BGRA1010102,
304 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700305 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
abeykun5ed42e12016-08-24 17:09:26 -0400306 true, 4, SDE_FORMAT_FLAG_DX,
307 SDE_FETCH_LINEAR, 1),
308
309 INTERLEAVED_RGB_FMT(RGBA1010102,
310 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700311 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
abeykun5ed42e12016-08-24 17:09:26 -0400312 true, 4, SDE_FORMAT_FLAG_DX,
313 SDE_FETCH_LINEAR, 1),
314
315 INTERLEAVED_RGB_FMT(ABGR2101010,
316 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700317 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
abeykun5ed42e12016-08-24 17:09:26 -0400318 true, 4, SDE_FORMAT_FLAG_DX,
319 SDE_FETCH_LINEAR, 1),
320
321 INTERLEAVED_RGB_FMT(ARGB2101010,
322 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700323 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
abeykun5ed42e12016-08-24 17:09:26 -0400324 true, 4, SDE_FORMAT_FLAG_DX,
325 SDE_FETCH_LINEAR, 1),
326
327 INTERLEAVED_RGB_FMT(XRGB2101010,
328 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700329 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
abeykun5ed42e12016-08-24 17:09:26 -0400330 false, 4, SDE_FORMAT_FLAG_DX,
331 SDE_FETCH_LINEAR, 1),
332
333 INTERLEAVED_RGB_FMT(BGRX1010102,
334 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700335 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
abeykun5ed42e12016-08-24 17:09:26 -0400336 false, 4, SDE_FORMAT_FLAG_DX,
337 SDE_FETCH_LINEAR, 1),
338
339 INTERLEAVED_RGB_FMT(XBGR2101010,
340 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700341 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
abeykun5ed42e12016-08-24 17:09:26 -0400342 false, 4, SDE_FORMAT_FLAG_DX,
343 SDE_FETCH_LINEAR, 1),
344
345 INTERLEAVED_RGB_FMT(RGBX1010102,
346 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Dhaval Patelda476e12017-03-23 12:33:14 -0700347 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
abeykun5ed42e12016-08-24 17:09:26 -0400348 false, 4, SDE_FORMAT_FLAG_DX,
349 SDE_FETCH_LINEAR, 1),
350
351 PSEUDO_YUV_FMT(NV12,
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400352 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
353 C1_B_Cb, C2_R_Cr,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400354 SDE_CHROMA_420, SDE_FORMAT_FLAG_YUV,
355 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400356
abeykun5ed42e12016-08-24 17:09:26 -0400357 PSEUDO_YUV_FMT(NV21,
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400358 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
359 C2_R_Cr, C1_B_Cb,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400360 SDE_CHROMA_420, SDE_FORMAT_FLAG_YUV,
361 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400362
abeykun5ed42e12016-08-24 17:09:26 -0400363 PSEUDO_YUV_FMT(NV16,
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400364 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
365 C1_B_Cb, C2_R_Cr,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400366 SDE_CHROMA_H2V1, SDE_FORMAT_FLAG_YUV,
367 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400368
abeykun5ed42e12016-08-24 17:09:26 -0400369 PSEUDO_YUV_FMT(NV61,
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400370 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
371 C2_R_Cr, C1_B_Cb,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400372 SDE_CHROMA_H2V1, SDE_FORMAT_FLAG_YUV,
373 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400374
375 INTERLEAVED_YUV_FMT(VYUY,
376 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
377 C2_R_Cr, C0_G_Y, C1_B_Cb, C0_G_Y,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400378 false, SDE_CHROMA_H2V1, 4, 2, SDE_FORMAT_FLAG_YUV,
379 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400380
381 INTERLEAVED_YUV_FMT(UYVY,
382 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
383 C1_B_Cb, C0_G_Y, C2_R_Cr, C0_G_Y,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400384 false, SDE_CHROMA_H2V1, 4, 2, SDE_FORMAT_FLAG_YUV,
385 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400386
387 INTERLEAVED_YUV_FMT(YUYV,
388 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
389 C0_G_Y, C1_B_Cb, C0_G_Y, C2_R_Cr,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400390 false, SDE_CHROMA_H2V1, 4, 2, SDE_FORMAT_FLAG_YUV,
391 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400392
393 INTERLEAVED_YUV_FMT(YVYU,
394 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
395 C0_G_Y, C2_R_Cr, C0_G_Y, C1_B_Cb,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400396 false, SDE_CHROMA_H2V1, 4, 2, SDE_FORMAT_FLAG_YUV,
397 SDE_FETCH_LINEAR, 2),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400398
399 PLANAR_YUV_FMT(YUV420,
400 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Lloyd Atkinson51944c52017-02-10 11:22:47 -0800401 C2_R_Cr, C1_B_Cb, C0_G_Y,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400402 false, SDE_CHROMA_420, 1, SDE_FORMAT_FLAG_YUV,
403 SDE_FETCH_LINEAR, 3),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400404
405 PLANAR_YUV_FMT(YVU420,
406 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Lloyd Atkinson51944c52017-02-10 11:22:47 -0800407 C1_B_Cb, C2_R_Cr, C0_G_Y,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400408 false, SDE_CHROMA_420, 1, SDE_FORMAT_FLAG_YUV,
409 SDE_FETCH_LINEAR, 3),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400410};
411
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400412/*
Alan Kwong4fc006e2017-01-29 18:19:34 -0800413 * A5x tile formats tables:
414 * These tables hold the A5x tile formats supported.
415 */
416static const struct sde_format sde_format_map_tile[] = {
417 INTERLEAVED_RGB_FMT(ARGB8888,
418 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
419 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
420 true, 4, 0,
421 SDE_FETCH_UBWC, 1),
422
423 INTERLEAVED_RGB_FMT(ABGR8888,
424 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
425 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
426 true, 4, 0,
427 SDE_FETCH_UBWC, 1),
428
429 INTERLEAVED_RGB_FMT(RGBA8888,
430 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
431 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
432 true, 4, 0,
433 SDE_FETCH_UBWC, 1),
434
435 INTERLEAVED_RGB_FMT(BGRA8888,
436 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
437 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
438 true, 4, 0,
439 SDE_FETCH_UBWC, 1),
440
441 INTERLEAVED_RGB_FMT(BGRX8888,
442 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
443 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
444 false, 4, 0,
445 SDE_FETCH_UBWC, 1),
446
447 INTERLEAVED_RGB_FMT(XRGB8888,
448 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
449 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
450 false, 4, 0,
451 SDE_FETCH_UBWC, 1),
452
453 INTERLEAVED_RGB_FMT(RGBX8888,
454 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
455 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
456 false, 4, 0,
457 SDE_FETCH_UBWC, 1),
458
459 PSEUDO_YUV_FMT(NV12,
460 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
461 C1_B_Cb, C2_R_Cr,
462 SDE_CHROMA_420, SDE_FORMAT_FLAG_YUV,
463 SDE_FETCH_UBWC, 2),
464
465 PSEUDO_YUV_FMT(NV21,
466 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
467 C2_R_Cr, C1_B_Cb,
468 SDE_CHROMA_420, SDE_FORMAT_FLAG_YUV,
469 SDE_FETCH_UBWC, 2),
470};
471
472static const struct sde_format sde_format_map_p010_tile[] = {
473 PSEUDO_YUV_FMT_LOOSE(NV12,
474 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
475 C1_B_Cb, C2_R_Cr,
476 SDE_CHROMA_420, (SDE_FORMAT_FLAG_YUV | SDE_FORMAT_FLAG_DX),
477 SDE_FETCH_UBWC, 2),
478};
479
480static const struct sde_format sde_format_map_tp10_tile[] = {
481 PSEUDO_YUV_FMT(NV12,
482 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
483 C1_B_Cb, C2_R_Cr,
484 SDE_CHROMA_420, (SDE_FORMAT_FLAG_YUV | SDE_FORMAT_FLAG_DX),
485 SDE_FETCH_UBWC, 2),
486};
487
488/*
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400489 * UBWC formats table:
490 * This table holds the UBWC formats supported.
491 * If a compression ratio needs to be used for this or any other format,
492 * the data will be passed by user-space.
493 */
494static const struct sde_format sde_format_map_ubwc[] = {
Dhaval Patelda476e12017-03-23 12:33:14 -0700495 INTERLEAVED_RGB_FMT(BGR565,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400496 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
497 C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
Alan Kwong4fc006e2017-01-29 18:19:34 -0800498 false, 2, SDE_FORMAT_FLAG_COMPRESSED,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400499 SDE_FETCH_UBWC, 2),
500
Dhaval Patelda476e12017-03-23 12:33:14 -0700501 INTERLEAVED_RGB_FMT(ABGR8888,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400502 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
503 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Alan Kwong4fc006e2017-01-29 18:19:34 -0800504 true, 4, SDE_FORMAT_FLAG_COMPRESSED,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400505 SDE_FETCH_UBWC, 2),
506
Dhaval Patelda476e12017-03-23 12:33:14 -0700507 INTERLEAVED_RGB_FMT(XBGR8888,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400508 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
509 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Alan Kwong4fc006e2017-01-29 18:19:34 -0800510 false, 4, SDE_FORMAT_FLAG_COMPRESSED,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400511 SDE_FETCH_UBWC, 2),
512
Dhaval Patelda476e12017-03-23 12:33:14 -0700513 INTERLEAVED_RGB_FMT(ABGR2101010,
abeykun5ed42e12016-08-24 17:09:26 -0400514 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
515 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Alan Kwong4fc006e2017-01-29 18:19:34 -0800516 true, 4, SDE_FORMAT_FLAG_DX | SDE_FORMAT_FLAG_COMPRESSED,
abeykun5ed42e12016-08-24 17:09:26 -0400517 SDE_FETCH_UBWC, 2),
518
Dhaval Patelda476e12017-03-23 12:33:14 -0700519 INTERLEAVED_RGB_FMT(XBGR2101010,
abeykun5ed42e12016-08-24 17:09:26 -0400520 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
521 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Alan Kwong4fc006e2017-01-29 18:19:34 -0800522 true, 4, SDE_FORMAT_FLAG_DX | SDE_FORMAT_FLAG_COMPRESSED,
abeykun5ed42e12016-08-24 17:09:26 -0400523 SDE_FETCH_UBWC, 2),
524
525 PSEUDO_YUV_FMT(NV12,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400526 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
527 C1_B_Cb, C2_R_Cr,
Alan Kwong4fc006e2017-01-29 18:19:34 -0800528 SDE_CHROMA_420, SDE_FORMAT_FLAG_YUV |
529 SDE_FORMAT_FLAG_COMPRESSED,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400530 SDE_FETCH_UBWC, 4),
531};
532
abeykunadfec292016-08-26 10:48:09 -0400533static const struct sde_format sde_format_map_p010[] = {
534 PSEUDO_YUV_FMT_LOOSE(NV12,
535 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
536 C1_B_Cb, C2_R_Cr,
537 SDE_CHROMA_420, (SDE_FORMAT_FLAG_YUV | SDE_FORMAT_FLAG_DX),
538 SDE_FETCH_LINEAR, 2),
539};
540
541static const struct sde_format sde_format_map_p010_ubwc[] = {
542 PSEUDO_YUV_FMT_LOOSE(NV12,
543 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
544 C1_B_Cb, C2_R_Cr,
Alan Kwong4fc006e2017-01-29 18:19:34 -0800545 SDE_CHROMA_420, (SDE_FORMAT_FLAG_YUV | SDE_FORMAT_FLAG_DX |
546 SDE_FORMAT_FLAG_COMPRESSED),
abeykunadfec292016-08-26 10:48:09 -0400547 SDE_FETCH_UBWC, 4),
548};
549
abeykun1d4ff032016-08-26 11:31:44 -0400550static const struct sde_format sde_format_map_tp10_ubwc[] = {
551 PSEUDO_YUV_FMT(NV12,
552 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
553 C1_B_Cb, C2_R_Cr,
Alan Kwong4fc006e2017-01-29 18:19:34 -0800554 SDE_CHROMA_420, (SDE_FORMAT_FLAG_YUV | SDE_FORMAT_FLAG_DX |
555 SDE_FORMAT_FLAG_COMPRESSED),
abeykun1d4ff032016-08-26 11:31:44 -0400556 SDE_FETCH_UBWC, 4),
557};
558
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400559/* _sde_get_v_h_subsample_rate - Get subsample rates for all formats we support
560 * Note: Not using the drm_format_*_subsampling since we have formats
561 */
562static void _sde_get_v_h_subsample_rate(
563 enum sde_chroma_samp_type chroma_sample,
564 uint32_t *v_sample,
565 uint32_t *h_sample)
566{
Alan Kwongbb27c092016-07-20 16:41:25 -0400567 if (!v_sample || !h_sample)
568 return;
569
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400570 switch (chroma_sample) {
571 case SDE_CHROMA_H2V1:
572 *v_sample = 1;
573 *h_sample = 2;
574 break;
575 case SDE_CHROMA_H1V2:
576 *v_sample = 2;
577 *h_sample = 1;
578 break;
579 case SDE_CHROMA_420:
580 *v_sample = 2;
581 *h_sample = 2;
582 break;
583 default:
584 *v_sample = 1;
585 *h_sample = 1;
586 break;
587 }
588}
589
abeykunadfec292016-08-26 10:48:09 -0400590static int _sde_format_get_media_color_ubwc(const struct sde_format *fmt)
591{
592 static const struct sde_media_color_map sde_media_ubwc_map[] = {
Dhaval Patelda476e12017-03-23 12:33:14 -0700593 {DRM_FORMAT_ABGR8888, COLOR_FMT_RGBA8888_UBWC},
594 {DRM_FORMAT_XBGR8888, COLOR_FMT_RGBA8888_UBWC},
595 {DRM_FORMAT_ABGR2101010, COLOR_FMT_RGBA1010102_UBWC},
596 {DRM_FORMAT_XBGR2101010, COLOR_FMT_RGBA1010102_UBWC},
597 {DRM_FORMAT_BGR565, COLOR_FMT_RGB565_UBWC},
abeykunadfec292016-08-26 10:48:09 -0400598 };
599 int color_fmt = -1;
600 int i;
601
602 if (fmt->base.pixel_format == DRM_FORMAT_NV12) {
603 if (SDE_FORMAT_IS_DX(fmt)) {
604 if (fmt->unpack_tight)
605 color_fmt = COLOR_FMT_NV12_BPP10_UBWC;
606 else
607 color_fmt = COLOR_FMT_P010_UBWC;
608 } else
609 color_fmt = COLOR_FMT_NV12_UBWC;
610 return color_fmt;
611 }
612
613 for (i = 0; i < ARRAY_SIZE(sde_media_ubwc_map); ++i)
614 if (fmt->base.pixel_format == sde_media_ubwc_map[i].format) {
615 color_fmt = sde_media_ubwc_map[i].color;
616 break;
617 }
618 return color_fmt;
619}
620
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400621static int _sde_format_get_plane_sizes_ubwc(
622 const struct sde_format *fmt,
623 const uint32_t width,
624 const uint32_t height,
625 struct sde_hw_fmt_layout *layout)
626{
627 int i;
abeykunadfec292016-08-26 10:48:09 -0400628 int color;
Alan Kwong4fc006e2017-01-29 18:19:34 -0800629 bool meta = SDE_FORMAT_IS_UBWC(fmt);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400630
631 memset(layout, 0, sizeof(struct sde_hw_fmt_layout));
632 layout->format = fmt;
633 layout->width = width;
634 layout->height = height;
635 layout->num_planes = fmt->num_planes;
636
abeykunadfec292016-08-26 10:48:09 -0400637 color = _sde_format_get_media_color_ubwc(fmt);
638 if (color < 0) {
Dhaval Patel6c666622017-03-21 23:02:59 -0700639 DRM_ERROR("UBWC format not supported for fmt: %4.4s\n",
640 (char *)&fmt->base.pixel_format);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400641 return -EINVAL;
642 }
643
abeykunadfec292016-08-26 10:48:09 -0400644 if (SDE_FORMAT_IS_YUV(layout->format)) {
645 uint32_t y_sclines, uv_sclines;
646 uint32_t y_meta_scanlines = 0;
647 uint32_t uv_meta_scanlines = 0;
648
Alan Kwong4fc006e2017-01-29 18:19:34 -0800649 layout->num_planes = 2;
abeykunadfec292016-08-26 10:48:09 -0400650 layout->plane_pitch[0] = VENUS_Y_STRIDE(color, width);
651 y_sclines = VENUS_Y_SCANLINES(color, height);
652 layout->plane_size[0] = MSM_MEDIA_ALIGN(layout->plane_pitch[0] *
653 y_sclines, SDE_UBWC_PLANE_SIZE_ALIGNMENT);
654
655 layout->plane_pitch[1] = VENUS_UV_STRIDE(color, width);
656 uv_sclines = VENUS_UV_SCANLINES(color, height);
657 layout->plane_size[1] = MSM_MEDIA_ALIGN(layout->plane_pitch[1] *
658 uv_sclines, SDE_UBWC_PLANE_SIZE_ALIGNMENT);
659
Alan Kwong4fc006e2017-01-29 18:19:34 -0800660 if (!meta)
661 goto done;
662
663 layout->num_planes += 2;
abeykunadfec292016-08-26 10:48:09 -0400664 layout->plane_pitch[2] = VENUS_Y_META_STRIDE(color, width);
665 y_meta_scanlines = VENUS_Y_META_SCANLINES(color, height);
666 layout->plane_size[2] = MSM_MEDIA_ALIGN(layout->plane_pitch[2] *
667 y_meta_scanlines, SDE_UBWC_PLANE_SIZE_ALIGNMENT);
668
669 layout->plane_pitch[3] = VENUS_UV_META_STRIDE(color, width);
670 uv_meta_scanlines = VENUS_UV_META_SCANLINES(color, height);
671 layout->plane_size[3] = MSM_MEDIA_ALIGN(layout->plane_pitch[3] *
672 uv_meta_scanlines, SDE_UBWC_PLANE_SIZE_ALIGNMENT);
673
674 } else {
675 uint32_t rgb_scanlines, rgb_meta_scanlines;
676
Alan Kwong4fc006e2017-01-29 18:19:34 -0800677 layout->num_planes = 1;
abeykunadfec292016-08-26 10:48:09 -0400678
679 layout->plane_pitch[0] = VENUS_RGB_STRIDE(color, width);
680 rgb_scanlines = VENUS_RGB_SCANLINES(color, height);
681 layout->plane_size[0] = MSM_MEDIA_ALIGN(layout->plane_pitch[0] *
682 rgb_scanlines, SDE_UBWC_PLANE_SIZE_ALIGNMENT);
683
Alan Kwong4fc006e2017-01-29 18:19:34 -0800684 if (!meta)
685 goto done;
686 layout->num_planes += 2;
abeykunadfec292016-08-26 10:48:09 -0400687 layout->plane_pitch[2] = VENUS_RGB_META_STRIDE(color, width);
688 rgb_meta_scanlines = VENUS_RGB_META_SCANLINES(color, height);
689 layout->plane_size[2] = MSM_MEDIA_ALIGN(layout->plane_pitch[2] *
690 rgb_meta_scanlines, SDE_UBWC_PLANE_SIZE_ALIGNMENT);
691 }
692
Alan Kwong4fc006e2017-01-29 18:19:34 -0800693done:
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400694 for (i = 0; i < SDE_MAX_PLANES; i++)
695 layout->total_size += layout->plane_size[i];
696
697 return 0;
698}
699
700static int _sde_format_get_plane_sizes_linear(
701 const struct sde_format *fmt,
702 const uint32_t width,
703 const uint32_t height,
Narendra Muppalla58a64e22017-07-24 10:54:47 -0700704 struct sde_hw_fmt_layout *layout,
705 const uint32_t *pitches)
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400706{
707 int i;
708
709 memset(layout, 0, sizeof(struct sde_hw_fmt_layout));
710 layout->format = fmt;
711 layout->width = width;
712 layout->height = height;
713 layout->num_planes = fmt->num_planes;
714
715 /* Due to memset above, only need to set planes of interest */
716 if (fmt->fetch_planes == SDE_PLANE_INTERLEAVED) {
717 layout->num_planes = 1;
718 layout->plane_size[0] = width * height * layout->format->bpp;
719 layout->plane_pitch[0] = width * layout->format->bpp;
720 } else {
721 uint32_t v_subsample, h_subsample;
722 uint32_t chroma_samp;
abeykunadfec292016-08-26 10:48:09 -0400723 uint32_t bpp = 1;
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400724
725 chroma_samp = fmt->chroma_sample;
726 _sde_get_v_h_subsample_rate(chroma_samp, &v_subsample,
727 &h_subsample);
728
729 if (width % h_subsample || height % v_subsample) {
730 DRM_ERROR("mismatch in subsample vs dimensions\n");
731 return -EINVAL;
732 }
733
abeykunadfec292016-08-26 10:48:09 -0400734 if ((fmt->base.pixel_format == DRM_FORMAT_NV12) &&
735 (SDE_FORMAT_IS_DX(fmt)))
736 bpp = 2;
737 layout->plane_pitch[0] = width * bpp;
738 layout->plane_pitch[1] = layout->plane_pitch[0] / h_subsample;
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400739 layout->plane_size[0] = layout->plane_pitch[0] * height;
740 layout->plane_size[1] = layout->plane_pitch[1] *
741 (height / v_subsample);
742
743 if (fmt->fetch_planes == SDE_PLANE_PSEUDO_PLANAR) {
744 layout->num_planes = 2;
745 layout->plane_size[1] *= 2;
746 layout->plane_pitch[1] *= 2;
747 } else {
748 /* planar */
749 layout->num_planes = 3;
750 layout->plane_size[2] = layout->plane_size[1];
751 layout->plane_pitch[2] = layout->plane_pitch[1];
752 }
753 }
754
Narendra Muppalla58a64e22017-07-24 10:54:47 -0700755 /*
756 * linear format: allow user allocated pitches if they are greater than
757 * the requirement.
758 * ubwc format: pitch values are computed uniformly across
759 * all the components based on ubwc specifications.
760 */
761 for (i = 0; i < layout->num_planes && i < SDE_MAX_PLANES; ++i) {
762 if (pitches && layout->plane_pitch[i] < pitches[i])
763 layout->plane_pitch[i] = pitches[i];
764 }
765
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400766 for (i = 0; i < SDE_MAX_PLANES; i++)
767 layout->total_size += layout->plane_size[i];
768
769 return 0;
770}
771
Alan Kwong4fc006e2017-01-29 18:19:34 -0800772int sde_format_get_plane_sizes(
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400773 const struct sde_format *fmt,
774 const uint32_t w,
775 const uint32_t h,
Narendra Muppalla58a64e22017-07-24 10:54:47 -0700776 struct sde_hw_fmt_layout *layout,
777 const uint32_t *pitches)
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400778{
779 if (!layout || !fmt) {
780 DRM_ERROR("invalid pointer\n");
781 return -EINVAL;
782 }
783
784 if ((w > SDE_MAX_IMG_WIDTH) || (h > SDE_MAX_IMG_HEIGHT)) {
785 DRM_ERROR("image dimensions outside max range\n");
786 return -ERANGE;
787 }
788
Alan Kwong4fc006e2017-01-29 18:19:34 -0800789 if (SDE_FORMAT_IS_UBWC(fmt) || SDE_FORMAT_IS_TILE(fmt))
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400790 return _sde_format_get_plane_sizes_ubwc(fmt, w, h, layout);
791
Narendra Muppalla58a64e22017-07-24 10:54:47 -0700792 return _sde_format_get_plane_sizes_linear(fmt, w, h, layout, pitches);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400793}
794
Alan Kwong4aacd532017-02-04 18:51:33 -0800795int sde_format_get_block_size(const struct sde_format *fmt,
796 uint32_t *w, uint32_t *h)
797{
798 if (!fmt || !w || !h) {
799 DRM_ERROR("invalid pointer\n");
800 return -EINVAL;
801 }
802
803 /* TP10 is 96x96 and all others are 128x128 */
804 if (SDE_FORMAT_IS_YUV(fmt) && SDE_FORMAT_IS_DX(fmt) &&
805 (fmt->num_planes == 2) && fmt->unpack_tight)
806 *w = *h = 96;
807 else
808 *w = *h = 128;
809
810 return 0;
811}
812
Clarence Ip9c65f7b2017-03-20 06:48:15 -0700813uint32_t sde_format_get_framebuffer_size(
814 const uint32_t format,
815 const uint32_t width,
816 const uint32_t height,
Narendra Muppalla58a64e22017-07-24 10:54:47 -0700817 const uint32_t *pitches,
Clarence Ip9c65f7b2017-03-20 06:48:15 -0700818 const uint64_t *modifiers,
819 const uint32_t modifiers_len)
820{
821 const struct sde_format *fmt;
822 struct sde_hw_fmt_layout layout;
823
824 fmt = sde_get_sde_format_ext(format, modifiers, modifiers_len);
825 if (!fmt)
826 return 0;
827
Narendra Muppalla58a64e22017-07-24 10:54:47 -0700828 if (!pitches)
829 return -EINVAL;
830
831 if (sde_format_get_plane_sizes(fmt, width, height, &layout, pitches))
Clarence Ip9c65f7b2017-03-20 06:48:15 -0700832 layout.total_size = 0;
833
834 return layout.total_size;
835}
836
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400837static int _sde_format_populate_addrs_ubwc(
Jordan Croused8e96522017-02-13 10:14:16 -0700838 struct msm_gem_address_space *aspace,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400839 struct drm_framebuffer *fb,
840 struct sde_hw_fmt_layout *layout)
841{
842 uint32_t base_addr;
Alan Kwong4fc006e2017-01-29 18:19:34 -0800843 bool meta;
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400844
845 if (!fb || !layout) {
846 DRM_ERROR("invalid pointers\n");
847 return -EINVAL;
848 }
849
Jordan Croused8e96522017-02-13 10:14:16 -0700850 base_addr = msm_framebuffer_iova(fb, aspace, 0);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400851 if (!base_addr) {
852 DRM_ERROR("failed to retrieve base addr\n");
853 return -EFAULT;
854 }
855
Alan Kwong4fc006e2017-01-29 18:19:34 -0800856 meta = SDE_FORMAT_IS_UBWC(layout->format);
857
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400858 /* Per-format logic for verifying active planes */
859 if (SDE_FORMAT_IS_YUV(layout->format)) {
860 /************************************************/
861 /* UBWC ** */
862 /* buffer ** SDE PLANE */
863 /* format ** */
864 /************************************************/
865 /* ------------------- ** -------------------- */
866 /* | Y meta | ** | Y bitstream | */
867 /* | data | ** | plane | */
868 /* ------------------- ** -------------------- */
869 /* | Y bitstream | ** | CbCr bitstream | */
870 /* | data | ** | plane | */
871 /* ------------------- ** -------------------- */
872 /* | Cbcr metadata | ** | Y meta | */
873 /* | data | ** | plane | */
874 /* ------------------- ** -------------------- */
875 /* | CbCr bitstream | ** | CbCr meta | */
876 /* | data | ** | plane | */
877 /* ------------------- ** -------------------- */
878 /************************************************/
879
880 /* configure Y bitstream plane */
881 layout->plane_addr[0] = base_addr + layout->plane_size[2];
882
883 /* configure CbCr bitstream plane */
884 layout->plane_addr[1] = base_addr + layout->plane_size[0]
885 + layout->plane_size[2] + layout->plane_size[3];
886
Alan Kwong4fc006e2017-01-29 18:19:34 -0800887 if (!meta)
888 goto done;
889
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400890 /* configure Y metadata plane */
891 layout->plane_addr[2] = base_addr;
892
893 /* configure CbCr metadata plane */
894 layout->plane_addr[3] = base_addr + layout->plane_size[0]
895 + layout->plane_size[2];
896
897 } else {
898 /************************************************/
899 /* UBWC ** */
900 /* buffer ** SDE PLANE */
901 /* format ** */
902 /************************************************/
903 /* ------------------- ** -------------------- */
904 /* | RGB meta | ** | RGB bitstream | */
905 /* | data | ** | plane | */
906 /* ------------------- ** -------------------- */
907 /* | RGB bitstream | ** | NONE | */
908 /* | data | ** | | */
909 /* ------------------- ** -------------------- */
910 /* ** | RGB meta | */
911 /* ** | plane | */
912 /* ** -------------------- */
913 /************************************************/
914
915 layout->plane_addr[0] = base_addr + layout->plane_size[2];
916 layout->plane_addr[1] = 0;
Alan Kwong4fc006e2017-01-29 18:19:34 -0800917
918 if (!meta)
919 goto done;
920
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400921 layout->plane_addr[2] = base_addr;
922 layout->plane_addr[3] = 0;
923 }
Alan Kwong4fc006e2017-01-29 18:19:34 -0800924done:
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400925 return 0;
926}
927
928static int _sde_format_populate_addrs_linear(
Jordan Croused8e96522017-02-13 10:14:16 -0700929 struct msm_gem_address_space *aspace,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400930 struct drm_framebuffer *fb,
931 struct sde_hw_fmt_layout *layout)
932{
933 unsigned int i;
934
935 /* Can now check the pitches given vs pitches expected */
936 for (i = 0; i < layout->num_planes; ++i) {
Narendra Muppalla58a64e22017-07-24 10:54:47 -0700937 if (layout->plane_pitch[i] > fb->pitches[i]) {
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400938 DRM_ERROR("plane %u expected pitch %u, fb %u\n",
939 i, layout->plane_pitch[i], fb->pitches[i]);
940 return -EINVAL;
941 }
942 }
943
944 /* Populate addresses for simple formats here */
945 for (i = 0; i < layout->num_planes; ++i) {
Jordan Croused8e96522017-02-13 10:14:16 -0700946 layout->plane_addr[i] = msm_framebuffer_iova(fb, aspace, i);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400947 if (!layout->plane_addr[i]) {
948 DRM_ERROR("failed to retrieve base addr\n");
949 return -EFAULT;
950 }
951 }
952
953 return 0;
954}
955
956int sde_format_populate_layout(
Jordan Croused8e96522017-02-13 10:14:16 -0700957 struct msm_gem_address_space *aspace,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400958 struct drm_framebuffer *fb,
959 struct sde_hw_fmt_layout *layout)
960{
Clarence Ipb6eb2362016-09-08 16:18:13 -0400961 uint32_t plane_addr[SDE_MAX_PLANES];
962 int i, ret;
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400963
964 if (!fb || !layout) {
965 DRM_ERROR("invalid arguments\n");
966 return -EINVAL;
967 }
968
969 if ((fb->width > SDE_MAX_IMG_WIDTH) ||
970 (fb->height > SDE_MAX_IMG_HEIGHT)) {
971 DRM_ERROR("image dimensions outside max range\n");
972 return -ERANGE;
973 }
974
975 layout->format = to_sde_format(msm_framebuffer_format(fb));
976
977 /* Populate the plane sizes etc via get_format */
Alan Kwong4fc006e2017-01-29 18:19:34 -0800978 ret = sde_format_get_plane_sizes(layout->format, fb->width, fb->height,
Narendra Muppalla58a64e22017-07-24 10:54:47 -0700979 layout, fb->pitches);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400980 if (ret)
981 return ret;
982
Clarence Ipb6eb2362016-09-08 16:18:13 -0400983 for (i = 0; i < SDE_MAX_PLANES; ++i)
984 plane_addr[i] = layout->plane_addr[i];
985
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400986 /* Populate the addresses given the fb */
Alan Kwong4fc006e2017-01-29 18:19:34 -0800987 if (SDE_FORMAT_IS_UBWC(layout->format) ||
988 SDE_FORMAT_IS_TILE(layout->format))
Jordan Croused8e96522017-02-13 10:14:16 -0700989 ret = _sde_format_populate_addrs_ubwc(aspace, fb, layout);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400990 else
Jordan Croused8e96522017-02-13 10:14:16 -0700991 ret = _sde_format_populate_addrs_linear(aspace, fb, layout);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400992
Clarence Ipb6eb2362016-09-08 16:18:13 -0400993 /* check if anything changed */
994 if (!ret && !memcmp(plane_addr, layout->plane_addr, sizeof(plane_addr)))
995 ret = -EAGAIN;
996
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -0400997 return ret;
998}
999
Alan Kwongbb27c092016-07-20 16:41:25 -04001000static void _sde_format_calc_offset_linear(struct sde_hw_fmt_layout *source,
1001 u32 x, u32 y)
1002{
1003 if ((x == 0) && (y == 0))
1004 return;
1005
1006 source->plane_addr[0] += y * source->plane_pitch[0];
1007
1008 if (source->num_planes == 1) {
1009 source->plane_addr[0] += x * source->format->bpp;
1010 } else {
1011 uint32_t xoff, yoff;
1012 uint32_t v_subsample = 1;
1013 uint32_t h_subsample = 1;
1014
1015 _sde_get_v_h_subsample_rate(source->format->chroma_sample,
1016 &v_subsample, &h_subsample);
1017
1018 xoff = x / h_subsample;
1019 yoff = y / v_subsample;
1020
1021 source->plane_addr[0] += x;
1022 source->plane_addr[1] += xoff +
1023 (yoff * source->plane_pitch[1]);
1024 if (source->num_planes == 2) /* pseudo planar */
1025 source->plane_addr[1] += xoff;
1026 else /* planar */
1027 source->plane_addr[2] += xoff +
1028 (yoff * source->plane_pitch[2]);
1029 }
1030}
1031
1032int sde_format_populate_layout_with_roi(
Jordan Croused8e96522017-02-13 10:14:16 -07001033 struct msm_gem_address_space *aspace,
Alan Kwongbb27c092016-07-20 16:41:25 -04001034 struct drm_framebuffer *fb,
1035 struct sde_rect *roi,
1036 struct sde_hw_fmt_layout *layout)
1037{
1038 int ret;
1039
Jordan Croused8e96522017-02-13 10:14:16 -07001040 ret = sde_format_populate_layout(aspace, fb, layout);
Alan Kwongbb27c092016-07-20 16:41:25 -04001041 if (ret || !roi)
1042 return ret;
1043
1044 if (!roi->w || !roi->h || (roi->x + roi->w > fb->width) ||
1045 (roi->y + roi->h > fb->height)) {
1046 DRM_ERROR("invalid roi=[%d,%d,%d,%d], fb=[%u,%u]\n",
1047 roi->x, roi->y, roi->w, roi->h,
1048 fb->width, fb->height);
1049 ret = -EINVAL;
1050 } else if (SDE_FORMAT_IS_LINEAR(layout->format)) {
1051 _sde_format_calc_offset_linear(layout, roi->x, roi->y);
1052 layout->width = roi->w;
1053 layout->height = roi->h;
1054 } else if (roi->x || roi->y || (roi->w != fb->width) ||
1055 (roi->h != fb->height)) {
1056 DRM_ERROR("non-linear layout with roi not supported\n");
1057 ret = -EINVAL;
1058 }
1059
1060 return ret;
1061}
1062
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001063int sde_format_check_modified_format(
1064 const struct msm_kms *kms,
1065 const struct msm_format *msm_fmt,
1066 const struct drm_mode_fb_cmd2 *cmd,
1067 struct drm_gem_object **bos)
1068{
1069 int ret, i, num_base_fmt_planes;
1070 const struct sde_format *fmt;
1071 struct sde_hw_fmt_layout layout;
1072 uint32_t bos_total_size = 0;
1073
1074 if (!msm_fmt || !cmd || !bos) {
1075 DRM_ERROR("invalid arguments\n");
1076 return -EINVAL;
1077 }
1078
1079 fmt = to_sde_format(msm_fmt);
1080 num_base_fmt_planes = drm_format_num_planes(fmt->base.pixel_format);
1081
Alan Kwong4fc006e2017-01-29 18:19:34 -08001082 ret = sde_format_get_plane_sizes(fmt, cmd->width, cmd->height,
Narendra Muppalla58a64e22017-07-24 10:54:47 -07001083 &layout, cmd->pitches);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001084 if (ret)
1085 return ret;
1086
1087 for (i = 0; i < num_base_fmt_planes; i++) {
1088 if (!bos[i]) {
1089 DRM_ERROR("invalid handle for plane %d\n", i);
1090 return -EINVAL;
1091 }
Alexander Beykund6d4be42017-04-19 17:08:35 -04001092 if ((i == 0) || (bos[i] != bos[0]))
1093 bos_total_size += bos[i]->size;
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001094 }
1095
1096 if (bos_total_size < layout.total_size) {
1097 DRM_ERROR("buffers total size too small %u expected %u\n",
1098 bos_total_size, layout.total_size);
1099 return -EINVAL;
1100 }
1101
1102 return 0;
1103}
1104
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001105const struct sde_format *sde_get_sde_format_ext(
1106 const uint32_t format,
1107 const uint64_t *modifiers,
1108 const uint32_t modifiers_len)
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -04001109{
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001110 uint32_t i = 0;
1111 uint64_t mod0 = 0;
1112 const struct sde_format *fmt = NULL;
1113 const struct sde_format *map = NULL;
1114 ssize_t map_size = 0;
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -04001115
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001116 /*
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001117 * Currently only support exactly zero or one modifier.
1118 * All planes used must specify the same modifier.
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001119 */
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001120 if (modifiers_len && !modifiers) {
Alan Kwong4fc006e2017-01-29 18:19:34 -08001121 SDE_ERROR("invalid modifiers array\n");
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001122 return NULL;
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001123 } else if (modifiers && modifiers_len && modifiers[0]) {
1124 mod0 = modifiers[0];
Alan Kwong4fc006e2017-01-29 18:19:34 -08001125 SDE_DEBUG("plane format modifier 0x%llX\n", mod0);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001126 for (i = 1; i < modifiers_len; i++) {
1127 if (modifiers[i] != mod0) {
Alan Kwong4fc006e2017-01-29 18:19:34 -08001128 SDE_ERROR("bad fmt mod 0x%llX on plane %d\n",
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001129 modifiers[i], i);
1130 return NULL;
1131 }
1132 }
1133 }
1134
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001135 switch (mod0) {
1136 case 0:
1137 map = sde_format_map;
1138 map_size = ARRAY_SIZE(sde_format_map);
1139 break;
1140 case DRM_FORMAT_MOD_QCOM_COMPRESSED:
Alan Kwong4fc006e2017-01-29 18:19:34 -08001141 case DRM_FORMAT_MOD_QCOM_COMPRESSED | DRM_FORMAT_MOD_QCOM_TILE:
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001142 map = sde_format_map_ubwc;
1143 map_size = ARRAY_SIZE(sde_format_map_ubwc);
Dhaval Patel6c666622017-03-21 23:02:59 -07001144 SDE_DEBUG("found fmt: %4.4s DRM_FORMAT_MOD_QCOM_COMPRESSED\n",
1145 (char *)&format);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001146 break;
abeykunadfec292016-08-26 10:48:09 -04001147 case DRM_FORMAT_MOD_QCOM_DX:
1148 map = sde_format_map_p010;
1149 map_size = ARRAY_SIZE(sde_format_map_p010);
Dhaval Patel6c666622017-03-21 23:02:59 -07001150 SDE_DEBUG("found fmt: %4.4s DRM_FORMAT_MOD_QCOM_DX\n",
1151 (char *)&format);
abeykunadfec292016-08-26 10:48:09 -04001152 break;
1153 case (DRM_FORMAT_MOD_QCOM_DX | DRM_FORMAT_MOD_QCOM_COMPRESSED):
Alan Kwong4fc006e2017-01-29 18:19:34 -08001154 case (DRM_FORMAT_MOD_QCOM_DX | DRM_FORMAT_MOD_QCOM_COMPRESSED |
1155 DRM_FORMAT_MOD_QCOM_TILE):
abeykunadfec292016-08-26 10:48:09 -04001156 map = sde_format_map_p010_ubwc;
1157 map_size = ARRAY_SIZE(sde_format_map_p010_ubwc);
Dhaval Patel6c666622017-03-21 23:02:59 -07001158 SDE_DEBUG(
1159 "found fmt: %4.4s DRM_FORMAT_MOD_QCOM_COMPRESSED/DX\n",
1160 (char *)&format);
abeykunadfec292016-08-26 10:48:09 -04001161 break;
abeykun1d4ff032016-08-26 11:31:44 -04001162 case (DRM_FORMAT_MOD_QCOM_DX | DRM_FORMAT_MOD_QCOM_COMPRESSED |
1163 DRM_FORMAT_MOD_QCOM_TIGHT):
Alan Kwong4fc006e2017-01-29 18:19:34 -08001164 case (DRM_FORMAT_MOD_QCOM_DX | DRM_FORMAT_MOD_QCOM_COMPRESSED |
1165 DRM_FORMAT_MOD_QCOM_TIGHT | DRM_FORMAT_MOD_QCOM_TILE):
abeykun1d4ff032016-08-26 11:31:44 -04001166 map = sde_format_map_tp10_ubwc;
1167 map_size = ARRAY_SIZE(sde_format_map_tp10_ubwc);
Alan Kwong4fc006e2017-01-29 18:19:34 -08001168 SDE_DEBUG(
Dhaval Patel6c666622017-03-21 23:02:59 -07001169 "found fmt: %4.4s DRM_FORMAT_MOD_QCOM_COMPRESSED/DX/TIGHT\n",
1170 (char *)&format);
abeykun1d4ff032016-08-26 11:31:44 -04001171 break;
Alan Kwong4fc006e2017-01-29 18:19:34 -08001172 case DRM_FORMAT_MOD_QCOM_TILE:
1173 map = sde_format_map_tile;
1174 map_size = ARRAY_SIZE(sde_format_map_tile);
Dhaval Patel6c666622017-03-21 23:02:59 -07001175 SDE_DEBUG("found fmt: %4.4s DRM_FORMAT_MOD_QCOM_TILE\n",
1176 (char *)&format);
Alan Kwong4fc006e2017-01-29 18:19:34 -08001177 break;
1178 case (DRM_FORMAT_MOD_QCOM_TILE | DRM_FORMAT_MOD_QCOM_DX):
1179 map = sde_format_map_p010_tile;
1180 map_size = ARRAY_SIZE(sde_format_map_p010_tile);
Dhaval Patel6c666622017-03-21 23:02:59 -07001181 SDE_DEBUG("found fmt: %4.4s DRM_FORMAT_MOD_QCOM_TILE/DX\n",
1182 (char *)&format);
Alan Kwong4fc006e2017-01-29 18:19:34 -08001183 break;
1184 case (DRM_FORMAT_MOD_QCOM_TILE | DRM_FORMAT_MOD_QCOM_DX |
1185 DRM_FORMAT_MOD_QCOM_TIGHT):
1186 map = sde_format_map_tp10_tile;
1187 map_size = ARRAY_SIZE(sde_format_map_tp10_tile);
Dhaval Patel6c666622017-03-21 23:02:59 -07001188 SDE_DEBUG(
1189 "found fmt: %4.4s DRM_FORMAT_MOD_QCOM_TILE/DX/TIGHT\n",
1190 (char *)&format);
Alan Kwong4fc006e2017-01-29 18:19:34 -08001191 break;
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001192 default:
Alan Kwong4fc006e2017-01-29 18:19:34 -08001193 SDE_ERROR("unsupported format modifier %llX\n", mod0);
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001194 return NULL;
1195 }
1196
1197 for (i = 0; i < map_size; i++) {
1198 if (format == map[i].base.pixel_format) {
1199 fmt = &map[i];
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -04001200 break;
1201 }
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001202 }
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -04001203
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001204 if (fmt == NULL)
Dhaval Patel6c666622017-03-21 23:02:59 -07001205 SDE_ERROR("unsupported fmt: %4.4s modifier 0x%llX\n",
1206 (char *)&format, mod0);
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001207 else
Dhaval Patel6c666622017-03-21 23:02:59 -07001208 SDE_DEBUG("fmt %4.4s mod 0x%llX ubwc %d yuv %d\n",
1209 (char *)&format, mod0,
Lloyd Atkinsonfa2489c2016-05-25 15:16:03 -04001210 SDE_FORMAT_IS_UBWC(fmt),
1211 SDE_FORMAT_IS_YUV(fmt));
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001212
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -04001213 return fmt;
1214}
1215
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001216const struct msm_format *sde_get_msm_format(
1217 struct msm_kms *kms,
1218 const uint32_t format,
1219 const uint64_t *modifiers,
1220 const uint32_t modifiers_len)
1221{
1222 const struct sde_format *fmt = sde_get_sde_format_ext(format,
1223 modifiers, modifiers_len);
1224 if (fmt)
1225 return &fmt->base;
1226 return NULL;
1227}
1228
Clarence Ipea3d6262016-07-15 16:20:11 -04001229uint32_t sde_populate_formats(
1230 const struct sde_format_extended *format_list,
1231 uint32_t *pixel_formats,
1232 uint64_t *pixel_modifiers,
1233 uint32_t pixel_formats_max)
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001234{
Clarence Ipea3d6262016-07-15 16:20:11 -04001235 uint32_t i, fourcc_format;
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001236
Clarence Ipea3d6262016-07-15 16:20:11 -04001237 if (!format_list || !pixel_formats)
1238 return 0;
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001239
Clarence Ipea3d6262016-07-15 16:20:11 -04001240 for (i = 0, fourcc_format = 0;
1241 format_list->fourcc_format && i < pixel_formats_max;
1242 ++format_list) {
1243 /* verify if listed format is in sde_format_map? */
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001244
Clarence Ipea3d6262016-07-15 16:20:11 -04001245 /* optionally return modified formats */
1246 if (pixel_modifiers) {
1247 /* assume same modifier for all fb planes */
1248 pixel_formats[i] = format_list->fourcc_format;
1249 pixel_modifiers[i++] = format_list->modifier;
1250 } else {
1251 /* assume base formats grouped together */
1252 if (fourcc_format != format_list->fourcc_format) {
1253 fourcc_format = format_list->fourcc_format;
1254 pixel_formats[i++] = fourcc_format;
1255 }
1256 }
Lloyd Atkinson9a673492016-07-05 11:41:57 -04001257 }
1258
1259 return i;
1260}