@@ -3949,8 +3949,12 @@ static int gfx_v8_0_init_save_restore_list(struct amdgpu_device *adev)
3949
3949
temp = mmRLC_SRM_INDEX_CNTL_ADDR_0 ;
3950
3950
data = mmRLC_SRM_INDEX_CNTL_DATA_0 ;
3951
3951
for (i = 0 ; i < sizeof (unique_indices ) / sizeof (int ); i ++ ) {
3952
- amdgpu_mm_wreg (adev , temp + i , unique_indices [i ] & 0x3FFFF , false);
3953
- amdgpu_mm_wreg (adev , data + i , unique_indices [i ] >> 20 , false);
3952
+ if (unique_indices [i ] != 0 ) {
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
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
3971
uint32_t data ;
3968
3972
3969
- if (adev -> pg_flags & (AMD_PG_SUPPORT_GFX_PG |
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
+ 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 (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 , MEM_SLEEP_DELAY , 0x10 );
3978
- WREG32 (mmRLC_PG_DELAY , data );
3975
+ data = REG_SET_FIELD (0 , RLC_PG_DELAY , POWER_UP_DELAY , 0x10 );
3976
+ data = REG_SET_FIELD (data , RLC_PG_DELAY , POWER_DOWN_DELAY , 0x10 );
3977
+ data = REG_SET_FIELD (data , RLC_PG_DELAY , CMD_PROPAGATE_DELAY , 0x10 );
3978
+ data = REG_SET_FIELD (data , RLC_PG_DELAY , MEM_SLEEP_DELAY , 0x10 );
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
3985
3986
static 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
3997
3998
static 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
4002
4003
static void gfx_v8_0_init_pg (struct amdgpu_device * adev )
4003
4004
{
4004
- if (adev -> pg_flags & (AMD_PG_SUPPORT_GFX_PG |
4005
- AMD_PG_SUPPORT_GFX_SMG |
4006
- AMD_PG_SUPPORT_GFX_DMG |
4007
- AMD_PG_SUPPORT_CP |
4008
- AMD_PG_SUPPORT_GDS |
4009
- AMD_PG_SUPPORT_RLC_SMU_HS )) {
4005
+ if ((adev -> asic_type == CHIP_CARRIZO ) ||
4006
+ (adev -> asic_type == CHIP_STONEY )) {
4010
4007
gfx_v8_0_init_csb (adev );
4011
4008
gfx_v8_0_init_save_restore_list (adev );
4012
4009
gfx_v8_0_enable_save_restore_machine (adev );
4013
-
4014
- if ((adev -> asic_type == CHIP_CARRIZO ) ||
4015
- (adev -> asic_type == CHIP_STONEY )) {
4016
- WREG32 (mmRLC_JUMP_TABLE_RESTORE , adev -> gfx .rlc .cp_table_gpu_addr >> 8 );
4017
- gfx_v8_0_init_power_gating (adev );
4018
- WREG32 (mmRLC_PG_ALWAYS_ON_CU_MASK , adev -> gfx .cu_info .ao_cu_mask );
4019
- if (adev -> pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS ) {
4020
- cz_enable_sck_slow_down_on_power_up (adev , true);
4021
- cz_enable_sck_slow_down_on_power_down (adev , true);
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 );
4010
+ WREG32 (mmRLC_JUMP_TABLE_RESTORE , adev -> gfx .rlc .cp_table_gpu_addr >> 8 );
4011
+ gfx_v8_0_init_power_gating (adev );
4012
+ WREG32 (mmRLC_PG_ALWAYS_ON_CU_MASK , adev -> gfx .cu_info .ao_cu_mask );
4013
+ if (adev -> pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS ) {
4014
+ cz_enable_sck_slow_down_on_power_up (adev , true);
4015
+ cz_enable_sck_slow_down_on_power_down (adev , true);
4016
+ } else {
4017
+ cz_enable_sck_slow_down_on_power_up (adev , false);
4018
+ cz_enable_sck_slow_down_on_power_down (adev , false);
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
4036
4033
static 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
5336
struct amdgpu_device * adev = (struct amdgpu_device * )handle ;
5340
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
5339
switch (adev -> asic_type ) {
5346
5340
case CHIP_CARRIZO :
5347
5341
case CHIP_STONEY :
5348
- if ( adev -> pg_flags & AMD_PG_SUPPORT_GFX_PG )
5349
- cz_update_gfx_cg_power_gating (adev , enable );
5342
+
5343
+ cz_update_gfx_cg_power_gating (adev , enable );
5350
5344
5351
5345
if ((adev -> pg_flags & AMD_PG_SUPPORT_GFX_SMG ) && enable )
5352
5346
gfx_v8_0_enable_gfx_static_mg_power_gating (adev , true);
@@ -5791,69 +5785,148 @@ static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev,
5791
5785
static int gfx_v8_0_tonga_update_gfx_clock_gating (struct amdgpu_device * adev ,
5792
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
5790
void * pp_handle = adev -> powerplay .pp_handle ;
5796
5791
5797
- if (state == AMD_CG_STATE_UNGATE )
5798
- pp_state = 0 ;
5799
- else
5800
- pp_state = PP_STATE_CG | PP_STATE_LS ;
5792
+ if (adev -> cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_CGLS )) {
5793
+ if (adev -> cg_flags & AMD_CG_SUPPORT_GFX_CGLS ) {
5794
+ pp_support_state = PP_STATE_SUPPORT_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 ,
5803
- PP_BLOCK_GFX_CG ,
5804
- PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS ,
5805
- pp_state ) ;
5806
- amd_set_clockgating_by_smu ( pp_handle , msg_id );
5811
+ if ( adev -> cg_flags & ( AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_MGLS )) {
5812
+ if ( adev -> cg_flags & AMD_CG_SUPPORT_GFX_MGLS ) {
5813
+ pp_support_state = PP_STATE_SUPPORT_LS ;
5814
+ pp_state = PP_STATE_LS ;
5815
+ }
5807
5816
5808
- msg_id = PP_CG_MSG_ID (PP_GROUP_GFX ,
5809
- PP_BLOCK_GFX_MG ,
5810
- PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS ,
5811
- pp_state );
5812
- amd_set_clockgating_by_smu (pp_handle , msg_id );
5817
+ if (adev -> cg_flags & AMD_CG_SUPPORT_GFX_MGCG ) {
5818
+ pp_support_state |= PP_STATE_SUPPORT_CG ;
5819
+ pp_state |= PP_STATE_CG ;
5820
+ }
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
5832
return 0 ;
5815
5833
}
5816
5834
5817
5835
static int gfx_v8_0_polaris_update_gfx_clock_gating (struct amdgpu_device * adev ,
5818
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
5841
void * pp_handle = adev -> powerplay .pp_handle ;
5822
5842
5823
- if (state == AMD_CG_STATE_UNGATE )
5824
- pp_state = 0 ;
5825
- else
5826
- pp_state = PP_STATE_CG | PP_STATE_LS ;
5843
+ if (adev -> cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_CGLS )) {
5844
+ if (adev -> cg_flags & AMD_CG_SUPPORT_GFX_CGLS ) {
5845
+ pp_support_state = PP_STATE_SUPPORT_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 ,
5829
- PP_BLOCK_GFX_CG ,
5830
- PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS ,
5831
- pp_state );
5832
- amd_set_clockgating_by_smu (pp_handle , msg_id );
5862
+ if (adev -> cg_flags & (AMD_CG_SUPPORT_GFX_3D_CGCG | AMD_CG_SUPPORT_GFX_3D_CGLS )) {
5863
+ if (adev -> cg_flags & AMD_CG_SUPPORT_GFX_3D_CGLS ) {
5864
+ pp_support_state = PP_STATE_SUPPORT_LS ;
5865
+ pp_state = PP_STATE_LS ;
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 ,
5835
- PP_BLOCK_GFX_3D ,
5836
- PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS ,
5837
- pp_state ) ;
5838
- amd_set_clockgating_by_smu ( pp_handle , msg_id );
5881
+ if ( adev -> cg_flags & ( AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_MGLS )) {
5882
+ if ( adev -> cg_flags & AMD_CG_SUPPORT_GFX_MGLS ) {
5883
+ pp_support_state = PP_STATE_SUPPORT_LS ;
5884
+ pp_state = PP_STATE_LS ;
5885
+ }
5839
5886
5840
- msg_id = PP_CG_MSG_ID (PP_GROUP_GFX ,
5841
- PP_BLOCK_GFX_MG ,
5842
- PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS ,
5843
- pp_state );
5844
- amd_set_clockgating_by_smu (pp_handle , msg_id );
5887
+ if (adev -> cg_flags & AMD_CG_SUPPORT_GFX_MGCG ) {
5888
+ pp_support_state |= PP_STATE_SUPPORT_CG ;
5889
+ pp_state |= PP_STATE_CG ;
5890
+ }
5845
5891
5846
- msg_id = PP_CG_MSG_ID (PP_GROUP_GFX ,
5847
- PP_BLOCK_GFX_RLC ,
5848
- PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS ,
5849
- pp_state );
5850
- amd_set_clockgating_by_smu (pp_handle , msg_id );
5892
+ if (state == AMD_CG_STATE_UNGATE )
5893
+ pp_state = 0 ;
5894
+
5895
+ msg_id = PP_CG_MSG_ID (PP_GROUP_GFX ,
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
5925
PP_BLOCK_GFX_CP ,
5854
- PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS ,
5926
+ pp_support_state ,
5855
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
5931
return 0 ;
5859
5932
}
0 commit comments