11bb76ff1Sjsg /* 21bb76ff1Sjsg * Copyright 2019 Advanced Micro Devices, Inc. 31bb76ff1Sjsg * 41bb76ff1Sjsg * Permission is hereby granted, free of charge, to any person obtaining a 51bb76ff1Sjsg * copy of this software and associated documentation files (the "Software"), 61bb76ff1Sjsg * to deal in the Software without restriction, including without limitation 71bb76ff1Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 81bb76ff1Sjsg * and/or sell copies of the Software, and to permit persons to whom the 91bb76ff1Sjsg * Software is furnished to do so, subject to the following conditions: 101bb76ff1Sjsg * 111bb76ff1Sjsg * The above copyright notice and this permission notice shall be included in 121bb76ff1Sjsg * all copies or substantial portions of the Software. 131bb76ff1Sjsg * 141bb76ff1Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 151bb76ff1Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 161bb76ff1Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 171bb76ff1Sjsg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 181bb76ff1Sjsg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 191bb76ff1Sjsg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 201bb76ff1Sjsg * OTHER DEALINGS IN THE SOFTWARE. 211bb76ff1Sjsg */ 221bb76ff1Sjsg #ifndef __AMDGPU_SMU_H__ 231bb76ff1Sjsg #define __AMDGPU_SMU_H__ 241bb76ff1Sjsg 251bb76ff1Sjsg #include "amdgpu.h" 261bb76ff1Sjsg #include "kgd_pp_interface.h" 271bb76ff1Sjsg #include "dm_pp_interface.h" 281bb76ff1Sjsg #include "dm_pp_smu.h" 291bb76ff1Sjsg #include "smu_types.h" 301bb76ff1Sjsg #include "linux/firmware.h" 311bb76ff1Sjsg 321bb76ff1Sjsg #define SMU_THERMAL_MINIMUM_ALERT_TEMP 0 331bb76ff1Sjsg #define SMU_THERMAL_MAXIMUM_ALERT_TEMP 255 341bb76ff1Sjsg #define SMU_TEMPERATURE_UNITS_PER_CENTIGRADES 1000 351bb76ff1Sjsg #define SMU_FW_NAME_LEN 0x24 361bb76ff1Sjsg 371bb76ff1Sjsg #define SMU_DPM_USER_PROFILE_RESTORE (1 << 0) 381bb76ff1Sjsg #define SMU_CUSTOM_FAN_SPEED_RPM (1 << 1) 391bb76ff1Sjsg #define SMU_CUSTOM_FAN_SPEED_PWM (1 << 2) 401bb76ff1Sjsg 411bb76ff1Sjsg // Power Throttlers 421bb76ff1Sjsg #define SMU_THROTTLER_PPT0_BIT 0 431bb76ff1Sjsg #define SMU_THROTTLER_PPT1_BIT 1 441bb76ff1Sjsg #define SMU_THROTTLER_PPT2_BIT 2 451bb76ff1Sjsg #define SMU_THROTTLER_PPT3_BIT 3 461bb76ff1Sjsg #define SMU_THROTTLER_SPL_BIT 4 471bb76ff1Sjsg #define SMU_THROTTLER_FPPT_BIT 5 481bb76ff1Sjsg #define SMU_THROTTLER_SPPT_BIT 6 491bb76ff1Sjsg #define SMU_THROTTLER_SPPT_APU_BIT 7 501bb76ff1Sjsg 511bb76ff1Sjsg // Current Throttlers 521bb76ff1Sjsg #define SMU_THROTTLER_TDC_GFX_BIT 16 531bb76ff1Sjsg #define SMU_THROTTLER_TDC_SOC_BIT 17 541bb76ff1Sjsg #define SMU_THROTTLER_TDC_MEM_BIT 18 551bb76ff1Sjsg #define SMU_THROTTLER_TDC_VDD_BIT 19 561bb76ff1Sjsg #define SMU_THROTTLER_TDC_CVIP_BIT 20 571bb76ff1Sjsg #define SMU_THROTTLER_EDC_CPU_BIT 21 581bb76ff1Sjsg #define SMU_THROTTLER_EDC_GFX_BIT 22 591bb76ff1Sjsg #define SMU_THROTTLER_APCC_BIT 23 601bb76ff1Sjsg 611bb76ff1Sjsg // Temperature 621bb76ff1Sjsg #define SMU_THROTTLER_TEMP_GPU_BIT 32 631bb76ff1Sjsg #define SMU_THROTTLER_TEMP_CORE_BIT 33 641bb76ff1Sjsg #define SMU_THROTTLER_TEMP_MEM_BIT 34 651bb76ff1Sjsg #define SMU_THROTTLER_TEMP_EDGE_BIT 35 661bb76ff1Sjsg #define SMU_THROTTLER_TEMP_HOTSPOT_BIT 36 671bb76ff1Sjsg #define SMU_THROTTLER_TEMP_SOC_BIT 37 681bb76ff1Sjsg #define SMU_THROTTLER_TEMP_VR_GFX_BIT 38 691bb76ff1Sjsg #define SMU_THROTTLER_TEMP_VR_SOC_BIT 39 701bb76ff1Sjsg #define SMU_THROTTLER_TEMP_VR_MEM0_BIT 40 711bb76ff1Sjsg #define SMU_THROTTLER_TEMP_VR_MEM1_BIT 41 721bb76ff1Sjsg #define SMU_THROTTLER_TEMP_LIQUID0_BIT 42 731bb76ff1Sjsg #define SMU_THROTTLER_TEMP_LIQUID1_BIT 43 741bb76ff1Sjsg #define SMU_THROTTLER_VRHOT0_BIT 44 751bb76ff1Sjsg #define SMU_THROTTLER_VRHOT1_BIT 45 761bb76ff1Sjsg #define SMU_THROTTLER_PROCHOT_CPU_BIT 46 771bb76ff1Sjsg #define SMU_THROTTLER_PROCHOT_GFX_BIT 47 781bb76ff1Sjsg 791bb76ff1Sjsg // Other 801bb76ff1Sjsg #define SMU_THROTTLER_PPM_BIT 56 811bb76ff1Sjsg #define SMU_THROTTLER_FIT_BIT 57 821bb76ff1Sjsg 831bb76ff1Sjsg struct smu_hw_power_state { 841bb76ff1Sjsg unsigned int magic; 851bb76ff1Sjsg }; 861bb76ff1Sjsg 871bb76ff1Sjsg struct smu_power_state; 881bb76ff1Sjsg 891bb76ff1Sjsg enum smu_state_ui_label { 901bb76ff1Sjsg SMU_STATE_UI_LABEL_NONE, 911bb76ff1Sjsg SMU_STATE_UI_LABEL_BATTERY, 921bb76ff1Sjsg SMU_STATE_UI_TABEL_MIDDLE_LOW, 931bb76ff1Sjsg SMU_STATE_UI_LABEL_BALLANCED, 941bb76ff1Sjsg SMU_STATE_UI_LABEL_MIDDLE_HIGHT, 951bb76ff1Sjsg SMU_STATE_UI_LABEL_PERFORMANCE, 961bb76ff1Sjsg SMU_STATE_UI_LABEL_BACO, 971bb76ff1Sjsg }; 981bb76ff1Sjsg 991bb76ff1Sjsg enum smu_state_classification_flag { 1001bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_BOOT = 0x0001, 1011bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_THERMAL = 0x0002, 1021bb76ff1Sjsg SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE = 0x0004, 1031bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_RESET = 0x0008, 1041bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_FORCED = 0x0010, 1051bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE = 0x0020, 1061bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE = 0x0040, 1071bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE = 0x0080, 1081bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE = 0x0100, 1091bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_UVD = 0x0200, 1101bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW = 0x0400, 1111bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_ACPI = 0x0800, 1121bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_HD2 = 0x1000, 1131bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_UVD_HD = 0x2000, 1141bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_UVD_SD = 0x4000, 1151bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE = 0x8000, 1161bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE = 0x10000, 1171bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_BACO = 0x20000, 1181bb76ff1Sjsg SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2 = 0x40000, 1191bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_ULV = 0x80000, 1201bb76ff1Sjsg SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC = 0x100000, 1211bb76ff1Sjsg }; 1221bb76ff1Sjsg 1231bb76ff1Sjsg struct smu_state_classification_block { 1241bb76ff1Sjsg enum smu_state_ui_label ui_label; 1251bb76ff1Sjsg enum smu_state_classification_flag flags; 1261bb76ff1Sjsg int bios_index; 1271bb76ff1Sjsg bool temporary_state; 1281bb76ff1Sjsg bool to_be_deleted; 1291bb76ff1Sjsg }; 1301bb76ff1Sjsg 1311bb76ff1Sjsg struct smu_state_pcie_block { 1321bb76ff1Sjsg unsigned int lanes; 1331bb76ff1Sjsg }; 1341bb76ff1Sjsg 1351bb76ff1Sjsg enum smu_refreshrate_source { 1361bb76ff1Sjsg SMU_REFRESHRATE_SOURCE_EDID, 1371bb76ff1Sjsg SMU_REFRESHRATE_SOURCE_EXPLICIT 1381bb76ff1Sjsg }; 1391bb76ff1Sjsg 1401bb76ff1Sjsg struct smu_state_display_block { 1411bb76ff1Sjsg bool disable_frame_modulation; 1421bb76ff1Sjsg bool limit_refreshrate; 1431bb76ff1Sjsg enum smu_refreshrate_source refreshrate_source; 1441bb76ff1Sjsg int explicit_refreshrate; 1451bb76ff1Sjsg int edid_refreshrate_index; 1461bb76ff1Sjsg bool enable_vari_bright; 1471bb76ff1Sjsg }; 1481bb76ff1Sjsg 1491bb76ff1Sjsg struct smu_state_memory_block { 1501bb76ff1Sjsg bool dll_off; 1511bb76ff1Sjsg uint8_t m3arb; 1521bb76ff1Sjsg uint8_t unused[3]; 1531bb76ff1Sjsg }; 1541bb76ff1Sjsg 1551bb76ff1Sjsg struct smu_state_software_algorithm_block { 1561bb76ff1Sjsg bool disable_load_balancing; 1571bb76ff1Sjsg bool enable_sleep_for_timestamps; 1581bb76ff1Sjsg }; 1591bb76ff1Sjsg 1601bb76ff1Sjsg struct smu_temperature_range { 1611bb76ff1Sjsg int min; 1621bb76ff1Sjsg int max; 1631bb76ff1Sjsg int edge_emergency_max; 1641bb76ff1Sjsg int hotspot_min; 1651bb76ff1Sjsg int hotspot_crit_max; 1661bb76ff1Sjsg int hotspot_emergency_max; 1671bb76ff1Sjsg int mem_min; 1681bb76ff1Sjsg int mem_crit_max; 1691bb76ff1Sjsg int mem_emergency_max; 1701bb76ff1Sjsg int software_shutdown_temp; 171ff290ac4Sjsg int software_shutdown_temp_offset; 1721bb76ff1Sjsg }; 1731bb76ff1Sjsg 1741bb76ff1Sjsg struct smu_state_validation_block { 1751bb76ff1Sjsg bool single_display_only; 1761bb76ff1Sjsg bool disallow_on_dc; 1771bb76ff1Sjsg uint8_t supported_power_levels; 1781bb76ff1Sjsg }; 1791bb76ff1Sjsg 1801bb76ff1Sjsg struct smu_uvd_clocks { 1811bb76ff1Sjsg uint32_t vclk; 1821bb76ff1Sjsg uint32_t dclk; 1831bb76ff1Sjsg }; 1841bb76ff1Sjsg 1851bb76ff1Sjsg /** 1861bb76ff1Sjsg * Structure to hold a SMU Power State. 1871bb76ff1Sjsg */ 1881bb76ff1Sjsg struct smu_power_state { 1891bb76ff1Sjsg uint32_t id; 1901bb76ff1Sjsg struct list_head ordered_list; 1911bb76ff1Sjsg struct list_head all_states_list; 1921bb76ff1Sjsg 1931bb76ff1Sjsg struct smu_state_classification_block classification; 1941bb76ff1Sjsg struct smu_state_validation_block validation; 1951bb76ff1Sjsg struct smu_state_pcie_block pcie; 1961bb76ff1Sjsg struct smu_state_display_block display; 1971bb76ff1Sjsg struct smu_state_memory_block memory; 1981bb76ff1Sjsg struct smu_state_software_algorithm_block software; 1991bb76ff1Sjsg struct smu_uvd_clocks uvd_clocks; 2001bb76ff1Sjsg struct smu_hw_power_state hardware; 2011bb76ff1Sjsg }; 2021bb76ff1Sjsg 203*f005ef32Sjsg enum smu_power_src_type { 2041bb76ff1Sjsg SMU_POWER_SOURCE_AC, 2051bb76ff1Sjsg SMU_POWER_SOURCE_DC, 2061bb76ff1Sjsg SMU_POWER_SOURCE_COUNT, 2071bb76ff1Sjsg }; 2081bb76ff1Sjsg 209*f005ef32Sjsg enum smu_ppt_limit_type { 2101bb76ff1Sjsg SMU_DEFAULT_PPT_LIMIT = 0, 2111bb76ff1Sjsg SMU_FAST_PPT_LIMIT, 2121bb76ff1Sjsg }; 2131bb76ff1Sjsg 214*f005ef32Sjsg enum smu_ppt_limit_level { 2151bb76ff1Sjsg SMU_PPT_LIMIT_MIN = -1, 2161bb76ff1Sjsg SMU_PPT_LIMIT_CURRENT, 2171bb76ff1Sjsg SMU_PPT_LIMIT_DEFAULT, 2181bb76ff1Sjsg SMU_PPT_LIMIT_MAX, 2191bb76ff1Sjsg }; 2201bb76ff1Sjsg 221*f005ef32Sjsg enum smu_memory_pool_size { 2221bb76ff1Sjsg SMU_MEMORY_POOL_SIZE_ZERO = 0, 2231bb76ff1Sjsg SMU_MEMORY_POOL_SIZE_256_MB = 0x10000000, 2241bb76ff1Sjsg SMU_MEMORY_POOL_SIZE_512_MB = 0x20000000, 2251bb76ff1Sjsg SMU_MEMORY_POOL_SIZE_1_GB = 0x40000000, 2261bb76ff1Sjsg SMU_MEMORY_POOL_SIZE_2_GB = 0x80000000, 2271bb76ff1Sjsg }; 2281bb76ff1Sjsg 2291bb76ff1Sjsg struct smu_user_dpm_profile { 2301bb76ff1Sjsg uint32_t fan_mode; 2311bb76ff1Sjsg uint32_t power_limit; 2321bb76ff1Sjsg uint32_t fan_speed_pwm; 2331bb76ff1Sjsg uint32_t fan_speed_rpm; 2341bb76ff1Sjsg uint32_t flags; 2351bb76ff1Sjsg uint32_t user_od; 2361bb76ff1Sjsg 2371bb76ff1Sjsg /* user clock state information */ 2381bb76ff1Sjsg uint32_t clk_mask[SMU_CLK_COUNT]; 2391bb76ff1Sjsg uint32_t clk_dependency; 2401bb76ff1Sjsg }; 2411bb76ff1Sjsg 2421bb76ff1Sjsg #define SMU_TABLE_INIT(tables, table_id, s, a, d) \ 2431bb76ff1Sjsg do { \ 2441bb76ff1Sjsg tables[table_id].size = s; \ 2451bb76ff1Sjsg tables[table_id].align = a; \ 2461bb76ff1Sjsg tables[table_id].domain = d; \ 2471bb76ff1Sjsg } while (0) 2481bb76ff1Sjsg 2491bb76ff1Sjsg struct smu_table { 2501bb76ff1Sjsg uint64_t size; 2511bb76ff1Sjsg uint32_t align; 2521bb76ff1Sjsg uint8_t domain; 2531bb76ff1Sjsg uint64_t mc_address; 2541bb76ff1Sjsg void *cpu_addr; 2551bb76ff1Sjsg struct amdgpu_bo *bo; 2561bb76ff1Sjsg }; 2571bb76ff1Sjsg 2581bb76ff1Sjsg enum smu_perf_level_designation { 2591bb76ff1Sjsg PERF_LEVEL_ACTIVITY, 2601bb76ff1Sjsg PERF_LEVEL_POWER_CONTAINMENT, 2611bb76ff1Sjsg }; 2621bb76ff1Sjsg 2631bb76ff1Sjsg struct smu_performance_level { 2641bb76ff1Sjsg uint32_t core_clock; 2651bb76ff1Sjsg uint32_t memory_clock; 2661bb76ff1Sjsg uint32_t vddc; 2671bb76ff1Sjsg uint32_t vddci; 2681bb76ff1Sjsg uint32_t non_local_mem_freq; 2691bb76ff1Sjsg uint32_t non_local_mem_width; 2701bb76ff1Sjsg }; 2711bb76ff1Sjsg 2721bb76ff1Sjsg struct smu_clock_info { 2731bb76ff1Sjsg uint32_t min_mem_clk; 2741bb76ff1Sjsg uint32_t max_mem_clk; 2751bb76ff1Sjsg uint32_t min_eng_clk; 2761bb76ff1Sjsg uint32_t max_eng_clk; 2771bb76ff1Sjsg uint32_t min_bus_bandwidth; 2781bb76ff1Sjsg uint32_t max_bus_bandwidth; 2791bb76ff1Sjsg }; 2801bb76ff1Sjsg 281*f005ef32Sjsg struct smu_bios_boot_up_values { 2821bb76ff1Sjsg uint32_t revision; 2831bb76ff1Sjsg uint32_t gfxclk; 2841bb76ff1Sjsg uint32_t uclk; 2851bb76ff1Sjsg uint32_t socclk; 2861bb76ff1Sjsg uint32_t dcefclk; 2871bb76ff1Sjsg uint32_t eclk; 2881bb76ff1Sjsg uint32_t vclk; 2891bb76ff1Sjsg uint32_t dclk; 2901bb76ff1Sjsg uint16_t vddc; 2911bb76ff1Sjsg uint16_t vddci; 2921bb76ff1Sjsg uint16_t mvddc; 2931bb76ff1Sjsg uint16_t vdd_gfx; 2941bb76ff1Sjsg uint8_t cooling_id; 2951bb76ff1Sjsg uint32_t pp_table_id; 2961bb76ff1Sjsg uint32_t format_revision; 2971bb76ff1Sjsg uint32_t content_revision; 2981bb76ff1Sjsg uint32_t fclk; 2991bb76ff1Sjsg uint32_t lclk; 3001bb76ff1Sjsg uint32_t firmware_caps; 3011bb76ff1Sjsg }; 3021bb76ff1Sjsg 303*f005ef32Sjsg enum smu_table_id { 3041bb76ff1Sjsg SMU_TABLE_PPTABLE = 0, 3051bb76ff1Sjsg SMU_TABLE_WATERMARKS, 3061bb76ff1Sjsg SMU_TABLE_CUSTOM_DPM, 3071bb76ff1Sjsg SMU_TABLE_DPMCLOCKS, 3081bb76ff1Sjsg SMU_TABLE_AVFS, 3091bb76ff1Sjsg SMU_TABLE_AVFS_PSM_DEBUG, 3101bb76ff1Sjsg SMU_TABLE_AVFS_FUSE_OVERRIDE, 3111bb76ff1Sjsg SMU_TABLE_PMSTATUSLOG, 3121bb76ff1Sjsg SMU_TABLE_SMU_METRICS, 3131bb76ff1Sjsg SMU_TABLE_DRIVER_SMU_CONFIG, 3141bb76ff1Sjsg SMU_TABLE_ACTIVITY_MONITOR_COEFF, 3151bb76ff1Sjsg SMU_TABLE_OVERDRIVE, 3161bb76ff1Sjsg SMU_TABLE_I2C_COMMANDS, 3171bb76ff1Sjsg SMU_TABLE_PACE, 3181bb76ff1Sjsg SMU_TABLE_ECCINFO, 3191bb76ff1Sjsg SMU_TABLE_COMBO_PPTABLE, 3201bb76ff1Sjsg SMU_TABLE_COUNT, 3211bb76ff1Sjsg }; 3221bb76ff1Sjsg 323*f005ef32Sjsg struct smu_table_context { 3241bb76ff1Sjsg void *power_play_table; 3251bb76ff1Sjsg uint32_t power_play_table_size; 3261bb76ff1Sjsg void *hardcode_pptable; 3271bb76ff1Sjsg unsigned long metrics_time; 3281bb76ff1Sjsg void *metrics_table; 3291bb76ff1Sjsg void *clocks_table; 3301bb76ff1Sjsg void *watermarks_table; 3311bb76ff1Sjsg 3321bb76ff1Sjsg void *max_sustainable_clocks; 3331bb76ff1Sjsg struct smu_bios_boot_up_values boot_values; 3341bb76ff1Sjsg void *driver_pptable; 3351bb76ff1Sjsg void *combo_pptable; 3361bb76ff1Sjsg void *ecc_table; 3371bb76ff1Sjsg void *driver_smu_config_table; 3381bb76ff1Sjsg struct smu_table tables[SMU_TABLE_COUNT]; 3391bb76ff1Sjsg /* 3401bb76ff1Sjsg * The driver table is just a staging buffer for 3411bb76ff1Sjsg * uploading/downloading content from the SMU. 3421bb76ff1Sjsg * 3431bb76ff1Sjsg * And the table_id for SMU_MSG_TransferTableSmu2Dram/ 3441bb76ff1Sjsg * SMU_MSG_TransferTableDram2Smu instructs SMU 3451bb76ff1Sjsg * which content driver is interested. 3461bb76ff1Sjsg */ 3471bb76ff1Sjsg struct smu_table driver_table; 3481bb76ff1Sjsg struct smu_table memory_pool; 3491bb76ff1Sjsg struct smu_table dummy_read_1_table; 3501bb76ff1Sjsg uint8_t thermal_controller_type; 3511bb76ff1Sjsg 3521bb76ff1Sjsg void *overdrive_table; 3531bb76ff1Sjsg void *boot_overdrive_table; 3541bb76ff1Sjsg void *user_overdrive_table; 3551bb76ff1Sjsg 3561bb76ff1Sjsg uint32_t gpu_metrics_table_size; 3571bb76ff1Sjsg void *gpu_metrics_table; 3581bb76ff1Sjsg }; 3591bb76ff1Sjsg 3601bb76ff1Sjsg struct smu_dpm_context { 3611bb76ff1Sjsg uint32_t dpm_context_size; 3621bb76ff1Sjsg void *dpm_context; 3631bb76ff1Sjsg void *golden_dpm_context; 3641bb76ff1Sjsg enum amd_dpm_forced_level dpm_level; 3651bb76ff1Sjsg enum amd_dpm_forced_level saved_dpm_level; 3661bb76ff1Sjsg enum amd_dpm_forced_level requested_dpm_level; 3671bb76ff1Sjsg struct smu_power_state *dpm_request_power_state; 3681bb76ff1Sjsg struct smu_power_state *dpm_current_power_state; 3691bb76ff1Sjsg struct mclock_latency_table *mclk_latency_table; 3701bb76ff1Sjsg }; 3711bb76ff1Sjsg 3721bb76ff1Sjsg struct smu_power_gate { 3731bb76ff1Sjsg bool uvd_gated; 3741bb76ff1Sjsg bool vce_gated; 3751bb76ff1Sjsg atomic_t vcn_gated; 3761bb76ff1Sjsg atomic_t jpeg_gated; 3771bb76ff1Sjsg }; 3781bb76ff1Sjsg 3791bb76ff1Sjsg struct smu_power_context { 3801bb76ff1Sjsg void *power_context; 3811bb76ff1Sjsg uint32_t power_context_size; 3821bb76ff1Sjsg struct smu_power_gate power_gate; 3831bb76ff1Sjsg }; 3841bb76ff1Sjsg 3851bb76ff1Sjsg #define SMU_FEATURE_MAX (64) 386*f005ef32Sjsg struct smu_feature { 3871bb76ff1Sjsg uint32_t feature_num; 3881bb76ff1Sjsg DECLARE_BITMAP(supported, SMU_FEATURE_MAX); 3891bb76ff1Sjsg DECLARE_BITMAP(allowed, SMU_FEATURE_MAX); 3901bb76ff1Sjsg }; 3911bb76ff1Sjsg 3921bb76ff1Sjsg struct smu_clocks { 3931bb76ff1Sjsg uint32_t engine_clock; 3941bb76ff1Sjsg uint32_t memory_clock; 3951bb76ff1Sjsg uint32_t bus_bandwidth; 3961bb76ff1Sjsg uint32_t engine_clock_in_sr; 3971bb76ff1Sjsg uint32_t dcef_clock; 3981bb76ff1Sjsg uint32_t dcef_clock_in_sr; 3991bb76ff1Sjsg }; 4001bb76ff1Sjsg 4011bb76ff1Sjsg #define MAX_REGULAR_DPM_NUM 16 4021bb76ff1Sjsg struct mclk_latency_entries { 4031bb76ff1Sjsg uint32_t frequency; 4041bb76ff1Sjsg uint32_t latency; 4051bb76ff1Sjsg }; 4061bb76ff1Sjsg struct mclock_latency_table { 4071bb76ff1Sjsg uint32_t count; 4081bb76ff1Sjsg struct mclk_latency_entries entries[MAX_REGULAR_DPM_NUM]; 4091bb76ff1Sjsg }; 4101bb76ff1Sjsg 411*f005ef32Sjsg enum smu_reset_mode { 4121bb76ff1Sjsg SMU_RESET_MODE_0, 4131bb76ff1Sjsg SMU_RESET_MODE_1, 4141bb76ff1Sjsg SMU_RESET_MODE_2, 4151bb76ff1Sjsg }; 4161bb76ff1Sjsg 417*f005ef32Sjsg enum smu_baco_state { 4181bb76ff1Sjsg SMU_BACO_STATE_ENTER = 0, 4191bb76ff1Sjsg SMU_BACO_STATE_EXIT, 4201bb76ff1Sjsg }; 4211bb76ff1Sjsg 422*f005ef32Sjsg struct smu_baco_context { 4231bb76ff1Sjsg uint32_t state; 4241bb76ff1Sjsg bool platform_support; 4251bb76ff1Sjsg bool maco_support; 4261bb76ff1Sjsg }; 4271bb76ff1Sjsg 4281bb76ff1Sjsg struct smu_freq_info { 4291bb76ff1Sjsg uint32_t min; 4301bb76ff1Sjsg uint32_t max; 4311bb76ff1Sjsg uint32_t freq_level; 4321bb76ff1Sjsg }; 4331bb76ff1Sjsg 4341bb76ff1Sjsg struct pstates_clk_freq { 4351bb76ff1Sjsg uint32_t min; 4361bb76ff1Sjsg uint32_t standard; 4371bb76ff1Sjsg uint32_t peak; 4381bb76ff1Sjsg struct smu_freq_info custom; 4391bb76ff1Sjsg struct smu_freq_info curr; 4401bb76ff1Sjsg }; 4411bb76ff1Sjsg 4421bb76ff1Sjsg struct smu_umd_pstate_table { 4431bb76ff1Sjsg struct pstates_clk_freq gfxclk_pstate; 4441bb76ff1Sjsg struct pstates_clk_freq socclk_pstate; 4451bb76ff1Sjsg struct pstates_clk_freq uclk_pstate; 4461bb76ff1Sjsg struct pstates_clk_freq vclk_pstate; 4471bb76ff1Sjsg struct pstates_clk_freq dclk_pstate; 4481bb76ff1Sjsg struct pstates_clk_freq fclk_pstate; 4491bb76ff1Sjsg }; 4501bb76ff1Sjsg 4511bb76ff1Sjsg struct cmn2asic_msg_mapping { 4521bb76ff1Sjsg int valid_mapping; 4531bb76ff1Sjsg int map_to; 4541bb76ff1Sjsg int valid_in_vf; 4551bb76ff1Sjsg }; 4561bb76ff1Sjsg 4571bb76ff1Sjsg struct cmn2asic_mapping { 4581bb76ff1Sjsg int valid_mapping; 4591bb76ff1Sjsg int map_to; 4601bb76ff1Sjsg }; 4611bb76ff1Sjsg 4621bb76ff1Sjsg struct stb_context { 4631bb76ff1Sjsg uint32_t stb_buf_size; 4641bb76ff1Sjsg bool enabled; 4651bb76ff1Sjsg spinlock_t lock; 4661bb76ff1Sjsg }; 4671bb76ff1Sjsg 4681bb76ff1Sjsg #define WORKLOAD_POLICY_MAX 7 4691bb76ff1Sjsg 470*f005ef32Sjsg struct smu_context { 4711bb76ff1Sjsg struct amdgpu_device *adev; 4721bb76ff1Sjsg struct amdgpu_irq_src irq_source; 4731bb76ff1Sjsg 4741bb76ff1Sjsg const struct pptable_funcs *ppt_funcs; 4751bb76ff1Sjsg const struct cmn2asic_msg_mapping *message_map; 4761bb76ff1Sjsg const struct cmn2asic_mapping *clock_map; 4771bb76ff1Sjsg const struct cmn2asic_mapping *feature_map; 4781bb76ff1Sjsg const struct cmn2asic_mapping *table_map; 4791bb76ff1Sjsg const struct cmn2asic_mapping *pwr_src_map; 4801bb76ff1Sjsg const struct cmn2asic_mapping *workload_map; 4811bb76ff1Sjsg struct rwlock message_lock; 4821bb76ff1Sjsg uint64_t pool_size; 4831bb76ff1Sjsg 4841bb76ff1Sjsg struct smu_table_context smu_table; 4851bb76ff1Sjsg struct smu_dpm_context smu_dpm; 4861bb76ff1Sjsg struct smu_power_context smu_power; 4871bb76ff1Sjsg struct smu_feature smu_feature; 4881bb76ff1Sjsg struct amd_pp_display_configuration *display_config; 4891bb76ff1Sjsg struct smu_baco_context smu_baco; 4901bb76ff1Sjsg struct smu_temperature_range thermal_range; 4911bb76ff1Sjsg void *od_settings; 4921bb76ff1Sjsg 4931bb76ff1Sjsg struct smu_umd_pstate_table pstate_table; 4941bb76ff1Sjsg uint32_t pstate_sclk; 4951bb76ff1Sjsg uint32_t pstate_mclk; 4961bb76ff1Sjsg 4971bb76ff1Sjsg bool od_enabled; 4981bb76ff1Sjsg uint32_t current_power_limit; 4991bb76ff1Sjsg uint32_t default_power_limit; 5001bb76ff1Sjsg uint32_t max_power_limit; 5011bb76ff1Sjsg 5021bb76ff1Sjsg /* soft pptable */ 5031bb76ff1Sjsg uint32_t ppt_offset_bytes; 5041bb76ff1Sjsg uint32_t ppt_size_bytes; 5051bb76ff1Sjsg uint8_t *ppt_start_addr; 5061bb76ff1Sjsg 5071bb76ff1Sjsg bool support_power_containment; 5081bb76ff1Sjsg bool disable_watermark; 5091bb76ff1Sjsg 5101bb76ff1Sjsg #define WATERMARKS_EXIST (1 << 0) 5111bb76ff1Sjsg #define WATERMARKS_LOADED (1 << 1) 5121bb76ff1Sjsg uint32_t watermarks_bitmap; 5131bb76ff1Sjsg uint32_t hard_min_uclk_req_from_dal; 5141bb76ff1Sjsg bool disable_uclk_switch; 5151bb76ff1Sjsg 5161bb76ff1Sjsg uint32_t workload_mask; 5171bb76ff1Sjsg uint32_t workload_prority[WORKLOAD_POLICY_MAX]; 5181bb76ff1Sjsg uint32_t workload_setting[WORKLOAD_POLICY_MAX]; 5191bb76ff1Sjsg uint32_t power_profile_mode; 5201bb76ff1Sjsg uint32_t default_power_profile_mode; 5211bb76ff1Sjsg bool pm_enabled; 5221bb76ff1Sjsg bool is_apu; 5231bb76ff1Sjsg 5241bb76ff1Sjsg uint32_t smc_driver_if_version; 5251bb76ff1Sjsg uint32_t smc_fw_if_version; 5261bb76ff1Sjsg uint32_t smc_fw_version; 5271bb76ff1Sjsg 5281bb76ff1Sjsg bool uploading_custom_pp_table; 5291bb76ff1Sjsg bool dc_controlled_by_gpio; 5301bb76ff1Sjsg 5311bb76ff1Sjsg struct work_struct throttling_logging_work; 5321bb76ff1Sjsg atomic64_t throttle_int_counter; 5331bb76ff1Sjsg struct work_struct interrupt_work; 5341bb76ff1Sjsg 5351bb76ff1Sjsg unsigned fan_max_rpm; 5361bb76ff1Sjsg unsigned manual_fan_speed_pwm; 5371bb76ff1Sjsg 5381bb76ff1Sjsg uint32_t gfx_default_hard_min_freq; 5391bb76ff1Sjsg uint32_t gfx_default_soft_max_freq; 5401bb76ff1Sjsg uint32_t gfx_actual_hard_min_freq; 5411bb76ff1Sjsg uint32_t gfx_actual_soft_max_freq; 5421bb76ff1Sjsg 5431bb76ff1Sjsg /* APU only */ 5441bb76ff1Sjsg uint32_t cpu_default_soft_min_freq; 5451bb76ff1Sjsg uint32_t cpu_default_soft_max_freq; 5461bb76ff1Sjsg uint32_t cpu_actual_soft_min_freq; 5471bb76ff1Sjsg uint32_t cpu_actual_soft_max_freq; 5481bb76ff1Sjsg uint32_t cpu_core_id_select; 5491bb76ff1Sjsg uint16_t cpu_core_num; 5501bb76ff1Sjsg 5511bb76ff1Sjsg struct smu_user_dpm_profile user_dpm_profile; 5521bb76ff1Sjsg 5531bb76ff1Sjsg struct stb_context stb_context; 5541bb76ff1Sjsg 5551bb76ff1Sjsg struct firmware pptable_firmware; 5561bb76ff1Sjsg 5571bb76ff1Sjsg u32 param_reg; 5581bb76ff1Sjsg u32 msg_reg; 5591bb76ff1Sjsg u32 resp_reg; 560d8a7452eSjsg 561d8a7452eSjsg u32 debug_param_reg; 562d8a7452eSjsg u32 debug_msg_reg; 563d8a7452eSjsg u32 debug_resp_reg; 564788b966fSjsg 565788b966fSjsg struct delayed_work swctf_delayed_work; 5661bb76ff1Sjsg }; 5671bb76ff1Sjsg 5681bb76ff1Sjsg struct i2c_adapter; 5691bb76ff1Sjsg 5701bb76ff1Sjsg /** 5711bb76ff1Sjsg * struct pptable_funcs - Callbacks used to interact with the SMU. 5721bb76ff1Sjsg */ 5731bb76ff1Sjsg struct pptable_funcs { 5741bb76ff1Sjsg /** 5751bb76ff1Sjsg * @run_btc: Calibrate voltage/frequency curve to fit the system's 5761bb76ff1Sjsg * power delivery and voltage margins. Required for adaptive 5771bb76ff1Sjsg * voltage frequency scaling (AVFS). 5781bb76ff1Sjsg */ 5791bb76ff1Sjsg int (*run_btc)(struct smu_context *smu); 5801bb76ff1Sjsg 5811bb76ff1Sjsg /** 5821bb76ff1Sjsg * @get_allowed_feature_mask: Get allowed feature mask. 5831bb76ff1Sjsg * &feature_mask: Array to store feature mask. 5841bb76ff1Sjsg * &num: Elements in &feature_mask. 5851bb76ff1Sjsg */ 5861bb76ff1Sjsg int (*get_allowed_feature_mask)(struct smu_context *smu, uint32_t *feature_mask, uint32_t num); 5871bb76ff1Sjsg 5881bb76ff1Sjsg /** 5891bb76ff1Sjsg * @get_current_power_state: Get the current power state. 5901bb76ff1Sjsg * 5911bb76ff1Sjsg * Return: Current power state on success, negative errno on failure. 5921bb76ff1Sjsg */ 5931bb76ff1Sjsg enum amd_pm_state_type (*get_current_power_state)(struct smu_context *smu); 5941bb76ff1Sjsg 5951bb76ff1Sjsg /** 5961bb76ff1Sjsg * @set_default_dpm_table: Retrieve the default overdrive settings from 5971bb76ff1Sjsg * the SMU. 5981bb76ff1Sjsg */ 5991bb76ff1Sjsg int (*set_default_dpm_table)(struct smu_context *smu); 6001bb76ff1Sjsg 6011bb76ff1Sjsg int (*set_power_state)(struct smu_context *smu); 6021bb76ff1Sjsg 6031bb76ff1Sjsg /** 6041bb76ff1Sjsg * @populate_umd_state_clk: Populate the UMD power state table with 6051bb76ff1Sjsg * defaults. 6061bb76ff1Sjsg */ 6071bb76ff1Sjsg int (*populate_umd_state_clk)(struct smu_context *smu); 6081bb76ff1Sjsg 6091bb76ff1Sjsg /** 6101bb76ff1Sjsg * @print_clk_levels: Print DPM clock levels for a clock domain 6111bb76ff1Sjsg * to buffer. Star current level. 6121bb76ff1Sjsg * 6131bb76ff1Sjsg * Used for sysfs interfaces. 6141bb76ff1Sjsg * Return: Number of characters written to the buffer 6151bb76ff1Sjsg */ 6161bb76ff1Sjsg int (*print_clk_levels)(struct smu_context *smu, enum smu_clk_type clk_type, char *buf); 6171bb76ff1Sjsg 6181bb76ff1Sjsg /** 6191bb76ff1Sjsg * @emit_clk_levels: Print DPM clock levels for a clock domain 6201bb76ff1Sjsg * to buffer using sysfs_emit_at. Star current level. 6211bb76ff1Sjsg * 6221bb76ff1Sjsg * Used for sysfs interfaces. 6231bb76ff1Sjsg * &buf: sysfs buffer 6241bb76ff1Sjsg * &offset: offset within buffer to start printing, which is updated by the 6251bb76ff1Sjsg * function. 6261bb76ff1Sjsg * 6271bb76ff1Sjsg * Return: 0 on Success or Negative to indicate an error occurred. 6281bb76ff1Sjsg */ 6291bb76ff1Sjsg int (*emit_clk_levels)(struct smu_context *smu, enum smu_clk_type clk_type, char *buf, int *offset); 6301bb76ff1Sjsg 6311bb76ff1Sjsg /** 6321bb76ff1Sjsg * @force_clk_levels: Set a range of allowed DPM levels for a clock 6331bb76ff1Sjsg * domain. 6341bb76ff1Sjsg * &clk_type: Clock domain. 6351bb76ff1Sjsg * &mask: Range of allowed DPM levels. 6361bb76ff1Sjsg */ 6371bb76ff1Sjsg int (*force_clk_levels)(struct smu_context *smu, enum smu_clk_type clk_type, uint32_t mask); 6381bb76ff1Sjsg 6391bb76ff1Sjsg /** 6401bb76ff1Sjsg * @od_edit_dpm_table: Edit the custom overdrive DPM table. 6411bb76ff1Sjsg * &type: Type of edit. 6421bb76ff1Sjsg * &input: Edit parameters. 6431bb76ff1Sjsg * &size: Size of &input. 6441bb76ff1Sjsg */ 6451bb76ff1Sjsg int (*od_edit_dpm_table)(struct smu_context *smu, 6461bb76ff1Sjsg enum PP_OD_DPM_TABLE_COMMAND type, 6471bb76ff1Sjsg long *input, uint32_t size); 6481bb76ff1Sjsg 6491bb76ff1Sjsg /** 6501bb76ff1Sjsg * @restore_user_od_settings: Restore the user customized 6511bb76ff1Sjsg * OD settings on S3/S4/Runpm resume. 6521bb76ff1Sjsg */ 6531bb76ff1Sjsg int (*restore_user_od_settings)(struct smu_context *smu); 6541bb76ff1Sjsg 6551bb76ff1Sjsg /** 6561bb76ff1Sjsg * @get_clock_by_type_with_latency: Get the speed and latency of a clock 6571bb76ff1Sjsg * domain. 6581bb76ff1Sjsg */ 6591bb76ff1Sjsg int (*get_clock_by_type_with_latency)(struct smu_context *smu, 6601bb76ff1Sjsg enum smu_clk_type clk_type, 6611bb76ff1Sjsg struct 6621bb76ff1Sjsg pp_clock_levels_with_latency 6631bb76ff1Sjsg *clocks); 6641bb76ff1Sjsg /** 6651bb76ff1Sjsg * @get_clock_by_type_with_voltage: Get the speed and voltage of a clock 6661bb76ff1Sjsg * domain. 6671bb76ff1Sjsg */ 6681bb76ff1Sjsg int (*get_clock_by_type_with_voltage)(struct smu_context *smu, 6691bb76ff1Sjsg enum amd_pp_clock_type type, 6701bb76ff1Sjsg struct 6711bb76ff1Sjsg pp_clock_levels_with_voltage 6721bb76ff1Sjsg *clocks); 6731bb76ff1Sjsg 6741bb76ff1Sjsg /** 6751bb76ff1Sjsg * @get_power_profile_mode: Print all power profile modes to 6761bb76ff1Sjsg * buffer. Star current mode. 6771bb76ff1Sjsg */ 6781bb76ff1Sjsg int (*get_power_profile_mode)(struct smu_context *smu, char *buf); 6791bb76ff1Sjsg 6801bb76ff1Sjsg /** 6811bb76ff1Sjsg * @set_power_profile_mode: Set a power profile mode. Also used to 6821bb76ff1Sjsg * create/set custom power profile modes. 6831bb76ff1Sjsg * &input: Power profile mode parameters. 6841bb76ff1Sjsg * &size: Size of &input. 6851bb76ff1Sjsg */ 6861bb76ff1Sjsg int (*set_power_profile_mode)(struct smu_context *smu, long *input, uint32_t size); 6871bb76ff1Sjsg 6881bb76ff1Sjsg /** 6891bb76ff1Sjsg * @dpm_set_vcn_enable: Enable/disable VCN engine dynamic power 6901bb76ff1Sjsg * management. 6911bb76ff1Sjsg */ 6921bb76ff1Sjsg int (*dpm_set_vcn_enable)(struct smu_context *smu, bool enable); 6931bb76ff1Sjsg 6941bb76ff1Sjsg /** 6951bb76ff1Sjsg * @dpm_set_jpeg_enable: Enable/disable JPEG engine dynamic power 6961bb76ff1Sjsg * management. 6971bb76ff1Sjsg */ 6981bb76ff1Sjsg int (*dpm_set_jpeg_enable)(struct smu_context *smu, bool enable); 6991bb76ff1Sjsg 7001bb76ff1Sjsg /** 7011bb76ff1Sjsg * @set_gfx_power_up_by_imu: Enable GFX engine with IMU 7021bb76ff1Sjsg */ 7031bb76ff1Sjsg int (*set_gfx_power_up_by_imu)(struct smu_context *smu); 7041bb76ff1Sjsg 7051bb76ff1Sjsg /** 7061bb76ff1Sjsg * @read_sensor: Read data from a sensor. 7071bb76ff1Sjsg * &sensor: Sensor to read data from. 7081bb76ff1Sjsg * &data: Sensor reading. 7091bb76ff1Sjsg * &size: Size of &data. 7101bb76ff1Sjsg */ 7111bb76ff1Sjsg int (*read_sensor)(struct smu_context *smu, enum amd_pp_sensors sensor, 7121bb76ff1Sjsg void *data, uint32_t *size); 7131bb76ff1Sjsg 7141bb76ff1Sjsg /** 715*f005ef32Sjsg * @get_apu_thermal_limit: get apu core limit from smu 716*f005ef32Sjsg * &limit: current limit temperature in millidegrees Celsius 717*f005ef32Sjsg */ 718*f005ef32Sjsg int (*get_apu_thermal_limit)(struct smu_context *smu, uint32_t *limit); 719*f005ef32Sjsg 720*f005ef32Sjsg /** 721*f005ef32Sjsg * @set_apu_thermal_limit: update all controllers with new limit 722*f005ef32Sjsg * &limit: limit temperature to be setted, in millidegrees Celsius 723*f005ef32Sjsg */ 724*f005ef32Sjsg int (*set_apu_thermal_limit)(struct smu_context *smu, uint32_t limit); 725*f005ef32Sjsg 726*f005ef32Sjsg /** 7271bb76ff1Sjsg * @pre_display_config_changed: Prepare GPU for a display configuration 7281bb76ff1Sjsg * change. 7291bb76ff1Sjsg * 7301bb76ff1Sjsg * Disable display tracking and pin memory clock speed to maximum. Used 7311bb76ff1Sjsg * in display component synchronization. 7321bb76ff1Sjsg */ 7331bb76ff1Sjsg int (*pre_display_config_changed)(struct smu_context *smu); 7341bb76ff1Sjsg 7351bb76ff1Sjsg /** 7361bb76ff1Sjsg * @display_config_changed: Notify the SMU of the current display 7371bb76ff1Sjsg * configuration. 7381bb76ff1Sjsg * 7391bb76ff1Sjsg * Allows SMU to properly track blanking periods for memory clock 7401bb76ff1Sjsg * adjustment. Used in display component synchronization. 7411bb76ff1Sjsg */ 7421bb76ff1Sjsg int (*display_config_changed)(struct smu_context *smu); 7431bb76ff1Sjsg 7441bb76ff1Sjsg int (*apply_clocks_adjust_rules)(struct smu_context *smu); 7451bb76ff1Sjsg 7461bb76ff1Sjsg /** 7471bb76ff1Sjsg * @notify_smc_display_config: Applies display requirements to the 7481bb76ff1Sjsg * current power state. 7491bb76ff1Sjsg * 7501bb76ff1Sjsg * Optimize deep sleep DCEFclk and mclk for the current display 7511bb76ff1Sjsg * configuration. Used in display component synchronization. 7521bb76ff1Sjsg */ 7531bb76ff1Sjsg int (*notify_smc_display_config)(struct smu_context *smu); 7541bb76ff1Sjsg 7551bb76ff1Sjsg /** 7561bb76ff1Sjsg * @is_dpm_running: Check if DPM is running. 7571bb76ff1Sjsg * 7581bb76ff1Sjsg * Return: True if DPM is running, false otherwise. 7591bb76ff1Sjsg */ 7601bb76ff1Sjsg bool (*is_dpm_running)(struct smu_context *smu); 7611bb76ff1Sjsg 7621bb76ff1Sjsg /** 7631bb76ff1Sjsg * @get_fan_speed_pwm: Get the current fan speed in PWM. 7641bb76ff1Sjsg */ 7651bb76ff1Sjsg int (*get_fan_speed_pwm)(struct smu_context *smu, uint32_t *speed); 7661bb76ff1Sjsg 7671bb76ff1Sjsg /** 7681bb76ff1Sjsg * @get_fan_speed_rpm: Get the current fan speed in rpm. 7691bb76ff1Sjsg */ 7701bb76ff1Sjsg int (*get_fan_speed_rpm)(struct smu_context *smu, uint32_t *speed); 7711bb76ff1Sjsg 7721bb76ff1Sjsg /** 7731bb76ff1Sjsg * @set_watermarks_table: Configure and upload the watermarks tables to 7741bb76ff1Sjsg * the SMU. 7751bb76ff1Sjsg */ 7761bb76ff1Sjsg int (*set_watermarks_table)(struct smu_context *smu, 7771bb76ff1Sjsg struct pp_smu_wm_range_sets *clock_ranges); 7781bb76ff1Sjsg 7791bb76ff1Sjsg /** 7801bb76ff1Sjsg * @get_thermal_temperature_range: Get safe thermal limits in Celcius. 7811bb76ff1Sjsg */ 7821bb76ff1Sjsg int (*get_thermal_temperature_range)(struct smu_context *smu, struct smu_temperature_range *range); 7831bb76ff1Sjsg 7841bb76ff1Sjsg /** 7851bb76ff1Sjsg * @get_uclk_dpm_states: Get memory clock DPM levels in kHz. 7861bb76ff1Sjsg * &clocks_in_khz: Array of DPM levels. 7871bb76ff1Sjsg * &num_states: Elements in &clocks_in_khz. 7881bb76ff1Sjsg */ 7891bb76ff1Sjsg int (*get_uclk_dpm_states)(struct smu_context *smu, uint32_t *clocks_in_khz, uint32_t *num_states); 7901bb76ff1Sjsg 7911bb76ff1Sjsg /** 7921bb76ff1Sjsg * @set_default_od_settings: Set the overdrive tables to defaults. 7931bb76ff1Sjsg */ 7941bb76ff1Sjsg int (*set_default_od_settings)(struct smu_context *smu); 7951bb76ff1Sjsg 7961bb76ff1Sjsg /** 7971bb76ff1Sjsg * @set_performance_level: Set a performance level. 7981bb76ff1Sjsg */ 7991bb76ff1Sjsg int (*set_performance_level)(struct smu_context *smu, enum amd_dpm_forced_level level); 8001bb76ff1Sjsg 8011bb76ff1Sjsg /** 8021bb76ff1Sjsg * @display_disable_memory_clock_switch: Enable/disable dynamic memory 8031bb76ff1Sjsg * clock switching. 8041bb76ff1Sjsg * 8051bb76ff1Sjsg * Disabling this feature forces memory clock speed to maximum. 8061bb76ff1Sjsg * Enabling sets the minimum memory clock capable of driving the 8071bb76ff1Sjsg * current display configuration. 8081bb76ff1Sjsg */ 8091bb76ff1Sjsg int (*display_disable_memory_clock_switch)(struct smu_context *smu, bool disable_memory_clock_switch); 8101bb76ff1Sjsg 8111bb76ff1Sjsg /** 8121bb76ff1Sjsg * @dump_pptable: Print the power play table to the system log. 8131bb76ff1Sjsg */ 8141bb76ff1Sjsg void (*dump_pptable)(struct smu_context *smu); 8151bb76ff1Sjsg 8161bb76ff1Sjsg /** 8171bb76ff1Sjsg * @get_power_limit: Get the device's power limits. 8181bb76ff1Sjsg */ 8191bb76ff1Sjsg int (*get_power_limit)(struct smu_context *smu, 8201bb76ff1Sjsg uint32_t *current_power_limit, 8211bb76ff1Sjsg uint32_t *default_power_limit, 8221bb76ff1Sjsg uint32_t *max_power_limit); 8231bb76ff1Sjsg 8241bb76ff1Sjsg /** 8251bb76ff1Sjsg * @get_ppt_limit: Get the device's ppt limits. 8261bb76ff1Sjsg */ 8271bb76ff1Sjsg int (*get_ppt_limit)(struct smu_context *smu, uint32_t *ppt_limit, 8281bb76ff1Sjsg enum smu_ppt_limit_type limit_type, enum smu_ppt_limit_level limit_level); 8291bb76ff1Sjsg 8301bb76ff1Sjsg /** 8311bb76ff1Sjsg * @set_df_cstate: Set data fabric cstate. 8321bb76ff1Sjsg */ 8331bb76ff1Sjsg int (*set_df_cstate)(struct smu_context *smu, enum pp_df_cstate state); 8341bb76ff1Sjsg 8351bb76ff1Sjsg /** 8361bb76ff1Sjsg * @allow_xgmi_power_down: Enable/disable external global memory 8371bb76ff1Sjsg * interconnect power down. 8381bb76ff1Sjsg */ 8391bb76ff1Sjsg int (*allow_xgmi_power_down)(struct smu_context *smu, bool en); 8401bb76ff1Sjsg 8411bb76ff1Sjsg /** 8421bb76ff1Sjsg * @update_pcie_parameters: Update and upload the system's PCIe 8431bb76ff1Sjsg * capabilites to the SMU. 8441bb76ff1Sjsg * &pcie_gen_cap: Maximum allowed PCIe generation. 8451bb76ff1Sjsg * &pcie_width_cap: Maximum allowed PCIe width. 8461bb76ff1Sjsg */ 8471493bc23Sjsg int (*update_pcie_parameters)(struct smu_context *smu, uint8_t pcie_gen_cap, uint8_t pcie_width_cap); 8481bb76ff1Sjsg 8491bb76ff1Sjsg /** 8501bb76ff1Sjsg * @i2c_init: Initialize i2c. 8511bb76ff1Sjsg * 8521bb76ff1Sjsg * The i2c bus is used internally by the SMU voltage regulators and 8531bb76ff1Sjsg * other devices. The i2c's EEPROM also stores bad page tables on boards 8541bb76ff1Sjsg * with ECC. 8551bb76ff1Sjsg */ 8561bb76ff1Sjsg int (*i2c_init)(struct smu_context *smu); 8571bb76ff1Sjsg 8581bb76ff1Sjsg /** 8591bb76ff1Sjsg * @i2c_fini: Tear down i2c. 8601bb76ff1Sjsg */ 8611bb76ff1Sjsg void (*i2c_fini)(struct smu_context *smu); 8621bb76ff1Sjsg 8631bb76ff1Sjsg /** 8641bb76ff1Sjsg * @get_unique_id: Get the GPU's unique id. Used for asset tracking. 8651bb76ff1Sjsg */ 8661bb76ff1Sjsg void (*get_unique_id)(struct smu_context *smu); 8671bb76ff1Sjsg 8681bb76ff1Sjsg /** 8691bb76ff1Sjsg * @get_dpm_clock_table: Get a copy of the DPM clock table. 8701bb76ff1Sjsg * 8711bb76ff1Sjsg * Used by display component in bandwidth and watermark calculations. 8721bb76ff1Sjsg */ 8731bb76ff1Sjsg int (*get_dpm_clock_table)(struct smu_context *smu, struct dpm_clocks *clock_table); 8741bb76ff1Sjsg 8751bb76ff1Sjsg /** 8761bb76ff1Sjsg * @init_microcode: Request the SMU's firmware from the kernel. 8771bb76ff1Sjsg */ 8781bb76ff1Sjsg int (*init_microcode)(struct smu_context *smu); 8791bb76ff1Sjsg 8801bb76ff1Sjsg /** 8811bb76ff1Sjsg * @load_microcode: Load firmware onto the SMU. 8821bb76ff1Sjsg */ 8831bb76ff1Sjsg int (*load_microcode)(struct smu_context *smu); 8841bb76ff1Sjsg 8851bb76ff1Sjsg /** 8861bb76ff1Sjsg * @fini_microcode: Release the SMU's firmware. 8871bb76ff1Sjsg */ 8881bb76ff1Sjsg void (*fini_microcode)(struct smu_context *smu); 8891bb76ff1Sjsg 8901bb76ff1Sjsg /** 8911bb76ff1Sjsg * @init_smc_tables: Initialize the SMU tables. 8921bb76ff1Sjsg */ 8931bb76ff1Sjsg int (*init_smc_tables)(struct smu_context *smu); 8941bb76ff1Sjsg 8951bb76ff1Sjsg /** 8961bb76ff1Sjsg * @fini_smc_tables: Release the SMU tables. 8971bb76ff1Sjsg */ 8981bb76ff1Sjsg int (*fini_smc_tables)(struct smu_context *smu); 8991bb76ff1Sjsg 9001bb76ff1Sjsg /** 9011bb76ff1Sjsg * @init_power: Initialize the power gate table context. 9021bb76ff1Sjsg */ 9031bb76ff1Sjsg int (*init_power)(struct smu_context *smu); 9041bb76ff1Sjsg 9051bb76ff1Sjsg /** 9061bb76ff1Sjsg * @fini_power: Release the power gate table context. 9071bb76ff1Sjsg */ 9081bb76ff1Sjsg int (*fini_power)(struct smu_context *smu); 9091bb76ff1Sjsg 9101bb76ff1Sjsg /** 9111bb76ff1Sjsg * @check_fw_status: Check the SMU's firmware status. 9121bb76ff1Sjsg * 9131bb76ff1Sjsg * Return: Zero if check passes, negative errno on failure. 9141bb76ff1Sjsg */ 9151bb76ff1Sjsg int (*check_fw_status)(struct smu_context *smu); 9161bb76ff1Sjsg 9171bb76ff1Sjsg /** 9181bb76ff1Sjsg * @set_mp1_state: put SMU into a correct state for comming 9191bb76ff1Sjsg * resume from runpm or gpu reset. 9201bb76ff1Sjsg */ 9211bb76ff1Sjsg int (*set_mp1_state)(struct smu_context *smu, 9221bb76ff1Sjsg enum pp_mp1_state mp1_state); 9231bb76ff1Sjsg 9241bb76ff1Sjsg /** 9251bb76ff1Sjsg * @setup_pptable: Initialize the power play table and populate it with 9261bb76ff1Sjsg * default values. 9271bb76ff1Sjsg */ 9281bb76ff1Sjsg int (*setup_pptable)(struct smu_context *smu); 9291bb76ff1Sjsg 9301bb76ff1Sjsg /** 9311bb76ff1Sjsg * @get_vbios_bootup_values: Get default boot values from the VBIOS. 9321bb76ff1Sjsg */ 9331bb76ff1Sjsg int (*get_vbios_bootup_values)(struct smu_context *smu); 9341bb76ff1Sjsg 9351bb76ff1Sjsg /** 9361bb76ff1Sjsg * @check_fw_version: Print driver and SMU interface versions to the 9371bb76ff1Sjsg * system log. 9381bb76ff1Sjsg * 9391bb76ff1Sjsg * Interface mismatch is not a critical failure. 9401bb76ff1Sjsg */ 9411bb76ff1Sjsg int (*check_fw_version)(struct smu_context *smu); 9421bb76ff1Sjsg 9431bb76ff1Sjsg /** 9441bb76ff1Sjsg * @powergate_sdma: Power up/down system direct memory access. 9451bb76ff1Sjsg */ 9461bb76ff1Sjsg int (*powergate_sdma)(struct smu_context *smu, bool gate); 9471bb76ff1Sjsg 9481bb76ff1Sjsg /** 9491bb76ff1Sjsg * @set_gfx_cgpg: Enable/disable graphics engine course grain power 9501bb76ff1Sjsg * gating. 9511bb76ff1Sjsg */ 9521bb76ff1Sjsg int (*set_gfx_cgpg)(struct smu_context *smu, bool enable); 9531bb76ff1Sjsg 9541bb76ff1Sjsg /** 9551bb76ff1Sjsg * @write_pptable: Write the power play table to the SMU. 9561bb76ff1Sjsg */ 9571bb76ff1Sjsg int (*write_pptable)(struct smu_context *smu); 9581bb76ff1Sjsg 9591bb76ff1Sjsg /** 9601bb76ff1Sjsg * @set_driver_table_location: Send the location of the driver table to 9611bb76ff1Sjsg * the SMU. 9621bb76ff1Sjsg */ 9631bb76ff1Sjsg int (*set_driver_table_location)(struct smu_context *smu); 9641bb76ff1Sjsg 9651bb76ff1Sjsg /** 9661bb76ff1Sjsg * @set_tool_table_location: Send the location of the tool table to the 9671bb76ff1Sjsg * SMU. 9681bb76ff1Sjsg */ 9691bb76ff1Sjsg int (*set_tool_table_location)(struct smu_context *smu); 9701bb76ff1Sjsg 9711bb76ff1Sjsg /** 9721bb76ff1Sjsg * @notify_memory_pool_location: Send the location of the memory pool to 9731bb76ff1Sjsg * the SMU. 9741bb76ff1Sjsg */ 9751bb76ff1Sjsg int (*notify_memory_pool_location)(struct smu_context *smu); 9761bb76ff1Sjsg 9771bb76ff1Sjsg /** 9781bb76ff1Sjsg * @system_features_control: Enable/disable all SMU features. 9791bb76ff1Sjsg */ 9801bb76ff1Sjsg int (*system_features_control)(struct smu_context *smu, bool en); 9811bb76ff1Sjsg 9821bb76ff1Sjsg /** 9831bb76ff1Sjsg * @send_smc_msg_with_param: Send a message with a parameter to the SMU. 9841bb76ff1Sjsg * &msg: Type of message. 9851bb76ff1Sjsg * ¶m: Message parameter. 9861bb76ff1Sjsg * &read_arg: SMU response (optional). 9871bb76ff1Sjsg */ 9881bb76ff1Sjsg int (*send_smc_msg_with_param)(struct smu_context *smu, 9891bb76ff1Sjsg enum smu_message_type msg, uint32_t param, uint32_t *read_arg); 9901bb76ff1Sjsg 9911bb76ff1Sjsg /** 9921bb76ff1Sjsg * @send_smc_msg: Send a message to the SMU. 9931bb76ff1Sjsg * &msg: Type of message. 9941bb76ff1Sjsg * &read_arg: SMU response (optional). 9951bb76ff1Sjsg */ 9961bb76ff1Sjsg int (*send_smc_msg)(struct smu_context *smu, 9971bb76ff1Sjsg enum smu_message_type msg, 9981bb76ff1Sjsg uint32_t *read_arg); 9991bb76ff1Sjsg 10001bb76ff1Sjsg /** 10011bb76ff1Sjsg * @init_display_count: Notify the SMU of the number of display 10021bb76ff1Sjsg * components in current display configuration. 10031bb76ff1Sjsg */ 10041bb76ff1Sjsg int (*init_display_count)(struct smu_context *smu, uint32_t count); 10051bb76ff1Sjsg 10061bb76ff1Sjsg /** 10071bb76ff1Sjsg * @set_allowed_mask: Notify the SMU of the features currently allowed 10081bb76ff1Sjsg * by the driver. 10091bb76ff1Sjsg */ 10101bb76ff1Sjsg int (*set_allowed_mask)(struct smu_context *smu); 10111bb76ff1Sjsg 10121bb76ff1Sjsg /** 10131bb76ff1Sjsg * @get_enabled_mask: Get a mask of features that are currently enabled 10141bb76ff1Sjsg * on the SMU. 10151bb76ff1Sjsg * &feature_mask: Enabled feature mask. 10161bb76ff1Sjsg */ 10171bb76ff1Sjsg int (*get_enabled_mask)(struct smu_context *smu, uint64_t *feature_mask); 10181bb76ff1Sjsg 10191bb76ff1Sjsg /** 10201bb76ff1Sjsg * @feature_is_enabled: Test if a feature is enabled. 10211bb76ff1Sjsg * 10221bb76ff1Sjsg * Return: One if enabled, zero if disabled. 10231bb76ff1Sjsg */ 10241bb76ff1Sjsg int (*feature_is_enabled)(struct smu_context *smu, enum smu_feature_mask mask); 10251bb76ff1Sjsg 10261bb76ff1Sjsg /** 10271bb76ff1Sjsg * @disable_all_features_with_exception: Disable all features with 10281bb76ff1Sjsg * exception to those in &mask. 10291bb76ff1Sjsg */ 10301bb76ff1Sjsg int (*disable_all_features_with_exception)(struct smu_context *smu, 10311bb76ff1Sjsg enum smu_feature_mask mask); 10321bb76ff1Sjsg 10331bb76ff1Sjsg /** 1034*f005ef32Sjsg * @notify_display_change: General interface call to let SMU know about DC change 10351bb76ff1Sjsg */ 10361bb76ff1Sjsg int (*notify_display_change)(struct smu_context *smu); 10371bb76ff1Sjsg 10381bb76ff1Sjsg /** 10391bb76ff1Sjsg * @set_power_limit: Set power limit in watts. 10401bb76ff1Sjsg */ 10411bb76ff1Sjsg int (*set_power_limit)(struct smu_context *smu, 10421bb76ff1Sjsg enum smu_ppt_limit_type limit_type, 10431bb76ff1Sjsg uint32_t limit); 10441bb76ff1Sjsg 10451bb76ff1Sjsg /** 10461bb76ff1Sjsg * @init_max_sustainable_clocks: Populate max sustainable clock speed 10471bb76ff1Sjsg * table with values from the SMU. 10481bb76ff1Sjsg */ 10491bb76ff1Sjsg int (*init_max_sustainable_clocks)(struct smu_context *smu); 10501bb76ff1Sjsg 10511bb76ff1Sjsg /** 10521bb76ff1Sjsg * @enable_thermal_alert: Enable thermal alert interrupts. 10531bb76ff1Sjsg */ 10541bb76ff1Sjsg int (*enable_thermal_alert)(struct smu_context *smu); 10551bb76ff1Sjsg 10561bb76ff1Sjsg /** 10571bb76ff1Sjsg * @disable_thermal_alert: Disable thermal alert interrupts. 10581bb76ff1Sjsg */ 10591bb76ff1Sjsg int (*disable_thermal_alert)(struct smu_context *smu); 10601bb76ff1Sjsg 10611bb76ff1Sjsg /** 10621bb76ff1Sjsg * @set_min_dcef_deep_sleep: Set a minimum display fabric deep sleep 10631bb76ff1Sjsg * clock speed in MHz. 10641bb76ff1Sjsg */ 10651bb76ff1Sjsg int (*set_min_dcef_deep_sleep)(struct smu_context *smu, uint32_t clk); 10661bb76ff1Sjsg 10671bb76ff1Sjsg /** 10681bb76ff1Sjsg * @display_clock_voltage_request: Set a hard minimum frequency 10691bb76ff1Sjsg * for a clock domain. 10701bb76ff1Sjsg */ 10711bb76ff1Sjsg int (*display_clock_voltage_request)(struct smu_context *smu, struct 10721bb76ff1Sjsg pp_display_clock_request 10731bb76ff1Sjsg *clock_req); 10741bb76ff1Sjsg 10751bb76ff1Sjsg /** 10761bb76ff1Sjsg * @get_fan_control_mode: Get the current fan control mode. 10771bb76ff1Sjsg */ 10781bb76ff1Sjsg uint32_t (*get_fan_control_mode)(struct smu_context *smu); 10791bb76ff1Sjsg 10801bb76ff1Sjsg /** 10811bb76ff1Sjsg * @set_fan_control_mode: Set the fan control mode. 10821bb76ff1Sjsg */ 10831bb76ff1Sjsg int (*set_fan_control_mode)(struct smu_context *smu, uint32_t mode); 10841bb76ff1Sjsg 10851bb76ff1Sjsg /** 10861bb76ff1Sjsg * @set_fan_speed_pwm: Set a static fan speed in PWM. 10871bb76ff1Sjsg */ 10881bb76ff1Sjsg int (*set_fan_speed_pwm)(struct smu_context *smu, uint32_t speed); 10891bb76ff1Sjsg 10901bb76ff1Sjsg /** 10911bb76ff1Sjsg * @set_fan_speed_rpm: Set a static fan speed in rpm. 10921bb76ff1Sjsg */ 10931bb76ff1Sjsg int (*set_fan_speed_rpm)(struct smu_context *smu, uint32_t speed); 10941bb76ff1Sjsg 10951bb76ff1Sjsg /** 10961bb76ff1Sjsg * @set_xgmi_pstate: Set inter-chip global memory interconnect pstate. 10971bb76ff1Sjsg * &pstate: Pstate to set. D0 if Nonzero, D3 otherwise. 10981bb76ff1Sjsg */ 10991bb76ff1Sjsg int (*set_xgmi_pstate)(struct smu_context *smu, uint32_t pstate); 11001bb76ff1Sjsg 11011bb76ff1Sjsg /** 11021bb76ff1Sjsg * @gfx_off_control: Enable/disable graphics engine poweroff. 11031bb76ff1Sjsg */ 11041bb76ff1Sjsg int (*gfx_off_control)(struct smu_context *smu, bool enable); 11051bb76ff1Sjsg 11061bb76ff1Sjsg 11071bb76ff1Sjsg /** 11081bb76ff1Sjsg * @get_gfx_off_status: Get graphics engine poweroff status. 11091bb76ff1Sjsg * 11101bb76ff1Sjsg * Return: 11111bb76ff1Sjsg * 0 - GFXOFF(default). 11121bb76ff1Sjsg * 1 - Transition out of GFX State. 11131bb76ff1Sjsg * 2 - Not in GFXOFF. 11141bb76ff1Sjsg * 3 - Transition into GFXOFF. 11151bb76ff1Sjsg */ 11161bb76ff1Sjsg uint32_t (*get_gfx_off_status)(struct smu_context *smu); 11171bb76ff1Sjsg 11181bb76ff1Sjsg /** 11191bb76ff1Sjsg * @gfx_off_entrycount: total GFXOFF entry count at the time of 11201bb76ff1Sjsg * query since system power-up 11211bb76ff1Sjsg */ 11221bb76ff1Sjsg u32 (*get_gfx_off_entrycount)(struct smu_context *smu, uint64_t *entrycount); 11231bb76ff1Sjsg 11241bb76ff1Sjsg /** 11251bb76ff1Sjsg * @set_gfx_off_residency: set 1 to start logging, 0 to stop logging 11261bb76ff1Sjsg */ 11271bb76ff1Sjsg u32 (*set_gfx_off_residency)(struct smu_context *smu, bool start); 11281bb76ff1Sjsg 11291bb76ff1Sjsg /** 11301bb76ff1Sjsg * @get_gfx_off_residency: Average GFXOFF residency % during the logging interval 11311bb76ff1Sjsg */ 11321bb76ff1Sjsg u32 (*get_gfx_off_residency)(struct smu_context *smu, uint32_t *residency); 11331bb76ff1Sjsg 11341bb76ff1Sjsg /** 11351bb76ff1Sjsg * @register_irq_handler: Register interupt request handlers. 11361bb76ff1Sjsg */ 11371bb76ff1Sjsg int (*register_irq_handler)(struct smu_context *smu); 11381bb76ff1Sjsg 11391bb76ff1Sjsg /** 11401bb76ff1Sjsg * @set_azalia_d3_pme: Wake the audio decode engine from d3 sleep. 11411bb76ff1Sjsg */ 11421bb76ff1Sjsg int (*set_azalia_d3_pme)(struct smu_context *smu); 11431bb76ff1Sjsg 11441bb76ff1Sjsg /** 11451bb76ff1Sjsg * @get_max_sustainable_clocks_by_dc: Get a copy of the max sustainable 11461bb76ff1Sjsg * clock speeds table. 11471bb76ff1Sjsg * 11481bb76ff1Sjsg * Provides a way for the display component (DC) to get the max 11491bb76ff1Sjsg * sustainable clocks from the SMU. 11501bb76ff1Sjsg */ 11511bb76ff1Sjsg int (*get_max_sustainable_clocks_by_dc)(struct smu_context *smu, struct pp_smu_nv_clock_table *max_clocks); 11521bb76ff1Sjsg 11531bb76ff1Sjsg /** 11541bb76ff1Sjsg * @baco_is_support: Check if GPU supports BACO (Bus Active, Chip Off). 11551bb76ff1Sjsg */ 11561bb76ff1Sjsg bool (*baco_is_support)(struct smu_context *smu); 11571bb76ff1Sjsg 11581bb76ff1Sjsg /** 11591bb76ff1Sjsg * @baco_get_state: Get the current BACO state. 11601bb76ff1Sjsg * 11611bb76ff1Sjsg * Return: Current BACO state. 11621bb76ff1Sjsg */ 11631bb76ff1Sjsg enum smu_baco_state (*baco_get_state)(struct smu_context *smu); 11641bb76ff1Sjsg 11651bb76ff1Sjsg /** 11661bb76ff1Sjsg * @baco_set_state: Enter/exit BACO. 11671bb76ff1Sjsg */ 11681bb76ff1Sjsg int (*baco_set_state)(struct smu_context *smu, enum smu_baco_state state); 11691bb76ff1Sjsg 11701bb76ff1Sjsg /** 11711bb76ff1Sjsg * @baco_enter: Enter BACO. 11721bb76ff1Sjsg */ 11731bb76ff1Sjsg int (*baco_enter)(struct smu_context *smu); 11741bb76ff1Sjsg 11751bb76ff1Sjsg /** 11761bb76ff1Sjsg * @baco_exit: Exit Baco. 11771bb76ff1Sjsg */ 11781bb76ff1Sjsg int (*baco_exit)(struct smu_context *smu); 11791bb76ff1Sjsg 11801bb76ff1Sjsg /** 11811bb76ff1Sjsg * @mode1_reset_is_support: Check if GPU supports mode1 reset. 11821bb76ff1Sjsg */ 11831bb76ff1Sjsg bool (*mode1_reset_is_support)(struct smu_context *smu); 11841bb76ff1Sjsg /** 11851bb76ff1Sjsg * @mode2_reset_is_support: Check if GPU supports mode2 reset. 11861bb76ff1Sjsg */ 11871bb76ff1Sjsg bool (*mode2_reset_is_support)(struct smu_context *smu); 11881bb76ff1Sjsg 11891bb76ff1Sjsg /** 11901bb76ff1Sjsg * @mode1_reset: Perform mode1 reset. 11911bb76ff1Sjsg * 11921bb76ff1Sjsg * Complete GPU reset. 11931bb76ff1Sjsg */ 11941bb76ff1Sjsg int (*mode1_reset)(struct smu_context *smu); 11951bb76ff1Sjsg 11961bb76ff1Sjsg /** 11971bb76ff1Sjsg * @mode2_reset: Perform mode2 reset. 11981bb76ff1Sjsg * 11991bb76ff1Sjsg * Mode2 reset generally does not reset as many IPs as mode1 reset. The 12001bb76ff1Sjsg * IPs reset varies by asic. 12011bb76ff1Sjsg */ 12021bb76ff1Sjsg int (*mode2_reset)(struct smu_context *smu); 1203*f005ef32Sjsg /* for gfx feature enablement after mode2 reset */ 1204*f005ef32Sjsg int (*enable_gfx_features)(struct smu_context *smu); 12051bb76ff1Sjsg 12061bb76ff1Sjsg /** 12071bb76ff1Sjsg * @get_dpm_ultimate_freq: Get the hard frequency range of a clock 12081bb76ff1Sjsg * domain in MHz. 12091bb76ff1Sjsg */ 12101bb76ff1Sjsg int (*get_dpm_ultimate_freq)(struct smu_context *smu, enum smu_clk_type clk_type, uint32_t *min, uint32_t *max); 12111bb76ff1Sjsg 12121bb76ff1Sjsg /** 12131bb76ff1Sjsg * @set_soft_freq_limited_range: Set the soft frequency range of a clock 12141bb76ff1Sjsg * domain in MHz. 12151bb76ff1Sjsg */ 12161bb76ff1Sjsg int (*set_soft_freq_limited_range)(struct smu_context *smu, enum smu_clk_type clk_type, uint32_t min, uint32_t max); 12171bb76ff1Sjsg 12181bb76ff1Sjsg /** 12191bb76ff1Sjsg * @set_power_source: Notify the SMU of the current power source. 12201bb76ff1Sjsg */ 12211bb76ff1Sjsg int (*set_power_source)(struct smu_context *smu, enum smu_power_src_type power_src); 12221bb76ff1Sjsg 12231bb76ff1Sjsg /** 12241bb76ff1Sjsg * @log_thermal_throttling_event: Print a thermal throttling warning to 12251bb76ff1Sjsg * the system's log. 12261bb76ff1Sjsg */ 12271bb76ff1Sjsg void (*log_thermal_throttling_event)(struct smu_context *smu); 12281bb76ff1Sjsg 12291bb76ff1Sjsg /** 12301bb76ff1Sjsg * @get_pp_feature_mask: Print a human readable table of enabled 12311bb76ff1Sjsg * features to buffer. 12321bb76ff1Sjsg */ 12331bb76ff1Sjsg size_t (*get_pp_feature_mask)(struct smu_context *smu, char *buf); 12341bb76ff1Sjsg 12351bb76ff1Sjsg /** 12361bb76ff1Sjsg * @set_pp_feature_mask: Request the SMU enable/disable features to 12371bb76ff1Sjsg * match those enabled in &new_mask. 12381bb76ff1Sjsg */ 12391bb76ff1Sjsg int (*set_pp_feature_mask)(struct smu_context *smu, uint64_t new_mask); 12401bb76ff1Sjsg 12411bb76ff1Sjsg /** 12421bb76ff1Sjsg * @get_gpu_metrics: Get a copy of the GPU metrics table from the SMU. 12431bb76ff1Sjsg * 12441bb76ff1Sjsg * Return: Size of &table 12451bb76ff1Sjsg */ 12461bb76ff1Sjsg ssize_t (*get_gpu_metrics)(struct smu_context *smu, void **table); 12471bb76ff1Sjsg 12481bb76ff1Sjsg /** 12491bb76ff1Sjsg * @enable_mgpu_fan_boost: Enable multi-GPU fan boost. 12501bb76ff1Sjsg */ 12511bb76ff1Sjsg int (*enable_mgpu_fan_boost)(struct smu_context *smu); 12521bb76ff1Sjsg 12531bb76ff1Sjsg /** 12541bb76ff1Sjsg * @gfx_ulv_control: Enable/disable ultra low voltage. 12551bb76ff1Sjsg */ 12561bb76ff1Sjsg int (*gfx_ulv_control)(struct smu_context *smu, bool enablement); 12571bb76ff1Sjsg 12581bb76ff1Sjsg /** 12591bb76ff1Sjsg * @deep_sleep_control: Enable/disable deep sleep. 12601bb76ff1Sjsg */ 12611bb76ff1Sjsg int (*deep_sleep_control)(struct smu_context *smu, bool enablement); 12621bb76ff1Sjsg 12631bb76ff1Sjsg /** 12641bb76ff1Sjsg * @get_fan_parameters: Get fan parameters. 12651bb76ff1Sjsg * 12661bb76ff1Sjsg * Get maximum fan speed from the power play table. 12671bb76ff1Sjsg */ 12681bb76ff1Sjsg int (*get_fan_parameters)(struct smu_context *smu); 12691bb76ff1Sjsg 12701bb76ff1Sjsg /** 12711bb76ff1Sjsg * @post_init: Helper function for asic specific workarounds. 12721bb76ff1Sjsg */ 12731bb76ff1Sjsg int (*post_init)(struct smu_context *smu); 12741bb76ff1Sjsg 12751bb76ff1Sjsg /** 12761bb76ff1Sjsg * @interrupt_work: Work task scheduled from SMU interrupt handler. 12771bb76ff1Sjsg */ 12781bb76ff1Sjsg void (*interrupt_work)(struct smu_context *smu); 12791bb76ff1Sjsg 12801bb76ff1Sjsg /** 12811bb76ff1Sjsg * @gpo_control: Enable/disable graphics power optimization if supported. 12821bb76ff1Sjsg */ 12831bb76ff1Sjsg int (*gpo_control)(struct smu_context *smu, bool enablement); 12841bb76ff1Sjsg 12851bb76ff1Sjsg /** 12861bb76ff1Sjsg * @gfx_state_change_set: Send the current graphics state to the SMU. 12871bb76ff1Sjsg */ 12881bb76ff1Sjsg int (*gfx_state_change_set)(struct smu_context *smu, uint32_t state); 12891bb76ff1Sjsg 12901bb76ff1Sjsg /** 12911bb76ff1Sjsg * @set_fine_grain_gfx_freq_parameters: Set fine grain graphics clock 12921bb76ff1Sjsg * parameters to defaults. 12931bb76ff1Sjsg */ 12941bb76ff1Sjsg int (*set_fine_grain_gfx_freq_parameters)(struct smu_context *smu); 12951bb76ff1Sjsg 12961bb76ff1Sjsg /** 12971bb76ff1Sjsg * @smu_handle_passthrough_sbr: Send message to SMU about special handling for SBR. 12981bb76ff1Sjsg */ 12991bb76ff1Sjsg int (*smu_handle_passthrough_sbr)(struct smu_context *smu, bool enable); 13001bb76ff1Sjsg 13011bb76ff1Sjsg /** 13021bb76ff1Sjsg * @wait_for_event: Wait for events from SMU. 13031bb76ff1Sjsg */ 13041bb76ff1Sjsg int (*wait_for_event)(struct smu_context *smu, 13051bb76ff1Sjsg enum smu_event_type event, uint64_t event_arg); 13061bb76ff1Sjsg 13071bb76ff1Sjsg /** 13081bb76ff1Sjsg * @sned_hbm_bad_pages_num: message SMU to update bad page number 13091bb76ff1Sjsg * of SMUBUS table. 13101bb76ff1Sjsg */ 13111bb76ff1Sjsg int (*send_hbm_bad_pages_num)(struct smu_context *smu, uint32_t size); 13121bb76ff1Sjsg 13131bb76ff1Sjsg /** 13141bb76ff1Sjsg * @get_ecc_table: message SMU to get ECC INFO table. 13151bb76ff1Sjsg */ 13161bb76ff1Sjsg ssize_t (*get_ecc_info)(struct smu_context *smu, void *table); 13171bb76ff1Sjsg 13181bb76ff1Sjsg 13191bb76ff1Sjsg /** 13201bb76ff1Sjsg * @stb_collect_info: Collects Smart Trace Buffers data. 13211bb76ff1Sjsg */ 13221bb76ff1Sjsg int (*stb_collect_info)(struct smu_context *smu, void *buf, uint32_t size); 13231bb76ff1Sjsg 13241bb76ff1Sjsg /** 13251bb76ff1Sjsg * @get_default_config_table_settings: Get the ASIC default DriverSmuConfig table settings. 13261bb76ff1Sjsg */ 13271bb76ff1Sjsg int (*get_default_config_table_settings)(struct smu_context *smu, struct config_table_setting *table); 13281bb76ff1Sjsg 13291bb76ff1Sjsg /** 13301bb76ff1Sjsg * @set_config_table: Apply the input DriverSmuConfig table settings. 13311bb76ff1Sjsg */ 13321bb76ff1Sjsg int (*set_config_table)(struct smu_context *smu, struct config_table_setting *table); 13331bb76ff1Sjsg 13341bb76ff1Sjsg /** 13351bb76ff1Sjsg * @sned_hbm_bad_channel_flag: message SMU to update bad channel info 13361bb76ff1Sjsg * of SMUBUS table. 13371bb76ff1Sjsg */ 13381bb76ff1Sjsg int (*send_hbm_bad_channel_flag)(struct smu_context *smu, uint32_t size); 13391bb76ff1Sjsg 13401bb76ff1Sjsg /** 13411bb76ff1Sjsg * @init_pptable_microcode: Prepare the pptable microcode to upload via PSP 13421bb76ff1Sjsg */ 13431bb76ff1Sjsg int (*init_pptable_microcode)(struct smu_context *smu); 13441bb76ff1Sjsg }; 13451bb76ff1Sjsg 13461bb76ff1Sjsg typedef enum { 13471bb76ff1Sjsg METRICS_CURR_GFXCLK, 13481bb76ff1Sjsg METRICS_CURR_SOCCLK, 13491bb76ff1Sjsg METRICS_CURR_UCLK, 13501bb76ff1Sjsg METRICS_CURR_VCLK, 13511bb76ff1Sjsg METRICS_CURR_VCLK1, 13521bb76ff1Sjsg METRICS_CURR_DCLK, 13531bb76ff1Sjsg METRICS_CURR_DCLK1, 13541bb76ff1Sjsg METRICS_CURR_FCLK, 13551bb76ff1Sjsg METRICS_CURR_DCEFCLK, 13561bb76ff1Sjsg METRICS_AVERAGE_CPUCLK, 13571bb76ff1Sjsg METRICS_AVERAGE_GFXCLK, 13581bb76ff1Sjsg METRICS_AVERAGE_SOCCLK, 13591bb76ff1Sjsg METRICS_AVERAGE_FCLK, 13601bb76ff1Sjsg METRICS_AVERAGE_UCLK, 13611bb76ff1Sjsg METRICS_AVERAGE_VCLK, 13621bb76ff1Sjsg METRICS_AVERAGE_DCLK, 13631bb76ff1Sjsg METRICS_AVERAGE_VCLK1, 13641bb76ff1Sjsg METRICS_AVERAGE_DCLK1, 13651bb76ff1Sjsg METRICS_AVERAGE_GFXACTIVITY, 13661bb76ff1Sjsg METRICS_AVERAGE_MEMACTIVITY, 13671bb76ff1Sjsg METRICS_AVERAGE_VCNACTIVITY, 13681bb76ff1Sjsg METRICS_AVERAGE_SOCKETPOWER, 13691bb76ff1Sjsg METRICS_TEMPERATURE_EDGE, 13701bb76ff1Sjsg METRICS_TEMPERATURE_HOTSPOT, 13711bb76ff1Sjsg METRICS_TEMPERATURE_MEM, 13721bb76ff1Sjsg METRICS_TEMPERATURE_VRGFX, 13731bb76ff1Sjsg METRICS_TEMPERATURE_VRSOC, 13741bb76ff1Sjsg METRICS_TEMPERATURE_VRMEM, 13751bb76ff1Sjsg METRICS_THROTTLER_STATUS, 13761bb76ff1Sjsg METRICS_CURR_FANSPEED, 13771bb76ff1Sjsg METRICS_VOLTAGE_VDDSOC, 13781bb76ff1Sjsg METRICS_VOLTAGE_VDDGFX, 13791bb76ff1Sjsg METRICS_SS_APU_SHARE, 13801bb76ff1Sjsg METRICS_SS_DGPU_SHARE, 13811bb76ff1Sjsg METRICS_UNIQUE_ID_UPPER32, 13821bb76ff1Sjsg METRICS_UNIQUE_ID_LOWER32, 13831bb76ff1Sjsg METRICS_PCIE_RATE, 13841bb76ff1Sjsg METRICS_PCIE_WIDTH, 13851bb76ff1Sjsg METRICS_CURR_FANPWM, 1386*f005ef32Sjsg METRICS_CURR_SOCKETPOWER, 13871bb76ff1Sjsg } MetricsMember_t; 13881bb76ff1Sjsg 13891bb76ff1Sjsg enum smu_cmn2asic_mapping_type { 13901bb76ff1Sjsg CMN2ASIC_MAPPING_MSG, 13911bb76ff1Sjsg CMN2ASIC_MAPPING_CLK, 13921bb76ff1Sjsg CMN2ASIC_MAPPING_FEATURE, 13931bb76ff1Sjsg CMN2ASIC_MAPPING_TABLE, 13941bb76ff1Sjsg CMN2ASIC_MAPPING_PWR, 13951bb76ff1Sjsg CMN2ASIC_MAPPING_WORKLOAD, 13961bb76ff1Sjsg }; 13971bb76ff1Sjsg 13981bb76ff1Sjsg enum smu_baco_seq { 13991bb76ff1Sjsg BACO_SEQ_BACO = 0, 14001bb76ff1Sjsg BACO_SEQ_MSR, 14011bb76ff1Sjsg BACO_SEQ_BAMACO, 14021bb76ff1Sjsg BACO_SEQ_ULPS, 14031bb76ff1Sjsg BACO_SEQ_COUNT, 14041bb76ff1Sjsg }; 14051bb76ff1Sjsg 14061bb76ff1Sjsg #define MSG_MAP(msg, index, valid_in_vf) \ 14071bb76ff1Sjsg [SMU_MSG_##msg] = {1, (index), (valid_in_vf)} 14081bb76ff1Sjsg 14091bb76ff1Sjsg #define CLK_MAP(clk, index) \ 14101bb76ff1Sjsg [SMU_##clk] = {1, (index)} 14111bb76ff1Sjsg 14121bb76ff1Sjsg #define FEA_MAP(fea) \ 14131bb76ff1Sjsg [SMU_FEATURE_##fea##_BIT] = {1, FEATURE_##fea##_BIT} 14141bb76ff1Sjsg 14151bb76ff1Sjsg #define FEA_MAP_REVERSE(fea) \ 14161bb76ff1Sjsg [SMU_FEATURE_DPM_##fea##_BIT] = {1, FEATURE_##fea##_DPM_BIT} 14171bb76ff1Sjsg 14181bb76ff1Sjsg #define FEA_MAP_HALF_REVERSE(fea) \ 14191bb76ff1Sjsg [SMU_FEATURE_DPM_##fea##CLK_BIT] = {1, FEATURE_##fea##_DPM_BIT} 14201bb76ff1Sjsg 14211bb76ff1Sjsg #define TAB_MAP(tab) \ 14221bb76ff1Sjsg [SMU_TABLE_##tab] = {1, TABLE_##tab} 14231bb76ff1Sjsg 14241bb76ff1Sjsg #define TAB_MAP_VALID(tab) \ 14251bb76ff1Sjsg [SMU_TABLE_##tab] = {1, TABLE_##tab} 14261bb76ff1Sjsg 14271bb76ff1Sjsg #define TAB_MAP_INVALID(tab) \ 14281bb76ff1Sjsg [SMU_TABLE_##tab] = {0, TABLE_##tab} 14291bb76ff1Sjsg 14301bb76ff1Sjsg #define PWR_MAP(tab) \ 14311bb76ff1Sjsg [SMU_POWER_SOURCE_##tab] = {1, POWER_SOURCE_##tab} 14321bb76ff1Sjsg 14331bb76ff1Sjsg #define WORKLOAD_MAP(profile, workload) \ 14341bb76ff1Sjsg [profile] = {1, (workload)} 14351bb76ff1Sjsg 14361bb76ff1Sjsg /** 14371bb76ff1Sjsg * smu_memcpy_trailing - Copy the end of one structure into the middle of another 14381bb76ff1Sjsg * 14391bb76ff1Sjsg * @dst: Pointer to destination struct 14401bb76ff1Sjsg * @first_dst_member: The member name in @dst where the overwrite begins 14411bb76ff1Sjsg * @last_dst_member: The member name in @dst where the overwrite ends after 14421bb76ff1Sjsg * @src: Pointer to the source struct 14431bb76ff1Sjsg * @first_src_member: The member name in @src where the copy begins 14441bb76ff1Sjsg * 14451bb76ff1Sjsg */ 14461bb76ff1Sjsg #define smu_memcpy_trailing(dst, first_dst_member, last_dst_member, \ 14471bb76ff1Sjsg src, first_src_member) \ 14481bb76ff1Sjsg ({ \ 14491bb76ff1Sjsg size_t __src_offset = offsetof(typeof(*(src)), first_src_member); \ 14501bb76ff1Sjsg size_t __src_size = sizeof(*(src)) - __src_offset; \ 14511bb76ff1Sjsg size_t __dst_offset = offsetof(typeof(*(dst)), first_dst_member); \ 14521bb76ff1Sjsg size_t __dst_size = offsetofend(typeof(*(dst)), last_dst_member) - \ 14531bb76ff1Sjsg __dst_offset; \ 14541bb76ff1Sjsg __builtin_memcpy((u8 *)(dst) + __dst_offset, \ 14551bb76ff1Sjsg (u8 *)(src) + __src_offset, \ 14561bb76ff1Sjsg __dst_size); \ 14571bb76ff1Sjsg }) 14581bb76ff1Sjsg 14591bb76ff1Sjsg #if !defined(SWSMU_CODE_LAYER_L2) && !defined(SWSMU_CODE_LAYER_L3) && !defined(SWSMU_CODE_LAYER_L4) 14601bb76ff1Sjsg int smu_get_power_limit(void *handle, 14611bb76ff1Sjsg uint32_t *limit, 14621bb76ff1Sjsg enum pp_power_limit_level pp_limit_level, 14631bb76ff1Sjsg enum pp_power_type pp_power_type); 14641bb76ff1Sjsg 14651bb76ff1Sjsg bool smu_mode1_reset_is_support(struct smu_context *smu); 14661bb76ff1Sjsg bool smu_mode2_reset_is_support(struct smu_context *smu); 14671bb76ff1Sjsg int smu_mode1_reset(struct smu_context *smu); 14681bb76ff1Sjsg 14691bb76ff1Sjsg extern const struct amd_ip_funcs smu_ip_funcs; 14701bb76ff1Sjsg 14711bb76ff1Sjsg bool is_support_sw_smu(struct amdgpu_device *adev); 14721bb76ff1Sjsg bool is_support_cclk_dpm(struct amdgpu_device *adev); 14731bb76ff1Sjsg int smu_write_watermarks_table(struct smu_context *smu); 14741bb76ff1Sjsg 14751bb76ff1Sjsg int smu_get_dpm_freq_range(struct smu_context *smu, enum smu_clk_type clk_type, 14761bb76ff1Sjsg uint32_t *min, uint32_t *max); 14771bb76ff1Sjsg 14781bb76ff1Sjsg int smu_set_soft_freq_range(struct smu_context *smu, enum smu_clk_type clk_type, 14791bb76ff1Sjsg uint32_t min, uint32_t max); 14801bb76ff1Sjsg 14811bb76ff1Sjsg int smu_set_gfx_power_up_by_imu(struct smu_context *smu); 14821bb76ff1Sjsg 14831bb76ff1Sjsg int smu_set_ac_dc(struct smu_context *smu); 14841bb76ff1Sjsg 14851bb76ff1Sjsg int smu_allow_xgmi_power_down(struct smu_context *smu, bool en); 14861bb76ff1Sjsg 14871bb76ff1Sjsg int smu_get_entrycount_gfxoff(struct smu_context *smu, u64 *value); 14881bb76ff1Sjsg 14891bb76ff1Sjsg int smu_get_residency_gfxoff(struct smu_context *smu, u32 *value); 14901bb76ff1Sjsg 14911bb76ff1Sjsg int smu_set_residency_gfxoff(struct smu_context *smu, bool value); 14921bb76ff1Sjsg 14931bb76ff1Sjsg int smu_get_status_gfxoff(struct smu_context *smu, uint32_t *value); 14941bb76ff1Sjsg 14951bb76ff1Sjsg int smu_handle_passthrough_sbr(struct smu_context *smu, bool enable); 14961bb76ff1Sjsg 14971bb76ff1Sjsg int smu_wait_for_event(struct smu_context *smu, enum smu_event_type event, 14981bb76ff1Sjsg uint64_t event_arg); 14991bb76ff1Sjsg int smu_get_ecc_info(struct smu_context *smu, void *umc_ecc); 15001bb76ff1Sjsg int smu_stb_collect_info(struct smu_context *smu, void *buff, uint32_t size); 15011bb76ff1Sjsg void amdgpu_smu_stb_debug_fs_init(struct amdgpu_device *adev); 15021bb76ff1Sjsg int smu_send_hbm_bad_pages_num(struct smu_context *smu, uint32_t size); 15031bb76ff1Sjsg int smu_send_hbm_bad_channel_flag(struct smu_context *smu, uint32_t size); 15041bb76ff1Sjsg #endif 15051bb76ff1Sjsg #endif 1506