diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c | 60 |
1 files changed, 6 insertions, 54 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c index 2d2f0960b025..3b42f407971d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c | |||
@@ -34,24 +34,6 @@ | |||
34 | #include "cik_dpm.h" | 34 | #include "cik_dpm.h" |
35 | #include "vi_dpm.h" | 35 | #include "vi_dpm.h" |
36 | 36 | ||
37 | static int amdgpu_create_pp_handle(struct amdgpu_device *adev) | ||
38 | { | ||
39 | struct amd_pp_init pp_init; | ||
40 | struct amd_powerplay *amd_pp; | ||
41 | int ret; | ||
42 | |||
43 | amd_pp = &(adev->powerplay); | ||
44 | pp_init.chip_family = adev->family; | ||
45 | pp_init.chip_id = adev->asic_type; | ||
46 | pp_init.pm_en = (amdgpu_dpm != 0 && !amdgpu_sriov_vf(adev)) ? true : false; | ||
47 | pp_init.feature_mask = amdgpu_pp_feature_mask; | ||
48 | pp_init.device = amdgpu_cgs_create_device(adev); | ||
49 | ret = amd_powerplay_create(&pp_init, &(amd_pp->pp_handle)); | ||
50 | if (ret) | ||
51 | return -EINVAL; | ||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | static int amdgpu_pp_early_init(void *handle) | 37 | static int amdgpu_pp_early_init(void *handle) |
56 | { | 38 | { |
57 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 39 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
@@ -59,7 +41,6 @@ static int amdgpu_pp_early_init(void *handle) | |||
59 | int ret = 0; | 41 | int ret = 0; |
60 | 42 | ||
61 | amd_pp = &(adev->powerplay); | 43 | amd_pp = &(adev->powerplay); |
62 | adev->pp_enabled = false; | ||
63 | amd_pp->pp_handle = (void *)adev; | 44 | amd_pp->pp_handle = (void *)adev; |
64 | 45 | ||
65 | switch (adev->asic_type) { | 46 | switch (adev->asic_type) { |
@@ -73,9 +54,7 @@ static int amdgpu_pp_early_init(void *handle) | |||
73 | case CHIP_STONEY: | 54 | case CHIP_STONEY: |
74 | case CHIP_VEGA10: | 55 | case CHIP_VEGA10: |
75 | case CHIP_RAVEN: | 56 | case CHIP_RAVEN: |
76 | adev->pp_enabled = true; | 57 | amd_pp->cgs_device = amdgpu_cgs_create_device(adev); |
77 | if (amdgpu_create_pp_handle(adev)) | ||
78 | return -EINVAL; | ||
79 | amd_pp->ip_funcs = &pp_ip_funcs; | 58 | amd_pp->ip_funcs = &pp_ip_funcs; |
80 | amd_pp->pp_funcs = &pp_dpm_funcs; | 59 | amd_pp->pp_funcs = &pp_dpm_funcs; |
81 | break; | 60 | break; |
@@ -97,9 +76,7 @@ static int amdgpu_pp_early_init(void *handle) | |||
97 | amd_pp->ip_funcs = &ci_dpm_ip_funcs; | 76 | amd_pp->ip_funcs = &ci_dpm_ip_funcs; |
98 | amd_pp->pp_funcs = &ci_dpm_funcs; | 77 | amd_pp->pp_funcs = &ci_dpm_funcs; |
99 | } else { | 78 | } else { |
100 | adev->pp_enabled = true; | 79 | amd_pp->cgs_device = amdgpu_cgs_create_device(adev); |
101 | if (amdgpu_create_pp_handle(adev)) | ||
102 | return -EINVAL; | ||
103 | amd_pp->ip_funcs = &pp_ip_funcs; | 80 | amd_pp->ip_funcs = &pp_ip_funcs; |
104 | amd_pp->pp_funcs = &pp_dpm_funcs; | 81 | amd_pp->pp_funcs = &pp_dpm_funcs; |
105 | } | 82 | } |
@@ -118,12 +95,9 @@ static int amdgpu_pp_early_init(void *handle) | |||
118 | 95 | ||
119 | if (adev->powerplay.ip_funcs->early_init) | 96 | if (adev->powerplay.ip_funcs->early_init) |
120 | ret = adev->powerplay.ip_funcs->early_init( | 97 | ret = adev->powerplay.ip_funcs->early_init( |
121 | adev->powerplay.pp_handle); | 98 | amd_pp->cgs_device ? amd_pp->cgs_device : |
99 | amd_pp->pp_handle); | ||
122 | 100 | ||
123 | if (ret == PP_DPM_DISABLED) { | ||
124 | adev->pm.dpm_enabled = false; | ||
125 | return 0; | ||
126 | } | ||
127 | return ret; | 101 | return ret; |
128 | } | 102 | } |
129 | 103 | ||
@@ -137,11 +111,6 @@ static int amdgpu_pp_late_init(void *handle) | |||
137 | ret = adev->powerplay.ip_funcs->late_init( | 111 | ret = adev->powerplay.ip_funcs->late_init( |
138 | adev->powerplay.pp_handle); | 112 | adev->powerplay.pp_handle); |
139 | 113 | ||
140 | if (adev->pp_enabled && adev->pm.dpm_enabled) { | ||
141 | amdgpu_pm_sysfs_init(adev); | ||
142 | amdgpu_dpm_dispatch_task(adev, AMD_PP_TASK_COMPLETE_INIT, NULL, NULL); | ||
143 | } | ||
144 | |||
145 | return ret; | 114 | return ret; |
146 | } | 115 | } |
147 | 116 | ||
@@ -176,21 +145,11 @@ static int amdgpu_pp_hw_init(void *handle) | |||
176 | int ret = 0; | 145 | int ret = 0; |
177 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 146 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
178 | 147 | ||
179 | if (adev->pp_enabled && adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) | ||
180 | amdgpu_ucode_init_bo(adev); | ||
181 | 148 | ||
182 | if (adev->powerplay.ip_funcs->hw_init) | 149 | if (adev->powerplay.ip_funcs->hw_init) |
183 | ret = adev->powerplay.ip_funcs->hw_init( | 150 | ret = adev->powerplay.ip_funcs->hw_init( |
184 | adev->powerplay.pp_handle); | 151 | adev->powerplay.pp_handle); |
185 | 152 | ||
186 | if (ret == PP_DPM_DISABLED) { | ||
187 | adev->pm.dpm_enabled = false; | ||
188 | return 0; | ||
189 | } | ||
190 | |||
191 | if ((amdgpu_dpm != 0) && !amdgpu_sriov_vf(adev)) | ||
192 | adev->pm.dpm_enabled = true; | ||
193 | |||
194 | return ret; | 153 | return ret; |
195 | } | 154 | } |
196 | 155 | ||
@@ -199,16 +158,10 @@ static int amdgpu_pp_hw_fini(void *handle) | |||
199 | int ret = 0; | 158 | int ret = 0; |
200 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 159 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
201 | 160 | ||
202 | if (adev->pp_enabled && adev->pm.dpm_enabled) | ||
203 | amdgpu_pm_sysfs_fini(adev); | ||
204 | |||
205 | if (adev->powerplay.ip_funcs->hw_fini) | 161 | if (adev->powerplay.ip_funcs->hw_fini) |
206 | ret = adev->powerplay.ip_funcs->hw_fini( | 162 | ret = adev->powerplay.ip_funcs->hw_fini( |
207 | adev->powerplay.pp_handle); | 163 | adev->powerplay.pp_handle); |
208 | 164 | ||
209 | if (adev->pp_enabled && adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) | ||
210 | amdgpu_ucode_fini_bo(adev); | ||
211 | |||
212 | return ret; | 165 | return ret; |
213 | } | 166 | } |
214 | 167 | ||
@@ -220,9 +173,8 @@ static void amdgpu_pp_late_fini(void *handle) | |||
220 | adev->powerplay.ip_funcs->late_fini( | 173 | adev->powerplay.ip_funcs->late_fini( |
221 | adev->powerplay.pp_handle); | 174 | adev->powerplay.pp_handle); |
222 | 175 | ||
223 | 176 | if (adev->powerplay.cgs_device) | |
224 | if (adev->pp_enabled) | 177 | amdgpu_cgs_destroy_device(adev->powerplay.cgs_device); |
225 | amd_powerplay_destroy(adev->powerplay.pp_handle); | ||
226 | } | 178 | } |
227 | 179 | ||
228 | static int amdgpu_pp_suspend(void *handle) | 180 | static int amdgpu_pp_suspend(void *handle) |