Skip to content

Commit 575e55e

Browse files
Nirmoy Dasalexdeucher
authored andcommitted
drm/amdgpu: recover gart table at resume
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 <[email protected]> Signed-off-by: Nirmoy Das <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent ec6aae9 commit 575e55e

File tree

7 files changed

+11
-99
lines changed

7 files changed

+11
-99
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4016,16 +4016,11 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
40164016
if (!adev->in_s0ix)
40174017
amdgpu_amdkfd_suspend(adev, adev->in_runpm);
40184018

4019-
/* First evict vram memory */
40204019
amdgpu_device_evict_resources(adev);
40214020

40224021
amdgpu_fence_driver_hw_fini(adev);
40234022

40244023
amdgpu_device_ip_suspend_phase2(adev);
4025-
/* This second call to evict device resources is to evict
4026-
* the gart page table using the CPU.
4027-
*/
4028-
amdgpu_device_evict_resources(adev);
40294024

40304025
return 0;
40314026
}
@@ -4370,8 +4365,6 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,
43704365
goto error;
43714366

43724367
amdgpu_virt_init_data_exchange(adev);
4373-
/* we need recover gart prior to run SMC/CP/SDMA resume */
4374-
amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
43754368

43764369
r = amdgpu_device_fw_loading(adev);
43774370
if (r)
@@ -4691,10 +4684,6 @@ int amdgpu_do_asic_reset(struct list_head *device_list_handle,
46914684
amdgpu_inc_vram_lost(tmp_adev);
46924685
}
46934686

4694-
r = amdgpu_gtt_mgr_recover(&tmp_adev->mman.gtt_mgr);
4695-
if (r)
4696-
goto out;
4697-
46984687
r = amdgpu_device_fw_loading(tmp_adev);
46994688
if (r)
47004689
return r;

drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c

Lines changed: 6 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -114,80 +114,12 @@ void amdgpu_gart_dummy_page_fini(struct amdgpu_device *adev)
114114
*/
115115
int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev)
116116
{
117-
int r;
118-
119-
if (adev->gart.bo == NULL) {
120-
struct amdgpu_bo_param bp;
121-
122-
memset(&bp, 0, sizeof(bp));
123-
bp.size = adev->gart.table_size;
124-
bp.byte_align = PAGE_SIZE;
125-
bp.domain = AMDGPU_GEM_DOMAIN_VRAM;
126-
bp.flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
127-
AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
128-
bp.type = ttm_bo_type_kernel;
129-
bp.resv = NULL;
130-
bp.bo_ptr_size = sizeof(struct amdgpu_bo);
131-
132-
r = amdgpu_bo_create(adev, &bp, &adev->gart.bo);
133-
if (r) {
134-
return r;
135-
}
136-
}
137-
return 0;
138-
}
139-
140-
/**
141-
* amdgpu_gart_table_vram_pin - pin gart page table in vram
142-
*
143-
* @adev: amdgpu_device pointer
144-
*
145-
* Pin the GART page table in vram so it will not be moved
146-
* by the memory manager (pcie r4xx, r5xx+). These asics require the
147-
* gart table to be in video memory.
148-
* Returns 0 for success, error for failure.
149-
*/
150-
int amdgpu_gart_table_vram_pin(struct amdgpu_device *adev)
151-
{
152-
int r;
153-
154-
r = amdgpu_bo_reserve(adev->gart.bo, false);
155-
if (unlikely(r != 0))
156-
return r;
157-
r = amdgpu_bo_pin(adev->gart.bo, AMDGPU_GEM_DOMAIN_VRAM);
158-
if (r) {
159-
amdgpu_bo_unreserve(adev->gart.bo);
160-
return r;
161-
}
162-
r = amdgpu_bo_kmap(adev->gart.bo, &adev->gart.ptr);
163-
if (r)
164-
amdgpu_bo_unpin(adev->gart.bo);
165-
amdgpu_bo_unreserve(adev->gart.bo);
166-
return r;
167-
}
168-
169-
/**
170-
* amdgpu_gart_table_vram_unpin - unpin gart page table in vram
171-
*
172-
* @adev: amdgpu_device pointer
173-
*
174-
* Unpin the GART page table in vram (pcie r4xx, r5xx+).
175-
* These asics require the gart table to be in video memory.
176-
*/
177-
void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev)
178-
{
179-
int r;
117+
if (adev->gart.bo != NULL)
118+
return 0;
180119

181-
if (adev->gart.bo == NULL) {
182-
return;
183-
}
184-
r = amdgpu_bo_reserve(adev->gart.bo, true);
185-
if (likely(r == 0)) {
186-
amdgpu_bo_kunmap(adev->gart.bo);
187-
amdgpu_bo_unpin(adev->gart.bo);
188-
amdgpu_bo_unreserve(adev->gart.bo);
189-
adev->gart.ptr = NULL;
190-
}
120+
return amdgpu_bo_create_kernel(adev, adev->gart.table_size, PAGE_SIZE,
121+
AMDGPU_GEM_DOMAIN_VRAM, &adev->gart.bo,
122+
NULL, (void *)&adev->gart.ptr);
191123
}
192124

