drm/amdgpu: recover gart table at resume
authorNirmoy Das <nirmoy.das@amd.com>
Fri, 7 Jan 2022 08:51:15 +0000 (09:51 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 11 Jan 2022 20:44:26 +0000 (15:44 -0500)
Get rid off pin/unpin of gart BO at resume/suspend and
instead pin only once and try to recover gart content
at resume time. This is much more stable in case there
is OOM situation at 2nd call to amdgpu_device_evict_resources()
while evicting GART table.

v3: remove gart recovery from other places
v2: pin gart at amdgpu_gart_table_vram_alloc()

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c

index e9d34f0304bb40b37a30cfa2dc0200b45a0c677f..87aea86fc8d14f01f7a515c6b0306f34f5447226 100644 (file)
@@ -4016,16 +4016,11 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
        if (!adev->in_s0ix)
                amdgpu_amdkfd_suspend(adev, adev->in_runpm);
 
-       /* First evict vram memory */
        amdgpu_device_evict_resources(adev);
 
        amdgpu_fence_driver_hw_fini(adev);
 
        amdgpu_device_ip_suspend_phase2(adev);
-       /* This second call to evict device resources is to evict
-        * the gart page table using the CPU.
-        */
-       amdgpu_device_evict_resources(adev);
 
        return 0;
 }
@@ -4370,8 +4365,6 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,
                goto error;
 
        amdgpu_virt_init_data_exchange(adev);
-       /* we need recover gart prior to run SMC/CP/SDMA resume */
-       amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
 
        r = amdgpu_device_fw_loading(adev);
        if (r)
@@ -4691,10 +4684,6 @@ int amdgpu_do_asic_reset(struct list_head *device_list_handle,
                                        amdgpu_inc_vram_lost(tmp_adev);
                                }
 
-                               r = amdgpu_gtt_mgr_recover(&tmp_adev->mman.gtt_mgr);
-                               if (r)
-                                       goto out;
-
                                r = amdgpu_device_fw_loading(tmp_adev);
                                if (r)
                                        return r;
