blob: 78d672ee8fd545db3e156d1e3036529eba48b56c [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
Clarence Ipc475b082016-06-26 09:27:23 -040013#include "sde_kms.h"
14#include "sde_formats.h"
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040015
Lloyd Atkinson9a673492016-07-05 11:41:57 -040016static struct sde_format sde_format_map[] = {
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040017 INTERLEAVED_RGB_FMT(ARGB8888,
18 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040019 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
Clarence Ipdbde9832016-06-26 09:48:36 -040020 true, 4, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040021
22 INTERLEAVED_RGB_FMT(ABGR8888,
23 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040024 C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4,
Clarence Ipdbde9832016-06-26 09:48:36 -040025 true, 4, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040026
27 INTERLEAVED_RGB_FMT(RGBA8888,
28 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040029 C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4,
Clarence Ipdbde9832016-06-26 09:48:36 -040030 true, 4, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040031
32 INTERLEAVED_RGB_FMT(BGRA8888,
33 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040034 C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4,
Clarence Ipdbde9832016-06-26 09:48:36 -040035 true, 4, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040036
37 INTERLEAVED_RGB_FMT(XRGB8888,
38 COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040039 C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4,
40 false, 4, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040041
42 INTERLEAVED_RGB_FMT(RGB888,
43 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040044 C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3,
Clarence Ipdbde9832016-06-26 09:48:36 -040045 false, 3, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040046
47 INTERLEAVED_RGB_FMT(BGR888,
48 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040049 C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
Clarence Ipdbde9832016-06-26 09:48:36 -040050 false, 3, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040051
52 INTERLEAVED_RGB_FMT(RGB565,
53 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040054 C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3,
Clarence Ipdbde9832016-06-26 09:48:36 -040055 false, 2, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040056
57 INTERLEAVED_RGB_FMT(BGR565,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040058 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT,
59 C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3,
Clarence Ipdbde9832016-06-26 09:48:36 -040060 false, 2, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040061
62 PSEDUO_YUV_FMT(NV12,
63 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
64 C1_B_Cb, C2_R_Cr,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040065 SDE_CHROMA_420, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040066
67 PSEDUO_YUV_FMT(NV21,
68 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
69 C2_R_Cr, C1_B_Cb,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040070 SDE_CHROMA_420, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040071
72 PSEDUO_YUV_FMT(NV16,
73 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
74 C1_B_Cb, C2_R_Cr,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040075 SDE_CHROMA_H2V1, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040076
77 PSEDUO_YUV_FMT(NV61,
78 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
79 C2_R_Cr, C1_B_Cb,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040080 SDE_CHROMA_H2V1, SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040081
82 INTERLEAVED_YUV_FMT(VYUY,
83 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
84 C2_R_Cr, C0_G_Y, C1_B_Cb, C0_G_Y,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040085 false, SDE_CHROMA_H2V1, 4, 2,
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040086 0),
87
88 INTERLEAVED_YUV_FMT(UYVY,
89 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
90 C1_B_Cb, C0_G_Y, C2_R_Cr, C0_G_Y,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040091 false, SDE_CHROMA_H2V1, 4, 2,
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040092 0),
93
94 INTERLEAVED_YUV_FMT(YUYV,
95 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
96 C0_G_Y, C1_B_Cb, C0_G_Y, C2_R_Cr,
Lloyd Atkinson9a673492016-07-05 11:41:57 -040097 false, SDE_CHROMA_H2V1, 4, 2,
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -040098 0),
99
100 INTERLEAVED_YUV_FMT(YVYU,
101 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
102 C0_G_Y, C2_R_Cr, C0_G_Y, C1_B_Cb,
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400103 false, SDE_CHROMA_H2V1, 4, 2,
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400104 0),
105
106 PLANAR_YUV_FMT(YUV420,
107 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
108 C2_R_Cr, C1_B_Cb, C0_G_Y,
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400109 false, SDE_CHROMA_420, 2,
Clarence Ipdbde9832016-06-26 09:48:36 -0400110 SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400111
112 PLANAR_YUV_FMT(YVU420,
113 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,
114 C1_B_Cb, C2_R_Cr, C0_G_Y,
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400115 false, SDE_CHROMA_420, 2,
Clarence Ipdbde9832016-06-26 09:48:36 -0400116 SDE_FORMAT_FLAG_ROTATOR),
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400117};
118
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400119const struct sde_format *sde_get_sde_format_ext(
120 const uint32_t format,
121 const uint64_t *modifiers,
122 const uint32_t modifiers_len)
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400123{
124 u32 i = 0;
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400125 uint64_t modifier = 0;
126 struct sde_format *fmt = NULL;
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400127
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400128 /*
129 * Currently only support exactly zero or one modifier, and it must be
130 * identical for all planes
131 */
132 if ((modifiers_len && !modifiers) || (!modifiers_len && modifiers)) {
133 DRM_ERROR("unexpected modifiers array or len\n");
134 return NULL;
135 } else if (modifiers && modifiers_len) {
136 modifier = modifiers[0];
137 for (i = 0; i < modifiers_len; i++) {
138 if (modifiers[i])
139 DBG("plane %d format modifier 0x%llX", i,
140 modifiers[i]);
141
142 if (modifiers[i] != modifier) {
143 DRM_ERROR("bad fmt mod 0x%llX on plane %d\n",
144 modifiers[i], i);
145 return NULL;
146 }
147 }
148 }
149
150 for (i = 0; i < ARRAY_SIZE(sde_format_map); i++)
151 if (format == sde_format_map[i].base.pixel_format) {
152 fmt = &sde_format_map[i];
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400153 break;
154 }
155
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400156 if (fmt == NULL)
157 DRM_ERROR("unsupported fmt 0x%X modifier 0x%llX\n",
158 format, modifier);
159 else
160 DBG("found fmt 0x%X modifier 0x%llX", format, modifier);
161
Abhijit Kulkarni3e3e0d22016-06-24 17:56:13 -0400162 return fmt;
163}
164
Lloyd Atkinson9a673492016-07-05 11:41:57 -0400165const struct msm_format *sde_get_msm_format(
166 struct msm_kms *kms,
167 const uint32_t format,
168 const uint64_t *modifiers,
169 const uint32_t modifiers_len)
170{
171 const struct sde_format *fmt = sde_get_sde_format_ext(format,
172 modifiers, modifiers_len);
173 if (fmt)
174 return &fmt->base;
175 return NULL;
176}
177
178uint32_t sde_populate_formats(uint32_t *pixel_formats,
179 uint32_t pixel_formats_max, bool rgb_only)
180{
181 uint32_t i;
182
183 for (i = 0; i < ARRAY_SIZE(sde_format_map); i++) {
184 const struct sde_format *fmt = &sde_format_map[i];
185
186 if (i == pixel_formats_max)
187 break;
188
189 if (rgb_only && SDE_FORMAT_IS_YUV(fmt))
190 continue;
191
192 pixel_formats[i] = fmt->base.pixel_format;
193 }
194
195 return i;
196}