drm/radeon: fix fence driver for dma ring when wb is disabled
authorJerome Glisse <jglisse@redhat.com>
Wed, 12 Dec 2012 21:43:15 +0000 (16:43 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 12 Dec 2012 22:16:51 +0000 (17:16 -0500)
The dma ring can't write to register thus have to write to memory
its fence value. This ensure that it doesn't try to use scratch
register for dma ring fence driver.

Should fix:
https://bugs.freedesktop.org/show_bug.cgi?id=58166

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/radeon_fence.c

index a76eca18f134113af33b0e2836d652267f5c2fea..2aaf147969bd8ef80522af9e38900e5987002d4c 100644 (file)
@@ -2533,11 +2533,12 @@ void r600_dma_fence_ring_emit(struct radeon_device *rdev,
 {
        struct radeon_ring *ring = &rdev->ring[fence->ring];
        u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
+
        /* write the fence */
        radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0, 0));
        radeon_ring_write(ring, addr & 0xfffffffc);
        radeon_ring_write(ring, (upper_32_bits(addr) & 0xff));
-       radeon_ring_write(ring, fence->seq);
+       radeon_ring_write(ring, lower_32_bits(fence->seq));
        /* generate an interrupt */
        radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0, 0));
 }
index 22bd6c2c2740b0748dd8413efd22547bfe7493bf..410a975a8eec8f7e042a608cfcea0d7c274f1932 100644 (file)
@@ -772,7 +772,7 @@ int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring)
        int r;
 
        radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg);
-       if (rdev->wb.use_event) {
+       if (rdev->wb.use_event || !radeon_ring_supports_scratch_reg(rdev, &rdev->ring[ring])) {
                rdev->fence_drv[ring].scratch_reg = 0;
                index = R600_WB_EVENT_OFFSET + ring * 4;
        } else {