drm/vmwgfx: Make the driver work without the dummy resources
authorZack Rusin <zackr@vmware.com>
Fri, 10 Feb 2023 02:34:37 +0000 (21:34 -0500)
committerZack Rusin <zackr@vmware.com>
Tue, 14 Feb 2023 03:37:55 +0000 (22:37 -0500)
In commit 180253782038 ("drm/ttm: stop allocating dummy resources during BO creation")
ttm stopped allocating dummy resources but vmwgfx was never ported to
handle it. Make the driver treat null resources as initial creation and
port code to handle null resources in general.

Fixes kernel oops'es on boot with vmwgfx.

Signed-off-by: Zack Rusin <zackr@vmware.com>
Fixes: 180253782038 ("drm/ttm: stop allocating dummy resources during BO creation")
Cc: Christian König <christian.koenig@amd.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Nirmoy Das <nirmoy.das@intel.com>
Cc: Christian Koenig <christian.koenig@amd.com>
Cc: Huang Rui <ray.huang@amd.com>
Cc: dri-devel@lists.freedesktop.org
Reviewed-by: Christian König <christian.koenig@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230210023437.2214816-1-zack@kde.org
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c

index 54e942df3b8e4425f4bce765adf3751a6d2c55fb..71eeabf001c874d03fc005d76b68a50f6e49f1d1 100644 (file)
@@ -837,7 +837,8 @@ void vmw_query_move_notify(struct ttm_buffer_object *bo,
        mutex_lock(&dev_priv->binding_mutex);
 
        /* If BO is being moved from MOB to system memory */
-       if (new_mem->mem_type == TTM_PL_SYSTEM &&
+       if (old_mem &&
+           new_mem->mem_type == TTM_PL_SYSTEM &&
            old_mem->mem_type == VMW_PL_MOB) {
                struct vmw_fence_obj *fence;
 
index 4daebc5b9eb4c310566afa6e9849e42cd53ecbe8..af8562c95cc35b85048f2b9c64bcde55ed374f73 100644 (file)
@@ -515,9 +515,13 @@ static int vmw_move(struct ttm_buffer_object *bo,
                    struct ttm_resource *new_mem,
                    struct ttm_place *hop)
 {
-       struct ttm_resource_manager *old_man = ttm_manager_type(bo->bdev, bo->resource->mem_type);
-       struct ttm_resource_manager *new_man = ttm_manager_type(bo->bdev, new_mem->mem_type);
-       int ret;
+       struct ttm_resource_manager *new_man;
+       struct ttm_resource_manager *old_man = NULL;
+       int ret = 0;
+
+       new_man = ttm_manager_type(bo->bdev, new_mem->mem_type);
+       if (bo->resource)
+               old_man = ttm_manager_type(bo->bdev, bo->resource->mem_type);
 
        if (new_man->use_tt && !vmw_memtype_is_system(new_mem->mem_type)) {
                ret = vmw_ttm_bind(bo->bdev, bo->ttm, new_mem);
@@ -525,9 +529,15 @@ static int vmw_move(struct ttm_buffer_object *bo,
                        return ret;
        }
 
+       if (!bo->resource || (bo->resource->mem_type == TTM_PL_SYSTEM &&
+                             bo->ttm == NULL)) {
+               ttm_bo_move_null(bo, new_mem);
+               return 0;
+       }
+
        vmw_move_notify(bo, bo->resource, new_mem);
 
-       if (old_man->use_tt && new_man->use_tt) {
+       if (old_man && old_man->use_tt && new_man->use_tt) {
                if (vmw_memtype_is_system(bo->resource->mem_type)) {
                        ttm_bo_move_null(bo, new_mem);
                        return 0;