diff options
author | Christian König <christian.koenig@amd.com> | 2017-09-06 10:55:16 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-12 14:27:48 -0400 |
commit | aebc5e6f50f770ec9392c3ca804f18b30797dfa7 (patch) | |
tree | 9101bec930d4a1778616057ffbce270f0ee90330 /drivers/gpu/drm/amd | |
parent | 9cca0b8e5df0ac438c65eec5044bfa089d16fbbe (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.c | 42 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 |
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 | ||
1521 | found: | ||
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 */ |
37 | struct amdgpu_bo_va_mapping { | 37 | struct 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 | */ | ||
2386 | struct 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, | |||
276 | int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev, | 276 | int 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); |
279 | struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm, | ||
280 | uint64_t addr); | ||
279 | void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, | 281 | void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, |
280 | struct amdgpu_bo_va *bo_va); | 282 | struct amdgpu_bo_va *bo_va); |
281 | void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev, | 283 | void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev, |