45 lines
1.8 KiB
C++
45 lines
1.8 KiB
C++
#include <cpu.hpp>
|
|
|
|
namespace cpu {
|
|
|
|
void detectHwmon(cpuSensors* target, std::string pci) {
|
|
std::string path = "/sys/bus/pci/devices/" + pci + "/hwmon";
|
|
|
|
try {
|
|
for (const auto& entry : std::filesystem::directory_iterator(path))
|
|
target->hwmon = getFirstDir(path);
|
|
} catch (...) {
|
|
log(LOG::ERR, "cpu::detectHwmon", "NO CPU HWMON KERNEL MODULE DETECTED");
|
|
return;
|
|
}
|
|
target->zenpower = readFile((target->hwmon + "/name"), 128) == "zenpower";
|
|
log(LOG::INF, "cpu::detectHwmon", "Detected module \"{}\" in path \"{}\"", target->zenpower ? "zenpower" : "k10temp", target->hwmon);
|
|
}
|
|
|
|
void update(cpuSensors* c) {
|
|
// commented out unused values so its faster
|
|
if (c->hwmon == "") return; // break if no module
|
|
if (c->zenpower) {
|
|
// cpu.tdie = std::stoi(readFile(hw.path + "/temp1_input", 2));
|
|
c->tctl = std::stoi(readFile(c->hwmon + "/temp2_input", 2));
|
|
c->tccd1 = std::stoi(readFile(c->hwmon + "/temp3_input", 2));
|
|
c->pcore = (double)(std::stoi(readFile(c->hwmon + "/power1_input", 3)) / 100.0);
|
|
c->psoc = (double)(std::stoi(readFile(c->hwmon + "/power2_input", 3)) / 100.0);
|
|
c->ptotal = c->pcore + c->psoc;
|
|
c->vcore = (double)(std::stoul(readFile(c->hwmon + "/in1_input", 4)) / 1000.0);
|
|
// cpu.vsoc = (double)(std::stoul(readFile(hw.path + "/in2_input")) / 1000.0);
|
|
} else {
|
|
c->tctl = std::stoi(readFile(c->hwmon + "/temp1_input", 2));
|
|
c->tccd1 = std::stoi(readFile(c->hwmon + "/temp3_input", 2));
|
|
}
|
|
|
|
// lots of reads but still faster than reading /proc/cpuinfo
|
|
char buf[5];
|
|
for (uint8_t i = 0; i < N_CPU; i++) {
|
|
readFile2("/sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq", buf, sizeof(buf));
|
|
c->avg_freq += strtol(buf, NULL, 10);
|
|
}
|
|
c->avg_freq /= N_CPU;
|
|
}
|
|
|
|
} // namespace cpu
|