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

Commit 220907d9 authored by Christian König's avatar Christian König
Browse files

drm/radeon: rework ring syncing code



Move inter ring syncing with semaphores into the
existing ring allocations, with that we need to
lock the ring mutex only once.

Signed-off-by: default avatarChristian König <deathsimple@vodafone.de>
Reviewed-by: default avatarJerome Glisse <jglisse@redhat.com>
parent 68e250b7
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -622,7 +622,8 @@ int evergreen_blit_init(struct radeon_device *rdev)
	rdev->r600_blit.primitives.draw_auto = draw_auto;
	rdev->r600_blit.primitives.set_default_state = set_default_state;

	rdev->r600_blit.ring_size_common = 55; /* shaders + def state */
	rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
	rdev->r600_blit.ring_size_common += 55; /* shaders + def state */
	rdev->r600_blit.ring_size_common += 16; /* fence emit for VB IB */
	rdev->r600_blit.ring_size_common += 5; /* done copy */
	rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
+3 −2
Original line number Diff line number Diff line
@@ -2311,15 +2311,16 @@ int r600_copy_blit(struct radeon_device *rdev,
		   unsigned num_gpu_pages,
		   struct radeon_fence **fence)
{
	struct radeon_semaphore *sem = NULL;
	struct radeon_sa_bo *vb = NULL;
	int r;

	r = r600_blit_prepare_copy(rdev, num_gpu_pages, &vb);
	r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, &vb, &sem);
	if (r) {
		return r;
	}
	r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
	r600_blit_done_copy(rdev, fence, vb);
	r600_blit_done_copy(rdev, fence, vb, sem);
	return 0;
}

+21 −3
Original line number Diff line number Diff line
@@ -512,7 +512,8 @@ int r600_blit_init(struct radeon_device *rdev)
	rdev->r600_blit.primitives.draw_auto = draw_auto;
	rdev->r600_blit.primitives.set_default_state = set_default_state;

	rdev->r600_blit.ring_size_common = 40; /* shaders + def state */
	rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
	rdev->r600_blit.ring_size_common += 40; /* shaders + def state */
	rdev->r600_blit.ring_size_common += 5; /* done copy */
	rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */

@@ -666,7 +667,8 @@ static unsigned r600_blit_create_rect(unsigned num_gpu_pages,


int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
			   struct radeon_sa_bo **vb)
			   struct radeon_fence **fence, struct radeon_sa_bo **vb,
			   struct radeon_semaphore **sem)
{
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
	int r;
@@ -689,22 +691,37 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
		return r;
	}

	r = radeon_semaphore_create(rdev, sem);
	if (r) {
		radeon_sa_bo_free(rdev, vb, NULL);
		return r;
	}

	/* calculate number of loops correctly */
	ring_size = num_loops * dwords_per_loop;
	ring_size += rdev->r600_blit.ring_size_common;
	r = radeon_ring_lock(rdev, ring, ring_size);
	if (r) {
		radeon_sa_bo_free(rdev, vb, NULL);
		radeon_semaphore_free(rdev, sem, NULL);
		return r;
	}

	if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
		radeon_semaphore_sync_rings(rdev, *sem, (*fence)->ring,
					    RADEON_RING_TYPE_GFX_INDEX);
		radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
	} else {
		radeon_semaphore_free(rdev, sem, NULL);
	}

	rdev->r600_blit.primitives.set_default_state(rdev);
	rdev->r600_blit.primitives.set_shaders(rdev);
	return 0;
}

void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence **fence,
			 struct radeon_sa_bo *vb)
			 struct radeon_sa_bo *vb, struct radeon_semaphore *sem)
{
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
	int r;
@@ -717,6 +734,7 @@ void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence **fence

	radeon_ring_unlock_commit(rdev, ring);
	radeon_sa_bo_free(rdev, &vb, *fence);
	radeon_semaphore_free(rdev, &sem, *fence);
}

void r600_kms_blit_copy(struct radeon_device *rdev,
+3 −3
Original line number Diff line number Diff line
@@ -470,10 +470,9 @@ void radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring,
				struct radeon_semaphore *semaphore);
int radeon_semaphore_sync_rings(struct radeon_device *rdev,
				struct radeon_semaphore *semaphore,
				bool sync_to[RADEON_NUM_RINGS],
				int dst_ring);
				int signaler, int waiter);
void radeon_semaphore_free(struct radeon_device *rdev,
			   struct radeon_semaphore *semaphore,
			   struct radeon_semaphore **semaphore,
			   struct radeon_fence *fence);

/*
@@ -653,6 +652,7 @@ struct radeon_ib {
	struct radeon_fence		*fence;
	unsigned			vm_id;
	bool				is_const_ib;
	struct radeon_fence		*sync_to[RADEON_NUM_RINGS];
	struct radeon_semaphore		*semaphore;
};

+3 −2
Original line number Diff line number Diff line
@@ -363,9 +363,10 @@ int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder);
void r600_hdmi_update_audio_settings(struct drm_encoder *encoder);
/* r600 blit */
int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
			   struct radeon_sa_bo **vb);
			   struct radeon_fence **fence, struct radeon_sa_bo **vb,
			   struct radeon_semaphore **sem);
void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence **fence,
			 struct radeon_sa_bo *vb);
			 struct radeon_sa_bo *vb, struct radeon_semaphore *sem);
void r600_kms_blit_copy(struct radeon_device *rdev,
			u64 src_gpu_addr, u64 dst_gpu_addr,
			unsigned num_gpu_pages,
Loading