aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/vi.c
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2018-04-10 05:17:22 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-05-15 14:43:08 -0400
commit819a23f83e3b2513cffbef418458a47ca02c36b3 (patch)
treeaecfb45f7ea56873ec6ca61863885d50d4601753 /drivers/gpu/drm/amd/amdgpu/vi.c
parent29ae1118d85e8435b12fca512410dbd39920cce9 (diff)
drm/amdgpu: Add APU support in vi_set_uvd_clocks
fix the issue set uvd clock failed on CZ/ST which lead 1s delay when boot up. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Huang Rui <ray.huang@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Acked-by: Shirish S <shirish.s@amd.com> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vi.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c46
1 files changed, 35 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
index 1b4ee249b95a..51acd7c3d2a9 100644
--- a/drivers/gpu/drm/amd/amdgpu/vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c
@@ -728,33 +728,57 @@ static int vi_set_uvd_clock(struct amdgpu_device *adev, u32 clock,
728 return r; 728 return r;
729 729
730 tmp = RREG32_SMC(cntl_reg); 730 tmp = RREG32_SMC(cntl_reg);
731 tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK | 731
732 CG_DCLK_CNTL__DCLK_DIVIDER_MASK); 732 if (adev->flags & AMD_IS_APU)
733 tmp &= ~CG_DCLK_CNTL__DCLK_DIVIDER_MASK;
734 else
735 tmp &= ~(CG_DCLK_CNTL__DCLK_DIR_CNTL_EN_MASK |
736 CG_DCLK_CNTL__DCLK_DIVIDER_MASK);
733 tmp |= dividers.post_divider; 737 tmp |= dividers.post_divider;
734 WREG32_SMC(cntl_reg, tmp); 738 WREG32_SMC(cntl_reg, tmp);
735 739
736 for (i = 0; i < 100; i++) { 740 for (i = 0; i < 100; i++) {
737 if (RREG32_SMC(status_reg) & CG_DCLK_STATUS__DCLK_STATUS_MASK) 741 tmp = RREG32_SMC(status_reg);
738 break; 742 if (adev->flags & AMD_IS_APU) {
743 if (tmp & 0x10000)
744 break;
745 } else {
746 if (tmp & CG_DCLK_STATUS__DCLK_STATUS_MASK)
747 break;
748 }
739 mdelay(10); 749 mdelay(10);
740 } 750 }
741 if (i == 100) 751 if (i == 100)
742 return -ETIMEDOUT; 752 return -ETIMEDOUT;
743
744 return 0; 753 return 0;
745} 754}
746 755
756#define ixGNB_CLK1_DFS_CNTL 0xD82200F0
757#define ixGNB_CLK1_STATUS 0xD822010C
758#define ixGNB_CLK2_DFS_CNTL 0xD8220110
759#define ixGNB_CLK2_STATUS 0xD822012C
760
747static int vi_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk) 761static int vi_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
748{ 762{
749 int r; 763 int r;
750 764
751 r = vi_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS); 765 if (adev->flags & AMD_IS_APU) {
752 if (r) 766 r = vi_set_uvd_clock(adev, vclk, ixGNB_CLK2_DFS_CNTL, ixGNB_CLK2_STATUS);
753 return r; 767 if (r)
768 return r;
754 769
755 r = vi_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS); 770 r = vi_set_uvd_clock(adev, dclk, ixGNB_CLK1_DFS_CNTL, ixGNB_CLK1_STATUS);
756 if (r) 771 if (r)
757 return r; 772 return r;
773 } else {
774 r = vi_set_uvd_clock(adev, vclk, ixCG_VCLK_CNTL, ixCG_VCLK_STATUS);
775 if (r)
776 return r;
777
778 r = vi_set_uvd_clock(adev, dclk, ixCG_DCLK_CNTL, ixCG_DCLK_STATUS);
779 if (r)
780 return r;
781 }
758 782
759 return 0; 783 return 0;
760} 784}