I have been playing around with CPUFreq governors of the octacore version of the Samsung Galaxy S4 and I forgot what was the default governor device was configured to operate at by Samsung?

  • 1
    What method have you been using to set the governors? Have you seen this question?
    – dotVezz
    Nov 5, 2013 at 13:15
  • I think the OnDemand governor is the default, but I'm not 100% sure.
    – Compro01
    Nov 5, 2013 at 16:13
  • @ dotVezz I rooted the device using oDin and I am writing to /sys/devices/system/cpu/cpuX/cpufreq/scaling_governor the required governor, but I forgot what it was by default. In Quadcore (GT-I9500) it is onDemand but I am not sure in this device. I am doing some experiments related to power consumption and I need to keep it as close to default settings as possible. Nov 6, 2013 at 8:41

1 Answer 1


The default governor on the GT-I9500 is called "ondemand-sec". I'm running the XXUEMJ9 firmware (Android 4.3). It's a modified version of the ondemand governor. Here is a listing in /sys/devices/system/cpu/cpufreq:

root@ja3g:/sys/devices/system/cpu/cpufreq # ls -al
drwxr-xr-x    5 0        0                0 Nov 14 12:38 .
drwxr-xr-x    9 0        0                0 Nov 14 12:38 ..
drwxr-xr-x    2 0        0                0 Nov 14 12:38 iks-cpufreq
drwxr-xr-x    2 0        0                0 Nov 14 12:38 ondemand
drwxrwxrwx    2 0        0                0 Nov 14 12:39 ondemand-sec

root@ja3g:/sys/devices/system/cpu/cpu0/cpufreq # cat scaling_governor          

Frequency Mappings

As for which frequency activates which cores, I can't remember if you can query it through sysfs, but I do remember:

  • Below 600 Mhz, only the A7 cores are active, and they run at a 2x factor. For instance, at 400 Mhz, the A7 cores are actually running at 800 Mhz.
  • Above 600 Mhz, only the A15 cores are active, and they run at a 1x factor. For instance, at 1.2 Ghz, the A15 cores are actually running at 1.2 Ghz.

The frequency mapping can be found in the kernel sources at drivers/cpufreq/exynos-ikcs-cpufreq.c, around line ~56:

#define ACTUAL_FREQ(x, cur) ((cur == CA7) ? (x) << 1 : (x))
#define VIRT_FREQ(x, cur) ((cur == CA7) ? (x) >> 1 : (x))

The first line finds the actual frequency of the core. If the current core is an A7, then we perform a bitshift on the "virtual frequency" by 1 to the left. This is in effect a multiplication by 2.

Much of the rest of the code deals with querying the supported CPU frequencies of each kind of core and merging them to give you the resulting cpufreq table (see cpufreq_merge_tables function around line 197).

More info on how this can be found on this set of slides by Linaro.

Core Status

You can check which cores are active using a device node at /dev/bL_status.

root@ja3g:/dev # cat bL_status
        0 1 2 3 L2 CCI
[A15]   0 0 0 0  0
[A7]    1 1 1 1  1

The above output indicates that only the A7 cores are active.

  • Hey, how can I verify this information you have provided? Is there any way to know when the system switches from A7 to A15 cores and how to make sure that the reported time spent operating at 400 MHz is actually 800 MHz ? Nov 19, 2013 at 8:10
  • You can know when the system switches from the A7 to A15 cores by running cat /dev/bL_status. Amended my answer with the output. However, to verify, I think I might need to check back on the kernel source. Nov 20, 2013 at 21:26
  • Hei, It means I need to compensate the frequencies, for example I was running a Skype call over WLAN and I wrote a script which was reading /sys/devices/system/cpuX/cpufreq/stats/time_in_state and I found that all the four cores were running at 600 MHz all the time, so does it mean the real frequency was 1.2 GHz and In reality A7 were operating at 1.2 GHz ? Your answer created more questions for me, Can you please check this question aswell. tnx Nov 26, 2013 at 13:01

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .