diff options
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | 25 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 9 |
3 files changed, 44 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c index 3c2dce67b5f3..8f9c7d55ddda 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | |||
| @@ -36,6 +36,9 @@ | |||
| 36 | 36 | ||
| 37 | #include "bif/bif_4_1_d.h" | 37 | #include "bif/bif_4_1_d.h" |
| 38 | 38 | ||
| 39 | #include "smu/smu_7_0_1_d.h" | ||
| 40 | #include "smu/smu_7_0_1_sh_mask.h" | ||
| 41 | |||
| 39 | static void uvd_v4_2_mc_resume(struct amdgpu_device *adev); | 42 | static void uvd_v4_2_mc_resume(struct amdgpu_device *adev); |
| 40 | static void uvd_v4_2_init_cg(struct amdgpu_device *adev); | 43 | static void uvd_v4_2_init_cg(struct amdgpu_device *adev); |
| 41 | static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev); | 44 | static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev); |
| @@ -683,18 +686,34 @@ static int uvd_v4_2_process_interrupt(struct amdgpu_device *adev, | |||
| 683 | return 0; | 686 | return 0; |
| 684 | } | 687 | } |
| 685 | 688 | ||
| 689 | static void uvd_v5_0_set_bypass_mode(struct amdgpu_device *adev, bool enable) | ||
| 690 | { | ||
| 691 | u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL); | ||
| 692 | |||
| 693 | if (enable) | ||
| 694 | tmp |= (GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK | | ||
| 695 | GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK); | ||
| 696 | else | ||
| 697 | tmp &= ~(GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK | | ||
| 698 | GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK); | ||
| 699 | |||
| 700 | WREG32_SMC(ixGCK_DFS_BYPASS_CNTL, tmp); | ||
| 701 | } | ||
| 702 | |||
| 686 | static int uvd_v4_2_set_clockgating_state(void *handle, | 703 | static int uvd_v4_2_set_clockgating_state(void *handle, |
| 687 | enum amd_clockgating_state state) | 704 | enum amd_clockgating_state state) |
| 688 | { | 705 | { |
| 689 | bool gate = false; | 706 | bool gate = false; |
| 690 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 707 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
| 691 | 708 | ||
| 692 | if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) | ||
| 693 | return 0; | ||
| 694 | |||
| 695 | if (state == AMD_CG_STATE_GATE) | 709 | if (state == AMD_CG_STATE_GATE) |
| 696 | gate = true; | 710 | gate = true; |
| 697 | 711 | ||
| 712 | uvd_v5_0_set_bypass_mode(adev, gate); | ||
| 713 | |||
| 714 | if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) | ||
| 715 | return 0; | ||
| 716 | |||
| 698 | uvd_v4_2_enable_mgcg(adev, gate); | 717 | uvd_v4_2_enable_mgcg(adev, gate); |
| 699 | 718 | ||
| 700 | return 0; | 719 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c index 05088ec4c41b..95303e2d5f92 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | |||
| @@ -33,6 +33,8 @@ | |||
| 33 | #include "oss/oss_2_0_sh_mask.h" | 33 | #include "oss/oss_2_0_sh_mask.h" |
| 34 | #include "bif/bif_5_0_d.h" | 34 | #include "bif/bif_5_0_d.h" |
| 35 | #include "vi.h" | 35 | #include "vi.h" |
| 36 | #include "smu/smu_7_1_2_d.h" | ||
| 37 | #include "smu/smu_7_1_2_sh_mask.h" | ||
| 36 | 38 | ||
| 37 | static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev); | 39 | static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev); |
| 38 | static void uvd_v5_0_set_irq_funcs(struct amdgpu_device *adev); | 40 | static void uvd_v5_0_set_irq_funcs(struct amdgpu_device *adev); |
| @@ -722,6 +724,20 @@ static void uvd_v5_0_set_hw_clock_gating(struct amdgpu_device *adev) | |||
| 722 | } | 724 | } |
| 723 | #endif | 725 | #endif |
| 724 | 726 | ||
| 727 | static void uvd_v5_0_set_bypass_mode(struct amdgpu_device *adev, bool enable) | ||
| 728 | { | ||
| 729 | u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL); | ||
| 730 | |||
| 731 | if (enable) | ||
| 732 | tmp |= (GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK | | ||
| 733 | GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK); | ||
| 734 | else | ||
| 735 | tmp &= ~(GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK | | ||
| 736 | GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK); | ||
| 737 | |||
| 738 | WREG32_SMC(ixGCK_DFS_BYPASS_CNTL, tmp); | ||
| 739 | } | ||
| 740 | |||
| 725 | static int uvd_v5_0_set_clockgating_state(void *handle, | 741 | static int uvd_v5_0_set_clockgating_state(void *handle, |
| 726 | enum amd_clockgating_state state) | 742 | enum amd_clockgating_state state) |
| 727 | { | 743 | { |
| @@ -729,6 +745,8 @@ static int uvd_v5_0_set_clockgating_state(void *handle, | |||
| 729 | bool enable = (state == AMD_CG_STATE_GATE) ? true : false; | 745 | bool enable = (state == AMD_CG_STATE_GATE) ? true : false; |
| 730 | static int curstate = -1; | 746 | static int curstate = -1; |
| 731 | 747 | ||
| 748 | uvd_v5_0_set_bypass_mode(adev, enable); | ||
| 749 | |||
| 732 | if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) | 750 | if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) |
| 733 | return 0; | 751 | return 0; |
| 734 | 752 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c index 2e2baa614b28..a339b5ccb296 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | |||
| @@ -935,7 +935,7 @@ static void uvd_v6_0_set_hw_clock_gating(struct amdgpu_device *adev) | |||
| 935 | } | 935 | } |
| 936 | #endif | 936 | #endif |
| 937 | 937 | ||
| 938 | static void uvd_v6_set_bypass_mode(struct amdgpu_device *adev, bool enable) | 938 | static void uvd_v6_0_set_bypass_mode(struct amdgpu_device *adev, bool enable) |
| 939 | { | 939 | { |
| 940 | u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL); | 940 | u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL); |
| 941 | 941 | ||
| @@ -953,15 +953,14 @@ static int uvd_v6_0_set_clockgating_state(void *handle, | |||
| 953 | enum amd_clockgating_state state) | 953 | enum amd_clockgating_state state) |
| 954 | { | 954 | { |
| 955 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 955 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
| 956 | bool enable = (state == AMD_CG_STATE_GATE) ? true : false; | ||
| 956 | 957 | ||
| 957 | if (adev->asic_type == CHIP_FIJI || | 958 | uvd_v6_0_set_bypass_mode(adev, enable); |
| 958 | adev->asic_type == CHIP_POLARIS10) | ||
| 959 | uvd_v6_set_bypass_mode(adev, state == AMD_CG_STATE_GATE ? true : false); | ||
| 960 | 959 | ||
| 961 | if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) | 960 | if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) |
| 962 | return 0; | 961 | return 0; |
| 963 | 962 | ||
| 964 | if (state == AMD_CG_STATE_GATE) { | 963 | if (enable) { |
| 965 | /* disable HW gating and enable Sw gating */ | 964 | /* disable HW gating and enable Sw gating */ |
| 966 | uvd_v6_0_set_sw_clock_gating(adev); | 965 | uvd_v6_0_set_sw_clock_gating(adev); |
| 967 | } else { | 966 | } else { |
