aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/tegra/dc.c147
-rw-r--r--drivers/gpu/drm/tegra/dc.h20
-rw-r--r--drivers/gpu/drm/tegra/hub.c22
-rw-r--r--drivers/gpu/drm/tegra/plane.c68
4 files changed, 235 insertions, 22 deletions
diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
index 906752d86622..eb005dce392a 100644
--- a/drivers/gpu/drm/tegra/dc.c
+++ b/drivers/gpu/drm/tegra/dc.c
@@ -298,12 +298,60 @@ static void tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index,
298 spin_unlock_irqrestore(&dc->lock, flags); 298 spin_unlock_irqrestore(&dc->lock, flags);
299} 299}
300 300
301static const u32 tegra_primary_plane_formats[] = { 301static const u32 tegra20_primary_formats[] = {
302 DRM_FORMAT_XBGR8888, 302 DRM_FORMAT_ARGB4444,
303 DRM_FORMAT_ARGB1555,
304 DRM_FORMAT_RGB565,
305 DRM_FORMAT_RGBA5551,
303 DRM_FORMAT_ABGR8888, 306 DRM_FORMAT_ABGR8888,
304 DRM_FORMAT_XRGB8888,
305 DRM_FORMAT_ARGB8888, 307 DRM_FORMAT_ARGB8888,
308};
309
310static const u32 tegra114_primary_formats[] = {
311 DRM_FORMAT_ARGB4444,
312 DRM_FORMAT_ARGB1555,
313 DRM_FORMAT_RGB565,
314 DRM_FORMAT_RGBA5551,
315 DRM_FORMAT_ABGR8888,
316 DRM_FORMAT_ARGB8888,
317 /* new on Tegra114 */
318 DRM_FORMAT_ABGR4444,
319 DRM_FORMAT_ABGR1555,
320 DRM_FORMAT_BGRA5551,
321 DRM_FORMAT_XRGB1555,
322 DRM_FORMAT_RGBX5551,
323 DRM_FORMAT_XBGR1555,
324 DRM_FORMAT_BGRX5551,
325 DRM_FORMAT_BGR565,
326 DRM_FORMAT_BGRA8888,
327 DRM_FORMAT_RGBA8888,
328 DRM_FORMAT_XRGB8888,
329 DRM_FORMAT_XBGR8888,
330};
331
332static const u32 tegra124_primary_formats[] = {
333 DRM_FORMAT_ARGB4444,
334 DRM_FORMAT_ARGB1555,
306 DRM_FORMAT_RGB565, 335 DRM_FORMAT_RGB565,
336 DRM_FORMAT_RGBA5551,
337 DRM_FORMAT_ABGR8888,
338 DRM_FORMAT_ARGB8888,
339 /* new on Tegra114 */
340 DRM_FORMAT_ABGR4444,
341 DRM_FORMAT_ABGR1555,
342 DRM_FORMAT_BGRA5551,
343 DRM_FORMAT_XRGB1555,
344 DRM_FORMAT_RGBX5551,
345 DRM_FORMAT_XBGR1555,
346 DRM_FORMAT_BGRX5551,
347 DRM_FORMAT_BGR565,
348 DRM_FORMAT_BGRA8888,
349 DRM_FORMAT_RGBA8888,
350 DRM_FORMAT_XRGB8888,
351 DRM_FORMAT_XBGR8888,
352 /* new on Tegra124 */
353 DRM_FORMAT_RGBX8888,
354 DRM_FORMAT_BGRX8888,
307}; 355};
308 356
309static int tegra_plane_atomic_check(struct drm_plane *plane, 357static int tegra_plane_atomic_check(struct drm_plane *plane,
@@ -461,8 +509,8 @@ static struct drm_plane *tegra_primary_plane_create(struct drm_device *drm,
461 if (!plane) 509 if (!plane)
462 return ERR_PTR(-ENOMEM); 510 return ERR_PTR(-ENOMEM);
463 511
464 num_formats = ARRAY_SIZE(tegra_primary_plane_formats); 512 num_formats = dc->soc->num_primary_formats;
465 formats = tegra_primary_plane_formats; 513 formats = dc->soc->primary_formats;
466 514
467 /* 515 /*
468 * XXX compute offset so that we can directly access windows. 516 * XXX compute offset so that we can directly access windows.
@@ -643,12 +691,71 @@ static struct drm_plane *tegra_dc_cursor_plane_create(struct drm_device *drm,
643 return &plane->base; 691 return &plane->base;
644} 692}
645 693
646static const uint32_t tegra_overlay_plane_formats[] = { 694static const u32 tegra20_overlay_formats[] = {
647 DRM_FORMAT_XBGR8888, 695 DRM_FORMAT_ARGB4444,
696 DRM_FORMAT_ARGB1555,
697 DRM_FORMAT_RGB565,
698 DRM_FORMAT_RGBA5551,
699 DRM_FORMAT_ABGR8888,
700 DRM_FORMAT_ARGB8888,
701 /* planar formats */
702 DRM_FORMAT_UYVY,
703 DRM_FORMAT_YUYV,
704 DRM_FORMAT_YUV420,
705 DRM_FORMAT_YUV422,
706};
707
708static const u32 tegra114_overlay_formats[] = {
709 DRM_FORMAT_ARGB4444,
710 DRM_FORMAT_ARGB1555,
711 DRM_FORMAT_RGB565,
712 DRM_FORMAT_RGBA5551,
648 DRM_FORMAT_ABGR8888, 713 DRM_FORMAT_ABGR8888,
649 DRM_FORMAT_XRGB8888,
650 DRM_FORMAT_ARGB8888, 714 DRM_FORMAT_ARGB8888,
715 /* new on Tegra114 */
716 DRM_FORMAT_ABGR4444,
717 DRM_FORMAT_ABGR1555,
718 DRM_FORMAT_BGRA5551,
719 DRM_FORMAT_XRGB1555,
720 DRM_FORMAT_RGBX5551,
721 DRM_FORMAT_XBGR1555,
722 DRM_FORMAT_BGRX5551,
723 DRM_FORMAT_BGR565,
724 DRM_FORMAT_BGRA8888,
725 DRM_FORMAT_RGBA8888,
726 DRM_FORMAT_XRGB8888,
727 DRM_FORMAT_XBGR8888,
728 /* planar formats */
729 DRM_FORMAT_UYVY,
730 DRM_FORMAT_YUYV,
731 DRM_FORMAT_YUV420,
732 DRM_FORMAT_YUV422,
733};
734
735static const u32 tegra124_overlay_formats[] = {
736 DRM_FORMAT_ARGB4444,
737 DRM_FORMAT_ARGB1555,
651 DRM_FORMAT_RGB565, 738 DRM_FORMAT_RGB565,
739 DRM_FORMAT_RGBA5551,
740 DRM_FORMAT_ABGR8888,
741 DRM_FORMAT_ARGB8888,
742 /* new on Tegra114 */
743 DRM_FORMAT_ABGR4444,
744 DRM_FORMAT_ABGR1555,
745 DRM_FORMAT_BGRA5551,
746 DRM_FORMAT_XRGB1555,
747 DRM_FORMAT_RGBX5551,
748 DRM_FORMAT_XBGR1555,
749 DRM_FORMAT_BGRX5551,
750 DRM_FORMAT_BGR565,
751 DRM_FORMAT_BGRA8888,
752 DRM_FORMAT_RGBA8888,
753 DRM_FORMAT_XRGB8888,
754 DRM_FORMAT_XBGR8888,
755 /* new on Tegra124 */
756 DRM_FORMAT_RGBX8888,
757 DRM_FORMAT_BGRX8888,
758 /* planar formats */
652 DRM_FORMAT_UYVY, 759 DRM_FORMAT_UYVY,
653 DRM_FORMAT_YUYV, 760 DRM_FORMAT_YUYV,
654 DRM_FORMAT_YUV420, 761 DRM_FORMAT_YUV420,
@@ -673,8 +780,8 @@ static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm,
673 plane->index = index; 780 plane->index = index;
674 plane->depth = 0; 781 plane->depth = 0;
675 782
676 num_formats = ARRAY_SIZE(tegra_overlay_plane_formats); 783 num_formats = dc->soc->num_overlay_formats;
677 formats = tegra_overlay_plane_formats; 784 formats = dc->soc->overlay_formats;
678 785
679 err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe, 786 err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe,
680 &tegra_plane_funcs, formats, 787 &tegra_plane_funcs, formats,
@@ -1730,6 +1837,10 @@ static const struct tegra_dc_soc_info tegra20_dc_soc_info = {
1730 .has_powergate = false, 1837 .has_powergate = false,
1731 .broken_reset = true, 1838 .broken_reset = true,
1732 .has_nvdisplay = false, 1839 .has_nvdisplay = false,
1840 .num_primary_formats = ARRAY_SIZE(tegra20_primary_formats),
1841 .primary_formats = tegra20_primary_formats,
1842 .num_overlay_formats = ARRAY_SIZE(tegra20_overlay_formats),
1843 .overlay_formats = tegra20_overlay_formats,
1733}; 1844};
1734 1845
1735static const struct tegra_dc_soc_info tegra30_dc_soc_info = { 1846static const struct tegra_dc_soc_info tegra30_dc_soc_info = {
@@ -1741,6 +1852,10 @@ static const struct tegra_dc_soc_info tegra30_dc_soc_info = {
1741 .has_powergate = false, 1852 .has_powergate = false,
1742 .broken_reset = false, 1853 .broken_reset = false,
1743 .has_nvdisplay = false, 1854 .has_nvdisplay = false,
1855 .num_primary_formats = ARRAY_SIZE(tegra20_primary_formats),
1856 .primary_formats = tegra20_primary_formats,
1857 .num_overlay_formats = ARRAY_SIZE(tegra20_overlay_formats),
1858 .overlay_formats = tegra20_overlay_formats,
1744}; 1859};
1745 1860
1746static const struct tegra_dc_soc_info tegra114_dc_soc_info = { 1861static const struct tegra_dc_soc_info tegra114_dc_soc_info = {
@@ -1752,6 +1867,10 @@ static const struct tegra_dc_soc_info tegra114_dc_soc_info = {
1752 .has_powergate = true, 1867 .has_powergate = true,
1753 .broken_reset = false, 1868 .broken_reset = false,
1754 .has_nvdisplay = false, 1869 .has_nvdisplay = false,
1870 .num_primary_formats = ARRAY_SIZE(tegra114_primary_formats),
1871 .primary_formats = tegra114_primary_formats,
1872 .num_overlay_formats = ARRAY_SIZE(tegra114_overlay_formats),
1873 .overlay_formats = tegra114_overlay_formats,
1755}; 1874};
1756 1875
1757static const struct tegra_dc_soc_info tegra124_dc_soc_info = { 1876static const struct tegra_dc_soc_info tegra124_dc_soc_info = {
@@ -1763,6 +1882,10 @@ static const struct tegra_dc_soc_info tegra124_dc_soc_info = {
1763 .has_powergate = true, 1882 .has_powergate = true,
1764 .broken_reset = false, 1883 .broken_reset = false,
1765 .has_nvdisplay = false, 1884 .has_nvdisplay = false,
1885 .num_primary_formats = ARRAY_SIZE(tegra124_primary_formats),
1886 .primary_formats = tegra114_primary_formats,
1887 .num_overlay_formats = ARRAY_SIZE(tegra124_overlay_formats),
1888 .overlay_formats = tegra114_overlay_formats,
1766}; 1889};
1767 1890
1768static const struct tegra_dc_soc_info tegra210_dc_soc_info = { 1891static const struct tegra_dc_soc_info tegra210_dc_soc_info = {
@@ -1774,6 +1897,10 @@ static const struct tegra_dc_soc_info tegra210_dc_soc_info = {
1774 .has_powergate = true, 1897 .has_powergate = true,
1775 .broken_reset = false, 1898 .broken_reset = false,
1776 .has_nvdisplay = false, 1899 .has_nvdisplay = false,
1900 .num_primary_formats = ARRAY_SIZE(tegra114_primary_formats),
1901 .primary_formats = tegra114_primary_formats,
1902 .num_overlay_formats = ARRAY_SIZE(tegra114_overlay_formats),
1903 .overlay_formats = tegra114_overlay_formats,
1777}; 1904};
1778 1905
1779static const struct tegra_windowgroup_soc tegra186_dc_wgrps[] = { 1906static const struct tegra_windowgroup_soc tegra186_dc_wgrps[] = {
diff --git a/drivers/gpu/drm/tegra/dc.h b/drivers/gpu/drm/tegra/dc.h
index 336d2c22f521..d680027fa272 100644
--- a/drivers/gpu/drm/tegra/dc.h
+++ b/drivers/gpu/drm/tegra/dc.h
@@ -61,6 +61,10 @@ struct tegra_dc_soc_info {
61 bool has_nvdisplay; 61 bool has_nvdisplay;
62 const struct tegra_windowgroup_soc *wgrps; 62 const struct tegra_windowgroup_soc *wgrps;
63 unsigned int num_wgrps; 63 unsigned int num_wgrps;
64 const u32 *primary_formats;
65 unsigned int num_primary_formats;
66 const u32 *overlay_formats;
67 unsigned int num_overlay_formats;
64}; 68};
65 69
66struct tegra_dc { 70struct tegra_dc {
@@ -582,9 +586,9 @@ int tegra_dc_rgb_exit(struct tegra_dc *dc);
582#define WIN_COLOR_DEPTH_P4 2 586#define WIN_COLOR_DEPTH_P4 2
583#define WIN_COLOR_DEPTH_P8 3 587#define WIN_COLOR_DEPTH_P8 3
584#define WIN_COLOR_DEPTH_B4G4R4A4 4 588#define WIN_COLOR_DEPTH_B4G4R4A4 4
585#define WIN_COLOR_DEPTH_B5G5R5A 5 589#define WIN_COLOR_DEPTH_B5G5R5A1 5
586#define WIN_COLOR_DEPTH_B5G6R5 6 590#define WIN_COLOR_DEPTH_B5G6R5 6
587#define WIN_COLOR_DEPTH_AB5G5R5 7 591#define WIN_COLOR_DEPTH_A1B5G5R5 7
588#define WIN_COLOR_DEPTH_B8G8R8A8 12 592#define WIN_COLOR_DEPTH_B8G8R8A8 12
589#define WIN_COLOR_DEPTH_R8G8B8A8 13 593#define WIN_COLOR_DEPTH_R8G8B8A8 13
590#define WIN_COLOR_DEPTH_B6x2G6x2R6x2A8 14 594#define WIN_COLOR_DEPTH_B6x2G6x2R6x2A8 14
@@ -599,8 +603,20 @@ int tegra_dc_rgb_exit(struct tegra_dc *dc);
599#define WIN_COLOR_DEPTH_YUV422R 23 603#define WIN_COLOR_DEPTH_YUV422R 23
600#define WIN_COLOR_DEPTH_YCbCr422RA 24 604#define WIN_COLOR_DEPTH_YCbCr422RA 24
601#define WIN_COLOR_DEPTH_YUV422RA 25 605#define WIN_COLOR_DEPTH_YUV422RA 25
606#define WIN_COLOR_DEPTH_R4G4B4A4 27
607#define WIN_COLOR_DEPTH_R5G5B5A 28
608#define WIN_COLOR_DEPTH_AR5G5B5 29
609#define WIN_COLOR_DEPTH_B5G5R5X1 30
610#define WIN_COLOR_DEPTH_X1B5G5R5 31
611#define WIN_COLOR_DEPTH_R5G5B5X1 32
612#define WIN_COLOR_DEPTH_X1R5G5B5 33
613#define WIN_COLOR_DEPTH_R5G6B5 34
614#define WIN_COLOR_DEPTH_A8R8G8B8 35
615#define WIN_COLOR_DEPTH_A8B8G8R8 36
602#define WIN_COLOR_DEPTH_B8G8R8X8 37 616#define WIN_COLOR_DEPTH_B8G8R8X8 37
603#define WIN_COLOR_DEPTH_R8G8B8X8 38 617#define WIN_COLOR_DEPTH_R8G8B8X8 38
618#define WIN_COLOR_DEPTH_X8B8G8R8 65
619#define WIN_COLOR_DEPTH_X8R8G8B8 66
604 620
605#define DC_WIN_POSITION 0x704 621#define DC_WIN_POSITION 0x704
606#define H_POSITION(x) (((x) & 0x1fff) << 0) /* XXX 0x7fff on Tegra186 */ 622#define H_POSITION(x) (((x) & 0x1fff) << 0) /* XXX 0x7fff on Tegra186 */
diff --git a/drivers/gpu/drm/tegra/hub.c b/drivers/gpu/drm/tegra/hub.c
index 33d008fb8745..cccd44711d68 100644
--- a/drivers/gpu/drm/tegra/hub.c
+++ b/drivers/gpu/drm/tegra/hub.c
@@ -26,9 +26,27 @@
26#include "plane.h" 26#include "plane.h"
27 27
28static const u32 tegra_shared_plane_formats[] = { 28static const u32 tegra_shared_plane_formats[] = {
29 DRM_FORMAT_XBGR8888, 29 DRM_FORMAT_ARGB1555,
30 DRM_FORMAT_XRGB8888,
31 DRM_FORMAT_RGB565, 30 DRM_FORMAT_RGB565,
31 DRM_FORMAT_RGBA5551,
32 DRM_FORMAT_ARGB8888,
33 DRM_FORMAT_ABGR8888,
34 /* new on Tegra114 */
35 DRM_FORMAT_ABGR4444,
36 DRM_FORMAT_ABGR1555,
37 DRM_FORMAT_BGRA5551,
38 DRM_FORMAT_XRGB1555,
39 DRM_FORMAT_RGBX5551,
40 DRM_FORMAT_XBGR1555,
41 DRM_FORMAT_BGRX5551,
42 DRM_FORMAT_BGR565,
43 DRM_FORMAT_XRGB8888,
44 DRM_FORMAT_XBGR8888,
45 /* planar formats */
46 DRM_FORMAT_UYVY,
47 DRM_FORMAT_YUYV,
48 DRM_FORMAT_YUV420,
49 DRM_FORMAT_YUV422,
32}; 50};
33 51
34static inline unsigned int tegra_plane_offset(struct tegra_shared_plane *plane, 52static inline unsigned int tegra_plane_offset(struct tegra_shared_plane *plane,
diff --git a/drivers/gpu/drm/tegra/plane.c b/drivers/gpu/drm/tegra/plane.c
index 88b5aea4a48e..9146aead973b 100644
--- a/drivers/gpu/drm/tegra/plane.c
+++ b/drivers/gpu/drm/tegra/plane.c
@@ -110,24 +110,76 @@ int tegra_plane_format(u32 fourcc, u32 *format, u32 *swap)
110 *swap = BYTE_SWAP_NOSWAP; 110 *swap = BYTE_SWAP_NOSWAP;
111 111
112 switch (fourcc) { 112 switch (fourcc) {
113 case DRM_FORMAT_XBGR8888: 113 case DRM_FORMAT_ARGB4444:
114 *format = WIN_COLOR_DEPTH_R8G8B8X8; 114 *format = WIN_COLOR_DEPTH_B4G4R4A4;
115 break; 115 break;
116 116
117 case DRM_FORMAT_ABGR8888: 117 case DRM_FORMAT_ARGB1555:
118 *format = WIN_COLOR_DEPTH_R8G8B8A8; 118 *format = WIN_COLOR_DEPTH_B5G5R5A1;
119 break; 119 break;
120 120
121 case DRM_FORMAT_XRGB8888: 121 case DRM_FORMAT_RGB565:
122 *format = WIN_COLOR_DEPTH_B8G8R8X8; 122 *format = WIN_COLOR_DEPTH_B5G6R5;
123 break;
124
125 case DRM_FORMAT_RGBA5551:
126 *format = WIN_COLOR_DEPTH_A1B5G5R5;
123 break; 127 break;
124 128
125 case DRM_FORMAT_ARGB8888: 129 case DRM_FORMAT_ARGB8888:
126 *format = WIN_COLOR_DEPTH_B8G8R8A8; 130 *format = WIN_COLOR_DEPTH_B8G8R8A8;
127 break; 131 break;
128 132
129 case DRM_FORMAT_RGB565: 133 case DRM_FORMAT_ABGR8888:
130 *format = WIN_COLOR_DEPTH_B5G6R5; 134 *format = WIN_COLOR_DEPTH_R8G8B8A8;
135 break;
136
137 case DRM_FORMAT_ABGR4444:
138 *format = WIN_COLOR_DEPTH_R4G4B4A4;
139 break;
140
141 case DRM_FORMAT_ABGR1555:
142 *format = WIN_COLOR_DEPTH_R5G5B5A;
143 break;
144
145 case DRM_FORMAT_BGRA5551:
146 *format = WIN_COLOR_DEPTH_AR5G5B5;
147 break;
148
149 case DRM_FORMAT_XRGB1555:
150 *format = WIN_COLOR_DEPTH_B5G5R5X1;
151 break;
152
153 case DRM_FORMAT_RGBX5551:
154 *format = WIN_COLOR_DEPTH_X1B5G5R5;
155 break;
156
157 case DRM_FORMAT_XBGR1555:
158 *format = WIN_COLOR_DEPTH_R5G5B5X1;
159 break;
160
161 case DRM_FORMAT_BGRX5551:
162 *format = WIN_COLOR_DEPTH_X1R5G5B5;
163 break;
164
165 case DRM_FORMAT_BGR565:
166 *format = WIN_COLOR_DEPTH_R5G6B5;
167 break;
168
169 case DRM_FORMAT_BGRA8888:
170 *format = WIN_COLOR_DEPTH_A8R8G8B8;
171 break;
172
173 case DRM_FORMAT_RGBA8888:
174 *format = WIN_COLOR_DEPTH_A8B8G8R8;
175 break;
176
177 case DRM_FORMAT_XRGB8888:
178 *format = WIN_COLOR_DEPTH_B8G8R8X8;
179 break;
180
181 case DRM_FORMAT_XBGR8888:
182 *format = WIN_COLOR_DEPTH_R8G8B8X8;
131 break; 183 break;
132 184
133 case DRM_FORMAT_UYVY: 185 case DRM_FORMAT_UYVY: