aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c60
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
37static 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
55static int amdgpu_pp_early_init(void *handle) 37static 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
228static int amdgpu_pp_suspend(void *handle) 180static int amdgpu_pp_suspend(void *handle)