From aa1a5b8c362e4a795ab4c29fc8b9afb1967bece1 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Tue, 21 May 2024 08:44:49 +0800 Subject: [PATCH 1/4] CPU: fix CPU frequency not displayed if `bios_limit` doesn't exist Regression of 264b6794f3d10a9bd0f021d6ae149b47ee7ae9fa --- src/modules/cpu/cpu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index 5ec868c8c..e64094366 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -57,9 +57,9 @@ void ffPrintCPU(FFCPUOptions* options) ffStrbufAppendF(&str, " (%u)", cpu.coresOnline); double freq = cpu.frequencyBiosLimit; - if(freq <= 0.0000001) + if(!(freq > 0.0000001)) freq = cpu.frequencyMax; - if(freq <= 0.0000001) + if(!(freq > 0.0000001)) freq = cpu.frequencyBase; if(freq > 0.0000001) ffStrbufAppendF(&str, " @ %.*f GHz", options->freqNdigits, freq); From 2d4e7f10c4954a1f8559fb362f75aa0a8afdb3ab Mon Sep 17 00:00:00 2001 From: Carter Li Date: Tue, 21 May 2024 09:09:08 +0800 Subject: [PATCH 2/4] CPU: add option `--show-pe-core-count` --- doc/json_schema.json | 5 ++++ src/data/help.json | 9 ++++++ src/detection/cpu/cpu_apple.c | 2 +- src/detection/cpu/cpu_bsd.c | 15 ++++++---- src/detection/cpu/cpu_linux.c | 21 ++++++++------ src/detection/cpu/cpu_windows.c | 6 +++- src/modules/cpu/cpu.c | 51 ++++++++++++++++++++++----------- src/modules/cpu/option.h | 1 + 8 files changed, 77 insertions(+), 33 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index 51b3301d8..0b1fe82f0 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -1074,6 +1074,11 @@ "maximum": 9, "default": 2 }, + "showPeCoreCount": { + "description": "Detect and display CPU frequency of different core types (eg. Pcore and Ecore) if supported", + "type": "boolean", + "default": false + }, "key": { "$ref": "#/$defs/key" }, diff --git a/src/data/help.json b/src/data/help.json index 74dde8d45..54215df2b 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -1152,6 +1152,15 @@ "default": 2 } }, + { + "long": "cpu-show-pe-core-count", + "desc": "Detect and display CPU frequency of different core types (eg. Pcore and Ecore) if supported", + "arg": { + "type": "bool", + "optional": true, + "default": false + } + }, { "long": "cpuusage-separate", "desc": "Display CPU usage per CPU logical core, instead of an average result", diff --git a/src/detection/cpu/cpu_apple.c b/src/detection/cpu/cpu_apple.c index efffa6d41..e33916558 100644 --- a/src/detection/cpu/cpu_apple.c +++ b/src/detection/cpu/cpu_apple.c @@ -121,7 +121,7 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) cpu->coresOnline = (uint16_t) ffSysctlGetInt("hw.activecpu", 1); detectFrequency(cpu); - detectCoreCount(cpu); + if (options->showPeCoreCount) detectCoreCount(cpu); cpu->temperature = options->temp ? detectCpuTemp(&cpu->name) : FF_CPU_TEMP_UNSET; diff --git a/src/detection/cpu/cpu_bsd.c b/src/detection/cpu/cpu_bsd.c index 80f767ca8..b52cd7c1f 100644 --- a/src/detection/cpu/cpu_bsd.c +++ b/src/detection/cpu/cpu_bsd.c @@ -56,12 +56,15 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) if (!(cpu->frequencyMin <= fmin)) cpu->frequencyMin = fmin; // Counting for NaN if (!(cpu->frequencyMax >= fmax)) cpu->frequencyMax = fmax; - uint32_t ifreq = 0; - while (cpu->coreTypes[ifreq].freq != fmax && cpu->coreTypes[ifreq].freq > 0) - ++ifreq; - if (cpu->coreTypes[ifreq].freq == 0) - cpu->coreTypes[ifreq].freq = fmax; - cpu->coreTypes[ifreq].count++; + if (options->showPeCoreCount) + { + uint32_t ifreq = 0; + while (cpu->coreTypes[ifreq].freq != fmax && cpu->coreTypes[ifreq].freq > 0) + ++ifreq; + if (cpu->coreTypes[ifreq].freq == 0) + cpu->coreTypes[ifreq].freq = fmax; + cpu->coreTypes[ifreq].count++; + } } } cpu->frequencyMin /= 1000; diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index c4c040bb2..ac5c895e4 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -127,7 +127,7 @@ static uint8_t getNumCores(FFstrbuf* basePath, FFstrbuf* buffer) return 0; } -static bool detectFrequency(FFCPUResult* cpu) +static bool detectFrequency(FFCPUResult* cpu, const FFCPUOptions* options) { FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateS("/sys/devices/system/cpu/cpufreq/"); FF_AUTO_CLOSE_DIR DIR* dir = opendir(path.chars); @@ -175,13 +175,16 @@ static bool detectFrequency(FFCPUResult* cpu) cpu->frequencyMin = fmin; } - 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; - if (cpu->coreTypes[ifreq].freq == 0) - cpu->coreTypes[ifreq].freq = freq; - cpu->coreTypes[ifreq].count += getNumCores(&path, &buffer); + if (options->showPeCoreCount) + { + 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; + if (cpu->coreTypes[ifreq].freq == 0) + cpu->coreTypes[ifreq].freq = freq; + cpu->coreTypes[ifreq].count += getNumCores(&path, &buffer); + } ffStrbufSubstrBefore(&path, baseLen); } } @@ -270,7 +273,7 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) cpu->coresOnline = (uint16_t) get_nprocs(); cpu->coresPhysical = (uint16_t) ffStrbufToUInt(&physicalCoresBuffer, cpu->coresLogical); - if (!detectFrequency(cpu) || cpu->frequencyBase != cpu->frequencyBase) + if (!detectFrequency(cpu, options) || cpu->frequencyBase != cpu->frequencyBase) cpu->frequencyBase = ffStrbufToDouble(&cpuMHz) / 1000; if(cpuUarch.length > 0) diff --git a/src/detection/cpu/cpu_windows.c b/src/detection/cpu/cpu_windows.c index 9e27c7eba..e0904ac07 100644 --- a/src/detection/cpu/cpu_windows.c +++ b/src/detection/cpu/cpu_windows.c @@ -157,6 +157,10 @@ static const char* detectByRegistry(FFCPUResult* cpu) cpu->coresOnline = cpu->coresPhysical = cpu->coresLogical = (uint16_t) cores; } + uint32_t mhz; + if(ffRegReadUint(hKey, L"~MHz", &mhz, NULL)) + cpu->frequencyBase = mhz / 1000.0; + return NULL; } @@ -190,7 +194,7 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) return error; detectSpeedByCpuid(cpu); - detectCoreTypes(cpu); + if (options->showPeCoreCount) detectCoreTypes(cpu); if (cpu->frequencyMax != cpu->frequencyMax) detectMaxSpeedBySmbios(cpu); diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index e64094366..d7ed70baa 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -37,6 +37,20 @@ void ffPrintCPU(FFCPUOptions* options) } else { + FF_STRBUF_AUTO_DESTROY coreTypes = ffStrbufCreate(); + if (options->showPeCoreCount) + { + uint32_t typeCount = 0; + while (cpu.coreTypes[typeCount].count != 0 && typeCount < sizeof(cpu.coreTypes) / sizeof(cpu.coreTypes[0])) typeCount++; + if (typeCount > 0) + { + qsort(cpu.coreTypes, typeCount, sizeof(cpu.coreTypes[0]), (void*) sortCores); + + for (uint32_t i = 0; i < typeCount; i++) + ffStrbufAppendF(&coreTypes, "%s%u", i == 0 ? "" : "+", cpu.coreTypes[i].count); + } + } + if(options->moduleArgs.outputFormat.length == 0) { ffPrintLogoAndKey(FF_CPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT); @@ -53,7 +67,9 @@ void ffPrintCPU(FFCPUOptions* options) else ffStrbufAppendS(&str, "Unknown"); - if(cpu.coresOnline > 1) + if(coreTypes.length > 0) + ffStrbufAppendF(&str, " (%s)", coreTypes.chars); + else if(cpu.coresOnline > 1) ffStrbufAppendF(&str, " (%u)", cpu.coresOnline); double freq = cpu.frequencyBiosLimit; @@ -74,19 +90,6 @@ void ffPrintCPU(FFCPUOptions* options) } else { - FF_STRBUF_AUTO_DESTROY coreTypes = ffStrbufCreate(); - uint32_t typeCount = 0; - while (cpu.coreTypes[typeCount].count != 0 && typeCount < sizeof(cpu.coreTypes) / sizeof(cpu.coreTypes[0])) typeCount++; - if (typeCount > 0) - { - qsort(cpu.coreTypes, typeCount, sizeof(cpu.coreTypes[0]), (void*) sortCores); - - for (uint32_t i = 0; i < typeCount; i++) - ffStrbufAppendF(&coreTypes, "%s%u", i == 0 ? "" : "+", cpu.coreTypes[i].count); - } - else - ffStrbufAppendF(&coreTypes, "%u", cpu.coresOnline); - char freqBase[32], freqMax[32], freqBioslimit[32]; if (cpu.frequencyBase > 0) snprintf(freqBase, sizeof(freqBase), "%.*f", options->freqNdigits, cpu.frequencyBase); @@ -122,7 +125,7 @@ void ffPrintCPU(FFCPUOptions* options) ffStrbufDestroy(&cpu.vendor); } -bool ffParseCPUCPUOptions(FFCPUOptions* options, const char* key, const char* value) +bool ffParseCPUCommandOptions(FFCPUOptions* options, const char* key, const char* value) { const char* subKey = ffOptionTestPrefix(key, FF_CPU_MODULE_NAME); if (!subKey) return false; @@ -138,6 +141,12 @@ bool ffParseCPUCPUOptions(FFCPUOptions* options, const char* key, const char* va return true; } + if (ffStrEqualsIgnCase(subKey, "show-pe-core-count")) + { + options->showPeCoreCount = ffOptionParseBoolean(value); + return true; + } + return false; } @@ -163,6 +172,12 @@ void ffParseCPUJsonObject(FFCPUOptions* options, yyjson_val* module) continue; } + if (ffStrEqualsIgnCase(key, "showPeCoreCount")) + { + options->showPeCoreCount = yyjson_get_bool(val); + continue; + } + ffPrintError(FF_CPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); } } @@ -178,6 +193,9 @@ void ffGenerateCPUJsonConfig(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_ if (defaultOptions.freqNdigits != options->freqNdigits) yyjson_mut_obj_add_uint(doc, module, "freqNdigits", options->freqNdigits); + + if (defaultOptions.showPeCoreCount != options->showPeCoreCount) + yyjson_mut_obj_add_bool(doc, module, "showPeCoreCount", options->showPeCoreCount); } void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) @@ -256,7 +274,7 @@ void ffInitCPUOptions(FFCPUOptions* options) &options->moduleInfo, FF_CPU_MODULE_NAME, "Print CPU name, frequency, etc", - ffParseCPUCPUOptions, + ffParseCPUCommandOptions, ffParseCPUJsonObject, ffPrintCPU, ffGenerateCPUJsonResult, @@ -267,6 +285,7 @@ void ffInitCPUOptions(FFCPUOptions* options) options->temp = false; options->tempConfig = (FFColorRangeConfig) { 60, 80 }; options->freqNdigits = 2; + options->showPeCoreCount = false; } void ffDestroyCPUOptions(FFCPUOptions* options) diff --git a/src/modules/cpu/option.h b/src/modules/cpu/option.h index 1fee8a3d6..fc2c6d174 100644 --- a/src/modules/cpu/option.h +++ b/src/modules/cpu/option.h @@ -12,4 +12,5 @@ typedef struct FFCPUOptions bool temp; FFColorRangeConfig tempConfig; uint8_t freqNdigits; + bool showPeCoreCount; } FFCPUOptions; From 28f2e9ea96694557fde9fe6f15cb98605414221a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 21 May 2024 09:22:02 +0800 Subject: [PATCH 3/4] Release: v2.13.1 --- CHANGELOG.md | 10 ++++++++++ CMakeLists.txt | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9daf30a80..a0ce8b65c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# 2.13.1 + +Fix a regression introduced in v2.13.0 + +Bugfixes: +* Fix CPU frequency not displayed if `bios_limit` is not available (CPU, Linux) + +Features: +* Add `--cpu-show-pe-core-count` to detect and display core count for performance / efficiency cores (CPU, FreeBSD) + # 2.13.0 Changes: diff --git a/CMakeLists.txt b/CMakeLists.txt index e3c528cc1..bd65343cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.12.0) # target_link_libraries with OBJECT libs & project homepage url project(fastfetch - VERSION 2.13.0 + VERSION 2.13.1 LANGUAGES C DESCRIPTION "Fast neofetch-like system information tool" HOMEPAGE_URL "https://github.com/fastfetch-cli/fastfetch" From 01d1336cf0d445fac5bde058554ddca13b890dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 21 May 2024 09:28:21 +0800 Subject: [PATCH 4/4] CPU (FreeBSD): remove unused variables --- src/detection/cpu/cpu_bsd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/detection/cpu/cpu_bsd.c b/src/detection/cpu/cpu_bsd.c index b52cd7c1f..582053eac 100644 --- a/src/detection/cpu/cpu_bsd.c +++ b/src/detection/cpu/cpu_bsd.c @@ -39,7 +39,6 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu) } } - uint32_t ifreq = (uint32_t) -1; for (uint16_t i = 0; i < cpu->coresLogical; ++i) { ffStrbufClear(&buffer);