aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-09-06 10:55:16 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-12 14:27:48 -0400
commitaebc5e6f50f770ec9392c3ca804f18b30797dfa7 (patch)
tree9101bec930d4a1778616057ffbce270f0ee90330 /drivers/gpu/drm/amd
parent9cca0b8e5df0ac438c65eec5044bfa089d16fbbe (diff)
drm/amdgpu: rework amdgpu_cs_find_mapping
Use the VM instead of the BO list to find the BO for a virtual address. This fixes UVD/VCE in physical mode with VM local BOs. Signed-off-by: Christian König <christian.koenig@amd.com> Acked-by: Leo Liu <leo.liu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c42
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h2
4 files changed, 30 insertions, 32 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index c30110a3024a..5f19227b35e9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1479,46 +1479,24 @@ int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
1479 uint64_t addr, struct amdgpu_bo **bo, 1479 uint64_t addr, struct amdgpu_bo **bo,
1480 struct amdgpu_bo_va_mapping **map) 1480 struct amdgpu_bo_va_mapping **map)
1481{ 1481{
1482 struct amdgpu_fpriv *fpriv = parser->filp->driver_priv;
1483 struct amdgpu_vm *vm = &fpriv->vm;
1482 struct amdgpu_bo_va_mapping *mapping; 1484 struct amdgpu_bo_va_mapping *mapping;
1483 unsigned i;
1484 int r; 1485 int r;
1485 1486
1486 if (!parser->bo_list)
1487 return 0;
1488
1489 addr /= AMDGPU_GPU_PAGE_SIZE; 1487 addr /= AMDGPU_GPU_PAGE_SIZE;
1490 1488
1491 for (i = 0; i < parser->bo_list->num_entries; i++) { 1489 mapping = amdgpu_vm_bo_lookup_mapping(vm, addr);
1492 struct amdgpu_bo_list_entry *lobj; 1490 if (!mapping || !mapping->bo_va || !mapping->bo_va->base.bo)
1493 1491 return -EINVAL;
1494 lobj = &parser->bo_list->array[i];
1495 if (!lobj->bo_va)
1496 continue;
1497
1498 list_for_each_entry(mapping, &lobj->bo_va->valids, list) {
1499 if (mapping->start > addr ||
1500 addr > mapping->last)
1501 continue;
1502
1503 *bo = lobj->bo_va->base.bo;
1504 *map = mapping;
1505 goto found;
1506 }
1507
1508 list_for_each_entry(mapping, &lobj->bo_va->invalids, list) {
1509 if (mapping->start > addr ||
1510 addr > mapping->last)
1511 continue;
1512 1492
1513 *bo = lobj->bo_va->base.bo; 1493 *bo = mapping->bo_va->base.bo;
1514 *map = mapping; 1494 *map = mapping;
1515 goto found;
1516 }
1517 }
1518 1495
1519 return -EINVAL; 1496 /* Double check that the BO is reserved by this CS */
1497 if (READ_ONCE((*bo)->tbo.resv->lock.ctx) != &parser->ticket)
1498 return -EINVAL;
1520 1499
1521found:
1522 r = amdgpu_ttm_bind(&(*bo)->tbo, &(*bo)->tbo.mem); 1500 r = amdgpu_ttm_bind(&(*bo)->tbo, &(*bo)->tbo.mem);
1523 if (unlikely(r)) 1501 if (unlikely(r))
1524 return r; 1502 return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index 42492e63b3a2..a4891bea2ca8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -35,6 +35,7 @@
35 35
36/* bo virtual addresses in a vm */ 36/* bo virtual addresses in a vm */
37struct amdgpu_bo_va_mapping { 37struct amdgpu_bo_va_mapping {
38 struct amdgpu_bo_va *bo_va;
38 struct list_head list; 39 struct list_head list;
39 struct rb_node rb; 40 struct rb_node rb;
40 uint64_t start; 41 uint64_t start;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 545531db66db..758bbb9e77f3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2086,6 +2086,7 @@ static void amdgpu_vm_bo_insert_map(struct amdgpu_device *adev,
2086 struct amdgpu_vm *vm = bo_va->base.vm; 2086 struct amdgpu_vm *vm = bo_va->base.vm;
2087 struct amdgpu_bo *bo = bo_va->base.bo; 2087 struct amdgpu_bo *bo = bo_va->base.bo;
2088 2088
2089 mapping->bo_va = bo_va;
2089 list_add(&mapping->list, &bo_va->invalids); 2090 list_add(&mapping->list, &bo_va->invalids);
2090 amdgpu_vm_it_insert(mapping, &vm->va); 2091 amdgpu_vm_it_insert(mapping, &vm->va);
2091 2092
@@ -2263,6 +2264,7 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
2263 2264
2264 list_del(&mapping->list); 2265 list_del(&mapping->list);
2265 amdgpu_vm_it_remove(mapping, &vm->va); 2266 amdgpu_vm_it_remove(mapping, &vm->va);
2267 mapping->bo_va = NULL;
2266 trace_amdgpu_vm_bo_unmap(bo_va, mapping); 2268 trace_amdgpu_vm_bo_unmap(bo_va, mapping);
2267 2269
2268 if (valid) 2270 if (valid)
@@ -2348,6 +2350,7 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
2348 if (tmp->last > eaddr) 2350 if (tmp->last > eaddr)
2349 tmp->last = eaddr; 2351 tmp->last = eaddr;
2350 2352
2353 tmp->bo_va = NULL;
2351 list_add(&tmp->list, &vm->freed); 2354 list_add(&tmp->list, &vm->freed);
2352 trace_amdgpu_vm_bo_unmap(NULL, tmp); 2355 trace_amdgpu_vm_bo_unmap(NULL, tmp);
2353 } 2356 }
@@ -2374,6 +2377,19 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
2374} 2377}
2375 2378
2376/** 2379/**
2380 * amdgpu_vm_bo_lookup_mapping - find mapping by address
2381 *
2382 * @vm: the requested VM
2383 *
2384 * Find a mapping by it's address.
2385 */
2386struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm,
2387 uint64_t addr)
2388{
2389 return amdgpu_vm_it_iter_first(&vm->va, addr, addr);
2390}
2391
2392/**
2377 * amdgpu_vm_bo_rmv - remove a bo to a specific vm 2393 * amdgpu_vm_bo_rmv - remove a bo to a specific vm
2378 * 2394 *
2379 * @adev: amdgpu_device pointer 2395 * @adev: amdgpu_device pointer
@@ -2398,6 +2414,7 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
2398 list_for_each_entry_safe(mapping, next, &bo_va->valids, list) { 2414 list_for_each_entry_safe(mapping, next, &bo_va->valids, list) {
2399 list_del(&mapping->list); 2415 list_del(&mapping->list);
2400 amdgpu_vm_it_remove(mapping, &vm->va); 2416 amdgpu_vm_it_remove(mapping, &vm->va);
2417 mapping->bo_va = NULL;
2401 trace_amdgpu_vm_bo_unmap(bo_va, mapping); 2418 trace_amdgpu_vm_bo_unmap(bo_va, mapping);
2402 list_add(&mapping->list, &vm->freed); 2419 list_add(&mapping->list, &vm->freed);
2403 } 2420 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index 90b7741d024b..c1accd15efc8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -276,6 +276,8 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
276int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev, 276int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
277 struct amdgpu_vm *vm, 277 struct amdgpu_vm *vm,
278 uint64_t saddr, uint64_t size); 278 uint64_t saddr, uint64_t size);
279struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm,
280 uint64_t addr);
279void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, 281void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
280 struct amdgpu_bo_va *bo_va); 282 struct amdgpu_bo_va *bo_va);
281void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev, 283void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev,