aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
diff options
context:
space:
mode:
authorMonk Liu <Monk.Liu@amd.com>2017-11-21 00:29:14 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-12-06 12:48:15 -0500
commitce1b1b66cd5ec60927c575858430c099b8b4bceb (patch)
treecf3882de00bc4a58d1ad1fc4f2b68653ddb6c981 /drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
parent1bfcbad18fc0c2618ae141ff2d8c384cf81bf98e (diff)
drm/amdgpu:partially revert 1cfd8e237f0318e330190ac21d63c58ae6a1f66c
found RING0 test fail after S3 resume regression, which is introduced by 1cfd8e237f0318e330190ac21d63c58ae6a1f66c Because after suspend VRAM will be cleared, so driver must unpin the GART table(resident in VRAM) during suspend so it can be evicted to system ram and must correspondingly pin it during resume so the GART table could be restored to VRAM. Signed-off-by: Monk Liu <Monk.Liu@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c79
1 files changed, 73 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index 707f85825996..1f51897acc5b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -68,9 +68,75 @@
68 */ 68 */
69int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev) 69int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev)
70{ 70{
71 return amdgpu_bo_create_kernel(adev, adev->gart.table_size, PAGE_SIZE, 71 int r;
72 AMDGPU_GEM_DOMAIN_VRAM, &adev->gart.robj, 72
73 &adev->gart.table_addr, &adev->gart.ptr); 73 if (adev->gart.robj == NULL) {
74 r = amdgpu_bo_create(adev, adev->gart.table_size,
75 PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM,
76 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
77 AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS,
78 NULL, NULL, 0, &adev->gart.robj);
79 if (r) {
80 return r;
81 }
82 }
83 return 0;
84}
85
86/**
87 * amdgpu_gart_table_vram_pin - pin gart page table in vram
88 *
89 * @adev: amdgpu_device pointer
90 *
91 * Pin the GART page table in vram so it will not be moved
92 * by the memory manager (pcie r4xx, r5xx+). These asics require the
93 * gart table to be in video memory.
94 * Returns 0 for success, error for failure.
95 */
96int amdgpu_gart_table_vram_pin(struct amdgpu_device *adev)
97{
98 uint64_t gpu_addr;
99 int r;
100
101 r = amdgpu_bo_reserve(adev->gart.robj, false);
102 if (unlikely(r != 0))
103 return r;
104 r = amdgpu_bo_pin(adev->gart.robj,
105 AMDGPU_GEM_DOMAIN_VRAM, &gpu_addr);
106 if (r) {
107 amdgpu_bo_unreserve(adev->gart.robj);
108 return r;
109 }
110 r = amdgpu_bo_kmap(adev->gart.robj, &adev->gart.ptr);
111 if (r)
112 amdgpu_bo_unpin(adev->gart.robj);
113 amdgpu_bo_unreserve(adev->gart.robj);
114 adev->gart.table_addr = gpu_addr;
115 return r;
116}
117
118/**
119 * amdgpu_gart_table_vram_unpin - unpin gart page table in vram
120 *
121 * @adev: amdgpu_device pointer
122 *
123 * Unpin the GART page table in vram (pcie r4xx, r5xx+).
124 * These asics require the gart table to be in video memory.
125 */
126void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev)
127{
128 int r;
129
130 if (adev->gart.robj == NULL) {
131 return;
132 }
133 r = amdgpu_bo_reserve(adev->gart.robj, true);
134 if (likely(r == 0)) {
135 amdgpu_bo_kunmap(adev->gart.robj);
136 amdgpu_bo_unpin(adev->gart.robj);
137 amdgpu_bo_unreserve(adev->gart.robj);
138 adev->gart.ptr = NULL;
139 }
74} 140}
75 141
76/** 142/**
@@ -84,9 +150,10 @@ int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev)
84 */ 150 */
85void amdgpu_gart_table_vram_free(struct amdgpu_device *adev) 151void amdgpu_gart_table_vram_free(struct amdgpu_device *adev)
86{ 152{
87 amdgpu_bo_free_kernel(&adev->gart.robj, 153 if (adev->gart.robj == NULL) {
88 &adev->gart.table_addr, 154 return;
89 &adev->gart.ptr); 155 }
156 amdgpu_bo_unref(&adev->gart.robj);
90} 157}
91 158
92/* 159/*