aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2013-12-09 19:44:30 -0500
committerAlex Deucher <alexander.deucher@amd.com>2013-12-24 18:01:10 -0500
commitea31bf697d27270188a93cd78cf9de4bc968aca3 (patch)
treea77d4b86d59b55824e01d73a617f62aa6e28d6c1
parente308b1d375d2fa5389316683ff52f3d9043bf1b8 (diff)
drm/radeon: remove generic rptr/wptr functions (v2)
Fill in asic family specific versions rather than using the generic version. This lets us handle asic specific differences more easily. In this case, we disable sw swapping of the rtpr writeback value on r6xx+ since the hw does it for us. Fixes bogus rptr readback on BE systems. v2: remove missed cpu_to_le32(), add comments Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/cik.c56
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c69
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c3
-rw-r--r--drivers/gpu/drm/radeon/ni.c69
-rw-r--r--drivers/gpu/drm/radeon/ni_dma.c69
-rw-r--r--drivers/gpu/drm/radeon/r100.c31
-rw-r--r--drivers/gpu/drm/radeon/r600.c32
-rw-r--r--drivers/gpu/drm/radeon/r600_dma.c13
-rw-r--r--drivers/gpu/drm/radeon/radeon.h4
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.c66
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h57
-rw-r--r--drivers/gpu/drm/radeon/radeon_ring.c44
-rw-r--r--drivers/gpu/drm/radeon/rv770.c3
-rw-r--r--drivers/gpu/drm/radeon/si.c8
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
4018u32 cik_compute_ring_get_rptr(struct radeon_device *rdev, 4018u32 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
4031u32 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
4041void 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
4048u32 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
4038u32 cik_compute_ring_get_wptr(struct radeon_device *rdev, 4066u32 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
4056void cik_compute_ring_set_wptr(struct radeon_device *rdev, 4085void 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 */
62uint32_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 */
89uint32_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 */
110void 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
1389u32 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
1408u32 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
1423void 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
1389static int cayman_cp_load_microcode(struct radeon_device *rdev) 1438static 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 */
53uint32_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 */
80uint32_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 */
101void 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
1053u32 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
1066u32 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
1076void 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
1053static void r100_cp_load_microcode(struct radeon_device *rdev) 1083static 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
2385u32 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
2398u32 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
2408void 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
2385static int r600_cp_load_microcode(struct radeon_device *rdev) 2415static 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);
51uint32_t r600_dma_get_rptr(struct radeon_device *rdev, 51uint32_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,
65uint32_t r600_dma_get_wptr(struct radeon_device *rdev, 72uint32_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,
79void r600_dma_set_wptr(struct radeon_device *rdev, 86void 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
955int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, 953int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring,
956 unsigned size, uint32_t *data); 954 unsigned size, uint32_t *data);
957int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size, 955int 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);
959void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *cp); 957void 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
190static struct radeon_asic r100_asic = { 190static 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
338static struct radeon_asic r300_asic = { 338static 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
891static struct radeon_asic_ring r600_dma_ring = { 891static 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
1278static struct radeon_asic_ring evergreen_dma_ring = { 1278static 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
1584static struct radeon_asic_ring cayman_dma_ring = { 1584static 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
1599static struct radeon_asic_ring cayman_uvd_ring = { 1599static 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
1829static struct radeon_asic_ring si_dma_ring = { 1829static 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
1844static struct radeon_asic si_asic = { 1844static 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
1960static struct radeon_asic_ring ci_cp_ring = { 1960static 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
1975static struct radeon_asic_ring ci_dma_ring = { 1975static 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
1990static struct radeon_asic ci_asic = { 1990static 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);
47void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); 47void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level);
48u8 radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder); 48u8 radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder);
49 49
50u32 radeon_ring_generic_get_rptr(struct radeon_device *rdev,
51 struct radeon_ring *ring);
52u32 radeon_ring_generic_get_wptr(struct radeon_device *rdev,
53 struct radeon_ring *ring);
54void 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);
148extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc); 141extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc);
149extern int r100_mc_wait_for_idle(struct radeon_device *rdev); 142extern int r100_mc_wait_for_idle(struct radeon_device *rdev);
150 143
144u32 r100_gfx_get_rptr(struct radeon_device *rdev,
145 struct radeon_ring *ring);
146u32 r100_gfx_get_wptr(struct radeon_device *rdev,
147 struct radeon_ring *ring);
148void 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);
368int r600_pcie_gart_init(struct radeon_device *rdev); 368int r600_pcie_gart_init(struct radeon_device *rdev);
369void r600_scratch_init(struct radeon_device *rdev); 369void r600_scratch_init(struct radeon_device *rdev);
370int r600_init_microcode(struct radeon_device *rdev); 370int r600_init_microcode(struct radeon_device *rdev);
371u32 r600_gfx_get_rptr(struct radeon_device *rdev,
372 struct radeon_ring *ring);
373u32 r600_gfx_get_wptr(struct radeon_device *rdev,
374 struct radeon_ring *ring);
375void r600_gfx_set_wptr(struct radeon_device *rdev,
376 struct radeon_ring *ring);
371/* r600 irq */ 377/* r600 irq */
372int r600_irq_process(struct radeon_device *rdev); 378int r600_irq_process(struct radeon_device *rdev);
373int r600_irq_init(struct radeon_device *rdev); 379int r600_irq_init(struct radeon_device *rdev);
@@ -594,6 +600,19 @@ void cayman_dma_vm_set_page(struct radeon_device *rdev,
594 600
595void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 601void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
596 602
603u32 cayman_gfx_get_rptr(struct radeon_device *rdev,
604 struct radeon_ring *ring);
605u32 cayman_gfx_get_wptr(struct radeon_device *rdev,
606 struct radeon_ring *ring);
607void cayman_gfx_set_wptr(struct radeon_device *rdev,
608 struct radeon_ring *ring);
609uint32_t cayman_dma_get_rptr(struct radeon_device *rdev,
610 struct radeon_ring *ring);
611uint32_t cayman_dma_get_wptr(struct radeon_device *rdev,
612 struct radeon_ring *ring);
613void cayman_dma_set_wptr(struct radeon_device *rdev,
614 struct radeon_ring *ring);
615
597int ni_dpm_init(struct radeon_device *rdev); 616int ni_dpm_init(struct radeon_device *rdev);
598void ni_dpm_setup_asic(struct radeon_device *rdev); 617void ni_dpm_setup_asic(struct radeon_device *rdev);
599int ni_dpm_enable(struct radeon_device *rdev); 618int 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);
745void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm); 764void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
746int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib); 765int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib);
747u32 cik_compute_ring_get_rptr(struct radeon_device *rdev, 766u32 cik_gfx_get_rptr(struct radeon_device *rdev,
748 struct radeon_ring *ring); 767 struct radeon_ring *ring);
749u32 cik_compute_ring_get_wptr(struct radeon_device *rdev, 768u32 cik_gfx_get_wptr(struct radeon_device *rdev,
750 struct radeon_ring *ring); 769 struct radeon_ring *ring);
751void cik_compute_ring_set_wptr(struct radeon_device *rdev, 770void cik_gfx_set_wptr(struct radeon_device *rdev,
752 struct radeon_ring *ring); 771 struct radeon_ring *ring);
772u32 cik_compute_get_rptr(struct radeon_device *rdev,
773 struct radeon_ring *ring);
774u32 cik_compute_get_wptr(struct radeon_device *rdev,
775 struct radeon_ring *ring);
776void cik_compute_set_wptr(struct radeon_device *rdev,
777 struct radeon_ring *ring);
778u32 cik_sdma_get_rptr(struct radeon_device *rdev,
779 struct radeon_ring *ring);
780u32 cik_sdma_get_wptr(struct radeon_device *rdev,
781 struct radeon_ring *ring);
782void cik_sdma_set_wptr(struct radeon_device *rdev,
783 struct radeon_ring *ring);
753int ci_get_temp(struct radeon_device *rdev); 784int ci_get_temp(struct radeon_device *rdev);
754int kv_get_temp(struct radeon_device *rdev); 785int 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
335u32 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
348u32 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
358void 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 */
699int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size, 667int 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);