PCTL0__MMHUB_DEEPSLEEP_IB is 0x69004 on MMHUB 4,1,0 and
and 0x60804 on MMHUB 4,2,0. 0x62a04 is on MMHUB 1,8,0/1.

The DS bits are adjusted to cover more JPEG engines and MMHUB
version.

Signed-off-by: David (Ming Qiang) Wu <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c | 52 +++++++++++++++++++++---
 1 file changed, 46 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c 
b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
index 4b4aa9553624..82abe181c730 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
@@ -736,15 +736,35 @@ static void jpeg_v4_0_3_dec_ring_set_wptr(struct 
amdgpu_ring *ring)
  */
 void jpeg_v4_0_3_dec_ring_insert_start(struct amdgpu_ring *ring)
 {
-       if (!amdgpu_sriov_vf(ring->adev)) {
+       struct amdgpu_device *adev = ring->adev;
+
+       if (!amdgpu_sriov_vf(adev)) {
+               int jpeg_inst = GET_INST(JPEG, ring->me);
+               uint32_t value = 0x80004000; /* default DS14 */
+
                amdgpu_ring_write(ring, 
PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET,
                        0, 0, PACKETJ_TYPE0));
-               amdgpu_ring_write(ring, 0x62a04); /* PCTL0_MMHUB_DEEPSLEEP_IB */
+
+               /* PCTL0__MMHUB_DEEPSLEEP_IB could be different on different 
mmhub version */
+               switch (amdgpu_ip_version(adev, MMHUB_HWIP, 0)) {
+               case IP_VERSION(4, 1, 0):
+                       amdgpu_ring_write(ring, 0x69004);
+                       value = 0x80010000;
+                       break;
+               case IP_VERSION(4, 2, 0):
+                       amdgpu_ring_write(ring, 0x60804);
+                       if (jpeg_inst & 1)
+                               value = 0x80010000;
+                       break;
+               default:
+                       amdgpu_ring_write(ring, 0x62a04);
+                       break;
+               }
 
                amdgpu_ring_write(ring,
                                  PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, 0,
                                          0, PACKETJ_TYPE0));
-               amdgpu_ring_write(ring, 0x80004000);
+               amdgpu_ring_write(ring, value);
        }
 }
 
@@ -757,15 +777,35 @@ void jpeg_v4_0_3_dec_ring_insert_start(struct amdgpu_ring 
*ring)
  */
 void jpeg_v4_0_3_dec_ring_insert_end(struct amdgpu_ring *ring)
 {
-       if (!amdgpu_sriov_vf(ring->adev)) {
+       struct amdgpu_device *adev = ring->adev;
+
+       if (!amdgpu_sriov_vf(adev)) {
+               int jpeg_inst = GET_INST(JPEG, ring->me);
+               uint32_t value = 0x00004000; /* default DS14 */
+
                amdgpu_ring_write(ring, 
PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET,
                        0, 0, PACKETJ_TYPE0));
-               amdgpu_ring_write(ring, 0x62a04);
+
+               /* PCTL0__MMHUB_DEEPSLEEP_IB could be different on different 
mmhub version */
+               switch (amdgpu_ip_version(adev, MMHUB_HWIP, 0)) {
+               case IP_VERSION(4, 1, 0):
+                       amdgpu_ring_write(ring, 0x69004);
+                       value = 0x00010000;
+                       break;
+               case IP_VERSION(4, 2, 0):
+                       amdgpu_ring_write(ring, 0x60804);
+                       if (jpeg_inst & 1)
+                               value = 0x00010000;
+                       break;
+               default:
+                       amdgpu_ring_write(ring, 0x62a04);
+                       break;
+               }
 
                amdgpu_ring_write(ring,
                                  PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, 0,
                                          0, PACKETJ_TYPE0));
-               amdgpu_ring_write(ring, 0x00004000);
+               amdgpu_ring_write(ring, value);
        }
 }
 
-- 
2.43.0

Reply via email to