diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
37 files changed, 388 insertions, 366 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 668939a14206..6647fb26ef25 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -82,6 +82,7 @@ extern int amdgpu_vm_block_size; | |||
82 | extern int amdgpu_enable_scheduler; | 82 | extern int amdgpu_enable_scheduler; |
83 | extern int amdgpu_sched_jobs; | 83 | extern int amdgpu_sched_jobs; |
84 | extern int amdgpu_sched_hw_submission; | 84 | extern int amdgpu_sched_hw_submission; |
85 | extern int amdgpu_enable_semaphores; | ||
85 | 86 | ||
86 | #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000 | 87 | #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000 |
87 | #define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */ | 88 | #define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */ |
@@ -432,7 +433,7 @@ int amdgpu_fence_driver_init(struct amdgpu_device *adev); | |||
432 | void amdgpu_fence_driver_fini(struct amdgpu_device *adev); | 433 | void amdgpu_fence_driver_fini(struct amdgpu_device *adev); |
433 | void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev); | 434 | void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev); |
434 | 435 | ||
435 | void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring); | 436 | int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring); |
436 | int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, | 437 | int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, |
437 | struct amdgpu_irq_src *irq_src, | 438 | struct amdgpu_irq_src *irq_src, |
438 | unsigned irq_type); | 439 | unsigned irq_type); |
@@ -890,7 +891,7 @@ struct amdgpu_ring { | |||
890 | struct amdgpu_device *adev; | 891 | struct amdgpu_device *adev; |
891 | const struct amdgpu_ring_funcs *funcs; | 892 | const struct amdgpu_ring_funcs *funcs; |
892 | struct amdgpu_fence_driver fence_drv; | 893 | struct amdgpu_fence_driver fence_drv; |
893 | struct amd_gpu_scheduler *scheduler; | 894 | struct amd_gpu_scheduler sched; |
894 | 895 | ||
895 | spinlock_t fence_lock; | 896 | spinlock_t fence_lock; |
896 | struct mutex *ring_lock; | 897 | struct mutex *ring_lock; |
@@ -1201,8 +1202,6 @@ struct amdgpu_gfx { | |||
1201 | struct amdgpu_irq_src priv_inst_irq; | 1202 | struct amdgpu_irq_src priv_inst_irq; |
1202 | /* gfx status */ | 1203 | /* gfx status */ |
1203 | uint32_t gfx_current_status; | 1204 | uint32_t gfx_current_status; |
1204 | /* sync signal for const engine */ | ||
1205 | unsigned ce_sync_offs; | ||
1206 | /* ce ram size*/ | 1205 | /* ce ram size*/ |
1207 | unsigned ce_ram_size; | 1206 | unsigned ce_ram_size; |
1208 | }; | 1207 | }; |
@@ -1274,8 +1273,10 @@ struct amdgpu_job { | |||
1274 | uint32_t num_ibs; | 1273 | uint32_t num_ibs; |
1275 | struct mutex job_lock; | 1274 | struct mutex job_lock; |
1276 | struct amdgpu_user_fence uf; | 1275 | struct amdgpu_user_fence uf; |
1277 | int (*free_job)(struct amdgpu_job *sched_job); | 1276 | int (*free_job)(struct amdgpu_job *job); |
1278 | }; | 1277 | }; |
1278 | #define to_amdgpu_job(sched_job) \ | ||
1279 | container_of((sched_job), struct amdgpu_job, base) | ||
1279 | 1280 | ||
1280 | static inline u32 amdgpu_get_ib_value(struct amdgpu_cs_parser *p, uint32_t ib_idx, int idx) | 1281 | static inline u32 amdgpu_get_ib_value(struct amdgpu_cs_parser *p, uint32_t ib_idx, int idx) |
1281 | { | 1282 | { |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index 496ed2192eba..84d68d658f8a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | |||
@@ -183,7 +183,7 @@ int alloc_gtt_mem(struct kgd_dev *kgd, size_t size, | |||
183 | return -ENOMEM; | 183 | return -ENOMEM; |
184 | 184 | ||
185 | r = amdgpu_bo_create(rdev, size, PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_GTT, | 185 | r = amdgpu_bo_create(rdev, size, PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_GTT, |
186 | AMDGPU_GEM_CREATE_CPU_GTT_USWC, NULL, &(*mem)->bo); | 186 | AMDGPU_GEM_CREATE_CPU_GTT_USWC, NULL, NULL, &(*mem)->bo); |
187 | if (r) { | 187 | if (r) { |
188 | dev_err(rdev->dev, | 188 | dev_err(rdev->dev, |
189 | "failed to allocate BO for amdkfd (%d)\n", r); | 189 | "failed to allocate BO for amdkfd (%d)\n", r); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c index 98d59ee640ce..cd639c362df3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c | |||
@@ -79,7 +79,8 @@ static void amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size, | |||
79 | int time; | 79 | int time; |
80 | 80 | ||
81 | n = AMDGPU_BENCHMARK_ITERATIONS; | 81 | n = AMDGPU_BENCHMARK_ITERATIONS; |
82 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj); | 82 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, sdomain, 0, NULL, |
83 | NULL, &sobj); | ||
83 | if (r) { | 84 | if (r) { |
84 | goto out_cleanup; | 85 | goto out_cleanup; |
85 | } | 86 | } |
@@ -91,7 +92,8 @@ static void amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned size, | |||
91 | if (r) { | 92 | if (r) { |
92 | goto out_cleanup; | 93 | goto out_cleanup; |
93 | } | 94 | } |
94 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj); | 95 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, ddomain, 0, NULL, |
96 | NULL, &dobj); | ||
95 | if (r) { | 97 | if (r) { |
96 | goto out_cleanup; | 98 | goto out_cleanup; |
97 | } | 99 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index 6b1243f9f86d..1c3fc99c5465 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | |||
@@ -86,7 +86,7 @@ static int amdgpu_cgs_gmap_kmem(void *cgs_device, void *kmem, | |||
86 | 86 | ||
87 | struct sg_table *sg = drm_prime_pages_to_sg(&kmem_page, npages); | 87 | struct sg_table *sg = drm_prime_pages_to_sg(&kmem_page, npages); |
88 | ret = amdgpu_bo_create(adev, size, PAGE_SIZE, false, | 88 | ret = amdgpu_bo_create(adev, size, PAGE_SIZE, false, |
89 | AMDGPU_GEM_DOMAIN_GTT, 0, sg, &bo); | 89 | AMDGPU_GEM_DOMAIN_GTT, 0, sg, NULL, &bo); |
90 | if (ret) | 90 | if (ret) |
91 | return ret; | 91 | return ret; |
92 | ret = amdgpu_bo_reserve(bo, false); | 92 | ret = amdgpu_bo_reserve(bo, false); |
@@ -197,7 +197,8 @@ static int amdgpu_cgs_alloc_gpu_mem(void *cgs_device, | |||
197 | 197 | ||
198 | ret = amdgpu_bo_create_restricted(adev, size, PAGE_SIZE, | 198 | ret = amdgpu_bo_create_restricted(adev, size, PAGE_SIZE, |
199 | true, domain, flags, | 199 | true, domain, flags, |
200 | NULL, &placement, &obj); | 200 | NULL, &placement, NULL, |
201 | &obj); | ||
201 | if (ret) { | 202 | if (ret) { |
202 | DRM_ERROR("(%d) bo create failed\n", ret); | 203 | DRM_ERROR("(%d) bo create failed\n", ret); |
203 | return ret; | 204 | return ret; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 3b355aeb62fd..749420f1ea6f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -154,42 +154,41 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
154 | { | 154 | { |
155 | union drm_amdgpu_cs *cs = data; | 155 | union drm_amdgpu_cs *cs = data; |
156 | uint64_t *chunk_array_user; | 156 | uint64_t *chunk_array_user; |
157 | uint64_t *chunk_array = NULL; | 157 | uint64_t *chunk_array; |
158 | struct amdgpu_fpriv *fpriv = p->filp->driver_priv; | 158 | struct amdgpu_fpriv *fpriv = p->filp->driver_priv; |
159 | unsigned size, i; | 159 | unsigned size, i; |
160 | int r = 0; | 160 | int ret; |
161 | 161 | ||
162 | if (!cs->in.num_chunks) | 162 | if (cs->in.num_chunks == 0) |
163 | goto out; | 163 | return 0; |
164 | |||
165 | chunk_array = kmalloc_array(cs->in.num_chunks, sizeof(uint64_t), GFP_KERNEL); | ||
166 | if (!chunk_array) | ||
167 | return -ENOMEM; | ||
164 | 168 | ||
165 | p->ctx = amdgpu_ctx_get(fpriv, cs->in.ctx_id); | 169 | p->ctx = amdgpu_ctx_get(fpriv, cs->in.ctx_id); |
166 | if (!p->ctx) { | 170 | if (!p->ctx) { |
167 | r = -EINVAL; | 171 | ret = -EINVAL; |
168 | goto out; | 172 | goto free_chunk; |
169 | } | 173 | } |
174 | |||
170 | p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle); | 175 | p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle); |
171 | 176 | ||
172 | /* get chunks */ | 177 | /* get chunks */ |
173 | INIT_LIST_HEAD(&p->validated); | 178 | INIT_LIST_HEAD(&p->validated); |
174 | chunk_array = kmalloc_array(cs->in.num_chunks, sizeof(uint64_t), GFP_KERNEL); | ||
175 | if (chunk_array == NULL) { | ||
176 | r = -ENOMEM; | ||
177 | goto out; | ||
178 | } | ||
179 | |||
180 | chunk_array_user = (uint64_t __user *)(cs->in.chunks); | 179 | chunk_array_user = (uint64_t __user *)(cs->in.chunks); |
181 | if (copy_from_user(chunk_array, chunk_array_user, | 180 | if (copy_from_user(chunk_array, chunk_array_user, |
182 | sizeof(uint64_t)*cs->in.num_chunks)) { | 181 | sizeof(uint64_t)*cs->in.num_chunks)) { |
183 | r = -EFAULT; | 182 | ret = -EFAULT; |
184 | goto out; | 183 | goto put_bo_list; |
185 | } | 184 | } |
186 | 185 | ||
187 | p->nchunks = cs->in.num_chunks; | 186 | p->nchunks = cs->in.num_chunks; |
188 | p->chunks = kmalloc_array(p->nchunks, sizeof(struct amdgpu_cs_chunk), | 187 | p->chunks = kmalloc_array(p->nchunks, sizeof(struct amdgpu_cs_chunk), |
189 | GFP_KERNEL); | 188 | GFP_KERNEL); |
190 | if (p->chunks == NULL) { | 189 | if (!p->chunks) { |
191 | r = -ENOMEM; | 190 | ret = -ENOMEM; |
192 | goto out; | 191 | goto put_bo_list; |
193 | } | 192 | } |
194 | 193 | ||
195 | for (i = 0; i < p->nchunks; i++) { | 194 | for (i = 0; i < p->nchunks; i++) { |
@@ -200,8 +199,9 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
200 | chunk_ptr = (void __user *)chunk_array[i]; | 199 | chunk_ptr = (void __user *)chunk_array[i]; |
201 | if (copy_from_user(&user_chunk, chunk_ptr, | 200 | if (copy_from_user(&user_chunk, chunk_ptr, |
202 | sizeof(struct drm_amdgpu_cs_chunk))) { | 201 | sizeof(struct drm_amdgpu_cs_chunk))) { |
203 | r = -EFAULT; | 202 | ret = -EFAULT; |
204 | goto out; | 203 | i--; |
204 | goto free_partial_kdata; | ||
205 | } | 205 | } |
206 | p->chunks[i].chunk_id = user_chunk.chunk_id; | 206 | p->chunks[i].chunk_id = user_chunk.chunk_id; |
207 | p->chunks[i].length_dw = user_chunk.length_dw; | 207 | p->chunks[i].length_dw = user_chunk.length_dw; |
@@ -212,13 +212,14 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
212 | 212 | ||
213 | p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t)); | 213 | p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t)); |
214 | if (p->chunks[i].kdata == NULL) { | 214 | if (p->chunks[i].kdata == NULL) { |
215 | r = -ENOMEM; | 215 | ret = -ENOMEM; |
216 | goto out; | 216 | i--; |
217 | goto free_partial_kdata; | ||
217 | } | 218 | } |
218 | size *= sizeof(uint32_t); | 219 | size *= sizeof(uint32_t); |
219 | if (copy_from_user(p->chunks[i].kdata, cdata, size)) { | 220 | if (copy_from_user(p->chunks[i].kdata, cdata, size)) { |
220 | r = -EFAULT; | 221 | ret = -EFAULT; |
221 | goto out; | 222 | goto free_partial_kdata; |
222 | } | 223 | } |
223 | 224 | ||
224 | switch (p->chunks[i].chunk_id) { | 225 | switch (p->chunks[i].chunk_id) { |
@@ -238,15 +239,15 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
238 | gobj = drm_gem_object_lookup(p->adev->ddev, | 239 | gobj = drm_gem_object_lookup(p->adev->ddev, |
239 | p->filp, handle); | 240 | p->filp, handle); |
240 | if (gobj == NULL) { | 241 | if (gobj == NULL) { |
241 | r = -EINVAL; | 242 | ret = -EINVAL; |
242 | goto out; | 243 | goto free_partial_kdata; |
243 | } | 244 | } |
244 | 245 | ||
245 | p->uf.bo = gem_to_amdgpu_bo(gobj); | 246 | p->uf.bo = gem_to_amdgpu_bo(gobj); |
246 | p->uf.offset = fence_data->offset; | 247 | p->uf.offset = fence_data->offset; |
247 | } else { | 248 | } else { |
248 | r = -EINVAL; | 249 | ret = -EINVAL; |
249 | goto out; | 250 | goto free_partial_kdata; |
250 | } | 251 | } |
251 | break; | 252 | break; |
252 | 253 | ||
@@ -254,19 +255,35 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | |||
254 | break; | 255 | break; |
255 | 256 | ||
256 | default: | 257 | default: |
257 | r = -EINVAL; | 258 | ret = -EINVAL; |
258 | goto out; | 259 | goto free_partial_kdata; |
259 | } | 260 | } |
260 | } | 261 | } |
261 | 262 | ||
262 | 263 | ||
263 | p->ibs = kcalloc(p->num_ibs, sizeof(struct amdgpu_ib), GFP_KERNEL); | 264 | p->ibs = kcalloc(p->num_ibs, sizeof(struct amdgpu_ib), GFP_KERNEL); |
264 | if (!p->ibs) | 265 | if (!p->ibs) { |
265 | r = -ENOMEM; | 266 | ret = -ENOMEM; |
267 | goto free_all_kdata; | ||
268 | } | ||
266 | 269 | ||
267 | out: | ||
268 | kfree(chunk_array); | 270 | kfree(chunk_array); |
269 | return r; | 271 | return 0; |
272 | |||
273 | free_all_kdata: | ||
274 | i = p->nchunks - 1; | ||
275 | free_partial_kdata: | ||
276 | for (; i >= 0; i--) | ||
277 | drm_free_large(p->chunks[i].kdata); | ||
278 | kfree(p->chunks); | ||
279 | put_bo_list: | ||
280 | if (p->bo_list) | ||
281 | amdgpu_bo_list_put(p->bo_list); | ||
282 | amdgpu_ctx_put(p->ctx); | ||
283 | free_chunk: | ||
284 | kfree(chunk_array); | ||
285 | |||
286 | return ret; | ||
270 | } | 287 | } |
271 | 288 | ||
272 | /* Returns how many bytes TTM can move per IB. | 289 | /* Returns how many bytes TTM can move per IB. |
@@ -321,25 +338,17 @@ static u64 amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev) | |||
321 | return max(bytes_moved_threshold, 1024*1024ull); | 338 | return max(bytes_moved_threshold, 1024*1024ull); |
322 | } | 339 | } |
323 | 340 | ||
324 | int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p) | 341 | int amdgpu_cs_list_validate(struct amdgpu_device *adev, |
342 | struct amdgpu_vm *vm, | ||
343 | struct list_head *validated) | ||
325 | { | 344 | { |
326 | struct amdgpu_fpriv *fpriv = p->filp->driver_priv; | ||
327 | struct amdgpu_vm *vm = &fpriv->vm; | ||
328 | struct amdgpu_device *adev = p->adev; | ||
329 | struct amdgpu_bo_list_entry *lobj; | 345 | struct amdgpu_bo_list_entry *lobj; |
330 | struct list_head duplicates; | ||
331 | struct amdgpu_bo *bo; | 346 | struct amdgpu_bo *bo; |
332 | u64 bytes_moved = 0, initial_bytes_moved; | 347 | u64 bytes_moved = 0, initial_bytes_moved; |
333 | u64 bytes_moved_threshold = amdgpu_cs_get_threshold_for_moves(adev); | 348 | u64 bytes_moved_threshold = amdgpu_cs_get_threshold_for_moves(adev); |
334 | int r; | 349 | int r; |
335 | 350 | ||
336 | INIT_LIST_HEAD(&duplicates); | 351 | list_for_each_entry(lobj, validated, tv.head) { |
337 | r = ttm_eu_reserve_buffers(&p->ticket, &p->validated, true, &duplicates); | ||
338 | if (unlikely(r != 0)) { | ||
339 | return r; | ||
340 | } | ||
341 | |||
342 | list_for_each_entry(lobj, &p->validated, tv.head) { | ||
343 | bo = lobj->robj; | 352 | bo = lobj->robj; |
344 | if (!bo->pin_count) { | 353 | if (!bo->pin_count) { |
345 | u32 domain = lobj->prefered_domains; | 354 | u32 domain = lobj->prefered_domains; |
@@ -373,7 +382,6 @@ int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p) | |||
373 | domain = lobj->allowed_domains; | 382 | domain = lobj->allowed_domains; |
374 | goto retry; | 383 | goto retry; |
375 | } | 384 | } |
376 | ttm_eu_backoff_reservation(&p->ticket, &p->validated); | ||
377 | return r; | 385 | return r; |
378 | } | 386 | } |
379 | } | 387 | } |
@@ -386,6 +394,7 @@ static int amdgpu_cs_parser_relocs(struct amdgpu_cs_parser *p) | |||
386 | { | 394 | { |
387 | struct amdgpu_fpriv *fpriv = p->filp->driver_priv; | 395 | struct amdgpu_fpriv *fpriv = p->filp->driver_priv; |
388 | struct amdgpu_cs_buckets buckets; | 396 | struct amdgpu_cs_buckets buckets; |
397 | struct list_head duplicates; | ||
389 | bool need_mmap_lock = false; | 398 | bool need_mmap_lock = false; |
390 | int i, r; | 399 | int i, r; |
391 | 400 | ||
@@ -405,8 +414,22 @@ static int amdgpu_cs_parser_relocs(struct amdgpu_cs_parser *p) | |||
405 | if (need_mmap_lock) | 414 | if (need_mmap_lock) |
406 | down_read(¤t->mm->mmap_sem); | 415 | down_read(¤t->mm->mmap_sem); |
407 | 416 | ||
408 | r = amdgpu_cs_list_validate(p); | 417 | INIT_LIST_HEAD(&duplicates); |
418 | r = ttm_eu_reserve_buffers(&p->ticket, &p->validated, true, &duplicates); | ||
419 | if (unlikely(r != 0)) | ||
420 | goto error_reserve; | ||
421 | |||
422 | r = amdgpu_cs_list_validate(p->adev, &fpriv->vm, &p->validated); | ||
423 | if (r) | ||
424 | goto error_validate; | ||
425 | |||
426 | r = amdgpu_cs_list_validate(p->adev, &fpriv->vm, &duplicates); | ||
427 | |||
428 | error_validate: | ||
429 | if (r) | ||
430 | ttm_eu_backoff_reservation(&p->ticket, &p->validated); | ||
409 | 431 | ||
432 | error_reserve: | ||
410 | if (need_mmap_lock) | 433 | if (need_mmap_lock) |
411 | up_read(¤t->mm->mmap_sem); | 434 | up_read(¤t->mm->mmap_sem); |
412 | 435 | ||
@@ -772,15 +795,15 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | |||
772 | return 0; | 795 | return 0; |
773 | } | 796 | } |
774 | 797 | ||
775 | static int amdgpu_cs_free_job(struct amdgpu_job *sched_job) | 798 | static int amdgpu_cs_free_job(struct amdgpu_job *job) |
776 | { | 799 | { |
777 | int i; | 800 | int i; |
778 | if (sched_job->ibs) | 801 | if (job->ibs) |
779 | for (i = 0; i < sched_job->num_ibs; i++) | 802 | for (i = 0; i < job->num_ibs; i++) |
780 | amdgpu_ib_free(sched_job->adev, &sched_job->ibs[i]); | 803 | amdgpu_ib_free(job->adev, &job->ibs[i]); |
781 | kfree(sched_job->ibs); | 804 | kfree(job->ibs); |
782 | if (sched_job->uf.bo) | 805 | if (job->uf.bo) |
783 | drm_gem_object_unreference_unlocked(&sched_job->uf.bo->gem_base); | 806 | drm_gem_object_unreference_unlocked(&job->uf.bo->gem_base); |
784 | return 0; | 807 | return 0; |
785 | } | 808 | } |
786 | 809 | ||
@@ -804,7 +827,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
804 | r = amdgpu_cs_parser_init(parser, data); | 827 | r = amdgpu_cs_parser_init(parser, data); |
805 | if (r) { | 828 | if (r) { |
806 | DRM_ERROR("Failed to initialize parser !\n"); | 829 | DRM_ERROR("Failed to initialize parser !\n"); |
807 | amdgpu_cs_parser_fini(parser, r, false); | 830 | kfree(parser); |
808 | up_read(&adev->exclusive_lock); | 831 | up_read(&adev->exclusive_lock); |
809 | r = amdgpu_cs_handle_lockup(adev, r); | 832 | r = amdgpu_cs_handle_lockup(adev, r); |
810 | return r; | 833 | return r; |
@@ -842,7 +865,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
842 | job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); | 865 | job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); |
843 | if (!job) | 866 | if (!job) |
844 | return -ENOMEM; | 867 | return -ENOMEM; |
845 | job->base.sched = ring->scheduler; | 868 | job->base.sched = &ring->sched; |
846 | job->base.s_entity = &parser->ctx->rings[ring->idx].entity; | 869 | job->base.s_entity = &parser->ctx->rings[ring->idx].entity; |
847 | job->adev = parser->adev; | 870 | job->adev = parser->adev; |
848 | job->ibs = parser->ibs; | 871 | job->ibs = parser->ibs; |
@@ -857,7 +880,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
857 | 880 | ||
858 | job->free_job = amdgpu_cs_free_job; | 881 | job->free_job = amdgpu_cs_free_job; |
859 | mutex_lock(&job->job_lock); | 882 | mutex_lock(&job->job_lock); |
860 | r = amd_sched_entity_push_job((struct amd_sched_job *)job); | 883 | r = amd_sched_entity_push_job(&job->base); |
861 | if (r) { | 884 | if (r) { |
862 | mutex_unlock(&job->job_lock); | 885 | mutex_unlock(&job->job_lock); |
863 | amdgpu_cs_free_job(job); | 886 | amdgpu_cs_free_job(job); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index 20cbc4eb5a6f..e0b80ccdfe8a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | |||
@@ -43,10 +43,10 @@ int amdgpu_ctx_init(struct amdgpu_device *adev, bool kernel, | |||
43 | for (i = 0; i < adev->num_rings; i++) { | 43 | for (i = 0; i < adev->num_rings; i++) { |
44 | struct amd_sched_rq *rq; | 44 | struct amd_sched_rq *rq; |
45 | if (kernel) | 45 | if (kernel) |
46 | rq = &adev->rings[i]->scheduler->kernel_rq; | 46 | rq = &adev->rings[i]->sched.kernel_rq; |
47 | else | 47 | else |
48 | rq = &adev->rings[i]->scheduler->sched_rq; | 48 | rq = &adev->rings[i]->sched.sched_rq; |
49 | r = amd_sched_entity_init(adev->rings[i]->scheduler, | 49 | r = amd_sched_entity_init(&adev->rings[i]->sched, |
50 | &ctx->rings[i].entity, | 50 | &ctx->rings[i].entity, |
51 | rq, amdgpu_sched_jobs); | 51 | rq, amdgpu_sched_jobs); |
52 | if (r) | 52 | if (r) |
@@ -55,7 +55,7 @@ int amdgpu_ctx_init(struct amdgpu_device *adev, bool kernel, | |||
55 | 55 | ||
56 | if (i < adev->num_rings) { | 56 | if (i < adev->num_rings) { |
57 | for (j = 0; j < i; j++) | 57 | for (j = 0; j < i; j++) |
58 | amd_sched_entity_fini(adev->rings[j]->scheduler, | 58 | amd_sched_entity_fini(&adev->rings[j]->sched, |
59 | &ctx->rings[j].entity); | 59 | &ctx->rings[j].entity); |
60 | kfree(ctx); | 60 | kfree(ctx); |
61 | return r; | 61 | return r; |
@@ -75,7 +75,7 @@ void amdgpu_ctx_fini(struct amdgpu_ctx *ctx) | |||
75 | 75 | ||
76 | if (amdgpu_enable_scheduler) { | 76 | if (amdgpu_enable_scheduler) { |
77 | for (i = 0; i < adev->num_rings; i++) | 77 | for (i = 0; i < adev->num_rings; i++) |
78 | amd_sched_entity_fini(adev->rings[i]->scheduler, | 78 | amd_sched_entity_fini(&adev->rings[i]->sched, |
79 | &ctx->rings[i].entity); | 79 | &ctx->rings[i].entity); |
80 | } | 80 | } |
81 | } | 81 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 6ff6ae945794..6068d8207d10 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -246,7 +246,7 @@ static int amdgpu_vram_scratch_init(struct amdgpu_device *adev) | |||
246 | r = amdgpu_bo_create(adev, AMDGPU_GPU_PAGE_SIZE, | 246 | r = amdgpu_bo_create(adev, AMDGPU_GPU_PAGE_SIZE, |
247 | PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, | 247 | PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, |
248 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 248 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
249 | NULL, &adev->vram_scratch.robj); | 249 | NULL, NULL, &adev->vram_scratch.robj); |
250 | if (r) { | 250 | if (r) { |
251 | return r; | 251 | return r; |
252 | } | 252 | } |
@@ -449,7 +449,8 @@ static int amdgpu_wb_init(struct amdgpu_device *adev) | |||
449 | 449 | ||
450 | if (adev->wb.wb_obj == NULL) { | 450 | if (adev->wb.wb_obj == NULL) { |
451 | r = amdgpu_bo_create(adev, AMDGPU_MAX_WB * 4, PAGE_SIZE, true, | 451 | r = amdgpu_bo_create(adev, AMDGPU_MAX_WB * 4, PAGE_SIZE, true, |
452 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, &adev->wb.wb_obj); | 452 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, |
453 | &adev->wb.wb_obj); | ||
453 | if (r) { | 454 | if (r) { |
454 | dev_warn(adev->dev, "(%d) create WB bo failed\n", r); | 455 | dev_warn(adev->dev, "(%d) create WB bo failed\n", r); |
455 | return r; | 456 | return r; |
@@ -1650,9 +1651,11 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon) | |||
1650 | drm_kms_helper_poll_disable(dev); | 1651 | drm_kms_helper_poll_disable(dev); |
1651 | 1652 | ||
1652 | /* turn off display hw */ | 1653 | /* turn off display hw */ |
1654 | drm_modeset_lock_all(dev); | ||
1653 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 1655 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
1654 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | 1656 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); |
1655 | } | 1657 | } |
1658 | drm_modeset_unlock_all(dev); | ||
1656 | 1659 | ||
1657 | /* unpin the front buffers */ | 1660 | /* unpin the front buffers */ |
1658 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 1661 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
@@ -1747,9 +1750,11 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon) | |||
1747 | if (fbcon) { | 1750 | if (fbcon) { |
1748 | drm_helper_resume_force_mode(dev); | 1751 | drm_helper_resume_force_mode(dev); |
1749 | /* turn on display hw */ | 1752 | /* turn on display hw */ |
1753 | drm_modeset_lock_all(dev); | ||
1750 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 1754 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
1751 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | 1755 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); |
1752 | } | 1756 | } |
1757 | drm_modeset_unlock_all(dev); | ||
1753 | } | 1758 | } |
1754 | 1759 | ||
1755 | drm_kms_helper_poll_enable(dev); | 1760 | drm_kms_helper_poll_enable(dev); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 0fcc0bd1622c..adb48353f2e1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | |||
@@ -79,6 +79,7 @@ int amdgpu_exp_hw_support = 0; | |||
79 | int amdgpu_enable_scheduler = 0; | 79 | int amdgpu_enable_scheduler = 0; |
80 | int amdgpu_sched_jobs = 16; | 80 | int amdgpu_sched_jobs = 16; |
81 | int amdgpu_sched_hw_submission = 2; | 81 | int amdgpu_sched_hw_submission = 2; |
82 | int amdgpu_enable_semaphores = 1; | ||
82 | 83 | ||
83 | MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes"); | 84 | MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes"); |
84 | module_param_named(vramlimit, amdgpu_vram_limit, int, 0600); | 85 | module_param_named(vramlimit, amdgpu_vram_limit, int, 0600); |
@@ -152,6 +153,9 @@ module_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444); | |||
152 | MODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)"); | 153 | MODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)"); |
153 | module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444); | 154 | module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444); |
154 | 155 | ||
156 | MODULE_PARM_DESC(enable_semaphores, "Enable semaphores (1 = enable (default), 0 = disable)"); | ||
157 | module_param_named(enable_semaphores, amdgpu_enable_semaphores, int, 0644); | ||
158 | |||
155 | static struct pci_device_id pciidlist[] = { | 159 | static struct pci_device_id pciidlist[] = { |
156 | #ifdef CONFIG_DRM_AMDGPU_CIK | 160 | #ifdef CONFIG_DRM_AMDGPU_CIK |
157 | /* Kaveri */ | 161 | /* Kaveri */ |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index 1be2bd6d07ea..b3fc26c59787 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | |||
@@ -609,9 +609,9 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, | |||
609 | * Init the fence driver for the requested ring (all asics). | 609 | * Init the fence driver for the requested ring (all asics). |
610 | * Helper function for amdgpu_fence_driver_init(). | 610 | * Helper function for amdgpu_fence_driver_init(). |
611 | */ | 611 | */ |
612 | void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) | 612 | int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) |
613 | { | 613 | { |
614 | int i; | 614 | int i, r; |
615 | 615 | ||
616 | ring->fence_drv.cpu_addr = NULL; | 616 | ring->fence_drv.cpu_addr = NULL; |
617 | ring->fence_drv.gpu_addr = 0; | 617 | ring->fence_drv.gpu_addr = 0; |
@@ -625,15 +625,19 @@ void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) | |||
625 | amdgpu_fence_check_lockup); | 625 | amdgpu_fence_check_lockup); |
626 | ring->fence_drv.ring = ring; | 626 | ring->fence_drv.ring = ring; |
627 | 627 | ||
628 | init_waitqueue_head(&ring->fence_drv.fence_queue); | ||
629 | |||
628 | if (amdgpu_enable_scheduler) { | 630 | if (amdgpu_enable_scheduler) { |
629 | ring->scheduler = amd_sched_create(&amdgpu_sched_ops, | 631 | r = amd_sched_init(&ring->sched, &amdgpu_sched_ops, |
630 | ring->idx, | 632 | amdgpu_sched_hw_submission, ring->name); |
631 | amdgpu_sched_hw_submission, | 633 | if (r) { |
632 | (void *)ring->adev); | 634 | DRM_ERROR("Failed to create scheduler on ring %s.\n", |
633 | if (!ring->scheduler) | 635 | ring->name); |
634 | DRM_ERROR("Failed to create scheduler on ring %d.\n", | 636 | return r; |
635 | ring->idx); | 637 | } |
636 | } | 638 | } |
639 | |||
640 | return 0; | ||
637 | } | 641 | } |
638 | 642 | ||
639 | /** | 643 | /** |
@@ -681,8 +685,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev) | |||
681 | wake_up_all(&ring->fence_drv.fence_queue); | 685 | wake_up_all(&ring->fence_drv.fence_queue); |
682 | amdgpu_irq_put(adev, ring->fence_drv.irq_src, | 686 | amdgpu_irq_put(adev, ring->fence_drv.irq_src, |
683 | ring->fence_drv.irq_type); | 687 | ring->fence_drv.irq_type); |
684 | if (ring->scheduler) | 688 | amd_sched_fini(&ring->sched); |
685 | amd_sched_destroy(ring->scheduler); | ||
686 | ring->fence_drv.initialized = false; | 689 | ring->fence_drv.initialized = false; |
687 | } | 690 | } |
688 | mutex_unlock(&adev->ring_lock); | 691 | mutex_unlock(&adev->ring_lock); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c index cbd3a486c5c2..7312d729d300 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | |||
@@ -127,7 +127,7 @@ int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev) | |||
127 | r = amdgpu_bo_create(adev, adev->gart.table_size, | 127 | r = amdgpu_bo_create(adev, adev->gart.table_size, |
128 | PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, | 128 | PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, |
129 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 129 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
130 | NULL, &adev->gart.robj); | 130 | NULL, NULL, &adev->gart.robj); |
131 | if (r) { | 131 | if (r) { |
132 | return r; | 132 | return r; |
133 | } | 133 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 5839fab374bf..7297ca3a0ba7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | |||
@@ -69,7 +69,8 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size, | |||
69 | } | 69 | } |
70 | } | 70 | } |
71 | retry: | 71 | retry: |
72 | r = amdgpu_bo_create(adev, size, alignment, kernel, initial_domain, flags, NULL, &robj); | 72 | r = amdgpu_bo_create(adev, size, alignment, kernel, initial_domain, |
73 | flags, NULL, NULL, &robj); | ||
73 | if (r) { | 74 | if (r) { |
74 | if (r != -ERESTARTSYS) { | 75 | if (r != -ERESTARTSYS) { |
75 | if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) { | 76 | if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) { |
@@ -426,6 +427,10 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, | |||
426 | &args->data.data_size_bytes, | 427 | &args->data.data_size_bytes, |
427 | &args->data.flags); | 428 | &args->data.flags); |
428 | } else if (args->op == AMDGPU_GEM_METADATA_OP_SET_METADATA) { | 429 | } else if (args->op == AMDGPU_GEM_METADATA_OP_SET_METADATA) { |
430 | if (args->data.data_size_bytes > sizeof(args->data.data)) { | ||
431 | r = -EINVAL; | ||
432 | goto unreserve; | ||
433 | } | ||
429 | r = amdgpu_bo_set_tiling_flags(robj, args->data.tiling_info); | 434 | r = amdgpu_bo_set_tiling_flags(robj, args->data.tiling_info); |
430 | if (!r) | 435 | if (!r) |
431 | r = amdgpu_bo_set_metadata(robj, args->data.data, | 436 | r = amdgpu_bo_set_metadata(robj, args->data.data, |
@@ -433,6 +438,7 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data, | |||
433 | args->data.flags); | 438 | args->data.flags); |
434 | } | 439 | } |
435 | 440 | ||
441 | unreserve: | ||
436 | amdgpu_bo_unreserve(robj); | 442 | amdgpu_bo_unreserve(robj); |
437 | out: | 443 | out: |
438 | drm_gem_object_unreference_unlocked(gobj); | 444 | drm_gem_object_unreference_unlocked(gobj); |
@@ -454,11 +460,12 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, | |||
454 | struct ttm_validate_buffer tv, *entry; | 460 | struct ttm_validate_buffer tv, *entry; |
455 | struct amdgpu_bo_list_entry *vm_bos; | 461 | struct amdgpu_bo_list_entry *vm_bos; |
456 | struct ww_acquire_ctx ticket; | 462 | struct ww_acquire_ctx ticket; |
457 | struct list_head list; | 463 | struct list_head list, duplicates; |
458 | unsigned domain; | 464 | unsigned domain; |
459 | int r; | 465 | int r; |
460 | 466 | ||
461 | INIT_LIST_HEAD(&list); | 467 | INIT_LIST_HEAD(&list); |
468 | INIT_LIST_HEAD(&duplicates); | ||
462 | 469 | ||
463 | tv.bo = &bo_va->bo->tbo; | 470 | tv.bo = &bo_va->bo->tbo; |
464 | tv.shared = true; | 471 | tv.shared = true; |
@@ -468,7 +475,8 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, | |||
468 | if (!vm_bos) | 475 | if (!vm_bos) |
469 | return; | 476 | return; |
470 | 477 | ||
471 | r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL); | 478 | /* Provide duplicates to avoid -EALREADY */ |
479 | r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates); | ||
472 | if (r) | 480 | if (r) |
473 | goto error_free; | 481 | goto error_free; |
474 | 482 | ||
@@ -651,7 +659,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv, | |||
651 | int r; | 659 | int r; |
652 | 660 | ||
653 | args->pitch = amdgpu_align_pitch(adev, args->width, args->bpp, 0) * ((args->bpp + 1) / 8); | 661 | args->pitch = amdgpu_align_pitch(adev, args->width, args->bpp, 0) * ((args->bpp + 1) / 8); |
654 | args->size = args->pitch * args->height; | 662 | args->size = (u64)args->pitch * args->height; |
655 | args->size = ALIGN(args->size, PAGE_SIZE); | 663 | args->size = ALIGN(args->size, PAGE_SIZE); |
656 | 664 | ||
657 | r = amdgpu_gem_object_create(adev, args->size, 0, | 665 | r = amdgpu_gem_object_create(adev, args->size, 0, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c index 5c8a803acedc..534fc04e80fd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c | |||
@@ -43,7 +43,7 @@ static int amdgpu_ih_ring_alloc(struct amdgpu_device *adev) | |||
43 | r = amdgpu_bo_create(adev, adev->irq.ih.ring_size, | 43 | r = amdgpu_bo_create(adev, adev->irq.ih.ring_size, |
44 | PAGE_SIZE, true, | 44 | PAGE_SIZE, true, |
45 | AMDGPU_GEM_DOMAIN_GTT, 0, | 45 | AMDGPU_GEM_DOMAIN_GTT, 0, |
46 | NULL, &adev->irq.ih.ring_obj); | 46 | NULL, NULL, &adev->irq.ih.ring_obj); |
47 | if (r) { | 47 | if (r) { |
48 | DRM_ERROR("amdgpu: failed to create ih ring buffer (%d).\n", r); | 48 | DRM_ERROR("amdgpu: failed to create ih ring buffer (%d).\n", r); |
49 | return r; | 49 | return r; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c index 0aba8e9bc8a0..7c42ff670080 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | |||
@@ -140,7 +140,7 @@ void amdgpu_irq_preinstall(struct drm_device *dev) | |||
140 | */ | 140 | */ |
141 | int amdgpu_irq_postinstall(struct drm_device *dev) | 141 | int amdgpu_irq_postinstall(struct drm_device *dev) |
142 | { | 142 | { |
143 | dev->max_vblank_count = 0x001fffff; | 143 | dev->max_vblank_count = 0x00ffffff; |
144 | return 0; | 144 | return 0; |
145 | } | 145 | } |
146 | 146 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 22367939ebf1..8c735f544b66 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | |||
@@ -390,7 +390,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
390 | min((size_t)size, sizeof(vram_gtt))) ? -EFAULT : 0; | 390 | min((size_t)size, sizeof(vram_gtt))) ? -EFAULT : 0; |
391 | } | 391 | } |
392 | case AMDGPU_INFO_READ_MMR_REG: { | 392 | case AMDGPU_INFO_READ_MMR_REG: { |
393 | unsigned n, alloc_size = info->read_mmr_reg.count * 4; | 393 | unsigned n, alloc_size; |
394 | uint32_t *regs; | 394 | uint32_t *regs; |
395 | unsigned se_num = (info->read_mmr_reg.instance >> | 395 | unsigned se_num = (info->read_mmr_reg.instance >> |
396 | AMDGPU_INFO_MMR_SE_INDEX_SHIFT) & | 396 | AMDGPU_INFO_MMR_SE_INDEX_SHIFT) & |
@@ -406,9 +406,10 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file | |||
406 | if (sh_num == AMDGPU_INFO_MMR_SH_INDEX_MASK) | 406 | if (sh_num == AMDGPU_INFO_MMR_SH_INDEX_MASK) |
407 | sh_num = 0xffffffff; | 407 | sh_num = 0xffffffff; |
408 | 408 | ||
409 | regs = kmalloc(alloc_size, GFP_KERNEL); | 409 | regs = kmalloc_array(info->read_mmr_reg.count, sizeof(*regs), GFP_KERNEL); |
410 | if (!regs) | 410 | if (!regs) |
411 | return -ENOMEM; | 411 | return -ENOMEM; |
412 | alloc_size = info->read_mmr_reg.count * sizeof(*regs); | ||
412 | 413 | ||
413 | for (i = 0; i < info->read_mmr_reg.count; i++) | 414 | for (i = 0; i < info->read_mmr_reg.count; i++) |
414 | if (amdgpu_asic_read_register(adev, se_num, sh_num, | 415 | if (amdgpu_asic_read_register(adev, se_num, sh_num, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 08b09d55b96f..1a7708f365f3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |||
@@ -215,6 +215,7 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev, | |||
215 | bool kernel, u32 domain, u64 flags, | 215 | bool kernel, u32 domain, u64 flags, |
216 | struct sg_table *sg, | 216 | struct sg_table *sg, |
217 | struct ttm_placement *placement, | 217 | struct ttm_placement *placement, |
218 | struct reservation_object *resv, | ||
218 | struct amdgpu_bo **bo_ptr) | 219 | struct amdgpu_bo **bo_ptr) |
219 | { | 220 | { |
220 | struct amdgpu_bo *bo; | 221 | struct amdgpu_bo *bo; |
@@ -261,7 +262,7 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev, | |||
261 | /* Kernel allocation are uninterruptible */ | 262 | /* Kernel allocation are uninterruptible */ |
262 | r = ttm_bo_init(&adev->mman.bdev, &bo->tbo, size, type, | 263 | r = ttm_bo_init(&adev->mman.bdev, &bo->tbo, size, type, |
263 | &bo->placement, page_align, !kernel, NULL, | 264 | &bo->placement, page_align, !kernel, NULL, |
264 | acc_size, sg, NULL, &amdgpu_ttm_bo_destroy); | 265 | acc_size, sg, resv, &amdgpu_ttm_bo_destroy); |
265 | if (unlikely(r != 0)) { | 266 | if (unlikely(r != 0)) { |
266 | return r; | 267 | return r; |
267 | } | 268 | } |
@@ -275,7 +276,9 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev, | |||
275 | int amdgpu_bo_create(struct amdgpu_device *adev, | 276 | int amdgpu_bo_create(struct amdgpu_device *adev, |
276 | unsigned long size, int byte_align, | 277 | unsigned long size, int byte_align, |
277 | bool kernel, u32 domain, u64 flags, | 278 | bool kernel, u32 domain, u64 flags, |
278 | struct sg_table *sg, struct amdgpu_bo **bo_ptr) | 279 | struct sg_table *sg, |
280 | struct reservation_object *resv, | ||
281 | struct amdgpu_bo **bo_ptr) | ||
279 | { | 282 | { |
280 | struct ttm_placement placement = {0}; | 283 | struct ttm_placement placement = {0}; |
281 | struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1]; | 284 | struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1]; |
@@ -286,11 +289,9 @@ int amdgpu_bo_create(struct amdgpu_device *adev, | |||
286 | amdgpu_ttm_placement_init(adev, &placement, | 289 | amdgpu_ttm_placement_init(adev, &placement, |
287 | placements, domain, flags); | 290 | placements, domain, flags); |
288 | 291 | ||
289 | return amdgpu_bo_create_restricted(adev, size, byte_align, | 292 | return amdgpu_bo_create_restricted(adev, size, byte_align, kernel, |
290 | kernel, domain, flags, | 293 | domain, flags, sg, &placement, |
291 | sg, | 294 | resv, bo_ptr); |
292 | &placement, | ||
293 | bo_ptr); | ||
294 | } | 295 | } |
295 | 296 | ||
296 | int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr) | 297 | int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr) |
@@ -535,12 +536,10 @@ int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata, | |||
535 | if (metadata == NULL) | 536 | if (metadata == NULL) |
536 | return -EINVAL; | 537 | return -EINVAL; |
537 | 538 | ||
538 | buffer = kzalloc(metadata_size, GFP_KERNEL); | 539 | buffer = kmemdup(metadata, metadata_size, GFP_KERNEL); |
539 | if (buffer == NULL) | 540 | if (buffer == NULL) |
540 | return -ENOMEM; | 541 | return -ENOMEM; |
541 | 542 | ||
542 | memcpy(buffer, metadata, metadata_size); | ||
543 | |||
544 | kfree(bo->metadata); | 543 | kfree(bo->metadata); |
545 | bo->metadata_flags = flags; | 544 | bo->metadata_flags = flags; |
546 | bo->metadata = buffer; | 545 | bo->metadata = buffer; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h index 6ea18dcec561..3c2ff4567798 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | |||
@@ -129,12 +129,14 @@ int amdgpu_bo_create(struct amdgpu_device *adev, | |||
129 | unsigned long size, int byte_align, | 129 | unsigned long size, int byte_align, |
130 | bool kernel, u32 domain, u64 flags, | 130 | bool kernel, u32 domain, u64 flags, |
131 | struct sg_table *sg, | 131 | struct sg_table *sg, |
132 | struct reservation_object *resv, | ||
132 | struct amdgpu_bo **bo_ptr); | 133 | struct amdgpu_bo **bo_ptr); |
133 | int amdgpu_bo_create_restricted(struct amdgpu_device *adev, | 134 | int amdgpu_bo_create_restricted(struct amdgpu_device *adev, |
134 | unsigned long size, int byte_align, | 135 | unsigned long size, int byte_align, |
135 | bool kernel, u32 domain, u64 flags, | 136 | bool kernel, u32 domain, u64 flags, |
136 | struct sg_table *sg, | 137 | struct sg_table *sg, |
137 | struct ttm_placement *placement, | 138 | struct ttm_placement *placement, |
139 | struct reservation_object *resv, | ||
138 | struct amdgpu_bo **bo_ptr); | 140 | struct amdgpu_bo **bo_ptr); |
139 | int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); | 141 | int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); |
140 | void amdgpu_bo_kunmap(struct amdgpu_bo *bo); | 142 | void amdgpu_bo_kunmap(struct amdgpu_bo *bo); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c index d9652fe32d6a..59f735a933a9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | |||
@@ -61,12 +61,15 @@ struct drm_gem_object *amdgpu_gem_prime_import_sg_table(struct drm_device *dev, | |||
61 | struct dma_buf_attachment *attach, | 61 | struct dma_buf_attachment *attach, |
62 | struct sg_table *sg) | 62 | struct sg_table *sg) |
63 | { | 63 | { |
64 | struct reservation_object *resv = attach->dmabuf->resv; | ||
64 | struct amdgpu_device *adev = dev->dev_private; | 65 | struct amdgpu_device *adev = dev->dev_private; |
65 | struct amdgpu_bo *bo; | 66 | struct amdgpu_bo *bo; |
66 | int ret; | 67 | int ret; |
67 | 68 | ||
69 | ww_mutex_lock(&resv->lock, NULL); | ||
68 | ret = amdgpu_bo_create(adev, attach->dmabuf->size, PAGE_SIZE, false, | 70 | ret = amdgpu_bo_create(adev, attach->dmabuf->size, PAGE_SIZE, false, |
69 | AMDGPU_GEM_DOMAIN_GTT, 0, sg, &bo); | 71 | AMDGPU_GEM_DOMAIN_GTT, 0, sg, resv, &bo); |
72 | ww_mutex_unlock(&resv->lock); | ||
70 | if (ret) | 73 | if (ret) |
71 | return ERR_PTR(ret); | 74 | return ERR_PTR(ret); |
72 | 75 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index 9bec91484c24..30dce235ddeb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | |||
@@ -357,11 +357,11 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, | |||
357 | ring->adev = adev; | 357 | ring->adev = adev; |
358 | ring->idx = adev->num_rings++; | 358 | ring->idx = adev->num_rings++; |
359 | adev->rings[ring->idx] = ring; | 359 | adev->rings[ring->idx] = ring; |
360 | amdgpu_fence_driver_init_ring(ring); | 360 | r = amdgpu_fence_driver_init_ring(ring); |
361 | if (r) | ||
362 | return r; | ||
361 | } | 363 | } |
362 | 364 | ||
363 | init_waitqueue_head(&ring->fence_drv.fence_queue); | ||
364 | |||
365 | r = amdgpu_wb_get(adev, &ring->rptr_offs); | 365 | r = amdgpu_wb_get(adev, &ring->rptr_offs); |
366 | if (r) { | 366 | if (r) { |
367 | dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r); | 367 | dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r); |
@@ -407,7 +407,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, | |||
407 | if (ring->ring_obj == NULL) { | 407 | if (ring->ring_obj == NULL) { |
408 | r = amdgpu_bo_create(adev, ring->ring_size, PAGE_SIZE, true, | 408 | r = amdgpu_bo_create(adev, ring->ring_size, PAGE_SIZE, true, |
409 | AMDGPU_GEM_DOMAIN_GTT, 0, | 409 | AMDGPU_GEM_DOMAIN_GTT, 0, |
410 | NULL, &ring->ring_obj); | 410 | NULL, NULL, &ring->ring_obj); |
411 | if (r) { | 411 | if (r) { |
412 | dev_err(adev->dev, "(%d) ring create failed\n", r); | 412 | dev_err(adev->dev, "(%d) ring create failed\n", r); |
413 | return r; | 413 | return r; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c index 74dad270362c..e90712443fe9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c | |||
@@ -64,8 +64,8 @@ int amdgpu_sa_bo_manager_init(struct amdgpu_device *adev, | |||
64 | INIT_LIST_HEAD(&sa_manager->flist[i]); | 64 | INIT_LIST_HEAD(&sa_manager->flist[i]); |
65 | } | 65 | } |
66 | 66 | ||
67 | r = amdgpu_bo_create(adev, size, align, true, | 67 | r = amdgpu_bo_create(adev, size, align, true, domain, |
68 | domain, 0, NULL, &sa_manager->bo); | 68 | 0, NULL, NULL, &sa_manager->bo); |
69 | if (r) { | 69 | if (r) { |
70 | dev_err(adev->dev, "(%d) failed to allocate bo for manager\n", r); | 70 | dev_err(adev->dev, "(%d) failed to allocate bo for manager\n", r); |
71 | return r; | 71 | return r; |
@@ -145,8 +145,13 @@ static uint32_t amdgpu_sa_get_ring_from_fence(struct fence *f) | |||
145 | struct amd_sched_fence *s_fence; | 145 | struct amd_sched_fence *s_fence; |
146 | 146 | ||
147 | s_fence = to_amd_sched_fence(f); | 147 | s_fence = to_amd_sched_fence(f); |
148 | if (s_fence) | 148 | if (s_fence) { |
149 | return s_fence->scheduler->ring_id; | 149 | struct amdgpu_ring *ring; |
150 | |||
151 | ring = container_of(s_fence->sched, struct amdgpu_ring, sched); | ||
152 | return ring->idx; | ||
153 | } | ||
154 | |||
150 | a_fence = to_amdgpu_fence(f); | 155 | a_fence = to_amdgpu_fence(f); |
151 | if (a_fence) | 156 | if (a_fence) |
152 | return a_fence->ring->idx; | 157 | return a_fence->ring->idx; |
@@ -412,6 +417,26 @@ void amdgpu_sa_bo_free(struct amdgpu_device *adev, struct amdgpu_sa_bo **sa_bo, | |||
412 | } | 417 | } |
413 | 418 | ||
414 | #if defined(CONFIG_DEBUG_FS) | 419 | #if defined(CONFIG_DEBUG_FS) |
420 | |||
421 | static void amdgpu_sa_bo_dump_fence(struct fence *fence, struct seq_file *m) | ||
422 | { | ||
423 | struct amdgpu_fence *a_fence = to_amdgpu_fence(fence); | ||
424 | struct amd_sched_fence *s_fence = to_amd_sched_fence(fence); | ||
425 | |||
426 | if (a_fence) | ||
427 | seq_printf(m, " protected by 0x%016llx on ring %d", | ||
428 | a_fence->seq, a_fence->ring->idx); | ||
429 | |||
430 | if (s_fence) { | ||
431 | struct amdgpu_ring *ring; | ||
432 | |||
433 | |||
434 | ring = container_of(s_fence->sched, struct amdgpu_ring, sched); | ||
435 | seq_printf(m, " protected by 0x%016x on ring %d", | ||
436 | s_fence->base.seqno, ring->idx); | ||
437 | } | ||
438 | } | ||
439 | |||
415 | void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, | 440 | void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, |
416 | struct seq_file *m) | 441 | struct seq_file *m) |
417 | { | 442 | { |
@@ -428,18 +453,8 @@ void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, | |||
428 | } | 453 | } |
429 | seq_printf(m, "[0x%010llx 0x%010llx] size %8lld", | 454 | seq_printf(m, "[0x%010llx 0x%010llx] size %8lld", |
430 | soffset, eoffset, eoffset - soffset); | 455 | soffset, eoffset, eoffset - soffset); |
431 | if (i->fence) { | 456 | if (i->fence) |
432 | struct amdgpu_fence *a_fence = to_amdgpu_fence(i->fence); | 457 | amdgpu_sa_bo_dump_fence(i->fence, m); |
433 | struct amd_sched_fence *s_fence = to_amd_sched_fence(i->fence); | ||
434 | if (a_fence) | ||
435 | seq_printf(m, " protected by 0x%016llx on ring %d", | ||
436 | a_fence->seq, a_fence->ring->idx); | ||
437 | if (s_fence) | ||
438 | seq_printf(m, " protected by 0x%016x on ring %d", | ||
439 | s_fence->base.seqno, | ||
440 | s_fence->scheduler->ring_id); | ||
441 | |||
442 | } | ||
443 | seq_printf(m, "\n"); | 458 | seq_printf(m, "\n"); |
444 | } | 459 | } |
445 | spin_unlock(&sa_manager->wq.lock); | 460 | spin_unlock(&sa_manager->wq.lock); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c index de98fbd2971e..2e946b2cad88 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | |||
@@ -27,63 +27,48 @@ | |||
27 | #include <drm/drmP.h> | 27 | #include <drm/drmP.h> |
28 | #include "amdgpu.h" | 28 | #include "amdgpu.h" |
29 | 29 | ||
30 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *job) | 30 | static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job) |
31 | { | 31 | { |
32 | struct amdgpu_job *sched_job = (struct amdgpu_job *)job; | 32 | struct amdgpu_job *job = to_amdgpu_job(sched_job); |
33 | return amdgpu_sync_get_fence(&sched_job->ibs->sync); | 33 | return amdgpu_sync_get_fence(&job->ibs->sync); |
34 | } | 34 | } |
35 | 35 | ||
36 | static struct fence *amdgpu_sched_run_job(struct amd_sched_job *job) | 36 | static struct fence *amdgpu_sched_run_job(struct amd_sched_job *sched_job) |
37 | { | 37 | { |
38 | struct amdgpu_job *sched_job; | 38 | struct amdgpu_fence *fence = NULL; |
39 | struct amdgpu_fence *fence; | 39 | struct amdgpu_job *job; |
40 | int r; | 40 | int r; |
41 | 41 | ||
42 | if (!job) { | 42 | if (!sched_job) { |
43 | DRM_ERROR("job is null\n"); | 43 | DRM_ERROR("job is null\n"); |
44 | return NULL; | 44 | return NULL; |
45 | } | 45 | } |
46 | sched_job = (struct amdgpu_job *)job; | 46 | job = to_amdgpu_job(sched_job); |
47 | mutex_lock(&sched_job->job_lock); | 47 | mutex_lock(&job->job_lock); |
48 | r = amdgpu_ib_schedule(sched_job->adev, | 48 | r = amdgpu_ib_schedule(job->adev, |
49 | sched_job->num_ibs, | 49 | job->num_ibs, |
50 | sched_job->ibs, | 50 | job->ibs, |
51 | sched_job->base.owner); | 51 | job->base.owner); |
52 | if (r) | 52 | if (r) { |
53 | DRM_ERROR("Error scheduling IBs (%d)\n", r); | ||
53 | goto err; | 54 | goto err; |
54 | fence = amdgpu_fence_ref(sched_job->ibs[sched_job->num_ibs - 1].fence); | 55 | } |
55 | |||
56 | if (sched_job->free_job) | ||
57 | sched_job->free_job(sched_job); | ||
58 | 56 | ||
59 | mutex_unlock(&sched_job->job_lock); | 57 | fence = amdgpu_fence_ref(job->ibs[job->num_ibs - 1].fence); |
60 | return &fence->base; | ||
61 | 58 | ||
62 | err: | 59 | err: |
63 | DRM_ERROR("Run job error\n"); | 60 | if (job->free_job) |
64 | mutex_unlock(&sched_job->job_lock); | 61 | job->free_job(job); |
65 | job->sched->ops->process_job(job); | ||
66 | return NULL; | ||
67 | } | ||
68 | 62 | ||
69 | static void amdgpu_sched_process_job(struct amd_sched_job *job) | 63 | mutex_unlock(&job->job_lock); |
70 | { | 64 | fence_put(&job->base.s_fence->base); |
71 | struct amdgpu_job *sched_job; | 65 | kfree(job); |
72 | 66 | return fence ? &fence->base : NULL; | |
73 | if (!job) { | ||
74 | DRM_ERROR("job is null\n"); | ||
75 | return; | ||
76 | } | ||
77 | sched_job = (struct amdgpu_job *)job; | ||
78 | /* after processing job, free memory */ | ||
79 | fence_put(&sched_job->base.s_fence->base); | ||
80 | kfree(sched_job); | ||
81 | } | 67 | } |
82 | 68 | ||
83 | struct amd_sched_backend_ops amdgpu_sched_ops = { | 69 | struct amd_sched_backend_ops amdgpu_sched_ops = { |
84 | .dependency = amdgpu_sched_dependency, | 70 | .dependency = amdgpu_sched_dependency, |
85 | .run_job = amdgpu_sched_run_job, | 71 | .run_job = amdgpu_sched_run_job, |
86 | .process_job = amdgpu_sched_process_job | ||
87 | }; | 72 | }; |
88 | 73 | ||
89 | int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, | 74 | int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, |
@@ -100,7 +85,7 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, | |||
100 | kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); | 85 | kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); |
101 | if (!job) | 86 | if (!job) |
102 | return -ENOMEM; | 87 | return -ENOMEM; |
103 | job->base.sched = ring->scheduler; | 88 | job->base.sched = &ring->sched; |
104 | job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; | 89 | job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; |
105 | job->adev = adev; | 90 | job->adev = adev; |
106 | job->ibs = ibs; | 91 | job->ibs = ibs; |
@@ -109,7 +94,7 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, | |||
109 | mutex_init(&job->job_lock); | 94 | mutex_init(&job->job_lock); |
110 | job->free_job = free_job; | 95 | job->free_job = free_job; |
111 | mutex_lock(&job->job_lock); | 96 | mutex_lock(&job->job_lock); |
112 | r = amd_sched_entity_push_job((struct amd_sched_job *)job); | 97 | r = amd_sched_entity_push_job(&job->base); |
113 | if (r) { | 98 | if (r) { |
114 | mutex_unlock(&job->job_lock); | 99 | mutex_unlock(&job->job_lock); |
115 | kfree(job); | 100 | kfree(job); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index 068aeaff7183..4921de15b451 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | |||
@@ -65,8 +65,14 @@ static bool amdgpu_sync_same_dev(struct amdgpu_device *adev, struct fence *f) | |||
65 | 65 | ||
66 | if (a_fence) | 66 | if (a_fence) |
67 | return a_fence->ring->adev == adev; | 67 | return a_fence->ring->adev == adev; |
68 | if (s_fence) | 68 | |
69 | return (struct amdgpu_device *)s_fence->scheduler->priv == adev; | 69 | if (s_fence) { |
70 | struct amdgpu_ring *ring; | ||
71 | |||
72 | ring = container_of(s_fence->sched, struct amdgpu_ring, sched); | ||
73 | return ring->adev == adev; | ||
74 | } | ||
75 | |||
70 | return false; | 76 | return false; |
71 | } | 77 | } |
72 | 78 | ||
@@ -251,6 +257,20 @@ int amdgpu_sync_wait(struct amdgpu_sync *sync) | |||
251 | fence_put(e->fence); | 257 | fence_put(e->fence); |
252 | kfree(e); | 258 | kfree(e); |
253 | } | 259 | } |
260 | |||
261 | if (amdgpu_enable_semaphores) | ||
262 | return 0; | ||
263 | |||
264 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { | ||
265 | struct amdgpu_fence *fence = sync->sync_to[i]; | ||
266 | if (!fence) | ||
267 | continue; | ||
268 | |||
269 | r = fence_wait(&fence->base, false); | ||
270 | if (r) | ||
271 | return r; | ||
272 | } | ||
273 | |||
254 | return 0; | 274 | return 0; |
255 | } | 275 | } |
256 | 276 | ||
@@ -285,7 +305,8 @@ int amdgpu_sync_rings(struct amdgpu_sync *sync, | |||
285 | return -EINVAL; | 305 | return -EINVAL; |
286 | } | 306 | } |
287 | 307 | ||
288 | if (amdgpu_enable_scheduler || (count >= AMDGPU_NUM_SYNCS)) { | 308 | if (amdgpu_enable_scheduler || !amdgpu_enable_semaphores || |
309 | (count >= AMDGPU_NUM_SYNCS)) { | ||
289 | /* not enough room, wait manually */ | 310 | /* not enough room, wait manually */ |
290 | r = fence_wait(&fence->base, false); | 311 | r = fence_wait(&fence->base, false); |
291 | if (r) | 312 | if (r) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c index f80b1a43be8a..4865615e9c06 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c | |||
@@ -59,8 +59,9 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev) | |||
59 | goto out_cleanup; | 59 | goto out_cleanup; |
60 | } | 60 | } |
61 | 61 | ||
62 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, 0, | 62 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, |
63 | NULL, &vram_obj); | 63 | AMDGPU_GEM_DOMAIN_VRAM, 0, |
64 | NULL, NULL, &vram_obj); | ||
64 | if (r) { | 65 | if (r) { |
65 | DRM_ERROR("Failed to create VRAM object\n"); | 66 | DRM_ERROR("Failed to create VRAM object\n"); |
66 | goto out_cleanup; | 67 | goto out_cleanup; |
@@ -80,7 +81,8 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev) | |||
80 | struct fence *fence = NULL; | 81 | struct fence *fence = NULL; |
81 | 82 | ||
82 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, | 83 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, |
83 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i); | 84 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, |
85 | NULL, gtt_obj + i); | ||
84 | if (r) { | 86 | if (r) { |
85 | DRM_ERROR("Failed to create GTT object %d\n", i); | 87 | DRM_ERROR("Failed to create GTT object %d\n", i); |
86 | goto out_lclean; | 88 | goto out_lclean; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index b5abd5cde413..364cbe975332 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -861,7 +861,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev) | |||
861 | r = amdgpu_bo_create(adev, 256 * 1024, PAGE_SIZE, true, | 861 | r = amdgpu_bo_create(adev, 256 * 1024, PAGE_SIZE, true, |
862 | AMDGPU_GEM_DOMAIN_VRAM, | 862 | AMDGPU_GEM_DOMAIN_VRAM, |
863 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 863 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
864 | NULL, &adev->stollen_vga_memory); | 864 | NULL, NULL, &adev->stollen_vga_memory); |
865 | if (r) { | 865 | if (r) { |
866 | return r; | 866 | return r; |
867 | } | 867 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c index 482e66797ae6..5cc95f1a7dab 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | |||
@@ -247,7 +247,7 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev) | |||
247 | const struct common_firmware_header *header = NULL; | 247 | const struct common_firmware_header *header = NULL; |
248 | 248 | ||
249 | err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true, | 249 | err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true, |
250 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, bo); | 250 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, bo); |
251 | if (err) { | 251 | if (err) { |
252 | dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err); | 252 | dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err); |
253 | err = -ENOMEM; | 253 | err = -ENOMEM; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c index 2cf6c6b06e3b..d0312364d950 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | |||
@@ -156,7 +156,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev) | |||
156 | r = amdgpu_bo_create(adev, bo_size, PAGE_SIZE, true, | 156 | r = amdgpu_bo_create(adev, bo_size, PAGE_SIZE, true, |
157 | AMDGPU_GEM_DOMAIN_VRAM, | 157 | AMDGPU_GEM_DOMAIN_VRAM, |
158 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 158 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
159 | NULL, &adev->uvd.vcpu_bo); | 159 | NULL, NULL, &adev->uvd.vcpu_bo); |
160 | if (r) { | 160 | if (r) { |
161 | dev_err(adev->dev, "(%d) failed to allocate UVD bo\n", r); | 161 | dev_err(adev->dev, "(%d) failed to allocate UVD bo\n", r); |
162 | return r; | 162 | return r; |
@@ -543,46 +543,60 @@ static int amdgpu_uvd_cs_msg(struct amdgpu_uvd_cs_ctx *ctx, | |||
543 | return -EINVAL; | 543 | return -EINVAL; |
544 | } | 544 | } |
545 | 545 | ||
546 | if (msg_type == 1) { | 546 | switch (msg_type) { |
547 | case 0: | ||
548 | /* it's a create msg, calc image size (width * height) */ | ||
549 | amdgpu_bo_kunmap(bo); | ||
550 | |||
551 | /* try to alloc a new handle */ | ||
552 | for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { | ||
553 | if (atomic_read(&adev->uvd.handles[i]) == handle) { | ||
554 | DRM_ERROR("Handle 0x%x already in use!\n", handle); | ||
555 | return -EINVAL; | ||
556 | } | ||
557 | |||
558 | if (!atomic_cmpxchg(&adev->uvd.handles[i], 0, handle)) { | ||
559 | adev->uvd.filp[i] = ctx->parser->filp; | ||
560 | return 0; | ||
561 | } | ||
562 | } | ||
563 | |||
564 | DRM_ERROR("No more free UVD handles!\n"); | ||
565 | return -EINVAL; | ||
566 | |||
567 | case 1: | ||
547 | /* it's a decode msg, calc buffer sizes */ | 568 | /* it's a decode msg, calc buffer sizes */ |
548 | r = amdgpu_uvd_cs_msg_decode(msg, ctx->buf_sizes); | 569 | r = amdgpu_uvd_cs_msg_decode(msg, ctx->buf_sizes); |
549 | amdgpu_bo_kunmap(bo); | 570 | amdgpu_bo_kunmap(bo); |
550 | if (r) | 571 | if (r) |
551 | return r; | 572 | return r; |
552 | 573 | ||
553 | } else if (msg_type == 2) { | 574 | /* validate the handle */ |
575 | for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { | ||
576 | if (atomic_read(&adev->uvd.handles[i]) == handle) { | ||
577 | if (adev->uvd.filp[i] != ctx->parser->filp) { | ||
578 | DRM_ERROR("UVD handle collision detected!\n"); | ||
579 | return -EINVAL; | ||
580 | } | ||
581 | return 0; | ||
582 | } | ||
583 | } | ||
584 | |||
585 | DRM_ERROR("Invalid UVD handle 0x%x!\n", handle); | ||
586 | return -ENOENT; | ||
587 | |||
588 | case 2: | ||
554 | /* it's a destroy msg, free the handle */ | 589 | /* it's a destroy msg, free the handle */ |
555 | for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) | 590 | for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) |
556 | atomic_cmpxchg(&adev->uvd.handles[i], handle, 0); | 591 | atomic_cmpxchg(&adev->uvd.handles[i], handle, 0); |
557 | amdgpu_bo_kunmap(bo); | 592 | amdgpu_bo_kunmap(bo); |
558 | return 0; | 593 | return 0; |
559 | } else { | ||
560 | /* it's a create msg */ | ||
561 | amdgpu_bo_kunmap(bo); | ||
562 | |||
563 | if (msg_type != 0) { | ||
564 | DRM_ERROR("Illegal UVD message type (%d)!\n", msg_type); | ||
565 | return -EINVAL; | ||
566 | } | ||
567 | |||
568 | /* it's a create msg, no special handling needed */ | ||
569 | } | ||
570 | |||
571 | /* create or decode, validate the handle */ | ||
572 | for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { | ||
573 | if (atomic_read(&adev->uvd.handles[i]) == handle) | ||
574 | return 0; | ||
575 | } | ||
576 | 594 | ||
577 | /* handle not found try to alloc a new one */ | 595 | default: |
578 | for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { | 596 | DRM_ERROR("Illegal UVD message type (%d)!\n", msg_type); |
579 | if (!atomic_cmpxchg(&adev->uvd.handles[i], 0, handle)) { | 597 | return -EINVAL; |
580 | adev->uvd.filp[i] = ctx->parser->filp; | ||
581 | return 0; | ||
582 | } | ||
583 | } | 598 | } |
584 | 599 | BUG(); | |
585 | DRM_ERROR("No more free UVD handles!\n"); | ||
586 | return -EINVAL; | 600 | return -EINVAL; |
587 | } | 601 | } |
588 | 602 | ||
@@ -805,10 +819,10 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx) | |||
805 | } | 819 | } |
806 | 820 | ||
807 | static int amdgpu_uvd_free_job( | 821 | static int amdgpu_uvd_free_job( |
808 | struct amdgpu_job *sched_job) | 822 | struct amdgpu_job *job) |
809 | { | 823 | { |
810 | amdgpu_ib_free(sched_job->adev, sched_job->ibs); | 824 | amdgpu_ib_free(job->adev, job->ibs); |
811 | kfree(sched_job->ibs); | 825 | kfree(job->ibs); |
812 | return 0; | 826 | return 0; |
813 | } | 827 | } |
814 | 828 | ||
@@ -905,7 +919,7 @@ int amdgpu_uvd_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, | |||
905 | r = amdgpu_bo_create(adev, 1024, PAGE_SIZE, true, | 919 | r = amdgpu_bo_create(adev, 1024, PAGE_SIZE, true, |
906 | AMDGPU_GEM_DOMAIN_VRAM, | 920 | AMDGPU_GEM_DOMAIN_VRAM, |
907 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 921 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
908 | NULL, &bo); | 922 | NULL, NULL, &bo); |
909 | if (r) | 923 | if (r) |
910 | return r; | 924 | return r; |
911 | 925 | ||
@@ -954,7 +968,7 @@ int amdgpu_uvd_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, | |||
954 | r = amdgpu_bo_create(adev, 1024, PAGE_SIZE, true, | 968 | r = amdgpu_bo_create(adev, 1024, PAGE_SIZE, true, |
955 | AMDGPU_GEM_DOMAIN_VRAM, | 969 | AMDGPU_GEM_DOMAIN_VRAM, |
956 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 970 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
957 | NULL, &bo); | 971 | NULL, NULL, &bo); |
958 | if (r) | 972 | if (r) |
959 | return r; | 973 | return r; |
960 | 974 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index 3cab96c42aa8..74f2038ac747 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | |||
@@ -143,7 +143,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size) | |||
143 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, | 143 | r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, |
144 | AMDGPU_GEM_DOMAIN_VRAM, | 144 | AMDGPU_GEM_DOMAIN_VRAM, |
145 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 145 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
146 | NULL, &adev->vce.vcpu_bo); | 146 | NULL, NULL, &adev->vce.vcpu_bo); |
147 | if (r) { | 147 | if (r) { |
148 | dev_err(adev->dev, "(%d) failed to allocate VCE bo\n", r); | 148 | dev_err(adev->dev, "(%d) failed to allocate VCE bo\n", r); |
149 | return r; | 149 | return r; |
@@ -342,10 +342,10 @@ void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp) | |||
342 | } | 342 | } |
343 | 343 | ||
344 | static int amdgpu_vce_free_job( | 344 | static int amdgpu_vce_free_job( |
345 | struct amdgpu_job *sched_job) | 345 | struct amdgpu_job *job) |
346 | { | 346 | { |
347 | amdgpu_ib_free(sched_job->adev, sched_job->ibs); | 347 | amdgpu_ib_free(job->adev, job->ibs); |
348 | kfree(sched_job->ibs); | 348 | kfree(job->ibs); |
349 | return 0; | 349 | return 0; |
350 | } | 350 | } |
351 | 351 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index f68b7cdc370a..1e14531353e0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -316,12 +316,12 @@ static void amdgpu_vm_update_pages(struct amdgpu_device *adev, | |||
316 | } | 316 | } |
317 | } | 317 | } |
318 | 318 | ||
319 | int amdgpu_vm_free_job(struct amdgpu_job *sched_job) | 319 | int amdgpu_vm_free_job(struct amdgpu_job *job) |
320 | { | 320 | { |
321 | int i; | 321 | int i; |
322 | for (i = 0; i < sched_job->num_ibs; i++) | 322 | for (i = 0; i < job->num_ibs; i++) |
323 | amdgpu_ib_free(sched_job->adev, &sched_job->ibs[i]); | 323 | amdgpu_ib_free(job->adev, &job->ibs[i]); |
324 | kfree(sched_job->ibs); | 324 | kfree(job->ibs); |
325 | return 0; | 325 | return 0; |
326 | } | 326 | } |
327 | 327 | ||
@@ -686,31 +686,6 @@ static int amdgpu_vm_update_ptes(struct amdgpu_device *adev, | |||
686 | } | 686 | } |
687 | 687 | ||
688 | /** | 688 | /** |
689 | * amdgpu_vm_fence_pts - fence page tables after an update | ||
690 | * | ||
691 | * @vm: requested vm | ||
692 | * @start: start of GPU address range | ||
693 | * @end: end of GPU address range | ||
694 | * @fence: fence to use | ||
695 | * | ||
696 | * Fence the page tables in the range @start - @end (cayman+). | ||
697 | * | ||
698 | * Global and local mutex must be locked! | ||
699 | */ | ||
700 | static void amdgpu_vm_fence_pts(struct amdgpu_vm *vm, | ||
701 | uint64_t start, uint64_t end, | ||
702 | struct fence *fence) | ||
703 | { | ||
704 | unsigned i; | ||
705 | |||
706 | start >>= amdgpu_vm_block_size; | ||
707 | end >>= amdgpu_vm_block_size; | ||
708 | |||
709 | for (i = start; i <= end; ++i) | ||
710 | amdgpu_bo_fence(vm->page_tables[i].bo, fence, true); | ||
711 | } | ||
712 | |||
713 | /** | ||
714 | * amdgpu_vm_bo_update_mapping - update a mapping in the vm page table | 689 | * amdgpu_vm_bo_update_mapping - update a mapping in the vm page table |
715 | * | 690 | * |
716 | * @adev: amdgpu_device pointer | 691 | * @adev: amdgpu_device pointer |
@@ -813,8 +788,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev, | |||
813 | if (r) | 788 | if (r) |
814 | goto error_free; | 789 | goto error_free; |
815 | 790 | ||
816 | amdgpu_vm_fence_pts(vm, mapping->it.start, | 791 | amdgpu_bo_fence(vm->page_directory, f, true); |
817 | mapping->it.last + 1, f); | ||
818 | if (fence) { | 792 | if (fence) { |
819 | fence_put(*fence); | 793 | fence_put(*fence); |
820 | *fence = fence_get(f); | 794 | *fence = fence_get(f); |
@@ -855,7 +829,7 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, | |||
855 | int r; | 829 | int r; |
856 | 830 | ||
857 | if (mem) { | 831 | if (mem) { |
858 | addr = mem->start << PAGE_SHIFT; | 832 | addr = (u64)mem->start << PAGE_SHIFT; |
859 | if (mem->mem_type != TTM_PL_TT) | 833 | if (mem->mem_type != TTM_PL_TT) |
860 | addr += adev->vm_manager.vram_base_offset; | 834 | addr += adev->vm_manager.vram_base_offset; |
861 | } else { | 835 | } else { |
@@ -1089,6 +1063,7 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1089 | 1063 | ||
1090 | /* walk over the address space and allocate the page tables */ | 1064 | /* walk over the address space and allocate the page tables */ |
1091 | for (pt_idx = saddr; pt_idx <= eaddr; ++pt_idx) { | 1065 | for (pt_idx = saddr; pt_idx <= eaddr; ++pt_idx) { |
1066 | struct reservation_object *resv = vm->page_directory->tbo.resv; | ||
1092 | struct amdgpu_bo *pt; | 1067 | struct amdgpu_bo *pt; |
1093 | 1068 | ||
1094 | if (vm->page_tables[pt_idx].bo) | 1069 | if (vm->page_tables[pt_idx].bo) |
@@ -1097,11 +1072,13 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1097 | /* drop mutex to allocate and clear page table */ | 1072 | /* drop mutex to allocate and clear page table */ |
1098 | mutex_unlock(&vm->mutex); | 1073 | mutex_unlock(&vm->mutex); |
1099 | 1074 | ||
1075 | ww_mutex_lock(&resv->lock, NULL); | ||
1100 | r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, | 1076 | r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, |
1101 | AMDGPU_GPU_PAGE_SIZE, true, | 1077 | AMDGPU_GPU_PAGE_SIZE, true, |
1102 | AMDGPU_GEM_DOMAIN_VRAM, | 1078 | AMDGPU_GEM_DOMAIN_VRAM, |
1103 | AMDGPU_GEM_CREATE_NO_CPU_ACCESS, | 1079 | AMDGPU_GEM_CREATE_NO_CPU_ACCESS, |
1104 | NULL, &pt); | 1080 | NULL, resv, &pt); |
1081 | ww_mutex_unlock(&resv->lock); | ||
1105 | if (r) | 1082 | if (r) |
1106 | goto error_free; | 1083 | goto error_free; |
1107 | 1084 | ||
@@ -1303,7 +1280,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) | |||
1303 | r = amdgpu_bo_create(adev, pd_size, align, true, | 1280 | r = amdgpu_bo_create(adev, pd_size, align, true, |
1304 | AMDGPU_GEM_DOMAIN_VRAM, | 1281 | AMDGPU_GEM_DOMAIN_VRAM, |
1305 | AMDGPU_GEM_CREATE_NO_CPU_ACCESS, | 1282 | AMDGPU_GEM_CREATE_NO_CPU_ACCESS, |
1306 | NULL, &vm->page_directory); | 1283 | NULL, NULL, &vm->page_directory); |
1307 | if (r) | 1284 | if (r) |
1308 | return r; | 1285 | return r; |
1309 | 1286 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_smc.c b/drivers/gpu/drm/amd/amdgpu/cz_smc.c index a72ffc7d6c26..e33180d3314a 100644 --- a/drivers/gpu/drm/amd/amdgpu/cz_smc.c +++ b/drivers/gpu/drm/amd/amdgpu/cz_smc.c | |||
@@ -814,7 +814,8 @@ int cz_smu_init(struct amdgpu_device *adev) | |||
814 | * 3. map kernel virtual address | 814 | * 3. map kernel virtual address |
815 | */ | 815 | */ |
816 | ret = amdgpu_bo_create(adev, priv->toc_buffer.data_size, PAGE_SIZE, | 816 | ret = amdgpu_bo_create(adev, priv->toc_buffer.data_size, PAGE_SIZE, |
817 | true, AMDGPU_GEM_DOMAIN_GTT, 0, NULL, toc_buf); | 817 | true, AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, |
818 | toc_buf); | ||
818 | 819 | ||
819 | if (ret) { | 820 | if (ret) { |
820 | dev_err(adev->dev, "(%d) SMC TOC buffer allocation failed\n", ret); | 821 | dev_err(adev->dev, "(%d) SMC TOC buffer allocation failed\n", ret); |
@@ -822,7 +823,8 @@ int cz_smu_init(struct amdgpu_device *adev) | |||
822 | } | 823 | } |
823 | 824 | ||
824 | ret = amdgpu_bo_create(adev, priv->smu_buffer.data_size, PAGE_SIZE, | 825 | ret = amdgpu_bo_create(adev, priv->smu_buffer.data_size, PAGE_SIZE, |
825 | true, AMDGPU_GEM_DOMAIN_GTT, 0, NULL, smu_buf); | 826 | true, AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, |
827 | smu_buf); | ||
826 | 828 | ||
827 | if (ret) { | 829 | if (ret) { |
828 | dev_err(adev->dev, "(%d) SMC Internal buffer allocation failed\n", ret); | 830 | dev_err(adev->dev, "(%d) SMC Internal buffer allocation failed\n", ret); |
diff --git a/drivers/gpu/drm/amd/amdgpu/fiji_smc.c b/drivers/gpu/drm/amd/amdgpu/fiji_smc.c index 322edea65857..bda1249eb871 100644 --- a/drivers/gpu/drm/amd/amdgpu/fiji_smc.c +++ b/drivers/gpu/drm/amd/amdgpu/fiji_smc.c | |||
@@ -764,7 +764,7 @@ int fiji_smu_init(struct amdgpu_device *adev) | |||
764 | ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE, | 764 | ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE, |
765 | true, AMDGPU_GEM_DOMAIN_VRAM, | 765 | true, AMDGPU_GEM_DOMAIN_VRAM, |
766 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 766 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
767 | NULL, toc_buf); | 767 | NULL, NULL, toc_buf); |
768 | if (ret) { | 768 | if (ret) { |
769 | DRM_ERROR("Failed to allocate memory for TOC buffer\n"); | 769 | DRM_ERROR("Failed to allocate memory for TOC buffer\n"); |
770 | return -ENOMEM; | 770 | return -ENOMEM; |
@@ -774,7 +774,7 @@ int fiji_smu_init(struct amdgpu_device *adev) | |||
774 | ret = amdgpu_bo_create(adev, smu_internal_buffer_size, PAGE_SIZE, | 774 | ret = amdgpu_bo_create(adev, smu_internal_buffer_size, PAGE_SIZE, |
775 | true, AMDGPU_GEM_DOMAIN_VRAM, | 775 | true, AMDGPU_GEM_DOMAIN_VRAM, |
776 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 776 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
777 | NULL, smu_buf); | 777 | NULL, NULL, smu_buf); |
778 | if (ret) { | 778 | if (ret) { |
779 | DRM_ERROR("Failed to allocate memory for SMU internal buffer\n"); | 779 | DRM_ERROR("Failed to allocate memory for SMU internal buffer\n"); |
780 | return -ENOMEM; | 780 | return -ENOMEM; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 4bd1e5cf65ca..e992bf2ff66c 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -3206,7 +3206,7 @@ static int gfx_v7_0_mec_init(struct amdgpu_device *adev) | |||
3206 | r = amdgpu_bo_create(adev, | 3206 | r = amdgpu_bo_create(adev, |
3207 | adev->gfx.mec.num_mec *adev->gfx.mec.num_pipe * MEC_HPD_SIZE * 2, | 3207 | adev->gfx.mec.num_mec *adev->gfx.mec.num_pipe * MEC_HPD_SIZE * 2, |
3208 | PAGE_SIZE, true, | 3208 | PAGE_SIZE, true, |
3209 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, | 3209 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, |
3210 | &adev->gfx.mec.hpd_eop_obj); | 3210 | &adev->gfx.mec.hpd_eop_obj); |
3211 | if (r) { | 3211 | if (r) { |
3212 | dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); | 3212 | dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); |
@@ -3373,7 +3373,7 @@ static int gfx_v7_0_cp_compute_resume(struct amdgpu_device *adev) | |||
3373 | r = amdgpu_bo_create(adev, | 3373 | r = amdgpu_bo_create(adev, |
3374 | sizeof(struct bonaire_mqd), | 3374 | sizeof(struct bonaire_mqd), |
3375 | PAGE_SIZE, true, | 3375 | PAGE_SIZE, true, |
3376 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, | 3376 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, |
3377 | &ring->mqd_obj); | 3377 | &ring->mqd_obj); |
3378 | if (r) { | 3378 | if (r) { |
3379 | dev_warn(adev->dev, "(%d) create MQD bo failed\n", r); | 3379 | dev_warn(adev->dev, "(%d) create MQD bo failed\n", r); |
@@ -3610,41 +3610,6 @@ static int gfx_v7_0_cp_resume(struct amdgpu_device *adev) | |||
3610 | return 0; | 3610 | return 0; |
3611 | } | 3611 | } |
3612 | 3612 | ||
3613 | static void gfx_v7_0_ce_sync_me(struct amdgpu_ring *ring) | ||
3614 | { | ||
3615 | struct amdgpu_device *adev = ring->adev; | ||
3616 | u64 gpu_addr = adev->wb.gpu_addr + adev->gfx.ce_sync_offs * 4; | ||
3617 | |||
3618 | /* instruct DE to set a magic number */ | ||
3619 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
3620 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | | ||
3621 | WRITE_DATA_DST_SEL(5))); | ||
3622 | amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); | ||
3623 | amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); | ||
3624 | amdgpu_ring_write(ring, 1); | ||
3625 | |||
3626 | /* let CE wait till condition satisfied */ | ||
3627 | amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); | ||
3628 | amdgpu_ring_write(ring, (WAIT_REG_MEM_OPERATION(0) | /* wait */ | ||
3629 | WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ | ||
3630 | WAIT_REG_MEM_FUNCTION(3) | /* == */ | ||
3631 | WAIT_REG_MEM_ENGINE(2))); /* ce */ | ||
3632 | amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); | ||
3633 | amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); | ||
3634 | amdgpu_ring_write(ring, 1); | ||
3635 | amdgpu_ring_write(ring, 0xffffffff); | ||
3636 | amdgpu_ring_write(ring, 4); /* poll interval */ | ||
3637 | |||
3638 | /* instruct CE to reset wb of ce_sync to zero */ | ||
3639 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
3640 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(2) | | ||
3641 | WRITE_DATA_DST_SEL(5) | | ||
3642 | WR_CONFIRM)); | ||
3643 | amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); | ||
3644 | amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); | ||
3645 | amdgpu_ring_write(ring, 0); | ||
3646 | } | ||
3647 | |||
3648 | /* | 3613 | /* |
3649 | * vm | 3614 | * vm |
3650 | * VMID 0 is the physical GPU addresses as used by the kernel. | 3615 | * VMID 0 is the physical GPU addresses as used by the kernel. |
@@ -3663,6 +3628,13 @@ static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
3663 | unsigned vm_id, uint64_t pd_addr) | 3628 | unsigned vm_id, uint64_t pd_addr) |
3664 | { | 3629 | { |
3665 | int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); | 3630 | int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); |
3631 | if (usepfp) { | ||
3632 | /* synce CE with ME to prevent CE fetch CEIB before context switch done */ | ||
3633 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | ||
3634 | amdgpu_ring_write(ring, 0); | ||
3635 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | ||
3636 | amdgpu_ring_write(ring, 0); | ||
3637 | } | ||
3666 | 3638 | ||
3667 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | 3639 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); |
3668 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | | 3640 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | |
@@ -3703,7 +3675,10 @@ static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
3703 | amdgpu_ring_write(ring, 0x0); | 3675 | amdgpu_ring_write(ring, 0x0); |
3704 | 3676 | ||
3705 | /* synce CE with ME to prevent CE fetch CEIB before context switch done */ | 3677 | /* synce CE with ME to prevent CE fetch CEIB before context switch done */ |
3706 | gfx_v7_0_ce_sync_me(ring); | 3678 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
3679 | amdgpu_ring_write(ring, 0); | ||
3680 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | ||
3681 | amdgpu_ring_write(ring, 0); | ||
3707 | } | 3682 | } |
3708 | } | 3683 | } |
3709 | 3684 | ||
@@ -3788,7 +3763,8 @@ static int gfx_v7_0_rlc_init(struct amdgpu_device *adev) | |||
3788 | r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true, | 3763 | r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true, |
3789 | AMDGPU_GEM_DOMAIN_VRAM, | 3764 | AMDGPU_GEM_DOMAIN_VRAM, |
3790 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 3765 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
3791 | NULL, &adev->gfx.rlc.save_restore_obj); | 3766 | NULL, NULL, |
3767 | &adev->gfx.rlc.save_restore_obj); | ||
3792 | if (r) { | 3768 | if (r) { |
3793 | dev_warn(adev->dev, "(%d) create RLC sr bo failed\n", r); | 3769 | dev_warn(adev->dev, "(%d) create RLC sr bo failed\n", r); |
3794 | return r; | 3770 | return r; |
@@ -3831,7 +3807,8 @@ static int gfx_v7_0_rlc_init(struct amdgpu_device *adev) | |||
3831 | r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true, | 3807 | r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true, |
3832 | AMDGPU_GEM_DOMAIN_VRAM, | 3808 | AMDGPU_GEM_DOMAIN_VRAM, |
3833 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 3809 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
3834 | NULL, &adev->gfx.rlc.clear_state_obj); | 3810 | NULL, NULL, |
3811 | &adev->gfx.rlc.clear_state_obj); | ||
3835 | if (r) { | 3812 | if (r) { |
3836 | dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r); | 3813 | dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r); |
3837 | gfx_v7_0_rlc_fini(adev); | 3814 | gfx_v7_0_rlc_fini(adev); |
@@ -3870,7 +3847,8 @@ static int gfx_v7_0_rlc_init(struct amdgpu_device *adev) | |||
3870 | r = amdgpu_bo_create(adev, adev->gfx.rlc.cp_table_size, PAGE_SIZE, true, | 3847 | r = amdgpu_bo_create(adev, adev->gfx.rlc.cp_table_size, PAGE_SIZE, true, |
3871 | AMDGPU_GEM_DOMAIN_VRAM, | 3848 | AMDGPU_GEM_DOMAIN_VRAM, |
3872 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 3849 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
3873 | NULL, &adev->gfx.rlc.cp_table_obj); | 3850 | NULL, NULL, |
3851 | &adev->gfx.rlc.cp_table_obj); | ||
3874 | if (r) { | 3852 | if (r) { |
3875 | dev_warn(adev->dev, "(%d) create RLC cp table bo failed\n", r); | 3853 | dev_warn(adev->dev, "(%d) create RLC cp table bo failed\n", r); |
3876 | gfx_v7_0_rlc_fini(adev); | 3854 | gfx_v7_0_rlc_fini(adev); |
@@ -4802,12 +4780,6 @@ static int gfx_v7_0_sw_init(void *handle) | |||
4802 | return r; | 4780 | return r; |
4803 | } | 4781 | } |
4804 | 4782 | ||
4805 | r = amdgpu_wb_get(adev, &adev->gfx.ce_sync_offs); | ||
4806 | if (r) { | ||
4807 | DRM_ERROR("(%d) gfx.ce_sync_offs wb alloc failed\n", r); | ||
4808 | return r; | ||
4809 | } | ||
4810 | |||
4811 | for (i = 0; i < adev->gfx.num_gfx_rings; i++) { | 4783 | for (i = 0; i < adev->gfx.num_gfx_rings; i++) { |
4812 | ring = &adev->gfx.gfx_ring[i]; | 4784 | ring = &adev->gfx.gfx_ring[i]; |
4813 | ring->ring_obj = NULL; | 4785 | ring->ring_obj = NULL; |
@@ -4851,21 +4823,21 @@ static int gfx_v7_0_sw_init(void *handle) | |||
4851 | r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, | 4823 | r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, |
4852 | PAGE_SIZE, true, | 4824 | PAGE_SIZE, true, |
4853 | AMDGPU_GEM_DOMAIN_GDS, 0, | 4825 | AMDGPU_GEM_DOMAIN_GDS, 0, |
4854 | NULL, &adev->gds.gds_gfx_bo); | 4826 | NULL, NULL, &adev->gds.gds_gfx_bo); |
4855 | if (r) | 4827 | if (r) |
4856 | return r; | 4828 | return r; |
4857 | 4829 | ||
4858 | r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, | 4830 | r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, |
4859 | PAGE_SIZE, true, | 4831 | PAGE_SIZE, true, |
4860 | AMDGPU_GEM_DOMAIN_GWS, 0, | 4832 | AMDGPU_GEM_DOMAIN_GWS, 0, |
4861 | NULL, &adev->gds.gws_gfx_bo); | 4833 | NULL, NULL, &adev->gds.gws_gfx_bo); |
4862 | if (r) | 4834 | if (r) |
4863 | return r; | 4835 | return r; |
4864 | 4836 | ||
4865 | r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, | 4837 | r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, |
4866 | PAGE_SIZE, true, | 4838 | PAGE_SIZE, true, |
4867 | AMDGPU_GEM_DOMAIN_OA, 0, | 4839 | AMDGPU_GEM_DOMAIN_OA, 0, |
4868 | NULL, &adev->gds.oa_gfx_bo); | 4840 | NULL, NULL, &adev->gds.oa_gfx_bo); |
4869 | if (r) | 4841 | if (r) |
4870 | return r; | 4842 | return r; |
4871 | 4843 | ||
@@ -4886,8 +4858,6 @@ static int gfx_v7_0_sw_fini(void *handle) | |||
4886 | for (i = 0; i < adev->gfx.num_compute_rings; i++) | 4858 | for (i = 0; i < adev->gfx.num_compute_rings; i++) |
4887 | amdgpu_ring_fini(&adev->gfx.compute_ring[i]); | 4859 | amdgpu_ring_fini(&adev->gfx.compute_ring[i]); |
4888 | 4860 | ||
4889 | amdgpu_wb_free(adev, adev->gfx.ce_sync_offs); | ||
4890 | |||
4891 | gfx_v7_0_cp_compute_fini(adev); | 4861 | gfx_v7_0_cp_compute_fini(adev); |
4892 | gfx_v7_0_rlc_fini(adev); | 4862 | gfx_v7_0_rlc_fini(adev); |
4893 | gfx_v7_0_mec_fini(adev); | 4863 | gfx_v7_0_mec_fini(adev); |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 53f07439a512..cb4f68f53f24 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -868,7 +868,7 @@ static int gfx_v8_0_mec_init(struct amdgpu_device *adev) | |||
868 | r = amdgpu_bo_create(adev, | 868 | r = amdgpu_bo_create(adev, |
869 | adev->gfx.mec.num_mec *adev->gfx.mec.num_pipe * MEC_HPD_SIZE * 2, | 869 | adev->gfx.mec.num_mec *adev->gfx.mec.num_pipe * MEC_HPD_SIZE * 2, |
870 | PAGE_SIZE, true, | 870 | PAGE_SIZE, true, |
871 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, | 871 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, |
872 | &adev->gfx.mec.hpd_eop_obj); | 872 | &adev->gfx.mec.hpd_eop_obj); |
873 | if (r) { | 873 | if (r) { |
874 | dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); | 874 | dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); |
@@ -940,12 +940,6 @@ static int gfx_v8_0_sw_init(void *handle) | |||
940 | return r; | 940 | return r; |
941 | } | 941 | } |
942 | 942 | ||
943 | r = amdgpu_wb_get(adev, &adev->gfx.ce_sync_offs); | ||
944 | if (r) { | ||
945 | DRM_ERROR("(%d) gfx.ce_sync_offs wb alloc failed\n", r); | ||
946 | return r; | ||
947 | } | ||
948 | |||
949 | /* set up the gfx ring */ | 943 | /* set up the gfx ring */ |
950 | for (i = 0; i < adev->gfx.num_gfx_rings; i++) { | 944 | for (i = 0; i < adev->gfx.num_gfx_rings; i++) { |
951 | ring = &adev->gfx.gfx_ring[i]; | 945 | ring = &adev->gfx.gfx_ring[i]; |
@@ -995,21 +989,21 @@ static int gfx_v8_0_sw_init(void *handle) | |||
995 | /* reserve GDS, GWS and OA resource for gfx */ | 989 | /* reserve GDS, GWS and OA resource for gfx */ |
996 | r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, | 990 | r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, |
997 | PAGE_SIZE, true, | 991 | PAGE_SIZE, true, |
998 | AMDGPU_GEM_DOMAIN_GDS, 0, | 992 | AMDGPU_GEM_DOMAIN_GDS, 0, NULL, |
999 | NULL, &adev->gds.gds_gfx_bo); | 993 | NULL, &adev->gds.gds_gfx_bo); |
1000 | if (r) | 994 | if (r) |
1001 | return r; | 995 | return r; |
1002 | 996 | ||
1003 | r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, | 997 | r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, |
1004 | PAGE_SIZE, true, | 998 | PAGE_SIZE, true, |
1005 | AMDGPU_GEM_DOMAIN_GWS, 0, | 999 | AMDGPU_GEM_DOMAIN_GWS, 0, NULL, |
1006 | NULL, &adev->gds.gws_gfx_bo); | 1000 | NULL, &adev->gds.gws_gfx_bo); |
1007 | if (r) | 1001 | if (r) |
1008 | return r; | 1002 | return r; |
1009 | 1003 | ||
1010 | r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, | 1004 | r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, |
1011 | PAGE_SIZE, true, | 1005 | PAGE_SIZE, true, |
1012 | AMDGPU_GEM_DOMAIN_OA, 0, | 1006 | AMDGPU_GEM_DOMAIN_OA, 0, NULL, |
1013 | NULL, &adev->gds.oa_gfx_bo); | 1007 | NULL, &adev->gds.oa_gfx_bo); |
1014 | if (r) | 1008 | if (r) |
1015 | return r; | 1009 | return r; |
@@ -1033,8 +1027,6 @@ static int gfx_v8_0_sw_fini(void *handle) | |||
1033 | for (i = 0; i < adev->gfx.num_compute_rings; i++) | 1027 | for (i = 0; i < adev->gfx.num_compute_rings; i++) |
1034 | amdgpu_ring_fini(&adev->gfx.compute_ring[i]); | 1028 | amdgpu_ring_fini(&adev->gfx.compute_ring[i]); |
1035 | 1029 | ||
1036 | amdgpu_wb_free(adev, adev->gfx.ce_sync_offs); | ||
1037 | |||
1038 | gfx_v8_0_mec_fini(adev); | 1030 | gfx_v8_0_mec_fini(adev); |
1039 | 1031 | ||
1040 | return 0; | 1032 | return 0; |
@@ -3106,7 +3098,7 @@ static int gfx_v8_0_cp_compute_resume(struct amdgpu_device *adev) | |||
3106 | sizeof(struct vi_mqd), | 3098 | sizeof(struct vi_mqd), |
3107 | PAGE_SIZE, true, | 3099 | PAGE_SIZE, true, |
3108 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, | 3100 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, |
3109 | &ring->mqd_obj); | 3101 | NULL, &ring->mqd_obj); |
3110 | if (r) { | 3102 | if (r) { |
3111 | dev_warn(adev->dev, "(%d) create MQD bo failed\n", r); | 3103 | dev_warn(adev->dev, "(%d) create MQD bo failed\n", r); |
3112 | return r; | 3104 | return r; |
@@ -3965,6 +3957,7 @@ static void gfx_v8_0_ring_emit_fence_gfx(struct amdgpu_ring *ring, u64 addr, | |||
3965 | DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); | 3957 | DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); |
3966 | amdgpu_ring_write(ring, lower_32_bits(seq)); | 3958 | amdgpu_ring_write(ring, lower_32_bits(seq)); |
3967 | amdgpu_ring_write(ring, upper_32_bits(seq)); | 3959 | amdgpu_ring_write(ring, upper_32_bits(seq)); |
3960 | |||
3968 | } | 3961 | } |
3969 | 3962 | ||
3970 | /** | 3963 | /** |
@@ -4005,49 +3998,34 @@ static bool gfx_v8_0_ring_emit_semaphore(struct amdgpu_ring *ring, | |||
4005 | return true; | 3998 | return true; |
4006 | } | 3999 | } |
4007 | 4000 | ||
4008 | static void gfx_v8_0_ce_sync_me(struct amdgpu_ring *ring) | 4001 | static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, |
4002 | unsigned vm_id, uint64_t pd_addr) | ||
4009 | { | 4003 | { |
4010 | struct amdgpu_device *adev = ring->adev; | 4004 | int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); |
4011 | u64 gpu_addr = adev->wb.gpu_addr + adev->gfx.ce_sync_offs * 4; | 4005 | uint32_t seq = ring->fence_drv.sync_seq[ring->idx]; |
4012 | 4006 | uint64_t addr = ring->fence_drv.gpu_addr; | |
4013 | /* instruct DE to set a magic number */ | ||
4014 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | ||
4015 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | | ||
4016 | WRITE_DATA_DST_SEL(5))); | ||
4017 | amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); | ||
4018 | amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); | ||
4019 | amdgpu_ring_write(ring, 1); | ||
4020 | 4007 | ||
4021 | /* let CE wait till condition satisfied */ | ||
4022 | amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); | 4008 | amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); |
4023 | amdgpu_ring_write(ring, (WAIT_REG_MEM_OPERATION(0) | /* wait */ | 4009 | amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ |
4024 | WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ | 4010 | WAIT_REG_MEM_FUNCTION(3))); /* equal */ |
4025 | WAIT_REG_MEM_FUNCTION(3) | /* == */ | 4011 | amdgpu_ring_write(ring, addr & 0xfffffffc); |
4026 | WAIT_REG_MEM_ENGINE(2))); /* ce */ | 4012 | amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff); |
4027 | amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); | 4013 | amdgpu_ring_write(ring, seq); |
4028 | amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); | ||
4029 | amdgpu_ring_write(ring, 1); | ||
4030 | amdgpu_ring_write(ring, 0xffffffff); | 4014 | amdgpu_ring_write(ring, 0xffffffff); |
4031 | amdgpu_ring_write(ring, 4); /* poll interval */ | 4015 | amdgpu_ring_write(ring, 4); /* poll interval */ |
4032 | 4016 | ||
4033 | /* instruct CE to reset wb of ce_sync to zero */ | 4017 | if (usepfp) { |
4034 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | 4018 | /* synce CE with ME to prevent CE fetch CEIB before context switch done */ |
4035 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(2) | | 4019 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
4036 | WRITE_DATA_DST_SEL(5) | | 4020 | amdgpu_ring_write(ring, 0); |
4037 | WR_CONFIRM)); | 4021 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
4038 | amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); | 4022 | amdgpu_ring_write(ring, 0); |
4039 | amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); | 4023 | } |
4040 | amdgpu_ring_write(ring, 0); | ||
4041 | } | ||
4042 | |||
4043 | static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | ||
4044 | unsigned vm_id, uint64_t pd_addr) | ||
4045 | { | ||
4046 | int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); | ||
4047 | 4024 | ||
4048 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); | 4025 | amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); |
4049 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | | 4026 | amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | |
4050 | WRITE_DATA_DST_SEL(0))); | 4027 | WRITE_DATA_DST_SEL(0)) | |
4028 | WR_CONFIRM); | ||
4051 | if (vm_id < 8) { | 4029 | if (vm_id < 8) { |
4052 | amdgpu_ring_write(ring, | 4030 | amdgpu_ring_write(ring, |
4053 | (mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + vm_id)); | 4031 | (mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + vm_id)); |
@@ -4083,9 +4061,10 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
4083 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ | 4061 | /* sync PFP to ME, otherwise we might get invalid PFP reads */ |
4084 | amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); | 4062 | amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); |
4085 | amdgpu_ring_write(ring, 0x0); | 4063 | amdgpu_ring_write(ring, 0x0); |
4086 | 4064 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); | |
4087 | /* synce CE with ME to prevent CE fetch CEIB before context switch done */ | 4065 | amdgpu_ring_write(ring, 0); |
4088 | gfx_v8_0_ce_sync_me(ring); | 4066 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
4067 | amdgpu_ring_write(ring, 0); | ||
4089 | } | 4068 | } |
4090 | } | 4069 | } |
4091 | 4070 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/iceland_smc.c b/drivers/gpu/drm/amd/amdgpu/iceland_smc.c index c900aa942ade..966d4b2ed9da 100644 --- a/drivers/gpu/drm/amd/amdgpu/iceland_smc.c +++ b/drivers/gpu/drm/amd/amdgpu/iceland_smc.c | |||
@@ -625,7 +625,7 @@ int iceland_smu_init(struct amdgpu_device *adev) | |||
625 | ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE, | 625 | ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE, |
626 | true, AMDGPU_GEM_DOMAIN_VRAM, | 626 | true, AMDGPU_GEM_DOMAIN_VRAM, |
627 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 627 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
628 | NULL, toc_buf); | 628 | NULL, NULL, toc_buf); |
629 | if (ret) { | 629 | if (ret) { |
630 | DRM_ERROR("Failed to allocate memory for TOC buffer\n"); | 630 | DRM_ERROR("Failed to allocate memory for TOC buffer\n"); |
631 | return -ENOMEM; | 631 | return -ENOMEM; |
diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_smc.c b/drivers/gpu/drm/amd/amdgpu/tonga_smc.c index 1f5ac941a610..5421309c1862 100644 --- a/drivers/gpu/drm/amd/amdgpu/tonga_smc.c +++ b/drivers/gpu/drm/amd/amdgpu/tonga_smc.c | |||
@@ -763,7 +763,7 @@ int tonga_smu_init(struct amdgpu_device *adev) | |||
763 | ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE, | 763 | ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE, |
764 | true, AMDGPU_GEM_DOMAIN_VRAM, | 764 | true, AMDGPU_GEM_DOMAIN_VRAM, |
765 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 765 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
766 | NULL, toc_buf); | 766 | NULL, NULL, toc_buf); |
767 | if (ret) { | 767 | if (ret) { |
768 | DRM_ERROR("Failed to allocate memory for TOC buffer\n"); | 768 | DRM_ERROR("Failed to allocate memory for TOC buffer\n"); |
769 | return -ENOMEM; | 769 | return -ENOMEM; |
@@ -773,7 +773,7 @@ int tonga_smu_init(struct amdgpu_device *adev) | |||
773 | ret = amdgpu_bo_create(adev, smu_internal_buffer_size, PAGE_SIZE, | 773 | ret = amdgpu_bo_create(adev, smu_internal_buffer_size, PAGE_SIZE, |
774 | true, AMDGPU_GEM_DOMAIN_VRAM, | 774 | true, AMDGPU_GEM_DOMAIN_VRAM, |
775 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, | 775 | AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, |
776 | NULL, smu_buf); | 776 | NULL, NULL, smu_buf); |
777 | if (ret) { | 777 | if (ret) { |
778 | DRM_ERROR("Failed to allocate memory for SMU internal buffer\n"); | 778 | DRM_ERROR("Failed to allocate memory for SMU internal buffer\n"); |
779 | return -ENOMEM; | 779 | return -ENOMEM; |
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c index 5fac5da694f0..ed50dd725788 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | |||
@@ -224,11 +224,11 @@ static int uvd_v4_2_suspend(void *handle) | |||
224 | int r; | 224 | int r; |
225 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 225 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
226 | 226 | ||
227 | r = uvd_v4_2_hw_fini(adev); | 227 | r = amdgpu_uvd_suspend(adev); |
228 | if (r) | 228 | if (r) |
229 | return r; | 229 | return r; |
230 | 230 | ||
231 | r = amdgpu_uvd_suspend(adev); | 231 | r = uvd_v4_2_hw_fini(adev); |
232 | if (r) | 232 | if (r) |
233 | return r; | 233 | return r; |
234 | 234 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c index 2d5c59c318af..9ad8b9906c0b 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | |||
@@ -220,11 +220,11 @@ static int uvd_v5_0_suspend(void *handle) | |||
220 | int r; | 220 | int r; |
221 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 221 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
222 | 222 | ||
223 | r = uvd_v5_0_hw_fini(adev); | 223 | r = amdgpu_uvd_suspend(adev); |
224 | if (r) | 224 | if (r) |
225 | return r; | 225 | return r; |
226 | 226 | ||
227 | r = amdgpu_uvd_suspend(adev); | 227 | r = uvd_v5_0_hw_fini(adev); |
228 | if (r) | 228 | if (r) |
229 | return r; | 229 | return r; |
230 | 230 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c index d9f553fce531..7e9934fa4193 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | |||
@@ -214,14 +214,16 @@ static int uvd_v6_0_suspend(void *handle) | |||
214 | int r; | 214 | int r; |
215 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 215 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
216 | 216 | ||
217 | /* Skip this for APU for now */ | ||
218 | if (!(adev->flags & AMD_IS_APU)) { | ||
219 | r = amdgpu_uvd_suspend(adev); | ||
220 | if (r) | ||
221 | return r; | ||
222 | } | ||
217 | r = uvd_v6_0_hw_fini(adev); | 223 | r = uvd_v6_0_hw_fini(adev); |
218 | if (r) | 224 | if (r) |
219 | return r; | 225 | return r; |
220 | 226 | ||
221 | r = amdgpu_uvd_suspend(adev); | ||
222 | if (r) | ||
223 | return r; | ||
224 | |||
225 | return r; | 227 | return r; |
226 | } | 228 | } |
227 | 229 | ||
@@ -230,10 +232,12 @@ static int uvd_v6_0_resume(void *handle) | |||
230 | int r; | 232 | int r; |
231 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 233 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
232 | 234 | ||
233 | r = amdgpu_uvd_resume(adev); | 235 | /* Skip this for APU for now */ |
234 | if (r) | 236 | if (!(adev->flags & AMD_IS_APU)) { |
235 | return r; | 237 | r = amdgpu_uvd_resume(adev); |
236 | 238 | if (r) | |
239 | return r; | ||
240 | } | ||
237 | r = uvd_v6_0_hw_init(adev); | 241 | r = uvd_v6_0_hw_init(adev); |
238 | if (r) | 242 | if (r) |
239 | return r; | 243 | return r; |
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 552d9e75ad1b..b55ceb14fdcd 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c | |||
@@ -1400,7 +1400,8 @@ static int vi_common_early_init(void *handle) | |||
1400 | case CHIP_CARRIZO: | 1400 | case CHIP_CARRIZO: |
1401 | adev->has_uvd = true; | 1401 | adev->has_uvd = true; |
1402 | adev->cg_flags = 0; | 1402 | adev->cg_flags = 0; |
1403 | adev->pg_flags = AMDGPU_PG_SUPPORT_UVD | AMDGPU_PG_SUPPORT_VCE; | 1403 | /* Disable UVD pg */ |
1404 | adev->pg_flags = /* AMDGPU_PG_SUPPORT_UVD | */AMDGPU_PG_SUPPORT_VCE; | ||
1404 | adev->external_rev_id = adev->rev_id + 0x1; | 1405 | adev->external_rev_id = adev->rev_id + 0x1; |
1405 | if (amdgpu_smc_load_fw && smc_enabled) | 1406 | if (amdgpu_smc_load_fw && smc_enabled) |
1406 | adev->firmware.smu_load = true; | 1407 | adev->firmware.smu_load = true; |