<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.somlabs.com/index.php?action=history&amp;feed=atom&amp;title=Reducing_CPU_frequency_in_iMX8M_processors</id>
	<title>Reducing CPU frequency in iMX8M processors - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.somlabs.com/index.php?action=history&amp;feed=atom&amp;title=Reducing_CPU_frequency_in_iMX8M_processors"/>
	<link rel="alternate" type="text/html" href="https://wiki.somlabs.com/index.php?title=Reducing_CPU_frequency_in_iMX8M_processors&amp;action=history"/>
	<updated>2026-04-28T06:05:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.somlabs.com/index.php?title=Reducing_CPU_frequency_in_iMX8M_processors&amp;diff=4036&amp;oldid=prev</id>
		<title>KrzysztofChojnowski: Created page with &quot;{{PageHeader|Reducing CPU frequency in iMX8M processors}} __toc__  In iMX8M processors a number of core operating frequencies can be defined in order to minimize the power con...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.somlabs.com/index.php?title=Reducing_CPU_frequency_in_iMX8M_processors&amp;diff=4036&amp;oldid=prev"/>
		<updated>2024-10-16T10:08:07Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{PageHeader|Reducing CPU frequency in iMX8M processors}} __toc__  In iMX8M processors a number of core operating frequencies can be defined in order to minimize the power con...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{PageHeader|Reducing CPU frequency in iMX8M processors}} __toc__&lt;br /&gt;
