Commit 0a8e1473 authored by Monk Liu's avatar Monk Liu Committed by Alex Deucher
Browse files

drm/amdgpu:implement ring_write_multiple



Write multiple dwords to the ring.

Signed-off-by: default avatarMonk Liu <Monk.Liu@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ae65a26d
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -1588,6 +1588,37 @@ static inline void amdgpu_ring_write(struct amdgpu_ring *ring, uint32_t v)
	ring->count_dw--;
}

static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring, void *src, int count_dw)
{
	unsigned occupied, chunk1, chunk2;
	void *dst;

	if (ring->count_dw < count_dw) {
		DRM_ERROR("amdgpu: writing more dwords to the ring than expected!\n");
	} else {
		occupied = ring->wptr & ring->ptr_mask;
		dst = (void *)&ring->ring[occupied];
		chunk1 = ring->ptr_mask + 1 - occupied;
		chunk1 = (chunk1 >= count_dw) ? count_dw: chunk1;
		chunk2 = count_dw - chunk1;
		chunk1 <<= 2;
		chunk2 <<= 2;

		if (chunk1)
			memcpy(dst, src, chunk1);

		if (chunk2) {
			src += chunk1;
			dst = (void *)ring->ring;
			memcpy(dst, src, chunk2);
		}

		ring->wptr += count_dw;
		ring->wptr &= ring->ptr_mask;
		ring->count_dw -= count_dw;
	}
}

static inline struct amdgpu_sdma_instance *
amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
{