From: Christian König Date: Wed, 25 Jan 2023 16:14:37 +0000 (+0100) Subject: drm/ttm: revert "prevent moving of pinned BOs" X-Git-Tag: v6.6.17~3937^2~23^2~843 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2847a67d3aa518a29e8a8db01bbec630d3bd5011;p=platform%2Fkernel%2Flinux-rpi.git drm/ttm: revert "prevent moving of pinned BOs" This reverts commit b49323aa35d502b0d9a7950327f30a1a52eae534. This still seems to break i915. Signed-off-by: Christian König Acked-by: Matthew Auld Link: https://patchwork.freedesktop.org/patch/msgid/20230125155023.105584-1-christian.koenig@amd.com --- diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 2cd081c..c5ef7f7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -466,7 +466,11 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict, return r; } + /* Can't move a pinned BO */ abo = ttm_to_amdgpu_bo(bo); + if (WARN_ON_ONCE(abo->tbo.pin_count > 0)) + return -EINVAL; + adev = amdgpu_ttm_adev(bo->bdev); if (!old_mem || (old_mem->mem_type == TTM_PL_SYSTEM && diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index c2ec91c..288eebc 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c @@ -1015,6 +1015,9 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, if (ret) goto out_ntfy; + if (nvbo->bo.pin_count) + NV_WARN(drm, "Moving pinned object %p!\n", nvbo); + if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA) { ret = nouveau_bo_vm_bind(bo, new_reg, &new_tile); if (ret) diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 67075c8..1e8e287 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -211,7 +211,11 @@ static int radeon_bo_move(struct ttm_buffer_object *bo, bool evict, if (r) return r; + /* Can't move a pinned BO */ rbo = container_of(bo, struct radeon_bo, tbo); + if (WARN_ON_ONCE(rbo->tbo.pin_count > 0)) + return -EINVAL; + rdev = radeon_get_rdev(bo->bdev); if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) { ttm_bo_move_null(bo, new_mem); diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 33471e3..bb0c21c 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -894,18 +894,14 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, if (!placement->num_placement && !placement->num_busy_placement) return ttm_bo_pipeline_gutting(bo); - /* Check whether we need to move buffer. */ - if (bo->resource && ttm_resource_compat(bo->resource, placement)) - return 0; - - /* Moving of pinned BOs is forbidden */ - if (bo->pin_count) - return -EINVAL; - - ret = ttm_bo_move_buffer(bo, placement, ctx); - if (ret) - return ret; - + /* + * Check whether we need to move buffer. + */ + if (!bo->resource || !ttm_resource_compat(bo->resource, placement)) { + ret = ttm_bo_move_buffer(bo, placement, ctx); + if (ret) + return ret; + } /* * We might need to add a TTM. */ diff --git a/drivers/gpu/drm/ttm/ttm_resource.c b/drivers/gpu/drm/ttm/ttm_resource.c index 7333f7a..b8a826a 100644 --- a/drivers/gpu/drm/ttm/ttm_resource.c +++ b/drivers/gpu/drm/ttm/ttm_resource.c @@ -361,6 +361,7 @@ bool ttm_resource_compat(struct ttm_resource *res, return false; } +EXPORT_SYMBOL(ttm_resource_compat); void ttm_resource_set_bo(struct ttm_resource *res, struct ttm_buffer_object *bo) diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c index dbcef46..321c551 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c @@ -87,7 +87,12 @@ int vmw_bo_pin_in_placement(struct vmw_private *dev_priv, if (unlikely(ret != 0)) goto err; - ret = ttm_bo_validate(bo, placement, &ctx); + if (buf->base.pin_count > 0) + ret = ttm_resource_compat(bo->resource, placement) + ? 0 : -EINVAL; + else + ret = ttm_bo_validate(bo, placement, &ctx); + if (!ret) vmw_bo_pin_reserved(buf, true); @@ -123,6 +128,12 @@ int vmw_bo_pin_in_vram_or_gmr(struct vmw_private *dev_priv, if (unlikely(ret != 0)) goto err; + if (buf->base.pin_count > 0) { + ret = ttm_resource_compat(bo->resource, &vmw_vram_gmr_placement) + ? 0 : -EINVAL; + goto out_unreserve; + } + ret = ttm_bo_validate(bo, &vmw_vram_gmr_placement, &ctx); if (likely(ret == 0) || ret == -ERESTARTSYS) goto out_unreserve; @@ -207,7 +218,11 @@ int vmw_bo_pin_in_start_of_vram(struct vmw_private *dev_priv, (void) ttm_bo_validate(bo, &vmw_sys_placement, &ctx); } - ret = ttm_bo_validate(bo, &placement, &ctx); + if (buf->base.pin_count > 0) + ret = ttm_resource_compat(bo->resource, &placement) + ? 0 : -EINVAL; + else + ret = ttm_bo_validate(bo, &placement, &ctx); /* For some reason we didn't end up at the start of vram */ WARN_ON(ret == 0 && bo->resource->start != 0);