aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_crtc.c57
-rw-r--r--drivers/gpu/drm/i915/intel_display.c18
-rw-r--r--include/drm/drm_fourcc.h121
3 files changed, 146 insertions, 50 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 07c80fd7a98d..1dfc28600751 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -1923,28 +1923,28 @@ uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
1923 1923
1924 switch (bpp) { 1924 switch (bpp) {
1925 case 8: 1925 case 8:
1926 fmt = DRM_FOURCC_RGB332; 1926 fmt = DRM_FORMAT_RGB332;
1927 break; 1927 break;
1928 case 16: 1928 case 16:
1929 if (depth == 15) 1929 if (depth == 15)
1930 fmt = DRM_FOURCC_RGB555; 1930 fmt = DRM_FORMAT_XRGB1555;
1931 else 1931 else
1932 fmt = DRM_FOURCC_RGB565; 1932 fmt = DRM_FORMAT_RGB565;
1933 break; 1933 break;
1934 case 24: 1934 case 24:
1935 fmt = DRM_FOURCC_RGB24; 1935 fmt = DRM_FORMAT_RGB888;
1936 break; 1936 break;
1937 case 32: 1937 case 32:
1938 if (depth == 24) 1938 if (depth == 24)
1939 fmt = DRM_FOURCC_RGB24; 1939 fmt = DRM_FORMAT_XRGB8888;
1940 else if (depth == 30) 1940 else if (depth == 30)
1941 fmt = DRM_INTEL_RGB30; 1941 fmt = DRM_FORMAT_XRGB2101010;
1942 else 1942 else
1943 fmt = DRM_FOURCC_RGB32; 1943 fmt = DRM_FORMAT_ARGB8888;
1944 break; 1944 break;
1945 default: 1945 default:
1946 DRM_ERROR("bad bpp, assuming RGB24 pixel format\n"); 1946 DRM_ERROR("bad bpp, assuming x8r8g8b8 pixel format\n");
1947 fmt = DRM_FOURCC_RGB24; 1947 fmt = DRM_FORMAT_XRGB8888;
1948 break; 1948 break;
1949 } 1949 }
1950 1950
@@ -3145,27 +3145,54 @@ void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
3145 int *bpp) 3145 int *bpp)
3146{ 3146{
3147 switch (format) { 3147 switch (format) {
3148 case DRM_FOURCC_RGB332: 3148 case DRM_FORMAT_RGB332:
3149 case DRM_FORMAT_BGR233:
3149 *depth = 8; 3150 *depth = 8;
3150 *bpp = 8; 3151 *bpp = 8;
3151 break; 3152 break;
3152 case DRM_FOURCC_RGB555: 3153 case DRM_FORMAT_XRGB1555:
3154 case DRM_FORMAT_XBGR1555:
3155 case DRM_FORMAT_RGBX5551:
3156 case DRM_FORMAT_BGRX5551:
3157 case DRM_FORMAT_ARGB1555:
3158 case DRM_FORMAT_ABGR1555:
3159 case DRM_FORMAT_RGBA5551:
3160 case DRM_FORMAT_BGRA5551:
3153 *depth = 15; 3161 *depth = 15;
3154 *bpp = 16; 3162 *bpp = 16;
3155 break; 3163 break;
3156 case DRM_FOURCC_RGB565: 3164 case DRM_FORMAT_RGB565:
3165 case DRM_FORMAT_BGR565:
3157 *depth = 16; 3166 *depth = 16;
3158 *bpp = 16; 3167 *bpp = 16;
3159 break; 3168 break;
3160 case DRM_FOURCC_RGB24: 3169 case DRM_FORMAT_RGB888:
3170 case DRM_FORMAT_BGR888:
3171 *depth = 24;
3172 *bpp = 24;
3173 break;
3174 case DRM_FORMAT_XRGB8888:
3175 case DRM_FORMAT_XBGR8888:
3176 case DRM_FORMAT_RGBX8888:
3177 case DRM_FORMAT_BGRX8888:
3161 *depth = 24; 3178 *depth = 24;
3162 *bpp = 32; 3179 *bpp = 32;
3163 break; 3180 break;
3164 case DRM_INTEL_RGB30: 3181 case DRM_FORMAT_XRGB2101010:
3182 case DRM_FORMAT_XBGR2101010:
3183 case DRM_FORMAT_RGBX1010102:
3184 case DRM_FORMAT_BGRX1010102:
3185 case DRM_FORMAT_ARGB2101010:
3186 case DRM_FORMAT_ABGR2101010:
3187 case DRM_FORMAT_RGBA1010102:
3188 case DRM_FORMAT_BGRA1010102:
3165 *depth = 30; 3189 *depth = 30;
3166 *bpp = 32; 3190 *bpp = 32;
3167 break; 3191 break;
3168 case DRM_FOURCC_RGB32: 3192 case DRM_FORMAT_ARGB8888:
3193 case DRM_FORMAT_ABGR8888:
3194 case DRM_FORMAT_RGBA8888:
3195 case DRM_FORMAT_BGRA8888:
3169 *depth = 32; 3196 *depth = 32;
3170 *bpp = 32; 3197 *bpp = 32;
3171 break; 3198 break;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 50ae9157befe..0bc93c3cd447 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7585,16 +7585,18 @@ int intel_framebuffer_init(struct drm_device *dev,
7585 return -EINVAL; 7585 return -EINVAL;
7586 7586
7587 switch (mode_cmd->pixel_format) { 7587 switch (mode_cmd->pixel_format) {
7588 case DRM_FOURCC_RGB332: 7588 case DRM_FORMAT_RGB332:
7589 case DRM_FOURCC_RGB565: 7589 case DRM_FORMAT_RGB565:
7590 case DRM_FOURCC_RGB24: 7590 case DRM_FORMAT_XRGB8888:
7591 case DRM_INTEL_RGB30: 7591 case DRM_FORMAT_ARGB8888:
7592 case DRM_FORMAT_XRGB2101010:
7593 case DRM_FORMAT_ARGB2101010:
7592 /* RGB formats are common across chipsets */ 7594 /* RGB formats are common across chipsets */
7593 break; 7595 break;
7594 case DRM_FOURCC_YUYV: 7596 case DRM_FORMAT_YUYV:
7595 case DRM_FOURCC_UYVY: 7597 case DRM_FORMAT_UYVY:
7596 case DRM_FOURCC_YVYU: 7598 case DRM_FORMAT_YVYU:
7597 case DRM_FOURCC_VYUY: 7599 case DRM_FORMAT_VYUY:
7598 break; 7600 break;
7599 default: 7601 default:
7600 DRM_ERROR("unsupported pixel format\n"); 7602 DRM_ERROR("unsupported pixel format\n");
diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
index 48c3d107a8fa..bb75249bfbae 100644
--- a/include/drm/drm_fourcc.h
+++ b/include/drm/drm_fourcc.h
@@ -24,40 +24,107 @@
24#ifndef DRM_FOURCC_H 24#ifndef DRM_FOURCC_H
25#define DRM_FOURCC_H 25#define DRM_FOURCC_H
26 26
27/*
28 * We don't use the V4L header because
29 * 1) the fourcc codes are well defined and trivial to construct
30 * 2) we don't want user apps to have to pull in v4l headers just for fourcc
31 * 3) the v4l fourcc codes are mixed up with a bunch of other code and are
32 * part of the v4l API, so changing them to something linux-generic isn't
33 * feasible
34 *
35 * So the below includes the fourcc codes used by the DRM and its drivers,
36 * along with potential device specific codes.
37 */
38
39#include <linux/types.h> 27#include <linux/types.h>
40 28
41#define fourcc_code(a,b,c,d) ((u32)(a) | ((u32)(b) << 8) | \ 29#define fourcc_code(a,b,c,d) ((u32)(a) | ((u32)(b) << 8) | \
42 ((u32)(c) << 16) | ((u32)(d) << 24)) 30 ((u32)(c) << 16) | ((u32)(d) << 24))
43 31
44/* RGB codes */ 32#define DRM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */
45#define DRM_FOURCC_RGB332 fourcc_code('R','G','B','1') 33
46#define DRM_FOURCC_RGB555 fourcc_code('R','G','B','O') 34/* color index */
47#define DRM_FOURCC_RGB565 fourcc_code('R','G','B','P') 35#define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
48#define DRM_FOURCC_RGB24 fourcc_code('R','G','B','3') 36
49#define DRM_FOURCC_RGB32 fourcc_code('R','G','B','4') 37/* 8 bpp RGB */
38#define DRM_FORMAT_RGB332 fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */
39#define DRM_FORMAT_BGR233 fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */
40
41/* 16 bpp RGB */
42#define DRM_FORMAT_XRGB4444 fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */
43#define DRM_FORMAT_XBGR4444 fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */
44#define DRM_FORMAT_RGBX4444 fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */
45#define DRM_FORMAT_BGRX4444 fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */
46
47#define DRM_FORMAT_ARGB4444 fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */
48#define DRM_FORMAT_ABGR4444 fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */
49#define DRM_FORMAT_RGBA4444 fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */
50#define DRM_FORMAT_BGRA4444 fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */
51
52#define DRM_FORMAT_XRGB1555 fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */
53#define DRM_FORMAT_XBGR1555 fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */
54#define DRM_FORMAT_RGBX5551 fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */
55#define DRM_FORMAT_BGRX5551 fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */
56
57#define DRM_FORMAT_ARGB1555 fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */
58#define DRM_FORMAT_ABGR1555 fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */
59#define DRM_FORMAT_RGBA5551 fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */
60#define DRM_FORMAT_BGRA5551 fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */
61
62#define DRM_FORMAT_RGB565 fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */
63#define DRM_FORMAT_BGR565 fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */
50 64
51#define DRM_FOURCC_BGR24 fourcc_code('B','G','R','3') 65/* 24 bpp RGB */
52#define DRM_FOURCC_BGR32 fourcc_code('B','G','R','4') 66#define DRM_FORMAT_RGB888 fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */
67#define DRM_FORMAT_BGR888 fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */
53 68
54/* YUV codes */ 69/* 32 bpp RGB */
55#define DRM_FOURCC_YUYV fourcc_code('Y', 'U', 'Y', 'V') 70#define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */
56#define DRM_FOURCC_YVYU fourcc_code('Y', 'V', 'Y', 'U') 71#define DRM_FORMAT_XBGR8888 fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */
57#define DRM_FOURCC_UYVY fourcc_code('U', 'Y', 'V', 'Y') 72#define DRM_FORMAT_RGBX8888 fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */
58#define DRM_FOURCC_VYUY fourcc_code('V', 'Y', 'U', 'Y') 73#define DRM_FORMAT_BGRX8888 fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */
59 74
60/* DRM specific codes */ 75#define DRM_FORMAT_ARGB8888 fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */
61#define DRM_INTEL_RGB30 fourcc_code('R','G','B','0') /* RGB x:10:10:10 */ 76#define DRM_FORMAT_ABGR8888 fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */
77#define DRM_FORMAT_RGBA8888 fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */
78#define DRM_FORMAT_BGRA8888 fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */
79
80#define DRM_FORMAT_XRGB2101010 fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */
81#define DRM_FORMAT_XBGR2101010 fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */
82#define DRM_FORMAT_RGBX1010102 fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */
83#define DRM_FORMAT_BGRX1010102 fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */
84
85#define DRM_FORMAT_ARGB2101010 fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */
86#define DRM_FORMAT_ABGR2101010 fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */
87#define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */
88#define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */
89
90/* packed YCbCr */
91#define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */
92#define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */
93#define DRM_FORMAT_UYVY fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */
94#define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
95
96#define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
97
98/*
99 * 2 plane YCbCr
100 * index 0 = Y plane, [7:0] Y
101 * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian
102 * or
103 * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian
104 */
105#define DRM_FORMAT_NV12 fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */
106#define DRM_FORMAT_NV21 fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */
107#define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */
108#define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
109
110/*
111 * 3 plane YCbCr
112 * index 0: Y plane, [7:0] Y
113 * index 1: Cb plane, [7:0] Cb
114 * index 2: Cr plane, [7:0] Cr
115 * or
116 * index 1: Cr plane, [7:0] Cr
117 * index 2: Cb plane, [7:0] Cb
118 */
119#define DRM_FORMAT_YUV410 fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */
120#define DRM_FORMAT_YVU410 fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */
121#define DRM_FORMAT_YUV411 fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */
122#define DRM_FORMAT_YVU411 fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */
123#define DRM_FORMAT_YUV420 fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */
124#define DRM_FORMAT_YVU420 fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */
125#define DRM_FORMAT_YUV422 fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */
126#define DRM_FORMAT_YVU422 fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */
127#define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
128#define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
62 129
63#endif /* DRM_FOURCC_H */ 130#endif /* DRM_FOURCC_H */