From c7fc1e1cf922bd548ac983ef48b883b6f83e35ae Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 18 Mar 2019 16:38:32 -0700 Subject: [PATCH] drm/vc4: Expose the format modifiers for firmware kms. This should technically not expose VC4_T_TILED on pi4. However, if we don't expose anything, then userspace will assume that display can handle whatever modifiers 3d can do (UIF on 2711). By exposing a list, that will get intersected with what 3D can do so that we get T tiling for display on 2710 and linear on 2711. Signed-off-by: Eric Anholt --- drivers/gpu/drm/vc4/vc4_firmware_kms.c | 33 +++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) --- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c +++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c @@ -281,6 +281,27 @@ static void vc4_plane_destroy(struct drm drm_plane_cleanup(plane); } +static bool vc4_fkms_format_mod_supported(struct drm_plane *plane, + uint32_t format, + uint64_t modifier) +{ + /* Support T_TILING for RGB formats only. */ + switch (format) { + case DRM_FORMAT_XRGB8888: + case DRM_FORMAT_ARGB8888: + switch (modifier) { + case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED: + case DRM_FORMAT_MOD_LINEAR: + case DRM_FORMAT_MOD_BROADCOM_UIF: + return true; + default: + return false; + } + default: + return false; + } +} + static const struct drm_plane_funcs vc4_plane_funcs = { .update_plane = drm_atomic_helper_update_plane, .disable_plane = drm_atomic_helper_disable_plane, @@ -289,6 +310,7 @@ static const struct drm_plane_funcs vc4_ .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 = vc4_fkms_format_mod_supported, }; static const struct drm_plane_helper_funcs vc4_primary_plane_helper_funcs = { @@ -316,6 +338,14 @@ static struct drm_plane *vc4_fkms_plane_ u32 argb8888 = DRM_FORMAT_ARGB8888; int ret = 0; bool primary = (type == DRM_PLANE_TYPE_PRIMARY); + static const uint64_t modifiers[] = { + DRM_FORMAT_MOD_LINEAR, + /* VC4_T_TILED should come after linear, because we + * would prefer to scan out linear (less bus traffic). + */ + DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED, + DRM_FORMAT_MOD_INVALID, + }; vc4_plane = devm_kzalloc(dev->dev, sizeof(*vc4_plane), GFP_KERNEL); @@ -327,7 +357,8 @@ static struct drm_plane *vc4_fkms_plane_ plane = &vc4_plane->base; ret = drm_universal_plane_init(dev, plane, 0xff, &vc4_plane_funcs, - primary ? &xrgb8888 : &argb8888, 1, NULL, + primary ? &xrgb8888 : &argb8888, 1, + modifiers, type, primary ? "primary" : "cursor"); if (type == DRM_PLANE_TYPE_PRIMARY) {