we gotta gather missing metrics from fs after all

This commit is contained in:
Drath
2025-09-20 00:05:05 +02:00
parent 239fbf349e
commit 499eaac37b

View File

@@ -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<metrics::metrics_table_header*>(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