Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: unify the interface of amd_pm_funcs

put amd_pm_funcs table in struct powerplay for all
asics.

Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Rex Zhu and committed by
Alex Deucher
cd4d7464 f93f0c3a

+161 -237
+1 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 3498 3498 3499 3499 valuesize = sizeof(values); 3500 3500 if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor) 3501 - r = adev->powerplay.pp_funcs->read_sensor(adev->powerplay.pp_handle, idx, &values[0], &valuesize); 3502 - else if (adev->pm.funcs && adev->pm.funcs->read_sensor) 3503 - r = adev->pm.funcs->read_sensor(adev, idx, &values[0], 3504 - &valuesize); 3501 + r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize); 3505 3502 else 3506 3503 return -EINVAL; 3507 3504
+52 -68
drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
··· 241 241 AMDGPU_PCIE_GEN_INVALID = 0xffff 242 242 }; 243 243 244 - #define amdgpu_dpm_pre_set_power_state(adev) (adev)->pm.funcs->pre_set_power_state((adev)) 245 - #define amdgpu_dpm_set_power_state(adev) (adev)->pm.funcs->set_power_state((adev)) 246 - #define amdgpu_dpm_post_set_power_state(adev) (adev)->pm.funcs->post_set_power_state((adev)) 247 - #define amdgpu_dpm_display_configuration_changed(adev) (adev)->pm.funcs->display_configuration_changed((adev)) 248 - #define amdgpu_dpm_print_power_state(adev, ps) (adev)->pm.funcs->print_power_state((adev), (ps)) 249 - #define amdgpu_dpm_vblank_too_short(adev) (adev)->pm.funcs->vblank_too_short((adev)) 250 - #define amdgpu_dpm_enable_bapm(adev, e) (adev)->pm.funcs->enable_bapm((adev), (e)) 244 + #define amdgpu_dpm_pre_set_power_state(adev) \ 245 + ((adev)->powerplay.pp_funcs->pre_set_power_state((adev)->powerplay.pp_handle)) 246 + 247 + #define amdgpu_dpm_set_power_state(adev) \ 248 + ((adev)->powerplay.pp_funcs->set_power_state((adev)->powerplay.pp_handle)) 249 + 250 + #define amdgpu_dpm_post_set_power_state(adev) \ 251 + ((adev)->powerplay.pp_funcs->post_set_power_state((adev)->powerplay.pp_handle)) 252 + 253 + #define amdgpu_dpm_display_configuration_changed(adev) \ 254 + ((adev)->powerplay.pp_funcs->display_configuration_changed((adev)->powerplay.pp_handle)) 255 + 256 + #define amdgpu_dpm_print_power_state(adev, ps) \ 257 + ((adev)->powerplay.pp_funcs->print_power_state((adev)->powerplay.pp_handle, (ps))) 258 + 259 + #define amdgpu_dpm_vblank_too_short(adev) \ 260 + ((adev)->powerplay.pp_funcs->vblank_too_short((adev)->powerplay.pp_handle)) 261 + 262 + #define amdgpu_dpm_enable_bapm(adev, e) \ 263 + ((adev)->powerplay.pp_funcs->enable_bapm((adev)->powerplay.pp_handle, (e))) 251 264 252 265 #define amdgpu_dpm_read_sensor(adev, idx, value, size) \ 253 - ((adev)->pp_enabled ? \ 254 - (adev)->powerplay.pp_funcs->read_sensor(adev->powerplay.pp_handle, (idx), (value), (size)) : \ 255 - (adev)->pm.funcs->read_sensor((adev), (idx), (value), (size))) 266 + ((adev)->powerplay.pp_funcs->read_sensor((adev)->powerplay.pp_handle, (idx), (value), (size))) 256 267 257 268 #define amdgpu_dpm_get_temperature(adev) \ 258 - ((adev)->pp_enabled ? \ 259 - (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \ 260 - (adev)->pm.funcs->get_temperature((adev))) 269 + ((adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle)) 261 270 262 271 #define amdgpu_dpm_set_fan_control_mode(adev, m) \ 263 - ((adev)->pp_enabled ? \ 264 - (adev)->powerplay.pp_funcs->set_fan_control_mode((adev)->powerplay.pp_handle, (m)) : \ 265 - (adev)->pm.funcs->set_fan_control_mode((adev), (m))) 272 + ((adev)->powerplay.pp_funcs->set_fan_control_mode((adev)->powerplay.pp_handle, (m))) 266 273 267 274 #define amdgpu_dpm_get_fan_control_mode(adev) \ 268 - ((adev)->pp_enabled ? \ 269 - (adev)->powerplay.pp_funcs->get_fan_control_mode((adev)->powerplay.pp_handle) : \ 270 - (adev)->pm.funcs->get_fan_control_mode((adev))) 275 + ((adev)->powerplay.pp_funcs->get_fan_control_mode((adev)->powerplay.pp_handle)) 271 276 272 277 #define amdgpu_dpm_set_fan_speed_percent(adev, s) \ 273 - ((adev)->pp_enabled ? \ 274 - (adev)->powerplay.pp_funcs->set_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ 275 - (adev)->pm.funcs->set_fan_speed_percent((adev), (s))) 278 + ((adev)->powerplay.pp_funcs->set_fan_speed_percent((adev)->powerplay.pp_handle, (s))) 276 279 277 280 #define amdgpu_dpm_get_fan_speed_percent(adev, s) \ 278 - ((adev)->pp_enabled ? \ 279 - (adev)->powerplay.pp_funcs->get_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ 280 - (adev)->pm.funcs->get_fan_speed_percent((adev), (s))) 281 + ((adev)->powerplay.pp_funcs->get_fan_speed_percent((adev)->powerplay.pp_handle, (s))) 281 282 282 283 #define amdgpu_dpm_get_fan_speed_rpm(adev, s) \ 283 - ((adev)->pp_enabled ? \ 284 - (adev)->powerplay.pp_funcs->get_fan_speed_rpm((adev)->powerplay.pp_handle, (s)) : \ 285 - -EINVAL) 284 + ((adev)->powerplay.pp_funcs->get_fan_speed_rpm)((adev)->powerplay.pp_handle, (s)) 286 285 287 286 #define amdgpu_dpm_get_sclk(adev, l) \ 288 - ((adev)->pp_enabled ? \ 289 - (adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l)) : \ 290 - (adev)->pm.funcs->get_sclk((adev), (l))) 287 + ((adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l))) 291 288 292 289 #define amdgpu_dpm_get_mclk(adev, l) \ 293 - ((adev)->pp_enabled ? \ 294 - (adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l)) : \ 295 - (adev)->pm.funcs->get_mclk((adev), (l))) 296 - 290 + ((adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l))) 297 291 298 292 #define amdgpu_dpm_force_performance_level(adev, l) \ 299 - ((adev)->pp_enabled ? \ 300 - (adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l)) : \ 301 - (adev)->pm.funcs->force_performance_level((adev), (l))) 293 + ((adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l))) 302 294 303 295 #define amdgpu_dpm_powergate_uvd(adev, g) \ 304 - ((adev)->pp_enabled ? \ 305 - (adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g)) : \ 306 - (adev)->pm.funcs->powergate_uvd((adev), (g))) 296 + ((adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g))) 307 297 308 298 #define amdgpu_dpm_powergate_vce(adev, g) \ 309 - ((adev)->pp_enabled ? \ 310 - (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \ 311 - (adev)->pm.funcs->powergate_vce((adev), (g))) 299 + ((adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g))) 312 300 313 301 #define amdgpu_dpm_get_current_power_state(adev) \ 314 - (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle) 302 + ((adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle)) 315 303 316 304 #define amdgpu_dpm_get_pp_num_states(adev, data) \ 317 - (adev)->powerplay.pp_funcs->get_pp_num_states((adev)->powerplay.pp_handle, data) 305 + ((adev)->powerplay.pp_funcs->get_pp_num_states((adev)->powerplay.pp_handle, data)) 318 306 319 307 #define amdgpu_dpm_get_pp_table(adev, table) \ 320 - (adev)->powerplay.pp_funcs->get_pp_table((adev)->powerplay.pp_handle, table) 308 + ((adev)->powerplay.pp_funcs->get_pp_table((adev)->powerplay.pp_handle, table)) 321 309 322 310 #define amdgpu_dpm_set_pp_table(adev, buf, size) \ 323 - (adev)->powerplay.pp_funcs->set_pp_table((adev)->powerplay.pp_handle, buf, size) 311 + ((adev)->powerplay.pp_funcs->set_pp_table((adev)->powerplay.pp_handle, buf, size)) 324 312 325 313 #define amdgpu_dpm_print_clock_levels(adev, type, buf) \ 326 - (adev)->powerplay.pp_funcs->print_clock_levels((adev)->powerplay.pp_handle, type, buf) 314 + ((adev)->powerplay.pp_funcs->print_clock_levels((adev)->powerplay.pp_handle, type, buf)) 327 315 328 316 #define amdgpu_dpm_force_clock_level(adev, type, level) \ 329 - (adev)->powerplay.pp_funcs->force_clock_level((adev)->powerplay.pp_handle, type, level) 317 + ((adev)->powerplay.pp_funcs->force_clock_level((adev)->powerplay.pp_handle, type, level)) 330 318 331 319 #define amdgpu_dpm_get_sclk_od(adev) \ 332 - (adev)->powerplay.pp_funcs->get_sclk_od((adev)->powerplay.pp_handle) 320 + ((adev)->powerplay.pp_funcs->get_sclk_od((adev)->powerplay.pp_handle)) 333 321 334 322 #define amdgpu_dpm_set_sclk_od(adev, value) \ 335 - (adev)->powerplay.pp_funcs->set_sclk_od((adev)->powerplay.pp_handle, value) 323 + ((adev)->powerplay.pp_funcs->set_sclk_od((adev)->powerplay.pp_handle, value)) 336 324 337 325 #define amdgpu_dpm_get_mclk_od(adev) \ 338 - ((adev)->powerplay.pp_funcs->get_mclk_od((adev)->powerplay.pp_handle)) 326 + ((adev)->powerplay.pp_funcs->get_mclk_od((adev)->powerplay.pp_handle)) 339 327 340 328 #define amdgpu_dpm_set_mclk_od(adev, value) \ 341 - ((adev)->powerplay.pp_funcs->set_mclk_od((adev)->powerplay.pp_handle, value)) 329 + ((adev)->powerplay.pp_funcs->set_mclk_od((adev)->powerplay.pp_handle, value)) 342 330 343 331 #define amdgpu_dpm_dispatch_task(adev, task_id, input, output) \ 344 - ((adev)->powerplay.pp_funcs->dispatch_tasks)((adev)->powerplay.pp_handle, (task_id), (input), (output)) 332 + ((adev)->powerplay.pp_funcs->dispatch_tasks)((adev)->powerplay.pp_handle, (task_id), (input), (output)) 345 333 346 - #define amgdpu_dpm_check_state_equal(adev, cps, rps, equal) (adev)->pm.funcs->check_state_equal((adev), (cps),(rps),(equal)) 334 + #define amdgpu_dpm_check_state_equal(adev, cps, rps, equal) \ 335 + ((adev)->powerplay.pp_funcs->check_state_equal((adev)->powerplay.pp_handle, (cps), (rps), (equal))) 347 336 348 337 #define amdgpu_dpm_get_vce_clock_state(adev, i) \ 349 - ((adev)->pp_enabled ? \ 350 - (adev)->powerplay.pp_funcs->get_vce_clock_state((adev)->powerplay.pp_handle, (i)) : \ 351 - (adev)->pm.funcs->get_vce_clock_state((adev), (i))) 338 + ((adev)->powerplay.pp_funcs->get_vce_clock_state((adev)->powerplay.pp_handle, (i))) 352 339 353 - #define amdgpu_dpm_get_performance_level(adev) \ 354 - ((adev)->pp_enabled ? \ 355 - (adev)->powerplay.pp_funcs->get_performance_level((adev)->powerplay.pp_handle) : \ 356 - (adev)->pm.dpm.forced_level) 340 + #define amdgpu_dpm_get_performance_level(adev) \ 341 + ((adev)->powerplay.pp_funcs->get_performance_level((adev)->powerplay.pp_handle)) 357 342 358 343 #define amdgpu_dpm_reset_power_profile_state(adev, request) \ 359 - ((adev)->powerplay.pp_funcs->reset_power_profile_state(\ 344 + ((adev)->powerplay.pp_funcs->reset_power_profile_state(\ 360 345 (adev)->powerplay.pp_handle, request)) 361 346 362 347 #define amdgpu_dpm_get_power_profile_state(adev, query) \ 363 - ((adev)->powerplay.pp_funcs->get_power_profile_state(\ 348 + ((adev)->powerplay.pp_funcs->get_power_profile_state(\ 364 349 (adev)->powerplay.pp_handle, query)) 365 350 366 351 #define amdgpu_dpm_set_power_profile_state(adev, request) \ 367 - ((adev)->powerplay.pp_funcs->set_power_profile_state(\ 352 + ((adev)->powerplay.pp_funcs->set_power_profile_state(\ 368 353 (adev)->powerplay.pp_handle, request)) 369 354 370 355 #define amdgpu_dpm_switch_power_profile(adev, type) \ 371 - ((adev)->powerplay.pp_funcs->switch_power_profile(\ 356 + ((adev)->powerplay.pp_funcs->switch_power_profile(\ 372 357 (adev)->powerplay.pp_handle, type)) 373 358 374 359 struct amdgpu_dpm { ··· 427 442 struct amdgpu_dpm dpm; 428 443 const struct firmware *fw; /* SMC firmware */ 429 444 uint32_t fw_version; 430 - const struct amd_pm_funcs *funcs; 431 445 uint32_t pcie_gen_mask; 432 446 uint32_t pcie_mlw_mask; 433 447 struct amd_pp_display_configuration pm_display_cfg;/* set by DAL */
+99 -137
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
··· 74 74 adev->pm.dpm.ac_power = true; 75 75 else 76 76 adev->pm.dpm.ac_power = false; 77 - if (adev->pm.funcs->enable_bapm) 77 + if (adev->powerplay.pp_funcs->enable_bapm) 78 78 amdgpu_dpm_enable_bapm(adev, adev->pm.dpm.ac_power); 79 79 mutex_unlock(&adev->pm.mutex); 80 80 } ··· 88 88 struct amdgpu_device *adev = ddev->dev_private; 89 89 enum amd_pm_state_type pm; 90 90 91 - if (adev->pp_enabled) { 91 + if (adev->powerplay.pp_funcs->get_current_power_state) 92 92 pm = amdgpu_dpm_get_current_power_state(adev); 93 - } else 93 + else 94 94 pm = adev->pm.dpm.user_state; 95 95 96 96 return snprintf(buf, PAGE_SIZE, "%s\n", ··· 140 140 { 141 141 struct drm_device *ddev = dev_get_drvdata(dev); 142 142 struct amdgpu_device *adev = ddev->dev_private; 143 - enum amd_dpm_forced_level level; 143 + enum amd_dpm_forced_level level = 0xff; 144 144 145 145 if ((adev->flags & AMD_IS_PX) && 146 146 (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) 147 147 return snprintf(buf, PAGE_SIZE, "off\n"); 148 148 149 - level = amdgpu_dpm_get_performance_level(adev); 149 + if (adev->powerplay.pp_funcs->get_performance_level) 150 + level = amdgpu_dpm_get_performance_level(adev); 151 + else 152 + level = adev->pm.dpm.forced_level; 153 + 150 154 return snprintf(buf, PAGE_SIZE, "%s\n", 151 155 (level == AMD_DPM_FORCED_LEVEL_AUTO) ? "auto" : 152 156 (level == AMD_DPM_FORCED_LEVEL_LOW) ? "low" : ··· 171 167 struct drm_device *ddev = dev_get_drvdata(dev); 172 168 struct amdgpu_device *adev = ddev->dev_private; 173 169 enum amd_dpm_forced_level level; 174 - enum amd_dpm_forced_level current_level; 170 + enum amd_dpm_forced_level current_level = 0xff; 175 171 int ret = 0; 176 172 177 173 /* Can't force performance level when the card is off */ ··· 179 175 (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) 180 176 return -EINVAL; 181 177 182 - current_level = amdgpu_dpm_get_performance_level(adev); 178 + if (adev->powerplay.pp_funcs->get_performance_level) 179 + current_level = amdgpu_dpm_get_performance_level(adev); 183 180 184 181 if (strncmp("low", buf, strlen("low")) == 0) { 185 182 level = AMD_DPM_FORCED_LEVEL_LOW; ··· 208 203 if (current_level == level) 209 204 return count; 210 205 211 - if (adev->pp_enabled) 212 - amdgpu_dpm_force_performance_level(adev, level); 213 - else { 206 + if (adev->powerplay.pp_funcs->force_performance_level) { 214 207 mutex_lock(&adev->pm.mutex); 215 208 if (adev->pm.dpm.thermal_active) { 216 209 count = -EINVAL; ··· 236 233 struct pp_states_info data; 237 234 int i, buf_len; 238 235 239 - if (adev->pp_enabled) 236 + if (adev->powerplay.pp_funcs->get_pp_num_states) 240 237 amdgpu_dpm_get_pp_num_states(adev, &data); 241 238 242 239 buf_len = snprintf(buf, PAGE_SIZE, "states: %d\n", data.nums); ··· 260 257 enum amd_pm_state_type pm = 0; 261 258 int i = 0; 262 259 263 - if (adev->pp_enabled) { 264 - 260 + if (adev->powerplay.pp_funcs->get_current_power_state 261 + && adev->powerplay.pp_funcs->get_pp_num_states) { 265 262 pm = amdgpu_dpm_get_current_power_state(adev); 266 263 amdgpu_dpm_get_pp_num_states(adev, &data); 267 264 ··· 283 280 { 284 281 struct drm_device *ddev = dev_get_drvdata(dev); 285 282 struct amdgpu_device *adev = ddev->dev_private; 286 - struct pp_states_info data; 287 - enum amd_pm_state_type pm = 0; 288 - int i; 289 283 290 - if (adev->pp_force_state_enabled && adev->pp_enabled) { 291 - pm = amdgpu_dpm_get_current_power_state(adev); 292 - amdgpu_dpm_get_pp_num_states(adev, &data); 293 - 294 - for (i = 0; i < data.nums; i++) { 295 - if (pm == data.states[i]) 296 - break; 297 - } 298 - 299 - if (i == data.nums) 300 - i = -EINVAL; 301 - 302 - return snprintf(buf, PAGE_SIZE, "%d\n", i); 303 - 304 - } else 284 + if (adev->pp_force_state_enabled) 285 + return amdgpu_get_pp_cur_state(dev, attr, buf); 286 + else 305 287 return snprintf(buf, PAGE_SIZE, "\n"); 306 288 } 307 289 ··· 335 347 char *table = NULL; 336 348 int size; 337 349 338 - if (adev->pp_enabled) 350 + if (adev->powerplay.pp_funcs->get_pp_table) 339 351 size = amdgpu_dpm_get_pp_table(adev, &table); 340 352 else 341 353 return 0; ··· 356 368 struct drm_device *ddev = dev_get_drvdata(dev); 357 369 struct amdgpu_device *adev = ddev->dev_private; 358 370 359 - if (adev->pp_enabled) 371 + if (adev->powerplay.pp_funcs->set_pp_table) 360 372 amdgpu_dpm_set_pp_table(adev, buf, count); 361 373 362 374 return count; ··· 368 380 { 369 381 struct drm_device *ddev = dev_get_drvdata(dev); 370 382 struct amdgpu_device *adev = ddev->dev_private; 371 - ssize_t size = 0; 372 383 373 - if (adev->pp_enabled) 374 - size = amdgpu_dpm_print_clock_levels(adev, PP_SCLK, buf); 375 - else if (adev->pm.funcs->print_clock_levels) 376 - size = adev->pm.funcs->print_clock_levels(adev, PP_SCLK, buf); 377 - 378 - return size; 384 + if (adev->powerplay.pp_funcs->print_clock_levels) 385 + return amdgpu_dpm_print_clock_levels(adev, PP_SCLK, buf); 386 + else 387 + return snprintf(buf, PAGE_SIZE, "\n"); 379 388 } 380 389 381 390 static ssize_t amdgpu_set_pp_dpm_sclk(struct device *dev, ··· 401 416 mask |= 1 << level; 402 417 } 403 418 404 - if (adev->pp_enabled) 419 + if (adev->powerplay.pp_funcs->force_clock_level) 405 420 amdgpu_dpm_force_clock_level(adev, PP_SCLK, mask); 406 - else if (adev->pm.funcs->force_clock_level) 407 - adev->pm.funcs->force_clock_level(adev, PP_SCLK, mask); 421 + 408 422 fail: 409 423 return count; 410 424 } ··· 414 430 { 415 431 struct drm_device *ddev = dev_get_drvdata(dev); 416 432 struct amdgpu_device *adev = ddev->dev_private; 417 - ssize_t size = 0; 418 433 419 - if (adev->pp_enabled) 420 - size = amdgpu_dpm_print_clock_levels(adev, PP_MCLK, buf); 421 - else if (adev->pm.funcs->print_clock_levels) 422 - size = adev->pm.funcs->print_clock_levels(adev, PP_MCLK, buf); 423 - 424 - return size; 434 + if (adev->powerplay.pp_funcs->print_clock_levels) 435 + return amdgpu_dpm_print_clock_levels(adev, PP_MCLK, buf); 436 + else 437 + return snprintf(buf, PAGE_SIZE, "\n"); 425 438 } 426 439 427 440 static ssize_t amdgpu_set_pp_dpm_mclk(struct device *dev, ··· 446 465 } 447 466 mask |= 1 << level; 448 467 } 449 - 450 - if (adev->pp_enabled) 468 + if (adev->powerplay.pp_funcs->force_clock_level) 451 469 amdgpu_dpm_force_clock_level(adev, PP_MCLK, mask); 452 - else if (adev->pm.funcs->force_clock_level) 453 - adev->pm.funcs->force_clock_level(adev, PP_MCLK, mask); 470 + 454 471 fail: 455 472 return count; 456 473 } ··· 459 480 { 460 481 struct drm_device *ddev = dev_get_drvdata(dev); 461 482 struct amdgpu_device *adev = ddev->dev_private; 462 - ssize_t size = 0; 463 483 464 - if (adev->pp_enabled) 465 - size = amdgpu_dpm_print_clock_levels(adev, PP_PCIE, buf); 466 - else if (adev->pm.funcs->print_clock_levels) 467 - size = adev->pm.funcs->print_clock_levels(adev, PP_PCIE, buf); 468 - 469 - return size; 484 + if (adev->powerplay.pp_funcs->print_clock_levels) 485 + return amdgpu_dpm_print_clock_levels(adev, PP_PCIE, buf); 486 + else 487 + return snprintf(buf, PAGE_SIZE, "\n"); 470 488 } 471 489 472 490 static ssize_t amdgpu_set_pp_dpm_pcie(struct device *dev, ··· 491 515 } 492 516 mask |= 1 << level; 493 517 } 494 - 495 - if (adev->pp_enabled) 518 + if (adev->powerplay.pp_funcs->force_clock_level) 496 519 amdgpu_dpm_force_clock_level(adev, PP_PCIE, mask); 497 - else if (adev->pm.funcs->force_clock_level) 498 - adev->pm.funcs->force_clock_level(adev, PP_PCIE, mask); 520 + 499 521 fail: 500 522 return count; 501 523 } ··· 506 532 struct amdgpu_device *adev = ddev->dev_private; 507 533 uint32_t value = 0; 508 534 509 - if (adev->pp_enabled) 535 + if (adev->powerplay.pp_funcs->get_sclk_od) 510 536 value = amdgpu_dpm_get_sclk_od(adev); 511 - else if (adev->pm.funcs->get_sclk_od) 512 - value = adev->pm.funcs->get_sclk_od(adev); 513 537 514 538 return snprintf(buf, PAGE_SIZE, "%d\n", value); 515 539 } ··· 528 556 count = -EINVAL; 529 557 goto fail; 530 558 } 559 + if (adev->powerplay.pp_funcs->set_sclk_od) 560 + amdgpu_dpm_set_sclk_od(adev, (uint32_t)value); 531 561 532 562 if (adev->pp_enabled) { 533 - amdgpu_dpm_set_sclk_od(adev, (uint32_t)value); 534 563 amdgpu_dpm_dispatch_task(adev, AMD_PP_TASK_READJUST_POWER_STATE, NULL, NULL); 535 - } else if (adev->pm.funcs->set_sclk_od) { 536 - adev->pm.funcs->set_sclk_od(adev, (uint32_t)value); 564 + } else { 537 565 adev->pm.dpm.current_ps = adev->pm.dpm.boot_ps; 538 566 amdgpu_pm_compute_clocks(adev); 539 567 } ··· 550 578 struct amdgpu_device *adev = ddev->dev_private; 551 579 uint32_t value = 0; 552 580 553 - if (adev->pp_enabled) 581 + if (adev->powerplay.pp_funcs->get_mclk_od) 554 582 value = amdgpu_dpm_get_mclk_od(adev); 555 - else if (adev->pm.funcs->get_mclk_od) 556 - value = adev->pm.funcs->get_mclk_od(adev); 557 583 558 584 return snprintf(buf, PAGE_SIZE, "%d\n", value); 559 585 } ··· 572 602 count = -EINVAL; 573 603 goto fail; 574 604 } 605 + if (adev->powerplay.pp_funcs->set_mclk_od) 606 + amdgpu_dpm_set_mclk_od(adev, (uint32_t)value); 575 607 576 608 if (adev->pp_enabled) { 577 - amdgpu_dpm_set_mclk_od(adev, (uint32_t)value); 578 609 amdgpu_dpm_dispatch_task(adev, AMD_PP_TASK_READJUST_POWER_STATE, NULL, NULL); 579 - } else if (adev->pm.funcs->set_mclk_od) { 580 - adev->pm.funcs->set_mclk_od(adev, (uint32_t)value); 610 + } else { 581 611 adev->pm.dpm.current_ps = adev->pm.dpm.boot_ps; 582 612 amdgpu_pm_compute_clocks(adev); 583 613 } ··· 591 621 { 592 622 struct drm_device *ddev = dev_get_drvdata(dev); 593 623 struct amdgpu_device *adev = ddev->dev_private; 594 - int ret = 0; 624 + int ret = 0xff; 595 625 596 - if (adev->pp_enabled) 626 + if (adev->powerplay.pp_funcs->get_power_profile_state) 597 627 ret = amdgpu_dpm_get_power_profile_state( 598 - adev, query); 599 - else if (adev->pm.funcs->get_power_profile_state) 600 - ret = adev->pm.funcs->get_power_profile_state( 601 628 adev, query); 602 629 603 630 if (ret) ··· 642 675 char *sub_str, buf_cpy[128], *tmp_str; 643 676 const char delimiter[3] = {' ', '\n', '\0'}; 644 677 long int value; 645 - int ret = 0; 678 + int ret = 0xff; 646 679 647 680 if (strncmp("reset", buf, strlen("reset")) == 0) { 648 - if (adev->pp_enabled) 681 + if (adev->powerplay.pp_funcs->reset_power_profile_state) 649 682 ret = amdgpu_dpm_reset_power_profile_state( 650 - adev, request); 651 - else if (adev->pm.funcs->reset_power_profile_state) 652 - ret = adev->pm.funcs->reset_power_profile_state( 653 683 adev, request); 654 684 if (ret) { 655 685 count = -EINVAL; ··· 656 692 } 657 693 658 694 if (strncmp("set", buf, strlen("set")) == 0) { 659 - if (adev->pp_enabled) 695 + if (adev->powerplay.pp_funcs->set_power_profile_state) 660 696 ret = amdgpu_dpm_set_power_profile_state( 661 697 adev, request); 662 - else if (adev->pm.funcs->set_power_profile_state) 663 - ret = adev->pm.funcs->set_power_profile_state( 664 - adev, request); 698 + 665 699 if (ret) { 666 700 count = -EINVAL; 667 701 goto fail; ··· 707 745 708 746 loop++; 709 747 } 710 - 711 - if (adev->pp_enabled) 712 - ret = amdgpu_dpm_set_power_profile_state( 713 - adev, request); 714 - else if (adev->pm.funcs->set_power_profile_state) 715 - ret = adev->pm.funcs->set_power_profile_state( 716 - adev, request); 748 + if (adev->powerplay.pp_funcs->set_power_profile_state) 749 + ret = amdgpu_dpm_set_power_profile_state(adev, request); 717 750 718 751 if (ret) 719 752 count = -EINVAL; ··· 788 831 (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) 789 832 return -EINVAL; 790 833 791 - if (!adev->pp_enabled && !adev->pm.funcs->get_temperature) 834 + if (!adev->powerplay.pp_funcs->get_temperature) 792 835 temp = 0; 793 836 else 794 837 temp = amdgpu_dpm_get_temperature(adev); ··· 819 862 struct amdgpu_device *adev = dev_get_drvdata(dev); 820 863 u32 pwm_mode = 0; 821 864 822 - if (!adev->pp_enabled && !adev->pm.funcs->get_fan_control_mode) 865 + if (!adev->powerplay.pp_funcs->get_fan_control_mode) 823 866 return -EINVAL; 824 867 825 868 pwm_mode = amdgpu_dpm_get_fan_control_mode(adev); ··· 836 879 int err; 837 880 int value; 838 881 839 - if (!adev->pp_enabled && !adev->pm.funcs->set_fan_control_mode) 882 + if (!adev->powerplay.pp_funcs->set_fan_control_mode) 840 883 return -EINVAL; 841 884 842 885 err = kstrtoint(buf, 10, &value); ··· 876 919 877 920 value = (value * 100) / 255; 878 921 879 - err = amdgpu_dpm_set_fan_speed_percent(adev, value); 880 - if (err) 881 - return err; 922 + if (adev->powerplay.pp_funcs->set_fan_speed_percent) { 923 + err = amdgpu_dpm_set_fan_speed_percent(adev, value); 924 + if (err) 925 + return err; 926 + } 882 927 883 928 return count; 884 929 } ··· 891 932 { 892 933 struct amdgpu_device *adev = dev_get_drvdata(dev); 893 934 int err; 894 - u32 speed; 935 + u32 speed = 0; 895 936 896 - err = amdgpu_dpm_get_fan_speed_percent(adev, &speed); 897 - if (err) 898 - return err; 937 + if (adev->powerplay.pp_funcs->get_fan_speed_percent) { 938 + err = amdgpu_dpm_get_fan_speed_percent(adev, &speed); 939 + if (err) 940 + return err; 941 + } 899 942 900 943 speed = (speed * 255) / 100; 901 944 ··· 910 949 { 911 950 struct amdgpu_device *adev = dev_get_drvdata(dev); 912 951 int err; 913 - u32 speed; 952 + u32 speed = 0; 914 953 915 - err = amdgpu_dpm_get_fan_speed_rpm(adev, &speed); 916 - if (err) 917 - return err; 954 + if (adev->powerplay.pp_funcs->get_fan_speed_rpm) { 955 + err = amdgpu_dpm_get_fan_speed_rpm(adev, &speed); 956 + if (err) 957 + return err; 958 + } 918 959 919 960 return sprintf(buf, "%i\n", speed); 920 961 } ··· 971 1008 return 0; 972 1009 973 1010 /* mask fan attributes if we have no bindings for this asic to expose */ 974 - if ((!adev->pm.funcs->get_fan_speed_percent && 1011 + if ((!adev->powerplay.pp_funcs->get_fan_speed_percent && 975 1012 attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't query fan */ 976 - (!adev->pm.funcs->get_fan_control_mode && 1013 + (!adev->powerplay.pp_funcs->get_fan_control_mode && 977 1014 attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't query state */ 978 1015 effective_mode &= ~S_IRUGO; 979 1016 980 - if ((!adev->pm.funcs->set_fan_speed_percent && 1017 + if ((!adev->powerplay.pp_funcs->set_fan_speed_percent && 981 1018 attr == &sensor_dev_attr_pwm1.dev_attr.attr) || /* can't manage fan */ 982 - (!adev->pm.funcs->set_fan_control_mode && 1019 + (!adev->powerplay.pp_funcs->set_fan_control_mode && 983 1020 attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't manage state */ 984 1021 effective_mode &= ~S_IWUSR; 985 1022 986 1023 /* hide max/min values if we can't both query and manage the fan */ 987 - if ((!adev->pm.funcs->set_fan_speed_percent && 988 - !adev->pm.funcs->get_fan_speed_percent) && 1024 + if ((!adev->powerplay.pp_funcs->set_fan_speed_percent && 1025 + !adev->powerplay.pp_funcs->get_fan_speed_percent) && 989 1026 (attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || 990 1027 attr == &sensor_dev_attr_pwm1_min.dev_attr.attr)) 991 1028 return 0; ··· 1018 1055 if (!adev->pm.dpm_enabled) 1019 1056 return; 1020 1057 1021 - if (adev->pm.funcs->get_temperature) { 1058 + if (adev->powerplay.pp_funcs->get_temperature) { 1022 1059 int temp = amdgpu_dpm_get_temperature(adev); 1023 1060 1024 1061 if (temp < adev->pm.dpm.thermal.min_temp) ··· 1050 1087 true : false; 1051 1088 1052 1089 /* check if the vblank period is too short to adjust the mclk */ 1053 - if (single_display && adev->pm.funcs->vblank_too_short) { 1090 + if (single_display && adev->powerplay.pp_funcs->vblank_too_short) { 1054 1091 if (amdgpu_dpm_vblank_too_short(adev)) 1055 1092 single_display = false; 1056 1093 } ··· 1179 1216 struct amdgpu_ps *ps; 1180 1217 enum amd_pm_state_type dpm_state; 1181 1218 int ret; 1182 - bool equal; 1219 + bool equal = false; 1183 1220 1184 1221 /* if dpm init failed */ 1185 1222 if (!adev->pm.dpm_enabled) ··· 1199 1236 else 1200 1237 return; 1201 1238 1202 - if (amdgpu_dpm == 1) { 1239 + if (amdgpu_dpm == 1 && adev->powerplay.pp_funcs->print_power_state) { 1203 1240 printk("switching from power state:\n"); 1204 1241 amdgpu_dpm_print_power_state(adev, adev->pm.dpm.current_ps); 1205 1242 printk("switching to power state:\n"); ··· 1208 1245 1209 1246 /* update whether vce is active */ 1210 1247 ps->vce_active = adev->pm.dpm.vce_active; 1211 - 1212 - amdgpu_dpm_display_configuration_changed(adev); 1248 + if (adev->powerplay.pp_funcs->display_configuration_changed) 1249 + amdgpu_dpm_display_configuration_changed(adev); 1213 1250 1214 1251 ret = amdgpu_dpm_pre_set_power_state(adev); 1215 1252 if (ret) 1216 1253 return; 1217 1254 1218 - if ((0 != amgdpu_dpm_check_state_equal(adev, adev->pm.dpm.current_ps, adev->pm.dpm.requested_ps, &equal))) 1219 - equal = false; 1255 + if (adev->powerplay.pp_funcs->check_state_equal) { 1256 + if (0 != amdgpu_dpm_check_state_equal(adev, adev->pm.dpm.current_ps, adev->pm.dpm.requested_ps, &equal)) 1257 + equal = false; 1258 + } 1220 1259 1221 1260 if (equal) 1222 1261 return; ··· 1229 1264 adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs; 1230 1265 adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count; 1231 1266 1232 - if (adev->pm.funcs->force_performance_level) { 1267 + if (adev->powerplay.pp_funcs->force_performance_level) { 1233 1268 if (adev->pm.dpm.thermal_active) { 1234 1269 enum amd_dpm_forced_level level = adev->pm.dpm.forced_level; 1235 1270 /* force low perf level for thermal */ ··· 1245 1280 1246 1281 void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable) 1247 1282 { 1248 - if (adev->pp_enabled || adev->pm.funcs->powergate_uvd) { 1283 + if (adev->powerplay.pp_funcs->powergate_uvd) { 1249 1284 /* enable/disable UVD */ 1250 1285 mutex_lock(&adev->pm.mutex); 1251 1286 amdgpu_dpm_powergate_uvd(adev, !enable); ··· 1267 1302 1268 1303 void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable) 1269 1304 { 1270 - if (adev->pp_enabled || adev->pm.funcs->powergate_vce) { 1305 + if (adev->powerplay.pp_funcs->powergate_vce) { 1271 1306 /* enable/disable VCE */ 1272 1307 mutex_lock(&adev->pm.mutex); 1273 1308 amdgpu_dpm_powergate_vce(adev, !enable); ··· 1302 1337 { 1303 1338 int i; 1304 1339 1305 - if (adev->pp_enabled) 1306 - /* TO DO */ 1340 + if (adev->powerplay.pp_funcs->print_power_state == NULL) 1307 1341 return; 1308 1342 1309 1343 for (i = 0; i < adev->pm.dpm.num_ps; i++) ··· 1317 1353 if (adev->pm.sysfs_initialized) 1318 1354 return 0; 1319 1355 1320 - if (!adev->pp_enabled) { 1321 - if (adev->pm.funcs->get_temperature == NULL) 1322 - return 0; 1323 - } 1356 + if (adev->powerplay.pp_funcs->get_temperature == NULL) 1357 + return 0; 1324 1358 1325 1359 adev->pm.int_hwmon_dev = hwmon_device_register_with_groups(adev->dev, 1326 1360 DRIVER_NAME, adev, ··· 1596 1634 return amdgpu_debugfs_pm_info_pp(m, adev); 1597 1635 } else { 1598 1636 mutex_lock(&adev->pm.mutex); 1599 - if (adev->pm.funcs->debugfs_print_current_performance_level) 1600 - adev->pm.funcs->debugfs_print_current_performance_level(adev, m); 1637 + if (adev->powerplay.pp_funcs->debugfs_print_current_performance_level) 1638 + adev->powerplay.pp_funcs->debugfs_print_current_performance_level(adev, m); 1601 1639 else 1602 1640 seq_printf(m, "Debugfs support not implemented for this asic\n"); 1603 1641 mutex_unlock(&adev->pm.mutex);
+3
drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
··· 87 87 case CHIP_OLAND: 88 88 case CHIP_HAINAN: 89 89 amd_pp->ip_funcs = &si_dpm_ip_funcs; 90 + amd_pp->pp_funcs = &si_dpm_funcs; 90 91 break; 91 92 #endif 92 93 #ifdef CONFIG_DRM_AMDGPU_CIK 93 94 case CHIP_BONAIRE: 94 95 case CHIP_HAWAII: 95 96 amd_pp->ip_funcs = &ci_dpm_ip_funcs; 97 + amd_pp->pp_funcs = &ci_dpm_funcs; 96 98 break; 97 99 case CHIP_KABINI: 98 100 case CHIP_MULLINS: 99 101 case CHIP_KAVERI: 100 102 amd_pp->ip_funcs = &kv_dpm_ip_funcs; 103 + amd_pp->pp_funcs = &kv_dpm_funcs; 101 104 break; 102 105 #endif 103 106 default:
+1 -9
drivers/gpu/drm/amd/amdgpu/ci_dpm.c
··· 307 307 static int ci_set_overdrive_target_tdp(struct amdgpu_device *adev, 308 308 u32 target_tdp); 309 309 static int ci_update_uvd_dpm(struct amdgpu_device *adev, bool gate); 310 - static void ci_dpm_set_dpm_funcs(struct amdgpu_device *adev); 311 310 static void ci_dpm_set_irq_funcs(struct amdgpu_device *adev); 312 311 313 312 static PPSMC_Result amdgpu_ci_send_msg_to_smc_with_parameter(struct amdgpu_device *adev, ··· 6281 6282 { 6282 6283 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 6283 6284 6284 - ci_dpm_set_dpm_funcs(adev); 6285 6285 ci_dpm_set_irq_funcs(adev); 6286 6286 6287 6287 return 0; ··· 7033 7035 .set_powergating_state = ci_dpm_set_powergating_state, 7034 7036 }; 7035 7037 7036 - static const struct amd_pm_funcs ci_dpm_funcs = { 7038 + const struct amd_pm_funcs ci_dpm_funcs = { 7037 7039 .get_temperature = &ci_dpm_get_temp, 7038 7040 .pre_set_power_state = &ci_dpm_pre_set_power_state, 7039 7041 .set_power_state = &ci_dpm_set_power_state, ··· 7064 7066 .switch_power_profile = ci_dpm_switch_power_profile, 7065 7067 .read_sensor = ci_dpm_read_sensor, 7066 7068 }; 7067 - 7068 - static void ci_dpm_set_dpm_funcs(struct amdgpu_device *adev) 7069 - { 7070 - if (adev->pm.funcs == NULL) 7071 - adev->pm.funcs = &ci_dpm_funcs; 7072 - } 7073 7069 7074 7070 static const struct amdgpu_irq_src_funcs ci_dpm_irq_funcs = { 7075 7071 .set = ci_dpm_set_interrupt_state,
+2 -1
drivers/gpu/drm/amd/amdgpu/cik_dpm.h
··· 26 26 27 27 extern const struct amd_ip_funcs ci_dpm_ip_funcs; 28 28 extern const struct amd_ip_funcs kv_dpm_ip_funcs; 29 - 29 + extern const struct amd_pm_funcs ci_dpm_funcs; 30 + extern const struct amd_pm_funcs kv_dpm_funcs; 30 31 #endif
+1 -9
drivers/gpu/drm/amd/amdgpu/kv_dpm.c
··· 42 42 #define KV_MINIMUM_ENGINE_CLOCK 800 43 43 #define SMC_RAM_END 0x40000 44 44 45 - static void kv_dpm_set_dpm_funcs(struct amdgpu_device *adev); 46 45 static void kv_dpm_set_irq_funcs(struct amdgpu_device *adev); 47 46 static int kv_enable_nb_dpm(struct amdgpu_device *adev, 48 47 bool enable); ··· 2960 2961 { 2961 2962 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2962 2963 2963 - kv_dpm_set_dpm_funcs(adev); 2964 2964 kv_dpm_set_irq_funcs(adev); 2965 2965 2966 2966 return 0; ··· 3325 3327 .set_powergating_state = kv_dpm_set_powergating_state, 3326 3328 }; 3327 3329 3328 - static const struct amd_pm_funcs kv_dpm_funcs = { 3330 + const struct amd_pm_funcs kv_dpm_funcs = { 3329 3331 .get_temperature = &kv_dpm_get_temp, 3330 3332 .pre_set_power_state = &kv_dpm_pre_set_power_state, 3331 3333 .set_power_state = &kv_dpm_set_power_state, ··· 3342 3344 .check_state_equal = kv_check_state_equal, 3343 3345 .read_sensor = &kv_dpm_read_sensor, 3344 3346 }; 3345 - 3346 - static void kv_dpm_set_dpm_funcs(struct amdgpu_device *adev) 3347 - { 3348 - if (adev->pm.funcs == NULL) 3349 - adev->pm.funcs = &kv_dpm_funcs; 3350 - } 3351 3347 3352 3348 static const struct amdgpu_irq_src_funcs kv_dpm_irq_funcs = { 3353 3349 .set = kv_dpm_set_interrupt_state,
+1 -9
drivers/gpu/drm/amd/amdgpu/si_dpm.c
··· 1847 1847 1848 1848 static void si_thermal_start_smc_fan_control(struct amdgpu_device *adev); 1849 1849 static void si_fan_ctrl_set_default_mode(struct amdgpu_device *adev); 1850 - static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev); 1851 1850 static void si_dpm_set_irq_funcs(struct amdgpu_device *adev); 1852 1851 1853 1852 static struct si_power_info *si_get_pi(struct amdgpu_device *adev) ··· 7943 7944 7944 7945 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 7945 7946 7946 - si_dpm_set_dpm_funcs(adev); 7947 7947 si_dpm_set_irq_funcs(adev); 7948 7948 return 0; 7949 7949 } ··· 8060 8062 .set_powergating_state = si_dpm_set_powergating_state, 8061 8063 }; 8062 8064 8063 - static const struct amd_pm_funcs si_dpm_funcs = { 8065 + const struct amd_pm_funcs si_dpm_funcs = { 8064 8066 .get_temperature = &si_dpm_get_temp, 8065 8067 .pre_set_power_state = &si_dpm_pre_set_power_state, 8066 8068 .set_power_state = &si_dpm_set_power_state, ··· 8080 8082 .get_vce_clock_state = amdgpu_get_vce_clock_state, 8081 8083 .read_sensor = &si_dpm_read_sensor, 8082 8084 }; 8083 - 8084 - static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev) 8085 - { 8086 - if (adev->pm.funcs == NULL) 8087 - adev->pm.funcs = &si_dpm_funcs; 8088 - } 8089 8085 8090 8086 static const struct amdgpu_irq_src_funcs si_dpm_irq_funcs = { 8091 8087 .set = si_dpm_set_interrupt_state,
+1
drivers/gpu/drm/amd/amdgpu/si_dpm.h
··· 246 246 }; 247 247 248 248 extern const struct amd_ip_funcs si_dpm_ip_funcs; 249 + extern const struct amd_pm_funcs si_dpm_funcs; 249 250 250 251 struct ni_leakage_coeffients 251 252 {