Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 1 | /* 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 Ip | c475b08 | 2016-06-26 09:27:23 -0400 | [diff] [blame] | 13 | #include "sde_kms.h" |
| 14 | #include "sde_formats.h" |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 15 | |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 16 | static struct sde_format sde_format_map[] = { |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 17 | INTERLEAVED_RGB_FMT(ARGB8888, |
| 18 | COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 19 | C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 20 | true, 4, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 21 | |
| 22 | INTERLEAVED_RGB_FMT(ABGR8888, |
| 23 | COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 24 | C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 25 | true, 4, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 26 | |
| 27 | INTERLEAVED_RGB_FMT(RGBA8888, |
| 28 | COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 29 | C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr, 4, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 30 | true, 4, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 31 | |
| 32 | INTERLEAVED_RGB_FMT(BGRA8888, |
| 33 | COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 34 | C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb, 4, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 35 | true, 4, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 36 | |
| 37 | INTERLEAVED_RGB_FMT(XRGB8888, |
| 38 | COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 39 | C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA, 4, |
| 40 | false, 4, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 41 | |
| 42 | INTERLEAVED_RGB_FMT(RGB888, |
| 43 | 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 44 | C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 45 | false, 3, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 46 | |
| 47 | INTERLEAVED_RGB_FMT(BGR888, |
| 48 | 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 49 | C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 50 | false, 3, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 51 | |
| 52 | INTERLEAVED_RGB_FMT(RGB565, |
| 53 | 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 54 | C1_B_Cb, C0_G_Y, C2_R_Cr, 0, 3, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 55 | false, 2, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 56 | |
| 57 | INTERLEAVED_RGB_FMT(BGR565, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 58 | 0, COLOR_5BIT, COLOR_6BIT, COLOR_5BIT, |
| 59 | C2_R_Cr, C0_G_Y, C1_B_Cb, 0, 3, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 60 | false, 2, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 61 | |
| 62 | PSEDUO_YUV_FMT(NV12, |
| 63 | 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
| 64 | C1_B_Cb, C2_R_Cr, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 65 | SDE_CHROMA_420, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 66 | |
| 67 | PSEDUO_YUV_FMT(NV21, |
| 68 | 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
| 69 | C2_R_Cr, C1_B_Cb, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 70 | SDE_CHROMA_420, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 71 | |
| 72 | PSEDUO_YUV_FMT(NV16, |
| 73 | 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
| 74 | C1_B_Cb, C2_R_Cr, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 75 | SDE_CHROMA_H2V1, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 76 | |
| 77 | PSEDUO_YUV_FMT(NV61, |
| 78 | 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
| 79 | C2_R_Cr, C1_B_Cb, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 80 | SDE_CHROMA_H2V1, SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 81 | |
| 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 Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 85 | false, SDE_CHROMA_H2V1, 4, 2, |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 86 | 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 Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 91 | false, SDE_CHROMA_H2V1, 4, 2, |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 92 | 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 Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 97 | false, SDE_CHROMA_H2V1, 4, 2, |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 98 | 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 Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 103 | false, SDE_CHROMA_H2V1, 4, 2, |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 104 | 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 Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 109 | false, SDE_CHROMA_420, 2, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 110 | SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 111 | |
| 112 | PLANAR_YUV_FMT(YVU420, |
| 113 | 0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, |
| 114 | C1_B_Cb, C2_R_Cr, C0_G_Y, |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 115 | false, SDE_CHROMA_420, 2, |
Clarence Ip | dbde983 | 2016-06-26 09:48:36 -0400 | [diff] [blame] | 116 | SDE_FORMAT_FLAG_ROTATOR), |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 117 | }; |
| 118 | |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 119 | const 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 Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 123 | { |
| 124 | u32 i = 0; |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 125 | uint64_t modifier = 0; |
| 126 | struct sde_format *fmt = NULL; |
Abhijit Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 127 | |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 128 | /* |
| 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 Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 153 | break; |
| 154 | } |
| 155 | |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 156 | 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 Kulkarni | 3e3e0d2 | 2016-06-24 17:56:13 -0400 | [diff] [blame] | 162 | return fmt; |
| 163 | } |
| 164 | |
Lloyd Atkinson | 9a67349 | 2016-07-05 11:41:57 -0400 | [diff] [blame^] | 165 | const 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 | |
| 178 | uint32_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 | } |