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