From ac3abe534bb9986ce7ee1286854a3bb2a83568bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 24 Oct 2016 19:05:10 +0200 Subject: [PATCH] winsys/amdgpu: fix radeon_surf::macro_tile_index for imported textures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Maybe this is why SDMA has been broken for many amdgpu users? SDMA is the only block which is used with imported textures and relies on this variable. DB also uses it, but it doesn't get imported textures, so it's unaffected. I do get SDMA failures on Tonga before this patch if R600_DEBUG=testdma is changed to use imported textures. Cc: 11.2 12.0 13.0 Reviewed-by: Bas Nieuwenhuizen Reviewed-by: Nicolai Hähnle (cherry picked from commit 6ec3b2a4b1d41b83a4721d06b42c49f55e695cbf) [Emil Velikov: resolve trivial conflicts - SI support does not exist in branch] Signed-off-by: Emil Velikov Conflicts: src/gallium/winsys/amdgpu/drm/amdgpu_surface.c --- src/gallium/winsys/amdgpu/drm/amdgpu_surface.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c b/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c index 8b776b74fd2..3f6e280f8d8 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c @@ -253,6 +253,20 @@ static int compute_level(struct amdgpu_winsys *ws, return 0; } +static unsigned cik_get_macro_tile_index(struct radeon_surf *surf) +{ + unsigned index, tileb; + + tileb = 8 * 8 * surf->bpe; + tileb = MIN2(surf->tile_split, tileb); + + for (index = 0; tileb > 64; index++) + tileb >>= 1; + + assert(index < 16); + return index; +} + static int amdgpu_surface_init(struct radeon_winsys *rws, struct radeon_surf *surf) { @@ -381,6 +395,9 @@ static int amdgpu_surface_init(struct radeon_winsys *rws, AddrSurfInfoIn.tileIndex = 10; /* 2D displayable */ else AddrSurfInfoIn.tileIndex = 14; /* 2D non-displayable */ + + /* Addrlib doesn't set this if tileIndex is forced like above. */ + AddrSurfInfoOut.macroModeIndex = cik_get_macro_tile_index(surf); } surf->bo_size = 0;