diff options
author | Chunming Zhou <david1.zhou@amd.com> | 2018-03-16 00:29:38 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-04-11 14:08:00 -0400 |
commit | 5a8c102ac471c53da38b2c3c35417e9355d21215 (patch) | |
tree | cfa0de553f08ea7aa5ed663cc117396b72f75b00 /drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |
parent | a70cdb9eddcfd4ba20d69b84149b4a38648455ac (diff) |
drm/amdgpu: Don't change preferred domian when fallback GTT v6
v2: add sanity checking
v3: make code open
v4: also handle visible to invisible fallback
v5: Since two fallback cases, re-use goto retry
v6: avoid bo is unref when retry, and only user BO can fallback
Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com> (v5)
Acked-by: Felix Kuehling <Felix.Kuehling@amd.com>
Cc: felix.kuehling@amd.com
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 6d08cde8443c..04d6830347ec 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |||
@@ -356,6 +356,7 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size, | |||
356 | struct amdgpu_bo *bo; | 356 | struct amdgpu_bo *bo; |
357 | unsigned long page_align; | 357 | unsigned long page_align; |
358 | size_t acc_size; | 358 | size_t acc_size; |
359 | u32 domains, preferred_domains, allowed_domains; | ||
359 | int r; | 360 | int r; |
360 | 361 | ||
361 | page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT; | 362 | page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT; |
@@ -369,22 +370,24 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size, | |||
369 | acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size, | 370 | acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size, |
370 | sizeof(struct amdgpu_bo)); | 371 | sizeof(struct amdgpu_bo)); |
371 | 372 | ||
373 | preferred_domains = domain & (AMDGPU_GEM_DOMAIN_VRAM | | ||
374 | AMDGPU_GEM_DOMAIN_GTT | | ||
375 | AMDGPU_GEM_DOMAIN_CPU | | ||
376 | AMDGPU_GEM_DOMAIN_GDS | | ||
377 | AMDGPU_GEM_DOMAIN_GWS | | ||
378 | AMDGPU_GEM_DOMAIN_OA); | ||
379 | allowed_domains = preferred_domains; | ||
380 | if (type != ttm_bo_type_kernel && | ||
381 | allowed_domains == AMDGPU_GEM_DOMAIN_VRAM) | ||
382 | allowed_domains |= AMDGPU_GEM_DOMAIN_GTT; | ||
383 | domains = preferred_domains; | ||
384 | retry: | ||
372 | bo = kzalloc(sizeof(struct amdgpu_bo), GFP_KERNEL); | 385 | bo = kzalloc(sizeof(struct amdgpu_bo), GFP_KERNEL); |
373 | if (bo == NULL) | 386 | if (bo == NULL) |
374 | return -ENOMEM; | 387 | return -ENOMEM; |
375 | drm_gem_private_object_init(adev->ddev, &bo->gem_base, size); | 388 | drm_gem_private_object_init(adev->ddev, &bo->gem_base, size); |
376 | INIT_LIST_HEAD(&bo->shadow_list); | 389 | INIT_LIST_HEAD(&bo->shadow_list); |
377 | INIT_LIST_HEAD(&bo->va); | 390 | INIT_LIST_HEAD(&bo->va); |
378 | bo->preferred_domains = domain & (AMDGPU_GEM_DOMAIN_VRAM | | ||
379 | AMDGPU_GEM_DOMAIN_GTT | | ||
380 | AMDGPU_GEM_DOMAIN_CPU | | ||
381 | AMDGPU_GEM_DOMAIN_GDS | | ||
382 | AMDGPU_GEM_DOMAIN_GWS | | ||
383 | AMDGPU_GEM_DOMAIN_OA); | ||
384 | bo->allowed_domains = bo->preferred_domains; | ||
385 | if (type != ttm_bo_type_kernel && | ||
386 | bo->allowed_domains == AMDGPU_GEM_DOMAIN_VRAM) | ||
387 | bo->allowed_domains |= AMDGPU_GEM_DOMAIN_GTT; | ||
388 | 391 | ||
389 | bo->flags = flags; | 392 | bo->flags = flags; |
390 | 393 | ||
@@ -417,12 +420,20 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size, | |||
417 | #endif | 420 | #endif |
418 | 421 | ||
419 | bo->tbo.bdev = &adev->mman.bdev; | 422 | bo->tbo.bdev = &adev->mman.bdev; |
420 | amdgpu_ttm_placement_from_domain(bo, domain); | 423 | amdgpu_ttm_placement_from_domain(bo, domains); |
421 | |||
422 | r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, type, | 424 | r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, type, |
423 | &bo->placement, page_align, &ctx, acc_size, | 425 | &bo->placement, page_align, &ctx, acc_size, |
424 | NULL, resv, &amdgpu_ttm_bo_destroy); | 426 | NULL, resv, &amdgpu_ttm_bo_destroy); |
425 | if (unlikely(r != 0)) | 427 | if (unlikely(r && r != -ERESTARTSYS) && type == ttm_bo_type_device) { |
428 | if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) { | ||
429 | flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; | ||
430 | goto retry; | ||
431 | } else if (domains != allowed_domains) { | ||
432 | domains = allowed_domains; | ||
433 | goto retry; | ||
434 | } | ||
435 | } | ||
436 | if (unlikely(r)) | ||
426 | return r; | 437 | return r; |
427 | 438 | ||
428 | if (adev->gmc.visible_vram_size < adev->gmc.real_vram_size && | 439 | if (adev->gmc.visible_vram_size < adev->gmc.real_vram_size && |