@@ -94,11 +94,14 @@ static double getFrequency(FFstrbuf* basePath, const char* cpuinfoFileName, cons
9494 if (ok )
9595 return ffStrbufToDouble (buffer ) / 1e6 ;
9696
97- ffStrbufAppendS (basePath , scalingFileName );
98- ok = ffReadFileBuffer (basePath -> chars , buffer );
99- ffStrbufSubstrBefore (basePath , baseLen );
100- if (ok )
101- return ffStrbufToDouble (buffer ) / 1e6 ;
97+ if (scalingFileName )
98+ {
99+ ffStrbufAppendS (basePath , scalingFileName );
100+ ok = ffReadFileBuffer (basePath -> chars , buffer );
101+ ffStrbufSubstrBefore (basePath , baseLen );
102+ if (ok )
103+ return ffStrbufToDouble (buffer ) / 1e6 ;
104+ }
102105
103106 return 0.0 /0.0 ;
104107}
@@ -111,34 +114,41 @@ static bool detectFrequency(FFCPUResult* cpu)
111114
112115 FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate ();
113116 uint32_t baseLen = path .length ;
114- bool flag = false;
115117
116118 struct dirent * entry ;
117119 while ((entry = readdir (dir )) != NULL )
118120 {
119121 if (ffStrStartsWith (entry -> d_name , "policy" ) && isdigit (entry -> d_name [strlen ("policy" )]))
120122 {
121123 ffStrbufAppendS (& path , entry -> d_name );
122- double fmin = getFrequency (& path , "/cpuinfo_min_freq" , "/scaling_min_freq" , & buffer );
123- if (fmin != fmin ) continue ;
124+ double fbase = getFrequency (& path , "/base_frequency" , NULL , & buffer );
125+ if (fbase == fbase )
126+ {
127+ if (cpu -> frequencyBase == cpu -> frequencyBase )
128+ cpu -> frequencyBase = cpu -> frequencyBase > fbase ? cpu -> frequencyBase : fbase ;
129+ else
130+ cpu -> frequencyBase = fbase ;
131+ }
124132 double fmax = getFrequency (& path , "/cpuinfo_max_freq" , "/scaling_max_freq" , & buffer );
125- if (fmax != fmax ) continue ;
126-
127- if (flag )
133+ if (fmax == fmax )
128134 {
129- cpu -> frequencyMin = cpu -> frequencyMin < fmin ? cpu -> frequencyMin : fmin ;
130- cpu -> frequencyMax = cpu -> frequencyMax > fmax ? cpu -> frequencyMax : fmax ;
135+ if (cpu -> frequencyMax == cpu -> frequencyMax )
136+ cpu -> frequencyMax = cpu -> frequencyMax > fmax ? cpu -> frequencyMax : fmax ;
137+ else
138+ cpu -> frequencyMax = fmax ;
131139 }
132- else
140+ double fmin = getFrequency (& path , "/cpuinfo_min_freq" , "/scaling_min_freq" , & buffer );
141+ if (fmin == fmin )
133142 {
134- cpu -> frequencyMin = fmin ;
135- cpu -> frequencyMax = fmax ;
136- flag = true;
143+ if (cpu -> frequencyMin == cpu -> frequencyMin )
144+ cpu -> frequencyMin = cpu -> frequencyMin < fmin ? cpu -> frequencyMin : fmin ;
145+ else
146+ cpu -> frequencyMin = fmin ;
137147 }
138148 ffStrbufSubstrBefore (& path , baseLen );
139149 }
140150 }
141- return flag ;
151+ return true ;
142152}
143153
144154static double detectCPUTemp (void )
@@ -234,8 +244,8 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
234244 cpu -> coresOnline = (uint16_t ) get_nprocs ();
235245 cpu -> coresPhysical = (uint16_t ) ffStrbufToUInt (& physicalCoresBuffer , cpu -> coresLogical );
236246
237- if (!detectFrequency (cpu ))
238- cpu -> frequencyMin = cpu -> frequencyMax = ffStrbufToDouble (& cpuMHz ) / 1000 ;
247+ if (!detectFrequency (cpu ) || cpu -> frequencyBase != cpu -> frequencyBase )
248+ cpu -> frequencyBase = ffStrbufToDouble (& cpuMHz ) / 1000 ;
239249
240250 if (cpuUarch .length > 0 )
241251 {
0 commit comments