|
@@ -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)
|
|
|
{
|