2022-09-04 22:20:12 +02:00
|
|
|
#include "cpu.h"
|
|
|
|
|
#include "common/io.h"
|
|
|
|
|
#include "common/properties.h"
|
2022-09-25 15:23:00 +08:00
|
|
|
#include "detection/temps/temps_linux.h"
|
2022-09-04 22:20:12 +02:00
|
|
|
|
2022-12-28 17:18:08 +08:00
|
|
|
#include <sys/sysinfo.h>
|
2022-09-04 22:20:12 +02:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
2022-11-24 23:29:46 +08:00
|
|
|
static void parseCpuInfo(FFCPUResult* cpu, FFstrbuf* physicalCoresBuffer, FFstrbuf* cpuMHz)
|
2022-09-04 22:20:12 +02:00
|
|
|
{
|
|
|
|
|
FILE* cpuinfo = fopen("/proc/cpuinfo", "r");
|
|
|
|
|
if(cpuinfo == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
char* line = NULL;
|
|
|
|
|
size_t len = 0;
|
|
|
|
|
|
|
|
|
|
while(getline(&line, &len, cpuinfo) != -1)
|
|
|
|
|
{
|
|
|
|
|
//Stop after the first CPU
|
|
|
|
|
if(cpu->name.length > 0 && (*line == '\0' || *line == '\n'))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
(void)(
|
|
|
|
|
ffParsePropLine(line, "model name :", &cpu->name) ||
|
|
|
|
|
ffParsePropLine(line, "vendor_id :", &cpu->vendor) ||
|
|
|
|
|
ffParsePropLine(line, "cpu cores :", physicalCoresBuffer) ||
|
2022-11-24 23:29:46 +08:00
|
|
|
ffParsePropLine(line, "cpu MHz :", cpuMHz) ||
|
2022-09-04 22:20:12 +02:00
|
|
|
(cpu->name.length == 0 && ffParsePropLine(line, "Hardware :", &cpu->name)) //For Android devices
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(line != NULL)
|
|
|
|
|
free(line);
|
|
|
|
|
|
|
|
|
|
fclose(cpuinfo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static double getGHz(const char* file)
|
|
|
|
|
{
|
|
|
|
|
FFstrbuf content;
|
|
|
|
|
ffStrbufInit(&content);
|
2022-11-24 23:29:46 +08:00
|
|
|
if(ffAppendFileBuffer(file, &content))
|
|
|
|
|
{
|
|
|
|
|
double herz = ffStrbufToDouble(&content);
|
|
|
|
|
ffStrbufDestroy(&content);
|
2022-09-04 22:20:12 +02:00
|
|
|
|
2022-11-24 23:29:46 +08:00
|
|
|
//ffStrbufToDouble failed
|
|
|
|
|
if(herz != herz)
|
|
|
|
|
return 0;
|
2022-09-04 22:20:12 +02:00
|
|
|
|
2022-11-24 23:29:46 +08:00
|
|
|
herz /= 1000.0; //to MHz
|
|
|
|
|
return herz / 1000.0; //to GHz
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2022-09-04 22:20:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static double getFrequency(const char* info, const char* scaling)
|
|
|
|
|
{
|
|
|
|
|
double frequency = getGHz(info);
|
|
|
|
|
if(frequency > 0.0)
|
|
|
|
|
return frequency;
|
|
|
|
|
|
|
|
|
|
return getGHz(scaling);
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-24 15:59:36 +02:00
|
|
|
static double detectCPUTemp(const FFinstance* instance)
|
2022-09-04 22:20:12 +02:00
|
|
|
{
|
2022-09-24 15:59:36 +02:00
|
|
|
const FFTempsResult* temps = ffDetectTemps(instance);
|
2022-09-04 22:20:12 +02:00
|
|
|
|
|
|
|
|
for(uint32_t i = 0; i < temps->values.length; i++)
|
|
|
|
|
{
|
|
|
|
|
FFTempValue* value = ffListGet(&temps->values, i);
|
|
|
|
|
|
|
|
|
|
if(
|
|
|
|
|
ffStrbufFirstIndexS(&value->name, "cpu") < value->name.length ||
|
|
|
|
|
ffStrbufCompS(&value->name, "k10temp") == 0 ||
|
|
|
|
|
ffStrbufCompS(&value->name, "coretemp") == 0
|
|
|
|
|
) return value->value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FF_CPU_TEMP_UNSET;
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-17 11:39:10 +08:00
|
|
|
void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu)
|
2022-09-04 22:20:12 +02:00
|
|
|
{
|
2022-09-26 11:06:21 +08:00
|
|
|
if(instance->config.cpuTemp)
|
|
|
|
|
cpu->temperature = detectCPUTemp(instance);
|
|
|
|
|
else
|
|
|
|
|
cpu->temperature = FF_CPU_TEMP_UNSET;
|
2022-09-24 15:59:36 +02:00
|
|
|
|
2022-09-04 22:20:12 +02:00
|
|
|
FFstrbuf physicalCoresBuffer;
|
|
|
|
|
ffStrbufInit(&physicalCoresBuffer);
|
|
|
|
|
|
2022-11-24 23:29:46 +08:00
|
|
|
FFstrbuf cpuMHz;
|
|
|
|
|
ffStrbufInit(&cpuMHz);
|
|
|
|
|
|
|
|
|
|
parseCpuInfo(cpu, &physicalCoresBuffer, &cpuMHz);
|
2022-09-04 22:20:12 +02:00
|
|
|
|
|
|
|
|
cpu->coresPhysical = ffStrbufToUInt16(&physicalCoresBuffer, 1);
|
2022-09-19 19:31:29 +02:00
|
|
|
|
2022-12-28 17:18:08 +08:00
|
|
|
cpu->coresLogical = (uint16_t) get_nprocs_conf();
|
|
|
|
|
cpu->coresOnline = (uint16_t) get_nprocs();
|
2022-09-04 22:20:12 +02:00
|
|
|
|
|
|
|
|
#define BP "/sys/devices/system/cpu/cpufreq/policy0/"
|
2022-11-24 23:29:46 +08:00
|
|
|
if(ffFileExists(BP, S_IFDIR))
|
|
|
|
|
{
|
|
|
|
|
cpu->frequencyMin = getFrequency(BP"cpuinfo_min_freq", BP"scaling_min_freq");
|
|
|
|
|
cpu->frequencyMax = getFrequency(BP"cpuinfo_max_freq", BP"scaling_max_freq");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
cpu->frequencyMin = cpu->frequencyMax = ffStrbufToDouble(&cpuMHz) / 1000;
|
|
|
|
|
}
|
2022-09-04 22:20:12 +02:00
|
|
|
|
|
|
|
|
ffStrbufDestroy(&physicalCoresBuffer);
|
2022-11-24 23:29:46 +08:00
|
|
|
ffStrbufDestroy(&cpuMHz);
|
2022-09-04 22:20:12 +02:00
|
|
|
}
|