This file was split in commit 5d945cbcd4b16a29d6470a80dfb19738f9a4319f
("drm/amd/display: Create a file dedicated to planes") the logic in
dm_plane_format_mod_supported() function got changed by a switch logic.
That change broke drm_plane modifiers setting on series 5000 APUs
(tested on OXP mini AMD 5800U and HP Dev One 5850U PRO)
leading to Gamescope not working as reproted on GitHub[1]

To reproduce the issue, enter a TTY and run:

$ gamescope -- vkcube

With said commit applied it will abort. This one restores the old logic,
fixing the issue that affects Gamescope.

[1](https://github.com/Plagman/gamescope/issues/624)

Signed-off-by: Joaquín Ignacio Aramendía <samsa...@gmail.com>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_plane.c   | 50 +++----------------
 1 file changed, 8 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
index dfd3be49eac8..81c1fc9468b8 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c
@@ -1371,6 +1371,8 @@ static bool dm_plane_format_mod_supported(struct 
drm_plane *plane,
        const struct drm_format_info *info = drm_format_info(format);
        struct hw_asic_id asic_id = adev->dm.dc->ctx->asic_id;
 
+       int i;
+
        enum dm_micro_swizzle microtile = modifier_gfx9_swizzle_mode(modifier) 
& 3;
 
        if (!info)
@@ -1386,49 +1388,13 @@ static bool dm_plane_format_mod_supported(struct 
drm_plane *plane,
                return true;
        }
 
-       /* check if swizzle mode is supported by this version of DCN */
-       switch (asic_id.chip_family) {
-       case FAMILY_SI:
-       case FAMILY_CI:
-       case FAMILY_KV:
-       case FAMILY_CZ:
-       case FAMILY_VI:
-               /* asics before AI does not have modifier support */
-               return false;
-       case FAMILY_AI:
-       case FAMILY_RV:
-       case FAMILY_NV:
-       case FAMILY_VGH:
-       case FAMILY_YELLOW_CARP:
-       case AMDGPU_FAMILY_GC_10_3_6:
-       case AMDGPU_FAMILY_GC_10_3_7:
-               switch (AMD_FMT_MOD_GET(TILE, modifier)) {
-               case AMD_FMT_MOD_TILE_GFX9_64K_R_X:
-               case AMD_FMT_MOD_TILE_GFX9_64K_D_X:
-               case AMD_FMT_MOD_TILE_GFX9_64K_S_X:
-               case AMD_FMT_MOD_TILE_GFX9_64K_D:
-                       return true;
-               default:
-                       return false;
-               }
-               break;
-       case AMDGPU_FAMILY_GC_11_0_0:
-       case AMDGPU_FAMILY_GC_11_0_1:
-               switch (AMD_FMT_MOD_GET(TILE, modifier)) {
-               case AMD_FMT_MOD_TILE_GFX11_256K_R_X:
-               case AMD_FMT_MOD_TILE_GFX9_64K_R_X:
-               case AMD_FMT_MOD_TILE_GFX9_64K_D_X:
-               case AMD_FMT_MOD_TILE_GFX9_64K_S_X:
-               case AMD_FMT_MOD_TILE_GFX9_64K_D:
-                       return true;
-               default:
-                       return false;
-               }
-               break;
-       default:
-               ASSERT(0); /* Unknown asic */
-               break;
+       /* Check that the modifier is on the list of the plane's supported 
modifiers. */
+       for (i = 0; i < plane->modifier_count; i++) {
+               if (modifier == plane->modifiers[i])
+                       break;
        }
+       if (i == plane->modifier_count)
+               return false;
 
        /*
         * For D swizzle the canonical modifier depends on the bpp, so check
-- 
2.38.0

Reply via email to