diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/gpu/drm/vc4/vc4_gem.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/gpu/drm/vc4/vc4_gem.c')
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_gem.c | 78 | 
1 files changed, 18 insertions, 60 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c index 628d40ff3aa1..03648f954985 100644 --- a/drivers/gpu/drm/vc4/vc4_gem.c +++ b/drivers/gpu/drm/vc4/vc4_gem.c @@ -199,7 +199,7 @@ vc4_save_hang_state(struct drm_device *dev)  			continue;  		for (j = 0; j < exec[i]->bo_count; j++) { -			bo = to_vc4_bo(&exec[i]->bo[j]->base); +			bo = to_vc4_bo(exec[i]->bo[j]);  			/* Retain BOs just in case they were marked purgeable.  			 * This prevents the BO from being purged before @@ -207,8 +207,8 @@ vc4_save_hang_state(struct drm_device *dev)  			 */  			WARN_ON(!refcount_read(&bo->usecnt));  			refcount_inc(&bo->usecnt); -			drm_gem_object_get(&exec[i]->bo[j]->base); -			kernel_state->bo[k++] = &exec[i]->bo[j]->base; +			drm_gem_object_get(exec[i]->bo[j]); +			kernel_state->bo[k++] = exec[i]->bo[j];  		}  		list_for_each_entry(bo, &exec[i]->unref_list, unref_head) { @@ -558,7 +558,7 @@ vc4_update_bo_seqnos(struct vc4_exec_info *exec, uint64_t seqno)  	unsigned i;  	for (i = 0; i < exec->bo_count; i++) { -		bo = to_vc4_bo(&exec->bo[i]->base); +		bo = to_vc4_bo(exec->bo[i]);  		bo->seqno = seqno;  		dma_resv_add_fence(bo->base.base.resv, exec->fence, @@ -585,11 +585,8 @@ vc4_unlock_bo_reservations(struct drm_device *dev,  {  	int i; -	for (i = 0; i < exec->bo_count; i++) { -		struct drm_gem_object *bo = &exec->bo[i]->base; - -		dma_resv_unlock(bo->resv); -	} +	for (i = 0; i < exec->bo_count; i++) +		dma_resv_unlock(exec->bo[i]->resv);  	ww_acquire_fini(acquire_ctx);  } @@ -614,7 +611,7 @@ vc4_lock_bo_reservations(struct drm_device *dev,  retry:  	if (contended_lock != -1) { -		bo = &exec->bo[contended_lock]->base; +		bo = exec->bo[contended_lock];  		ret = dma_resv_lock_slow_interruptible(bo->resv, acquire_ctx);  		if (ret) {  			ww_acquire_done(acquire_ctx); @@ -626,19 +623,19 @@ retry:  		if (i == contended_lock)  			continue; -		bo = &exec->bo[i]->base; +		bo = exec->bo[i];  		ret = dma_resv_lock_interruptible(bo->resv, acquire_ctx);  		if (ret) {  			int j;  			for (j = 0; j < i; j++) { -				bo = &exec->bo[j]->base; +				bo = exec->bo[j];  				dma_resv_unlock(bo->resv);  			}  			if (contended_lock != -1 && contended_lock >= i) { -				bo = &exec->bo[contended_lock]->base; +				bo = exec->bo[contended_lock];  				dma_resv_unlock(bo->resv);  			} @@ -659,7 +656,7 @@ retry:  	 * before we commit the CL to the hardware.  	 */  	for (i = 0; i < exec->bo_count; i++) { -		bo = &exec->bo[i]->base; +		bo = exec->bo[i];  		ret = dma_resv_reserve_fences(bo->resv, 1);  		if (ret) { @@ -749,7 +746,6 @@ vc4_cl_lookup_bos(struct drm_device *dev,  		  struct vc4_exec_info *exec)  {  	struct drm_vc4_submit_cl *args = exec->args; -	uint32_t *handles;  	int ret = 0;  	int i; @@ -763,54 +759,18 @@ vc4_cl_lookup_bos(struct drm_device *dev,  		return -EINVAL;  	} -	exec->bo = kvmalloc_array(exec->bo_count, -				    sizeof(struct drm_gem_dma_object *), -				    GFP_KERNEL | __GFP_ZERO); -	if (!exec->bo) { -		DRM_ERROR("Failed to allocate validated BO pointers\n"); -		return -ENOMEM; -	} - -	handles = kvmalloc_array(exec->bo_count, sizeof(uint32_t), GFP_KERNEL); -	if (!handles) { -		ret = -ENOMEM; -		DRM_ERROR("Failed to allocate incoming GEM handles\n"); -		goto fail; -	} - -	if (copy_from_user(handles, u64_to_user_ptr(args->bo_handles), -			   exec->bo_count * sizeof(uint32_t))) { -		ret = -EFAULT; -		DRM_ERROR("Failed to copy in GEM handles\n"); -		goto fail; -	} - -	spin_lock(&file_priv->table_lock); -	for (i = 0; i < exec->bo_count; i++) { -		struct drm_gem_object *bo = idr_find(&file_priv->object_idr, -						     handles[i]); -		if (!bo) { -			DRM_DEBUG("Failed to look up GEM BO %d: %d\n", -				  i, handles[i]); -			ret = -EINVAL; -			break; -		} - -		drm_gem_object_get(bo); -		exec->bo[i] = (struct drm_gem_dma_object *)bo; -	} -	spin_unlock(&file_priv->table_lock); +	ret = drm_gem_objects_lookup(file_priv, u64_to_user_ptr(args->bo_handles), +				     exec->bo_count, &exec->bo);  	if (ret)  		goto fail_put_bo;  	for (i = 0; i < exec->bo_count; i++) { -		ret = vc4_bo_inc_usecnt(to_vc4_bo(&exec->bo[i]->base)); +		ret = vc4_bo_inc_usecnt(to_vc4_bo(exec->bo[i]));  		if (ret)  			goto fail_dec_usecnt;  	} -	kvfree(handles);  	return 0;  fail_dec_usecnt: @@ -823,15 +783,13 @@ fail_dec_usecnt:  	 * step.  	 */  	for (i-- ; i >= 0; i--) -		vc4_bo_dec_usecnt(to_vc4_bo(&exec->bo[i]->base)); +		vc4_bo_dec_usecnt(to_vc4_bo(exec->bo[i]));  fail_put_bo:  	/* Release any reference to acquired objects. */  	for (i = 0; i < exec->bo_count && exec->bo[i]; i++) -		drm_gem_object_put(&exec->bo[i]->base); +		drm_gem_object_put(exec->bo[i]); -fail: -	kvfree(handles);  	kvfree(exec->bo);  	exec->bo = NULL;  	return ret; @@ -974,10 +932,10 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)  	if (exec->bo) {  		for (i = 0; i < exec->bo_count; i++) { -			struct vc4_bo *bo = to_vc4_bo(&exec->bo[i]->base); +			struct vc4_bo *bo = to_vc4_bo(exec->bo[i]);  			vc4_bo_dec_usecnt(bo); -			drm_gem_object_put(&exec->bo[i]->base); +			drm_gem_object_put(exec->bo[i]);  		}  		kvfree(exec->bo);  	}  |