.. | .. |
---|
30 | 30 | extern "C" { |
---|
31 | 31 | #endif |
---|
32 | 32 | |
---|
| 33 | +/** |
---|
| 34 | + * DOC: overview |
---|
| 35 | + * |
---|
| 36 | + * In the DRM subsystem, framebuffer pixel formats are described using the |
---|
| 37 | + * fourcc codes defined in `include/uapi/drm/drm_fourcc.h`. In addition to the |
---|
| 38 | + * fourcc code, a Format Modifier may optionally be provided, in order to |
---|
| 39 | + * further describe the buffer's format - for example tiling or compression. |
---|
| 40 | + * |
---|
| 41 | + * Format Modifiers |
---|
| 42 | + * ---------------- |
---|
| 43 | + * |
---|
| 44 | + * Format modifiers are used in conjunction with a fourcc code, forming a |
---|
| 45 | + * unique fourcc:modifier pair. This format:modifier pair must fully define the |
---|
| 46 | + * format and data layout of the buffer, and should be the only way to describe |
---|
| 47 | + * that particular buffer. |
---|
| 48 | + * |
---|
| 49 | + * Having multiple fourcc:modifier pairs which describe the same layout should |
---|
| 50 | + * be avoided, as such aliases run the risk of different drivers exposing |
---|
| 51 | + * different names for the same data format, forcing userspace to understand |
---|
| 52 | + * that they are aliases. |
---|
| 53 | + * |
---|
| 54 | + * Format modifiers may change any property of the buffer, including the number |
---|
| 55 | + * of planes and/or the required allocation size. Format modifiers are |
---|
| 56 | + * vendor-namespaced, and as such the relationship between a fourcc code and a |
---|
| 57 | + * modifier is specific to the modifer being used. For example, some modifiers |
---|
| 58 | + * may preserve meaning - such as number of planes - from the fourcc code, |
---|
| 59 | + * whereas others may not. |
---|
| 60 | + * |
---|
| 61 | + * Vendors should document their modifier usage in as much detail as |
---|
| 62 | + * possible, to ensure maximum compatibility across devices, drivers and |
---|
| 63 | + * applications. |
---|
| 64 | + * |
---|
| 65 | + * The authoritative list of format modifier codes is found in |
---|
| 66 | + * `include/uapi/drm/drm_fourcc.h` |
---|
| 67 | + */ |
---|
| 68 | + |
---|
33 | 69 | #define fourcc_code(a, b, c, d) ((__u32)(a) | ((__u32)(b) << 8) | \ |
---|
34 | 70 | ((__u32)(c) << 16) | ((__u32)(d) << 24)) |
---|
35 | 71 | |
---|
36 | | -#define DRM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */ |
---|
| 72 | +#define DRM_FORMAT_BIG_ENDIAN (1U<<31) /* format is big endian instead of little endian */ |
---|
| 73 | + |
---|
| 74 | +/* Reserve 0 for the invalid format specifier */ |
---|
| 75 | +#define DRM_FORMAT_INVALID 0 |
---|
37 | 76 | |
---|
38 | 77 | /* color index */ |
---|
39 | 78 | #define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ') /* [7:0] C */ |
---|
.. | .. |
---|
105 | 144 | #define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */ |
---|
106 | 145 | #define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */ |
---|
107 | 146 | |
---|
| 147 | +/* |
---|
| 148 | + * Floating point 64bpp RGB |
---|
| 149 | + * IEEE 754-2008 binary16 half-precision float |
---|
| 150 | + * [15:0] sign:exponent:mantissa 1:5:10 |
---|
| 151 | + */ |
---|
| 152 | +#define DRM_FORMAT_XRGB16161616F fourcc_code('X', 'R', '4', 'H') /* [63:0] x:R:G:B 16:16:16:16 little endian */ |
---|
| 153 | +#define DRM_FORMAT_XBGR16161616F fourcc_code('X', 'B', '4', 'H') /* [63:0] x:B:G:R 16:16:16:16 little endian */ |
---|
| 154 | + |
---|
| 155 | +#define DRM_FORMAT_ARGB16161616F fourcc_code('A', 'R', '4', 'H') /* [63:0] A:R:G:B 16:16:16:16 little endian */ |
---|
| 156 | +#define DRM_FORMAT_ABGR16161616F fourcc_code('A', 'B', '4', 'H') /* [63:0] A:B:G:R 16:16:16:16 little endian */ |
---|
| 157 | + |
---|
108 | 158 | /* packed YCbCr */ |
---|
109 | 159 | #define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */ |
---|
110 | 160 | #define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */ |
---|
.. | .. |
---|
112 | 162 | #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ |
---|
113 | 163 | |
---|
114 | 164 | #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ |
---|
| 165 | +#define DRM_FORMAT_XYUV8888 fourcc_code('X', 'Y', 'U', 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */ |
---|
| 166 | +#define DRM_FORMAT_VUY888 fourcc_code('V', 'U', '2', '4') /* [23:0] Cr:Cb:Y 8:8:8 little endian */ |
---|
| 167 | +#define DRM_FORMAT_VUY101010 fourcc_code('V', 'U', '3', '0') /* Y followed by U then V, 10:10:10. Non-linear modifier only */ |
---|
| 168 | + |
---|
| 169 | +/* |
---|
| 170 | + * packed Y2xx indicate for each component, xx valid data occupy msb |
---|
| 171 | + * 16-xx padding occupy lsb |
---|
| 172 | + */ |
---|
| 173 | +#define DRM_FORMAT_Y210 fourcc_code('Y', '2', '1', '0') /* [63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 10:6:10:6:10:6:10:6 little endian per 2 Y pixels */ |
---|
| 174 | +#define DRM_FORMAT_Y212 fourcc_code('Y', '2', '1', '2') /* [63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 12:4:12:4:12:4:12:4 little endian per 2 Y pixels */ |
---|
| 175 | +#define DRM_FORMAT_Y216 fourcc_code('Y', '2', '1', '6') /* [63:0] Cr0:Y1:Cb0:Y0 16:16:16:16 little endian per 2 Y pixels */ |
---|
| 176 | + |
---|
| 177 | +/* |
---|
| 178 | + * packed Y4xx indicate for each component, xx valid data occupy msb |
---|
| 179 | + * 16-xx padding occupy lsb except Y410 |
---|
| 180 | + */ |
---|
| 181 | +#define DRM_FORMAT_Y410 fourcc_code('Y', '4', '1', '0') /* [31:0] A:Cr:Y:Cb 2:10:10:10 little endian */ |
---|
| 182 | +#define DRM_FORMAT_Y412 fourcc_code('Y', '4', '1', '2') /* [63:0] A:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian */ |
---|
| 183 | +#define DRM_FORMAT_Y416 fourcc_code('Y', '4', '1', '6') /* [63:0] A:Cr:Y:Cb 16:16:16:16 little endian */ |
---|
| 184 | + |
---|
| 185 | +#define DRM_FORMAT_XVYU2101010 fourcc_code('X', 'V', '3', '0') /* [31:0] X:Cr:Y:Cb 2:10:10:10 little endian */ |
---|
| 186 | +#define DRM_FORMAT_XVYU12_16161616 fourcc_code('X', 'V', '3', '6') /* [63:0] X:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian */ |
---|
| 187 | +#define DRM_FORMAT_XVYU16161616 fourcc_code('X', 'V', '4', '8') /* [63:0] X:Cr:Y:Cb 16:16:16:16 little endian */ |
---|
| 188 | + |
---|
| 189 | +/* |
---|
| 190 | + * packed YCbCr420 2x2 tiled formats |
---|
| 191 | + * first 64 bits will contain Y,Cb,Cr components for a 2x2 tile |
---|
| 192 | + */ |
---|
| 193 | +/* [63:0] A3:A2:Y3:0:Cr0:0:Y2:0:A1:A0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian */ |
---|
| 194 | +#define DRM_FORMAT_Y0L0 fourcc_code('Y', '0', 'L', '0') |
---|
| 195 | +/* [63:0] X3:X2:Y3:0:Cr0:0:Y2:0:X1:X0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian */ |
---|
| 196 | +#define DRM_FORMAT_X0L0 fourcc_code('X', '0', 'L', '0') |
---|
| 197 | + |
---|
| 198 | +/* [63:0] A3:A2:Y3:Cr0:Y2:A1:A0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian */ |
---|
| 199 | +#define DRM_FORMAT_Y0L2 fourcc_code('Y', '0', 'L', '2') |
---|
| 200 | +/* [63:0] X3:X2:Y3:Cr0:Y2:X1:X0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian */ |
---|
| 201 | +#define DRM_FORMAT_X0L2 fourcc_code('X', '0', 'L', '2') |
---|
| 202 | + |
---|
| 203 | +/* |
---|
| 204 | + * 1-plane YUV 4:2:0 |
---|
| 205 | + * In these formats, the component ordering is specified (Y, followed by U |
---|
| 206 | + * then V), but the exact Linear layout is undefined. |
---|
| 207 | + * These formats can only be used with a non-Linear modifier. |
---|
| 208 | + */ |
---|
| 209 | +#define DRM_FORMAT_YUV420_8BIT fourcc_code('Y', 'U', '0', '8') |
---|
| 210 | +#define DRM_FORMAT_YUV420_10BIT fourcc_code('Y', 'U', '1', '0') |
---|
115 | 211 | |
---|
116 | 212 | /* |
---|
117 | 213 | * 2 plane RGB + A |
---|
.. | .. |
---|
140 | 236 | #define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */ |
---|
141 | 237 | #define DRM_FORMAT_NV24 fourcc_code('N', 'V', '2', '4') /* non-subsampled Cr:Cb plane */ |
---|
142 | 238 | #define DRM_FORMAT_NV42 fourcc_code('N', 'V', '4', '2') /* non-subsampled Cb:Cr plane */ |
---|
| 239 | +/* |
---|
| 240 | + * 2 plane YCbCr |
---|
| 241 | + * index 0 = Y plane, [39:0] Y3:Y2:Y1:Y0 little endian |
---|
| 242 | + * index 1 = Cr:Cb plane, [39:0] Cr1:Cb1:Cr0:Cb0 little endian |
---|
| 243 | + */ |
---|
| 244 | +#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') /* 2x2 subsampled Cr:Cb plane */ |
---|
| 245 | +#define DRM_FORMAT_NV20 fourcc_code('N', 'V', '2', '0') /* 2x1 subsampled Cr:Cb plane */ |
---|
| 246 | +#define DRM_FORMAT_NV30 fourcc_code('N', 'V', '3', '0') /* non-subsampled Cr:Cb plane */ |
---|
143 | 247 | |
---|
144 | 248 | /* |
---|
145 | | - * 2 plane YCbCr 10bit |
---|
146 | | - * index 0 = Y plane, [9:0] Y |
---|
147 | | - * index 1 = Cr:Cb plane, [19:0] Cr:Cb little endian |
---|
148 | | - * or |
---|
149 | | - * index 1 = Cb:Cr plane, [19:0] Cb:Cr little endian |
---|
| 249 | + * 2 plane YCbCr MSB aligned |
---|
| 250 | + * index 0 = Y plane, [15:0] Y:x [10:6] little endian |
---|
| 251 | + * index 1 = Cr:Cb plane, [31:0] Cr:x:Cb:x [10:6:10:6] little endian |
---|
150 | 252 | */ |
---|
| 253 | +#define DRM_FORMAT_P210 fourcc_code('P', '2', '1', '0') /* 2x1 subsampled Cr:Cb plane, 10 bit per channel */ |
---|
151 | 254 | |
---|
152 | | -#define DRM_FORMAT_NV12_10 fourcc_code('N', 'A', '1', '2') /* 2x2 subsampled Cr:Cb plane */ |
---|
153 | | -#define DRM_FORMAT_NV21_10 fourcc_code('N', 'A', '2', '1') /* 2x2 subsampled Cb:Cr plane */ |
---|
154 | | -#define DRM_FORMAT_NV16_10 fourcc_code('N', 'A', '1', '6') /* 2x1 subsampled Cr:Cb plane */ |
---|
155 | | -#define DRM_FORMAT_NV61_10 fourcc_code('N', 'A', '6', '1') /* 2x1 subsampled Cb:Cr plane */ |
---|
156 | | -#define DRM_FORMAT_NV24_10 fourcc_code('N', 'A', '2', '4') /* non-subsampled Cr:Cb plane */ |
---|
157 | | -#define DRM_FORMAT_NV42_10 fourcc_code('N', 'A', '4', '2') /* non-subsampled Cb:Cr plane */ |
---|
| 255 | +/* |
---|
| 256 | + * 2 plane YCbCr MSB aligned |
---|
| 257 | + * index 0 = Y plane, [15:0] Y:x [10:6] little endian |
---|
| 258 | + * index 1 = Cr:Cb plane, [31:0] Cr:x:Cb:x [10:6:10:6] little endian |
---|
| 259 | + */ |
---|
| 260 | +#define DRM_FORMAT_P010 fourcc_code('P', '0', '1', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel */ |
---|
| 261 | + |
---|
| 262 | +/* |
---|
| 263 | + * 2 plane YCbCr MSB aligned |
---|
| 264 | + * index 0 = Y plane, [15:0] Y:x [12:4] little endian |
---|
| 265 | + * index 1 = Cr:Cb plane, [31:0] Cr:x:Cb:x [12:4:12:4] little endian |
---|
| 266 | + */ |
---|
| 267 | +#define DRM_FORMAT_P012 fourcc_code('P', '0', '1', '2') /* 2x2 subsampled Cr:Cb plane 12 bits per channel */ |
---|
| 268 | + |
---|
| 269 | +/* |
---|
| 270 | + * 2 plane YCbCr MSB aligned |
---|
| 271 | + * index 0 = Y plane, [15:0] Y little endian |
---|
| 272 | + * index 1 = Cr:Cb plane, [31:0] Cr:Cb [16:16] little endian |
---|
| 273 | + */ |
---|
| 274 | +#define DRM_FORMAT_P016 fourcc_code('P', '0', '1', '6') /* 2x2 subsampled Cr:Cb plane 16 bits per channel */ |
---|
| 275 | + |
---|
| 276 | +/* 2 plane YCbCr420. |
---|
| 277 | + * 3 10 bit components and 2 padding bits packed into 4 bytes. |
---|
| 278 | + * index 0 = Y plane, [31:0] x:Y2:Y1:Y0 2:10:10:10 little endian |
---|
| 279 | + * index 1 = Cr:Cb plane, [63:0] x:Cr2:Cb2:Cr1:x:Cb1:Cr0:Cb0 [2:10:10:10:2:10:10:10] little endian |
---|
| 280 | + */ |
---|
| 281 | +#define DRM_FORMAT_P030 fourcc_code('P', '0', '3', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel packed */ |
---|
| 282 | + |
---|
| 283 | +/* 3 plane non-subsampled (444) YCbCr |
---|
| 284 | + * 16 bits per component, but only 10 bits are used and 6 bits are padded |
---|
| 285 | + * index 0: Y plane, [15:0] Y:x [10:6] little endian |
---|
| 286 | + * index 1: Cb plane, [15:0] Cb:x [10:6] little endian |
---|
| 287 | + * index 2: Cr plane, [15:0] Cr:x [10:6] little endian |
---|
| 288 | + */ |
---|
| 289 | +#define DRM_FORMAT_Q410 fourcc_code('Q', '4', '1', '0') |
---|
| 290 | + |
---|
| 291 | +/* 3 plane non-subsampled (444) YCrCb |
---|
| 292 | + * 16 bits per component, but only 10 bits are used and 6 bits are padded |
---|
| 293 | + * index 0: Y plane, [15:0] Y:x [10:6] little endian |
---|
| 294 | + * index 1: Cr plane, [15:0] Cr:x [10:6] little endian |
---|
| 295 | + * index 2: Cb plane, [15:0] Cb:x [10:6] little endian |
---|
| 296 | + */ |
---|
| 297 | +#define DRM_FORMAT_Q401 fourcc_code('Q', '4', '0', '1') |
---|
158 | 298 | |
---|
159 | 299 | /* |
---|
160 | 300 | * 3 plane YCbCr |
---|
.. | .. |
---|
199 | 339 | #define DRM_FORMAT_MOD_VENDOR_VIVANTE 0x06 |
---|
200 | 340 | #define DRM_FORMAT_MOD_VENDOR_BROADCOM 0x07 |
---|
201 | 341 | #define DRM_FORMAT_MOD_VENDOR_ARM 0x08 |
---|
| 342 | +#define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09 |
---|
| 343 | +#define DRM_FORMAT_MOD_VENDOR_AMLOGIC 0x0a |
---|
202 | 344 | #define DRM_FORMAT_MOD_VENDOR_ROCKCHIP 0x0b |
---|
| 345 | + |
---|
203 | 346 | /* add more to the end as needed */ |
---|
204 | 347 | |
---|
205 | 348 | #define DRM_FORMAT_RESERVED ((1ULL << 56) - 1) |
---|
.. | .. |
---|
213 | 356 | * When adding a new token please document the layout with a code comment, |
---|
214 | 357 | * similar to the fourcc codes above. drm_fourcc.h is considered the |
---|
215 | 358 | * authoritative source for all of these. |
---|
| 359 | + * |
---|
| 360 | + * Generic modifier names: |
---|
| 361 | + * |
---|
| 362 | + * DRM_FORMAT_MOD_GENERIC_* definitions are used to provide vendor-neutral names |
---|
| 363 | + * for layouts which are common across multiple vendors. To preserve |
---|
| 364 | + * compatibility, in cases where a vendor-specific definition already exists and |
---|
| 365 | + * a generic name for it is desired, the common name is a purely symbolic alias |
---|
| 366 | + * and must use the same numerical value as the original definition. |
---|
| 367 | + * |
---|
| 368 | + * Note that generic names should only be used for modifiers which describe |
---|
| 369 | + * generic layouts (such as pixel re-ordering), which may have |
---|
| 370 | + * independently-developed support across multiple vendors. |
---|
| 371 | + * |
---|
| 372 | + * In future cases where a generic layout is identified before merging with a |
---|
| 373 | + * vendor-specific modifier, a new 'GENERIC' vendor or modifier using vendor |
---|
| 374 | + * 'NONE' could be considered. This should only be for obvious, exceptional |
---|
| 375 | + * cases to avoid polluting the 'GENERIC' namespace with modifiers which only |
---|
| 376 | + * apply to a single vendor. |
---|
| 377 | + * |
---|
| 378 | + * Generic names should not be used for cases where multiple hardware vendors |
---|
| 379 | + * have implementations of the same standardised compression scheme (such as |
---|
| 380 | + * AFBC). In those cases, all implementations should use the same format |
---|
| 381 | + * modifier(s), reflecting the vendor of the standard. |
---|
216 | 382 | */ |
---|
| 383 | + |
---|
| 384 | +#define DRM_FORMAT_MOD_GENERIC_16_16_TILE DRM_FORMAT_MOD_SAMSUNG_16_16_TILE |
---|
217 | 385 | |
---|
218 | 386 | /* |
---|
219 | 387 | * Invalid Modifier |
---|
.. | .. |
---|
244 | 412 | * a platform-dependent stride. On top of that the memory can apply |
---|
245 | 413 | * platform-depending swizzling of some higher address bits into bit6. |
---|
246 | 414 | * |
---|
247 | | - * This format is highly platforms specific and not useful for cross-driver |
---|
248 | | - * sharing. It exists since on a given platform it does uniquely identify the |
---|
249 | | - * layout in a simple way for i915-specific userspace. |
---|
| 415 | + * Note that this layout is only accurate on intel gen 8+ or valleyview chipsets. |
---|
| 416 | + * On earlier platforms the is highly platforms specific and not useful for |
---|
| 417 | + * cross-driver sharing. It exists since on a given platform it does uniquely |
---|
| 418 | + * identify the layout in a simple way for i915-specific userspace, which |
---|
| 419 | + * facilitated conversion of userspace to modifiers. Additionally the exact |
---|
| 420 | + * format on some really old platforms is not known. |
---|
250 | 421 | */ |
---|
251 | 422 | #define I915_FORMAT_MOD_X_TILED fourcc_mod_code(INTEL, 1) |
---|
252 | 423 | |
---|
.. | .. |
---|
259 | 430 | * memory can apply platform-depending swizzling of some higher address bits |
---|
260 | 431 | * into bit6. |
---|
261 | 432 | * |
---|
262 | | - * This format is highly platforms specific and not useful for cross-driver |
---|
263 | | - * sharing. It exists since on a given platform it does uniquely identify the |
---|
264 | | - * layout in a simple way for i915-specific userspace. |
---|
| 433 | + * Note that this layout is only accurate on intel gen 8+ or valleyview chipsets. |
---|
| 434 | + * On earlier platforms the is highly platforms specific and not useful for |
---|
| 435 | + * cross-driver sharing. It exists since on a given platform it does uniquely |
---|
| 436 | + * identify the layout in a simple way for i915-specific userspace, which |
---|
| 437 | + * facilitated conversion of userspace to modifiers. Additionally the exact |
---|
| 438 | + * format on some really old platforms is not known. |
---|
265 | 439 | */ |
---|
266 | 440 | #define I915_FORMAT_MOD_Y_TILED fourcc_mod_code(INTEL, 2) |
---|
267 | 441 | |
---|
.. | .. |
---|
301 | 475 | #define I915_FORMAT_MOD_Yf_TILED_CCS fourcc_mod_code(INTEL, 5) |
---|
302 | 476 | |
---|
303 | 477 | /* |
---|
| 478 | + * Intel color control surfaces (CCS) for Gen-12 render compression. |
---|
| 479 | + * |
---|
| 480 | + * The main surface is Y-tiled and at plane index 0, the CCS is linear and |
---|
| 481 | + * at index 1. A 64B CCS cache line corresponds to an area of 4x1 tiles in |
---|
| 482 | + * main surface. In other words, 4 bits in CCS map to a main surface cache |
---|
| 483 | + * line pair. The main surface pitch is required to be a multiple of four |
---|
| 484 | + * Y-tile widths. |
---|
| 485 | + */ |
---|
| 486 | +#define I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS fourcc_mod_code(INTEL, 6) |
---|
| 487 | + |
---|
| 488 | +/* |
---|
| 489 | + * Intel color control surfaces (CCS) for Gen-12 media compression |
---|
| 490 | + * |
---|
| 491 | + * The main surface is Y-tiled and at plane index 0, the CCS is linear and |
---|
| 492 | + * at index 1. A 64B CCS cache line corresponds to an area of 4x1 tiles in |
---|
| 493 | + * main surface. In other words, 4 bits in CCS map to a main surface cache |
---|
| 494 | + * line pair. The main surface pitch is required to be a multiple of four |
---|
| 495 | + * Y-tile widths. For semi-planar formats like NV12, CCS planes follow the |
---|
| 496 | + * Y and UV planes i.e., planes 0 and 1 are used for Y and UV surfaces, |
---|
| 497 | + * planes 2 and 3 for the respective CCS. |
---|
| 498 | + */ |
---|
| 499 | +#define I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS fourcc_mod_code(INTEL, 7) |
---|
| 500 | + |
---|
| 501 | +/* |
---|
304 | 502 | * Tiled, NV12MT, grouped in 64 (pixels) x 32 (lines) -sized macroblocks |
---|
305 | 503 | * |
---|
306 | 504 | * Macroblocks are laid in a Z-shape, and each pixel data is following the |
---|
.. | .. |
---|
316 | 514 | #define DRM_FORMAT_MOD_SAMSUNG_64_32_TILE fourcc_mod_code(SAMSUNG, 1) |
---|
317 | 515 | |
---|
318 | 516 | /* |
---|
| 517 | + * Tiled, 16 (pixels) x 16 (lines) - sized macroblocks |
---|
| 518 | + * |
---|
| 519 | + * This is a simple tiled layout using tiles of 16x16 pixels in a row-major |
---|
| 520 | + * layout. For YCbCr formats Cb/Cr components are taken in such a way that |
---|
| 521 | + * they correspond to their 16x16 luma block. |
---|
| 522 | + */ |
---|
| 523 | +#define DRM_FORMAT_MOD_SAMSUNG_16_16_TILE fourcc_mod_code(SAMSUNG, 2) |
---|
| 524 | + |
---|
| 525 | +/* |
---|
319 | 526 | * Qualcomm Compressed Format |
---|
320 | 527 | * |
---|
321 | 528 | * Refers to a compressed variant of the base format that is compressed. |
---|
.. | .. |
---|
327 | 534 | * Entire pixel data buffer is aligned with 4k(bytes). |
---|
328 | 535 | */ |
---|
329 | 536 | #define DRM_FORMAT_MOD_QCOM_COMPRESSED fourcc_mod_code(QCOM, 1) |
---|
330 | | - |
---|
331 | | -/* |
---|
332 | | - * QTI DX Format |
---|
333 | | - * |
---|
334 | | - * Refers to a DX variant of the base format. |
---|
335 | | - * Implementation may be platform and base-format specific. |
---|
336 | | - */ |
---|
337 | | -#define DRM_FORMAT_MOD_QCOM_DX fourcc_mod_code(QCOM, 0x2) |
---|
338 | | - |
---|
339 | | -/* |
---|
340 | | - * QTI Tight Format |
---|
341 | | - * |
---|
342 | | - * Refers to a tightly packed variant of the base format. |
---|
343 | | - * Implementation may be platform and base-format specific. |
---|
344 | | - */ |
---|
345 | | -#define DRM_FORMAT_MOD_QCOM_TIGHT fourcc_mod_code(QCOM, 0x4) |
---|
346 | | - |
---|
347 | | -/* |
---|
348 | | - * QTI Tile Format |
---|
349 | | - * |
---|
350 | | - * Refers to a tile variant of the base format. |
---|
351 | | - * Implementation may be platform and base-format specific. |
---|
352 | | - */ |
---|
353 | | -#define DRM_FORMAT_MOD_QCOM_TILE fourcc_mod_code(QCOM, 0x8) |
---|
354 | 537 | |
---|
355 | 538 | /* Vivante framebuffer modifiers */ |
---|
356 | 539 | |
---|
.. | .. |
---|
402 | 585 | #define DRM_FORMAT_MOD_NVIDIA_TEGRA_TILED fourcc_mod_code(NVIDIA, 1) |
---|
403 | 586 | |
---|
404 | 587 | /* |
---|
405 | | - * 16Bx2 Block Linear layout, used by desktop GPUs, and Tegra K1 and later |
---|
| 588 | + * Generalized Block Linear layout, used by desktop GPUs starting with NV50/G80, |
---|
| 589 | + * and Tegra GPUs starting with Tegra K1. |
---|
| 590 | + * |
---|
| 591 | + * Pixels are arranged in Groups of Bytes (GOBs). GOB size and layout varies |
---|
| 592 | + * based on the architecture generation. GOBs themselves are then arranged in |
---|
| 593 | + * 3D blocks, with the block dimensions (in terms of GOBs) always being a power |
---|
| 594 | + * of two, and hence expressible as their log2 equivalent (E.g., "2" represents |
---|
| 595 | + * a block depth or height of "4"). |
---|
| 596 | + * |
---|
| 597 | + * Chapter 20 "Pixel Memory Formats" of the Tegra X1 TRM describes this format |
---|
| 598 | + * in full detail. |
---|
| 599 | + * |
---|
| 600 | + * Macro |
---|
| 601 | + * Bits Param Description |
---|
| 602 | + * ---- ----- ----------------------------------------------------------------- |
---|
| 603 | + * |
---|
| 604 | + * 3:0 h log2(height) of each block, in GOBs. Placed here for |
---|
| 605 | + * compatibility with the existing |
---|
| 606 | + * DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK()-based modifiers. |
---|
| 607 | + * |
---|
| 608 | + * 4:4 - Must be 1, to indicate block-linear layout. Necessary for |
---|
| 609 | + * compatibility with the existing |
---|
| 610 | + * DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK()-based modifiers. |
---|
| 611 | + * |
---|
| 612 | + * 8:5 - Reserved (To support 3D-surfaces with variable log2(depth) block |
---|
| 613 | + * size). Must be zero. |
---|
| 614 | + * |
---|
| 615 | + * Note there is no log2(width) parameter. Some portions of the |
---|
| 616 | + * hardware support a block width of two gobs, but it is impractical |
---|
| 617 | + * to use due to lack of support elsewhere, and has no known |
---|
| 618 | + * benefits. |
---|
| 619 | + * |
---|
| 620 | + * 11:9 - Reserved (To support 2D-array textures with variable array stride |
---|
| 621 | + * in blocks, specified via log2(tile width in blocks)). Must be |
---|
| 622 | + * zero. |
---|
| 623 | + * |
---|
| 624 | + * 19:12 k Page Kind. This value directly maps to a field in the page |
---|
| 625 | + * tables of all GPUs >= NV50. It affects the exact layout of bits |
---|
| 626 | + * in memory and can be derived from the tuple |
---|
| 627 | + * |
---|
| 628 | + * (format, GPU model, compression type, samples per pixel) |
---|
| 629 | + * |
---|
| 630 | + * Where compression type is defined below. If GPU model were |
---|
| 631 | + * implied by the format modifier, format, or memory buffer, page |
---|
| 632 | + * kind would not need to be included in the modifier itself, but |
---|
| 633 | + * since the modifier should define the layout of the associated |
---|
| 634 | + * memory buffer independent from any device or other context, it |
---|
| 635 | + * must be included here. |
---|
| 636 | + * |
---|
| 637 | + * 21:20 g GOB Height and Page Kind Generation. The height of a GOB changed |
---|
| 638 | + * starting with Fermi GPUs. Additionally, the mapping between page |
---|
| 639 | + * kind and bit layout has changed at various points. |
---|
| 640 | + * |
---|
| 641 | + * 0 = Gob Height 8, Fermi - Volta, Tegra K1+ Page Kind mapping |
---|
| 642 | + * 1 = Gob Height 4, G80 - GT2XX Page Kind mapping |
---|
| 643 | + * 2 = Gob Height 8, Turing+ Page Kind mapping |
---|
| 644 | + * 3 = Reserved for future use. |
---|
| 645 | + * |
---|
| 646 | + * 22:22 s Sector layout. On Tegra GPUs prior to Xavier, there is a further |
---|
| 647 | + * bit remapping step that occurs at an even lower level than the |
---|
| 648 | + * page kind and block linear swizzles. This causes the layout of |
---|
| 649 | + * surfaces mapped in those SOC's GPUs to be incompatible with the |
---|
| 650 | + * equivalent mapping on other GPUs in the same system. |
---|
| 651 | + * |
---|
| 652 | + * 0 = Tegra K1 - Tegra Parker/TX2 Layout. |
---|
| 653 | + * 1 = Desktop GPU and Tegra Xavier+ Layout |
---|
| 654 | + * |
---|
| 655 | + * 25:23 c Lossless Framebuffer Compression type. |
---|
| 656 | + * |
---|
| 657 | + * 0 = none |
---|
| 658 | + * 1 = ROP/3D, layout 1, exact compression format implied by Page |
---|
| 659 | + * Kind field |
---|
| 660 | + * 2 = ROP/3D, layout 2, exact compression format implied by Page |
---|
| 661 | + * Kind field |
---|
| 662 | + * 3 = CDE horizontal |
---|
| 663 | + * 4 = CDE vertical |
---|
| 664 | + * 5 = Reserved for future use |
---|
| 665 | + * 6 = Reserved for future use |
---|
| 666 | + * 7 = Reserved for future use |
---|
| 667 | + * |
---|
| 668 | + * 55:25 - Reserved for future use. Must be zero. |
---|
| 669 | + */ |
---|
| 670 | +#define DRM_FORMAT_MOD_NVIDIA_BLOCK_LINEAR_2D(c, s, g, k, h) \ |
---|
| 671 | + fourcc_mod_code(NVIDIA, (0x10 | \ |
---|
| 672 | + ((h) & 0xf) | \ |
---|
| 673 | + (((k) & 0xff) << 12) | \ |
---|
| 674 | + (((g) & 0x3) << 20) | \ |
---|
| 675 | + (((s) & 0x1) << 22) | \ |
---|
| 676 | + (((c) & 0x7) << 23))) |
---|
| 677 | + |
---|
| 678 | +/* To grandfather in prior block linear format modifiers to the above layout, |
---|
| 679 | + * the page kind "0", which corresponds to "pitch/linear" and hence is unusable |
---|
| 680 | + * with block-linear layouts, is remapped within drivers to the value 0xfe, |
---|
| 681 | + * which corresponds to the "generic" kind used for simple single-sample |
---|
| 682 | + * uncompressed color formats on Fermi - Volta GPUs. |
---|
| 683 | + */ |
---|
| 684 | +static inline __u64 |
---|
| 685 | +drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier) |
---|
| 686 | +{ |
---|
| 687 | + if (!(modifier & 0x10) || (modifier & (0xff << 12))) |
---|
| 688 | + return modifier; |
---|
| 689 | + else |
---|
| 690 | + return modifier | (0xfe << 12); |
---|
| 691 | +} |
---|
| 692 | + |
---|
| 693 | +/* |
---|
| 694 | + * 16Bx2 Block Linear layout, used by Tegra K1 and later |
---|
406 | 695 | * |
---|
407 | 696 | * Pixels are arranged in 64x8 Groups Of Bytes (GOBs). GOBs are then stacked |
---|
408 | 697 | * vertically by a power of 2 (1 to 32 GOBs) to form a block. |
---|
.. | .. |
---|
423 | 712 | * in full detail. |
---|
424 | 713 | */ |
---|
425 | 714 | #define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(v) \ |
---|
426 | | - fourcc_mod_code(NVIDIA, 0x10 | ((v) & 0xf)) |
---|
| 715 | + DRM_FORMAT_MOD_NVIDIA_BLOCK_LINEAR_2D(0, 0, 0, 0, (v)) |
---|
427 | 716 | |
---|
428 | 717 | #define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB \ |
---|
429 | | - fourcc_mod_code(NVIDIA, 0x10) |
---|
| 718 | + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(0) |
---|
430 | 719 | #define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB \ |
---|
431 | | - fourcc_mod_code(NVIDIA, 0x11) |
---|
| 720 | + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(1) |
---|
432 | 721 | #define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB \ |
---|
433 | | - fourcc_mod_code(NVIDIA, 0x12) |
---|
| 722 | + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(2) |
---|
434 | 723 | #define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB \ |
---|
435 | | - fourcc_mod_code(NVIDIA, 0x13) |
---|
| 724 | + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(3) |
---|
436 | 725 | #define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB \ |
---|
437 | | - fourcc_mod_code(NVIDIA, 0x14) |
---|
| 726 | + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(4) |
---|
438 | 727 | #define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB \ |
---|
439 | | - fourcc_mod_code(NVIDIA, 0x15) |
---|
| 728 | + DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(5) |
---|
440 | 729 | |
---|
441 | 730 | /* |
---|
442 | 731 | * Some Broadcom modifiers take parameters, for example the number of |
---|
.. | .. |
---|
498 | 787 | * and UV. Some SAND-using hardware stores UV in a separate tiled |
---|
499 | 788 | * image from Y to reduce the column height, which is not supported |
---|
500 | 789 | * with these modifiers. |
---|
| 790 | + * |
---|
| 791 | + * The DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT modifier is also |
---|
| 792 | + * supported for DRM_FORMAT_P030 where the columns remain as 128 bytes |
---|
| 793 | + * wide, but as this is a 10 bpp format that translates to 96 pixels. |
---|
501 | 794 | */ |
---|
502 | 795 | |
---|
503 | 796 | #define DRM_FORMAT_MOD_BROADCOM_SAND32_COL_HEIGHT(v) \ |
---|
.. | .. |
---|
549 | 842 | * AFBC has several features which may be supported and/or used, which are |
---|
550 | 843 | * represented using bits in the modifier. Not all combinations are valid, |
---|
551 | 844 | * and different devices or use-cases may support different combinations. |
---|
| 845 | + * |
---|
| 846 | + * Further information on the use of AFBC modifiers can be found in |
---|
| 847 | + * Documentation/gpu/afbc.rst |
---|
552 | 848 | */ |
---|
553 | | -#define DRM_FORMAT_MOD_ARM_AFBC(__afbc_mode) fourcc_mod_code(ARM, __afbc_mode) |
---|
| 849 | + |
---|
| 850 | +/* |
---|
| 851 | + * The top 4 bits (out of the 56 bits alloted for specifying vendor specific |
---|
| 852 | + * modifiers) denote the category for modifiers. Currently we have only two |
---|
| 853 | + * categories of modifiers ie AFBC and MISC. We can have a maximum of sixteen |
---|
| 854 | + * different categories. |
---|
| 855 | + */ |
---|
| 856 | +#define DRM_FORMAT_MOD_ARM_CODE(__type, __val) \ |
---|
| 857 | + fourcc_mod_code(ARM, ((__u64)(__type) << 52) | ((__val) & 0x000fffffffffffffULL)) |
---|
| 858 | + |
---|
| 859 | +#define DRM_FORMAT_MOD_ARM_TYPE_AFBC 0x00 |
---|
| 860 | +#define DRM_FORMAT_MOD_ARM_TYPE_MISC 0x01 |
---|
| 861 | + |
---|
| 862 | +#define DRM_FORMAT_MOD_ARM_AFBC(__afbc_mode) \ |
---|
| 863 | + DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_AFBC, __afbc_mode) |
---|
554 | 864 | |
---|
555 | 865 | /* |
---|
556 | 866 | * AFBC superblock size |
---|
.. | .. |
---|
644 | 954 | */ |
---|
645 | 955 | #define AFBC_FORMAT_MOD_BCH (1ULL << 11) |
---|
646 | 956 | |
---|
647 | | -#define ROCKCHIP_TILED_BLOCK_SIZE_MASK 0xf |
---|
| 957 | +/* AFBC uncompressed storage mode |
---|
| 958 | + * |
---|
| 959 | + * Indicates that the buffer is using AFBC uncompressed storage mode. |
---|
| 960 | + * In this mode all superblock payloads in the buffer use the uncompressed |
---|
| 961 | + * storage mode, which is usually only used for data which cannot be compressed. |
---|
| 962 | + * The buffer layout is the same as for AFBC buffers without USM set, this only |
---|
| 963 | + * affects the storage mode of the individual superblocks. Note that even a |
---|
| 964 | + * buffer without USM set may use uncompressed storage mode for some or all |
---|
| 965 | + * superblocks, USM just guarantees it for all. |
---|
| 966 | + */ |
---|
| 967 | +#define AFBC_FORMAT_MOD_USM (1ULL << 12) |
---|
| 968 | + |
---|
| 969 | +/* |
---|
| 970 | + * Arm 16x16 Block U-Interleaved modifier |
---|
| 971 | + * |
---|
| 972 | + * This is used by Arm Mali Utgard and Midgard GPUs. It divides the image |
---|
| 973 | + * into 16x16 pixel blocks. Blocks are stored linearly in order, but pixels |
---|
| 974 | + * in the block are reordered. |
---|
| 975 | + */ |
---|
| 976 | +#define DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED \ |
---|
| 977 | + DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_MISC, 1ULL) |
---|
| 978 | + |
---|
| 979 | +/* |
---|
| 980 | + * Allwinner tiled modifier |
---|
| 981 | + * |
---|
| 982 | + * This tiling mode is implemented by the VPU found on all Allwinner platforms, |
---|
| 983 | + * codenamed sunxi. It is associated with a YUV format that uses either 2 or 3 |
---|
| 984 | + * planes. |
---|
| 985 | + * |
---|
| 986 | + * With this tiling, the luminance samples are disposed in tiles representing |
---|
| 987 | + * 32x32 pixels and the chrominance samples in tiles representing 32x64 pixels. |
---|
| 988 | + * The pixel order in each tile is linear and the tiles are disposed linearly, |
---|
| 989 | + * both in row-major order. |
---|
| 990 | + */ |
---|
| 991 | +#define DRM_FORMAT_MOD_ALLWINNER_TILED fourcc_mod_code(ALLWINNER, 1) |
---|
| 992 | + |
---|
| 993 | +/* |
---|
| 994 | + * Amlogic Video Framebuffer Compression modifiers |
---|
| 995 | + * |
---|
| 996 | + * Amlogic uses a proprietary lossless image compression protocol and format |
---|
| 997 | + * for their hardware video codec accelerators, either video decoders or |
---|
| 998 | + * video input encoders. |
---|
| 999 | + * |
---|
| 1000 | + * It considerably reduces memory bandwidth while writing and reading |
---|
| 1001 | + * frames in memory. |
---|
| 1002 | + * |
---|
| 1003 | + * The underlying storage is considered to be 3 components, 8bit or 10-bit |
---|
| 1004 | + * per component YCbCr 420, single plane : |
---|
| 1005 | + * - DRM_FORMAT_YUV420_8BIT |
---|
| 1006 | + * - DRM_FORMAT_YUV420_10BIT |
---|
| 1007 | + * |
---|
| 1008 | + * The first 8 bits of the mode defines the layout, then the following 8 bits |
---|
| 1009 | + * defines the options changing the layout. |
---|
| 1010 | + * |
---|
| 1011 | + * Not all combinations are valid, and different SoCs may support different |
---|
| 1012 | + * combinations of layout and options. |
---|
| 1013 | + */ |
---|
| 1014 | +#define __fourcc_mod_amlogic_layout_mask 0xff |
---|
| 1015 | +#define __fourcc_mod_amlogic_options_shift 8 |
---|
| 1016 | +#define __fourcc_mod_amlogic_options_mask 0xff |
---|
| 1017 | + |
---|
| 1018 | +#define DRM_FORMAT_MOD_AMLOGIC_FBC(__layout, __options) \ |
---|
| 1019 | + fourcc_mod_code(AMLOGIC, \ |
---|
| 1020 | + ((__layout) & __fourcc_mod_amlogic_layout_mask) | \ |
---|
| 1021 | + (((__options) & __fourcc_mod_amlogic_options_mask) \ |
---|
| 1022 | + << __fourcc_mod_amlogic_options_shift)) |
---|
| 1023 | + |
---|
| 1024 | +/* Amlogic FBC Layouts */ |
---|
| 1025 | + |
---|
| 1026 | +/* |
---|
| 1027 | + * Amlogic FBC Basic Layout |
---|
| 1028 | + * |
---|
| 1029 | + * The basic layout is composed of: |
---|
| 1030 | + * - a body content organized in 64x32 superblocks with 4096 bytes per |
---|
| 1031 | + * superblock in default mode. |
---|
| 1032 | + * - a 32 bytes per 128x64 header block |
---|
| 1033 | + * |
---|
| 1034 | + * This layout is transferrable between Amlogic SoCs supporting this modifier. |
---|
| 1035 | + */ |
---|
| 1036 | +#define AMLOGIC_FBC_LAYOUT_BASIC (1ULL) |
---|
| 1037 | + |
---|
| 1038 | +/* |
---|
| 1039 | + * Amlogic FBC Scatter Memory layout |
---|
| 1040 | + * |
---|
| 1041 | + * Indicates the header contains IOMMU references to the compressed |
---|
| 1042 | + * frames content to optimize memory access and layout. |
---|
| 1043 | + * |
---|
| 1044 | + * In this mode, only the header memory address is needed, thus the |
---|
| 1045 | + * content memory organization is tied to the current producer |
---|
| 1046 | + * execution and cannot be saved/dumped neither transferrable between |
---|
| 1047 | + * Amlogic SoCs supporting this modifier. |
---|
| 1048 | + * |
---|
| 1049 | + * Due to the nature of the layout, these buffers are not expected to |
---|
| 1050 | + * be accessible by the user-space clients, but only accessible by the |
---|
| 1051 | + * hardware producers and consumers. |
---|
| 1052 | + * |
---|
| 1053 | + * The user-space clients should expect a failure while trying to mmap |
---|
| 1054 | + * the DMA-BUF handle returned by the producer. |
---|
| 1055 | + */ |
---|
| 1056 | +#define AMLOGIC_FBC_LAYOUT_SCATTER (2ULL) |
---|
| 1057 | + |
---|
| 1058 | +/* Amlogic FBC Layout Options Bit Mask */ |
---|
| 1059 | + |
---|
| 1060 | +/* |
---|
| 1061 | + * Amlogic FBC Memory Saving mode |
---|
| 1062 | + * |
---|
| 1063 | + * Indicates the storage is packed when pixel size is multiple of word |
---|
| 1064 | + * boudaries, i.e. 8bit should be stored in this mode to save allocation |
---|
| 1065 | + * memory. |
---|
| 1066 | + * |
---|
| 1067 | + * This mode reduces body layout to 3072 bytes per 64x32 superblock with |
---|
| 1068 | + * the basic layout and 3200 bytes per 64x32 superblock combined with |
---|
| 1069 | + * the scatter layout. |
---|
| 1070 | + */ |
---|
| 1071 | +#define AMLOGIC_FBC_OPTION_MEM_SAVING (1ULL << 0) |
---|
| 1072 | + |
---|
| 1073 | +/* |
---|
| 1074 | + * Rockchip modifier format |
---|
| 1075 | + * tiled modifier format, block size: 8x8,4x4_m0 and 4x4_m1, |
---|
| 1076 | + * rfbc modifier format, block size: 64x4 |
---|
| 1077 | + * |
---|
| 1078 | + * bit[55,52] for Rockchip drm modifier type |
---|
| 1079 | + */ |
---|
| 1080 | +#define DRM_FORMAT_MOD_ROCKCHIP_TYPE_SHIFT 52 |
---|
| 1081 | +#define DRM_FORMAT_MOD_ROCKCHIP_TYPE_MASK 0xf |
---|
| 1082 | +#define DRM_FORMAT_MOD_ROCKCHIP_TYPE_TILED 0x0 |
---|
| 1083 | +#define DRM_FORMAT_MOD_ROCKCHIP_TYPE_RFBC 0x1 |
---|
| 1084 | + |
---|
| 1085 | +/* bit[3,0] for Rockchip drm modifier block size */ |
---|
| 1086 | +#define ROCKCHIP_TILED_BLOCK_SIZE_MASK 0xf |
---|
648 | 1087 | #define ROCKCHIP_TILED_BLOCK_SIZE_8x8 (1ULL) |
---|
649 | 1088 | #define ROCKCHIP_TILED_BLOCK_SIZE_4x4_MODE0 (2ULL) |
---|
650 | 1089 | #define ROCKCHIP_TILED_BLOCK_SIZE_4x4_MODE1 (3ULL) |
---|
651 | 1090 | |
---|
652 | | -#define DRM_FORMAT_MOD_ROCKCHIP_TILED(_mode) fourcc_mod_code(ROCKCHIP, _mode) |
---|
| 1091 | +#define ROCKCHIP_RFBC_BLOCK_SIZE_64x4 (1ULL) |
---|
653 | 1092 | |
---|
654 | | -#define IS_ROCKCHIP_TILED_MOD(val) (((val) >> 56) == DRM_FORMAT_MOD_VENDOR_ROCKCHIP) |
---|
| 1093 | +#define DRM_FORMAT_MOD_ROCKCHIP_CODE(__type, __val) \ |
---|
| 1094 | + fourcc_mod_code(ROCKCHIP, ((__u64)(__type) << DRM_FORMAT_MOD_ROCKCHIP_TYPE_SHIFT) | \ |
---|
| 1095 | + ((__val) & 0x000fffffffffffffULL)) |
---|
| 1096 | + |
---|
| 1097 | +/* Rockchip tiled modifier format */ |
---|
| 1098 | +#define DRM_FORMAT_MOD_ROCKCHIP_TILED(mode) \ |
---|
| 1099 | + DRM_FORMAT_MOD_ROCKCHIP_CODE(DRM_FORMAT_MOD_ROCKCHIP_TYPE_TILED, mode) |
---|
| 1100 | +#define IS_ROCKCHIP_TILED_MOD(val) \ |
---|
| 1101 | + (((val) >> 56) == DRM_FORMAT_MOD_VENDOR_ROCKCHIP && \ |
---|
| 1102 | + ((val >> DRM_FORMAT_MOD_ROCKCHIP_TYPE_SHIFT) & DRM_FORMAT_MOD_ROCKCHIP_TYPE_MASK) == DRM_FORMAT_MOD_ROCKCHIP_TYPE_TILED) |
---|
| 1103 | + |
---|
| 1104 | +/* Rockchip rfbc modifier format */ |
---|
| 1105 | +#define DRM_FORMAT_MOD_ROCKCHIP_RFBC(mode) \ |
---|
| 1106 | + DRM_FORMAT_MOD_ROCKCHIP_CODE(DRM_FORMAT_MOD_ROCKCHIP_TYPE_RFBC, mode) |
---|
| 1107 | +#define IS_ROCKCHIP_RFBC_MOD(val) \ |
---|
| 1108 | + (((val) >> 56) == DRM_FORMAT_MOD_VENDOR_ROCKCHIP && \ |
---|
| 1109 | + ((val >> DRM_FORMAT_MOD_ROCKCHIP_TYPE_SHIFT) & DRM_FORMAT_MOD_ROCKCHIP_TYPE_MASK) == DRM_FORMAT_MOD_ROCKCHIP_TYPE_RFBC) |
---|
655 | 1110 | |
---|
656 | 1111 | #if defined(__cplusplus) |
---|
657 | 1112 | } |
---|