]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
Merge tag 'amd-drm-next-5.14-2021-05-19' of https://gitlab.freedesktop.org/agd5f...
[mirror_ubuntu-jammy-kernel.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_object.c
index da6d4ee0a132b8f04ee6391afa7471ac3df8c227..8714d50c5b20280a70e6ca6418b05f99bb250397 100644 (file)
  *
  */
 
-/**
- * amdgpu_bo_subtract_pin_size - Remove BO from pin_size accounting
- *
- * @bo: &amdgpu_bo buffer object
- *
- * This function is called when a BO stops being pinned, and updates the
- * &amdgpu_device pin_size values accordingly.
- */
-static void amdgpu_bo_subtract_pin_size(struct amdgpu_bo *bo)
-{
-       struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
-
-       if (bo->tbo.mem.mem_type == TTM_PL_VRAM) {
-               atomic64_sub(amdgpu_bo_size(bo), &adev->vram_pin_size);
-               atomic64_sub(amdgpu_vram_mgr_bo_visible_size(bo),
-                            &adev->visible_pin_size);
-       } else if (bo->tbo.mem.mem_type == TTM_PL_TT) {
-               atomic64_sub(amdgpu_bo_size(bo), &adev->gart_pin_size);
-       }
-}
-
 static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)
 {
        struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
        struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
        struct amdgpu_bo_user *ubo;
 
-       if (bo->tbo.pin_count > 0)
-               amdgpu_bo_subtract_pin_size(bo);
-
        amdgpu_bo_kunmap(bo);
 
        if (bo->tbo.base.import_attach)
@@ -1002,14 +978,22 @@ int amdgpu_bo_pin(struct amdgpu_bo *bo, u32 domain)
  */
 void amdgpu_bo_unpin(struct amdgpu_bo *bo)
 {
+       struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
+
        ttm_bo_unpin(&bo->tbo);
        if (bo->tbo.pin_count)
                return;
 
-       amdgpu_bo_subtract_pin_size(bo);
-
        if (bo->tbo.base.import_attach)
                dma_buf_unpin(bo->tbo.base.import_attach);
+
+       if (bo->tbo.mem.mem_type == TTM_PL_VRAM) {
+               atomic64_sub(amdgpu_bo_size(bo), &adev->vram_pin_size);
+               atomic64_sub(amdgpu_vram_mgr_bo_visible_size(bo),
+                            &adev->visible_pin_size);
+       } else if (bo->tbo.mem.mem_type == TTM_PL_TT) {
+               atomic64_sub(amdgpu_bo_size(bo), &adev->gart_pin_size);
+       }
 }
 
 /**
@@ -1269,6 +1253,26 @@ 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)
+{
+       unsigned int domain;
+
+       domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
+       switch (domain) {
+       case AMDGPU_GEM_DOMAIN_VRAM:
+               *vram_mem += amdgpu_bo_size(bo);
+               break;
+       case AMDGPU_GEM_DOMAIN_GTT:
+               *gtt_mem += amdgpu_bo_size(bo);
+               break;
+       case AMDGPU_GEM_DOMAIN_CPU:
+       default:
+               *cpu_mem += amdgpu_bo_size(bo);
+               break;
+       }
+}
+
 /**
  * amdgpu_bo_release_notify - notification about a BO being released
  * @bo: pointer to a buffer object
@@ -1327,7 +1331,7 @@ 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, size;
+       unsigned long offset;
        int r;
 
        /* Remember that this BO was accessed by the CPU */
@@ -1336,9 +1340,8 @@ vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
        if (bo->mem.mem_type != TTM_PL_VRAM)
                return 0;
 
-       size = bo->mem.num_pages << PAGE_SHIFT;
        offset = bo->mem.start << PAGE_SHIFT;
-       if ((offset + size) <= adev->gmc.visible_vram_size)
+       if ((offset + bo->base.size) <= adev->gmc.visible_vram_size)
                return 0;
 
        /* Can't move a pinned BO to visible VRAM */
@@ -1363,7 +1366,7 @@ vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
        offset = bo->mem.start << PAGE_SHIFT;
        /* this should never happen */
        if (bo->mem.mem_type == TTM_PL_VRAM &&
-           (offset + size) > adev->gmc.visible_vram_size)
+           (offset + bo->base.size) > adev->gmc.visible_vram_size)
                return VM_FAULT_SIGBUS;
 
        ttm_bo_move_to_lru_tail_unlocked(bo);