193125
/**
@@ -201,11 +133,7 @@ void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev)
201133
*/
202134
void amdgpu_gart_table_vram_free(struct amdgpu_device *adev)
203135
{
204-
if (adev->gart.bo == NULL) {
205-
return;
206-
}
207-
amdgpu_bo_unref(&adev->gart.bo);
208-
adev->gart.ptr = NULL;
136+
amdgpu_bo_free_kernel(&adev->gart.bo, NULL, (void *)&adev->gart.ptr);
209137
}
210138

211139
/*

drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ static int gmc_v10_0_gart_enable(struct amdgpu_device *adev)
989989
if (amdgpu_sriov_vf(adev) && amdgpu_in_reset(adev))
990990
goto skip_pin_bo;
991991

992-
r = amdgpu_gart_table_vram_pin(adev);
992+
r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
993993
if (r)
994994
return r;
995995

@@ -1060,7 +1060,6 @@ static void gmc_v10_0_gart_disable(struct amdgpu_device *adev)
10601060
{
10611061
adev->gfxhub.funcs->gart_disable(adev);
10621062
adev->mmhub.funcs->gart_disable(adev);
1063-
amdgpu_gart_table_vram_unpin(adev);
10641063
}
10651064

10661065
static int gmc_v10_0_hw_fini(void *handle)

drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ static int gmc_v6_0_gart_enable(struct amdgpu_device *adev)
476476
dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
477477
return -EINVAL;
478478
}
479-
r = amdgpu_gart_table_vram_pin(adev);
479+
r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
480480
if (r)
481481
return r;
482482

@@ -608,7 +608,6 @@ static void gmc_v6_0_gart_disable(struct amdgpu_device *adev)
608608
WREG32(mmVM_L2_CNTL3,
609609
VM_L2_CNTL3__L2_CACHE_BIGK_ASSOCIATIVITY_MASK |
610610
(0UL << VM_L2_CNTL3__L2_CACHE_BIGK_FRAGMENT_SIZE__SHIFT));
611-
amdgpu_gart_table_vram_unpin(adev);
612611
}
613612

614613
static void gmc_v6_0_vm_decode_fault(struct amdgpu_device *adev,

drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ static int gmc_v7_0_gart_enable(struct amdgpu_device *adev)
620620
dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
621621
return -EINVAL;
622622
}
623-
r = amdgpu_gart_table_vram_pin(adev);
623+
r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
624624
if (r)
625625
return r;
626626

@@ -758,7 +758,6 @@ static void gmc_v7_0_gart_disable(struct amdgpu_device *adev)
758758
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 0);
759759
WREG32(mmVM_L2_CNTL, tmp);
760760
WREG32(mmVM_L2_CNTL2, 0);
761-
amdgpu_gart_table_vram_unpin(adev);
762761
}
763762

764763
/**

drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -844,7 +844,7 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
844844
dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
845845
return -EINVAL;
846846
}
847-
r = amdgpu_gart_table_vram_pin(adev);
847+
r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
848848
if (r)
849849
return r;
850850

@@ -999,7 +999,6 @@ static void gmc_v8_0_gart_disable(struct amdgpu_device *adev)
999999
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 0);
10001000
WREG32(mmVM_L2_CNTL, tmp);
10011001
WREG32(mmVM_L2_CNTL2, 0);
1002-
amdgpu_gart_table_vram_unpin(adev);
10031002
}
10041003

10051004
/**

drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,7 +1743,7 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
17431743
if (amdgpu_sriov_vf(adev) && amdgpu_in_reset(adev))
17441744
goto skip_pin_bo;
17451745

1746-
r = amdgpu_gart_table_vram_pin(adev);
1746+
r = amdgpu_gtt_mgr_recover(&adev->mman.gtt_mgr);
17471747
if (r)
17481748
return r;
17491749

@@ -1821,7 +1821,6 @@ static void gmc_v9_0_gart_disable(struct amdgpu_device *adev)
18211821
{
18221822
adev->gfxhub.funcs->gart_disable(adev);
18231823
adev->mmhub.funcs->gart_disable(adev);
1824-
amdgpu_gart_table_vram_unpin(adev);
18251824
}
18261825

18271826
static int gmc_v9_0_hw_fini(void *handle)

0 commit comments

Comments
 (0)