aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);