diff options
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 56 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/cik_sdma.c | 69 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 69 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni_dma.c | 69 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 31 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 32 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600_dma.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.c | 66 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 57 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 44 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 8 |
14 files changed, 391 insertions, 133 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 25a6ef6c7e4c..e66eb4745347 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -4015,15 +4015,43 @@ static int cik_cp_gfx_resume(struct radeon_device *rdev) | |||
4015 | return 0; | 4015 | return 0; |
4016 | } | 4016 | } |
4017 | 4017 | ||
4018 | u32 cik_compute_ring_get_rptr(struct radeon_device *rdev, | 4018 | u32 cik_gfx_get_rptr(struct radeon_device *rdev, |
4019 | struct radeon_ring *ring) | 4019 | struct radeon_ring *ring) |
4020 | { | 4020 | { |
4021 | u32 rptr; | 4021 | u32 rptr; |
4022 | 4022 | ||
4023 | if (rdev->wb.enabled) | ||
4024 | rptr = rdev->wb.wb[ring->rptr_offs/4]; | ||
4025 | else | ||
4026 | rptr = RREG32(CP_RB0_RPTR); | ||
4027 | |||
4028 | return rptr; | ||
4029 | } | ||
4030 | |||
4031 | u32 cik_gfx_get_wptr(struct radeon_device *rdev, | ||
4032 | struct radeon_ring *ring) | ||
4033 | { | ||
4034 | u32 wptr; | ||
4035 | |||
4036 | wptr = RREG32(CP_RB0_WPTR); | ||
4023 | 4037 | ||
4038 | return wptr; | ||
4039 | } | ||
4040 | |||
4041 | void cik_gfx_set_wptr(struct radeon_device *rdev, | ||
4042 | struct radeon_ring *ring) | ||
4043 | { | ||
4044 | WREG32(CP_RB0_WPTR, ring->wptr); | ||
4045 | (void)RREG32(CP_RB0_WPTR); | ||
4046 | } | ||
4047 | |||
4048 | u32 cik_compute_get_rptr(struct radeon_device *rdev, | ||
4049 | struct radeon_ring *ring) | ||
4050 | { | ||
4051 | u32 rptr; | ||
4024 | 4052 | ||
4025 | if (rdev->wb.enabled) { | 4053 | if (rdev->wb.enabled) { |
4026 | rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]); | 4054 | rptr = rdev->wb.wb[ring->rptr_offs/4]; |
4027 | } else { | 4055 | } else { |
4028 | mutex_lock(&rdev->srbm_mutex); | 4056 | mutex_lock(&rdev->srbm_mutex); |
4029 | cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0); | 4057 | cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0); |
@@ -4035,13 +4063,14 @@ u32 cik_compute_ring_get_rptr(struct radeon_device *rdev, | |||
4035 | return rptr; | 4063 | return rptr; |
4036 | } | 4064 | } |
4037 | 4065 | ||
4038 | u32 cik_compute_ring_get_wptr(struct radeon_device *rdev, | 4066 | u32 cik_compute_get_wptr(struct radeon_device *rdev, |
4039 | struct radeon_ring *ring) | 4067 | struct radeon_ring *ring) |
4040 | { | 4068 | { |
4041 | u32 wptr; | 4069 | u32 wptr; |
4042 | 4070 | ||
4043 | if (rdev->wb.enabled) { | 4071 | if (rdev->wb.enabled) { |
4044 | wptr = le32_to_cpu(rdev->wb.wb[ring->wptr_offs/4]); | 4072 | /* XXX check if swapping is necessary on BE */ |
4073 | wptr = rdev->wb.wb[ring->wptr_offs/4]; | ||
4045 | } else { | 4074 | } else { |
4046 | mutex_lock(&rdev->srbm_mutex); | 4075 | mutex_lock(&rdev->srbm_mutex); |
4047 | cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0); | 4076 | cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0); |
@@ -4053,10 +4082,11 @@ u32 cik_compute_ring_get_wptr(struct radeon_device *rdev, | |||
4053 | return wptr; | 4082 | return wptr; |
4054 | } | 4083 | } |
4055 | 4084 | ||
4056 | void cik_compute_ring_set_wptr(struct radeon_device *rdev, | 4085 | void cik_compute_set_wptr(struct radeon_device *rdev, |
4057 | struct radeon_ring *ring) | 4086 | struct radeon_ring *ring) |
4058 | { | 4087 | { |
4059 | rdev->wb.wb[ring->wptr_offs/4] = cpu_to_le32(ring->wptr); | 4088 | /* XXX check if swapping is necessary on BE */ |
4089 | rdev->wb.wb[ring->wptr_offs/4] = ring->wptr; | ||
4060 | WDOORBELL32(ring->doorbell_index, ring->wptr); | 4090 | WDOORBELL32(ring->doorbell_index, ring->wptr); |
4061 | } | 4091 | } |
4062 | 4092 | ||
@@ -7606,7 +7636,6 @@ static int cik_startup(struct radeon_device *rdev) | |||
7606 | 7636 | ||
7607 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | 7637 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
7608 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, | 7638 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, |
7609 | CP_RB0_RPTR, CP_RB0_WPTR, | ||
7610 | PACKET3(PACKET3_NOP, 0x3FFF)); | 7639 | PACKET3(PACKET3_NOP, 0x3FFF)); |
7611 | if (r) | 7640 | if (r) |
7612 | return r; | 7641 | return r; |
@@ -7615,7 +7644,6 @@ static int cik_startup(struct radeon_device *rdev) | |||
7615 | /* type-2 packets are deprecated on MEC, use type-3 instead */ | 7644 | /* type-2 packets are deprecated on MEC, use type-3 instead */ |
7616 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; | 7645 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; |
7617 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET, | 7646 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET, |
7618 | CP_HQD_PQ_RPTR, CP_HQD_PQ_WPTR, | ||
7619 | PACKET3(PACKET3_NOP, 0x3FFF)); | 7647 | PACKET3(PACKET3_NOP, 0x3FFF)); |
7620 | if (r) | 7648 | if (r) |
7621 | return r; | 7649 | return r; |
@@ -7627,7 +7655,6 @@ static int cik_startup(struct radeon_device *rdev) | |||
7627 | /* type-2 packets are deprecated on MEC, use type-3 instead */ | 7655 | /* type-2 packets are deprecated on MEC, use type-3 instead */ |
7628 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; | 7656 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; |
7629 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET, | 7657 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET, |
7630 | CP_HQD_PQ_RPTR, CP_HQD_PQ_WPTR, | ||
7631 | PACKET3(PACKET3_NOP, 0x3FFF)); | 7658 | PACKET3(PACKET3_NOP, 0x3FFF)); |
7632 | if (r) | 7659 | if (r) |
7633 | return r; | 7660 | return r; |
@@ -7639,16 +7666,12 @@ static int cik_startup(struct radeon_device *rdev) | |||
7639 | 7666 | ||
7640 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; | 7667 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; |
7641 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, | 7668 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, |
7642 | SDMA0_GFX_RB_RPTR + SDMA0_REGISTER_OFFSET, | ||
7643 | SDMA0_GFX_RB_WPTR + SDMA0_REGISTER_OFFSET, | ||
7644 | SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0)); | 7669 | SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0)); |
7645 | if (r) | 7670 | if (r) |
7646 | return r; | 7671 | return r; |
7647 | 7672 | ||
7648 | ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; | 7673 | ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; |
7649 | r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, | 7674 | r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, |
7650 | SDMA0_GFX_RB_RPTR + SDMA1_REGISTER_OFFSET, | ||
7651 | SDMA0_GFX_RB_WPTR + SDMA1_REGISTER_OFFSET, | ||
7652 | SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0)); | 7675 | SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0)); |
7653 | if (r) | 7676 | if (r) |
7654 | return r; | 7677 | return r; |
@@ -7664,7 +7687,6 @@ static int cik_startup(struct radeon_device *rdev) | |||
7664 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; | 7687 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; |
7665 | if (ring->ring_size) { | 7688 | if (ring->ring_size) { |
7666 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, | 7689 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, |
7667 | UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, | ||
7668 | RADEON_CP_PACKET2); | 7690 | RADEON_CP_PACKET2); |
7669 | if (!r) | 7691 | if (!r) |
7670 | r = uvd_v1_0_init(rdev); | 7692 | r = uvd_v1_0_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index 0300727a4f70..f0f9e1089409 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
@@ -52,6 +52,75 @@ u32 cik_gpu_check_soft_reset(struct radeon_device *rdev); | |||
52 | */ | 52 | */ |
53 | 53 | ||
54 | /** | 54 | /** |
55 | * cik_sdma_get_rptr - get the current read pointer | ||
56 | * | ||
57 | * @rdev: radeon_device pointer | ||
58 | * @ring: radeon ring pointer | ||
59 | * | ||
60 | * Get the current rptr from the hardware (CIK+). | ||
61 | */ | ||
62 | uint32_t cik_sdma_get_rptr(struct radeon_device *rdev, | ||
63 | struct radeon_ring *ring) | ||
64 | { | ||
65 | u32 rptr, reg; | ||
66 | |||
67 | if (rdev->wb.enabled) { | ||
68 | rptr = rdev->wb.wb[ring->rptr_offs/4]; | ||
69 | } else { | ||
70 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) | ||
71 | reg = SDMA0_GFX_RB_RPTR + SDMA0_REGISTER_OFFSET; | ||
72 | else | ||
73 | reg = SDMA0_GFX_RB_RPTR + SDMA1_REGISTER_OFFSET; | ||
74 | |||
75 | rptr = RREG32(reg); | ||
76 | } | ||
77 | |||
78 | return (rptr & 0x3fffc) >> 2; | ||
79 | } | ||
80 | |||
81 | /** | ||
82 | * cik_sdma_get_wptr - get the current write pointer | ||
83 | * | ||
84 | * @rdev: radeon_device pointer | ||
85 | * @ring: radeon ring pointer | ||
86 | * | ||
87 | * Get the current wptr from the hardware (CIK+). | ||
88 | */ | ||
89 | uint32_t cik_sdma_get_wptr(struct radeon_device *rdev, | ||
90 | struct radeon_ring *ring) | ||
91 | { | ||
92 | u32 reg; | ||
93 | |||
94 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) | ||
95 | reg = SDMA0_GFX_RB_WPTR + SDMA0_REGISTER_OFFSET; | ||
96 | else | ||
97 | reg = SDMA0_GFX_RB_WPTR + SDMA1_REGISTER_OFFSET; | ||
98 | |||
99 | return (RREG32(reg) & 0x3fffc) >> 2; | ||
100 | } | ||
101 | |||
102 | /** | ||
103 | * cik_sdma_set_wptr - commit the write pointer | ||
104 | * | ||
105 | * @rdev: radeon_device pointer | ||
106 | * @ring: radeon ring pointer | ||
107 | * | ||
108 | * Write the wptr back to the hardware (CIK+). | ||
109 | */ | ||
110 | void cik_sdma_set_wptr(struct radeon_device *rdev, | ||
111 | struct radeon_ring *ring) | ||
112 | { | ||
113 | u32 reg; | ||
114 | |||
115 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) | ||
116 | reg = SDMA0_GFX_RB_WPTR + SDMA0_REGISTER_OFFSET; | ||
117 | else | ||
118 | reg = SDMA0_GFX_RB_WPTR + SDMA1_REGISTER_OFFSET; | ||
119 | |||
120 | WREG32(reg, (ring->wptr << 2) & 0x3fffc); | ||
121 | } | ||
122 | |||
123 | /** | ||
55 | * cik_sdma_ring_ib_execute - Schedule an IB on the DMA engine | 124 | * cik_sdma_ring_ib_execute - Schedule an IB on the DMA engine |
56 | * | 125 | * |
57 | * @rdev: radeon_device pointer | 126 | * @rdev: radeon_device pointer |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 594a3d7abcf8..21d975007037 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -5184,14 +5184,12 @@ static int evergreen_startup(struct radeon_device *rdev) | |||
5184 | 5184 | ||
5185 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | 5185 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
5186 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, | 5186 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, |
5187 | R600_CP_RB_RPTR, R600_CP_RB_WPTR, | ||
5188 | RADEON_CP_PACKET2); | 5187 | RADEON_CP_PACKET2); |
5189 | if (r) | 5188 | if (r) |
5190 | return r; | 5189 | return r; |
5191 | 5190 | ||
5192 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; | 5191 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; |
5193 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, | 5192 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, |
5194 | DMA_RB_RPTR, DMA_RB_WPTR, | ||
5195 | DMA_PACKET(DMA_PACKET_NOP, 0, 0)); | 5193 | DMA_PACKET(DMA_PACKET_NOP, 0, 0)); |
5196 | if (r) | 5194 | if (r) |
5197 | return r; | 5195 | return r; |
@@ -5209,7 +5207,6 @@ static int evergreen_startup(struct radeon_device *rdev) | |||
5209 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; | 5207 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; |
5210 | if (ring->ring_size) { | 5208 | if (ring->ring_size) { |
5211 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, | 5209 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, |
5212 | UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, | ||
5213 | RADEON_CP_PACKET2); | 5210 | RADEON_CP_PACKET2); |
5214 | if (!r) | 5211 | if (!r) |
5215 | r = uvd_v1_0_init(rdev); | 5212 | r = uvd_v1_0_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 494ba006e8b1..05a900945613 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -1386,6 +1386,55 @@ static void cayman_cp_enable(struct radeon_device *rdev, bool enable) | |||
1386 | } | 1386 | } |
1387 | } | 1387 | } |
1388 | 1388 | ||
1389 | u32 cayman_gfx_get_rptr(struct radeon_device *rdev, | ||
1390 | struct radeon_ring *ring) | ||
1391 | { | ||
1392 | u32 rptr; | ||
1393 | |||
1394 | if (rdev->wb.enabled) | ||
1395 | rptr = rdev->wb.wb[ring->rptr_offs/4]; | ||
1396 | else { | ||
1397 | if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) | ||
1398 | rptr = RREG32(CP_RB0_RPTR); | ||
1399 | else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) | ||
1400 | rptr = RREG32(CP_RB1_RPTR); | ||
1401 | else | ||
1402 | rptr = RREG32(CP_RB2_RPTR); | ||
1403 | } | ||
1404 | |||
1405 | return rptr; | ||
1406 | } | ||
1407 | |||
1408 | u32 cayman_gfx_get_wptr(struct radeon_device *rdev, | ||
1409 | struct radeon_ring *ring) | ||
1410 | { | ||
1411 | u32 wptr; | ||
1412 | |||
1413 | if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) | ||
1414 | wptr = RREG32(CP_RB0_WPTR); | ||
1415 | else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) | ||
1416 | wptr = RREG32(CP_RB1_WPTR); | ||
1417 | else | ||
1418 | wptr = RREG32(CP_RB2_WPTR); | ||
1419 | |||
1420 | return wptr; | ||
1421 | } | ||
1422 | |||
1423 | void cayman_gfx_set_wptr(struct radeon_device *rdev, | ||
1424 | struct radeon_ring *ring) | ||
1425 | { | ||
1426 | if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) { | ||
1427 | WREG32(CP_RB0_WPTR, ring->wptr); | ||
1428 | (void)RREG32(CP_RB0_WPTR); | ||
1429 | } else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) { | ||
1430 | WREG32(CP_RB1_WPTR, ring->wptr); | ||
1431 | (void)RREG32(CP_RB1_WPTR); | ||
1432 | } else { | ||
1433 | WREG32(CP_RB2_WPTR, ring->wptr); | ||
1434 | (void)RREG32(CP_RB2_WPTR); | ||
1435 | } | ||
1436 | } | ||
1437 | |||
1389 | static int cayman_cp_load_microcode(struct radeon_device *rdev) | 1438 | static int cayman_cp_load_microcode(struct radeon_device *rdev) |
1390 | { | 1439 | { |
1391 | const __be32 *fw_data; | 1440 | const __be32 *fw_data; |
@@ -1514,6 +1563,16 @@ static int cayman_cp_resume(struct radeon_device *rdev) | |||
1514 | CP_RB1_BASE, | 1563 | CP_RB1_BASE, |
1515 | CP_RB2_BASE | 1564 | CP_RB2_BASE |
1516 | }; | 1565 | }; |
1566 | static const unsigned cp_rb_rptr[] = { | ||
1567 | CP_RB0_RPTR, | ||
1568 | CP_RB1_RPTR, | ||
1569 | CP_RB2_RPTR | ||
1570 | }; | ||
1571 | static const unsigned cp_rb_wptr[] = { | ||
1572 | CP_RB0_WPTR, | ||
1573 | CP_RB1_WPTR, | ||
1574 | CP_RB2_WPTR | ||
1575 | }; | ||
1517 | struct radeon_ring *ring; | 1576 | struct radeon_ring *ring; |
1518 | int i, r; | 1577 | int i, r; |
1519 | 1578 | ||
@@ -1572,8 +1631,8 @@ static int cayman_cp_resume(struct radeon_device *rdev) | |||
1572 | WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA); | 1631 | WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA); |
1573 | 1632 | ||
1574 | ring->rptr = ring->wptr = 0; | 1633 | ring->rptr = ring->wptr = 0; |
1575 | WREG32(ring->rptr_reg, ring->rptr); | 1634 | WREG32(cp_rb_rptr[i], ring->rptr); |
1576 | WREG32(ring->wptr_reg, ring->wptr); | 1635 | WREG32(cp_rb_wptr[i], ring->wptr); |
1577 | 1636 | ||
1578 | mdelay(1); | 1637 | mdelay(1); |
1579 | WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA); | 1638 | WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA); |
@@ -1953,23 +2012,18 @@ static int cayman_startup(struct radeon_device *rdev) | |||
1953 | evergreen_irq_set(rdev); | 2012 | evergreen_irq_set(rdev); |
1954 | 2013 | ||
1955 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, | 2014 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, |
1956 | CP_RB0_RPTR, CP_RB0_WPTR, | ||
1957 | RADEON_CP_PACKET2); | 2015 | RADEON_CP_PACKET2); |
1958 | if (r) | 2016 | if (r) |
1959 | return r; | 2017 | return r; |
1960 | 2018 | ||
1961 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; | 2019 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; |
1962 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, | 2020 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, |
1963 | DMA_RB_RPTR + DMA0_REGISTER_OFFSET, | ||
1964 | DMA_RB_WPTR + DMA0_REGISTER_OFFSET, | ||
1965 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); | 2021 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); |
1966 | if (r) | 2022 | if (r) |
1967 | return r; | 2023 | return r; |
1968 | 2024 | ||
1969 | ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; | 2025 | ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; |
1970 | r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, | 2026 | r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, |
1971 | DMA_RB_RPTR + DMA1_REGISTER_OFFSET, | ||
1972 | DMA_RB_WPTR + DMA1_REGISTER_OFFSET, | ||
1973 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); | 2027 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); |
1974 | if (r) | 2028 | if (r) |
1975 | return r; | 2029 | return r; |
@@ -1988,7 +2042,6 @@ static int cayman_startup(struct radeon_device *rdev) | |||
1988 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; | 2042 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; |
1989 | if (ring->ring_size) { | 2043 | if (ring->ring_size) { |
1990 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, | 2044 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, |
1991 | UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, | ||
1992 | RADEON_CP_PACKET2); | 2045 | RADEON_CP_PACKET2); |
1993 | if (!r) | 2046 | if (!r) |
1994 | r = uvd_v1_0_init(rdev); | 2047 | r = uvd_v1_0_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/ni_dma.c b/drivers/gpu/drm/radeon/ni_dma.c index bdeb65ed3658..51424ab79432 100644 --- a/drivers/gpu/drm/radeon/ni_dma.c +++ b/drivers/gpu/drm/radeon/ni_dma.c | |||
@@ -43,6 +43,75 @@ u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev); | |||
43 | */ | 43 | */ |
44 | 44 | ||
45 | /** | 45 | /** |
46 | * cayman_dma_get_rptr - get the current read pointer | ||
47 | * | ||
48 | * @rdev: radeon_device pointer | ||
49 | * @ring: radeon ring pointer | ||
50 | * | ||
51 | * Get the current rptr from the hardware (cayman+). | ||
52 | */ | ||
53 | uint32_t cayman_dma_get_rptr(struct radeon_device *rdev, | ||
54 | struct radeon_ring *ring) | ||
55 | { | ||
56 | u32 rptr, reg; | ||
57 | |||
58 | if (rdev->wb.enabled) { | ||
59 | rptr = rdev->wb.wb[ring->rptr_offs/4]; | ||
60 | } else { | ||
61 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) | ||
62 | reg = DMA_RB_RPTR + DMA0_REGISTER_OFFSET; | ||
63 | else | ||
64 | reg = DMA_RB_RPTR + DMA1_REGISTER_OFFSET; | ||
65 | |||
66 | rptr = RREG32(reg); | ||
67 | } | ||
68 | |||
69 | return (rptr & 0x3fffc) >> 2; | ||
70 | } | ||
71 | |||
72 | /** | ||
73 | * cayman_dma_get_wptr - get the current write pointer | ||
74 | * | ||
75 | * @rdev: radeon_device pointer | ||
76 | * @ring: radeon ring pointer | ||
77 | * | ||
78 | * Get the current wptr from the hardware (cayman+). | ||
79 | */ | ||
80 | uint32_t cayman_dma_get_wptr(struct radeon_device *rdev, | ||
81 | struct radeon_ring *ring) | ||
82 | { | ||
83 | u32 reg; | ||
84 | |||
85 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) | ||
86 | reg = DMA_RB_WPTR + DMA0_REGISTER_OFFSET; | ||
87 | else | ||
88 | reg = DMA_RB_WPTR + DMA1_REGISTER_OFFSET; | ||
89 | |||
90 | return (RREG32(reg) & 0x3fffc) >> 2; | ||
91 | } | ||
92 | |||
93 | /** | ||
94 | * cayman_dma_set_wptr - commit the write pointer | ||
95 | * | ||
96 | * @rdev: radeon_device pointer | ||
97 | * @ring: radeon ring pointer | ||
98 | * | ||
99 | * Write the wptr back to the hardware (cayman+). | ||
100 | */ | ||
101 | void cayman_dma_set_wptr(struct radeon_device *rdev, | ||
102 | struct radeon_ring *ring) | ||
103 | { | ||
104 | u32 reg; | ||
105 | |||
106 | if (ring->idx == R600_RING_TYPE_DMA_INDEX) | ||
107 | reg = DMA_RB_WPTR + DMA0_REGISTER_OFFSET; | ||
108 | else | ||
109 | reg = DMA_RB_WPTR + DMA1_REGISTER_OFFSET; | ||
110 | |||
111 | WREG32(reg, (ring->wptr << 2) & 0x3fffc); | ||
112 | } | ||
113 | |||
114 | /** | ||
46 | * cayman_dma_ring_ib_execute - Schedule an IB on the DMA engine | 115 | * cayman_dma_ring_ib_execute - Schedule an IB on the DMA engine |
47 | * | 116 | * |
48 | * @rdev: radeon_device pointer | 117 | * @rdev: radeon_device pointer |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 526d2aa7d70f..ef024ce3f7cc 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -1050,6 +1050,36 @@ static int r100_cp_init_microcode(struct radeon_device *rdev) | |||
1050 | return err; | 1050 | return err; |
1051 | } | 1051 | } |
1052 | 1052 | ||
1053 | u32 r100_gfx_get_rptr(struct radeon_device *rdev, | ||
1054 | struct radeon_ring *ring) | ||
1055 | { | ||
1056 | u32 rptr; | ||
1057 | |||
1058 | if (rdev->wb.enabled) | ||
1059 | rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]); | ||
1060 | else | ||
1061 | rptr = RREG32(RADEON_CP_RB_RPTR); | ||
1062 | |||
1063 | return rptr; | ||
1064 | } | ||
1065 | |||
1066 | u32 r100_gfx_get_wptr(struct radeon_device *rdev, | ||
1067 | struct radeon_ring *ring) | ||
1068 | { | ||
1069 | u32 wptr; | ||
1070 | |||
1071 | wptr = RREG32(RADEON_CP_RB_WPTR); | ||
1072 | |||
1073 | return wptr; | ||
1074 | } | ||
1075 | |||
1076 | void r100_gfx_set_wptr(struct radeon_device *rdev, | ||
1077 | struct radeon_ring *ring) | ||
1078 | { | ||
1079 | WREG32(RADEON_CP_RB_WPTR, ring->wptr); | ||
1080 | (void)RREG32(RADEON_CP_RB_WPTR); | ||
1081 | } | ||
1082 | |||
1053 | static void r100_cp_load_microcode(struct radeon_device *rdev) | 1083 | static void r100_cp_load_microcode(struct radeon_device *rdev) |
1054 | { | 1084 | { |
1055 | const __be32 *fw_data; | 1085 | const __be32 *fw_data; |
@@ -1102,7 +1132,6 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) | |||
1102 | ring_size = (1 << (rb_bufsz + 1)) * 4; | 1132 | ring_size = (1 << (rb_bufsz + 1)) * 4; |
1103 | r100_cp_load_microcode(rdev); | 1133 | r100_cp_load_microcode(rdev); |
1104 | r = radeon_ring_init(rdev, ring, ring_size, RADEON_WB_CP_RPTR_OFFSET, | 1134 | r = radeon_ring_init(rdev, ring, ring_size, RADEON_WB_CP_RPTR_OFFSET, |
1105 | RADEON_CP_RB_RPTR, RADEON_CP_RB_WPTR, | ||
1106 | RADEON_CP_PACKET2); | 1135 | RADEON_CP_PACKET2); |
1107 | if (r) { | 1136 | if (r) { |
1108 | return r; | 1137 | return r; |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index d05611aba134..bf0792cf0729 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2382,6 +2382,36 @@ out: | |||
2382 | return err; | 2382 | return err; |
2383 | } | 2383 | } |
2384 | 2384 | ||
2385 | u32 r600_gfx_get_rptr(struct radeon_device *rdev, | ||
2386 | struct radeon_ring *ring) | ||
2387 | { | ||
2388 | u32 rptr; | ||
2389 | |||
2390 | if (rdev->wb.enabled) | ||
2391 | rptr = rdev->wb.wb[ring->rptr_offs/4]; | ||
2392 | else | ||
2393 | rptr = RREG32(R600_CP_RB_RPTR); | ||
2394 | |||
2395 | return rptr; | ||
2396 | } | ||
2397 | |||
2398 | u32 r600_gfx_get_wptr(struct radeon_device *rdev, | ||
2399 | struct radeon_ring *ring) | ||
2400 | { | ||
2401 | u32 wptr; | ||
2402 | |||
2403 | wptr = RREG32(R600_CP_RB_WPTR); | ||
2404 | |||
2405 | return wptr; | ||
2406 | } | ||
2407 | |||
2408 | void r600_gfx_set_wptr(struct radeon_device *rdev, | ||
2409 | struct radeon_ring *ring) | ||
2410 | { | ||
2411 | WREG32(R600_CP_RB_WPTR, ring->wptr); | ||
2412 | (void)RREG32(R600_CP_RB_WPTR); | ||
2413 | } | ||
2414 | |||
2385 | static int r600_cp_load_microcode(struct radeon_device *rdev) | 2415 | static int r600_cp_load_microcode(struct radeon_device *rdev) |
2386 | { | 2416 | { |
2387 | const __be32 *fw_data; | 2417 | const __be32 *fw_data; |
@@ -2818,14 +2848,12 @@ static int r600_startup(struct radeon_device *rdev) | |||
2818 | 2848 | ||
2819 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | 2849 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
2820 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, | 2850 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, |
2821 | R600_CP_RB_RPTR, R600_CP_RB_WPTR, | ||
2822 | RADEON_CP_PACKET2); | 2851 | RADEON_CP_PACKET2); |
2823 | if (r) | 2852 | if (r) |
2824 | return r; | 2853 | return r; |
2825 | 2854 | ||
2826 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; | 2855 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; |
2827 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, | 2856 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, |
2828 | DMA_RB_RPTR, DMA_RB_WPTR, | ||
2829 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); | 2857 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); |
2830 | if (r) | 2858 | if (r) |
2831 | return r; | 2859 | return r; |
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c index 7844d15c139f..3452c8410bd7 100644 --- a/drivers/gpu/drm/radeon/r600_dma.c +++ b/drivers/gpu/drm/radeon/r600_dma.c | |||
@@ -51,7 +51,14 @@ u32 r600_gpu_check_soft_reset(struct radeon_device *rdev); | |||
51 | uint32_t r600_dma_get_rptr(struct radeon_device *rdev, | 51 | uint32_t r600_dma_get_rptr(struct radeon_device *rdev, |
52 | struct radeon_ring *ring) | 52 | struct radeon_ring *ring) |
53 | { | 53 | { |
54 | return (radeon_ring_generic_get_rptr(rdev, ring) & 0x3fffc) >> 2; | 54 | u32 rptr; |
55 | |||
56 | if (rdev->wb.enabled) | ||
57 | rptr = rdev->wb.wb[ring->rptr_offs/4]; | ||
58 | else | ||
59 | rptr = RREG32(DMA_RB_RPTR); | ||
60 | |||
61 | return (rptr & 0x3fffc) >> 2; | ||
55 | } | 62 | } |
56 | 63 | ||
57 | /** | 64 | /** |
@@ -65,7 +72,7 @@ uint32_t r600_dma_get_rptr(struct radeon_device *rdev, | |||
65 | uint32_t r600_dma_get_wptr(struct radeon_device *rdev, | 72 | uint32_t r600_dma_get_wptr(struct radeon_device *rdev, |
66 | struct radeon_ring *ring) | 73 | struct radeon_ring *ring) |
67 | { | 74 | { |
68 | return (RREG32(ring->wptr_reg) & 0x3fffc) >> 2; | 75 | return (RREG32(DMA_RB_WPTR) & 0x3fffc) >> 2; |
69 | } | 76 | } |
70 | 77 | ||
71 | /** | 78 | /** |
@@ -79,7 +86,7 @@ uint32_t r600_dma_get_wptr(struct radeon_device *rdev, | |||
79 | void r600_dma_set_wptr(struct radeon_device *rdev, | 86 | void r600_dma_set_wptr(struct radeon_device *rdev, |
80 | struct radeon_ring *ring) | 87 | struct radeon_ring *ring) |
81 | { | 88 | { |
82 | WREG32(ring->wptr_reg, (ring->wptr << 2) & 0x3fffc); | 89 | WREG32(DMA_RB_WPTR, (ring->wptr << 2) & 0x3fffc); |
83 | } | 90 | } |
84 | 91 | ||
85 | /** | 92 | /** |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 869465aafbc5..ba74aad25226 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -785,13 +785,11 @@ struct radeon_ring { | |||
785 | volatile uint32_t *ring; | 785 | volatile uint32_t *ring; |
786 | unsigned rptr; | 786 | unsigned rptr; |
787 | unsigned rptr_offs; | 787 | unsigned rptr_offs; |
788 | unsigned rptr_reg; | ||
789 | unsigned rptr_save_reg; | 788 | unsigned rptr_save_reg; |
790 | u64 next_rptr_gpu_addr; | 789 | u64 next_rptr_gpu_addr; |
791 | volatile u32 *next_rptr_cpu_addr; | 790 | volatile u32 *next_rptr_cpu_addr; |
792 | unsigned wptr; | 791 | unsigned wptr; |
793 | unsigned wptr_old; | 792 | unsigned wptr_old; |
794 | unsigned wptr_reg; | ||
795 | unsigned ring_size; | 793 | unsigned ring_size; |
796 | unsigned ring_free_dw; | 794 | unsigned ring_free_dw; |
797 | int count_dw; | 795 | int count_dw; |
@@ -955,7 +953,7 @@ unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring | |||
955 | int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, | 953 | int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, |
956 | unsigned size, uint32_t *data); | 954 | unsigned size, uint32_t *data); |
957 | int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size, | 955 | int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size, |
958 | unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg, u32 nop); | 956 | unsigned rptr_offs, u32 nop); |
959 | void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *cp); | 957 | void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *cp); |
960 | 958 | ||
961 | 959 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index db8117af1c2d..f55879dd11c6 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
@@ -182,9 +182,9 @@ static struct radeon_asic_ring r100_gfx_ring = { | |||
182 | .ring_test = &r100_ring_test, | 182 | .ring_test = &r100_ring_test, |
183 | .ib_test = &r100_ib_test, | 183 | .ib_test = &r100_ib_test, |
184 | .is_lockup = &r100_gpu_is_lockup, | 184 | .is_lockup = &r100_gpu_is_lockup, |
185 | .get_rptr = &radeon_ring_generic_get_rptr, | 185 | .get_rptr = &r100_gfx_get_rptr, |
186 | .get_wptr = &radeon_ring_generic_get_wptr, | 186 | .get_wptr = &r100_gfx_get_wptr, |
187 | .set_wptr = &radeon_ring_generic_set_wptr, | 187 | .set_wptr = &r100_gfx_set_wptr, |
188 | }; | 188 | }; |
189 | 189 | ||
190 | static struct radeon_asic r100_asic = { | 190 | static struct radeon_asic r100_asic = { |
@@ -330,9 +330,9 @@ static struct radeon_asic_ring r300_gfx_ring = { | |||
330 | .ring_test = &r100_ring_test, | 330 | .ring_test = &r100_ring_test, |
331 | .ib_test = &r100_ib_test, | 331 | .ib_test = &r100_ib_test, |
332 | .is_lockup = &r100_gpu_is_lockup, | 332 | .is_lockup = &r100_gpu_is_lockup, |
333 | .get_rptr = &radeon_ring_generic_get_rptr, | 333 | .get_rptr = &r100_gfx_get_rptr, |
334 | .get_wptr = &radeon_ring_generic_get_wptr, | 334 | .get_wptr = &r100_gfx_get_wptr, |
335 | .set_wptr = &radeon_ring_generic_set_wptr, | 335 | .set_wptr = &r100_gfx_set_wptr, |
336 | }; | 336 | }; |
337 | 337 | ||
338 | static struct radeon_asic r300_asic = { | 338 | static struct radeon_asic r300_asic = { |
@@ -883,9 +883,9 @@ static struct radeon_asic_ring r600_gfx_ring = { | |||
883 | .ring_test = &r600_ring_test, | 883 | .ring_test = &r600_ring_test, |
884 | .ib_test = &r600_ib_test, | 884 | .ib_test = &r600_ib_test, |
885 | .is_lockup = &r600_gfx_is_lockup, | 885 | .is_lockup = &r600_gfx_is_lockup, |
886 | .get_rptr = &radeon_ring_generic_get_rptr, | 886 | .get_rptr = &r600_gfx_get_rptr, |
887 | .get_wptr = &radeon_ring_generic_get_wptr, | 887 | .get_wptr = &r600_gfx_get_wptr, |
888 | .set_wptr = &radeon_ring_generic_set_wptr, | 888 | .set_wptr = &r600_gfx_set_wptr, |
889 | }; | 889 | }; |
890 | 890 | ||
891 | static struct radeon_asic_ring r600_dma_ring = { | 891 | static struct radeon_asic_ring r600_dma_ring = { |
@@ -1270,9 +1270,9 @@ static struct radeon_asic_ring evergreen_gfx_ring = { | |||
1270 | .ring_test = &r600_ring_test, | 1270 | .ring_test = &r600_ring_test, |
1271 | .ib_test = &r600_ib_test, | 1271 | .ib_test = &r600_ib_test, |
1272 | .is_lockup = &evergreen_gfx_is_lockup, | 1272 | .is_lockup = &evergreen_gfx_is_lockup, |
1273 | .get_rptr = &radeon_ring_generic_get_rptr, | 1273 | .get_rptr = &r600_gfx_get_rptr, |
1274 | .get_wptr = &radeon_ring_generic_get_wptr, | 1274 | .get_wptr = &r600_gfx_get_wptr, |
1275 | .set_wptr = &radeon_ring_generic_set_wptr, | 1275 | .set_wptr = &r600_gfx_set_wptr, |
1276 | }; | 1276 | }; |
1277 | 1277 | ||
1278 | static struct radeon_asic_ring evergreen_dma_ring = { | 1278 | static struct radeon_asic_ring evergreen_dma_ring = { |
@@ -1576,9 +1576,9 @@ static struct radeon_asic_ring cayman_gfx_ring = { | |||
1576 | .ib_test = &r600_ib_test, | 1576 | .ib_test = &r600_ib_test, |
1577 | .is_lockup = &cayman_gfx_is_lockup, | 1577 | .is_lockup = &cayman_gfx_is_lockup, |
1578 | .vm_flush = &cayman_vm_flush, | 1578 | .vm_flush = &cayman_vm_flush, |
1579 | .get_rptr = &radeon_ring_generic_get_rptr, | 1579 | .get_rptr = &cayman_gfx_get_rptr, |
1580 | .get_wptr = &radeon_ring_generic_get_wptr, | 1580 | .get_wptr = &cayman_gfx_get_wptr, |
1581 | .set_wptr = &radeon_ring_generic_set_wptr, | 1581 | .set_wptr = &cayman_gfx_set_wptr, |
1582 | }; | 1582 | }; |
1583 | 1583 | ||
1584 | static struct radeon_asic_ring cayman_dma_ring = { | 1584 | static struct radeon_asic_ring cayman_dma_ring = { |
@@ -1591,9 +1591,9 @@ static struct radeon_asic_ring cayman_dma_ring = { | |||
1591 | .ib_test = &r600_dma_ib_test, | 1591 | .ib_test = &r600_dma_ib_test, |
1592 | .is_lockup = &cayman_dma_is_lockup, | 1592 | .is_lockup = &cayman_dma_is_lockup, |
1593 | .vm_flush = &cayman_dma_vm_flush, | 1593 | .vm_flush = &cayman_dma_vm_flush, |
1594 | .get_rptr = &r600_dma_get_rptr, | 1594 | .get_rptr = &cayman_dma_get_rptr, |
1595 | .get_wptr = &r600_dma_get_wptr, | 1595 | .get_wptr = &cayman_dma_get_wptr, |
1596 | .set_wptr = &r600_dma_set_wptr | 1596 | .set_wptr = &cayman_dma_set_wptr |
1597 | }; | 1597 | }; |
1598 | 1598 | ||
1599 | static struct radeon_asic_ring cayman_uvd_ring = { | 1599 | static struct radeon_asic_ring cayman_uvd_ring = { |
@@ -1821,9 +1821,9 @@ static struct radeon_asic_ring si_gfx_ring = { | |||
1821 | .ib_test = &r600_ib_test, | 1821 | .ib_test = &r600_ib_test, |
1822 | .is_lockup = &si_gfx_is_lockup, | 1822 | .is_lockup = &si_gfx_is_lockup, |
1823 | .vm_flush = &si_vm_flush, | 1823 | .vm_flush = &si_vm_flush, |
1824 | .get_rptr = &radeon_ring_generic_get_rptr, | 1824 | .get_rptr = &cayman_gfx_get_rptr, |
1825 | .get_wptr = &radeon_ring_generic_get_wptr, | 1825 | .get_wptr = &cayman_gfx_get_wptr, |
1826 | .set_wptr = &radeon_ring_generic_set_wptr, | 1826 | .set_wptr = &cayman_gfx_set_wptr, |
1827 | }; | 1827 | }; |
1828 | 1828 | ||
1829 | static struct radeon_asic_ring si_dma_ring = { | 1829 | static struct radeon_asic_ring si_dma_ring = { |
@@ -1836,9 +1836,9 @@ static struct radeon_asic_ring si_dma_ring = { | |||
1836 | .ib_test = &r600_dma_ib_test, | 1836 | .ib_test = &r600_dma_ib_test, |
1837 | .is_lockup = &si_dma_is_lockup, | 1837 | .is_lockup = &si_dma_is_lockup, |
1838 | .vm_flush = &si_dma_vm_flush, | 1838 | .vm_flush = &si_dma_vm_flush, |
1839 | .get_rptr = &r600_dma_get_rptr, | 1839 | .get_rptr = &cayman_dma_get_rptr, |
1840 | .get_wptr = &r600_dma_get_wptr, | 1840 | .get_wptr = &cayman_dma_get_wptr, |
1841 | .set_wptr = &r600_dma_set_wptr, | 1841 | .set_wptr = &cayman_dma_set_wptr, |
1842 | }; | 1842 | }; |
1843 | 1843 | ||
1844 | static struct radeon_asic si_asic = { | 1844 | static struct radeon_asic si_asic = { |
@@ -1952,9 +1952,9 @@ static struct radeon_asic_ring ci_gfx_ring = { | |||
1952 | .ib_test = &cik_ib_test, | 1952 | .ib_test = &cik_ib_test, |
1953 | .is_lockup = &cik_gfx_is_lockup, | 1953 | .is_lockup = &cik_gfx_is_lockup, |
1954 | .vm_flush = &cik_vm_flush, | 1954 | .vm_flush = &cik_vm_flush, |
1955 | .get_rptr = &radeon_ring_generic_get_rptr, | 1955 | .get_rptr = &cik_gfx_get_rptr, |
1956 | .get_wptr = &radeon_ring_generic_get_wptr, | 1956 | .get_wptr = &cik_gfx_get_wptr, |
1957 | .set_wptr = &radeon_ring_generic_set_wptr, | 1957 | .set_wptr = &cik_gfx_set_wptr, |
1958 | }; | 1958 | }; |
1959 | 1959 | ||
1960 | static struct radeon_asic_ring ci_cp_ring = { | 1960 | static struct radeon_asic_ring ci_cp_ring = { |
@@ -1967,9 +1967,9 @@ static struct radeon_asic_ring ci_cp_ring = { | |||
1967 | .ib_test = &cik_ib_test, | 1967 | .ib_test = &cik_ib_test, |
1968 | .is_lockup = &cik_gfx_is_lockup, | 1968 | .is_lockup = &cik_gfx_is_lockup, |
1969 | .vm_flush = &cik_vm_flush, | 1969 | .vm_flush = &cik_vm_flush, |
1970 | .get_rptr = &cik_compute_ring_get_rptr, | 1970 | .get_rptr = &cik_compute_get_rptr, |
1971 | .get_wptr = &cik_compute_ring_get_wptr, | 1971 | .get_wptr = &cik_compute_get_wptr, |
1972 | .set_wptr = &cik_compute_ring_set_wptr, | 1972 | .set_wptr = &cik_compute_set_wptr, |
1973 | }; | 1973 | }; |
1974 | 1974 | ||
1975 | static struct radeon_asic_ring ci_dma_ring = { | 1975 | static struct radeon_asic_ring ci_dma_ring = { |
@@ -1982,9 +1982,9 @@ static struct radeon_asic_ring ci_dma_ring = { | |||
1982 | .ib_test = &cik_sdma_ib_test, | 1982 | .ib_test = &cik_sdma_ib_test, |
1983 | .is_lockup = &cik_sdma_is_lockup, | 1983 | .is_lockup = &cik_sdma_is_lockup, |
1984 | .vm_flush = &cik_dma_vm_flush, | 1984 | .vm_flush = &cik_dma_vm_flush, |
1985 | .get_rptr = &r600_dma_get_rptr, | 1985 | .get_rptr = &cik_sdma_get_rptr, |
1986 | .get_wptr = &r600_dma_get_wptr, | 1986 | .get_wptr = &cik_sdma_get_wptr, |
1987 | .set_wptr = &r600_dma_set_wptr, | 1987 | .set_wptr = &cik_sdma_set_wptr, |
1988 | }; | 1988 | }; |
1989 | 1989 | ||
1990 | static struct radeon_asic ci_asic = { | 1990 | static struct radeon_asic ci_asic = { |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index cb5ca215b11c..b3bc433eed4c 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -47,13 +47,6 @@ u8 atombios_get_backlight_level(struct radeon_encoder *radeon_encoder); | |||
47 | void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); | 47 | void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); |
48 | u8 radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder); | 48 | u8 radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder); |
49 | 49 | ||
50 | u32 radeon_ring_generic_get_rptr(struct radeon_device *rdev, | ||
51 | struct radeon_ring *ring); | ||
52 | u32 radeon_ring_generic_get_wptr(struct radeon_device *rdev, | ||
53 | struct radeon_ring *ring); | ||
54 | void radeon_ring_generic_set_wptr(struct radeon_device *rdev, | ||
55 | struct radeon_ring *ring); | ||
56 | |||
57 | /* | 50 | /* |
58 | * r100,rv100,rs100,rv200,rs200 | 51 | * r100,rv100,rs100,rv200,rs200 |
59 | */ | 52 | */ |
@@ -148,6 +141,13 @@ extern void r100_post_page_flip(struct radeon_device *rdev, int crtc); | |||
148 | extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc); | 141 | extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc); |
149 | extern int r100_mc_wait_for_idle(struct radeon_device *rdev); | 142 | extern int r100_mc_wait_for_idle(struct radeon_device *rdev); |
150 | 143 | ||
144 | u32 r100_gfx_get_rptr(struct radeon_device *rdev, | ||
145 | struct radeon_ring *ring); | ||
146 | u32 r100_gfx_get_wptr(struct radeon_device *rdev, | ||
147 | struct radeon_ring *ring); | ||
148 | void r100_gfx_set_wptr(struct radeon_device *rdev, | ||
149 | struct radeon_ring *ring); | ||
150 | |||
151 | /* | 151 | /* |
152 | * r200,rv250,rs300,rv280 | 152 | * r200,rv250,rs300,rv280 |
153 | */ | 153 | */ |
@@ -368,6 +368,12 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev); | |||
368 | int r600_pcie_gart_init(struct radeon_device *rdev); | 368 | int r600_pcie_gart_init(struct radeon_device *rdev); |
369 | void r600_scratch_init(struct radeon_device *rdev); | 369 | void r600_scratch_init(struct radeon_device *rdev); |
370 | int r600_init_microcode(struct radeon_device *rdev); | 370 | int r600_init_microcode(struct radeon_device *rdev); |
371 | u32 r600_gfx_get_rptr(struct radeon_device *rdev, | ||
372 | struct radeon_ring *ring); | ||
373 | u32 r600_gfx_get_wptr(struct radeon_device *rdev, | ||
374 | struct radeon_ring *ring); | ||
375 | void r600_gfx_set_wptr(struct radeon_device *rdev, | ||
376 | struct radeon_ring *ring); | ||
371 | /* r600 irq */ | 377 | /* r600 irq */ |
372 | int r600_irq_process(struct radeon_device *rdev); | 378 | int r600_irq_process(struct radeon_device *rdev); |
373 | int r600_irq_init(struct radeon_device *rdev); | 379 | int r600_irq_init(struct radeon_device *rdev); |
@@ -594,6 +600,19 @@ void cayman_dma_vm_set_page(struct radeon_device *rdev, | |||
594 | 600 | ||
595 | void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); | 601 | void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); |
596 | 602 | ||
603 | u32 cayman_gfx_get_rptr(struct radeon_device *rdev, | ||
604 | struct radeon_ring *ring); | ||
605 | u32 cayman_gfx_get_wptr(struct radeon_device *rdev, | ||
606 | struct radeon_ring *ring); | ||
607 | void cayman_gfx_set_wptr(struct radeon_device *rdev, | ||
608 | struct radeon_ring *ring); | ||
609 | uint32_t cayman_dma_get_rptr(struct radeon_device *rdev, | ||
610 | struct radeon_ring *ring); | ||
611 | uint32_t cayman_dma_get_wptr(struct radeon_device *rdev, | ||
612 | struct radeon_ring *ring); | ||
613 | void cayman_dma_set_wptr(struct radeon_device *rdev, | ||
614 | struct radeon_ring *ring); | ||
615 | |||
597 | int ni_dpm_init(struct radeon_device *rdev); | 616 | int ni_dpm_init(struct radeon_device *rdev); |
598 | void ni_dpm_setup_asic(struct radeon_device *rdev); | 617 | void ni_dpm_setup_asic(struct radeon_device *rdev); |
599 | int ni_dpm_enable(struct radeon_device *rdev); | 618 | int ni_dpm_enable(struct radeon_device *rdev); |
@@ -744,12 +763,24 @@ void cik_sdma_vm_set_page(struct radeon_device *rdev, | |||
744 | uint32_t incr, uint32_t flags); | 763 | uint32_t incr, uint32_t flags); |
745 | void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); | 764 | void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); |
746 | int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); | 765 | int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); |
747 | u32 cik_compute_ring_get_rptr(struct radeon_device *rdev, | 766 | u32 cik_gfx_get_rptr(struct radeon_device *rdev, |
748 | struct radeon_ring *ring); | 767 | struct radeon_ring *ring); |
749 | u32 cik_compute_ring_get_wptr(struct radeon_device *rdev, | 768 | u32 cik_gfx_get_wptr(struct radeon_device *rdev, |
750 | struct radeon_ring *ring); | 769 | struct radeon_ring *ring); |
751 | void cik_compute_ring_set_wptr(struct radeon_device *rdev, | 770 | void cik_gfx_set_wptr(struct radeon_device *rdev, |
752 | struct radeon_ring *ring); | 771 | struct radeon_ring *ring); |
772 | u32 cik_compute_get_rptr(struct radeon_device *rdev, | ||
773 | struct radeon_ring *ring); | ||
774 | u32 cik_compute_get_wptr(struct radeon_device *rdev, | ||
775 | struct radeon_ring *ring); | ||
776 | void cik_compute_set_wptr(struct radeon_device *rdev, | ||
777 | struct radeon_ring *ring); | ||
778 | u32 cik_sdma_get_rptr(struct radeon_device *rdev, | ||
779 | struct radeon_ring *ring); | ||
780 | u32 cik_sdma_get_wptr(struct radeon_device *rdev, | ||
781 | struct radeon_ring *ring); | ||
782 | void cik_sdma_set_wptr(struct radeon_device *rdev, | ||
783 | struct radeon_ring *ring); | ||
753 | int ci_get_temp(struct radeon_device *rdev); | 784 | int ci_get_temp(struct radeon_device *rdev); |
754 | int kv_get_temp(struct radeon_device *rdev); | 785 | int kv_get_temp(struct radeon_device *rdev); |
755 | 786 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index cc0c9b2a8819..1b783f0e6d3a 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -332,36 +332,6 @@ bool radeon_ring_supports_scratch_reg(struct radeon_device *rdev, | |||
332 | } | 332 | } |
333 | } | 333 | } |
334 | 334 | ||
335 | u32 radeon_ring_generic_get_rptr(struct radeon_device *rdev, | ||
336 | struct radeon_ring *ring) | ||
337 | { | ||
338 | u32 rptr; | ||
339 | |||
340 | if (rdev->wb.enabled) | ||
341 | rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]); | ||
342 | else | ||
343 | rptr = RREG32(ring->rptr_reg); | ||
344 | |||
345 | return rptr; | ||
346 | } | ||
347 | |||
348 | u32 radeon_ring_generic_get_wptr(struct radeon_device *rdev, | ||
349 | struct radeon_ring *ring) | ||
350 | { | ||
351 | u32 wptr; | ||
352 | |||
353 | wptr = RREG32(ring->wptr_reg); | ||
354 | |||
355 | return wptr; | ||
356 | } | ||
357 | |||
358 | void radeon_ring_generic_set_wptr(struct radeon_device *rdev, | ||
359 | struct radeon_ring *ring) | ||
360 | { | ||
361 | WREG32(ring->wptr_reg, ring->wptr); | ||
362 | (void)RREG32(ring->wptr_reg); | ||
363 | } | ||
364 | |||
365 | /** | 335 | /** |
366 | * radeon_ring_free_size - update the free size | 336 | * radeon_ring_free_size - update the free size |
367 | * | 337 | * |
@@ -689,22 +659,18 @@ int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, | |||
689 | * @ring: radeon_ring structure holding ring information | 659 | * @ring: radeon_ring structure holding ring information |
690 | * @ring_size: size of the ring | 660 | * @ring_size: size of the ring |
691 | * @rptr_offs: offset of the rptr writeback location in the WB buffer | 661 | * @rptr_offs: offset of the rptr writeback location in the WB buffer |
692 | * @rptr_reg: MMIO offset of the rptr register | ||
693 | * @wptr_reg: MMIO offset of the wptr register | ||
694 | * @nop: nop packet for this ring | 662 | * @nop: nop packet for this ring |
695 | * | 663 | * |
696 | * Initialize the driver information for the selected ring (all asics). | 664 | * Initialize the driver information for the selected ring (all asics). |
697 | * Returns 0 on success, error on failure. | 665 | * Returns 0 on success, error on failure. |
698 | */ | 666 | */ |
699 | int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size, | 667 | int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size, |
700 | unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg, u32 nop) | 668 | unsigned rptr_offs, u32 nop) |
701 | { | 669 | { |
702 | int r; | 670 | int r; |
703 | 671 | ||
704 | ring->ring_size = ring_size; | 672 | ring->ring_size = ring_size; |
705 | ring->rptr_offs = rptr_offs; | 673 | ring->rptr_offs = rptr_offs; |
706 | ring->rptr_reg = rptr_reg; | ||
707 | ring->wptr_reg = wptr_reg; | ||
708 | ring->nop = nop; | 674 | ring->nop = nop; |
709 | /* Allocate ring buffer */ | 675 | /* Allocate ring buffer */ |
710 | if (ring->ring_obj == NULL) { | 676 | if (ring->ring_obj == NULL) { |
@@ -798,12 +764,12 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data) | |||
798 | count = (ring->ring_size / 4) - ring->ring_free_dw; | 764 | count = (ring->ring_size / 4) - ring->ring_free_dw; |
799 | 765 | ||
800 | wptr = radeon_ring_get_wptr(rdev, ring); | 766 | wptr = radeon_ring_get_wptr(rdev, ring); |
801 | seq_printf(m, "wptr(0x%04x): 0x%08x [%5d]\n", | 767 | seq_printf(m, "wptr: 0x%08x [%5d]\n", |
802 | ring->wptr_reg, wptr, wptr); | 768 | wptr, wptr); |
803 | 769 | ||
804 | rptr = radeon_ring_get_rptr(rdev, ring); | 770 | rptr = radeon_ring_get_rptr(rdev, ring); |
805 | seq_printf(m, "rptr(0x%04x): 0x%08x [%5d]\n", | 771 | seq_printf(m, "rptr: 0x%08x [%5d]\n", |
806 | ring->rptr_reg, rptr, rptr); | 772 | rptr, rptr); |
807 | 773 | ||
808 | if (ring->rptr_save_reg) { | 774 | if (ring->rptr_save_reg) { |
809 | rptr_next = RREG32(ring->rptr_save_reg); | 775 | rptr_next = RREG32(ring->rptr_save_reg); |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 82a6d44586f8..82e06e9a76d2 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -1720,14 +1720,12 @@ static int rv770_startup(struct radeon_device *rdev) | |||
1720 | 1720 | ||
1721 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | 1721 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
1722 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, | 1722 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, |
1723 | R600_CP_RB_RPTR, R600_CP_RB_WPTR, | ||
1724 | RADEON_CP_PACKET2); | 1723 | RADEON_CP_PACKET2); |
1725 | if (r) | 1724 | if (r) |
1726 | return r; | 1725 | return r; |
1727 | 1726 | ||
1728 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; | 1727 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; |
1729 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, | 1728 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, |
1730 | DMA_RB_RPTR, DMA_RB_WPTR, | ||
1731 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); | 1729 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); |
1732 | if (r) | 1730 | if (r) |
1733 | return r; | 1731 | return r; |
@@ -1746,7 +1744,6 @@ static int rv770_startup(struct radeon_device *rdev) | |||
1746 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; | 1744 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; |
1747 | if (ring->ring_size) { | 1745 | if (ring->ring_size) { |
1748 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, | 1746 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, |
1749 | UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, | ||
1750 | RADEON_CP_PACKET2); | 1747 | RADEON_CP_PACKET2); |
1751 | if (!r) | 1748 | if (!r) |
1752 | r = uvd_v1_0_init(rdev); | 1749 | r = uvd_v1_0_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 7619bc6bb242..c698e3fe007a 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -6412,37 +6412,30 @@ static int si_startup(struct radeon_device *rdev) | |||
6412 | 6412 | ||
6413 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | 6413 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
6414 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, | 6414 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, |
6415 | CP_RB0_RPTR, CP_RB0_WPTR, | ||
6416 | RADEON_CP_PACKET2); | 6415 | RADEON_CP_PACKET2); |
6417 | if (r) | 6416 | if (r) |
6418 | return r; | 6417 | return r; |
6419 | 6418 | ||
6420 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; | 6419 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; |
6421 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET, | 6420 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET, |
6422 | CP_RB1_RPTR, CP_RB1_WPTR, | ||
6423 | RADEON_CP_PACKET2); | 6421 | RADEON_CP_PACKET2); |
6424 | if (r) | 6422 | if (r) |
6425 | return r; | 6423 | return r; |
6426 | 6424 | ||
6427 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; | 6425 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; |
6428 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET, | 6426 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET, |
6429 | CP_RB2_RPTR, CP_RB2_WPTR, | ||
6430 | RADEON_CP_PACKET2); | 6427 | RADEON_CP_PACKET2); |
6431 | if (r) | 6428 | if (r) |
6432 | return r; | 6429 | return r; |
6433 | 6430 | ||
6434 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; | 6431 | ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; |
6435 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, | 6432 | r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, |
6436 | DMA_RB_RPTR + DMA0_REGISTER_OFFSET, | ||
6437 | DMA_RB_WPTR + DMA0_REGISTER_OFFSET, | ||
6438 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0)); | 6433 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0)); |
6439 | if (r) | 6434 | if (r) |
6440 | return r; | 6435 | return r; |
6441 | 6436 | ||
6442 | ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; | 6437 | ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; |
6443 | r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, | 6438 | r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, |
6444 | DMA_RB_RPTR + DMA1_REGISTER_OFFSET, | ||
6445 | DMA_RB_WPTR + DMA1_REGISTER_OFFSET, | ||
6446 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0)); | 6439 | DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0)); |
6447 | if (r) | 6440 | if (r) |
6448 | return r; | 6441 | return r; |
@@ -6462,7 +6455,6 @@ static int si_startup(struct radeon_device *rdev) | |||
6462 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; | 6455 | ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; |
6463 | if (ring->ring_size) { | 6456 | if (ring->ring_size) { |
6464 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, | 6457 | r = radeon_ring_init(rdev, ring, ring->ring_size, 0, |
6465 | UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, | ||
6466 | RADEON_CP_PACKET2); | 6458 | RADEON_CP_PACKET2); |
6467 | if (!r) | 6459 | if (!r) |
6468 | r = uvd_v1_0_init(rdev); | 6460 | r = uvd_v1_0_init(rdev); |