|
@@ -298,12 +298,60 @@ static void tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index,
|
|
|
spin_unlock_irqrestore(&dc->lock, flags);
|
|
|
}
|
|
|
|
|
|
-static const u32 tegra_primary_plane_formats[] = {
|
|
|
- DRM_FORMAT_XBGR8888,
|
|
|
+static const u32 tegra20_primary_formats[] = {
|
|
|
+ DRM_FORMAT_ARGB4444,
|
|
|
+ DRM_FORMAT_ARGB1555,
|
|
|
+ DRM_FORMAT_RGB565,
|
|
|
+ DRM_FORMAT_RGBA5551,
|
|
|
DRM_FORMAT_ABGR8888,
|
|
|
- DRM_FORMAT_XRGB8888,
|
|
|
DRM_FORMAT_ARGB8888,
|
|
|
+};
|
|
|
+
|
|
|
+static const u32 tegra114_primary_formats[] = {
|
|
|
+ DRM_FORMAT_ARGB4444,
|
|
|
+ DRM_FORMAT_ARGB1555,
|
|
|
+ DRM_FORMAT_RGB565,
|
|
|
+ DRM_FORMAT_RGBA5551,
|
|
|
+ DRM_FORMAT_ABGR8888,
|
|
|
+ DRM_FORMAT_ARGB8888,
|
|
|
+ /* new on Tegra114 */
|
|
|
+ DRM_FORMAT_ABGR4444,
|
|
|
+ DRM_FORMAT_ABGR1555,
|
|
|
+ DRM_FORMAT_BGRA5551,
|
|
|
+ DRM_FORMAT_XRGB1555,
|
|
|
+ DRM_FORMAT_RGBX5551,
|
|
|
+ DRM_FORMAT_XBGR1555,
|
|
|
+ DRM_FORMAT_BGRX5551,
|
|
|
+ DRM_FORMAT_BGR565,
|
|
|
+ DRM_FORMAT_BGRA8888,
|
|
|
+ DRM_FORMAT_RGBA8888,
|
|
|
+ DRM_FORMAT_XRGB8888,
|
|
|
+ DRM_FORMAT_XBGR8888,
|
|
|
+};
|
|
|
+
|
|
|
+static const u32 tegra124_primary_formats[] = {
|
|
|
+ DRM_FORMAT_ARGB4444,
|
|
|
+ DRM_FORMAT_ARGB1555,
|
|
|
DRM_FORMAT_RGB565,
|
|
|
+ DRM_FORMAT_RGBA5551,
|
|
|
+ DRM_FORMAT_ABGR8888,
|
|
|
+ DRM_FORMAT_ARGB8888,
|
|
|
+ /* new on Tegra114 */
|
|
|
+ DRM_FORMAT_ABGR4444,
|
|
|
+ DRM_FORMAT_ABGR1555,
|
|
|
+ DRM_FORMAT_BGRA5551,
|
|
|
+ DRM_FORMAT_XRGB1555,
|
|
|
+ DRM_FORMAT_RGBX5551,
|
|
|
+ DRM_FORMAT_XBGR1555,
|
|
|
+ DRM_FORMAT_BGRX5551,
|
|
|
+ DRM_FORMAT_BGR565,
|
|
|
+ DRM_FORMAT_BGRA8888,
|
|
|
+ DRM_FORMAT_RGBA8888,
|
|
|
+ DRM_FORMAT_XRGB8888,
|
|
|
+ DRM_FORMAT_XBGR8888,
|
|
|
+ /* new on Tegra124 */
|
|
|
+ DRM_FORMAT_RGBX8888,
|
|
|
+ DRM_FORMAT_BGRX8888,
|
|
|
};
|
|
|
|
|
|
static 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,
|
|
|
if (!plane)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- num_formats = ARRAY_SIZE(tegra_primary_plane_formats);
|
|
|
- formats = tegra_primary_plane_formats;
|
|
|
+ num_formats = dc->soc->num_primary_formats;
|
|
|
+ formats = dc->soc->primary_formats;
|
|
|
|
|
|
/*
|
|
|
* 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,
|
|
|
return &plane->base;
|
|
|
}
|
|
|
|
|
|
-static const uint32_t tegra_overlay_plane_formats[] = {
|
|
|
- DRM_FORMAT_XBGR8888,
|
|
|
+static const u32 tegra20_overlay_formats[] = {
|
|
|
+ DRM_FORMAT_ARGB4444,
|
|
|
+ DRM_FORMAT_ARGB1555,
|
|
|
+ DRM_FORMAT_RGB565,
|
|
|
+ DRM_FORMAT_RGBA5551,
|
|
|
+ DRM_FORMAT_ABGR8888,
|
|
|
+ DRM_FORMAT_ARGB8888,
|
|
|
+ /* planar formats */
|
|
|
+ DRM_FORMAT_UYVY,
|
|
|
+ DRM_FORMAT_YUYV,
|
|
|
+ DRM_FORMAT_YUV420,
|
|
|
+ DRM_FORMAT_YUV422,
|
|
|
+};
|
|
|
+
|
|
|
+static const u32 tegra114_overlay_formats[] = {
|
|
|
+ DRM_FORMAT_ARGB4444,
|
|
|
+ DRM_FORMAT_ARGB1555,
|
|
|
+ DRM_FORMAT_RGB565,
|
|
|
+ DRM_FORMAT_RGBA5551,
|
|
|
DRM_FORMAT_ABGR8888,
|
|
|
- DRM_FORMAT_XRGB8888,
|
|
|
DRM_FORMAT_ARGB8888,
|
|
|
+ /* new on Tegra114 */
|
|
|
+ DRM_FORMAT_ABGR4444,
|
|
|
+ DRM_FORMAT_ABGR1555,
|
|
|
+ DRM_FORMAT_BGRA5551,
|
|
|
+ DRM_FORMAT_XRGB1555,
|
|
|
+ DRM_FORMAT_RGBX5551,
|
|
|
+ DRM_FORMAT_XBGR1555,
|
|
|
+ DRM_FORMAT_BGRX5551,
|
|
|
+ DRM_FORMAT_BGR565,
|
|
|
+ DRM_FORMAT_BGRA8888,
|
|
|
+ DRM_FORMAT_RGBA8888,
|
|
|
+ DRM_FORMAT_XRGB8888,
|
|
|
+ DRM_FORMAT_XBGR8888,
|
|
|
+ /* planar formats */
|
|
|
+ DRM_FORMAT_UYVY,
|
|
|
+ DRM_FORMAT_YUYV,
|
|
|
+ DRM_FORMAT_YUV420,
|
|
|
+ DRM_FORMAT_YUV422,
|
|
|
+};
|
|
|
+
|
|
|
+static const u32 tegra124_overlay_formats[] = {
|
|
|
+ DRM_FORMAT_ARGB4444,
|
|
|
+ DRM_FORMAT_ARGB1555,
|
|
|
DRM_FORMAT_RGB565,
|
|
|
+ DRM_FORMAT_RGBA5551,
|
|
|
+ DRM_FORMAT_ABGR8888,
|
|
|
+ DRM_FORMAT_ARGB8888,
|
|
|
+ /* new on Tegra114 */
|
|
|
+ DRM_FORMAT_ABGR4444,
|
|
|
+ DRM_FORMAT_ABGR1555,
|
|
|
+ DRM_FORMAT_BGRA5551,
|
|
|
+ DRM_FORMAT_XRGB1555,
|
|
|
+ DRM_FORMAT_RGBX5551,
|
|
|
+ DRM_FORMAT_XBGR1555,
|
|
|
+ DRM_FORMAT_BGRX5551,
|
|
|
+ DRM_FORMAT_BGR565,
|
|
|
+ DRM_FORMAT_BGRA8888,
|
|
|
+ DRM_FORMAT_RGBA8888,
|
|
|
+ DRM_FORMAT_XRGB8888,
|
|
|
+ DRM_FORMAT_XBGR8888,
|
|
|
+ /* new on Tegra124 */
|
|
|
+ DRM_FORMAT_RGBX8888,
|
|
|
+ DRM_FORMAT_BGRX8888,
|
|
|
+ /* planar formats */
|
|
|
DRM_FORMAT_UYVY,
|
|
|
DRM_FORMAT_YUYV,
|
|
|
DRM_FORMAT_YUV420,
|
|
@@ -673,8 +780,8 @@ static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm,
|
|
|
plane->index = index;
|
|
|
plane->depth = 0;
|
|
|
|
|
|
- num_formats = ARRAY_SIZE(tegra_overlay_plane_formats);
|
|
|
- formats = tegra_overlay_plane_formats;
|
|
|
+ num_formats = dc->soc->num_overlay_formats;
|
|
|
+ formats = dc->soc->overlay_formats;
|
|
|
|
|
|
err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe,
|
|
|
&tegra_plane_funcs, formats,
|
|
@@ -1730,6 +1837,10 @@ static const struct tegra_dc_soc_info tegra20_dc_soc_info = {
|
|
|
.has_powergate = false,
|
|
|
.broken_reset = true,
|
|
|
.has_nvdisplay = false,
|
|
|
+ .num_primary_formats = ARRAY_SIZE(tegra20_primary_formats),
|
|
|
+ .primary_formats = tegra20_primary_formats,
|
|
|
+ .num_overlay_formats = ARRAY_SIZE(tegra20_overlay_formats),
|
|
|
+ .overlay_formats = tegra20_overlay_formats,
|
|
|
};
|
|
|
|
|
|
static 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 = {
|
|
|
.has_powergate = false,
|
|
|
.broken_reset = false,
|
|
|
.has_nvdisplay = false,
|
|
|
+ .num_primary_formats = ARRAY_SIZE(tegra20_primary_formats),
|
|
|
+ .primary_formats = tegra20_primary_formats,
|
|
|
+ .num_overlay_formats = ARRAY_SIZE(tegra20_overlay_formats),
|
|
|
+ .overlay_formats = tegra20_overlay_formats,
|
|
|
};
|
|
|
|
|
|
static 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 = {
|
|
|
.has_powergate = true,
|
|
|
.broken_reset = false,
|
|
|
.has_nvdisplay = false,
|
|
|
+ .num_primary_formats = ARRAY_SIZE(tegra114_primary_formats),
|
|
|
+ .primary_formats = tegra114_primary_formats,
|
|
|
+ .num_overlay_formats = ARRAY_SIZE(tegra114_overlay_formats),
|
|
|
+ .overlay_formats = tegra114_overlay_formats,
|
|
|
};
|
|
|
|
|
|
static 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 = {
|
|
|
.has_powergate = true,
|
|
|
.broken_reset = false,
|
|
|
.has_nvdisplay = false,
|
|
|
+ .num_primary_formats = ARRAY_SIZE(tegra124_primary_formats),
|
|
|
+ .primary_formats = tegra114_primary_formats,
|
|
|
+ .num_overlay_formats = ARRAY_SIZE(tegra124_overlay_formats),
|
|
|
+ .overlay_formats = tegra114_overlay_formats,
|
|
|
};
|
|
|
|
|
|
static 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 = {
|
|
|
.has_powergate = true,
|
|
|
.broken_reset = false,
|
|
|
.has_nvdisplay = false,
|
|
|
+ .num_primary_formats = ARRAY_SIZE(tegra114_primary_formats),
|
|
|
+ .primary_formats = tegra114_primary_formats,
|
|
|
+ .num_overlay_formats = ARRAY_SIZE(tegra114_overlay_formats),
|
|
|
+ .overlay_formats = tegra114_overlay_formats,
|
|
|
};
|
|
|
|
|
|
static const struct tegra_windowgroup_soc tegra186_dc_wgrps[] = {
|