]> Git Repo - J-linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
Merge tag 'smp-core-2023-04-27' of git://git.kernel.org/pub/scm/linux/kernel/git...
[J-linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_object.c
index 6c7d672412b21454278ecd151f61c1ef5c59987e..2bd1a54ee86656bcf06c2e135c58a9f3a9b9d8ba 100644 (file)
@@ -600,7 +600,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
 
        if (!amdgpu_gmc_vram_full_visible(&adev->gmc) &&
            bo->tbo.resource->mem_type == TTM_PL_VRAM &&
-           bo->tbo.resource->start < adev->gmc.visible_vram_size >> PAGE_SHIFT)
+           amdgpu_bo_in_cpu_visible_vram(bo))
                amdgpu_cs_report_moved_bytes(adev, ctx.bytes_moved,
                                             ctx.bytes_moved);
        else
@@ -1265,24 +1265,41 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
        trace_amdgpu_bo_move(abo, new_mem->mem_type, old_mem->mem_type);
 }
 
-void amdgpu_bo_get_memory(struct amdgpu_bo *bo, uint64_t *vram_mem,
-                               uint64_t *gtt_mem, uint64_t *cpu_mem)
+void amdgpu_bo_get_memory(struct amdgpu_bo *bo,
+                         struct amdgpu_mem_stats *stats)
 {
        unsigned int domain;
+       uint64_t size = amdgpu_bo_size(bo);
 
        domain = amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type);
        switch (domain) {
        case AMDGPU_GEM_DOMAIN_VRAM:
-               *vram_mem += amdgpu_bo_size(bo);
+               stats->vram += size;
+               if (amdgpu_bo_in_cpu_visible_vram(bo))
+                       stats->visible_vram += size;
                break;
        case AMDGPU_GEM_DOMAIN_GTT:
-               *gtt_mem += amdgpu_bo_size(bo);
+               stats->gtt += size;
                break;
        case AMDGPU_GEM_DOMAIN_CPU:
        default:
-               *cpu_mem += amdgpu_bo_size(bo);
+               stats->cpu += size;
                break;
        }
+
+       if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) {
+               stats->requested_vram += size;
+               if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
+                       stats->requested_visible_vram += size;
+
+               if (domain != AMDGPU_GEM_DOMAIN_VRAM) {
+                       stats->evicted_vram += size;
+                       if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
+                               stats->evicted_visible_vram += size;
+               }
+       } else if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_GTT) {
+               stats->requested_gtt += size;
+       }
 }
 
 /**
@@ -1346,7 +1363,6 @@ vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
        struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
        struct ttm_operation_ctx ctx = { false, false };
        struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
-       unsigned long offset;
        int r;
 
        /* Remember that this BO was accessed by the CPU */
@@ -1355,8 +1371,7 @@ vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
        if (bo->resource->mem_type != TTM_PL_VRAM)
                return 0;
 
-       offset = bo->resource->start << PAGE_SHIFT;
-       if ((offset + bo->base.size) <= adev->gmc.visible_vram_size)
+       if (amdgpu_bo_in_cpu_visible_vram(abo))
                return 0;
 
        /* Can't move a pinned BO to visible VRAM */
@@ -1378,10 +1393,9 @@ vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
        else if (unlikely(r))
                return VM_FAULT_SIGBUS;
 
-       offset = bo->resource->start << PAGE_SHIFT;
        /* this should never happen */
        if (bo->resource->mem_type == TTM_PL_VRAM &&
-           (offset + bo->base.size) > adev->gmc.visible_vram_size)
+           !amdgpu_bo_in_cpu_visible_vram(abo))
                return VM_FAULT_SIGBUS;
 
        ttm_bo_move_to_lru_tail_unlocked(bo);
This page took 0.030647 seconds and 4 git commands to generate.