drm/tinydrm: Advertise that we can do only DRM_FORMAT_MOD_LINEAR.
authorEric Anholt <eric@anholt.net>
Thu, 25 Oct 2018 16:26:35 +0000 (09:26 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 30 Oct 2018 20:01:50 +0000 (13:01 -0700)
Without this, the xserver relies on what the 3D driver exposes and
assumes that the display can handle it, and then the DRM driver
happily tries to scan out a tiled format.

Signed-off-by: Eric Anholt <eric@anholt.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20181025162635.6689-1-eric@anholt.net
Acked-by: Noralf Trønnes <noralf@tronnes.org>
drivers/gpu/drm/drm_simple_kms_helper.c
drivers/gpu/drm/tinydrm/core/tinydrm-core.c
drivers/gpu/drm/tinydrm/core/tinydrm-pipe.c

index 51fa978..9178124 100644 (file)
@@ -190,6 +190,13 @@ static void drm_simple_kms_plane_cleanup_fb(struct drm_plane *plane,
        pipe->funcs->cleanup_fb(pipe, state);
 }
 
+static bool drm_simple_kms_format_mod_supported(struct drm_plane *plane,
+                                               uint32_t format,
+                                               uint64_t modifier)
+{
+       return modifier == DRM_FORMAT_MOD_LINEAR;
+}
+
 static const struct drm_plane_helper_funcs drm_simple_kms_plane_helper_funcs = {
        .prepare_fb = drm_simple_kms_plane_prepare_fb,
        .cleanup_fb = drm_simple_kms_plane_cleanup_fb,
@@ -204,6 +211,7 @@ static const struct drm_plane_funcs drm_simple_kms_plane_funcs = {
        .reset                  = drm_atomic_helper_plane_reset,
        .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
        .atomic_destroy_state   = drm_atomic_helper_plane_destroy_state,
+       .format_mod_supported   = drm_simple_kms_format_mod_supported,
 };
 
 /**
index 255341e..9af51d9 100644 (file)
@@ -146,6 +146,7 @@ static int tinydrm_init(struct device *parent, struct tinydrm_device *tdev,
        drm->dev_private = tdev;
        drm_mode_config_init(drm);
        drm->mode_config.funcs = &tinydrm_mode_config_funcs;
+       drm->mode_config.allow_fb_modifiers = true;
 
        return 0;
 }
index 7e8e24d..eacfc0e 100644 (file)
@@ -184,6 +184,10 @@ tinydrm_display_pipe_init(struct tinydrm_device *tdev,
        struct drm_display_mode mode_copy;
        struct drm_connector *connector;
        int ret;
+       static const uint64_t modifiers[] = {
+               DRM_FORMAT_MOD_LINEAR,
+               DRM_FORMAT_MOD_INVALID
+       };
 
        drm_mode_copy(&mode_copy, mode);
        ret = tinydrm_rotate_mode(&mode_copy, rotation);
@@ -202,6 +206,6 @@ tinydrm_display_pipe_init(struct tinydrm_device *tdev,
                return PTR_ERR(connector);
 
        return drm_simple_display_pipe_init(drm, &tdev->pipe, funcs, formats,
-                                           format_count, NULL, connector);
+                                           format_count, modifiers, connector);
 }
 EXPORT_SYMBOL(tinydrm_display_pipe_init);