cpufreq: teach cpuinfo_{min,max}_freq as available frequencies
authorTakeshi Banse <takebi@laafc.net>
Sat, 29 Nov 2014 07:39:41 +0000 (16:39 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Sat, 29 Nov 2014 07:39:42 +0000 (16:39 +0900)
Summary:
The intel_pstate scaling driver exposes the `scaling_cur_freq` since
kernel 3.17 [*], it would be fine that the min and max frequencies
are known even without the `scaling_available_frequencie`.

This commit teaches to use the cpuinfo_{min,max}_freq as fallback in
case the `scaling_available_frequencies` is not available within
intel pstate.

[*] https://lkml.org/lkml/2014/11/11/1060

Signed-off-by: Takeshi Banse <takebi@laafc.net>
Subscribers: cedric

Differential Revision: https://phab.enlightenment.org/D1686

src/modules/cpufreq/e_mod_main.c

index 7ffdcbe..ea09eea 100644 (file)
@@ -301,7 +301,8 @@ _button_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED_
           }
 
         if ((cpufreq_config->status->frequencies) &&
-            (cpufreq_config->status->can_set_frequency))
+            (cpufreq_config->status->can_set_frequency) &&
+            (!cpufreq_config->status->pstate))
           {
              mo = e_menu_new();
              cpufreq_config->menu_frequency = mo;
@@ -766,6 +767,42 @@ _cpufreq_status_check_available(Cpu_Status *s)
                                         eina_list_count(s->frequencies),
                                         _cpufreq_cb_sort);
      }
+   else
+     do
+       {
+#define CPUFREQ_SYSFSDIR "/sys/devices/system/cpu/cpu0/cpufreq"
+          f = fopen(CPUFREQ_SYSFSDIR "/scaling_cur_freq", "r");
+          if (!f) break;
+          fclose(f);
+
+          f = fopen(CPUFREQ_SYSFSDIR "/scaling_driver", "r");
+          if (!f) break;
+          if (fgets(buf, sizeof(buf), f) == NULL)
+            {
+               fclose(f);
+               break;
+            }
+          fclose(f);
+          if (strcmp(buf, "intel_pstate\n")) break;
+
+          if (s->frequencies)
+            {
+               eina_list_free(s->frequencies);
+               s->frequencies = NULL;
+            }
+#define CPUFREQ_ADDF(filename) \
+          f = fopen(CPUFREQ_SYSFSDIR filename, "r"); \
+          if (f) \
+            { \
+               if (fgets(buf, sizeof(buf), f) != NULL) \
+                 s->frequencies = eina_list_append(s->frequencies, \
+                                                   (void *)(long)(atoi(buf))); \
+               fclose(f); \
+            }
+          CPUFREQ_ADDF("/cpuinfo_min_freq");
+          CPUFREQ_ADDF("/cpuinfo_max_freq");
+       }
+     while (0);
 
    f = fopen("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors", "r");
    if (f)