1 /* $NetBSD: amdgpu_smu.h,v 1.3 2021/12/19 12:21:30 riastradh Exp $ */ 2 3 /* 4 * Copyright 2019 Advanced Micro Devices, Inc. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 #ifndef __AMDGPU_SMU_H__ 25 #define __AMDGPU_SMU_H__ 26 27 #include "amdgpu.h" 28 #include "kgd_pp_interface.h" 29 #include "dm_pp_interface.h" 30 #include "dm_pp_smu.h" 31 #include "smu_types.h" 32 33 #define SMU_THERMAL_MINIMUM_ALERT_TEMP 0 34 #define SMU_THERMAL_MAXIMUM_ALERT_TEMP 255 35 #define SMU_TEMPERATURE_UNITS_PER_CENTIGRADES 1000 36 37 struct smu_hw_power_state { 38 unsigned int magic; 39 }; 40 41 struct smu_power_state; 42 43 enum smu_state_ui_label { 44 SMU_STATE_UI_LABEL_NONE, 45 SMU_STATE_UI_LABEL_BATTERY, 46 SMU_STATE_UI_TABEL_MIDDLE_LOW, 47 SMU_STATE_UI_LABEL_BALLANCED, 48 SMU_STATE_UI_LABEL_MIDDLE_HIGHT, 49 SMU_STATE_UI_LABEL_PERFORMANCE, 50 SMU_STATE_UI_LABEL_BACO, 51 }; 52 53 enum smu_state_classification_flag { 54 SMU_STATE_CLASSIFICATION_FLAG_BOOT = 0x0001, 55 SMU_STATE_CLASSIFICATION_FLAG_THERMAL = 0x0002, 56 SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE = 0x0004, 57 SMU_STATE_CLASSIFICATION_FLAG_RESET = 0x0008, 58 SMU_STATE_CLASSIFICATION_FLAG_FORCED = 0x0010, 59 SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE = 0x0020, 60 SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE = 0x0040, 61 SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE = 0x0080, 62 SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE = 0x0100, 63 SMU_STATE_CLASSIFICATION_FLAG_UVD = 0x0200, 64 SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW = 0x0400, 65 SMU_STATE_CLASSIFICATION_FLAG_ACPI = 0x0800, 66 SMU_STATE_CLASSIFICATION_FLAG_HD2 = 0x1000, 67 SMU_STATE_CLASSIFICATION_FLAG_UVD_HD = 0x2000, 68 SMU_STATE_CLASSIFICATION_FLAG_UVD_SD = 0x4000, 69 SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE = 0x8000, 70 SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE = 0x10000, 71 SMU_STATE_CLASSIFICATION_FLAG_BACO = 0x20000, 72 SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2 = 0x40000, 73 SMU_STATE_CLASSIFICATION_FLAG_ULV = 0x80000, 74 SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC = 0x100000, 75 }; 76 77 struct smu_state_classification_block { 78 enum smu_state_ui_label ui_label; 79 enum smu_state_classification_flag flags; 80 int bios_index; 81 bool temporary_state; 82 bool to_be_deleted; 83 }; 84 85 struct smu_state_pcie_block { 86 unsigned int lanes; 87 }; 88 89 enum smu_refreshrate_source { 90 SMU_REFRESHRATE_SOURCE_EDID, 91 SMU_REFRESHRATE_SOURCE_EXPLICIT 92 }; 93 94 struct smu_state_display_block { 95 bool disable_frame_modulation; 96 bool limit_refreshrate; 97 enum smu_refreshrate_source refreshrate_source; 98 int explicit_refreshrate; 99 int edid_refreshrate_index; 100 bool enable_vari_bright; 101 }; 102 103 struct smu_state_memroy_block { 104 bool dll_off; 105 uint8_t m3arb; 106 uint8_t unused[3]; 107 }; 108 109 struct smu_state_software_algorithm_block { 110 bool disable_load_balancing; 111 bool enable_sleep_for_timestamps; 112 }; 113 114 struct smu_temperature_range { 115 int min; 116 int max; 117 int edge_emergency_max; 118 int hotspot_min; 119 int hotspot_crit_max; 120 int hotspot_emergency_max; 121 int mem_min; 122 int mem_crit_max; 123 int mem_emergency_max; 124 }; 125 126 struct smu_state_validation_block { 127 bool single_display_only; 128 bool disallow_on_dc; 129 uint8_t supported_power_levels; 130 }; 131 132 struct smu_uvd_clocks { 133 uint32_t vclk; 134 uint32_t dclk; 135 }; 136 137 /** 138 * Structure to hold a SMU Power State. 139 */ 140 struct smu_power_state { 141 uint32_t id; 142 struct list_head ordered_list; 143 struct list_head all_states_list; 144 145 struct smu_state_classification_block classification; 146 struct smu_state_validation_block validation; 147 struct smu_state_pcie_block pcie; 148 struct smu_state_display_block display; 149 struct smu_state_memroy_block memory; 150 struct smu_temperature_range temperatures; 151 struct smu_state_software_algorithm_block software; 152 struct smu_uvd_clocks uvd_clocks; 153 struct smu_hw_power_state hardware; 154 }; 155 156 enum smu_power_src_type 157 { 158 SMU_POWER_SOURCE_AC, 159 SMU_POWER_SOURCE_DC, 160 SMU_POWER_SOURCE_COUNT, 161 }; 162 163 enum smu_memory_pool_size 164 { 165 SMU_MEMORY_POOL_SIZE_ZERO = 0, 166 SMU_MEMORY_POOL_SIZE_256_MB = 0x10000000, 167 SMU_MEMORY_POOL_SIZE_512_MB = 0x20000000, 168 SMU_MEMORY_POOL_SIZE_1_GB = 0x40000000, 169 SMU_MEMORY_POOL_SIZE_2_GB = 0x80000000, 170 }; 171 172 #define SMU_TABLE_INIT(tables, table_id, s, a, d) \ 173 do { \ 174 tables[table_id].size = s; \ 175 tables[table_id].align = a; \ 176 tables[table_id].domain = d; \ 177 } while (0) 178 179 struct smu_table { 180 uint64_t size; 181 uint32_t align; 182 uint8_t domain; 183 uint64_t mc_address; 184 void *cpu_addr; 185 struct amdgpu_bo *bo; 186 }; 187 188 enum smu_perf_level_designation { 189 PERF_LEVEL_ACTIVITY, 190 PERF_LEVEL_POWER_CONTAINMENT, 191 }; 192 193 struct smu_performance_level { 194 uint32_t core_clock; 195 uint32_t memory_clock; 196 uint32_t vddc; 197 uint32_t vddci; 198 uint32_t non_local_mem_freq; 199 uint32_t non_local_mem_width; 200 }; 201 202 struct smu_clock_info { 203 uint32_t min_mem_clk; 204 uint32_t max_mem_clk; 205 uint32_t min_eng_clk; 206 uint32_t max_eng_clk; 207 uint32_t min_bus_bandwidth; 208 uint32_t max_bus_bandwidth; 209 }; 210 211 struct smu_bios_boot_up_values 212 { 213 uint32_t revision; 214 uint32_t gfxclk; 215 uint32_t uclk; 216 uint32_t socclk; 217 uint32_t dcefclk; 218 uint32_t eclk; 219 uint32_t vclk; 220 uint32_t dclk; 221 uint16_t vddc; 222 uint16_t vddci; 223 uint16_t mvddc; 224 uint16_t vdd_gfx; 225 uint8_t cooling_id; 226 uint32_t pp_table_id; 227 uint32_t format_revision; 228 uint32_t content_revision; 229 uint32_t fclk; 230 }; 231 232 enum smu_table_id 233 { 234 SMU_TABLE_PPTABLE = 0, 235 SMU_TABLE_WATERMARKS, 236 SMU_TABLE_CUSTOM_DPM, 237 SMU_TABLE_DPMCLOCKS, 238 SMU_TABLE_AVFS, 239 SMU_TABLE_AVFS_PSM_DEBUG, 240 SMU_TABLE_AVFS_FUSE_OVERRIDE, 241 SMU_TABLE_PMSTATUSLOG, 242 SMU_TABLE_SMU_METRICS, 243 SMU_TABLE_DRIVER_SMU_CONFIG, 244 SMU_TABLE_ACTIVITY_MONITOR_COEFF, 245 SMU_TABLE_OVERDRIVE, 246 SMU_TABLE_I2C_COMMANDS, 247 SMU_TABLE_PACE, 248 SMU_TABLE_COUNT, 249 }; 250 251 struct smu_table_context 252 { 253 const void *power_play_table; 254 uint32_t power_play_table_size; 255 void *hardcode_pptable; 256 unsigned long metrics_time; 257 void *metrics_table; 258 void *clocks_table; 259 void *watermarks_table; 260 261 void *max_sustainable_clocks; 262 struct smu_bios_boot_up_values boot_values; 263 void *driver_pptable; 264 struct smu_table *tables; 265 /* 266 * The driver table is just a staging buffer for 267 * uploading/downloading content from the SMU. 268 * 269 * And the table_id for SMU_MSG_TransferTableSmu2Dram/ 270 * SMU_MSG_TransferTableDram2Smu instructs SMU 271 * which content driver is interested. 272 */ 273 struct smu_table driver_table; 274 struct smu_table memory_pool; 275 uint8_t thermal_controller_type; 276 277 void *overdrive_table; 278 void *boot_overdrive_table; 279 }; 280 281 struct smu_dpm_context { 282 uint32_t dpm_context_size; 283 void *dpm_context; 284 void *golden_dpm_context; 285 bool enable_umd_pstate; 286 enum amd_dpm_forced_level dpm_level; 287 enum amd_dpm_forced_level saved_dpm_level; 288 enum amd_dpm_forced_level requested_dpm_level; 289 struct smu_power_state *dpm_request_power_state; 290 struct smu_power_state *dpm_current_power_state; 291 struct mclock_latency_table *mclk_latency_table; 292 }; 293 294 struct smu_power_gate { 295 bool uvd_gated; 296 bool vce_gated; 297 bool vcn_gated; 298 bool jpeg_gated; 299 }; 300 301 struct smu_power_context { 302 void *power_context; 303 uint32_t power_context_size; 304 struct smu_power_gate power_gate; 305 }; 306 307 308 #define SMU_FEATURE_MAX (64) 309 struct smu_feature 310 { 311 uint32_t feature_num; 312 DECLARE_BITMAP(supported, SMU_FEATURE_MAX); 313 DECLARE_BITMAP(allowed, SMU_FEATURE_MAX); 314 DECLARE_BITMAP(enabled, SMU_FEATURE_MAX); 315 struct mutex mutex; 316 }; 317 318 struct smu_clocks { 319 uint32_t engine_clock; 320 uint32_t memory_clock; 321 uint32_t bus_bandwidth; 322 uint32_t engine_clock_in_sr; 323 uint32_t dcef_clock; 324 uint32_t dcef_clock_in_sr; 325 }; 326 327 #define MAX_REGULAR_DPM_NUM 16 328 struct mclk_latency_entries { 329 uint32_t frequency; 330 uint32_t latency; 331 }; 332 struct mclock_latency_table { 333 uint32_t count; 334 struct mclk_latency_entries entries[MAX_REGULAR_DPM_NUM]; 335 }; 336 337 enum smu_reset_mode 338 { 339 SMU_RESET_MODE_0, 340 SMU_RESET_MODE_1, 341 SMU_RESET_MODE_2, 342 }; 343 344 enum smu_baco_state 345 { 346 SMU_BACO_STATE_ENTER = 0, 347 SMU_BACO_STATE_EXIT, 348 }; 349 350 struct smu_baco_context 351 { 352 struct mutex mutex; 353 uint32_t state; 354 bool platform_support; 355 }; 356 357 #define WORKLOAD_POLICY_MAX 7 358 struct smu_context 359 { 360 struct amdgpu_device *adev; 361 struct amdgpu_irq_src *irq_source; 362 363 const struct pptable_funcs *ppt_funcs; 364 struct mutex mutex; 365 struct mutex sensor_lock; 366 struct mutex metrics_lock; 367 uint64_t pool_size; 368 369 struct smu_table_context smu_table; 370 struct smu_dpm_context smu_dpm; 371 struct smu_power_context smu_power; 372 struct smu_feature smu_feature; 373 struct amd_pp_display_configuration *display_config; 374 struct smu_baco_context smu_baco; 375 void *od_settings; 376 377 uint32_t pstate_sclk; 378 uint32_t pstate_mclk; 379 380 bool od_enabled; 381 uint32_t power_limit; 382 uint32_t default_power_limit; 383 384 /* soft pptable */ 385 uint32_t ppt_offset_bytes; 386 uint32_t ppt_size_bytes; 387 uint8_t *ppt_start_addr; 388 389 bool support_power_containment; 390 bool disable_watermark; 391 392 #define WATERMARKS_EXIST (1 << 0) 393 #define WATERMARKS_LOADED (1 << 1) 394 uint32_t watermarks_bitmap; 395 uint32_t hard_min_uclk_req_from_dal; 396 bool disable_uclk_switch; 397 398 uint32_t workload_mask; 399 uint32_t workload_prority[WORKLOAD_POLICY_MAX]; 400 uint32_t workload_setting[WORKLOAD_POLICY_MAX]; 401 uint32_t power_profile_mode; 402 uint32_t default_power_profile_mode; 403 bool pm_enabled; 404 bool is_apu; 405 406 uint32_t smc_if_version; 407 408 bool uploading_custom_pp_table; 409 }; 410 411 struct i2c_adapter; 412 413 struct pptable_funcs { 414 int (*alloc_dpm_context)(struct smu_context *smu); 415 int (*store_powerplay_table)(struct smu_context *smu); 416 int (*check_powerplay_table)(struct smu_context *smu); 417 int (*append_powerplay_table)(struct smu_context *smu); 418 int (*get_smu_msg_index)(struct smu_context *smu, uint32_t index); 419 int (*get_smu_clk_index)(struct smu_context *smu, uint32_t index); 420 int (*get_smu_feature_index)(struct smu_context *smu, uint32_t index); 421 int (*get_smu_table_index)(struct smu_context *smu, uint32_t index); 422 int (*get_smu_power_index)(struct smu_context *smu, uint32_t index); 423 int (*get_workload_type)(struct smu_context *smu, enum PP_SMC_POWER_PROFILE profile); 424 int (*run_btc)(struct smu_context *smu); 425 int (*get_allowed_feature_mask)(struct smu_context *smu, uint32_t *feature_mask, uint32_t num); 426 enum amd_pm_state_type (*get_current_power_state)(struct smu_context *smu); 427 int (*set_default_dpm_table)(struct smu_context *smu); 428 int (*set_power_state)(struct smu_context *smu); 429 int (*populate_umd_state_clk)(struct smu_context *smu); 430 int (*print_clk_levels)(struct smu_context *smu, enum smu_clk_type clk_type, char *buf); 431 int (*force_clk_levels)(struct smu_context *smu, enum smu_clk_type clk_type, uint32_t mask); 432 int (*set_default_od8_settings)(struct smu_context *smu); 433 int (*get_od_percentage)(struct smu_context *smu, enum smu_clk_type clk_type); 434 int (*set_od_percentage)(struct smu_context *smu, 435 enum smu_clk_type clk_type, 436 uint32_t value); 437 int (*od_edit_dpm_table)(struct smu_context *smu, 438 enum PP_OD_DPM_TABLE_COMMAND type, 439 long *input, uint32_t size); 440 int (*get_clock_by_type_with_latency)(struct smu_context *smu, 441 enum smu_clk_type clk_type, 442 struct 443 pp_clock_levels_with_latency 444 *clocks); 445 int (*get_clock_by_type_with_voltage)(struct smu_context *smu, 446 enum amd_pp_clock_type type, 447 struct 448 pp_clock_levels_with_voltage 449 *clocks); 450 int (*get_power_profile_mode)(struct smu_context *smu, char *buf); 451 int (*set_power_profile_mode)(struct smu_context *smu, long *input, uint32_t size); 452 int (*dpm_set_uvd_enable)(struct smu_context *smu, bool enable); 453 int (*dpm_set_vce_enable)(struct smu_context *smu, bool enable); 454 int (*dpm_set_jpeg_enable)(struct smu_context *smu, bool enable); 455 int (*read_sensor)(struct smu_context *smu, enum amd_pp_sensors sensor, 456 void *data, uint32_t *size); 457 int (*pre_display_config_changed)(struct smu_context *smu); 458 int (*display_config_changed)(struct smu_context *smu); 459 int (*apply_clocks_adjust_rules)(struct smu_context *smu); 460 int (*notify_smc_display_config)(struct smu_context *smu); 461 int (*force_dpm_limit_value)(struct smu_context *smu, bool highest); 462 int (*unforce_dpm_levels)(struct smu_context *smu); 463 int (*get_profiling_clk_mask)(struct smu_context *smu, 464 enum amd_dpm_forced_level level, 465 uint32_t *sclk_mask, 466 uint32_t *mclk_mask, 467 uint32_t *soc_mask); 468 int (*set_cpu_power_state)(struct smu_context *smu); 469 bool (*is_dpm_running)(struct smu_context *smu); 470 int (*tables_init)(struct smu_context *smu, struct smu_table *tables); 471 int (*set_thermal_fan_table)(struct smu_context *smu); 472 int (*get_fan_speed_percent)(struct smu_context *smu, uint32_t *speed); 473 int (*get_fan_speed_rpm)(struct smu_context *smu, uint32_t *speed); 474 int (*set_watermarks_table)(struct smu_context *smu, void *watermarks, 475 struct dm_pp_wm_sets_with_clock_ranges_soc15 *clock_ranges); 476 int (*get_current_clk_freq_by_table)(struct smu_context *smu, 477 enum smu_clk_type clk_type, 478 uint32_t *value); 479 int (*get_thermal_temperature_range)(struct smu_context *smu, struct smu_temperature_range *range); 480 int (*get_uclk_dpm_states)(struct smu_context *smu, uint32_t *clocks_in_khz, uint32_t *num_states); 481 int (*set_default_od_settings)(struct smu_context *smu, bool initialize); 482 int (*set_performance_level)(struct smu_context *smu, enum amd_dpm_forced_level level); 483 int (*display_disable_memory_clock_switch)(struct smu_context *smu, bool disable_memory_clock_switch); 484 void (*dump_pptable)(struct smu_context *smu); 485 int (*get_power_limit)(struct smu_context *smu, uint32_t *limit, bool asic_default); 486 int (*get_dpm_clk_limited)(struct smu_context *smu, enum smu_clk_type clk_type, 487 uint32_t dpm_level, uint32_t *freq); 488 int (*set_df_cstate)(struct smu_context *smu, enum pp_df_cstate state); 489 int (*update_pcie_parameters)(struct smu_context *smu, uint32_t pcie_gen_cap, uint32_t pcie_width_cap); 490 int (*i2c_eeprom_init)(struct i2c_adapter *control); 491 void (*i2c_eeprom_fini)(struct i2c_adapter *control); 492 int (*get_dpm_clock_table)(struct smu_context *smu, struct dpm_clocks *clock_table); 493 int (*init_microcode)(struct smu_context *smu); 494 int (*load_microcode)(struct smu_context *smu); 495 int (*init_smc_tables)(struct smu_context *smu); 496 int (*fini_smc_tables)(struct smu_context *smu); 497 int (*init_power)(struct smu_context *smu); 498 int (*fini_power)(struct smu_context *smu); 499 int (*check_fw_status)(struct smu_context *smu); 500 int (*setup_pptable)(struct smu_context *smu); 501 int (*get_vbios_bootup_values)(struct smu_context *smu); 502 int (*get_clk_info_from_vbios)(struct smu_context *smu); 503 int (*check_pptable)(struct smu_context *smu); 504 int (*parse_pptable)(struct smu_context *smu); 505 int (*populate_smc_tables)(struct smu_context *smu); 506 int (*check_fw_version)(struct smu_context *smu); 507 int (*powergate_sdma)(struct smu_context *smu, bool gate); 508 int (*powergate_vcn)(struct smu_context *smu, bool gate); 509 int (*powergate_jpeg)(struct smu_context *smu, bool gate); 510 int (*set_gfx_cgpg)(struct smu_context *smu, bool enable); 511 int (*write_pptable)(struct smu_context *smu); 512 int (*set_min_dcef_deep_sleep)(struct smu_context *smu); 513 int (*set_driver_table_location)(struct smu_context *smu); 514 int (*set_tool_table_location)(struct smu_context *smu); 515 int (*notify_memory_pool_location)(struct smu_context *smu); 516 int (*set_last_dcef_min_deep_sleep_clk)(struct smu_context *smu); 517 int (*system_features_control)(struct smu_context *smu, bool en); 518 int (*send_smc_msg_with_param)(struct smu_context *smu, 519 enum smu_message_type msg, uint32_t param); 520 int (*read_smc_arg)(struct smu_context *smu, uint32_t *arg); 521 int (*init_display_count)(struct smu_context *smu, uint32_t count); 522 int (*set_allowed_mask)(struct smu_context *smu); 523 int (*get_enabled_mask)(struct smu_context *smu, uint32_t *feature_mask, uint32_t num); 524 int (*notify_display_change)(struct smu_context *smu); 525 int (*set_power_limit)(struct smu_context *smu, uint32_t n); 526 int (*get_current_clk_freq)(struct smu_context *smu, enum smu_clk_type clk_id, uint32_t *value); 527 int (*init_max_sustainable_clocks)(struct smu_context *smu); 528 int (*start_thermal_control)(struct smu_context *smu); 529 int (*stop_thermal_control)(struct smu_context *smu); 530 int (*set_deep_sleep_dcefclk)(struct smu_context *smu, uint32_t clk); 531 int (*set_active_display_count)(struct smu_context *smu, uint32_t count); 532 int (*store_cc6_data)(struct smu_context *smu, uint32_t separation_time, 533 bool cc6_disable, bool pstate_disable, 534 bool pstate_switch_disable); 535 int (*get_clock_by_type)(struct smu_context *smu, 536 enum amd_pp_clock_type type, 537 struct amd_pp_clocks *clocks); 538 int (*get_max_high_clocks)(struct smu_context *smu, 539 struct amd_pp_simple_clock_info *clocks); 540 int (*display_clock_voltage_request)(struct smu_context *smu, struct 541 pp_display_clock_request 542 *clock_req); 543 int (*get_dal_power_level)(struct smu_context *smu, 544 struct amd_pp_simple_clock_info *clocks); 545 int (*get_perf_level)(struct smu_context *smu, 546 enum smu_perf_level_designation designation, 547 struct smu_performance_level *level); 548 int (*get_current_shallow_sleep_clocks)(struct smu_context *smu, 549 struct smu_clock_info *clocks); 550 int (*notify_smu_enable_pwe)(struct smu_context *smu); 551 int (*conv_power_profile_to_pplib_workload)(int power_profile); 552 uint32_t (*get_fan_control_mode)(struct smu_context *smu); 553 int (*set_fan_control_mode)(struct smu_context *smu, uint32_t mode); 554 int (*set_fan_speed_percent)(struct smu_context *smu, uint32_t speed); 555 int (*set_fan_speed_rpm)(struct smu_context *smu, uint32_t speed); 556 int (*set_xgmi_pstate)(struct smu_context *smu, uint32_t pstate); 557 int (*gfx_off_control)(struct smu_context *smu, bool enable); 558 int (*register_irq_handler)(struct smu_context *smu); 559 int (*set_azalia_d3_pme)(struct smu_context *smu); 560 int (*get_max_sustainable_clocks_by_dc)(struct smu_context *smu, struct pp_smu_nv_clock_table *max_clocks); 561 bool (*baco_is_support)(struct smu_context *smu); 562 enum smu_baco_state (*baco_get_state)(struct smu_context *smu); 563 int (*baco_set_state)(struct smu_context *smu, enum smu_baco_state state); 564 int (*baco_enter)(struct smu_context *smu); 565 int (*baco_exit)(struct smu_context *smu); 566 int (*mode2_reset)(struct smu_context *smu); 567 int (*get_dpm_ultimate_freq)(struct smu_context *smu, enum smu_clk_type clk_type, uint32_t *min, uint32_t *max); 568 int (*set_soft_freq_limited_range)(struct smu_context *smu, enum smu_clk_type clk_type, uint32_t min, uint32_t max); 569 int (*override_pcie_parameters)(struct smu_context *smu); 570 uint32_t (*get_pptable_power_limit)(struct smu_context *smu); 571 int (*disable_umc_cdr_12gbps_workaround)(struct smu_context *smu); 572 }; 573 574 int smu_load_microcode(struct smu_context *smu); 575 576 int smu_check_fw_status(struct smu_context *smu); 577 578 int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled); 579 580 #define smu_i2c_eeprom_init(smu, control) \ 581 ((smu)->ppt_funcs->i2c_eeprom_init ? (smu)->ppt_funcs->i2c_eeprom_init((control)) : -EINVAL) 582 #define smu_i2c_eeprom_fini(smu, control) \ 583 ((smu)->ppt_funcs->i2c_eeprom_fini ? (smu)->ppt_funcs->i2c_eeprom_fini((control)) : -EINVAL) 584 585 int smu_set_fan_speed_rpm(struct smu_context *smu, uint32_t speed); 586 587 int smu_get_power_limit(struct smu_context *smu, 588 uint32_t *limit, 589 bool def, 590 bool lock_needed); 591 592 int smu_set_power_limit(struct smu_context *smu, uint32_t limit); 593 int smu_print_clk_levels(struct smu_context *smu, enum smu_clk_type clk_type, char *buf); 594 int smu_get_od_percentage(struct smu_context *smu, enum smu_clk_type type); 595 int smu_set_od_percentage(struct smu_context *smu, enum smu_clk_type type, uint32_t value); 596 597 int smu_od_edit_dpm_table(struct smu_context *smu, 598 enum PP_OD_DPM_TABLE_COMMAND type, 599 long *input, uint32_t size); 600 601 int smu_read_sensor(struct smu_context *smu, 602 enum amd_pp_sensors sensor, 603 void *data, uint32_t *size); 604 int smu_get_power_profile_mode(struct smu_context *smu, char *buf); 605 606 int smu_set_power_profile_mode(struct smu_context *smu, 607 long *param, 608 uint32_t param_size, 609 bool lock_needed); 610 int smu_get_fan_control_mode(struct smu_context *smu); 611 int smu_set_fan_control_mode(struct smu_context *smu, int value); 612 int smu_get_fan_speed_percent(struct smu_context *smu, uint32_t *speed); 613 int smu_set_fan_speed_percent(struct smu_context *smu, uint32_t speed); 614 int smu_get_fan_speed_rpm(struct smu_context *smu, uint32_t *speed); 615 616 int smu_set_deep_sleep_dcefclk(struct smu_context *smu, int clk); 617 int smu_set_active_display_count(struct smu_context *smu, uint32_t count); 618 619 int smu_get_clock_by_type(struct smu_context *smu, 620 enum amd_pp_clock_type type, 621 struct amd_pp_clocks *clocks); 622 623 int smu_get_max_high_clocks(struct smu_context *smu, 624 struct amd_pp_simple_clock_info *clocks); 625 626 int smu_get_clock_by_type_with_latency(struct smu_context *smu, 627 enum smu_clk_type clk_type, 628 struct pp_clock_levels_with_latency *clocks); 629 630 int smu_get_clock_by_type_with_voltage(struct smu_context *smu, 631 enum amd_pp_clock_type type, 632 struct pp_clock_levels_with_voltage *clocks); 633 634 int smu_display_clock_voltage_request(struct smu_context *smu, 635 struct pp_display_clock_request *clock_req); 636 int smu_display_disable_memory_clock_switch(struct smu_context *smu, bool disable_memory_clock_switch); 637 int smu_notify_smu_enable_pwe(struct smu_context *smu); 638 639 int smu_set_xgmi_pstate(struct smu_context *smu, 640 uint32_t pstate); 641 642 int smu_set_azalia_d3_pme(struct smu_context *smu); 643 644 bool smu_baco_is_support(struct smu_context *smu); 645 646 int smu_baco_get_state(struct smu_context *smu, enum smu_baco_state *state); 647 648 int smu_baco_enter(struct smu_context *smu); 649 int smu_baco_exit(struct smu_context *smu); 650 651 int smu_mode2_reset(struct smu_context *smu); 652 653 extern int smu_get_atom_data_table(struct smu_context *smu, uint32_t table, 654 uint16_t *size, uint8_t *frev, uint8_t *crev, 655 uint8_t **addr); 656 657 extern const struct amd_ip_funcs smu_ip_funcs; 658 659 extern const struct amdgpu_ip_block_version smu_v11_0_ip_block; 660 extern const struct amdgpu_ip_block_version smu_v12_0_ip_block; 661 662 extern int smu_feature_init_dpm(struct smu_context *smu); 663 664 extern int smu_feature_is_enabled(struct smu_context *smu, 665 enum smu_feature_mask mask); 666 extern int smu_feature_set_enabled(struct smu_context *smu, 667 enum smu_feature_mask mask, bool enable); 668 extern int smu_feature_is_supported(struct smu_context *smu, 669 enum smu_feature_mask mask); 670 extern int smu_feature_set_supported(struct smu_context *smu, 671 enum smu_feature_mask mask, bool enable); 672 673 int smu_update_table(struct smu_context *smu, enum smu_table_id table_index, int argument, 674 void *table_data, bool drv2smu); 675 676 bool is_support_sw_smu(struct amdgpu_device *adev); 677 bool is_support_sw_smu_xgmi(struct amdgpu_device *adev); 678 int smu_reset(struct smu_context *smu); 679 int smu_common_read_sensor(struct smu_context *smu, enum amd_pp_sensors sensor, 680 void *data, uint32_t *size); 681 int smu_sys_get_pp_table(struct smu_context *smu, const void **table); 682 int smu_sys_set_pp_table(struct smu_context *smu, void *buf, size_t size); 683 int smu_get_power_num_states(struct smu_context *smu, struct pp_states_info *state_info); 684 enum amd_pm_state_type smu_get_current_power_state(struct smu_context *smu); 685 int smu_write_watermarks_table(struct smu_context *smu); 686 int smu_set_watermarks_for_clock_ranges( 687 struct smu_context *smu, 688 struct dm_pp_wm_sets_with_clock_ranges_soc15 *clock_ranges); 689 690 /* smu to display interface */ 691 extern int smu_display_configuration_change(struct smu_context *smu, const 692 struct amd_pp_display_configuration 693 *display_config); 694 extern int smu_get_current_clocks(struct smu_context *smu, 695 struct amd_pp_clock_info *clocks); 696 extern int smu_dpm_set_power_gate(struct smu_context *smu,uint32_t block_type, bool gate); 697 extern int smu_handle_task(struct smu_context *smu, 698 enum amd_dpm_forced_level level, 699 enum amd_pp_task task_id, 700 bool lock_needed); 701 int smu_switch_power_profile(struct smu_context *smu, 702 enum PP_SMC_POWER_PROFILE type, 703 bool en); 704 int smu_get_smc_version(struct smu_context *smu, uint32_t *if_version, uint32_t *smu_version); 705 int smu_get_dpm_freq_by_index(struct smu_context *smu, enum smu_clk_type clk_type, 706 uint16_t level, uint32_t *value); 707 int smu_get_dpm_level_count(struct smu_context *smu, enum smu_clk_type clk_type, 708 uint32_t *value); 709 int smu_get_dpm_freq_range(struct smu_context *smu, enum smu_clk_type clk_type, 710 uint32_t *min, uint32_t *max, bool lock_needed); 711 int smu_set_soft_freq_range(struct smu_context *smu, enum smu_clk_type clk_type, 712 uint32_t min, uint32_t max); 713 int smu_set_hard_freq_range(struct smu_context *smu, enum smu_clk_type clk_type, 714 uint32_t min, uint32_t max); 715 int smu_get_dpm_level_range(struct smu_context *smu, enum smu_clk_type clk_type, 716 uint32_t *min_value, uint32_t *max_value); 717 enum amd_dpm_forced_level smu_get_performance_level(struct smu_context *smu); 718 int smu_force_performance_level(struct smu_context *smu, enum amd_dpm_forced_level level); 719 int smu_set_display_count(struct smu_context *smu, uint32_t count); 720 bool smu_clk_dpm_is_enabled(struct smu_context *smu, enum smu_clk_type clk_type); 721 const char *smu_get_message_name(struct smu_context *smu, enum smu_message_type type); 722 const char *smu_get_feature_name(struct smu_context *smu, enum smu_feature_mask feature); 723 size_t smu_sys_get_pp_feature_mask(struct smu_context *smu, char *buf); 724 int smu_sys_set_pp_feature_mask(struct smu_context *smu, uint64_t new_mask); 725 int smu_force_clk_levels(struct smu_context *smu, 726 enum smu_clk_type clk_type, 727 uint32_t mask, 728 bool lock_needed); 729 int smu_set_mp1_state(struct smu_context *smu, 730 enum pp_mp1_state mp1_state); 731 int smu_set_df_cstate(struct smu_context *smu, 732 enum pp_df_cstate state); 733 734 int smu_get_max_sustainable_clocks_by_dc(struct smu_context *smu, 735 struct pp_smu_nv_clock_table *max_clocks); 736 737 int smu_get_uclk_dpm_states(struct smu_context *smu, 738 unsigned int *clock_values_in_khz, 739 unsigned int *num_states); 740 741 int smu_get_dpm_clock_table(struct smu_context *smu, 742 struct dpm_clocks *clock_table); 743 744 uint32_t smu_get_pptable_power_limit(struct smu_context *smu); 745 746 #endif 747