Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea199cc9 authored by Jammy Zhou's avatar Jammy Zhou Committed by Alex Deucher
Browse files

drm/amdgpu: return new seq_no for amd_sched_push_job



It is clean to update last_queued_v_seq in the scheduler module

Signed-off-by: default avatarJammy Zhou <Jammy.Zhou@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent dd01d071
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -907,8 +907,6 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
	if (amdgpu_enable_scheduler && parser->num_ibs) {
		struct amdgpu_ring * ring =
			amdgpu_cs_parser_get_ring(adev, parser);
		parser->ibs[parser->num_ibs - 1].sequence = atomic64_inc_return(
			&parser->ctx->rings[ring->idx].c_entity.last_queued_v_seq);
		if (ring->is_pte_ring || (parser->bo_list && parser->bo_list->has_userptr)) {
			r = amdgpu_cs_parser_prepare_job(parser);
			if (r)
@@ -918,6 +916,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
		parser->ring = ring;
		parser->run_job = amdgpu_cs_parser_run_job;
		parser->free_job = amdgpu_cs_parser_free_job;
		parser->ibs[parser->num_ibs - 1].sequence =
				   amd_sched_push_job(ring->scheduler,
				   &parser->ctx->rings[ring->idx].c_entity,
				   parser);
+2 −7
Original line number Diff line number Diff line
@@ -109,7 +109,6 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev,
{
	int r = 0;
	if (amdgpu_enable_scheduler) {
		uint64_t v_seq;
		struct amdgpu_cs_parser *sched_job =
			amdgpu_cs_parser_create(adev,
						owner,
@@ -119,16 +118,12 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev,
			return -ENOMEM;
		}
		sched_job->free_job = free_job;
		v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq);
		ibs[num_ibs - 1].sequence = v_seq;
		amd_sched_push_job(ring->scheduler,
		ibs[num_ibs - 1].sequence = amd_sched_push_job(ring->scheduler,
				   &adev->kernel_ctx->rings[ring->idx].c_entity,
				   sched_job);
		r = amd_sched_wait_emit(
			&adev->kernel_ctx->rings[ring->idx].c_entity,
			v_seq,
			false,
			-1);
			ibs[num_ibs - 1].sequence, false, -1);
		if (r)
			WARN(true, "emit timeout\n");
	} else
+6 −21
Original line number Diff line number Diff line
@@ -371,7 +371,6 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,

	if (amdgpu_enable_scheduler) {
		int r;
		uint64_t v_seq;
		sched_job = amdgpu_cs_parser_create(adev, AMDGPU_FENCE_OWNER_VM,
						    adev->kernel_ctx, ib, 1);
		if(!sched_job)
@@ -379,15 +378,11 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
		sched_job->job_param.vm.bo = bo;
		sched_job->run_job = amdgpu_vm_run_job;
		sched_job->free_job = amdgpu_vm_free_job;
		v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq);
		ib->sequence = v_seq;
		amd_sched_push_job(ring->scheduler,
		ib->sequence = amd_sched_push_job(ring->scheduler,
				   &adev->kernel_ctx->rings[ring->idx].c_entity,
				   sched_job);
		r = amd_sched_wait_emit(&adev->kernel_ctx->rings[ring->idx].c_entity,
					v_seq,
					false,
					-1);
					ib->sequence, false, -1);
		if (r)
			DRM_ERROR("emit timeout\n");

@@ -521,7 +516,6 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,

		if (amdgpu_enable_scheduler) {
			int r;
			uint64_t v_seq;
			sched_job = amdgpu_cs_parser_create(adev, AMDGPU_FENCE_OWNER_VM,
							    adev->kernel_ctx,
							    ib, 1);
@@ -530,15 +524,11 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
			sched_job->job_param.vm.bo = pd;
			sched_job->run_job = amdgpu_vm_run_job;
			sched_job->free_job = amdgpu_vm_free_job;
			v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq);
			ib->sequence = v_seq;
			amd_sched_push_job(ring->scheduler,
			ib->sequence = amd_sched_push_job(ring->scheduler,
					   &adev->kernel_ctx->rings[ring->idx].c_entity,
					   sched_job);
			r = amd_sched_wait_emit(&adev->kernel_ctx->rings[ring->idx].c_entity,
						v_seq,
						false,
						-1);
						ib->sequence, false, -1);
			if (r)
				DRM_ERROR("emit timeout\n");
		} else {
@@ -872,7 +862,6 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,

	if (amdgpu_enable_scheduler) {
		int r;
		uint64_t v_seq;
		sched_job = amdgpu_cs_parser_create(adev, AMDGPU_FENCE_OWNER_VM,
						    adev->kernel_ctx, ib, 1);
		if(!sched_job)
@@ -883,15 +872,11 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
		sched_job->job_param.vm_mapping.fence = fence;
		sched_job->run_job = amdgpu_vm_bo_update_mapping_run_job;
		sched_job->free_job = amdgpu_vm_free_job;
		v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq);
		ib->sequence = v_seq;
		amd_sched_push_job(ring->scheduler,
		ib->sequence = amd_sched_push_job(ring->scheduler,
				   &adev->kernel_ctx->rings[ring->idx].c_entity,
				   sched_job);
		r = amd_sched_wait_emit(&adev->kernel_ctx->rings[ring->idx].c_entity,
					v_seq,
					false,
					-1);
					ib->sequence, false, -1);
		if (r)
			DRM_ERROR("emit timeout\n");
	} else {
+4 −6
Original line number Diff line number Diff line
@@ -293,12 +293,9 @@ int amd_context_entity_fini(struct amd_gpu_scheduler *sched,
 * @sched	The pointer to the scheduler
 * @c_entity    The pointer to amd_context_entity
 * @job		The pointer to job required to submit
 * return 0 if succeed. -1 if failed.
 *        -2 indicate queue is full for this client, client should wait untill
 *	     scheduler consum some queued command.
 *	  -1 other fail.
 * return the virtual sequence number
*/
int amd_sched_push_job(struct amd_gpu_scheduler *sched,
uint64_t amd_sched_push_job(struct amd_gpu_scheduler *sched,
		       struct amd_context_entity *c_entity,
		       void *job)
{
@@ -312,7 +309,8 @@ int amd_sched_push_job(struct amd_gpu_scheduler *sched,
	}

	wake_up_interruptible(&sched->wait_queue);
	return 0;

	return atomic64_inc_return(&c_entity->last_queued_v_seq);
}

/**
+1 −1
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ struct amd_gpu_scheduler *amd_sched_create(void *device,

int amd_sched_destroy(struct amd_gpu_scheduler *sched);

int amd_sched_push_job(struct amd_gpu_scheduler *sched,
uint64_t amd_sched_push_job(struct amd_gpu_scheduler *sched,
		       struct amd_context_entity *c_entity,
		       void *job);