ttm_eu_backoff_reservation(&ticket, &list);
        return 0;
 }
+
+int amdgpu_unmap_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+                           struct amdgpu_bo *bo, struct amdgpu_bo_va *bo_va,
+                           uint64_t csa_addr)
+{
+       struct ww_acquire_ctx ticket;
+       struct list_head list;
+       struct amdgpu_bo_list_entry pd;
+       struct ttm_validate_buffer csa_tv;
+       int r;
+
+       INIT_LIST_HEAD(&list);
+       INIT_LIST_HEAD(&csa_tv.head);
+       csa_tv.bo = &bo->tbo;
+       csa_tv.num_shared = 1;
+
+       list_add(&csa_tv.head, &list);
+       amdgpu_vm_get_pd_bo(vm, &list, &pd);
+
+       r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL);
+       if (r) {
+               DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r);
+               return r;
+       }
+
+       r = amdgpu_vm_bo_unmap(adev, bo_va, csa_addr);
+       if (r) {
+               DRM_ERROR("failed to do bo_unmap on static CSA, err=%d\n", r);
+               ttm_eu_backoff_reservation(&ticket, &list);
+               return r;
+       }
+
+       amdgpu_vm_bo_del(adev, bo_va);
+
+       ttm_eu_backoff_reservation(&ticket, &list);
+
+       return 0;
+}
 
 int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
                          struct amdgpu_bo *bo, struct amdgpu_bo_va **bo_va,
                          uint64_t csa_addr, uint32_t size);
+int amdgpu_unmap_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+                           struct amdgpu_bo *bo, struct amdgpu_bo_va *bo_va,
+                           uint64_t csa_addr);
 void amdgpu_free_static_csa(struct amdgpu_bo **bo);
 
 #endif
 
        if (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_VCE) != NULL)
                amdgpu_vce_free_handles(adev, file_priv);
 
-       if (amdgpu_mcbp) {
-               /* TODO: how to handle reserve failure */
-               BUG_ON(amdgpu_bo_reserve(adev->virt.csa_obj, true));
-               amdgpu_vm_bo_del(adev, fpriv->csa_va);
+       if (fpriv->csa_va) {
+               uint64_t csa_addr = amdgpu_csa_vaddr(adev) & AMDGPU_GMC_HOLE_MASK;
+
+               WARN_ON(amdgpu_unmap_static_csa(adev, &fpriv->vm, adev->virt.csa_obj,
+                                               fpriv->csa_va, csa_addr));
                fpriv->csa_va = NULL;
-               amdgpu_bo_unreserve(adev->virt.csa_obj);
        }
 
        pasid = fpriv->vm.pasid;