Created
October 30, 2020 22:48
-
-
Save stblr/2e6ec58b8683256cb896986012acf69b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdbool.h> | |
#include <stdint.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
typedef uint8_t u8; | |
typedef uint16_t u16; | |
typedef uint32_t u32; | |
typedef int8_t i8; | |
typedef int16_t i16; | |
static bool read_file(const char *path, size_t *size, u8 **data) { | |
bool ret = false; | |
FILE *input = fopen(path, "r"); | |
if (!input) { | |
return ret; | |
} | |
if (fseek(input, 0, SEEK_END)) { | |
goto cleanup; | |
} | |
long pos = ftell(input); | |
if (pos < 0) { | |
goto cleanup; | |
} | |
*size = pos; // FIXME possible overflow if sizeof(size_t) < sizeof(long) | |
if (fseek(input, 0, SEEK_SET)) { | |
goto cleanup; | |
} | |
*data = malloc(*size * sizeof(u8)); | |
if (!*data) { | |
goto cleanup; | |
} | |
if (fread(*data, sizeof(u8), *size, input) != *size) { | |
goto cleanup; | |
} | |
ret = true; | |
cleanup: | |
fclose(input); | |
return ret; | |
} | |
struct common_firmware_header { | |
u32 size_bytes; | |
u32 header_size_bytes; | |
u16 header_version_major; | |
u16 header_version_minor; | |
u16 ip_version_major; | |
u16 ip_version_minor; | |
u32 ucode_version; | |
u32 ucode_size_bytes; | |
u32 ucode_array_offset_bytes; | |
u32 crc32; | |
}; | |
static void print_common_firmware_header(struct common_firmware_header hdr) { | |
printf("size_bytes: %u\n", hdr.size_bytes); | |
printf("header_size_bytes: %u\n", hdr.header_size_bytes); | |
printf("header_version_major: %u\n", hdr.header_version_major); | |
printf("header_version_minor: %u\n", hdr.header_version_minor); | |
printf("ip_version_major: %u\n", hdr.ip_version_major); | |
printf("ip_version_minor: %u\n", hdr.ip_version_minor); | |
printf("ucode_version: 0x%08x\n", hdr.ucode_version); | |
printf("ucode_size_bytes: %u\n", hdr.ucode_size_bytes); | |
printf("ucode_array_offset_bytes: %u\n", hdr.ucode_array_offset_bytes); | |
printf("crc32: 0x%08x\n", hdr.crc32); | |
printf("\n"); | |
} | |
struct smc_firmware_header_v1_0 { | |
struct common_firmware_header header; | |
u32 ucode_start_addr; | |
}; | |
struct smc_firmware_header_v2_0 { | |
struct smc_firmware_header_v1_0 v1_0; | |
u32 ppt_offset_bytes; | |
u32 ppt_size_bytes; | |
}; | |
static void print_smc_firmware_header_v2_0(struct smc_firmware_header_v2_0 hdr) { | |
printf("ucode_start_addr: %u\n", hdr.v1_0.ucode_start_addr); | |
printf("ppt_offset_bytes: %u\n", hdr.ppt_offset_bytes); | |
printf("ppt_size_bytes: %u\n", hdr.ppt_size_bytes); | |
printf("\n"); | |
} | |
struct smc_soft_pptable_entry { | |
u32 id; | |
u32 ppt_offset_bytes; | |
u32 ppt_size_bytes; | |
}; | |
static void print_smc_soft_pptable_entry(struct smc_soft_pptable_entry entry) { | |
printf("id: %u\n", entry.id); | |
printf("ppt_offset_bytes: %u\n", entry.ppt_offset_bytes); | |
printf("ppt_size_bytes: %u\n", entry.ppt_size_bytes); | |
printf("\n"); | |
} | |
struct smc_firmware_header_v2_1 { | |
struct smc_firmware_header_v1_0 v1_0; | |
u32 pptable_count; | |
u32 pptable_entry_offset; | |
}; | |
static void print_smc_firmware_header_v2_1(struct smc_firmware_header_v2_1 hdr) { | |
printf("ucode_start_addr: %u\n", hdr.v1_0.ucode_start_addr); | |
printf("pptable_count: %u\n", hdr.pptable_count); | |
printf("pptable_entry_offset: %u\n", hdr.pptable_entry_offset); | |
printf("pptable_entry_offset: 0x%08x\n", hdr.pptable_entry_offset); | |
printf("\n"); | |
} | |
struct atom_common_table_header { | |
u16 structuresize; | |
u8 format_revision; | |
u8 content_revision; | |
}; | |
const char *const ppclock_names[11] = { | |
"gfxclk", | |
"vclk", | |
"dclk", | |
"eclk", | |
"socclk", | |
"uclk", | |
"dcefclk", | |
"dispclk", | |
"pixclk", | |
"phyclk", | |
"dtbclk", | |
}; | |
struct smu_11_0_power_saving_clock_table { | |
u8 revision; | |
u8 reserve[3]; | |
u32 count; | |
u32 max[16]; | |
u32 min[16]; | |
} __attribute((packed)); | |
static void print_smu_11_0_power_saving_clock_table(struct smu_11_0_power_saving_clock_table psct) { | |
printf("revision: %u\n", psct.revision); | |
printf("count: %u\n", psct.count); | |
for (u8 i = 0; i < 11; i++) { | |
printf("%s: %u - %u\n", ppclock_names[i], psct.min[i], psct.max[i]); | |
} | |
printf("\n"); | |
} | |
struct smu_11_0_overdrive_table { | |
u8 revision; | |
u8 reserve[3]; | |
u32 feature_count; | |
u32 setting_count; | |
u8 cap[32]; | |
u32 max[32]; | |
u32 min[32]; | |
} __attribute((packed)); | |
static void print_smu_11_0_overdrive_table(struct smu_11_0_overdrive_table ot) { | |
printf("revision: %u\n", ot.revision); | |
printf("feature_count: %u\n", ot.feature_count); | |
printf("setting_count: %u\n", ot.setting_count); | |
/*for (u8 i = 0; i < 14; i++) { | |
printf("%u\n", ot.cap[i]); | |
} | |
for (u8 i = 0; i < 30; i++) { | |
printf("%u - %u\n", ot.min[i], ot.max[i]); | |
}*/ | |
printf("\n"); | |
} | |
struct smu_11_0_powerplay_table { | |
struct atom_common_table_header header; | |
u8 table_revision; | |
u16 table_size; | |
u32 golden_pp_id; | |
u32 golden_revision; | |
u16 format_id; | |
u32 platform_caps; | |
u8 thermal_controller_type; | |
u16 small_power_limit1; | |
u16 small_power_limit2; | |
u16 boost_power_limit; | |
u16 od_turbo_power_limit; | |
u16 od_power_save_power_limit; | |
u16 software_shutdown_temp; | |
u16 reserve[6]; | |
struct smu_11_0_power_saving_clock_table power_saving_clock; | |
struct smu_11_0_overdrive_table overdrive_table; | |
u32 version; | |
u32 features_to_run[2]; | |
u16 socket_power_limit_ac[4]; | |
u16 socket_power_limit_ac_tau[4]; | |
u16 socket_power_limit_dc[4]; | |
u16 socket_power_limit_dc_tau[4]; | |
u16 tdc_limit_soc; | |
u16 tdc_limit_soc_tau; | |
u16 tdc_limit_gfx; | |
u16 tdc_limit_gfx_tau; | |
u16 temp_limit[10]; | |
u32 fit_limit; | |
u16 ppm_power_limit; | |
u16 ppm_temperature_threshold; | |
u32 throttler_control_mask; | |
u32 fwd_state_mask; | |
u16 ulv_voltage_offset_soc; | |
u16 ulv_voltage_offset_gfx; | |
u8 gcea_link_mgr_idle_threshold; | |
u8 padding_rlc_ulv_params[3]; | |
u8 ulv_smnclk_did; | |
u8 ulv_mp1clk_did; | |
u8 ulv_gfxclk_bypass; | |
u8 padding234; | |
u16 min_voltage_ulv_gfx; | |
u16 min_voltage_ulv_soc; | |
u16 min_voltage_gfx; | |
u16 min_voltage_soc; | |
u16 max_voltage_gfx; | |
u16 max_voltage_soc; | |
u16 load_line_resistance_gfx; | |
u16 load_line_resistance_soc; | |
struct { | |
u8 voltage_mode; | |
u8 snap_to_discrete; | |
u8 num_discrete_level; | |
u8 padding; | |
struct { | |
u32 m; | |
u32 b; | |
} conversion_to_avfs_clk; | |
struct { | |
u32 a; | |
u32 b; | |
u32 c; | |
} ss_curve; | |
} dpm_descriptor[9]; | |
u16 freq_table_gfx[16]; | |
u16 freq_table_vclk[8]; | |
u16 freq_table_dclk[8]; | |
u16 freq_table_socclk[8]; | |
u16 freq_table_uclk[4]; | |
u16 freq_table_dcefclk[8]; | |
u16 freq_table_dispclk[8]; | |
u16 freq_table_pixclk[8]; | |
u16 freq_table_phyclk[8]; | |
u32 padding_clks[16]; | |
u16 dc_mode_max_freq[9]; | |
u16 padding8_clks; | |
u8 freq_table_uclk_div[4]; | |
u16 mp0_clk_freq[2]; | |
u16 mp0_dpm_voltage[2]; | |
u16 mem_vddci_voltage[4]; | |
u16 mem_mvdd_voltage[4]; | |
u16 gfxclk_fgfxoff_entry; | |
u16 gfxclk_finit; | |
u16 gfxclk_fidle; | |
u16 gfxclk_slewrate; | |
u16 gfxclk_fopt; | |
u8 padding567[2]; | |
u16 gfxclk_ds_max_freq; | |
u8 gfxclk_source; | |
u8 padding456; | |
u8 lowest_uclk_reserved_for_ulv; | |
u8 padding_uclk[3]; | |
u8 memory_type; | |
u8 memory_channels; | |
u8 padding_mem[2]; | |
u8 pcie_gen_speed[2]; | |
u8 pcie_lane_count[2]; | |
u16 lclk_freq[2]; | |
} __attribute__((packed)); | |
static void print_smu_11_0_powerplay_table(struct smu_11_0_powerplay_table pptable) { | |
printf("structuresize: %u\n", pptable.header.structuresize); | |
printf("format_revision: %u\n", pptable.header.format_revision); | |
printf("content_revision: %u\n", pptable.header.content_revision); | |
printf("table_revision: %u\n", pptable.table_revision); | |
printf("table_size: %u\n", pptable.table_size); | |
printf("golden_pp_id: %u\n", pptable.golden_pp_id); | |
printf("golden_revision: %u\n", pptable.golden_revision); | |
printf("format_id: %u\n", pptable.format_id); | |
printf("platform_caps: %u\n", pptable.platform_caps); | |
printf("thermal_controller_type: %u\n", pptable.thermal_controller_type); | |
printf("small_power_limit1: %u\n", pptable.small_power_limit1); | |
printf("small_power_limit2: %u\n", pptable.small_power_limit2); | |
printf("boost_power_limit: %u\n", pptable.boost_power_limit); | |
printf("od_turbo_power_limit: %u\n", pptable.od_turbo_power_limit); | |
printf("od_power_save_power_limit: %u\n", pptable.od_power_save_power_limit); | |
printf("software_shutdown_temp: %u\n", pptable.software_shutdown_temp); | |
printf("\n"); | |
print_smu_11_0_power_saving_clock_table(pptable.power_saving_clock); | |
print_smu_11_0_overdrive_table(pptable.overdrive_table); | |
printf("version: %u\n", pptable.version); | |
printf("features_to_run[0]: 0x%08x\n", pptable.features_to_run[0]); | |
printf("features_to_run[1]: 0x%08x\n", pptable.features_to_run[1]); | |
printf("\n"); | |
for (u8 i = 0; i < 4; i++) { | |
printf("socket_power_limit_ac[%u]: ", i); | |
printf("%u W - ", pptable.socket_power_limit_ac[i]); | |
printf("%u ms\n", pptable.socket_power_limit_ac_tau[i]); | |
} | |
for (u8 i = 0; i < 4; i++) { | |
printf("socket_power_limit_dc[%u]: ", i); | |
printf("%u W - ", pptable.socket_power_limit_dc[i]); | |
printf("%u ms\n", pptable.socket_power_limit_dc_tau[i]); | |
} | |
/*printf("tdc_limit_gfx: %u A\n", pptable.tdc_limit_soc); | |
printf("tdc_limit_soc_tau: %u ms\n", pptable.tdc_limit_soc_tau); | |
printf("tdc_limit_gfx: %u A\n", pptable.tdc_limit_gfx); | |
printf("tdc_limit_gfx_tau: %u ms\n", pptable.tdc_limit_gfx_tau); | |
for (u8 i = 0; i < 10; i++) { | |
printf("temp_limit[%u]: %u\n", i, pptable.temp_limit[i]); | |
} | |
printf("fit_limit: %u\n", pptable.fit_limit); | |
printf("ppm_power_limit: %u\n", pptable.ppm_power_limit); | |
printf("ppm_temperature_threshold: %u\n", pptable.ppm_temperature_threshold); | |
printf("throttler_control_mask: 0x%08x\n", pptable.throttler_control_mask); | |
printf("fwd_state_mask: %u\n", pptable.fwd_state_mask);*/ | |
printf("\n"); | |
/*printf("min_voltage_gfx: %u\n", pptable.min_voltage_gfx); | |
printf("min_voltage_soc: %u\n", pptable.min_voltage_soc); | |
printf("max_voltage_gfx: %u\n", pptable.max_voltage_gfx); | |
printf("max_voltage_soc: %u\n", pptable.max_voltage_soc); | |
printf("load_line_resistance_gfx: %u\n", pptable.load_line_resistance_gfx); | |
printf("load_line_resistance_soc: %u\n", pptable.load_line_resistance_soc); | |
printf("\n");*/ | |
for (u8 i = 0; i < 2; i++) { | |
printf("freq_table_gfx[%u]: %u\n", i, pptable.freq_table_gfx[i]); | |
} | |
for (u8 i = 0; i < 2; i++) { | |
printf("freq_table_vclk[%u]: %u\n", i, pptable.freq_table_vclk[i]); | |
} | |
for (u8 i = 0; i < 2; i++) { | |
printf("freq_table_dclk[%u]: %u\n", i, pptable.freq_table_dclk[i]); | |
} | |
for (u8 i = 0; i < 2; i++) { | |
printf("freq_table_socclk[%u]: %u\n", i, pptable.freq_table_socclk[i]); | |
} | |
for (u8 i = 0; i < 4; i++) { | |
printf("freq_table_uclk[%u]: %u\n", i, pptable.freq_table_uclk[i]); | |
} | |
for (u8 i = 0; i < 4; i++) { | |
printf("%u\n", pptable.freq_table_uclk_div[i]); | |
} | |
printf("\n"); | |
printf("memory_type: %u\n", pptable.memory_type); | |
printf("memory_channels: %u\n", pptable.memory_channels); | |
printf("\n"); | |
for (u8 i = 0; i < 2; i++) { | |
printf("pcie_gen_speed[%u]: %u\n", i, pptable.pcie_gen_speed[i]); | |
printf("pcie_lane_count[%u]: %u\n", i, pptable.pcie_lane_count[i]); | |
} | |
printf("\n"); | |
} | |
struct smu_11_0_7_overdrive_table { | |
u8 revision; | |
u8 reserve[3]; | |
u32 feature_count; | |
u32 setting_count; | |
u8 cap[32]; | |
u32 max[64]; | |
u32 min[64]; | |
i16 pm_setting[32]; | |
} __attribute((packed)); | |
static void print_smu_11_0_7_overdrive_table(struct smu_11_0_7_overdrive_table ot) { | |
printf("revision: %u\n", ot.revision); | |
printf("feature_count: %u\n", ot.feature_count); | |
printf("setting_count: %u\n", ot.setting_count); | |
/*for (u8 i = 0; i < 32; i++) { | |
printf("%u\n", ot.cap[i]); | |
} | |
for (u8 i = 0; i < 64; i++) { | |
printf("%u - %u\n", ot.min[i], ot.max[i]); | |
} | |
for (u8 i = 0; i < 32; i++) { | |
printf("%d\n", ot.pm_setting[i]); | |
}*/ | |
printf("\n"); | |
} | |
struct quadratic_int { | |
u32 a; | |
u32 b; | |
u32 c; | |
}; | |
struct linear_int { | |
u32 m; | |
u32 b; | |
}; | |
struct droop_int { | |
u32 a; | |
u32 b; | |
u32 c; | |
}; | |
struct smu_11_0_7_powerplay_table { | |
struct atom_common_table_header header; | |
u8 table_revision; | |
u16 table_size; | |
u32 golden_pp_id; | |
u32 golden_revision; | |
u16 format_id; | |
u32 platform_caps; | |
u8 thermal_controller_type; | |
u16 small_power_limit1; | |
u16 small_power_limit2; | |
u16 boost_power_limit; | |
u16 software_shutdown_temp; | |
u16 reserve[8]; | |
struct smu_11_0_power_saving_clock_table power_saving_clock; | |
struct smu_11_0_7_overdrive_table overdrive_table; | |
u32 version; | |
u32 features_to_run[2]; | |
u16 socket_power_limit_ac[4]; | |
u16 socket_power_limit_ac_tau[4]; | |
u16 socket_power_limit_dc[4]; | |
u16 socket_power_limit_dc_tau[4]; | |
u16 tdc_limit[2]; | |
u16 tdc_limit_tau[2]; | |
u16 temperature_limit[10]; | |
u32 fit_limit; | |
u8 total_power_config; | |
u8 total_power_padding[3]; | |
u32 apcc_plus_residency_limit; | |
u16 smnclk_dpm_freq[2]; | |
u16 smnclk_dpm_voltage[2]; | |
u32 padding_apcc[4]; | |
u32 throttler_control_mask; | |
u32 fw_d_state_mask; | |
u16 ulv_voltage_offset_soc; | |
u16 ulv_voltage_offset_gfx; | |
u16 min_voltage_ulv_gfx; | |
u16 min_voltage_ulv_soc; | |
u16 soc_liv_min; | |
u16 padding_liv_min; | |
u8 gcea_link_mgr_idle_threshold; | |
u8 padding_rlc_ulv_params[3]; | |
u16 min_voltage_gfx; | |
u16 min_voltage_soc; | |
u16 max_voltage_gfx; | |
u16 max_voltage_soc; | |
u16 load_line_resistance_gfx; | |
u16 load_line_resistance_soc; | |
u16 vddgfx_tvmin; | |
u16 vddsoc_tvmin; | |
u16 vddgfx_vmin_hi_temp; | |
u16 vddgfx_vmin_lo_temp; | |
u16 vddsoc_vmin_hi_temp; | |
u16 vddsoc_vmin_lo_temp; | |
u16 vddgfx_tvmin_hysteresis; | |
u16 vddsoc_tvmin_hysteresis; | |
struct { | |
u8 voltage_mode; | |
u8 snap_to_discrete; | |
u8 num_discrete_level; | |
u8 padding; | |
struct linear_int conversion_to_avfs_clk; | |
struct quadratic_int ss_curve; | |
u16 ss_fmin; | |
u16 padding_16; | |
} dpm_descriptor[13]; | |
u16 freq_table_gfx[16]; | |
u16 freq_table_vclk[8]; | |
u16 freq_table_dclk[8]; | |
u16 freq_table_socclk[8]; | |
u16 freq_table_uclk[4]; | |
u16 freq_table_dcefclk[8]; | |
u16 freq_table_dispclk[8]; | |
u16 freq_table_pixclk[8]; | |
u16 freq_table_phyclk[8]; | |
u16 freq_table_dtbclk[8]; | |
u16 freq_table_fclk[8]; | |
u32 padding_clks[16]; | |
u32 dc_mode_max_freq[13]; | |
u8 freq_table_uclk_div[4]; | |
u16 fclk_boost_freq; | |
u16 fclk_param_padding; | |
u16 mp0clk_freq[2]; | |
u16 mp0_dpm_voltage[2]; | |
u16 mem_vddci_voltage[4]; | |
u16 mem_mvdd_voltage[4]; | |
u16 gfxclk_fgfxoff_entry; | |
u16 gfxclk_finit; | |
u16 gfxclk_fidle; | |
u8 gfxclk_source; | |
u8 gfxclk_padding; | |
u8 gfx_gpo_sub_feature_mask; | |
u8 gfx_gpo_enabled_work_policy_mask; | |
u8 gfx_gpo_disabled_work_policy_mask; | |
u8 gfx_gpo_padding; | |
u32 gfx_gpo_voting_allow; | |
u32 gfx_gpo_padding32[4]; | |
u16 gfx_dcs_fopt; | |
u16 gfx_fclk_fopt; | |
u16 gfx_dcs_uclk_fopt; | |
u16 dcs_gfx_off_voltage; | |
u16 dcs_min_gfx_off_time; | |
u16 dcs_max_gfx_off_time; | |
u32 dcs_min_credit_accum; | |
u16 dcs_exit_hysteresis; | |
u16 dcs_timeout; | |
u32 dcs_param_padding[5]; | |
u16 flops_per_byte_table[16]; | |
u8 lowest_uclk_reserved_for_ulv; | |
u8 padding_mem[3]; | |
u8 uclk_dpm_pstates[4]; | |
struct { | |
u16 fmin; | |
u16 fmax; | |
} uclk_dpm_src_freq_range; | |
struct { | |
u16 fmin; | |
u16 fmax; | |
} uclk_dpm_targ_freq_range; | |
u16 uclk_dpm_midstep_freq; | |
u16 uclk_midstep_padding; | |
u8 pcie_gen_speed[2]; | |
u8 pcie_lane_count[2]; | |
u16 lclk_freq[2]; | |
u16 fan_stop_temp; | |
u16 fan_start_temp; | |
u16 fan_gain[10]; | |
u16 fan_pwm_min; | |
u16 fan_acoustic_limit_rpm; | |
u16 fan_throttling_rpm; | |
u16 fan_maximum_rpm; | |
u16 mgpu_fan_boost_limit_rpm; | |
u16 fan_target_temperature; | |
u16 fan_target_gfxclk; | |
u16 fan_padding16; | |
u8 fan_temp_input_select; | |
u8 fan_padding; | |
u8 fan_zero_rpm_enable; | |
u8 fan_tach_edge_per_rev; | |
i16 fuzzy_fan_error_set_delta; | |
i16 fuzzy_fan_error_rate_set_delta; | |
i16 fuzzy_fan_pwm_set_delta; | |
u16 fuzzy_fan_reserved; | |
u8 override_avfs_gb[2]; | |
u8 d_btc_gb_gfx_dfll_model_select; | |
u8 padding8_avfs; | |
struct quadratic_int q_avfs_gb[2]; | |
struct droop_int d_btc_gb_gfx_pll; | |
struct droop_int d_btc_gb_gfx_dfll; | |
struct droop_int d_btc_gb_soc; | |
struct linear_int q_aging_gb[2]; | |
struct { | |
u32 fset[5]; | |
u32 vdroop[5]; | |
} piecewise_linear_droop_int_gfx_dfll; | |
struct quadratic_int q_static_voltage_offset[2]; | |
u16 dc_tol[2]; | |
u8 dc_btc_enabled[2]; | |
u8 padding8_gfx_btc[2]; | |
u16 dc_btc_min[2]; | |
u16 dc_btc_max[2]; | |
u16 dc_btc_gb[2]; | |
u8 xgmi_dpm_pstates[2]; | |
u8 xgmi_dpm_spare[2]; | |
u32 debug_overrides; | |
struct quadratic_int reserved_equation0; | |
struct quadratic_int reserved_equation1; | |
struct quadratic_int reserved_equation2; | |
struct quadratic_int reserved_equation3; | |
u8 customer_variant; | |
u8 vc_btc_enabled; | |
u16 vc_btc_vmin_t0; | |
u16 vc_btc_fixed_vmin_aging_offset; | |
u16 vc_btc_vmin_2_psm_degration_gb; | |
u32 vc_btc_psm_a; | |
u32 vc_btc_psm_b; | |
u32 vc_btc_vmin_a; | |
u32 vc_btc_vmin_b; | |
u32 sku_reserved[9]; | |
u32 gaming_clk[6]; | |
struct { | |
u8 enabled; | |
u8 speed; | |
u8 slave_address; | |
u8 controller_port; | |
u8 controller_name; | |
u8 thermal_throttler; | |
u8 i2c_protocol; | |
u8 padding_config; | |
} i2c_controllers[16]; | |
u8 gpio_scl; | |
u8 gpio_sda; | |
u8 fch_usb_pd_slave_addr; | |
u8 i2c_spare; | |
u8 vdd_gfx_vr_mapping; | |
u8 vdd_soc_vr_mapping; | |
u8 vdd_mem0_vr_mapping; | |
u8 vdd_mem1_vr_mapping; | |
u8 gfx_ulv_phase_shedding_mask; | |
u8 soc_ulv_phase_shedding_mask; | |
u8 vddci_ulv_phase_shedding_mask; | |
u8 mvdd_ulv_phase_shedding_mask; | |
u16 gfx_max_current; | |
i8 gfx_offset; | |
u8 padding_telemetry_gfx; | |
u16 soc_max_current; | |
i8 soc_offset; | |
u8 padding_telemetry_soc; | |
u16 mem0_max_current; | |
i8 mem0_offset; | |
u8 padding_telemetry_mem0; | |
u16 mem1_max_current; | |
i8 mem1_offset; | |
u8 padding_telemetry_mem1; | |
u32 mvdd_ratio; | |
u8 ac_dc_gpio; | |
u8 ac_dc_polarity; | |
u8 vr0_hot_gpio; | |
u8 vr0_hot_polarity; | |
u8 vr1_hot_gpio; | |
u8 vr1_hot_polarity; | |
u8 gthr_gpio; | |
u8 gthr_polarity; | |
u8 led_pin0; | |
u8 led_pin1; | |
u8 led_pin2; | |
u8 led_enable_mask; | |
u8 led_pcie; | |
u8 led_error; | |
u8 led_spare1[2]; | |
u8 pll_gfxclk_spread_enabled; | |
u8 pll_gfxclk_spread_percent; | |
u16 pll_gfxclk_spread_freq; | |
u8 dfll_gfxclk_spread_enabled; | |
u8 dfll_gfxclk_spread_percent; | |
u16 dfll_gfxclk_spread_freq; | |
u16 uclk_spread_padding; | |
u16 uclk_spread_freq; | |
u8 fclk_spread_enabled; | |
u8 fclk_spread_percent; | |
u16 fclk_spread_freq; | |
u32 memory_channel_enabled; | |
u8 dram_bit_width; | |
u8 padding_mem1[3]; | |
u16 total_board_power; | |
u16 board_power_padding; | |
u8 xgmi_link_speed[4]; | |
u8 xgmi_link_width[4]; | |
u16 xgmi_fclk_freq[4]; | |
u16 xgmi_soc_voltage[4]; | |
u8 hsr_enabled; | |
u8 vddq_off_enabled; | |
u8 padding_umc_flags[2]; | |
u8 uclk_spread_percent[16]; | |
u32 board_reserved[11]; | |
u32 mmhub_padding[8]; | |
} __attribute((packed)); | |
static void print_smu_11_0_7_powerplay_table(struct smu_11_0_7_powerplay_table pptable) { | |
printf("structuresize: %u\n", pptable.header.structuresize); | |
printf("format_revision: %u\n", pptable.header.format_revision); | |
printf("content_revision: %u\n", pptable.header.content_revision); | |
printf("table_revision: %u\n", pptable.table_revision); | |
printf("table_size: %u\n", pptable.table_size); | |
printf("golden_pp_id: %u\n", pptable.golden_pp_id); | |
printf("golden_revision: %u\n", pptable.golden_revision); | |
printf("format_id: %u\n", pptable.format_id); | |
printf("platform_caps: %u\n", pptable.platform_caps); | |
printf("thermal_controller_type: %u\n", pptable.thermal_controller_type); | |
printf("small_power_limit1: %u\n", pptable.small_power_limit1); | |
printf("small_power_limit2: %u\n", pptable.small_power_limit2); | |
printf("boost_power_limit: %u\n", pptable.boost_power_limit); | |
printf("software_shutdown_temp: %u\n", pptable.software_shutdown_temp); | |
printf("\n"); | |
print_smu_11_0_power_saving_clock_table(pptable.power_saving_clock); | |
print_smu_11_0_7_overdrive_table(pptable.overdrive_table); | |
printf("version: %u\n", pptable.version); | |
printf("features_to_run[0]: 0x%08x\n", pptable.features_to_run[0]); | |
printf("features_to_run[1]: 0x%08x\n", pptable.features_to_run[1]); | |
printf("\n"); | |
for (u8 i = 0; i < 4; i++) { | |
printf("socket_power_limit_ac[%u]: ", i); | |
printf("%u W - ", pptable.socket_power_limit_ac[i]); | |
printf("%u ms\n", pptable.socket_power_limit_ac_tau[i]); | |
} | |
for (u8 i = 0; i < 4; i++) { | |
printf("socket_power_limit_dc[%u]: ", i); | |
printf("%u W - ", pptable.socket_power_limit_dc[i]); | |
printf("%u ms\n", pptable.socket_power_limit_dc_tau[i]); | |
} | |
printf("\n"); | |
printf("fw_d_state_mask: 0x%08x\n", pptable.fw_d_state_mask); | |
printf("\n"); | |
for (u8 i = 0; i < 2; i++) { | |
printf("freq_table_gfx[%u]: %u\n", i, pptable.freq_table_gfx[i]); | |
} | |
for (u8 i = 0; i < 2; i++) { | |
printf("freq_table_vclk[%u]: %u\n", i, pptable.freq_table_vclk[i]); | |
} | |
for (u8 i = 0; i < 2; i++) { | |
printf("freq_table_dclk[%u]: %u\n", i, pptable.freq_table_dclk[i]); | |
} | |
for (u8 i = 0; i < 2; i++) { | |
printf("freq_table_socclk[%u]: %u\n", i, pptable.freq_table_socclk[i]); | |
} | |
for (u8 i = 0; i < 4; i++) { | |
printf("freq_table_uclk[%u]: %u\n", i, pptable.freq_table_uclk[i]); | |
} | |
for (u8 i = 0; i < 4; i++) { | |
printf("freq_table_uclk_div[%u]: %u\n", i, pptable.freq_table_uclk_div[i]); | |
} | |
printf("\n"); | |
for (u8 i = 0; i < 2; i++) { | |
printf("pcie_gen_speed[%u]: %u\n", i, pptable.pcie_gen_speed[i]); | |
printf("pcie_lane_count[%u]: %u\n", i, pptable.pcie_lane_count[i]); | |
} | |
printf("\n"); | |
printf("0x%08x\n", pptable.memory_channel_enabled); | |
printf("%u\n", pptable.dram_bit_width); | |
printf("%u\n", pptable.total_board_power); | |
printf("%zu\n", sizeof(struct smu_11_0_7_powerplay_table)); | |
printf("\n"); | |
} | |
int main(int argc, char **argv) { | |
int ret = 1; | |
if (argc != 2) { | |
return ret; | |
} | |
size_t size; | |
u8 *data = NULL; | |
if (!read_file(argv[1], &size, &data)) { | |
goto cleanup; | |
} | |
if (size == 1674 || size == 1494) { | |
struct smu_11_0_powerplay_table pptable = *(struct smu_11_0_powerplay_table *)data; | |
print_smu_11_0_powerplay_table(pptable); | |
} else if (size == 2470) { | |
struct smu_11_0_7_powerplay_table pptable = | |
*(struct smu_11_0_7_powerplay_table *)data; | |
print_smu_11_0_7_powerplay_table(pptable); | |
} | |
ret = 0; | |
cleanup: | |
free(data); | |
return ret; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment