Skip to content

Commit 264b679

Browse files
committed
CPU (Linux): detect bios limited frequency and print it by default
To match neofetch's behavior Fix #947
1 parent a8b734c commit 264b679

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

src/detection/cpu/cpu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ typedef struct FFCPUResult
2222
double frequencyBase; // GHz
2323
double frequencyMax; // GHz
2424
double frequencyMin; // GHz
25+
double frequencyBiosLimit; // GHz
2526

2627
FFCPUCore coreTypes[16]; // number of P cores, E cores, etc.
2728

2829
double temperature;
2930
} FFCPUResult;
3031

31-
const char* ffCPUDetectByCpuid(FFCPUResult* cpu);
3232
const char* ffDetectCPU(const FFCPUOptions* options, FFCPUResult* cpu);
3333
const char* ffCPUAppleCodeToName(uint32_t code);

src/detection/cpu/cpu_linux.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ static bool detectFrequency(FFCPUResult* cpu)
150150
else
151151
cpu->frequencyBase = fbase;
152152
}
153+
uint32_t fbioslimit = getFrequency(&path, "/bios_limit", NULL, &buffer);
154+
if (fbioslimit > 0)
155+
{
156+
if (cpu->frequencyBiosLimit == cpu->frequencyBiosLimit)
157+
cpu->frequencyBiosLimit = cpu->frequencyBiosLimit > fbioslimit ? cpu->frequencyBiosLimit : fbioslimit;
158+
else
159+
cpu->frequencyBiosLimit = fbioslimit;
160+
}
153161
uint32_t fmax = getFrequency(&path, "/cpuinfo_max_freq", "/scaling_max_freq", &buffer);
154162
if (fmax > 0)
155163
{
@@ -167,7 +175,7 @@ static bool detectFrequency(FFCPUResult* cpu)
167175
cpu->frequencyMin = fmin;
168176
}
169177

170-
uint32_t freq = fbase <= 0 ? fmax : fbase; // seems base frequencies are more stable
178+
uint32_t freq = fbase == 0 ? fmax : fbase; // seems base frequencies are more stable
171179
uint32_t ifreq = 0;
172180
while (cpu->coreTypes[ifreq].freq != freq && cpu->coreTypes[ifreq].freq > 0)
173181
++ifreq;
@@ -180,6 +188,7 @@ static bool detectFrequency(FFCPUResult* cpu)
180188
cpu->frequencyBase /= 1e6;
181189
cpu->frequencyMax /= 1e6;
182190
cpu->frequencyMin /= 1e6;
191+
cpu->frequencyBiosLimit /= 1e6;
183192
return true;
184193
}
185194

src/modules/cpu/cpu.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "modules/cpu/cpu.h"
77
#include "util/stringUtils.h"
88

9-
#define FF_CPU_NUM_FORMAT_ARGS 9
9+
#define FF_CPU_NUM_FORMAT_ARGS 10
1010

1111
static int sortCores(const FFCPUCore* a, const FFCPUCore* b)
1212
{
@@ -20,6 +20,7 @@ void ffPrintCPU(FFCPUOptions* options)
2020
.frequencyMin = 0.0/0.0,
2121
.frequencyMax = 0.0/0.0,
2222
.frequencyBase = 0.0/0.0,
23+
.frequencyBiosLimit = 0.0/0.0,
2324
.name = ffStrbufCreate(),
2425
.vendor = ffStrbufCreate()
2526
};
@@ -55,7 +56,9 @@ void ffPrintCPU(FFCPUOptions* options)
5556
if(cpu.coresOnline > 1)
5657
ffStrbufAppendF(&str, " (%u)", cpu.coresOnline);
5758

58-
double freq = cpu.frequencyMax;
59+
double freq = cpu.frequencyBiosLimit;
60+
if(freq <= 0.0000001)
61+
freq = cpu.frequencyMax;
5962
if(freq <= 0.0000001)
6063
freq = cpu.frequencyBase;
6164
if(freq > 0.0000001)
@@ -84,9 +87,19 @@ void ffPrintCPU(FFCPUOptions* options)
8487
else
8588
ffStrbufAppendF(&coreTypes, "%u", cpu.coresOnline);
8689

87-
char freqBase[32], freqMax[32];
88-
snprintf(freqBase, sizeof(freqBase), "%.*f", options->freqNdigits, cpu.frequencyBase);
89-
snprintf(freqMax, sizeof(freqMax), "%.*f", options->freqNdigits, cpu.frequencyMax);
90+
char freqBase[32], freqMax[32], freqBioslimit[32];
91+
if (cpu.frequencyBase > 0)
92+
snprintf(freqBase, sizeof(freqBase), "%.*f", options->freqNdigits, cpu.frequencyBase);
93+
else
94+
freqBase[0] = 0;
95+
if (cpu.frequencyMax > 0)
96+
snprintf(freqMax, sizeof(freqMax), "%.*f", options->freqNdigits, cpu.frequencyMax);
97+
else
98+
freqMax[0] = 0;
99+
if (cpu.frequencyBiosLimit > 0)
100+
snprintf(freqBioslimit, sizeof(freqBioslimit), "%.*f", options->freqNdigits, cpu.frequencyBiosLimit);
101+
else
102+
freqBioslimit[0] = 0;
90103

91104
FF_STRBUF_AUTO_DESTROY tempStr = ffStrbufCreate();
92105
ffTempsAppendNum(cpu.temperature, &tempStr, options->tempConfig, &options->moduleArgs);
@@ -100,6 +113,7 @@ void ffPrintCPU(FFCPUOptions* options)
100113
{FF_FORMAT_ARG_TYPE_STRING, freqMax},
101114
{FF_FORMAT_ARG_TYPE_STRBUF, &tempStr},
102115
{FF_FORMAT_ARG_TYPE_STRBUF, &coreTypes},
116+
{FF_FORMAT_ARG_TYPE_STRING, freqBioslimit},
103117
}));
104118
}
105119
}
@@ -173,6 +187,7 @@ void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_
173187
.frequencyMin = 0.0/0.0,
174188
.frequencyMax = 0.0/0.0,
175189
.frequencyBase = 0.0/0.0,
190+
.frequencyBiosLimit = 0.0/0.0,
176191
.name = ffStrbufCreate(),
177192
.vendor = ffStrbufCreate()
178193
};
@@ -202,6 +217,7 @@ void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_
202217
yyjson_mut_obj_add_real(doc, frequency, "base", cpu.frequencyBase);
203218
yyjson_mut_obj_add_real(doc, frequency, "max", cpu.frequencyMax);
204219
yyjson_mut_obj_add_real(doc, frequency, "min", cpu.frequencyMin);
220+
yyjson_mut_obj_add_real(doc, frequency, "biosLimit", cpu.frequencyBiosLimit);
205221

206222
yyjson_mut_val* coreTypes = yyjson_mut_obj_add_arr(doc, obj, "coreTypes");
207223
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)
230246
"Max frequency",
231247
"Temperature (formatted)",
232248
"Logical core count grouped by frequency",
249+
"Bios limited frequency",
233250
}));
234251
}
235252

0 commit comments

Comments
 (0)