<div dir="ltr"><div>This needs to be a loop inserting all 64K_R_X and all 256K_R_X modifiers.</div><div><br></div><div>If num_pipes > 16, insert 256K_R_X first, else insert 64K_R_X first. Insert the other one after that. For example:</div><div><br></div><div>

<pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)">      </span><span style="color:rgb(0,0,255)">for</span><span style="color:rgb(192,192,192)"> </span>(<span style="color:rgb(128,128,0)">unsigned</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">i</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">=</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,128)">0</span>;<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">i</span><span style="color:rgb(192,192,192)"> </span><<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,128)">2</span>;<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">i</span><span style="color:rgb(0,0,0)">++</span>)<span style="color:rgb(192,192,192)"> </span>{</pre>
<pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)">         </span><span style="color:rgb(128,128,0)">unsigned</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">swizzle_r_x</span>;</pre>
<pre style="margin:0px;text-indent:0px"><br></pre>
<pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)">         </span><span style="color:rgb(0,196,0)">/*</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,196,0)">Insert</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,196,0)">the</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,196,0)">best</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,196,0)">one</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,196,0)">first.</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,196,0)">*/</span></pre>
<pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)">         </span><span style="color:rgb(0,0,255)">if</span><span style="color:rgb(192,192,192)"> </span>(<span style="color:rgb(0,0,0)">num_pipes</span><span style="color:rgb(192,192,192)"> </span>><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,128)">16</span>)</pre>
<pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)">            </span><span style="color:rgb(0,0,0)">swizzle_r_x</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">=</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">!</span><span style="color:rgb(0,0,0)">i</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">?</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">AMD_FMT_MOD_TILE_GFX11_256K_R_X</span><span style="color:rgb(192,192,192)"> </span>:<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">AMD_FMT_MOD_TILE_GFX9_64K_R_X</span>;</pre>
<pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)">         </span><span style="color:rgb(0,0,255)">else</span></pre>
<pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)">            </span><span style="color:rgb(0,0,0)">swizzle_r_x</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">=</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">!</span><span style="color:rgb(0,0,0)">i</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">?</span><span style="color:rgb(192,192,192)"> </span>AMD_FMT_MOD_TILE_GFX9_64K_R_X<span style="color:rgb(192,192,192)"> </span>:<span style="color:rgb(192,192,192)"> </span>AMD_FMT_MOD_TILE_GFX11_256K_R_X;</pre>
<pre style="margin:0px;text-indent:0px"><br></pre>
<pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)">         </span><span style="color:rgb(0,0,0)">uint64_t</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">modifier_r_x</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">=</span><span style="color:rgb(192,192,192)"> ...<br>         <br></span></pre><pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)">         add_modifier(,,,<br></span></pre><pre style="margin:0px;text-indent:0px"><span style="color:rgb(192,192,192)"><span style="color:rgb(192,192,192)">         add_modifier(,,,<br></span><span style="color:rgb(192,192,192)"><span style="color:rgb(192,192,192)">         add_modifier(,,,<br><span style="color:rgb(192,192,192)"><span style="color:rgb(192,192,192)"><span style="color:rgb(192,192,192)">         add_modifier(,,,<br></span></span></span><span style="color:rgb(192,192,192)"><span style="color:rgb(192,192,192)"><span style="color:rgb(192,192,192)">         add_modifier(,,,<br></span></span></span>      }<br></span><span style="color:rgb(192,192,192)"><br><br></span></span></span></pre></div><div></div><div>Marek<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 27, 2022 at 10:32 AM Aurabindo Pillai <<a href="mailto:aurabindo.pillai@amd.com" target="_blank">aurabindo.pillai@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">[Why&How]<br>
Some userspace expect a backwards compatible modifier on DCN32/321. For<br>
hardware with num_pipes more than 16, we expose the most efficient<br>
modifier first. As a fall back method, we need to expose slightly inefficient<br>
modifier AMD_FMT_MOD_TILE_GFX9_64K_R_X after the best option.<br>
<br>
Also set the number of packers to fixed value as required per hardware<br>
documentation. This value is cached during hardware initialization and<br>
can be read through the base driver.<br>
<br>
Fixes: 0a2c19562ffe ('Revert "drm/amd/display: ignore modifiers when checking for format support"')<br>
Signed-off-by: Aurabindo Pillai <<a href="mailto:aurabindo.pillai@amd.com" target="_blank">aurabindo.pillai@amd.com</a>><br>
---<br>
 drivers/gpu/drm/amd/amdgpu/amdgpu_display.c       | 3 +--<br>
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 8 +++++++-<br>
 2 files changed, 8 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c<br>
index 1a512d78673a..0f5bfe5df627 100644<br>
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c<br>
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c<br>
@@ -743,8 +743,7 @@ static int convert_tiling_flags_to_modifier(struct amdgpu_framebuffer *afb)<br>
                        switch (version) {<br>
                        case AMD_FMT_MOD_TILE_VER_GFX11:<br>
                                pipe_xor_bits = min(block_size_bits - 8, pipes);<br>
-                               packers = min(block_size_bits - 8 - pipe_xor_bits,<br>
-                                               ilog2(adev->gfx.config.gb_addr_config_fields.num_pkrs));<br>
+                               packers = ilog2(adev->gfx.config.gb_addr_config_fields.num_pkrs);<br>
                                break;<br>
                        case AMD_FMT_MOD_TILE_VER_GFX10_RBPLUS:<br>
                                pipe_xor_bits = min(block_size_bits - 8, pipes);<br>
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c<br>
index c9145864ed2b..bea9cee37f65 100644<br>
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c<br>
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c<br>
@@ -5203,6 +5203,7 @@ add_gfx11_modifiers(struct amdgpu_device *adev,<br>
        int pkrs = 0;<br>
        u32 gb_addr_config;<br>
        unsigned swizzle_r_x;<br>
+       uint64_t modifier_r_x_best;<br>
        uint64_t modifier_r_x;<br>
        uint64_t modifier_dcc_best;<br>
        uint64_t modifier_dcc_4k;<br>
@@ -5223,10 +5224,12 @@ add_gfx11_modifiers(struct amdgpu_device *adev,<br>
<br>
        modifier_r_x = AMD_FMT_MOD |<br>
                AMD_FMT_MOD_SET(TILE_VERSION, AMD_FMT_MOD_TILE_VER_GFX11) |<br>
-               AMD_FMT_MOD_SET(TILE, swizzle_r_x) |<br>
                AMD_FMT_MOD_SET(PIPE_XOR_BITS, pipe_xor_bits) |<br>
                AMD_FMT_MOD_SET(PACKERS, pkrs);<br>
<br>
+       modifier_r_x_best = modifier_r_x | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX11_256K_R_X);<br>
+       modifier_r_x = modifier_r_x | AMD_FMT_MOD_SET(TILE, AMD_FMT_MOD_TILE_GFX9_64K_R_X);<br>
+<br>
        /* DCC_CONSTANT_ENCODE is not set because it can't vary with gfx11 (it's implied to be 1). */<br>
        modifier_dcc_best = modifier_r_x |<br>
                AMD_FMT_MOD_SET(DCC, 1) |<br>
@@ -5247,6 +5250,9 @@ add_gfx11_modifiers(struct amdgpu_device *adev,<br>
        add_modifier(mods, size, capacity, modifier_dcc_best | AMD_FMT_MOD_SET(DCC_RETILE, 1));<br>
        add_modifier(mods, size, capacity, modifier_dcc_4k | AMD_FMT_MOD_SET(DCC_RETILE, 1));<br>
<br>
+       if (num_pipes > 16)<br>
+               add_modifier(mods, size, capacity, modifier_r_x_best);<br>
+<br>
        add_modifier(mods, size, capacity, modifier_r_x);<br>
<br>
        add_modifier(mods, size, capacity, AMD_FMT_MOD |<br>
-- <br>
2.36.1<br>
<br>
</blockquote></div>