|
@@ -1734,30 +1734,31 @@ static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring, void *sr
|
|
unsigned occupied, chunk1, chunk2;
|
|
unsigned occupied, chunk1, chunk2;
|
|
void *dst;
|
|
void *dst;
|
|
|
|
|
|
- if (ring->count_dw < count_dw) {
|
|
|
|
|
|
+ if (unlikely(ring->count_dw < count_dw)) {
|
|
DRM_ERROR("amdgpu: writing more dwords to the ring than expected!\n");
|
|
DRM_ERROR("amdgpu: writing more dwords to the ring than expected!\n");
|
|
- } else {
|
|
|
|
- occupied = ring->wptr & ring->buf_mask;
|
|
|
|
- dst = (void *)&ring->ring[occupied];
|
|
|
|
- chunk1 = ring->buf_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;
|
|
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ occupied = ring->wptr & ring->buf_mask;
|
|
|
|
+ dst = (void *)&ring->ring[occupied];
|
|
|
|
+ chunk1 = ring->buf_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 *
|
|
static inline struct amdgpu_sdma_instance *
|