diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 249 |
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 | ||
3985 | static void cz_enable_sck_slow_down_on_power_up(struct amdgpu_device *adev, | 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 | static void cz_enable_cp_power_gating(struct amdgpu_device *adev, bool enable) | 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 | static void gfx_v8_0_init_pg(struct amdgpu_device *adev) | 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 | 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 | ||
4036 | static void gfx_v8_0_rlc_stop(struct amdgpu_device *adev) | 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 | 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, | |||
5791 | static int gfx_v8_0_tonga_update_gfx_clock_gating(struct amdgpu_device *adev, | 5785 | static 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, | |||
5817 | static int gfx_v8_0_polaris_update_gfx_clock_gating(struct amdgpu_device *adev, | 5835 | static 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 | } |