The TLB is organized in groups of 8 entries, each one is 4K.
On Tahiti, the HW requires these GART entries to be 32K-aligned.

This fixes a VCE 1 firmware validation failure that can happen
after suspend/resume since we use amdgpu_gtt_mgr for VCE 1.

v2:
- Change variable declaration order
- Add comment about "V bit HW bug"

Fixes: 698fa62f56aa ("drm/amdgpu: Add helper to alloc GART entries")
Signed-off-by: Timur Kristóf <[email protected]>
Reviewed-by: Christian König <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
index 9b0bcf6aca44..02f85802f579 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
@@ -199,11 +199,18 @@ int amdgpu_gtt_mgr_alloc_entries(struct amdgpu_gtt_mgr 
*mgr,
                                 enum drm_mm_insert_mode mode)
 {
        struct amdgpu_device *adev = container_of(mgr, typeof(*adev), 
mman.gtt_mgr);
+       u32 alignment = 0;
        int r;
 
+       /* Align to TLB L2 cache entry size to work around "V bit HW bug" */
+       if (adev->asic_type == CHIP_TAHITI) {
+               alignment = 32 * 1024 / AMDGPU_GPU_PAGE_SIZE;
+               num_pages = ALIGN(num_pages, alignment);
+       }
+
        spin_lock(&mgr->lock);
        r = drm_mm_insert_node_in_range(&mgr->mm, mm_node, num_pages,
-                                       0, GART_ENTRY_WITHOUT_BO_COLOR, 0,
+                                       alignment, GART_ENTRY_WITHOUT_BO_COLOR, 
0,
                                        adev->gmc.gart_size >> PAGE_SHIFT,
                                        mode);
        spin_unlock(&mgr->lock);
-- 
2.54.0

Reply via email to