&lt;br /&gt;
In iMX8M processors a number of core operating frequencies can be defined in order to minimize the power consumption. This tutorial presents how to add additional frequencies to the default list and force the kernel driver to use the required one. It was prepared for the Yocto Scarthgap version with meta-somlabs layer.&lt;br /&gt;
&lt;br /&gt;
The default available frequencies defined in dts files are:&lt;br /&gt;
* 1200000000&lt;br /&gt;
* 1600000000&lt;br /&gt;
* 1800000000&lt;br /&gt;
&lt;br /&gt;
Linux uses those values according to the computing power requirements and the currently used governor. The CPU frequency governors policies are described in the kernel docummentation:&lt;br /&gt;
&lt;br /&gt;
https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt&lt;br /&gt;
&lt;br /&gt;
By default the &amp;#039;&amp;#039;ondemand&amp;#039;&amp;#039; governor is used, which automatically chooses the required CPU frequency. It may be verified by reading the sysfs driver file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adding supported frequencies ==&lt;br /&gt;
&lt;br /&gt;
In order to add more supported core frequencies the PLL driver needs to be modified, as well as the dts entries for the device. The following patch adds more available frequencies to the system configuration for iMX8Mmini and iMX8MPlus processors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff --git a/arch/arm64/boot/dts/freescale/imx8mm.dtsi b/arch/arm64/boot/dts/freescale/imx8mm.dtsi&lt;br /&gt;
index abd144c2ea7d..b1a285c41afe 100644&lt;br /&gt;
--- a/arch/arm64/boot/dts/freescale/imx8mm.dtsi&lt;br /&gt;
+++ b/arch/arm64/boot/dts/freescale/imx8mm.dtsi&lt;br /&gt;
@@ -156,6 +156,38 @@ a53_opp_table: opp-table {&lt;br /&gt;
                compatible = &amp;quot;operating-points-v2&amp;quot;;&lt;br /&gt;
                opp-shared;&lt;br /&gt;
&lt;br /&gt;
+               opp-100000000 {&lt;br /&gt;
+                       opp-hz = /bits/ 64 &amp;lt;100000000&amp;gt;;&lt;br /&gt;
+                       opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
+                       opp-supported-hw = &amp;lt;0xe&amp;gt;, &amp;lt;0x7&amp;gt;;&lt;br /&gt;
+                       clock-latency-ns = &amp;lt;150000&amp;gt;;&lt;br /&gt;
+                       opp-suspend;&lt;br /&gt;
+               };&lt;br /&gt;
+&lt;br /&gt;
+               opp-200000000 {&lt;br /&gt;
+                       opp-hz = /bits/ 64 &amp;lt;200000000&amp;gt;;&lt;br /&gt;
+                       opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
+                       opp-supported-hw = &amp;lt;0xe&amp;gt;, &amp;lt;0x7&amp;gt;;&lt;br /&gt;
+                       clock-latency-ns = &amp;lt;150000&amp;gt;;&lt;br /&gt;
+                       opp-suspend;&lt;br /&gt;
+               };&lt;br /&gt;
+&lt;br /&gt;
+               opp-400000000 {&lt;br /&gt;
+                       opp-hz = /bits/ 64 &amp;lt;400000000&amp;gt;;&lt;br /&gt;
+                       opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
+                       opp-supported-hw = &amp;lt;0xe&amp;gt;, &amp;lt;0x7&amp;gt;;&lt;br /&gt;
+                       clock-latency-ns = &amp;lt;150000&amp;gt;;&lt;br /&gt;
+                       opp-suspend;&lt;br /&gt;
+               };&lt;br /&gt;
+&lt;br /&gt;
+               opp-800000000 {&lt;br /&gt;
+                       opp-hz = /bits/ 64 &amp;lt;800000000&amp;gt;;&lt;br /&gt;
+                       opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
+                       opp-supported-hw = &amp;lt;0xe&amp;gt;, &amp;lt;0x7&amp;gt;;&lt;br /&gt;
+                       clock-latency-ns = &amp;lt;150000&amp;gt;;&lt;br /&gt;
+                       opp-suspend;&lt;br /&gt;
+               };&lt;br /&gt;
+&lt;br /&gt;
                opp-1200000000 {&lt;br /&gt;
                        opp-hz = /bits/ 64 &amp;lt;1200000000&amp;gt;;&lt;br /&gt;
                        opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
diff --git a/arch/arm64/boot/dts/freescale/imx8mp.dtsi b/arch/arm64/boot/dts/freescale/imx8mp.dtsi&lt;br /&gt;
index 9335f1713ce6..2b0f57418e66 100644&lt;br /&gt;
--- a/arch/arm64/boot/dts/freescale/imx8mp.dtsi&lt;br /&gt;
+++ b/arch/arm64/boot/dts/freescale/imx8mp.dtsi&lt;br /&gt;
@@ -166,6 +166,38 @@ a53_opp_table: opp-table {&lt;br /&gt;
                compatible = &amp;quot;operating-points-v2&amp;quot;;&lt;br /&gt;
                opp-shared;&lt;br /&gt;
&lt;br /&gt;
+               opp-100000000 {&lt;br /&gt;
+                       opp-hz = /bits/ 64 &amp;lt;100000000&amp;gt;;&lt;br /&gt;
+                       opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
+                       opp-supported-hw = &amp;lt;0x8a0&amp;gt;, &amp;lt;0x7&amp;gt;;&lt;br /&gt;
+                       clock-latency-ns = &amp;lt;150000&amp;gt;;&lt;br /&gt;
+                       opp-suspend;&lt;br /&gt;
+               };&lt;br /&gt;
+&lt;br /&gt;
+               opp-200000000 {&lt;br /&gt;
+                       opp-hz = /bits/ 64 &amp;lt;200000000&amp;gt;;&lt;br /&gt;
+                       opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
+                       opp-supported-hw = &amp;lt;0x8a0&amp;gt;, &amp;lt;0x7&amp;gt;;&lt;br /&gt;
+                       clock-latency-ns = &amp;lt;150000&amp;gt;;&lt;br /&gt;
+                       opp-suspend;&lt;br /&gt;
+               };&lt;br /&gt;
+&lt;br /&gt;
+               opp-400000000 {&lt;br /&gt;
+                       opp-hz = /bits/ 64 &amp;lt;400000000&amp;gt;;&lt;br /&gt;
+                       opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
+                       opp-supported-hw = &amp;lt;0x8a0&amp;gt;, &amp;lt;0x7&amp;gt;;&lt;br /&gt;
+                       clock-latency-ns = &amp;lt;150000&amp;gt;;&lt;br /&gt;
+                       opp-suspend;&lt;br /&gt;
+               };&lt;br /&gt;
+&lt;br /&gt;
+               opp-800000000 {&lt;br /&gt;
+                       opp-hz = /bits/ 64 &amp;lt;800000000&amp;gt;;&lt;br /&gt;
+                       opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
+                       opp-supported-hw = &amp;lt;0x8a0&amp;gt;, &amp;lt;0x7&amp;gt;;&lt;br /&gt;
+                       clock-latency-ns = &amp;lt;150000&amp;gt;;&lt;br /&gt;
+                       opp-suspend;&lt;br /&gt;
+               };&lt;br /&gt;
+&lt;br /&gt;
                opp-1200000000 {&lt;br /&gt;
                        opp-hz = /bits/ 64 &amp;lt;1200000000&amp;gt;;&lt;br /&gt;
                        opp-microvolt = &amp;lt;850000&amp;gt;;&lt;br /&gt;
diff --git a/drivers/clk/imx/clk-pll14xx.c b/drivers/clk/imx/clk-pll14xx.c&lt;br /&gt;
index 6c17786ecb9f..7701e6e2f4cc 100644&lt;br /&gt;
--- a/drivers/clk/imx/clk-pll14xx.c&lt;br /&gt;
+++ b/drivers/clk/imx/clk-pll14xx.c&lt;br /&gt;
@@ -56,7 +56,10 @@ static const struct imx_pll14xx_rate_table imx_pll1416x_tbl[] = {&lt;br /&gt;
        PLL_1416X_RATE(700000000U,  350, 3, 2),&lt;br /&gt;
        PLL_1416X_RATE(640000000U,  320, 3, 2),&lt;br /&gt;
        PLL_1416X_RATE(600000000U,  300, 3, 2),&lt;br /&gt;
+       PLL_1416X_RATE(400000000U,  200, 3, 2),&lt;br /&gt;
        PLL_1416X_RATE(320000000U,  160, 3, 2),&lt;br /&gt;
+       PLL_1416X_RATE(200000000U,  200, 3, 3),&lt;br /&gt;
+       PLL_1416X_RATE(100000000U,  200, 3, 4),&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 static const struct imx_pll14xx_rate_table imx_pll1443x_tbl[] = {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that 800MHz frequency is already defined in the PLL driver. This driver sets the PLL parameters according to the defined macro:&lt;br /&gt;
&lt;br /&gt;
PLL_1416X_RATE(Fout,  M, P, S)&lt;br /&gt;
&lt;br /&gt;
The Fout is calculated as follows:&lt;br /&gt;
&lt;br /&gt;
Fout = 32MHz * M / (P * 2^S)&lt;br /&gt;
&lt;br /&gt;
This patch can be added to meta-somlabs layer in order to build it together with the default system image. The created patch file should be placed in &amp;#039;&amp;#039;meta-somlabs/recipes-kernel/linux/linux-imx&amp;#039;&amp;#039; directory and the following line should be added to the the kernel recipe &amp;#039;&amp;#039;meta-somlabs/recipes-kernel/linux//linux-imx_6.6.bbappend&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SRC_URI += &amp;quot;file://frequency.patch&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;frequency.patch&amp;#039;&amp;#039; file should be changed according to the added patch file in &amp;#039;&amp;#039;linux-imx&amp;#039;&amp;#039; directory.&lt;br /&gt;
&lt;br /&gt;
== Verifying core frequency ==&lt;br /&gt;
&lt;br /&gt;
Setting the core frequency can be easily tested using &amp;#039;&amp;#039;userspace&amp;#039;&amp;#039; governor which allows for manual configuration. The frequency is set in kHz. For example the following lines set the CPU frequency to 100MHz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo userspace &amp;gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor&lt;br /&gt;
echo 100000 &amp;gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The execution time can be then measured using simple script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo userspace &amp;gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor&lt;br /&gt;
echo 100000 &amp;gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed&lt;br /&gt;
time bash -c &amp;quot;for i in {1..1000000}; do :; done&amp;quot;&lt;br /&gt;
&lt;br /&gt;
real    2m39.501s&lt;br /&gt;
user    2m32.015s&lt;br /&gt;
sys     0m3.861s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo userspace &amp;gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor&lt;br /&gt;
echo 1600000 &amp;gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed&lt;br /&gt;
time bash -c &amp;quot;for i in {1..1000000}; do :; done&amp;quot;&lt;br /&gt;
&lt;br /&gt;
real    0m11.525s&lt;br /&gt;
user    0m11.154s&lt;br /&gt;
sys     0m0.330s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>KrzysztofChojnowski</name></author>
	</entry>
</feed>