diff options
Diffstat (limited to 'drivers/gpu/drm/amd/include/kgd_pp_interface.h')
-rw-r--r-- | drivers/gpu/drm/amd/include/kgd_pp_interface.h | 141 |
1 files changed, 140 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h b/drivers/gpu/drm/amd/include/kgd_pp_interface.h index a41875ac5dfb..353468667036 100644 --- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h @@ -48,6 +48,7 @@ enum amd_dpm_forced_level { AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK = 0x40, AMD_DPM_FORCED_LEVEL_PROFILE_PEAK = 0x80, AMD_DPM_FORCED_LEVEL_PROFILE_EXIT = 0x100, + AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM = 0x200, }; enum amd_pm_state_type { @@ -95,10 +96,14 @@ enum pp_clock_type { PP_SOCCLK, PP_FCLK, PP_DCEFCLK, + PP_VCLK, + PP_DCLK, OD_SCLK, OD_MCLK, OD_VDDC_CURVE, OD_RANGE, + OD_VDDGFX_OFFSET, + OD_CCLK, }; enum amd_pp_sensors { @@ -226,6 +231,8 @@ enum pp_df_cstate { #define XGMI_MODE_PSTATE_D3 0 #define XGMI_MODE_PSTATE_D0 1 +#define NUM_HBM_INSTANCES 4 + struct seq_file; enum amd_pp_clock_type; struct amd_pp_simple_clock_info; @@ -235,6 +242,9 @@ struct pp_display_clock_request; struct pp_clock_levels_with_voltage; struct pp_clock_levels_with_latency; struct amd_pp_clocks; +struct pp_smu_wm_range_sets; +struct pp_smu_nv_clock_table; +struct dpm_clocks; struct amd_pm_funcs { /* export for dpm on ci and si */ @@ -281,7 +291,8 @@ struct amd_pm_funcs { uint32_t block_type, bool gate); int (*set_clockgating_by_smu)(void *handle, uint32_t msg_id); int (*set_power_limit)(void *handle, uint32_t n); - int (*get_power_limit)(void *handle, uint32_t *limit, bool default_limit); + int (*get_power_limit)(void *handle, uint32_t *limit, uint32_t *max_limit, + bool default_limit); int (*get_power_profile_mode)(void *handle, char *buf); int (*set_power_profile_mode)(void *handle, long *input, uint32_t size); int (*set_fine_grain_clk_vol)(void *handle, uint32_t type, long *input, uint32_t size); @@ -328,6 +339,17 @@ struct amd_pm_funcs { int (*set_df_cstate)(void *handle, enum pp_df_cstate state); int (*set_xgmi_pstate)(void *handle, uint32_t pstate); ssize_t (*get_gpu_metrics)(void *handle, void **table); + int (*set_watermarks_for_clock_ranges)(void *handle, + struct pp_smu_wm_range_sets *ranges); + int (*display_disable_memory_clock_switch)(void *handle, + bool disable_memory_clock_switch); + int (*get_max_sustainable_clocks_by_dc)(void *handle, + struct pp_smu_nv_clock_table *max_clocks); + int (*get_uclk_dpm_states)(void *handle, + unsigned int *clock_values_in_khz, + unsigned int *num_states); + int (*get_dpm_clock_table)(void *handle, + struct dpm_clocks *clock_table); }; struct metrics_table_header { @@ -336,6 +358,10 @@ struct metrics_table_header { uint8_t content_revision; }; +/* + * gpu_metrics_v1_0 is not recommended as it's not naturally aligned. + * Use gpu_metrics_v1_1 or later instead. + */ struct gpu_metrics_v1_0 { struct metrics_table_header common_header; @@ -388,6 +414,69 @@ struct gpu_metrics_v1_0 { uint8_t pcie_link_speed; // in 0.1 GT/s }; +struct gpu_metrics_v1_1 { + struct metrics_table_header common_header; + + /* Temperature */ + uint16_t temperature_edge; + uint16_t temperature_hotspot; + uint16_t temperature_mem; + uint16_t temperature_vrgfx; + uint16_t temperature_vrsoc; + uint16_t temperature_vrmem; + + /* Utilization */ + uint16_t average_gfx_activity; + uint16_t average_umc_activity; // memory controller + uint16_t average_mm_activity; // UVD or VCN + + /* Power/Energy */ + uint16_t average_socket_power; + uint64_t energy_accumulator; + + /* Driver attached timestamp (in ns) */ + uint64_t system_clock_counter; + + /* Average clocks */ + uint16_t average_gfxclk_frequency; + uint16_t average_socclk_frequency; + uint16_t average_uclk_frequency; + uint16_t average_vclk0_frequency; + uint16_t average_dclk0_frequency; + uint16_t average_vclk1_frequency; + uint16_t average_dclk1_frequency; + + /* Current clocks */ + uint16_t current_gfxclk; + uint16_t current_socclk; + uint16_t current_uclk; + uint16_t current_vclk0; + uint16_t current_dclk0; + uint16_t current_vclk1; + uint16_t current_dclk1; + + /* Throttle status */ + uint32_t throttle_status; + + /* Fans */ + uint16_t current_fan_speed; + + /* Link width/speed */ + uint16_t pcie_link_width; + uint16_t pcie_link_speed; // in 0.1 GT/s + + uint16_t padding; + + uint32_t gfx_activity_acc; + uint32_t mem_activity_acc; + + uint16_t temperature_hbm[NUM_HBM_INSTANCES]; +}; + +/* + * gpu_metrics_v2_0 is not recommended as it's not naturally aligned. + * Use gpu_metrics_v2_1 or later instead. + */ struct gpu_metrics_v2_0 { struct metrics_table_header common_header; @@ -438,4 +527,54 @@ struct gpu_metrics_v2_0 { uint16_t padding; }; +struct gpu_metrics_v2_1 { + struct metrics_table_header common_header; + + /* Temperature */ + uint16_t temperature_gfx; // gfx temperature on APUs + uint16_t temperature_soc; // soc temperature on APUs + uint16_t temperature_core[8]; // CPU core temperature on APUs + uint16_t temperature_l3[2]; + + /* Utilization */ + uint16_t average_gfx_activity; + uint16_t average_mm_activity; // UVD or VCN + + /* Driver attached timestamp (in ns) */ + uint64_t system_clock_counter; + + /* Power/Energy */ + uint16_t average_socket_power; // dGPU + APU power on A + A platform + uint16_t average_cpu_power; + uint16_t average_soc_power; + uint16_t average_gfx_power; + uint16_t average_core_power[8]; // CPU core power on APUs + + /* Average clocks */ + uint16_t average_gfxclk_frequency; + uint16_t average_socclk_frequency; + uint16_t average_uclk_frequency; + uint16_t average_fclk_frequency; + uint16_t average_vclk_frequency; + uint16_t average_dclk_frequency; + + /* Current clocks */ + uint16_t current_gfxclk; + uint16_t current_socclk; + uint16_t current_uclk; + uint16_t current_fclk; + uint16_t current_vclk; + uint16_t current_dclk; + uint16_t current_coreclk[8]; // CPU core clocks + uint16_t current_l3clk[2]; + + /* Throttle status */ + uint32_t throttle_status; + + /* Fans */ + uint16_t fan_pwm; + + uint16_t padding[3]; +}; + #endif |