@@ -298,12 +298,60 @@ static void tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index,
298298 spin_unlock_irqrestore (& dc -> lock , flags );
299299}
300300
301- static const u32 tegra_primary_plane_formats [] = {
302- DRM_FORMAT_XBGR8888 ,
301+ static const u32 tegra20_primary_formats [] = {
302+ DRM_FORMAT_ARGB4444 ,
303+ DRM_FORMAT_ARGB1555 ,
304+ DRM_FORMAT_RGB565 ,
305+ DRM_FORMAT_RGBA5551 ,
303306 DRM_FORMAT_ABGR8888 ,
304- DRM_FORMAT_XRGB8888 ,
305307 DRM_FORMAT_ARGB8888 ,
308+ };
309+
310+ static 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+
332+ static const u32 tegra124_primary_formats [] = {
333+ DRM_FORMAT_ARGB4444 ,
334+ DRM_FORMAT_ARGB1555 ,
306335 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 ,
307355};
308356
309357static 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,
461509 if (!plane )
462510 return ERR_PTR (- ENOMEM );
463511
464- num_formats = ARRAY_SIZE ( tegra_primary_plane_formats ) ;
465- formats = tegra_primary_plane_formats ;
512+ num_formats = dc -> soc -> num_primary_formats ;
513+ formats = dc -> soc -> primary_formats ;
466514
467515 /*
468516 * 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,
643691 return & plane -> base ;
644692}
645693
646- static const uint32_t tegra_overlay_plane_formats [] = {
647- DRM_FORMAT_XBGR8888 ,
694+ static const u32 tegra20_overlay_formats [] = {
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+
708+ static const u32 tegra114_overlay_formats [] = {
709+ DRM_FORMAT_ARGB4444 ,
710+ DRM_FORMAT_ARGB1555 ,
711+ DRM_FORMAT_RGB565 ,
712+ DRM_FORMAT_RGBA5551 ,
648713 DRM_FORMAT_ABGR8888 ,
649- DRM_FORMAT_XRGB8888 ,
650714 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+
735+ static const u32 tegra124_overlay_formats [] = {
736+ DRM_FORMAT_ARGB4444 ,
737+ DRM_FORMAT_ARGB1555 ,
651738 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 */
652759 DRM_FORMAT_UYVY ,
653760 DRM_FORMAT_YUYV ,
654761 DRM_FORMAT_YUV420 ,
@@ -673,8 +780,8 @@ static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm,
673780 plane -> index = index ;
674781 plane -> depth = 0 ;
675782
676- num_formats = ARRAY_SIZE ( tegra_overlay_plane_formats ) ;
677- formats = tegra_overlay_plane_formats ;
783+ num_formats = dc -> soc -> num_overlay_formats ;
784+ formats = dc -> soc -> overlay_formats ;
678785
679786 err = drm_universal_plane_init (drm , & plane -> base , 1 << dc -> pipe ,
680787 & tegra_plane_funcs , formats ,
@@ -1730,6 +1837,10 @@ static const struct tegra_dc_soc_info tegra20_dc_soc_info = {
17301837 .has_powergate = false,
17311838 .broken_reset = true,
17321839 .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 ,
17331844};
17341845
17351846static 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 = {
17411852 .has_powergate = false,
17421853 .broken_reset = false,
17431854 .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 ,
17441859};
17451860
17461861static 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 = {
17521867 .has_powergate = true,
17531868 .broken_reset = false,
17541869 .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 ,
17551874};
17561875
17571876static 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 = {
17631882 .has_powergate = true,
17641883 .broken_reset = false,
17651884 .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 ,
17661889};
17671890
17681891static 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 = {
17741897 .has_powergate = true,
17751898 .broken_reset = false,
17761899 .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 ,
17771904};
17781905
17791906static const struct tegra_windowgroup_soc tegra186_dc_wgrps [] = {
0 commit comments