aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c249
1 files changed, 161 insertions, 88 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 6324f67bdb1f..d0ec00986f38 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -3949,8 +3949,12 @@ static int gfx_v8_0_init_save_restore_list(struct amdgpu_device *adev)
3949 temp = mmRLC_SRM_INDEX_CNTL_ADDR_0; 3949 temp = mmRLC_SRM_INDEX_CNTL_ADDR_0;
3950 data = mmRLC_SRM_INDEX_CNTL_DATA_0; 3950 data = mmRLC_SRM_INDEX_CNTL_DATA_0;
3951 for (i = 0; i < sizeof(unique_indices) / sizeof(int); i++) { 3951 for (i = 0; i < sizeof(unique_indices) / sizeof(int); i++) {
3952 amdgpu_mm_wreg(adev, temp + i, unique_indices[i] & 0x3FFFF, false); 3952 if (unique_indices[i] != 0) {
3953 amdgpu_mm_wreg(adev, data + i, unique_indices[i] >> 20, false); 3953 amdgpu_mm_wreg(adev, temp + i,
3954 unique_indices[i] & 0x3FFFF, false);
3955 amdgpu_mm_wreg(adev, data + i,
3956 unique_indices[i] >> 20, false);
3957 }
3954 } 3958 }
3955 kfree(register_list_format); 3959 kfree(register_list_format);
3956 3960
@@ -3966,20 +3970,17 @@ static void gfx_v8_0_init_power_gating(struct amdgpu_device *adev)
3966{ 3970{
3967 uint32_t data; 3971 uint32_t data;
3968 3972
3969 if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG | 3973 WREG32_FIELD(CP_RB_WPTR_POLL_CNTL, IDLE_POLL_COUNT, 0x60);
3970 AMD_PG_SUPPORT_GFX_SMG |
3971 AMD_PG_SUPPORT_GFX_DMG)) {
3972 WREG32_FIELD(CP_RB_WPTR_POLL_CNTL, IDLE_POLL_COUNT, 0x60);
3973 3974
3974 data = REG_SET_FIELD(0, RLC_PG_DELAY, POWER_UP_DELAY, 0x10); 3975 data = REG_SET_FIELD(0, RLC_PG_DELAY, POWER_UP_DELAY, 0x10);
3975 data = REG_SET_FIELD(data, RLC_PG_DELAY, POWER_DOWN_DELAY, 0x10); 3976 data = REG_SET_FIELD(data, RLC_PG_DELAY, POWER_DOWN_DELAY, 0x10);
3976 data = REG_SET_FIELD(data, RLC_PG_DELAY, CMD_PROPAGATE_DELAY, 0x10); 3977 data = REG_SET_FIELD(data, RLC_PG_DELAY, CMD_PROPAGATE_DELAY, 0x10);
3977 data = REG_SET_FIELD(data, RLC_PG_DELAY, MEM_SLEEP_DELAY, 0x10); 3978 data = REG_SET_FIELD(data, RLC_PG_DELAY, MEM_SLEEP_DELAY, 0x10);
3978 WREG32(mmRLC_PG_DELAY, data); 3979 WREG32(mmRLC_PG_DELAY, data);
3980
3981 WREG32_FIELD(RLC_PG_DELAY_2, SERDES_CMD_DELAY, 0x3);
3982 WREG32_FIELD(RLC_AUTO_PG_CTRL, GRBM_REG_SAVE_GFX_IDLE_THRESHOLD, 0x55f0);
3979 3983
3980 WREG32_FIELD(RLC_PG_DELAY_2, SERDES_CMD_DELAY, 0x3);
3981 WREG32_FIELD(RLC_AUTO_PG_CTRL, GRBM_REG_SAVE_GFX_IDLE_THRESHOLD, 0x55f0);
3982 }
3983} 3984}
3984 3985
3985static void cz_enable_sck_slow_down_on_power_up(struct amdgpu_device *adev, 3986static void cz_enable_sck_slow_down_on_power_up(struct amdgpu_device *adev,
@@ -3996,41 +3997,37 @@ static void cz_enable_sck_slow_down_on_power_down(struct amdgpu_device *adev,
3996 3997
3997static void cz_enable_cp_power_gating(struct amdgpu_device *adev, bool enable) 3998static void cz_enable_cp_power_gating(struct amdgpu_device *adev, bool enable)
3998{ 3999{
3999 WREG32_FIELD(RLC_PG_CNTL, CP_PG_DISABLE, enable ? 1 : 0); 4000 WREG32_FIELD(RLC_PG_CNTL, CP_PG_DISABLE, enable ? 0 : 1);
4000} 4001}
4001 4002
4002static void gfx_v8_0_init_pg(struct amdgpu_device *adev) 4003static void gfx_v8_0_init_pg(struct amdgpu_device *adev)
4003{ 4004{
4004 if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG | 4005 if ((adev->asic_type == CHIP_CARRIZO) ||
4005 AMD_PG_SUPPORT_GFX_SMG | 4006 (adev->asic_type == CHIP_STONEY)) {
4006 AMD_PG_SUPPORT_GFX_DMG |
4007 AMD_PG_SUPPORT_CP |
4008 AMD_PG_SUPPORT_GDS |
4009 AMD_PG_SUPPORT_RLC_SMU_HS)) {
4010 gfx_v8_0_init_csb(adev); 4007 gfx_v8_0_init_csb(adev);
4011 gfx_v8_0_init_save_restore_list(adev); 4008 gfx_v8_0_init_save_restore_list(adev);
4012 gfx_v8_0_enable_save_restore_machine(adev); 4009 gfx_v8_0_enable_save_restore_machine(adev);
4013 4010 WREG32(mmRLC_JUMP_TABLE_RESTORE, adev->gfx.rlc.cp_table_gpu_addr >> 8);
4014 if ((adev->asic_type == CHIP_CARRIZO) || 4011 gfx_v8_0_init_power_gating(adev);
4015 (adev->asic_type == CHIP_STONEY)) { 4012 WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK, adev->gfx.cu_info.ao_cu_mask);
4016 WREG32(mmRLC_JUMP_TABLE_RESTORE, adev->gfx.rlc.cp_table_gpu_addr >> 8); 4013 if (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS) {
4017 gfx_v8_0_init_power_gating(adev); 4014 cz_enable_sck_slow_down_on_power_up(adev, true);
4018 WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK, adev->gfx.cu_info.ao_cu_mask); 4015 cz_enable_sck_slow_down_on_power_down(adev, true);
4019 if (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS) { 4016 } else {
4020 cz_enable_sck_slow_down_on_power_up(adev, true); 4017 cz_enable_sck_slow_down_on_power_up(adev, false);
4021 cz_enable_sck_slow_down_on_power_down(adev, true); 4018 cz_enable_sck_slow_down_on_power_down(adev, false);
4022 } else {
4023 cz_enable_sck_slow_down_on_power_up(adev, false);
4024 cz_enable_sck_slow_down_on_power_down(adev, false);
4025 }
4026 if (adev->pg_flags & AMD_PG_SUPPORT_CP)
4027 cz_enable_cp_power_gating(adev, true);
4028 else
4029 cz_enable_cp_power_gating(adev, false);
4030 } else if (adev->asic_type == CHIP_POLARIS11) {
4031 gfx_v8_0_init_power_gating(adev);
4032 } 4019 }
4020 if (adev->pg_flags & AMD_PG_SUPPORT_CP)
4021 cz_enable_cp_power_gating(adev, true);
4022 else
4023 cz_enable_cp_power_gating(adev, false);
4024 } else if (adev->asic_type == CHIP_POLARIS11) {
4025 gfx_v8_0_init_csb(adev);
4026 gfx_v8_0_init_save_restore_list(adev);
4027 gfx_v8_0_enable_save_restore_machine(adev);
4028 gfx_v8_0_init_power_gating(adev);
4033 } 4029 }
4030
4034} 4031}
4035 4032
4036static void gfx_v8_0_rlc_stop(struct amdgpu_device *adev) 4033static void gfx_v8_0_rlc_stop(struct amdgpu_device *adev)
@@ -5339,14 +5336,11 @@ static int gfx_v8_0_set_powergating_state(void *handle,
5339 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5336 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5340 bool enable = (state == AMD_PG_STATE_GATE) ? true : false; 5337 bool enable = (state == AMD_PG_STATE_GATE) ? true : false;
5341 5338
5342 if (!(adev->pg_flags & AMD_PG_SUPPORT_GFX_PG))
5343 return 0;
5344
5345 switch (adev->asic_type) { 5339 switch (adev->asic_type) {
5346 case CHIP_CARRIZO: 5340 case CHIP_CARRIZO:
5347 case CHIP_STONEY: 5341 case CHIP_STONEY:
5348 if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) 5342
5349 cz_update_gfx_cg_power_gating(adev, enable); 5343 cz_update_gfx_cg_power_gating(adev, enable);
5350 5344
5351 if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_SMG) && enable) 5345 if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_SMG) && enable)
5352 gfx_v8_0_enable_gfx_static_mg_power_gating(adev, true); 5346 gfx_v8_0_enable_gfx_static_mg_power_gating(adev, true);
@@ -5791,25 +5785,49 @@ static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev,
5791static int gfx_v8_0_tonga_update_gfx_clock_gating(struct amdgpu_device *adev, 5785static int gfx_v8_0_tonga_update_gfx_clock_gating(struct amdgpu_device *adev,
5792 enum amd_clockgating_state state) 5786 enum amd_clockgating_state state)
5793{ 5787{
5794 uint32_t msg_id, pp_state; 5788 uint32_t msg_id, pp_state = 0;
5789 uint32_t pp_support_state = 0;
5795 void *pp_handle = adev->powerplay.pp_handle; 5790 void *pp_handle = adev->powerplay.pp_handle;
5796 5791
5797 if (state == AMD_CG_STATE_UNGATE) 5792 if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_CGLS)) {
5798 pp_state = 0; 5793 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) {
5799 else 5794 pp_support_state = PP_STATE_SUPPORT_LS;
5800 pp_state = PP_STATE_CG | PP_STATE_LS; 5795 pp_state = PP_STATE_LS;
5796 }
5797 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG) {
5798 pp_support_state |= PP_STATE_SUPPORT_CG;
5799 pp_state |= PP_STATE_CG;
5800 }
5801 if (state == AMD_CG_STATE_UNGATE)
5802 pp_state = 0;
5803
5804 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
5805 PP_BLOCK_GFX_CG,
5806 pp_support_state,
5807 pp_state);
5808 amd_set_clockgating_by_smu(pp_handle, msg_id);
5809 }
5801 5810
5802 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX, 5811 if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_MGLS)) {
5803 PP_BLOCK_GFX_CG, 5812 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
5804 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS, 5813 pp_support_state = PP_STATE_SUPPORT_LS;
5805 pp_state); 5814 pp_state = PP_STATE_LS;
5806 amd_set_clockgating_by_smu(pp_handle, msg_id); 5815 }
5807 5816
5808 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX, 5817 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG) {
5809 PP_BLOCK_GFX_MG, 5818 pp_support_state |= PP_STATE_SUPPORT_CG;
5810 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS, 5819 pp_state |= PP_STATE_CG;
5811 pp_state); 5820 }
5812 amd_set_clockgating_by_smu(pp_handle, msg_id); 5821
5822 if (state == AMD_CG_STATE_UNGATE)
5823 pp_state = 0;
5824
5825 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
5826 PP_BLOCK_GFX_MG,
5827 pp_support_state,
5828 pp_state);
5829 amd_set_clockgating_by_smu(pp_handle, msg_id);
5830 }
5813 5831
5814 return 0; 5832 return 0;
5815} 5833}
@@ -5817,43 +5835,98 @@ static int gfx_v8_0_tonga_update_gfx_clock_gating(struct amdgpu_device *adev,
5817static int gfx_v8_0_polaris_update_gfx_clock_gating(struct amdgpu_device *adev, 5835static int gfx_v8_0_polaris_update_gfx_clock_gating(struct amdgpu_device *adev,
5818 enum amd_clockgating_state state) 5836 enum amd_clockgating_state state)
5819{ 5837{
5820 uint32_t msg_id, pp_state; 5838
5839 uint32_t msg_id, pp_state = 0;
5840 uint32_t pp_support_state = 0;
5821 void *pp_handle = adev->powerplay.pp_handle; 5841 void *pp_handle = adev->powerplay.pp_handle;
5822 5842
5823 if (state == AMD_CG_STATE_UNGATE) 5843 if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_CGLS)) {
5824 pp_state = 0; 5844 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) {
5825 else 5845 pp_support_state = PP_STATE_SUPPORT_LS;
5826 pp_state = PP_STATE_CG | PP_STATE_LS; 5846 pp_state = PP_STATE_LS;
5847 }
5848 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG) {
5849 pp_support_state |= PP_STATE_SUPPORT_CG;
5850 pp_state |= PP_STATE_CG;
5851 }
5852 if (state == AMD_CG_STATE_UNGATE)
5853 pp_state = 0;
5854
5855 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
5856 PP_BLOCK_GFX_CG,
5857 pp_support_state,
5858 pp_state);
5859 amd_set_clockgating_by_smu(pp_handle, msg_id);
5860 }
5827 5861
5828 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX, 5862 if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_3D_CGCG | AMD_CG_SUPPORT_GFX_3D_CGLS)) {
5829 PP_BLOCK_GFX_CG, 5863 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGLS) {
5830 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS, 5864 pp_support_state = PP_STATE_SUPPORT_LS;
5831 pp_state); 5865 pp_state = PP_STATE_LS;
5832 amd_set_clockgating_by_smu(pp_handle, msg_id); 5866 }
5867 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG) {
5868 pp_support_state |= PP_STATE_SUPPORT_CG;
5869 pp_state |= PP_STATE_CG;
5870 }
5871 if (state == AMD_CG_STATE_UNGATE)
5872 pp_state = 0;
5873
5874 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
5875 PP_BLOCK_GFX_3D,
5876 pp_support_state,
5877 pp_state);
5878 amd_set_clockgating_by_smu(pp_handle, msg_id);
5879 }
5833 5880
5834 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX, 5881 if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_MGLS)) {
5835 PP_BLOCK_GFX_3D, 5882 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
5836 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS, 5883 pp_support_state = PP_STATE_SUPPORT_LS;
5837 pp_state); 5884 pp_state = PP_STATE_LS;
5838 amd_set_clockgating_by_smu(pp_handle, msg_id); 5885 }
5839 5886
5840 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX, 5887 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG) {
5841 PP_BLOCK_GFX_MG, 5888 pp_support_state |= PP_STATE_SUPPORT_CG;
5842 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS, 5889 pp_state |= PP_STATE_CG;
5843 pp_state); 5890 }
5844 amd_set_clockgating_by_smu(pp_handle, msg_id);
5845 5891
5846 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX, 5892 if (state == AMD_CG_STATE_UNGATE)
5847 PP_BLOCK_GFX_RLC, 5893 pp_state = 0;
5848 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS, 5894
5849 pp_state); 5895 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
5850 amd_set_clockgating_by_smu(pp_handle, msg_id); 5896 PP_BLOCK_GFX_MG,
5897 pp_support_state,
5898 pp_state);
5899 amd_set_clockgating_by_smu(pp_handle, msg_id);
5900 }
5901
5902 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) {
5903 pp_support_state = PP_STATE_SUPPORT_LS;
5851 5904
5852 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX, 5905 if (state == AMD_CG_STATE_UNGATE)
5906 pp_state = 0;
5907 else
5908 pp_state = PP_STATE_LS;
5909
5910 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
5911 PP_BLOCK_GFX_RLC,
5912 pp_support_state,
5913 pp_state);
5914 amd_set_clockgating_by_smu(pp_handle, msg_id);
5915 }
5916
5917 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) {
5918 pp_support_state = PP_STATE_SUPPORT_LS;
5919
5920 if (state == AMD_CG_STATE_UNGATE)
5921 pp_state = 0;
5922 else
5923 pp_state = PP_STATE_LS;
5924 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
5853 PP_BLOCK_GFX_CP, 5925 PP_BLOCK_GFX_CP,
5854 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS, 5926 pp_support_state,
5855 pp_state); 5927 pp_state);
5856 amd_set_clockgating_by_smu(pp_handle, msg_id); 5928 amd_set_clockgating_by_smu(pp_handle, msg_id);
5929 }
5857 5930
5858 return 0; 5931 return 0;
5859} 5932}