Commit f431393d authored by Rajneesh Bhardwaj's avatar Rajneesh Bhardwaj Committed by Alex Deucher
Browse files

drm/amdgpu: Implement new dummy vram manager



This adds dummy vram manager to support ASICs that do not have a
dedicated or carvedout vram domain.

Reviewed-by: default avatarFelix Kuehling <felix.kuehling@amd.com>
Signed-off-by: default avatarRajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 228ce176
Loading
Loading
Loading
Loading
+60 −7
Original line number Diff line number Diff line
@@ -370,6 +370,45 @@ int amdgpu_vram_mgr_query_page_status(struct amdgpu_vram_mgr *mgr,
	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,16 +888,21 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)
	ttm_resource_manager_init(man, &adev->mman.bdev,
				  adev->gmc.real_vram_size);

	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;

	mutex_init(&mgr->lock);
	INIT_LIST_HEAD(&mgr->reservations_pending);
	INIT_LIST_HEAD(&mgr->reserved_pages);
	mgr->default_page_size = PAGE_SIZE;
	} 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);
@@ -886,6 +938,7 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev)
		drm_buddy_free_list(&mgr->mm, &rsv->allocated);
		kfree(rsv);
	}
	if (!adev->gmc.is_app_apu)
		drm_buddy_fini(&mgr->mm);
	mutex_unlock(&mgr->lock);