diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2018-04-10 05:17:22 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-05-15 14:43:08 -0400 |
commit | 819a23f83e3b2513cffbef418458a47ca02c36b3 (patch) | |
tree | aecfb45f7ea56873ec6ca61863885d50d4601753 /drivers/gpu/drm/amd/amdgpu/vi.c | |
parent | 29ae1118d85e8435b12fca512410dbd39920cce9 (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.c | 46 |
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 | |||
747 | static int vi_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk) | 761 | static 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 | } |