提交 30eb77f4 编写于 作者: J Jerome Glisse 提交者: Dave Airlie

drm/radeon: precompute fence cpu/gpu addr once v3

Add a start fence driver helper function which will be call
once for each ring and will compute cpu/gpu addr for fence
depending on wether to use wb buffer or scratch reg.

This patch replace initialize fence driver separately which
was broken in regard of GPU lockup. The fence list for created,
emited, signaled must be initialize once and only from the
asic init callback not from the startup call back which is
call from the gpu reset.

v2: With this in place we no longer need to know the number of
    rings in fence_driver_init, also writing to the scratch reg
    before knowing its offset is a bad idea.

v3: rebase on top of change to previous patch in the serie
Signed-off-by: NChristian König <deathsimple@vodafone.de>
Signed-off-by: NJerome Glisse <jglisse@redhat.com>
Signed-off-by: NDave Airlie <airlied@redhat.com>
上级 af9720f4
...@@ -3111,6 +3111,12 @@ static int evergreen_startup(struct radeon_device *rdev) ...@@ -3111,6 +3111,12 @@ static int evergreen_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r = r600_irq_init(rdev); r = r600_irq_init(rdev);
if (r) { if (r) {
...@@ -3229,7 +3235,7 @@ int evergreen_init(struct radeon_device *rdev) ...@@ -3229,7 +3235,7 @@ int evergreen_init(struct radeon_device *rdev)
/* Initialize clocks */ /* Initialize clocks */
radeon_get_clock_info(rdev->ddev); radeon_get_clock_info(rdev->ddev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
/* initialize AGP */ /* initialize AGP */
......
...@@ -1384,6 +1384,24 @@ static int cayman_startup(struct radeon_device *rdev) ...@@ -1384,6 +1384,24 @@ static int cayman_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r = r600_irq_init(rdev); r = r600_irq_init(rdev);
if (r) { if (r) {
...@@ -1492,7 +1510,7 @@ int cayman_init(struct radeon_device *rdev) ...@@ -1492,7 +1510,7 @@ int cayman_init(struct radeon_device *rdev)
/* Initialize clocks */ /* Initialize clocks */
radeon_get_clock_info(rdev->ddev); radeon_get_clock_info(rdev->ddev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 3); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
/* initialize memory controller */ /* initialize memory controller */
......
...@@ -3916,6 +3916,12 @@ static int r100_startup(struct radeon_device *rdev) ...@@ -3916,6 +3916,12 @@ static int r100_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r100_irq_set(rdev); r100_irq_set(rdev);
rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -4059,7 +4065,7 @@ int r100_init(struct radeon_device *rdev) ...@@ -4059,7 +4065,7 @@ int r100_init(struct radeon_device *rdev)
/* initialize VRAM */ /* initialize VRAM */
r100_mc_init(rdev); r100_mc_init(rdev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
r = radeon_irq_kms_init(rdev); r = radeon_irq_kms_init(rdev);
......
...@@ -1399,6 +1399,12 @@ static int r300_startup(struct radeon_device *rdev) ...@@ -1399,6 +1399,12 @@ static int r300_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r100_irq_set(rdev); r100_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -1521,7 +1527,7 @@ int r300_init(struct radeon_device *rdev) ...@@ -1521,7 +1527,7 @@ int r300_init(struct radeon_device *rdev)
/* initialize memory controller */ /* initialize memory controller */
r300_mc_init(rdev); r300_mc_init(rdev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
r = radeon_irq_kms_init(rdev); r = radeon_irq_kms_init(rdev);
......
...@@ -258,6 +258,12 @@ static int r420_startup(struct radeon_device *rdev) ...@@ -258,6 +258,12 @@ static int r420_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r100_irq_set(rdev); r100_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -391,7 +397,7 @@ int r420_init(struct radeon_device *rdev) ...@@ -391,7 +397,7 @@ int r420_init(struct radeon_device *rdev)
r300_mc_init(rdev); r300_mc_init(rdev);
r420_debugfs(rdev); r420_debugfs(rdev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) { if (r) {
return r; return r;
} }
......
...@@ -187,6 +187,12 @@ static int r520_startup(struct radeon_device *rdev) ...@@ -187,6 +187,12 @@ static int r520_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
rs600_irq_set(rdev); rs600_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -278,7 +284,7 @@ int r520_init(struct radeon_device *rdev) ...@@ -278,7 +284,7 @@ int r520_init(struct radeon_device *rdev)
r520_mc_init(rdev); r520_mc_init(rdev);
rv515_debugfs(rdev); rv515_debugfs(rdev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
r = radeon_irq_kms_init(rdev); r = radeon_irq_kms_init(rdev);
......
...@@ -2313,8 +2313,7 @@ void r600_fence_ring_emit(struct radeon_device *rdev, ...@@ -2313,8 +2313,7 @@ void r600_fence_ring_emit(struct radeon_device *rdev,
struct radeon_ring *ring = &rdev->ring[fence->ring]; struct radeon_ring *ring = &rdev->ring[fence->ring];
if (rdev->wb.use_event) { if (rdev->wb.use_event) {
u64 addr = rdev->wb.gpu_addr + R600_WB_EVENT_OFFSET + u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
(u64)(rdev->fence_drv[fence->ring].scratch_reg - rdev->scratch.reg_base);
/* flush read cache over gart */ /* flush read cache over gart */
radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | radeon_ring_write(ring, PACKET3_TC_ACTION_ENA |
...@@ -2459,6 +2458,12 @@ int r600_startup(struct radeon_device *rdev) ...@@ -2459,6 +2458,12 @@ int r600_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r = r600_irq_init(rdev); r = r600_irq_init(rdev);
if (r) { if (r) {
...@@ -2589,7 +2594,7 @@ int r600_init(struct radeon_device *rdev) ...@@ -2589,7 +2594,7 @@ int r600_init(struct radeon_device *rdev)
/* Initialize clocks */ /* Initialize clocks */
radeon_get_clock_info(rdev->ddev); radeon_get_clock_info(rdev->ddev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
if (rdev->flags & RADEON_IS_AGP) { if (rdev->flags & RADEON_IS_AGP) {
......
...@@ -192,6 +192,8 @@ extern int sumo_get_temp(struct radeon_device *rdev); ...@@ -192,6 +192,8 @@ extern int sumo_get_temp(struct radeon_device *rdev);
*/ */
struct radeon_fence_driver { struct radeon_fence_driver {
uint32_t scratch_reg; uint32_t scratch_reg;
uint64_t gpu_addr;
volatile uint32_t *cpu_addr;
atomic_t seq; atomic_t seq;
uint32_t last_seq; uint32_t last_seq;
unsigned long last_jiffies; unsigned long last_jiffies;
...@@ -215,7 +217,8 @@ struct radeon_fence { ...@@ -215,7 +217,8 @@ struct radeon_fence {
int ring; int ring;
}; };
int radeon_fence_driver_init(struct radeon_device *rdev, int num_rings); int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring);
int radeon_fence_driver_init(struct radeon_device *rdev);
void radeon_fence_driver_fini(struct radeon_device *rdev); void radeon_fence_driver_fini(struct radeon_device *rdev);
int radeon_fence_create(struct radeon_device *rdev, struct radeon_fence **fence, int ring); int radeon_fence_create(struct radeon_device *rdev, struct radeon_fence **fence, int ring);
int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence); int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence);
......
...@@ -42,35 +42,22 @@ ...@@ -42,35 +42,22 @@
static void radeon_fence_write(struct radeon_device *rdev, u32 seq, int ring) static void radeon_fence_write(struct radeon_device *rdev, u32 seq, int ring)
{ {
u32 scratch_index;
if (rdev->wb.enabled) { if (rdev->wb.enabled) {
if (rdev->wb.use_event) *rdev->fence_drv[ring].cpu_addr = cpu_to_le32(seq);
scratch_index = R600_WB_EVENT_OFFSET + } else {
rdev->fence_drv[ring].scratch_reg - rdev->scratch.reg_base;
else
scratch_index = RADEON_WB_SCRATCH_OFFSET +
rdev->fence_drv[ring].scratch_reg - rdev->scratch.reg_base;
rdev->wb.wb[scratch_index/4] = cpu_to_le32(seq);
} else
WREG32(rdev->fence_drv[ring].scratch_reg, seq); WREG32(rdev->fence_drv[ring].scratch_reg, seq);
}
} }
static u32 radeon_fence_read(struct radeon_device *rdev, int ring) static u32 radeon_fence_read(struct radeon_device *rdev, int ring)
{ {
u32 seq = 0; u32 seq = 0;
u32 scratch_index;
if (rdev->wb.enabled) { if (rdev->wb.enabled) {
if (rdev->wb.use_event) seq = le32_to_cpu(*rdev->fence_drv[ring].cpu_addr);
scratch_index = R600_WB_EVENT_OFFSET + } else {
rdev->fence_drv[ring].scratch_reg - rdev->scratch.reg_base;
else
scratch_index = RADEON_WB_SCRATCH_OFFSET +
rdev->fence_drv[ring].scratch_reg - rdev->scratch.reg_base;
seq = le32_to_cpu(rdev->wb.wb[scratch_index/4]);
} else
seq = RREG32(rdev->fence_drv[ring].scratch_reg); seq = RREG32(rdev->fence_drv[ring].scratch_reg);
}
return seq; return seq;
} }
...@@ -389,36 +376,61 @@ int radeon_fence_count_emitted(struct radeon_device *rdev, int ring) ...@@ -389,36 +376,61 @@ int radeon_fence_count_emitted(struct radeon_device *rdev, int ring)
return not_processed; return not_processed;
} }
int radeon_fence_driver_init(struct radeon_device *rdev, int num_rings) int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring)
{ {
unsigned long irq_flags; unsigned long irq_flags;
int r, ring; uint64_t index;
int r;
for (ring = 0; ring < num_rings; ring++) {
write_lock_irqsave(&rdev->fence_lock, irq_flags); write_lock_irqsave(&rdev->fence_lock, irq_flags);
radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg);
if (rdev->wb.use_event) {
rdev->fence_drv[ring].scratch_reg = 0;
index = R600_WB_EVENT_OFFSET + ring * 4;
} else {
r = radeon_scratch_get(rdev, &rdev->fence_drv[ring].scratch_reg); r = radeon_scratch_get(rdev, &rdev->fence_drv[ring].scratch_reg);
if (r) { if (r) {
dev_err(rdev->dev, "fence failed to get scratch register\n"); dev_err(rdev->dev, "fence failed to get scratch register\n");
write_unlock_irqrestore(&rdev->fence_lock, irq_flags); write_unlock_irqrestore(&rdev->fence_lock, irq_flags);
return r; return r;
} }
radeon_fence_write(rdev, 0, ring); index = RADEON_WB_SCRATCH_OFFSET +
atomic_set(&rdev->fence_drv[ring].seq, 0); rdev->fence_drv[ring].scratch_reg -
INIT_LIST_HEAD(&rdev->fence_drv[ring].created); rdev->scratch.reg_base;
INIT_LIST_HEAD(&rdev->fence_drv[ring].emitted); }
INIT_LIST_HEAD(&rdev->fence_drv[ring].signaled); rdev->fence_drv[ring].cpu_addr = &rdev->wb.wb[index/4];
init_waitqueue_head(&rdev->fence_drv[ring].queue); rdev->fence_drv[ring].gpu_addr = rdev->wb.gpu_addr + index;
radeon_fence_write(rdev, atomic_read(&rdev->fence_drv[ring].seq), ring);
rdev->fence_drv[ring].initialized = true; rdev->fence_drv[ring].initialized = true;
DRM_INFO("fence driver on ring %d use gpu addr 0x%08Lx and cpu addr 0x%p\n",
ring, rdev->fence_drv[ring].gpu_addr, rdev->fence_drv[ring].cpu_addr);
write_unlock_irqrestore(&rdev->fence_lock, irq_flags); write_unlock_irqrestore(&rdev->fence_lock, irq_flags);
} return 0;
for (ring = num_rings; ring < RADEON_NUM_RINGS; ring++) { }
write_lock_irqsave(&rdev->fence_lock, irq_flags);
static void radeon_fence_driver_init_ring(struct radeon_device *rdev, int ring)
{
rdev->fence_drv[ring].scratch_reg = -1;
rdev->fence_drv[ring].cpu_addr = NULL;
rdev->fence_drv[ring].gpu_addr = 0;
atomic_set(&rdev->fence_drv[ring].seq, 0);
INIT_LIST_HEAD(&rdev->fence_drv[ring].created); INIT_LIST_HEAD(&rdev->fence_drv[ring].created);
INIT_LIST_HEAD(&rdev->fence_drv[ring].emitted); INIT_LIST_HEAD(&rdev->fence_drv[ring].emitted);
INIT_LIST_HEAD(&rdev->fence_drv[ring].signaled); INIT_LIST_HEAD(&rdev->fence_drv[ring].signaled);
init_waitqueue_head(&rdev->fence_drv[ring].queue);
rdev->fence_drv[ring].initialized = false; rdev->fence_drv[ring].initialized = false;
write_unlock_irqrestore(&rdev->fence_lock, irq_flags); }
int radeon_fence_driver_init(struct radeon_device *rdev)
{
unsigned long irq_flags;
int ring;
write_lock_irqsave(&rdev->fence_lock, irq_flags);
for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
radeon_fence_driver_init_ring(rdev, ring);
} }
write_unlock_irqrestore(&rdev->fence_lock, irq_flags);
if (radeon_debugfs_fence_init(rdev)) { if (radeon_debugfs_fence_init(rdev)) {
dev_err(rdev->dev, "fence debugfs file creation failed\n"); dev_err(rdev->dev, "fence debugfs file creation failed\n");
} }
...@@ -433,6 +445,7 @@ void radeon_fence_driver_fini(struct radeon_device *rdev) ...@@ -433,6 +445,7 @@ void radeon_fence_driver_fini(struct radeon_device *rdev)
for (ring = 0; ring < RADEON_NUM_RINGS; ring++) { for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
if (!rdev->fence_drv[ring].initialized) if (!rdev->fence_drv[ring].initialized)
continue; continue;
radeon_fence_wait_last(rdev, ring);
wake_up_all(&rdev->fence_drv[ring].queue); wake_up_all(&rdev->fence_drv[ring].queue);
write_lock_irqsave(&rdev->fence_lock, irq_flags); write_lock_irqsave(&rdev->fence_lock, irq_flags);
radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg); radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg);
......
...@@ -410,6 +410,12 @@ static int rs400_startup(struct radeon_device *rdev) ...@@ -410,6 +410,12 @@ static int rs400_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r100_irq_set(rdev); r100_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -516,7 +522,7 @@ int rs400_init(struct radeon_device *rdev) ...@@ -516,7 +522,7 @@ int rs400_init(struct radeon_device *rdev)
/* initialize memory controller */ /* initialize memory controller */
rs400_mc_init(rdev); rs400_mc_init(rdev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
r = radeon_irq_kms_init(rdev); r = radeon_irq_kms_init(rdev);
......
...@@ -849,6 +849,12 @@ static int rs600_startup(struct radeon_device *rdev) ...@@ -849,6 +849,12 @@ static int rs600_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
rs600_irq_set(rdev); rs600_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -962,7 +968,7 @@ int rs600_init(struct radeon_device *rdev) ...@@ -962,7 +968,7 @@ int rs600_init(struct radeon_device *rdev)
rs600_mc_init(rdev); rs600_mc_init(rdev);
rs600_debugfs(rdev); rs600_debugfs(rdev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
r = radeon_irq_kms_init(rdev); r = radeon_irq_kms_init(rdev);
......
...@@ -621,6 +621,12 @@ static int rs690_startup(struct radeon_device *rdev) ...@@ -621,6 +621,12 @@ static int rs690_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
rs600_irq_set(rdev); rs600_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -735,7 +741,7 @@ int rs690_init(struct radeon_device *rdev) ...@@ -735,7 +741,7 @@ int rs690_init(struct radeon_device *rdev)
rs690_mc_init(rdev); rs690_mc_init(rdev);
rv515_debugfs(rdev); rv515_debugfs(rdev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
r = radeon_irq_kms_init(rdev); r = radeon_irq_kms_init(rdev);
......
...@@ -393,6 +393,12 @@ static int rv515_startup(struct radeon_device *rdev) ...@@ -393,6 +393,12 @@ static int rv515_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
rs600_irq_set(rdev); rs600_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
...@@ -511,7 +517,7 @@ int rv515_init(struct radeon_device *rdev) ...@@ -511,7 +517,7 @@ int rv515_init(struct radeon_device *rdev)
rv515_mc_init(rdev); rv515_mc_init(rdev);
rv515_debugfs(rdev); rv515_debugfs(rdev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
r = radeon_irq_kms_init(rdev); r = radeon_irq_kms_init(rdev);
......
...@@ -1083,6 +1083,12 @@ static int rv770_startup(struct radeon_device *rdev) ...@@ -1083,6 +1083,12 @@ static int rv770_startup(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
return r;
}
/* Enable IRQ */ /* Enable IRQ */
r = r600_irq_init(rdev); r = r600_irq_init(rdev);
if (r) { if (r) {
...@@ -1196,7 +1202,7 @@ int rv770_init(struct radeon_device *rdev) ...@@ -1196,7 +1202,7 @@ int rv770_init(struct radeon_device *rdev)
/* Initialize clocks */ /* Initialize clocks */
radeon_get_clock_info(rdev->ddev); radeon_get_clock_info(rdev->ddev);
/* Fence driver */ /* Fence driver */
r = radeon_fence_driver_init(rdev, 1); r = radeon_fence_driver_init(rdev);
if (r) if (r)
return r; return r;
/* initialize AGP */ /* initialize AGP */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册