diff options
| author | Dave Airlie <airlied@redhat.com> | 2025-08-29 09:05:16 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2025-08-29 09:05:18 +1000 | 
| commit | 49862587fa27db253751aadd65a5c9fc1eda1cc7 (patch) | |
| tree | 8b886575e70a71fd95abbdbb7b51b11b7cd0c86c /drivers/gpu/drm/msm/msm_gem_submit.c | |
| parent | 4b1c24ef50bc1d4f0b17d85749809d61cbe45be2 (diff) | |
| parent | 3cf6147f2b51a569761e1ef010efbd891e3a3a15 (diff) | |
Merge tag 'drm-msm-fixes-2025-08-26' of https://gitlab.freedesktop.org/drm/msm into drm-fixes
Fixes for v6.17-rc4
Core/GPU:
- fix comment doc warning in gpuvm
- fix build with KMS disabled
- fix pgtable setup/teardown race
- global fault counter fix
- various error path fixes
- GPU devcoredump snapshot fixes
- handle in-place VM_BIND remaps to solve turnip vm update race
- skip re-emitting IBs for unusable VMs
- Don't use %pK through printk
- moved display snapshot init earlier, fixing a crash
DPU:
- Fixed crash in virtual plane checking code
- Fixed mode comparison in virtual plane checking code
DSI:
- Adjusted width of resulution-related registers
- Fixed locking issue on 14nm PLLs
UBWC (per Bjorn's ack)
- Added UBWC configuration for several missing platforms (fixing
  regression)
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Rob Clark <rob.clark@oss.qualcomm.com>
Link: https://lore.kernel.org/r/CACSVV02+u1VW1dzuz6JWwVEfpgTj6Y-JXMH+vX43KsKTVsW+Yg@mail.gmail.com
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gem_submit.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 72 | 
1 files changed, 39 insertions, 33 deletions
| diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 5f8e939a5906..3ab3b27134f9 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -271,32 +271,37 @@ out:  	return ret;  } -/* This is where we make sure all the bo's are reserved and pin'd: */ -static int submit_lock_objects(struct msm_gem_submit *submit) +static int submit_lock_objects_vmbind(struct msm_gem_submit *submit)  { -	unsigned flags = DRM_EXEC_INTERRUPTIBLE_WAIT; +	unsigned flags = DRM_EXEC_INTERRUPTIBLE_WAIT | DRM_EXEC_IGNORE_DUPLICATES;  	struct drm_exec *exec = &submit->exec; -	int ret; +	int ret = 0; -	if (msm_context_is_vmbind(submit->queue->ctx)) { -		flags |= DRM_EXEC_IGNORE_DUPLICATES; +	drm_exec_init(&submit->exec, flags, submit->nr_bos); -		drm_exec_init(&submit->exec, flags, submit->nr_bos); +	drm_exec_until_all_locked (&submit->exec) { +		ret = drm_gpuvm_prepare_vm(submit->vm, exec, 1); +		drm_exec_retry_on_contention(exec); +		if (ret) +			break; -		drm_exec_until_all_locked (&submit->exec) { -			ret = drm_gpuvm_prepare_vm(submit->vm, exec, 1); -			drm_exec_retry_on_contention(exec); -			if (ret) -				return ret; +		ret = drm_gpuvm_prepare_objects(submit->vm, exec, 1); +		drm_exec_retry_on_contention(exec); +		if (ret) +			break; +	} -			ret = drm_gpuvm_prepare_objects(submit->vm, exec, 1); -			drm_exec_retry_on_contention(exec); -			if (ret) -				return ret; -		} +	return ret; +} -		return 0; -	} +/* This is where we make sure all the bo's are reserved and pin'd: */ +static int submit_lock_objects(struct msm_gem_submit *submit) +{ +	unsigned flags = DRM_EXEC_INTERRUPTIBLE_WAIT; +	int ret = 0; + +	if (msm_context_is_vmbind(submit->queue->ctx)) +		return submit_lock_objects_vmbind(submit);  	drm_exec_init(&submit->exec, flags, submit->nr_bos); @@ -305,17 +310,17 @@ static int submit_lock_objects(struct msm_gem_submit *submit)  					drm_gpuvm_resv_obj(submit->vm));  		drm_exec_retry_on_contention(&submit->exec);  		if (ret) -			return ret; +			break;  		for (unsigned i = 0; i < submit->nr_bos; i++) {  			struct drm_gem_object *obj = submit->bos[i].obj;  			ret = drm_exec_prepare_obj(&submit->exec, obj, 1);  			drm_exec_retry_on_contention(&submit->exec);  			if (ret) -				return ret; +				break;  		}  	} -	return 0; +	return ret;  }  static int submit_fence_sync(struct msm_gem_submit *submit) @@ -514,14 +519,15 @@ out:   */  static void submit_cleanup(struct msm_gem_submit *submit, bool error)  { +	if (error) +		submit_unpin_objects(submit); +  	if (submit->exec.objects)  		drm_exec_fini(&submit->exec); -	if (error) { -		submit_unpin_objects(submit); -		/* job wasn't enqueued to scheduler, so early retirement: */ +	/* if job wasn't enqueued to scheduler, early retirement: */ +	if (error)  		msm_submit_retire(submit); -	}  }  void msm_submit_retire(struct msm_gem_submit *submit) @@ -769,12 +775,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  	if (ret == 0 && args->flags & MSM_SUBMIT_FENCE_FD_OUT) {  		sync_file = sync_file_create(submit->user_fence); -		if (!sync_file) { +		if (!sync_file)  			ret = -ENOMEM; -		} else { -			fd_install(out_fence_fd, sync_file->file); -			args->fence_fd = out_fence_fd; -		}  	}  	if (ret) @@ -812,10 +814,14 @@ out:  out_unlock:  	mutex_unlock(&queue->lock);  out_post_unlock: -	if (ret && (out_fence_fd >= 0)) { -		put_unused_fd(out_fence_fd); +	if (ret) { +		if (out_fence_fd >= 0) +			put_unused_fd(out_fence_fd);  		if (sync_file)  			fput(sync_file->file); +	} else if (sync_file) { +		fd_install(out_fence_fd, sync_file->file); +		args->fence_fd = out_fence_fd;  	}  	if (!IS_ERR_OR_NULL(submit)) { | 
