gpu refactor
This commit is contained in:
56
src/gpu.cpp
56
src/gpu.cpp
@@ -1,7 +1,7 @@
|
||||
#include <gpu.hpp>
|
||||
|
||||
/* maybe have a read pp_table function */
|
||||
/* would be neat to wrap it in a class but eh */
|
||||
/* would be neat to wrap it in a class but eh namespace is good enough */
|
||||
|
||||
namespace gpu {
|
||||
|
||||
@@ -19,22 +19,22 @@ void detectHwmon(sensors* target, std::string pci) {
|
||||
|
||||
/* 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;
|
||||
g->power_max = std::stol(readFile(g->hwmon + "/power1_cap_max", 16)) / 1000000;
|
||||
g->fan_pwm = std::stoi(readFile(g->hwmon + "/pwm1", 4)) * 100 / 256;
|
||||
g->fan_speed = std::stol(readFile(g->hwmon + "/fan1_input", 4));
|
||||
g->power_cap = std::stol(readFile(g->hwmon + "/power1_cap", 16)) / 1000000;
|
||||
g->power_cap_max = std::stol(readFile(g->hwmon + "/power1_cap_max", 16)) / 1000000;
|
||||
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->clock_core = std::stoll(readFile(g->hwmon + "/freq1_input", 16)) / 1000000;
|
||||
g->clock_mem = std::stoll(readFile(g->hwmon + "/freq2_input", 16)) / 1000000;
|
||||
g->power_avg = std::stol(readFile(g->hwmon + "/power1_input", 16)) / 1000000;
|
||||
g->edge_temp = std::stol(readFile(g->hwmon + "/temp1_input", 2));
|
||||
g->core_usage = std::stoi(readFile(g->hwmon + "/../../gpu_busy_percent"));
|
||||
g->temp_edge = std::stol(readFile(g->hwmon + "/temp1_input", 2));
|
||||
g->usage_core = std::stoi(readFile(g->hwmon + "/../../gpu_busy_percent"));
|
||||
}
|
||||
|
||||
/* get sensors for vega and newer (rx5700xt, rx7800xt [*]) */
|
||||
@@ -44,35 +44,37 @@ void updateFromMetrics(sensors* g) {
|
||||
|
||||
auto header = reinterpret_cast<metrics::metrics_table_header*>(raw_metrics);
|
||||
switch (header->format_revision * 10 + header->content_revision) {
|
||||
|
||||
/* 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;
|
||||
g->media_usage = metrics->average_mm_activity;
|
||||
g->umc_usage = metrics->average_umc_activity;
|
||||
g->edge_temp = metrics->temperature_edge;
|
||||
g->hotspot_temp = metrics->temperature_hotspot;
|
||||
g->mem_temp = metrics->temperature_mem;
|
||||
g->gfx_vrm_temp = metrics->temperature_vrgfx;
|
||||
g->soc_vrm_temp = metrics->temperature_vrsoc;
|
||||
g->mem_vrm_temp = metrics->temperature_vrmem;
|
||||
auto metrics = reinterpret_cast<metrics::gpu_metrics_v1_3*>(raw_metrics);
|
||||
g->usage_core = metrics->average_gfx_activity;
|
||||
g->usage_umc = metrics->average_umc_activity;
|
||||
g->usage_media = metrics->average_mm_activity;
|
||||
|
||||
g->temp_edge = metrics->temperature_edge;
|
||||
g->temp_hotspot = metrics->temperature_hotspot;
|
||||
g->temp_mem = metrics->temperature_mem;
|
||||
|
||||
g->temp_vrm_gfx = metrics->temperature_vrgfx;
|
||||
g->temp_vrm_soc = metrics->temperature_vrsoc;
|
||||
g->temp_vrm_mem = metrics->temperature_vrmem;
|
||||
g->power_avg = metrics->average_socket_power;
|
||||
g->fan_speed = metrics->current_fan_speed;
|
||||
|
||||
// hacks for rx7800xt
|
||||
// g->clock_core = metrics->average_vclk1_frequency; // why not gfxclock?
|
||||
// g->clock_mem = metrics->average_gfxclk_frequency; // why gfxclock? min mem clock seems to be 96mhz, this is probably including time sleeping
|
||||
|
||||
// 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
|
||||
g->clock_core = metrics->average_gfxclk_frequency;
|
||||
g->clock_mem = metrics->average_uclk_frequency * 2; // mem controller clock, actual mem is 2x that
|
||||
break;
|
||||
}
|
||||
|
||||
/* ryzen 5 5600g */
|
||||
case 22: {
|
||||
METRICS_IS(metrics::gpu_metrics_v2_2);
|
||||
g->edge_temp = metrics->temperature_gfx / 100;
|
||||
auto metrics = reinterpret_cast<metrics::gpu_metrics_v2_2*>(raw_metrics);
|
||||
g->temp_edge = metrics->temperature_gfx / 100;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -92,6 +94,8 @@ void update(sensors* g) {
|
||||
gpu::updateFromMetrics(g);
|
||||
else
|
||||
gpu::updateFromFs(g);
|
||||
|
||||
if (g->fan_speed > 9999) g->fan_speed = 9999; // sanity check fan speed
|
||||
}
|
||||
|
||||
} // namespace gpu
|
||||
Reference in New Issue
Block a user