1 /* 2 * Copyright 2011 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: Alex Deucher 23 */ 24 25 #include "amdgpu.h" 26 #include "amdgpu_atombios.h" 27 #include "amdgpu_i2c.h" 28 #include "amdgpu_dpm.h" 29 #include "atom.h" 30 #include "amd_pcie.h" 31 #include "amdgpu_display.h" 32 #include "hwmgr.h" 33 #include <linux/power_supply.h> 34 #include "amdgpu_smu.h" 35 36 #define amdgpu_dpm_enable_bapm(adev, e) \ 37 ((adev)->powerplay.pp_funcs->enable_bapm((adev)->powerplay.pp_handle, (e))) 38 39 #define amdgpu_dpm_is_legacy_dpm(adev) ((adev)->powerplay.pp_handle == (adev)) 40 41 int amdgpu_dpm_get_sclk(struct amdgpu_device *adev, bool low) 42 { 43 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 44 int ret = 0; 45 46 if (!pp_funcs->get_sclk) 47 return 0; 48 49 mutex_lock(&adev->pm.mutex); 50 ret = pp_funcs->get_sclk((adev)->powerplay.pp_handle, 51 low); 52 mutex_unlock(&adev->pm.mutex); 53 54 return ret; 55 } 56 57 int amdgpu_dpm_get_mclk(struct amdgpu_device *adev, bool low) 58 { 59 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 60 int ret = 0; 61 62 if (!pp_funcs->get_mclk) 63 return 0; 64 65 mutex_lock(&adev->pm.mutex); 66 ret = pp_funcs->get_mclk((adev)->powerplay.pp_handle, 67 low); 68 mutex_unlock(&adev->pm.mutex); 69 70 return ret; 71 } 72 73 int amdgpu_dpm_set_powergating_by_smu(struct amdgpu_device *adev, 74 uint32_t block_type, 75 bool gate, 76 int inst) 77 { 78 int ret = 0; 79 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 80 enum ip_power_state pwr_state = gate ? POWER_STATE_OFF : POWER_STATE_ON; 81 bool is_vcn = block_type == AMD_IP_BLOCK_TYPE_VCN; 82 83 if (atomic_read(&adev->pm.pwr_state[block_type]) == pwr_state && 84 (!is_vcn || adev->vcn.num_vcn_inst == 1)) { 85 dev_dbg(adev->dev, "IP block%d already in the target %s state!", 86 block_type, gate ? "gate" : "ungate"); 87 return 0; 88 } 89 90 mutex_lock(&adev->pm.mutex); 91 92 switch (block_type) { 93 case AMD_IP_BLOCK_TYPE_UVD: 94 case AMD_IP_BLOCK_TYPE_VCE: 95 case AMD_IP_BLOCK_TYPE_GFX: 96 case AMD_IP_BLOCK_TYPE_SDMA: 97 case AMD_IP_BLOCK_TYPE_JPEG: 98 case AMD_IP_BLOCK_TYPE_GMC: 99 case AMD_IP_BLOCK_TYPE_ACP: 100 case AMD_IP_BLOCK_TYPE_VPE: 101 if (pp_funcs && pp_funcs->set_powergating_by_smu) 102 ret = (pp_funcs->set_powergating_by_smu( 103 (adev)->powerplay.pp_handle, block_type, gate, 0)); 104 break; 105 case AMD_IP_BLOCK_TYPE_VCN: 106 if (pp_funcs && pp_funcs->set_powergating_by_smu) 107 ret = (pp_funcs->set_powergating_by_smu( 108 (adev)->powerplay.pp_handle, block_type, gate, inst)); 109 break; 110 default: 111 break; 112 } 113 114 if (!ret) 115 atomic_set(&adev->pm.pwr_state[block_type], pwr_state); 116 117 mutex_unlock(&adev->pm.mutex); 118 119 return ret; 120 } 121 122 int amdgpu_dpm_set_gfx_power_up_by_imu(struct amdgpu_device *adev) 123 { 124 struct smu_context *smu = adev->powerplay.pp_handle; 125 int ret = -EOPNOTSUPP; 126 127 mutex_lock(&adev->pm.mutex); 128 ret = smu_set_gfx_power_up_by_imu(smu); 129 mutex_unlock(&adev->pm.mutex); 130 131 msleep(10); 132 133 return ret; 134 } 135 136 int amdgpu_dpm_baco_enter(struct amdgpu_device *adev) 137 { 138 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 139 void *pp_handle = adev->powerplay.pp_handle; 140 int ret = 0; 141 142 if (!pp_funcs || !pp_funcs->set_asic_baco_state) 143 return -ENOENT; 144 145 mutex_lock(&adev->pm.mutex); 146 147 /* enter BACO state */ 148 ret = pp_funcs->set_asic_baco_state(pp_handle, 1); 149 150 mutex_unlock(&adev->pm.mutex); 151 152 return ret; 153 } 154 155 int amdgpu_dpm_baco_exit(struct amdgpu_device *adev) 156 { 157 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 158 void *pp_handle = adev->powerplay.pp_handle; 159 int ret = 0; 160 161 if (!pp_funcs || !pp_funcs->set_asic_baco_state) 162 return -ENOENT; 163 164 mutex_lock(&adev->pm.mutex); 165 166 /* exit BACO state */ 167 ret = pp_funcs->set_asic_baco_state(pp_handle, 0); 168 169 mutex_unlock(&adev->pm.mutex); 170 171 return ret; 172 } 173 174 int amdgpu_dpm_set_mp1_state(struct amdgpu_device *adev, 175 enum pp_mp1_state mp1_state) 176 { 177 int ret = 0; 178 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 179 180 if (mp1_state == PP_MP1_STATE_FLR) { 181 /* VF lost access to SMU */ 182 if (amdgpu_sriov_vf(adev)) 183 adev->pm.dpm_enabled = false; 184 } else if (pp_funcs && pp_funcs->set_mp1_state) { 185 mutex_lock(&adev->pm.mutex); 186 187 ret = pp_funcs->set_mp1_state( 188 adev->powerplay.pp_handle, 189 mp1_state); 190 191 mutex_unlock(&adev->pm.mutex); 192 } 193 194 return ret; 195 } 196 197 int amdgpu_dpm_notify_rlc_state(struct amdgpu_device *adev, bool en) 198 { 199 int ret = 0; 200 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 201 202 if (pp_funcs && pp_funcs->notify_rlc_state) { 203 mutex_lock(&adev->pm.mutex); 204 205 ret = pp_funcs->notify_rlc_state( 206 adev->powerplay.pp_handle, 207 en); 208 209 mutex_unlock(&adev->pm.mutex); 210 } 211 212 return ret; 213 } 214 215 int amdgpu_dpm_is_baco_supported(struct amdgpu_device *adev) 216 { 217 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 218 void *pp_handle = adev->powerplay.pp_handle; 219 int ret; 220 221 if (!pp_funcs || !pp_funcs->get_asic_baco_capability) 222 return 0; 223 /* Don't use baco for reset in S3. 224 * This is a workaround for some platforms 225 * where entering BACO during suspend 226 * seems to cause reboots or hangs. 227 * This might be related to the fact that BACO controls 228 * power to the whole GPU including devices like audio and USB. 229 * Powering down/up everything may adversely affect these other 230 * devices. Needs more investigation. 231 */ 232 if (adev->in_s3) 233 return 0; 234 235 mutex_lock(&adev->pm.mutex); 236 237 ret = pp_funcs->get_asic_baco_capability(pp_handle); 238 239 mutex_unlock(&adev->pm.mutex); 240 241 return ret; 242 } 243 244 int amdgpu_dpm_mode2_reset(struct amdgpu_device *adev) 245 { 246 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 247 void *pp_handle = adev->powerplay.pp_handle; 248 int ret = 0; 249 250 if (!pp_funcs || !pp_funcs->asic_reset_mode_2) 251 return -ENOENT; 252 253 mutex_lock(&adev->pm.mutex); 254 255 ret = pp_funcs->asic_reset_mode_2(pp_handle); 256 257 mutex_unlock(&adev->pm.mutex); 258 259 return ret; 260 } 261 262 int amdgpu_dpm_enable_gfx_features(struct amdgpu_device *adev) 263 { 264 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 265 void *pp_handle = adev->powerplay.pp_handle; 266 int ret = 0; 267 268 if (!pp_funcs || !pp_funcs->asic_reset_enable_gfx_features) 269 return -ENOENT; 270 271 mutex_lock(&adev->pm.mutex); 272 273 ret = pp_funcs->asic_reset_enable_gfx_features(pp_handle); 274 275 mutex_unlock(&adev->pm.mutex); 276 277 return ret; 278 } 279 280 int amdgpu_dpm_baco_reset(struct amdgpu_device *adev) 281 { 282 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 283 void *pp_handle = adev->powerplay.pp_handle; 284 int ret = 0; 285 286 if (!pp_funcs || !pp_funcs->set_asic_baco_state) 287 return -ENOENT; 288 289 mutex_lock(&adev->pm.mutex); 290 291 /* enter BACO state */ 292 ret = pp_funcs->set_asic_baco_state(pp_handle, 1); 293 if (ret) 294 goto out; 295 296 /* exit BACO state */ 297 ret = pp_funcs->set_asic_baco_state(pp_handle, 0); 298 299 out: 300 mutex_unlock(&adev->pm.mutex); 301 return ret; 302 } 303 304 bool amdgpu_dpm_is_mode1_reset_supported(struct amdgpu_device *adev) 305 { 306 struct smu_context *smu = adev->powerplay.pp_handle; 307 bool support_mode1_reset = false; 308 309 if (is_support_sw_smu(adev)) { 310 mutex_lock(&adev->pm.mutex); 311 support_mode1_reset = smu_mode1_reset_is_support(smu); 312 mutex_unlock(&adev->pm.mutex); 313 } 314 315 return support_mode1_reset; 316 } 317 318 int amdgpu_dpm_mode1_reset(struct amdgpu_device *adev) 319 { 320 struct smu_context *smu = adev->powerplay.pp_handle; 321 int ret = -EOPNOTSUPP; 322 323 if (is_support_sw_smu(adev)) { 324 mutex_lock(&adev->pm.mutex); 325 ret = smu_mode1_reset(smu); 326 mutex_unlock(&adev->pm.mutex); 327 } 328 329 return ret; 330 } 331 332 int amdgpu_dpm_switch_power_profile(struct amdgpu_device *adev, 333 enum PP_SMC_POWER_PROFILE type, 334 bool en) 335 { 336 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 337 int ret = 0; 338 339 if (amdgpu_sriov_vf(adev)) 340 return 0; 341 342 if (pp_funcs && pp_funcs->switch_power_profile) { 343 mutex_lock(&adev->pm.mutex); 344 ret = pp_funcs->switch_power_profile( 345 adev->powerplay.pp_handle, type, en); 346 mutex_unlock(&adev->pm.mutex); 347 } 348 349 return ret; 350 } 351 352 int amdgpu_dpm_set_xgmi_pstate(struct amdgpu_device *adev, 353 uint32_t pstate) 354 { 355 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 356 int ret = 0; 357 358 if (pp_funcs && pp_funcs->set_xgmi_pstate) { 359 mutex_lock(&adev->pm.mutex); 360 ret = pp_funcs->set_xgmi_pstate(adev->powerplay.pp_handle, 361 pstate); 362 mutex_unlock(&adev->pm.mutex); 363 } 364 365 return ret; 366 } 367 368 int amdgpu_dpm_set_df_cstate(struct amdgpu_device *adev, 369 uint32_t cstate) 370 { 371 int ret = 0; 372 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 373 void *pp_handle = adev->powerplay.pp_handle; 374 375 if (pp_funcs && pp_funcs->set_df_cstate) { 376 mutex_lock(&adev->pm.mutex); 377 ret = pp_funcs->set_df_cstate(pp_handle, cstate); 378 mutex_unlock(&adev->pm.mutex); 379 } 380 381 return ret; 382 } 383 384 ssize_t amdgpu_dpm_get_pm_policy_info(struct amdgpu_device *adev, 385 enum pp_pm_policy p_type, char *buf) 386 { 387 struct smu_context *smu = adev->powerplay.pp_handle; 388 int ret = -EOPNOTSUPP; 389 390 if (is_support_sw_smu(adev)) { 391 mutex_lock(&adev->pm.mutex); 392 ret = smu_get_pm_policy_info(smu, p_type, buf); 393 mutex_unlock(&adev->pm.mutex); 394 } 395 396 return ret; 397 } 398 399 int amdgpu_dpm_set_pm_policy(struct amdgpu_device *adev, int policy_type, 400 int policy_level) 401 { 402 struct smu_context *smu = adev->powerplay.pp_handle; 403 int ret = -EOPNOTSUPP; 404 405 if (is_support_sw_smu(adev)) { 406 mutex_lock(&adev->pm.mutex); 407 ret = smu_set_pm_policy(smu, policy_type, policy_level); 408 mutex_unlock(&adev->pm.mutex); 409 } 410 411 return ret; 412 } 413 414 int amdgpu_dpm_enable_mgpu_fan_boost(struct amdgpu_device *adev) 415 { 416 void *pp_handle = adev->powerplay.pp_handle; 417 const struct amd_pm_funcs *pp_funcs = 418 adev->powerplay.pp_funcs; 419 int ret = 0; 420 421 if (pp_funcs && pp_funcs->enable_mgpu_fan_boost) { 422 mutex_lock(&adev->pm.mutex); 423 ret = pp_funcs->enable_mgpu_fan_boost(pp_handle); 424 mutex_unlock(&adev->pm.mutex); 425 } 426 427 return ret; 428 } 429 430 int amdgpu_dpm_set_clockgating_by_smu(struct amdgpu_device *adev, 431 uint32_t msg_id) 432 { 433 void *pp_handle = adev->powerplay.pp_handle; 434 const struct amd_pm_funcs *pp_funcs = 435 adev->powerplay.pp_funcs; 436 int ret = 0; 437 438 if (pp_funcs && pp_funcs->set_clockgating_by_smu) { 439 mutex_lock(&adev->pm.mutex); 440 ret = pp_funcs->set_clockgating_by_smu(pp_handle, 441 msg_id); 442 mutex_unlock(&adev->pm.mutex); 443 } 444 445 return ret; 446 } 447 448 int amdgpu_dpm_smu_i2c_bus_access(struct amdgpu_device *adev, 449 bool acquire) 450 { 451 void *pp_handle = adev->powerplay.pp_handle; 452 const struct amd_pm_funcs *pp_funcs = 453 adev->powerplay.pp_funcs; 454 int ret = -EOPNOTSUPP; 455 456 if (pp_funcs && pp_funcs->smu_i2c_bus_access) { 457 mutex_lock(&adev->pm.mutex); 458 ret = pp_funcs->smu_i2c_bus_access(pp_handle, 459 acquire); 460 mutex_unlock(&adev->pm.mutex); 461 } 462 463 return ret; 464 } 465 466 void amdgpu_pm_acpi_event_handler(struct amdgpu_device *adev) 467 { 468 if (adev->pm.dpm_enabled) { 469 mutex_lock(&adev->pm.mutex); 470 if (power_supply_is_system_supplied() > 0) 471 adev->pm.ac_power = true; 472 else 473 adev->pm.ac_power = false; 474 475 if (adev->powerplay.pp_funcs && 476 adev->powerplay.pp_funcs->enable_bapm) 477 amdgpu_dpm_enable_bapm(adev, adev->pm.ac_power); 478 479 if (is_support_sw_smu(adev)) 480 smu_set_ac_dc(adev->powerplay.pp_handle); 481 482 mutex_unlock(&adev->pm.mutex); 483 } 484 } 485 486 int amdgpu_dpm_read_sensor(struct amdgpu_device *adev, enum amd_pp_sensors sensor, 487 void *data, uint32_t *size) 488 { 489 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 490 int ret = -EINVAL; 491 492 if (!data || !size) 493 return -EINVAL; 494 495 if (pp_funcs && pp_funcs->read_sensor) { 496 mutex_lock(&adev->pm.mutex); 497 ret = pp_funcs->read_sensor(adev->powerplay.pp_handle, 498 sensor, 499 data, 500 size); 501 mutex_unlock(&adev->pm.mutex); 502 } 503 504 return ret; 505 } 506 507 int amdgpu_dpm_get_apu_thermal_limit(struct amdgpu_device *adev, uint32_t *limit) 508 { 509 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 510 int ret = -EOPNOTSUPP; 511 512 if (pp_funcs && pp_funcs->get_apu_thermal_limit) { 513 mutex_lock(&adev->pm.mutex); 514 ret = pp_funcs->get_apu_thermal_limit(adev->powerplay.pp_handle, limit); 515 mutex_unlock(&adev->pm.mutex); 516 } 517 518 return ret; 519 } 520 521 int amdgpu_dpm_set_apu_thermal_limit(struct amdgpu_device *adev, uint32_t limit) 522 { 523 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 524 int ret = -EOPNOTSUPP; 525 526 if (pp_funcs && pp_funcs->set_apu_thermal_limit) { 527 mutex_lock(&adev->pm.mutex); 528 ret = pp_funcs->set_apu_thermal_limit(adev->powerplay.pp_handle, limit); 529 mutex_unlock(&adev->pm.mutex); 530 } 531 532 return ret; 533 } 534 535 void amdgpu_dpm_compute_clocks(struct amdgpu_device *adev) 536 { 537 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 538 int i; 539 540 if (!adev->pm.dpm_enabled) 541 return; 542 543 if (!pp_funcs->pm_compute_clocks) 544 return; 545 546 if (adev->mode_info.num_crtc) 547 amdgpu_display_bandwidth_update(adev); 548 549 for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 550 struct amdgpu_ring *ring = adev->rings[i]; 551 if (ring && ring->sched.ready) 552 amdgpu_fence_wait_empty(ring); 553 } 554 555 mutex_lock(&adev->pm.mutex); 556 pp_funcs->pm_compute_clocks(adev->powerplay.pp_handle); 557 mutex_unlock(&adev->pm.mutex); 558 } 559 560 void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable) 561 { 562 int ret = 0; 563 564 if (adev->family == AMDGPU_FAMILY_SI) { 565 mutex_lock(&adev->pm.mutex); 566 if (enable) { 567 adev->pm.dpm.uvd_active = true; 568 adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_UVD; 569 } else { 570 adev->pm.dpm.uvd_active = false; 571 } 572 mutex_unlock(&adev->pm.mutex); 573 574 amdgpu_dpm_compute_clocks(adev); 575 return; 576 } 577 578 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_UVD, !enable, 0); 579 if (ret) 580 DRM_ERROR("Dpm %s uvd failed, ret = %d. \n", 581 enable ? "enable" : "disable", ret); 582 } 583 584 void amdgpu_dpm_enable_vcn(struct amdgpu_device *adev, bool enable, int inst) 585 { 586 int ret = 0; 587 588 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VCN, !enable, inst); 589 if (ret) 590 DRM_ERROR("Dpm %s uvd failed, ret = %d. \n", 591 enable ? "enable" : "disable", ret); 592 } 593 594 void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable) 595 { 596 int ret = 0; 597 598 if (adev->family == AMDGPU_FAMILY_SI) { 599 mutex_lock(&adev->pm.mutex); 600 if (enable) { 601 adev->pm.dpm.vce_active = true; 602 /* XXX select vce level based on ring/task */ 603 adev->pm.dpm.vce_level = AMD_VCE_LEVEL_AC_ALL; 604 } else { 605 adev->pm.dpm.vce_active = false; 606 } 607 mutex_unlock(&adev->pm.mutex); 608 609 amdgpu_dpm_compute_clocks(adev); 610 return; 611 } 612 613 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VCE, !enable, 0); 614 if (ret) 615 DRM_ERROR("Dpm %s vce failed, ret = %d. \n", 616 enable ? "enable" : "disable", ret); 617 } 618 619 void amdgpu_dpm_enable_jpeg(struct amdgpu_device *adev, bool enable) 620 { 621 int ret = 0; 622 623 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_JPEG, !enable, 0); 624 if (ret) 625 DRM_ERROR("Dpm %s jpeg failed, ret = %d. \n", 626 enable ? "enable" : "disable", ret); 627 } 628 629 void amdgpu_dpm_enable_vpe(struct amdgpu_device *adev, bool enable) 630 { 631 int ret = 0; 632 633 ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VPE, !enable, 0); 634 if (ret) 635 DRM_ERROR("Dpm %s vpe failed, ret = %d.\n", 636 enable ? "enable" : "disable", ret); 637 } 638 639 int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version) 640 { 641 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 642 int r = 0; 643 644 if (!pp_funcs || !pp_funcs->load_firmware || 645 (is_support_sw_smu(adev) && (adev->flags & AMD_IS_APU))) 646 return 0; 647 648 mutex_lock(&adev->pm.mutex); 649 r = pp_funcs->load_firmware(adev->powerplay.pp_handle); 650 if (r) { 651 pr_err("smu firmware loading failed\n"); 652 goto out; 653 } 654 655 if (smu_version) 656 *smu_version = adev->pm.fw_version; 657 658 out: 659 mutex_unlock(&adev->pm.mutex); 660 return r; 661 } 662 663 int amdgpu_dpm_handle_passthrough_sbr(struct amdgpu_device *adev, bool enable) 664 { 665 int ret = 0; 666 667 if (is_support_sw_smu(adev)) { 668 mutex_lock(&adev->pm.mutex); 669 ret = smu_handle_passthrough_sbr(adev->powerplay.pp_handle, 670 enable); 671 mutex_unlock(&adev->pm.mutex); 672 } 673 674 return ret; 675 } 676 677 int amdgpu_dpm_send_hbm_bad_pages_num(struct amdgpu_device *adev, uint32_t size) 678 { 679 struct smu_context *smu = adev->powerplay.pp_handle; 680 int ret = 0; 681 682 if (!is_support_sw_smu(adev)) 683 return -EOPNOTSUPP; 684 685 mutex_lock(&adev->pm.mutex); 686 ret = smu_send_hbm_bad_pages_num(smu, size); 687 mutex_unlock(&adev->pm.mutex); 688 689 return ret; 690 } 691 692 int amdgpu_dpm_send_hbm_bad_channel_flag(struct amdgpu_device *adev, uint32_t size) 693 { 694 struct smu_context *smu = adev->powerplay.pp_handle; 695 int ret = 0; 696 697 if (!is_support_sw_smu(adev)) 698 return -EOPNOTSUPP; 699 700 mutex_lock(&adev->pm.mutex); 701 ret = smu_send_hbm_bad_channel_flag(smu, size); 702 mutex_unlock(&adev->pm.mutex); 703 704 return ret; 705 } 706 707 int amdgpu_dpm_send_rma_reason(struct amdgpu_device *adev) 708 { 709 struct smu_context *smu = adev->powerplay.pp_handle; 710 int ret; 711 712 if (!is_support_sw_smu(adev)) 713 return -EOPNOTSUPP; 714 715 mutex_lock(&adev->pm.mutex); 716 ret = smu_send_rma_reason(smu); 717 mutex_unlock(&adev->pm.mutex); 718 719 if (amdgpu_cper_generate_bp_threshold_record(adev)) 720 dev_warn(adev->dev, "fail to generate bad page threshold cper records\n"); 721 722 return ret; 723 } 724 725 /** 726 * amdgpu_dpm_reset_sdma_is_supported - Check if SDMA reset is supported 727 * @adev: amdgpu_device pointer 728 * 729 * This function checks if the SMU supports resetting the SDMA engine. 730 * It returns false if the hardware does not support software SMU or 731 * if the feature is not supported. 732 */ 733 bool amdgpu_dpm_reset_sdma_is_supported(struct amdgpu_device *adev) 734 { 735 struct smu_context *smu = adev->powerplay.pp_handle; 736 bool ret; 737 738 if (!is_support_sw_smu(adev)) 739 return false; 740 741 mutex_lock(&adev->pm.mutex); 742 ret = smu_reset_sdma_is_supported(smu); 743 mutex_unlock(&adev->pm.mutex); 744 745 return ret; 746 } 747 748 int amdgpu_dpm_reset_sdma(struct amdgpu_device *adev, uint32_t inst_mask) 749 { 750 struct smu_context *smu = adev->powerplay.pp_handle; 751 int ret; 752 753 if (!is_support_sw_smu(adev)) 754 return -EOPNOTSUPP; 755 756 mutex_lock(&adev->pm.mutex); 757 ret = smu_reset_sdma(smu, inst_mask); 758 mutex_unlock(&adev->pm.mutex); 759 760 return ret; 761 } 762 763 int amdgpu_dpm_get_dpm_freq_range(struct amdgpu_device *adev, 764 enum pp_clock_type type, 765 uint32_t *min, 766 uint32_t *max) 767 { 768 int ret = 0; 769 770 if (type != PP_SCLK) 771 return -EINVAL; 772 773 if (!is_support_sw_smu(adev)) 774 return -EOPNOTSUPP; 775 776 mutex_lock(&adev->pm.mutex); 777 ret = smu_get_dpm_freq_range(adev->powerplay.pp_handle, 778 SMU_SCLK, 779 min, 780 max); 781 mutex_unlock(&adev->pm.mutex); 782 783 return ret; 784 } 785 786 int amdgpu_dpm_set_soft_freq_range(struct amdgpu_device *adev, 787 enum pp_clock_type type, 788 uint32_t min, 789 uint32_t max) 790 { 791 struct smu_context *smu = adev->powerplay.pp_handle; 792 int ret = 0; 793 794 if (type != PP_SCLK) 795 return -EINVAL; 796 797 if (!is_support_sw_smu(adev)) 798 return -EOPNOTSUPP; 799 800 mutex_lock(&adev->pm.mutex); 801 ret = smu_set_soft_freq_range(smu, 802 SMU_SCLK, 803 min, 804 max); 805 mutex_unlock(&adev->pm.mutex); 806 807 return ret; 808 } 809 810 int amdgpu_dpm_write_watermarks_table(struct amdgpu_device *adev) 811 { 812 struct smu_context *smu = adev->powerplay.pp_handle; 813 int ret = 0; 814 815 if (!is_support_sw_smu(adev)) 816 return 0; 817 818 mutex_lock(&adev->pm.mutex); 819 ret = smu_write_watermarks_table(smu); 820 mutex_unlock(&adev->pm.mutex); 821 822 return ret; 823 } 824 825 int amdgpu_dpm_wait_for_event(struct amdgpu_device *adev, 826 enum smu_event_type event, 827 uint64_t event_arg) 828 { 829 struct smu_context *smu = adev->powerplay.pp_handle; 830 int ret = 0; 831 832 if (!is_support_sw_smu(adev)) 833 return -EOPNOTSUPP; 834 835 mutex_lock(&adev->pm.mutex); 836 ret = smu_wait_for_event(smu, event, event_arg); 837 mutex_unlock(&adev->pm.mutex); 838 839 return ret; 840 } 841 842 int amdgpu_dpm_set_residency_gfxoff(struct amdgpu_device *adev, bool value) 843 { 844 struct smu_context *smu = adev->powerplay.pp_handle; 845 int ret = 0; 846 847 if (!is_support_sw_smu(adev)) 848 return -EOPNOTSUPP; 849 850 mutex_lock(&adev->pm.mutex); 851 ret = smu_set_residency_gfxoff(smu, value); 852 mutex_unlock(&adev->pm.mutex); 853 854 return ret; 855 } 856 857 int amdgpu_dpm_get_residency_gfxoff(struct amdgpu_device *adev, u32 *value) 858 { 859 struct smu_context *smu = adev->powerplay.pp_handle; 860 int ret = 0; 861 862 if (!is_support_sw_smu(adev)) 863 return -EOPNOTSUPP; 864 865 mutex_lock(&adev->pm.mutex); 866 ret = smu_get_residency_gfxoff(smu, value); 867 mutex_unlock(&adev->pm.mutex); 868 869 return ret; 870 } 871 872 int amdgpu_dpm_get_entrycount_gfxoff(struct amdgpu_device *adev, u64 *value) 873 { 874 struct smu_context *smu = adev->powerplay.pp_handle; 875 int ret = 0; 876 877 if (!is_support_sw_smu(adev)) 878 return -EOPNOTSUPP; 879 880 mutex_lock(&adev->pm.mutex); 881 ret = smu_get_entrycount_gfxoff(smu, value); 882 mutex_unlock(&adev->pm.mutex); 883 884 return ret; 885 } 886 887 int amdgpu_dpm_get_status_gfxoff(struct amdgpu_device *adev, uint32_t *value) 888 { 889 struct smu_context *smu = adev->powerplay.pp_handle; 890 int ret = 0; 891 892 if (!is_support_sw_smu(adev)) 893 return -EOPNOTSUPP; 894 895 mutex_lock(&adev->pm.mutex); 896 ret = smu_get_status_gfxoff(smu, value); 897 mutex_unlock(&adev->pm.mutex); 898 899 return ret; 900 } 901 902 uint64_t amdgpu_dpm_get_thermal_throttling_counter(struct amdgpu_device *adev) 903 { 904 struct smu_context *smu = adev->powerplay.pp_handle; 905 906 if (!is_support_sw_smu(adev)) 907 return 0; 908 909 return atomic64_read(&smu->throttle_int_counter); 910 } 911 912 /* amdgpu_dpm_gfx_state_change - Handle gfx power state change set 913 * @adev: amdgpu_device pointer 914 * @state: gfx power state(1 -sGpuChangeState_D0Entry and 2 -sGpuChangeState_D3Entry) 915 * 916 */ 917 void amdgpu_dpm_gfx_state_change(struct amdgpu_device *adev, 918 enum gfx_change_state state) 919 { 920 mutex_lock(&adev->pm.mutex); 921 if (adev->powerplay.pp_funcs && 922 adev->powerplay.pp_funcs->gfx_state_change_set) 923 ((adev)->powerplay.pp_funcs->gfx_state_change_set( 924 (adev)->powerplay.pp_handle, state)); 925 mutex_unlock(&adev->pm.mutex); 926 } 927 928 int amdgpu_dpm_get_ecc_info(struct amdgpu_device *adev, 929 void *umc_ecc) 930 { 931 struct smu_context *smu = adev->powerplay.pp_handle; 932 int ret = 0; 933 934 if (!is_support_sw_smu(adev)) 935 return -EOPNOTSUPP; 936 937 mutex_lock(&adev->pm.mutex); 938 ret = smu_get_ecc_info(smu, umc_ecc); 939 mutex_unlock(&adev->pm.mutex); 940 941 return ret; 942 } 943 944 struct amd_vce_state *amdgpu_dpm_get_vce_clock_state(struct amdgpu_device *adev, 945 uint32_t idx) 946 { 947 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 948 struct amd_vce_state *vstate = NULL; 949 950 if (!pp_funcs->get_vce_clock_state) 951 return NULL; 952 953 mutex_lock(&adev->pm.mutex); 954 vstate = pp_funcs->get_vce_clock_state(adev->powerplay.pp_handle, 955 idx); 956 mutex_unlock(&adev->pm.mutex); 957 958 return vstate; 959 } 960 961 void amdgpu_dpm_get_current_power_state(struct amdgpu_device *adev, 962 enum amd_pm_state_type *state) 963 { 964 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 965 966 mutex_lock(&adev->pm.mutex); 967 968 if (!pp_funcs->get_current_power_state) { 969 *state = adev->pm.dpm.user_state; 970 goto out; 971 } 972 973 *state = pp_funcs->get_current_power_state(adev->powerplay.pp_handle); 974 if (*state < POWER_STATE_TYPE_DEFAULT || 975 *state > POWER_STATE_TYPE_INTERNAL_3DPERF) 976 *state = adev->pm.dpm.user_state; 977 978 out: 979 mutex_unlock(&adev->pm.mutex); 980 } 981 982 void amdgpu_dpm_set_power_state(struct amdgpu_device *adev, 983 enum amd_pm_state_type state) 984 { 985 mutex_lock(&adev->pm.mutex); 986 adev->pm.dpm.user_state = state; 987 mutex_unlock(&adev->pm.mutex); 988 989 if (is_support_sw_smu(adev)) 990 return; 991 992 if (amdgpu_dpm_dispatch_task(adev, 993 AMD_PP_TASK_ENABLE_USER_STATE, 994 &state) == -EOPNOTSUPP) 995 amdgpu_dpm_compute_clocks(adev); 996 } 997 998 enum amd_dpm_forced_level amdgpu_dpm_get_performance_level(struct amdgpu_device *adev) 999 { 1000 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1001 enum amd_dpm_forced_level level; 1002 1003 if (!pp_funcs) 1004 return AMD_DPM_FORCED_LEVEL_AUTO; 1005 1006 mutex_lock(&adev->pm.mutex); 1007 if (pp_funcs->get_performance_level) 1008 level = pp_funcs->get_performance_level(adev->powerplay.pp_handle); 1009 else 1010 level = adev->pm.dpm.forced_level; 1011 mutex_unlock(&adev->pm.mutex); 1012 1013 return level; 1014 } 1015 1016 static void amdgpu_dpm_enter_umd_state(struct amdgpu_device *adev) 1017 { 1018 /* enter UMD Pstate */ 1019 amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_GFX, 1020 AMD_PG_STATE_UNGATE); 1021 amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_GFX, 1022 AMD_CG_STATE_UNGATE); 1023 } 1024 1025 static void amdgpu_dpm_exit_umd_state(struct amdgpu_device *adev) 1026 { 1027 /* exit UMD Pstate */ 1028 amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_GFX, 1029 AMD_CG_STATE_GATE); 1030 amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_GFX, 1031 AMD_PG_STATE_GATE); 1032 } 1033 1034 int amdgpu_dpm_force_performance_level(struct amdgpu_device *adev, 1035 enum amd_dpm_forced_level level) 1036 { 1037 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1038 enum amd_dpm_forced_level current_level; 1039 uint32_t profile_mode_mask = AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD | 1040 AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK | 1041 AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK | 1042 AMD_DPM_FORCED_LEVEL_PROFILE_PEAK; 1043 1044 if (!pp_funcs || !pp_funcs->force_performance_level) 1045 return 0; 1046 1047 if (adev->pm.dpm.thermal_active) 1048 return -EINVAL; 1049 1050 current_level = amdgpu_dpm_get_performance_level(adev); 1051 if (current_level == level) 1052 return 0; 1053 1054 if (!(current_level & profile_mode_mask) && 1055 (level == AMD_DPM_FORCED_LEVEL_PROFILE_EXIT)) 1056 return -EINVAL; 1057 1058 if (adev->asic_type == CHIP_RAVEN) { 1059 if (!(adev->apu_flags & AMD_APU_IS_RAVEN2)) { 1060 if (current_level != AMD_DPM_FORCED_LEVEL_MANUAL && 1061 level == AMD_DPM_FORCED_LEVEL_MANUAL) 1062 amdgpu_gfx_off_ctrl(adev, false); 1063 else if (current_level == AMD_DPM_FORCED_LEVEL_MANUAL && 1064 level != AMD_DPM_FORCED_LEVEL_MANUAL) 1065 amdgpu_gfx_off_ctrl(adev, true); 1066 } 1067 } 1068 1069 if (!(current_level & profile_mode_mask) && (level & profile_mode_mask)) 1070 amdgpu_dpm_enter_umd_state(adev); 1071 else if ((current_level & profile_mode_mask) && 1072 !(level & profile_mode_mask)) 1073 amdgpu_dpm_exit_umd_state(adev); 1074 1075 mutex_lock(&adev->pm.mutex); 1076 1077 if (pp_funcs->force_performance_level(adev->powerplay.pp_handle, 1078 level)) { 1079 mutex_unlock(&adev->pm.mutex); 1080 /* If new level failed, retain the umd state as before */ 1081 if (!(current_level & profile_mode_mask) && 1082 (level & profile_mode_mask)) 1083 amdgpu_dpm_exit_umd_state(adev); 1084 else if ((current_level & profile_mode_mask) && 1085 !(level & profile_mode_mask)) 1086 amdgpu_dpm_enter_umd_state(adev); 1087 1088 return -EINVAL; 1089 } 1090 1091 adev->pm.dpm.forced_level = level; 1092 1093 mutex_unlock(&adev->pm.mutex); 1094 1095 return 0; 1096 } 1097 1098 int amdgpu_dpm_get_pp_num_states(struct amdgpu_device *adev, 1099 struct pp_states_info *states) 1100 { 1101 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1102 int ret = 0; 1103 1104 if (!pp_funcs->get_pp_num_states) 1105 return -EOPNOTSUPP; 1106 1107 mutex_lock(&adev->pm.mutex); 1108 ret = pp_funcs->get_pp_num_states(adev->powerplay.pp_handle, 1109 states); 1110 mutex_unlock(&adev->pm.mutex); 1111 1112 return ret; 1113 } 1114 1115 int amdgpu_dpm_dispatch_task(struct amdgpu_device *adev, 1116 enum amd_pp_task task_id, 1117 enum amd_pm_state_type *user_state) 1118 { 1119 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1120 int ret = 0; 1121 1122 if (!pp_funcs->dispatch_tasks) 1123 return -EOPNOTSUPP; 1124 1125 mutex_lock(&adev->pm.mutex); 1126 ret = pp_funcs->dispatch_tasks(adev->powerplay.pp_handle, 1127 task_id, 1128 user_state); 1129 mutex_unlock(&adev->pm.mutex); 1130 1131 return ret; 1132 } 1133 1134 int amdgpu_dpm_get_pp_table(struct amdgpu_device *adev, char **table) 1135 { 1136 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1137 int ret = 0; 1138 1139 if (!pp_funcs->get_pp_table) 1140 return 0; 1141 1142 mutex_lock(&adev->pm.mutex); 1143 ret = pp_funcs->get_pp_table(adev->powerplay.pp_handle, 1144 table); 1145 mutex_unlock(&adev->pm.mutex); 1146 1147 return ret; 1148 } 1149 1150 int amdgpu_dpm_set_fine_grain_clk_vol(struct amdgpu_device *adev, 1151 uint32_t type, 1152 long *input, 1153 uint32_t size) 1154 { 1155 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1156 int ret = 0; 1157 1158 if (!pp_funcs->set_fine_grain_clk_vol) 1159 return 0; 1160 1161 mutex_lock(&adev->pm.mutex); 1162 ret = pp_funcs->set_fine_grain_clk_vol(adev->powerplay.pp_handle, 1163 type, 1164 input, 1165 size); 1166 mutex_unlock(&adev->pm.mutex); 1167 1168 return ret; 1169 } 1170 1171 int amdgpu_dpm_odn_edit_dpm_table(struct amdgpu_device *adev, 1172 uint32_t type, 1173 long *input, 1174 uint32_t size) 1175 { 1176 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1177 int ret = 0; 1178 1179 if (!pp_funcs->odn_edit_dpm_table) 1180 return 0; 1181 1182 mutex_lock(&adev->pm.mutex); 1183 ret = pp_funcs->odn_edit_dpm_table(adev->powerplay.pp_handle, 1184 type, 1185 input, 1186 size); 1187 mutex_unlock(&adev->pm.mutex); 1188 1189 return ret; 1190 } 1191 1192 int amdgpu_dpm_print_clock_levels(struct amdgpu_device *adev, 1193 enum pp_clock_type type, 1194 char *buf) 1195 { 1196 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1197 int ret = 0; 1198 1199 if (!pp_funcs->print_clock_levels) 1200 return 0; 1201 1202 mutex_lock(&adev->pm.mutex); 1203 ret = pp_funcs->print_clock_levels(adev->powerplay.pp_handle, 1204 type, 1205 buf); 1206 mutex_unlock(&adev->pm.mutex); 1207 1208 return ret; 1209 } 1210 1211 int amdgpu_dpm_emit_clock_levels(struct amdgpu_device *adev, 1212 enum pp_clock_type type, 1213 char *buf, 1214 int *offset) 1215 { 1216 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1217 int ret = 0; 1218 1219 if (!pp_funcs->emit_clock_levels) 1220 return -ENOENT; 1221 1222 mutex_lock(&adev->pm.mutex); 1223 ret = pp_funcs->emit_clock_levels(adev->powerplay.pp_handle, 1224 type, 1225 buf, 1226 offset); 1227 mutex_unlock(&adev->pm.mutex); 1228 1229 return ret; 1230 } 1231 1232 int amdgpu_dpm_set_ppfeature_status(struct amdgpu_device *adev, 1233 uint64_t ppfeature_masks) 1234 { 1235 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1236 int ret = 0; 1237 1238 if (!pp_funcs->set_ppfeature_status) 1239 return 0; 1240 1241 mutex_lock(&adev->pm.mutex); 1242 ret = pp_funcs->set_ppfeature_status(adev->powerplay.pp_handle, 1243 ppfeature_masks); 1244 mutex_unlock(&adev->pm.mutex); 1245 1246 return ret; 1247 } 1248 1249 int amdgpu_dpm_get_ppfeature_status(struct amdgpu_device *adev, char *buf) 1250 { 1251 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1252 int ret = 0; 1253 1254 if (!pp_funcs->get_ppfeature_status) 1255 return 0; 1256 1257 mutex_lock(&adev->pm.mutex); 1258 ret = pp_funcs->get_ppfeature_status(adev->powerplay.pp_handle, 1259 buf); 1260 mutex_unlock(&adev->pm.mutex); 1261 1262 return ret; 1263 } 1264 1265 int amdgpu_dpm_force_clock_level(struct amdgpu_device *adev, 1266 enum pp_clock_type type, 1267 uint32_t mask) 1268 { 1269 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1270 int ret = 0; 1271 1272 if (!pp_funcs->force_clock_level) 1273 return 0; 1274 1275 mutex_lock(&adev->pm.mutex); 1276 ret = pp_funcs->force_clock_level(adev->powerplay.pp_handle, 1277 type, 1278 mask); 1279 mutex_unlock(&adev->pm.mutex); 1280 1281 return ret; 1282 } 1283 1284 int amdgpu_dpm_get_sclk_od(struct amdgpu_device *adev) 1285 { 1286 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1287 int ret = 0; 1288 1289 if (!pp_funcs->get_sclk_od) 1290 return -EOPNOTSUPP; 1291 1292 mutex_lock(&adev->pm.mutex); 1293 ret = pp_funcs->get_sclk_od(adev->powerplay.pp_handle); 1294 mutex_unlock(&adev->pm.mutex); 1295 1296 return ret; 1297 } 1298 1299 int amdgpu_dpm_set_sclk_od(struct amdgpu_device *adev, uint32_t value) 1300 { 1301 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1302 1303 if (is_support_sw_smu(adev)) 1304 return -EOPNOTSUPP; 1305 1306 mutex_lock(&adev->pm.mutex); 1307 if (pp_funcs->set_sclk_od) 1308 pp_funcs->set_sclk_od(adev->powerplay.pp_handle, value); 1309 mutex_unlock(&adev->pm.mutex); 1310 1311 if (amdgpu_dpm_dispatch_task(adev, 1312 AMD_PP_TASK_READJUST_POWER_STATE, 1313 NULL) == -EOPNOTSUPP) { 1314 adev->pm.dpm.current_ps = adev->pm.dpm.boot_ps; 1315 amdgpu_dpm_compute_clocks(adev); 1316 } 1317 1318 return 0; 1319 } 1320 1321 int amdgpu_dpm_get_mclk_od(struct amdgpu_device *adev) 1322 { 1323 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1324 int ret = 0; 1325 1326 if (!pp_funcs->get_mclk_od) 1327 return -EOPNOTSUPP; 1328 1329 mutex_lock(&adev->pm.mutex); 1330 ret = pp_funcs->get_mclk_od(adev->powerplay.pp_handle); 1331 mutex_unlock(&adev->pm.mutex); 1332 1333 return ret; 1334 } 1335 1336 int amdgpu_dpm_set_mclk_od(struct amdgpu_device *adev, uint32_t value) 1337 { 1338 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1339 1340 if (is_support_sw_smu(adev)) 1341 return -EOPNOTSUPP; 1342 1343 mutex_lock(&adev->pm.mutex); 1344 if (pp_funcs->set_mclk_od) 1345 pp_funcs->set_mclk_od(adev->powerplay.pp_handle, value); 1346 mutex_unlock(&adev->pm.mutex); 1347 1348 if (amdgpu_dpm_dispatch_task(adev, 1349 AMD_PP_TASK_READJUST_POWER_STATE, 1350 NULL) == -EOPNOTSUPP) { 1351 adev->pm.dpm.current_ps = adev->pm.dpm.boot_ps; 1352 amdgpu_dpm_compute_clocks(adev); 1353 } 1354 1355 return 0; 1356 } 1357 1358 int amdgpu_dpm_get_power_profile_mode(struct amdgpu_device *adev, 1359 char *buf) 1360 { 1361 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1362 int ret = 0; 1363 1364 if (!pp_funcs->get_power_profile_mode) 1365 return -EOPNOTSUPP; 1366 1367 mutex_lock(&adev->pm.mutex); 1368 ret = pp_funcs->get_power_profile_mode(adev->powerplay.pp_handle, 1369 buf); 1370 mutex_unlock(&adev->pm.mutex); 1371 1372 return ret; 1373 } 1374 1375 int amdgpu_dpm_set_power_profile_mode(struct amdgpu_device *adev, 1376 long *input, uint32_t size) 1377 { 1378 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1379 int ret = 0; 1380 1381 if (!pp_funcs->set_power_profile_mode) 1382 return 0; 1383 1384 mutex_lock(&adev->pm.mutex); 1385 ret = pp_funcs->set_power_profile_mode(adev->powerplay.pp_handle, 1386 input, 1387 size); 1388 mutex_unlock(&adev->pm.mutex); 1389 1390 return ret; 1391 } 1392 1393 int amdgpu_dpm_get_gpu_metrics(struct amdgpu_device *adev, void **table) 1394 { 1395 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1396 int ret = 0; 1397 1398 if (!pp_funcs->get_gpu_metrics) 1399 return 0; 1400 1401 mutex_lock(&adev->pm.mutex); 1402 ret = pp_funcs->get_gpu_metrics(adev->powerplay.pp_handle, 1403 table); 1404 mutex_unlock(&adev->pm.mutex); 1405 1406 return ret; 1407 } 1408 1409 ssize_t amdgpu_dpm_get_pm_metrics(struct amdgpu_device *adev, void *pm_metrics, 1410 size_t size) 1411 { 1412 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1413 int ret = 0; 1414 1415 if (!pp_funcs->get_pm_metrics) 1416 return -EOPNOTSUPP; 1417 1418 mutex_lock(&adev->pm.mutex); 1419 ret = pp_funcs->get_pm_metrics(adev->powerplay.pp_handle, pm_metrics, 1420 size); 1421 mutex_unlock(&adev->pm.mutex); 1422 1423 return ret; 1424 } 1425 1426 int amdgpu_dpm_get_fan_control_mode(struct amdgpu_device *adev, 1427 uint32_t *fan_mode) 1428 { 1429 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1430 int ret = 0; 1431 1432 if (!pp_funcs->get_fan_control_mode) 1433 return -EOPNOTSUPP; 1434 1435 mutex_lock(&adev->pm.mutex); 1436 ret = pp_funcs->get_fan_control_mode(adev->powerplay.pp_handle, 1437 fan_mode); 1438 mutex_unlock(&adev->pm.mutex); 1439 1440 return ret; 1441 } 1442 1443 int amdgpu_dpm_set_fan_speed_pwm(struct amdgpu_device *adev, 1444 uint32_t speed) 1445 { 1446 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1447 int ret = 0; 1448 1449 if (!pp_funcs->set_fan_speed_pwm) 1450 return -EOPNOTSUPP; 1451 1452 mutex_lock(&adev->pm.mutex); 1453 ret = pp_funcs->set_fan_speed_pwm(adev->powerplay.pp_handle, 1454 speed); 1455 mutex_unlock(&adev->pm.mutex); 1456 1457 return ret; 1458 } 1459 1460 int amdgpu_dpm_get_fan_speed_pwm(struct amdgpu_device *adev, 1461 uint32_t *speed) 1462 { 1463 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1464 int ret = 0; 1465 1466 if (!pp_funcs->get_fan_speed_pwm) 1467 return -EOPNOTSUPP; 1468 1469 mutex_lock(&adev->pm.mutex); 1470 ret = pp_funcs->get_fan_speed_pwm(adev->powerplay.pp_handle, 1471 speed); 1472 mutex_unlock(&adev->pm.mutex); 1473 1474 return ret; 1475 } 1476 1477 int amdgpu_dpm_get_fan_speed_rpm(struct amdgpu_device *adev, 1478 uint32_t *speed) 1479 { 1480 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1481 int ret = 0; 1482 1483 if (!pp_funcs->get_fan_speed_rpm) 1484 return -EOPNOTSUPP; 1485 1486 mutex_lock(&adev->pm.mutex); 1487 ret = pp_funcs->get_fan_speed_rpm(adev->powerplay.pp_handle, 1488 speed); 1489 mutex_unlock(&adev->pm.mutex); 1490 1491 return ret; 1492 } 1493 1494 int amdgpu_dpm_set_fan_speed_rpm(struct amdgpu_device *adev, 1495 uint32_t speed) 1496 { 1497 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1498 int ret = 0; 1499 1500 if (!pp_funcs->set_fan_speed_rpm) 1501 return -EOPNOTSUPP; 1502 1503 mutex_lock(&adev->pm.mutex); 1504 ret = pp_funcs->set_fan_speed_rpm(adev->powerplay.pp_handle, 1505 speed); 1506 mutex_unlock(&adev->pm.mutex); 1507 1508 return ret; 1509 } 1510 1511 int amdgpu_dpm_set_fan_control_mode(struct amdgpu_device *adev, 1512 uint32_t mode) 1513 { 1514 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1515 int ret = 0; 1516 1517 if (!pp_funcs->set_fan_control_mode) 1518 return -EOPNOTSUPP; 1519 1520 mutex_lock(&adev->pm.mutex); 1521 ret = pp_funcs->set_fan_control_mode(adev->powerplay.pp_handle, 1522 mode); 1523 mutex_unlock(&adev->pm.mutex); 1524 1525 return ret; 1526 } 1527 1528 int amdgpu_dpm_get_power_limit(struct amdgpu_device *adev, 1529 uint32_t *limit, 1530 enum pp_power_limit_level pp_limit_level, 1531 enum pp_power_type power_type) 1532 { 1533 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1534 int ret = 0; 1535 1536 if (!pp_funcs->get_power_limit) 1537 return -ENODATA; 1538 1539 mutex_lock(&adev->pm.mutex); 1540 ret = pp_funcs->get_power_limit(adev->powerplay.pp_handle, 1541 limit, 1542 pp_limit_level, 1543 power_type); 1544 mutex_unlock(&adev->pm.mutex); 1545 1546 return ret; 1547 } 1548 1549 int amdgpu_dpm_set_power_limit(struct amdgpu_device *adev, 1550 uint32_t limit) 1551 { 1552 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1553 int ret = 0; 1554 1555 if (!pp_funcs->set_power_limit) 1556 return -EINVAL; 1557 1558 mutex_lock(&adev->pm.mutex); 1559 ret = pp_funcs->set_power_limit(adev->powerplay.pp_handle, 1560 limit); 1561 mutex_unlock(&adev->pm.mutex); 1562 1563 return ret; 1564 } 1565 1566 int amdgpu_dpm_is_cclk_dpm_supported(struct amdgpu_device *adev) 1567 { 1568 bool cclk_dpm_supported = false; 1569 1570 if (!is_support_sw_smu(adev)) 1571 return false; 1572 1573 mutex_lock(&adev->pm.mutex); 1574 cclk_dpm_supported = is_support_cclk_dpm(adev); 1575 mutex_unlock(&adev->pm.mutex); 1576 1577 return (int)cclk_dpm_supported; 1578 } 1579 1580 int amdgpu_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev, 1581 struct seq_file *m) 1582 { 1583 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1584 1585 if (!pp_funcs->debugfs_print_current_performance_level) 1586 return -EOPNOTSUPP; 1587 1588 mutex_lock(&adev->pm.mutex); 1589 pp_funcs->debugfs_print_current_performance_level(adev->powerplay.pp_handle, 1590 m); 1591 mutex_unlock(&adev->pm.mutex); 1592 1593 return 0; 1594 } 1595 1596 int amdgpu_dpm_get_smu_prv_buf_details(struct amdgpu_device *adev, 1597 void **addr, 1598 size_t *size) 1599 { 1600 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1601 int ret = 0; 1602 1603 if (!pp_funcs->get_smu_prv_buf_details) 1604 return -ENOSYS; 1605 1606 mutex_lock(&adev->pm.mutex); 1607 ret = pp_funcs->get_smu_prv_buf_details(adev->powerplay.pp_handle, 1608 addr, 1609 size); 1610 mutex_unlock(&adev->pm.mutex); 1611 1612 return ret; 1613 } 1614 1615 int amdgpu_dpm_is_overdrive_supported(struct amdgpu_device *adev) 1616 { 1617 if (is_support_sw_smu(adev)) { 1618 struct smu_context *smu = adev->powerplay.pp_handle; 1619 1620 return (smu->od_enabled || smu->is_apu); 1621 } else { 1622 struct pp_hwmgr *hwmgr; 1623 1624 /* 1625 * dpm on some legacy asics don't carry od_enabled member 1626 * as its pp_handle is casted directly from adev. 1627 */ 1628 if (amdgpu_dpm_is_legacy_dpm(adev)) 1629 return false; 1630 1631 hwmgr = (struct pp_hwmgr *)adev->powerplay.pp_handle; 1632 1633 return hwmgr->od_enabled; 1634 } 1635 } 1636 1637 int amdgpu_dpm_set_pp_table(struct amdgpu_device *adev, 1638 const char *buf, 1639 size_t size) 1640 { 1641 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1642 int ret = 0; 1643 1644 if (!pp_funcs->set_pp_table) 1645 return -EOPNOTSUPP; 1646 1647 mutex_lock(&adev->pm.mutex); 1648 ret = pp_funcs->set_pp_table(adev->powerplay.pp_handle, 1649 buf, 1650 size); 1651 mutex_unlock(&adev->pm.mutex); 1652 1653 return ret; 1654 } 1655 1656 int amdgpu_dpm_get_num_cpu_cores(struct amdgpu_device *adev) 1657 { 1658 struct smu_context *smu = adev->powerplay.pp_handle; 1659 1660 if (!is_support_sw_smu(adev)) 1661 return INT_MAX; 1662 1663 return smu->cpu_core_num; 1664 } 1665 1666 void amdgpu_dpm_stb_debug_fs_init(struct amdgpu_device *adev) 1667 { 1668 if (!is_support_sw_smu(adev)) 1669 return; 1670 1671 amdgpu_smu_stb_debug_fs_init(adev); 1672 } 1673 1674 int amdgpu_dpm_display_configuration_change(struct amdgpu_device *adev, 1675 const struct amd_pp_display_configuration *input) 1676 { 1677 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1678 int ret = 0; 1679 1680 if (!pp_funcs->display_configuration_change) 1681 return 0; 1682 1683 mutex_lock(&adev->pm.mutex); 1684 ret = pp_funcs->display_configuration_change(adev->powerplay.pp_handle, 1685 input); 1686 mutex_unlock(&adev->pm.mutex); 1687 1688 return ret; 1689 } 1690 1691 int amdgpu_dpm_get_clock_by_type(struct amdgpu_device *adev, 1692 enum amd_pp_clock_type type, 1693 struct amd_pp_clocks *clocks) 1694 { 1695 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1696 int ret = 0; 1697 1698 if (!pp_funcs->get_clock_by_type) 1699 return 0; 1700 1701 mutex_lock(&adev->pm.mutex); 1702 ret = pp_funcs->get_clock_by_type(adev->powerplay.pp_handle, 1703 type, 1704 clocks); 1705 mutex_unlock(&adev->pm.mutex); 1706 1707 return ret; 1708 } 1709 1710 int amdgpu_dpm_get_display_mode_validation_clks(struct amdgpu_device *adev, 1711 struct amd_pp_simple_clock_info *clocks) 1712 { 1713 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1714 int ret = 0; 1715 1716 if (!pp_funcs->get_display_mode_validation_clocks) 1717 return 0; 1718 1719 mutex_lock(&adev->pm.mutex); 1720 ret = pp_funcs->get_display_mode_validation_clocks(adev->powerplay.pp_handle, 1721 clocks); 1722 mutex_unlock(&adev->pm.mutex); 1723 1724 return ret; 1725 } 1726 1727 int amdgpu_dpm_get_clock_by_type_with_latency(struct amdgpu_device *adev, 1728 enum amd_pp_clock_type type, 1729 struct pp_clock_levels_with_latency *clocks) 1730 { 1731 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1732 int ret = 0; 1733 1734 if (!pp_funcs->get_clock_by_type_with_latency) 1735 return 0; 1736 1737 mutex_lock(&adev->pm.mutex); 1738 ret = pp_funcs->get_clock_by_type_with_latency(adev->powerplay.pp_handle, 1739 type, 1740 clocks); 1741 mutex_unlock(&adev->pm.mutex); 1742 1743 return ret; 1744 } 1745 1746 int amdgpu_dpm_get_clock_by_type_with_voltage(struct amdgpu_device *adev, 1747 enum amd_pp_clock_type type, 1748 struct pp_clock_levels_with_voltage *clocks) 1749 { 1750 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1751 int ret = 0; 1752 1753 if (!pp_funcs->get_clock_by_type_with_voltage) 1754 return 0; 1755 1756 mutex_lock(&adev->pm.mutex); 1757 ret = pp_funcs->get_clock_by_type_with_voltage(adev->powerplay.pp_handle, 1758 type, 1759 clocks); 1760 mutex_unlock(&adev->pm.mutex); 1761 1762 return ret; 1763 } 1764 1765 int amdgpu_dpm_set_watermarks_for_clocks_ranges(struct amdgpu_device *adev, 1766 void *clock_ranges) 1767 { 1768 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1769 int ret = 0; 1770 1771 if (!pp_funcs->set_watermarks_for_clocks_ranges) 1772 return -EOPNOTSUPP; 1773 1774 mutex_lock(&adev->pm.mutex); 1775 ret = pp_funcs->set_watermarks_for_clocks_ranges(adev->powerplay.pp_handle, 1776 clock_ranges); 1777 mutex_unlock(&adev->pm.mutex); 1778 1779 return ret; 1780 } 1781 1782 int amdgpu_dpm_display_clock_voltage_request(struct amdgpu_device *adev, 1783 struct pp_display_clock_request *clock) 1784 { 1785 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1786 int ret = 0; 1787 1788 if (!pp_funcs->display_clock_voltage_request) 1789 return -EOPNOTSUPP; 1790 1791 mutex_lock(&adev->pm.mutex); 1792 ret = pp_funcs->display_clock_voltage_request(adev->powerplay.pp_handle, 1793 clock); 1794 mutex_unlock(&adev->pm.mutex); 1795 1796 return ret; 1797 } 1798 1799 int amdgpu_dpm_get_current_clocks(struct amdgpu_device *adev, 1800 struct amd_pp_clock_info *clocks) 1801 { 1802 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1803 int ret = 0; 1804 1805 if (!pp_funcs->get_current_clocks) 1806 return -EOPNOTSUPP; 1807 1808 mutex_lock(&adev->pm.mutex); 1809 ret = pp_funcs->get_current_clocks(adev->powerplay.pp_handle, 1810 clocks); 1811 mutex_unlock(&adev->pm.mutex); 1812 1813 return ret; 1814 } 1815 1816 void amdgpu_dpm_notify_smu_enable_pwe(struct amdgpu_device *adev) 1817 { 1818 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1819 1820 if (!pp_funcs->notify_smu_enable_pwe) 1821 return; 1822 1823 mutex_lock(&adev->pm.mutex); 1824 pp_funcs->notify_smu_enable_pwe(adev->powerplay.pp_handle); 1825 mutex_unlock(&adev->pm.mutex); 1826 } 1827 1828 int amdgpu_dpm_set_active_display_count(struct amdgpu_device *adev, 1829 uint32_t count) 1830 { 1831 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1832 int ret = 0; 1833 1834 if (!pp_funcs->set_active_display_count) 1835 return -EOPNOTSUPP; 1836 1837 mutex_lock(&adev->pm.mutex); 1838 ret = pp_funcs->set_active_display_count(adev->powerplay.pp_handle, 1839 count); 1840 mutex_unlock(&adev->pm.mutex); 1841 1842 return ret; 1843 } 1844 1845 int amdgpu_dpm_set_min_deep_sleep_dcefclk(struct amdgpu_device *adev, 1846 uint32_t clock) 1847 { 1848 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1849 int ret = 0; 1850 1851 if (!pp_funcs->set_min_deep_sleep_dcefclk) 1852 return -EOPNOTSUPP; 1853 1854 mutex_lock(&adev->pm.mutex); 1855 ret = pp_funcs->set_min_deep_sleep_dcefclk(adev->powerplay.pp_handle, 1856 clock); 1857 mutex_unlock(&adev->pm.mutex); 1858 1859 return ret; 1860 } 1861 1862 void amdgpu_dpm_set_hard_min_dcefclk_by_freq(struct amdgpu_device *adev, 1863 uint32_t clock) 1864 { 1865 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1866 1867 if (!pp_funcs->set_hard_min_dcefclk_by_freq) 1868 return; 1869 1870 mutex_lock(&adev->pm.mutex); 1871 pp_funcs->set_hard_min_dcefclk_by_freq(adev->powerplay.pp_handle, 1872 clock); 1873 mutex_unlock(&adev->pm.mutex); 1874 } 1875 1876 void amdgpu_dpm_set_hard_min_fclk_by_freq(struct amdgpu_device *adev, 1877 uint32_t clock) 1878 { 1879 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1880 1881 if (!pp_funcs->set_hard_min_fclk_by_freq) 1882 return; 1883 1884 mutex_lock(&adev->pm.mutex); 1885 pp_funcs->set_hard_min_fclk_by_freq(adev->powerplay.pp_handle, 1886 clock); 1887 mutex_unlock(&adev->pm.mutex); 1888 } 1889 1890 int amdgpu_dpm_display_disable_memory_clock_switch(struct amdgpu_device *adev, 1891 bool disable_memory_clock_switch) 1892 { 1893 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1894 int ret = 0; 1895 1896 if (!pp_funcs->display_disable_memory_clock_switch) 1897 return 0; 1898 1899 mutex_lock(&adev->pm.mutex); 1900 ret = pp_funcs->display_disable_memory_clock_switch(adev->powerplay.pp_handle, 1901 disable_memory_clock_switch); 1902 mutex_unlock(&adev->pm.mutex); 1903 1904 return ret; 1905 } 1906 1907 int amdgpu_dpm_get_max_sustainable_clocks_by_dc(struct amdgpu_device *adev, 1908 struct pp_smu_nv_clock_table *max_clocks) 1909 { 1910 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1911 int ret = 0; 1912 1913 if (!pp_funcs->get_max_sustainable_clocks_by_dc) 1914 return -EOPNOTSUPP; 1915 1916 mutex_lock(&adev->pm.mutex); 1917 ret = pp_funcs->get_max_sustainable_clocks_by_dc(adev->powerplay.pp_handle, 1918 max_clocks); 1919 mutex_unlock(&adev->pm.mutex); 1920 1921 return ret; 1922 } 1923 1924 enum pp_smu_status amdgpu_dpm_get_uclk_dpm_states(struct amdgpu_device *adev, 1925 unsigned int *clock_values_in_khz, 1926 unsigned int *num_states) 1927 { 1928 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1929 int ret = 0; 1930 1931 if (!pp_funcs->get_uclk_dpm_states) 1932 return -EOPNOTSUPP; 1933 1934 mutex_lock(&adev->pm.mutex); 1935 ret = pp_funcs->get_uclk_dpm_states(adev->powerplay.pp_handle, 1936 clock_values_in_khz, 1937 num_states); 1938 mutex_unlock(&adev->pm.mutex); 1939 1940 return ret; 1941 } 1942 1943 int amdgpu_dpm_get_dpm_clock_table(struct amdgpu_device *adev, 1944 struct dpm_clocks *clock_table) 1945 { 1946 const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; 1947 int ret = 0; 1948 1949 if (!pp_funcs->get_dpm_clock_table) 1950 return -EOPNOTSUPP; 1951 1952 mutex_lock(&adev->pm.mutex); 1953 ret = pp_funcs->get_dpm_clock_table(adev->powerplay.pp_handle, 1954 clock_table); 1955 mutex_unlock(&adev->pm.mutex); 1956 1957 return ret; 1958 } 1959