diff --git a/src/gpu.cpp b/src/gpu.cpp index 1ca1c79..e5809a2 100644 --- a/src/gpu.cpp +++ b/src/gpu.cpp @@ -17,8 +17,8 @@ void detectHwmon(sensors* target, std::string pci) { } } -void updateFromFs(sensors* g) { - // these are always read from fs +/* some metrics are missing in gpu_metrics, we always fill them from fs */ +void fillMissingMetrics(sensors* g) { g->fan_speed = std::stol(readFile(g->hwmon + "/fan1_input", 4)); g->vcore = std::stol(readFile(g->hwmon + "/in0_input", 4)) / 1000.0f; g->power_cap = std::stol(readFile(g->hwmon + "/power1_cap", 16)) / 1000000; @@ -26,7 +26,10 @@ void updateFromFs(sensors* g) { g->fan_pwm = std::stoi(readFile(g->hwmon + "/pwm1", 4)) * 100 / 256; g->vram_used = std::stoul(readFile(g->hwmon + "/../../mem_info_vram_used", 16)); g->vram_total = std::stoul(readFile(g->hwmon + "/../../mem_info_vram_total", 16)); +} +/* get sensors for pre-vega cards (rx480/580) */ +void updateFromFs(sensors* g) { g->core_clock = std::stoll(readFile(g->hwmon + "/freq1_input", 16)) / 1000000; g->mem_clock = std::stoll(readFile(g->hwmon + "/freq2_input", 16)) / 1000000; g->power_avg = std::stol(readFile(g->hwmon + "/power1_input", 16)) / 1000000; @@ -34,6 +37,7 @@ void updateFromFs(sensors* g) { g->core_usage = std::stoi(readFile(g->hwmon + "/../../gpu_busy_percent")); } +/* get sensors for vega and newer (rx5700xt, rx7800xt [*]) */ void updateFromMetrics(sensors* g) { char raw_metrics[MAX_METRICS_LENGTH]; if (!readFile2(g->hwmon + REL_METRICS_PATH, raw_metrics, sizeof(raw_metrics))) return; @@ -41,9 +45,10 @@ void updateFromMetrics(sensors* g) { auto header = reinterpret_cast(raw_metrics); switch (header->format_revision * 10 + header->content_revision) { - /* rx5700xt?, rx7800xt */ + /* rx5700xt, rx7800xt */ case 13: { METRICS_IS(metrics::gpu_metrics_v1_3); + // rx7800xt g->core_clock = metrics->average_vclk1_frequency; // why not gfxclock? g->mem_clock = metrics->average_gfxclk_frequency; // why gfxclock? min mem clock seems to be 96mhz, this is probably including time sleeping g->core_usage = metrics->average_gfx_activity; @@ -56,7 +61,11 @@ void updateFromMetrics(sensors* g) { g->soc_vrm_temp = metrics->temperature_vrsoc; g->mem_vrm_temp = metrics->temperature_vrmem; g->power_avg = metrics->average_socket_power; - // some are missing, we used to read them form fs for some reason + g->fan_speed = metrics->current_fan_speed; + + // hacks for rx5700xt + g->core_clock = metrics->average_gfxclk_frequency; + g->mem_clock = metrics->current_uclk * 2; // mem controller clock, actual mem is 2x that. average shows 871-872 break; } @@ -67,7 +76,7 @@ void updateFromMetrics(sensors* g) { break; } - /* werid hardware i probably dont like */ + /* werid hardware i probably dont like, maybe fallback to reading from fs? */ default: { std::println("[gpu::updateFromMetrics] Unsupported gpu_metrics_v{}_{}", header->format_revision, header->content_revision); break; @@ -77,6 +86,8 @@ void updateFromMetrics(sensors* g) { /* reads values from system and updates the target gpu::sensors struct */ void update(sensors* g) { + fillMissingMetrics(g); + if (g->hasGpuMetrics) gpu::updateFromMetrics(g); else