index d3e4203f62174edc4144b50fb93d609c6ef91acb..645950a653a0c3a7e70c4f0f91f4fb90f222959e 100644 (file)
@@ -114,80 +114,12 @@ void amdgpu_gart_dummy_page_fini(struct amdgpu_device *adev)
  */
 int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev)
 {
-       int r;
-
-       if (adev->gart.bo == NULL) {
-               struct amdgpu_bo_param bp;
-
-               memset(&bp, 0, sizeof(bp));
-               bp.size = adev->gart.table_size;
-               bp.byte_align = PAGE_SIZE;
-               bp.domain = AMDGPU_GEM_DOMAIN_VRAM;
-               bp.flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
-                       AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
-               bp.type = ttm_bo_type_kernel;
-               bp.resv = NULL;
-               bp.bo_ptr_size = sizeof(struct amdgpu_bo);
-
-               r = amdgpu_bo_create(adev, &bp, &adev->gart.bo);
-               if (r) {
-                       return r;
-               }
-       }
-       return 0;
-}
-
-/**
- * amdgpu_gart_table_vram_pin - pin gart page table in vram
- *
- * @adev: amdgpu_device pointer
- *
- * Pin the GART page table in vram so it will not be moved
- * by the memory manager (pcie r4xx, r5xx+).  These asics require the
- * gart table to be in video memory.
- * Returns 0 for success, error for failure.
- */
-int amdgpu_gart_table_vram_pin(struct amdgpu_device *adev)
-{
-       int r;
-
-       r = amdgpu_bo_reserve(adev->gart.bo, false);
-       if (unlikely(r != 0))
-               return r;
-       r = amdgpu_bo_pin(adev->gart.bo, AMDGPU_GEM_DOMAIN_VRAM);
-       if (r) {
-               amdgpu_bo_unreserve(adev->gart.bo);
-               return r;
-       }
-       r = amdgpu_bo_kmap(adev->gart.bo, &adev->gart.ptr);
-       if (r)
-               amdgpu_bo_unpin(adev->gart.bo);
-       amdgpu_bo_unreserve(adev->gart.bo);
-       return r;
-}
-
-/**
- * amdgpu_gart_table_vram_unpin - unpin gart page table in vram
- *
- * @adev: amdgpu_device pointer
- *
- * Unpin the GART page table in vram (pcie r4xx, r5xx+).
- * These asics require the gart table to be in video memory.
- */
-void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev)
-{
-       int r;
+       if (adev->gart.bo != NULL)
+               return 0;
 
-       if (adev->gart.bo == NULL) {
-               return;
-       }
-       r = amdgpu_bo_reserve(adev->gart.bo, true);
-       if (likely(r == 0)) {
-               amdgpu_bo_kunmap(adev->gart.bo);
-               amdgpu_bo_unpin(adev->gart.bo);
-               amdgpu_bo_unreserve(adev->gart.bo);
-               adev->gart.ptr = NULL;
-       }
+       return amdgpu_bo_create_kernel(adev,  adev->gart.table_size, PAGE_SIZE,
+                                      AMDGPU_GEM_DOMAIN_VRAM, &adev->gart.bo,
+                                      NULL, (void *)&adev->gart.ptr);
 }
 
 /**
@@ -201,11 +133,7 @@ void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev)
  */
 void amdgpu_gart_table_vram_free(struct amdgpu_device *adev)
 {
-       if (adev->gart.bo == NULL) {
-               return;
-       }
-       amdgpu_bo_unref(&adev->gart.bo);
-       adev->gart.ptr = NULL;
+       amdgpu_bo_free_kernel(&adev->gart.bo, NULL, (void *)&adev->gart.ptr);
 }
 
 /*
index 3d5d47a799e3bfcfead1fbce50cd2c5cee667574..38bb42727715d26948e4cee9dde57506a2832b68 100644 (file)
@@ -989,7 +989,7 @@ static int gmc_v10_0_gart_enable(struct amdgpu_device *adev)
        if (amdgpu_sriov_vf(adev) && amdgpu_in_reset(adev))
                goto skip_pin_bo;
 
-       r = amdgpu_gart_table_vram_pin(adev);
+       r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
        if (r)
                return r;
 
@@ -1060,7 +1060,6 @@ static void gmc_v10_0_gart_disable(struct amdgpu_device *adev)
 {
        adev->gfxhub.funcs->gart_disable(adev);
        adev->mmhub.funcs->gart_disable(adev);
-       amdgpu_gart_table_vram_unpin(adev);
 }
 
 static int gmc_v10_0_hw_fini(void *handle)
index 0fe714f54cca9b1e38d6d536cde126001ce5ecc4..cd6c38e083d0d28d2f1e408337dac0a58e24e6e9 100644 (file)
@@ -476,7 +476,7 @@ static int gmc_v6_0_gart_enable(struct amdgpu_device *adev)
                dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
                return -EINVAL;
        }
-       r = amdgpu_gart_table_vram_pin(adev);
+       r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
        if (r)
                return r;
 
@@ -608,7 +608,6 @@ static void gmc_v6_0_gart_disable(struct amdgpu_device *adev)
        WREG32(mmVM_L2_CNTL3,
               VM_L2_CNTL3__L2_CACHE_BIGK_ASSOCIATIVITY_MASK |
               (0UL << VM_L2_CNTL3__L2_CACHE_BIGK_FRAGMENT_SIZE__SHIFT));
-       amdgpu_gart_table_vram_unpin(adev);
 }
 
 static void gmc_v6_0_vm_decode_fault(struct amdgpu_device *adev,
index 0a50fdaced7e5d32075b2d825ce03e94c62abf65..ab8adbff9e2d0e4c5fed21465c506e646686f66b 100644 (file)
@@ -620,7 +620,7 @@ static int gmc_v7_0_gart_enable(struct amdgpu_device *adev)
                dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
                return -EINVAL;
        }
-       r = amdgpu_gart_table_vram_pin(adev);
+       r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
        if (r)
                return r;
 
@@ -758,7 +758,6 @@ static void gmc_v7_0_gart_disable(struct amdgpu_device *adev)
        tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 0);
        WREG32(mmVM_L2_CNTL, tmp);
        WREG32(mmVM_L2_CNTL2, 0);
-       amdgpu_gart_table_vram_unpin(adev);
 }
 
 /**
index 63b890f1e8afb8159978af0fa7eb6b9665ad3a8e..054733838292c319e602e01ad31066105c6adf57 100644 (file)
@@ -844,7 +844,7 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
                dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
                return -EINVAL;
        }
-       r = amdgpu_gart_table_vram_pin(adev);
+       r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
        if (r)
                return r;
 
@@ -999,7 +999,6 @@ static void gmc_v8_0_gart_disable(struct amdgpu_device *adev)
        tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 0);
        WREG32(mmVM_L2_CNTL, tmp);
        WREG32(mmVM_L2_CNTL2, 0);
-       amdgpu_gart_table_vram_unpin(adev);
 }
 
 /**
index 57f2729a7bd00079bd13c4cafd7fe5f8bc539204..12a177ac14f37cea8692e909debc3097b104b6d4 100644 (file)
@@ -1743,7 +1743,7 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
        if (amdgpu_sriov_vf(adev) && amdgpu_in_reset(adev))
                goto skip_pin_bo;
 
-       r = amdgpu_gart_table_vram_pin(adev);
+       r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
        if (r)
                return r;
 
@@ -1821,7 +1821,6 @@ static void gmc_v9_0_gart_disable(struct amdgpu_device *adev)
 {
        adev->gfxhub.funcs->gart_disable(adev);
        adev->mmhub.funcs->gart_disable(adev);
-       amdgpu_gart_table_vram_unpin(adev);
 }
 
 static int gmc_v9_0_hw_fini(void *handle)