From 264b6794f3d10a9bd0f021d6ae149b47ee7ae9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 20 May 2024 18:33:47 +0800 Subject: [PATCH] CPU (Linux): detect bios limited frequency and print it by default To match neofetch's behavior Fix #947 --- src/detection/cpu/cpu.h | 2 +- src/detection/cpu/cpu_linux.c | 11 ++++++++++- src/modules/cpu/cpu.c | 27 ++++++++++++++++++++++----- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/detection/cpu/cpu.h b/src/detection/cpu/cpu.h index 2c69487bb..fc9b7e080 100644 --- a/src/detection/cpu/cpu.h +++ b/src/detection/cpu/cpu.h @@ -22,12 +22,12 @@ typedef struct FFCPUResult double frequencyBase; // GHz double frequencyMax; // GHz double frequencyMin; // GHz + double frequencyBiosLimit; // GHz FFCPUCore coreTypes[16]; // number of P cores, E cores, etc. double temperature; } FFCPUResult; -const char* ffCPUDetectByCpuid(FFCPUResult* cpu); const char* ffDetectCPU(const FFCPUOptions* options, FFCPUResult* cpu); const char* ffCPUAppleCodeToName(uint32_t code); diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index 6034bd5de..c4c040bb2 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -150,6 +150,14 @@ static bool detectFrequency(FFCPUResult* cpu) else cpu->frequencyBase = fbase; } + uint32_t fbioslimit = getFrequency(&path, "/bios_limit", NULL, &buffer); + if (fbioslimit > 0) + { + if (cpu->frequencyBiosLimit == cpu->frequencyBiosLimit) + cpu->frequencyBiosLimit = cpu->frequencyBiosLimit > fbioslimit ? cpu->frequencyBiosLimit : fbioslimit; + else + cpu->frequencyBiosLimit = fbioslimit; + } uint32_t fmax = getFrequency(&path, "/cpuinfo_max_freq", "/scaling_max_freq", &buffer); if (fmax > 0) { @@ -167,7 +175,7 @@ static bool detectFrequency(FFCPUResult* cpu) cpu->frequencyMin = fmin; } - uint32_t freq = fbase <= 0 ? fmax : fbase; // seems base frequencies are more stable + uint32_t freq = fbase == 0 ? fmax : fbase; // seems base frequencies are more stable uint32_t ifreq = 0; while (cpu->coreTypes[ifreq].freq != freq && cpu->coreTypes[ifreq].freq > 0) ++ifreq; @@ -180,6 +188,7 @@ static bool detectFrequency(FFCPUResult* cpu) cpu->frequencyBase /= 1e6; cpu->frequencyMax /= 1e6; cpu->frequencyMin /= 1e6; + cpu->frequencyBiosLimit /= 1e6; return true; } diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index b32cd7f8f..5ec868c8c 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -6,7 +6,7 @@ #include "modules/cpu/cpu.h" #include "util/stringUtils.h" -#define FF_CPU_NUM_FORMAT_ARGS 9 +#define FF_CPU_NUM_FORMAT_ARGS 10 static int sortCores(const FFCPUCore* a, const FFCPUCore* b) { @@ -20,6 +20,7 @@ void ffPrintCPU(FFCPUOptions* options) .frequencyMin = 0.0/0.0, .frequencyMax = 0.0/0.0, .frequencyBase = 0.0/0.0, + .frequencyBiosLimit = 0.0/0.0, .name = ffStrbufCreate(), .vendor = ffStrbufCreate() }; @@ -55,7 +56,9 @@ void ffPrintCPU(FFCPUOptions* options) if(cpu.coresOnline > 1) ffStrbufAppendF(&str, " (%u)", cpu.coresOnline); - double freq = cpu.frequencyMax; + double freq = cpu.frequencyBiosLimit; + if(freq <= 0.0000001) + freq = cpu.frequencyMax; if(freq <= 0.0000001) freq = cpu.frequencyBase; if(freq > 0.0000001) @@ -84,9 +87,19 @@ void ffPrintCPU(FFCPUOptions* options) else ffStrbufAppendF(&coreTypes, "%u", cpu.coresOnline); - char freqBase[32], freqMax[32]; - snprintf(freqBase, sizeof(freqBase), "%.*f", options->freqNdigits, cpu.frequencyBase); - snprintf(freqMax, sizeof(freqMax), "%.*f", options->freqNdigits, cpu.frequencyMax); + char freqBase[32], freqMax[32], freqBioslimit[32]; + if (cpu.frequencyBase > 0) + snprintf(freqBase, sizeof(freqBase), "%.*f", options->freqNdigits, cpu.frequencyBase); + else + freqBase[0] = 0; + if (cpu.frequencyMax > 0) + snprintf(freqMax, sizeof(freqMax), "%.*f", options->freqNdigits, cpu.frequencyMax); + else + freqMax[0] = 0; + if (cpu.frequencyBiosLimit > 0) + snprintf(freqBioslimit, sizeof(freqBioslimit), "%.*f", options->freqNdigits, cpu.frequencyBiosLimit); + else + freqBioslimit[0] = 0; FF_STRBUF_AUTO_DESTROY tempStr = ffStrbufCreate(); ffTempsAppendNum(cpu.temperature, &tempStr, options->tempConfig, &options->moduleArgs); @@ -100,6 +113,7 @@ void ffPrintCPU(FFCPUOptions* options) {FF_FORMAT_ARG_TYPE_STRING, freqMax}, {FF_FORMAT_ARG_TYPE_STRBUF, &tempStr}, {FF_FORMAT_ARG_TYPE_STRBUF, &coreTypes}, + {FF_FORMAT_ARG_TYPE_STRING, freqBioslimit}, })); } } @@ -173,6 +187,7 @@ void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_ .frequencyMin = 0.0/0.0, .frequencyMax = 0.0/0.0, .frequencyBase = 0.0/0.0, + .frequencyBiosLimit = 0.0/0.0, .name = ffStrbufCreate(), .vendor = ffStrbufCreate() }; @@ -202,6 +217,7 @@ void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_ yyjson_mut_obj_add_real(doc, frequency, "base", cpu.frequencyBase); yyjson_mut_obj_add_real(doc, frequency, "max", cpu.frequencyMax); yyjson_mut_obj_add_real(doc, frequency, "min", cpu.frequencyMin); + yyjson_mut_obj_add_real(doc, frequency, "biosLimit", cpu.frequencyBiosLimit); yyjson_mut_val* coreTypes = yyjson_mut_obj_add_arr(doc, obj, "coreTypes"); for (uint32_t i = 0; i < sizeof (cpu.coreTypes) / sizeof (cpu.coreTypes[0]) && cpu.coreTypes[i].count > 0; i++) @@ -230,6 +246,7 @@ void ffPrintCPUHelpFormat(void) "Max frequency", "Temperature (formatted)", "Logical core count grouped by frequency", + "Bios limited frequency", })); }