drm/amdgpu: Implement new dummy vram manager
authorRajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
Sat, 28 Jan 2023 02:46:59 +0000 (21:46 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 13:53:57 +0000 (09:53 -0400)
This adds dummy vram manager to support ASICs that do not have a
dedicated or carvedout vram domain.

Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c

index 43d6a9d6a5384f886b4460a539bb97450cf1a0e2..89d35d194f2c4a71b7075cf55d4ca404e5ab3e23 100644 (file)
@@ -370,6 +370,45 @@ out:
        return ret;
 }
 
+static void amdgpu_dummy_vram_mgr_debug(struct ttm_resource_manager *man,
+                                 struct drm_printer *printer)
+{
+       DRM_DEBUG_DRIVER("Dummy vram mgr debug\n");
+}
+
+static bool amdgpu_dummy_vram_mgr_compatible(struct ttm_resource_manager *man,
+                                      struct ttm_resource *res,
+                                      const struct ttm_place *place,
+                                      size_t size)
+{
+       DRM_DEBUG_DRIVER("Dummy vram mgr compatible\n");
+       return false;
+}
+
+static bool amdgpu_dummy_vram_mgr_intersects(struct ttm_resource_manager *man,
+                                      struct ttm_resource *res,
+                                      const struct ttm_place *place,
+                                      size_t size)
+{
+       DRM_DEBUG_DRIVER("Dummy vram mgr intersects\n");
+       return true;
+}
+
+static void amdgpu_dummy_vram_mgr_del(struct ttm_resource_manager *man,
+                               struct ttm_resource *res)
+{
+       DRM_DEBUG_DRIVER("Dummy vram mgr deleted\n");
+}
+
+static int amdgpu_dummy_vram_mgr_new(struct ttm_resource_manager *man,
+                              struct ttm_buffer_object *tbo,
+                              const struct ttm_place *place,
+                              struct ttm_resource **res)
+{
+       DRM_DEBUG_DRIVER("Dummy vram mgr new\n");
+       return -ENOSPC;
+}
+
 /**
  * amdgpu_vram_mgr_new - allocate new ranges
  *
@@ -817,6 +856,14 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man,
        mutex_unlock(&mgr->lock);
 }
 
+static const struct ttm_resource_manager_func amdgpu_dummy_vram_mgr_func = {
+       .alloc  = amdgpu_dummy_vram_mgr_new,
+       .free   = amdgpu_dummy_vram_mgr_del,
+       .intersects = amdgpu_dummy_vram_mgr_intersects,
+       .compatible = amdgpu_dummy_vram_mgr_compatible,
+       .debug  = amdgpu_dummy_vram_mgr_debug
+};
+
 static const struct ttm_resource_manager_func amdgpu_vram_mgr_func = {
        .alloc  = amdgpu_vram_mgr_new,
        .free   = amdgpu_vram_mgr_del,
@@ -841,17 +888,22 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)
        ttm_resource_manager_init(man, &adev->mman.bdev,
                                  adev->gmc.real_vram_size);
 
-       man->func = &amdgpu_vram_mgr_func;
-
-       err = drm_buddy_init(&mgr->mm, man->size, PAGE_SIZE);
-       if (err)
-               return err;
-
        mutex_init(&mgr->lock);
        INIT_LIST_HEAD(&mgr->reservations_pending);
        INIT_LIST_HEAD(&mgr->reserved_pages);
        mgr->default_page_size = PAGE_SIZE;
 
+       if (!adev->gmc.is_app_apu) {
+               man->func = &amdgpu_vram_mgr_func;
+
+               err = drm_buddy_init(&mgr->mm, man->size, PAGE_SIZE);
+               if (err)
+                       return err;
+       } else {
+               man->func = &amdgpu_dummy_vram_mgr_func;
+               DRM_INFO("Setup dummy vram mgr\n");
+       }
+
        ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager);
        ttm_resource_manager_set_used(man, true);
        return 0;
@@ -886,7 +938,8 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev)
                drm_buddy_free_list(&mgr->mm, &rsv->allocated);
                kfree(rsv);
        }
-       drm_buddy_fini(&mgr->mm);
+       if (!adev->gmc.is_app_apu)
+               drm_buddy_fini(&mgr->mm);
        mutex_unlock(&mgr->lock);
 
        ttm_resource_manager_cleanup(man);