.. include:: /keyword.rst ===================== CPU Frequency Scaling ===================== MediaTek IoT platform supports dynamic CPU frequency scaling to allow users to adjust CPU frequencies at runtime to meet requirements of applications. |IOT-YOCTO| implements the driver which leverages Linux CPUFreq framework to provide the capability. The de-facto, familiar user space interfaces are provided so that developers can use their own tools to tweak system performance. For more information about Linux CPUFreq subsystem, please refer to `kernel document `_ and `Arch Linux wiki `_. The following sections will describe cpufreq interface provided by |IOT-YOCTO|. .. contents:: Sections :local: :depth: 1 sysfs attributes ================ We can list content of the directory ``/sys/devices/system/cpu/cpufreq``: .. prompt:: bash # auto # ls -l /sys/devices/system/cpu/cpufreq total 0 drwxr-xr-x 4 root root 0 Sep 20 10:46 policy0 Where the subfolder ``policyX`` represents a policy object in cpufreq subsystem, which is a set of CPUs sharing the same P-state controlling interface. In the ``policyX`` subfolder, there are sysfs attributes exported: .. prompt:: bash # auto # ls -l /sys/devices/system/cpu/cpufreq/policyX total 0 -r--r--r-- 1 root root 4096 Sep 20 17:29 affected_cpus -r-------- 1 root root 4096 Sep 20 17:54 cpuinfo_cur_freq -r--r--r-- 1 root root 4096 Sep 20 17:54 cpuinfo_max_freq -r--r--r-- 1 root root 4096 Sep 20 17:54 cpuinfo_min_freq -r--r--r-- 1 root root 4096 Sep 20 17:54 cpuinfo_transition_latency -r--r--r-- 1 root root 4096 Sep 20 17:29 related_cpus -r--r--r-- 1 root root 4096 Sep 20 17:54 scaling_available_frequencies -r--r--r-- 1 root root 4096 Sep 20 17:54 scaling_available_governors -r--r--r-- 1 root root 4096 Sep 20 10:46 scaling_cur_freq -r--r--r-- 1 root root 4096 Sep 20 17:54 scaling_driver -rw-r--r-- 1 root root 4096 Sep 20 10:47 scaling_governor -rw-r--r-- 1 root root 4096 Sep 20 17:54 scaling_max_freq -rw-r--r-- 1 root root 4096 Sep 20 17:54 scaling_min_freq -rw-r--r-- 1 root root 4096 Sep 20 17:54 scaling_setspeed drwxr-xr-x 2 root root 0 Sep 20 17:54 schedutil drwxr-xr-x 2 root root 0 Sep 20 17:54 stats To read CPUs belonging to this policy object, run the command: .. prompt:: bash # auto # cat /sys/devices/system/cpu/cpufreq/policyX/related_cpus 0 1 2 3 Note that all policy-specific operations (e.g. changing governor, setting frequencies, etc.) affects all CPUs belonging to the same policy. To read current CPU frequency, run the command: .. prompt:: bash # auto # cat /sys/devices/system/cpu/cpufreq/policyX/scaling_cur_freq 1308000 Note the unit of the value is KHz. To list current supported frequencies, run: .. prompt:: bash # auto # cat /sys/devices/system/cpu/cpufreq/policyX/scaling_available_frequencies To list current supported frequency governors, run: .. prompt:: bash # auto # cat /sys/devices/system/cpu/cpufreq/policyX/scaling_available_governors ondemand userspace performance schedutil Note the default governor is *schedutil*, which uses CPU utilization data of the in-kernel scheduler to determine CPU frequencies. To keep CPU running at the highest frequency, run: .. prompt:: bash # auto # echo performance > /sys/devices/system/cpu/cpufreq/policyX/scaling_governor Note the highest frequency will be capped by the frequency set in ``scaling_max_freq``. The user can use the attribute to limit the highest frequency the governor can set. To disable automatic scaling in kernel and let userspace application determine frequencies, run: .. prompt:: bash # auto # echo userspace > /sys/devices/system/cpu/cpufreq/policyX/scaling_governor # echo > /sys/devices/system/cpu/cpufreq/policyX/scaling_setspeed Statistics ========== If the kernel configuration *CONFIG_CPU_FREQ_STAT* is enabled, another subfolder ``stats`` will be created under the ``policyX`` folder, which contains read-only attributes to examine statistics. Here is list of attributes: .. prompt:: bash # auto # ls -l > /sys/devices/system/cpu/cpufreq/policyX/stats total 0 --w------- 1 root root 4096 Sep 20 14:27 reset -r--r--r-- 1 root root 4096 Sep 20 13:58 time_in_state -r--r--r-- 1 root root 4096 Sep 20 13:58 total_trans -r--r--r-- 1 root root 4096 Sep 20 13:58 trans_table To read the amount of time spent in each frequency, run: .. prompt:: bash # auto # cat /sys/devices/system/cpu/cpufreq/policyX/stats/time_in_state 850000 1334115 918000 166 987000 72 1056000 31 1125000 5 1216000 16 1308000 130 1400000 14 1466000 19 1533000 4 1633000 3 1700000 3 1767000 8674 1834000 1713 1917000 1 2001000 233393 The first column represents the supported frequency, and the second one is the time the CPU spends at that frequency. The time unit is 10ms. The attribute *total_trans* gives total number of frequency transition happened: .. prompt:: bash # auto # cat /sys/devices/system/cpu/cpufreq/policyX/stats/total_trans 533 The attribute *trans_table* gives detailed information of frequency transition: .. code:: text # cat /sys/devices/system/cpu/cpufreq/policyX/stats/trans_table From : To : 850000 918000 987000 1056000 1125000 1216000 1308000 1400000 1466000 ... 850000: 0 15 11 4 1 1 126 5 2 918000: 18 0 2 0 0 1 1 0 1 987000: 18 1 0 1 0 1 1 0 0 1056000: 6 1 1 0 1 0 2 1 0 1125000: 1 2 3 1 0 2 0 0 2 1216000: 3 3 1 4 4 0 6 1 0 1308000: 107 0 4 1 3 14 0 11 1 1400000: 10 0 0 1 0 1 5 0 6 1466000: 2 0 0 0 2 1 0 4 0 ... The output is a two dimension matrix with *i* rows and *j* columns, where each cell represents the number of transition happened from *Freq_i* to *Freq_j*. The counters in statistics are accumulated since the driver (cpufreq_stats) is loaded or counters are reset. The counters can be reset by running the command: .. prompt:: bash # auto # echo 1 > /sys/devices/system/cpu/cpufreq/policyX/stats/reset Note the value written to the attribute doesn't matter. It is the write operation causing reset of counters.