Skip to content

Commit 21e6f60

Browse files
Aurabindo Pillaialexdeucher
authored andcommitted
drm/amd/display: Allow display DCC for DCN401
To enable mesa to use display dcc, DM should expose them in the supported modifiers. Add the best (most efficient) modifiers first. Signed-off-by: Aurabindo Pillai <[email protected]> Acked-by: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent a85cc86 commit 21e6f60

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -689,13 +689,32 @@ static void amdgpu_dm_plane_add_gfx12_modifiers(struct amdgpu_device *adev,
689689
uint64_t **mods, uint64_t *size, uint64_t *capacity)
690690
{
691691
uint64_t ver = AMD_FMT_MOD | AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX12);
692+
uint64_t mod_256k = ver | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX12_256K_2D);
693+
uint64_t mod_64k = ver | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX12_64K_2D);
694+
uint64_t mod_4k = ver | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX12_4K_2D);
695+
uint64_t mod_256b = ver | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX12_256B_2D);
696+
uint64_t dcc = ver | AMD_FMT_MOD_SET(DCC, 1);
697+
uint8_t max_comp_block[] = {1, 0};
698+
uint64_t max_comp_block_mod[ARRAY_SIZE(max_comp_block)] = {0};
699+
uint8_t i = 0, j = 0;
700+
uint64_t gfx12_modifiers[] = {mod_256k, mod_64k, mod_4k, mod_256b, DRM_FORMAT_MOD_LINEAR};
701+
702+
for (i = 0; i < ARRAY_SIZE(max_comp_block); i++)
703+
max_comp_block_mod[i] = AMD_FMT_MOD_SET(DCC_MAX_COMPRESSED_BLOCK, max_comp_block[i]);
704+
705+
/* With DCC: Best choice should be kept first. Hence, add all 256k modifiers of different
706+
* max compressed blocks first and then move on to the next smaller sized layouts.
707+
* Do not add the linear modifier here, and hence the condition of size-1 for the loop
708+
*/
709+
for (j = 0; j < ARRAY_SIZE(gfx12_modifiers) - 1; j++)
710+
for (i = 0; i < ARRAY_SIZE(max_comp_block); i++)
711+
amdgpu_dm_plane_add_modifier(mods, size, capacity,
712+
ver | dcc | max_comp_block_mod[i] | gfx12_modifiers[j]);
713+
714+
/* Without DCC. Add all modifiers including linear at the end */
715+
for (i = 0; i < ARRAY_SIZE(gfx12_modifiers); i++)
716+
amdgpu_dm_plane_add_modifier(mods, size, capacity, gfx12_modifiers[i]);
692717

693-
/* Without DCC: */
694-
amdgpu_dm_plane_add_modifier(mods, size, capacity, ver | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX12_256K_2D));
695-
amdgpu_dm_plane_add_modifier(mods, size, capacity, ver | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX12_64K_2D));
696-
amdgpu_dm_plane_add_modifier(mods, size, capacity, ver | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX12_4K_2D));
697-
amdgpu_dm_plane_add_modifier(mods, size, capacity, ver | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX12_256B_2D));
698-
amdgpu_dm_plane_add_modifier(mods, size, capacity, DRM_FORMAT_MOD_LINEAR);
699718
}
700719

701720
static int amdgpu_dm_plane_get_plane_modifiers(struct amdgpu_device *adev, unsigned int plane_type, uint64_t **mods)

0 commit comments

Comments
 (0)