According to our AM3356 efuses (0x44E10600 is 0x0001fef), it supports a CPU clock of 300MHz only. Our U-Boot and Linux configuration is based on the AM3356 EVM from the Arago Processor SDK. Looking at the U-Boot code, our board code uses the following MPU PLL configuration:
const struct dpll_params *get_dpll_mpu_params(void)
{
int ind = get_sys_clk_index();
int freq = am335x_get_efuse_mpu_max_freq(cdev);
switch (freq) {
[...]
case MPUPLL_M_300:
return &dpll_mpu_opp[ind][0];
}
[...]
}
const struct dpll_params dpll_mpu_opp[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
[...]
{ /* 25 MHz */
{24, 0, 2, -1, -1, -1, -1}, /* OPP 50 */
[...]
We can confirm that these are the PLL settings actually used (M2 = 2).
Question 1: What is the resulting CPU frequency? Is it 25MHz * 24 = 600MHz or 25MHz * 24 / 2 = 300MHz?
When Linux starts, it computes the CPU clock using MPU PLL N and M only (not M2) and assumes the CPU is running at 600MHz:
[ 1.365424] cpufreq: cpufreq_online: CPU0: Running at unlisted freq: 600000 KHz
Question 2: Is it correct that Linux uses CPU clock "dpll_mpu_ck" as CPU clock source and not "dpll_mpu_m2_ck"?
Using our efuse value 0x0001fef, the only compatible OPP according to arch/arm/boot/dts/am33xx.dtsi is "opp50-300000000":
cpu0_opp_table: opp-table {
compatible = "operating-points-v2-ti-cpu";
syscon = <&scm_conf>;
/*
* The three following nodes are marked with opp-suspend
* because the can not be enabled simultaneously on a
* single SoC.
*/
opp50-300000000 {
opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <950000 931000 969000>;
opp-supported-hw = <0x06 0x0010>;
opp-suspend;
};
opp100-275000000 {
opp-hz = /bits/ 64 <275000000>;
opp-microvolt = <1100000 1078000 1122000>;
opp-supported-hw = <0x01 0x00FF>;
opp-suspend;
};
opp100-300000000 {
opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <1100000 1078000 1122000>;
opp-supported-hw = <0x06 0x0020>;
opp-suspend;
};
opp100-500000000 {
opp-hz = /bits/ 64 <500000000>;
opp-microvolt = <1100000 1078000 1122000>;
opp-supported-hw = <0x01 0xFFFF>;
};
opp100-600000000 {
opp-hz = /bits/ 64 <600000000>;
opp-microvolt = <1100000 1078000 1122000>;
opp-supported-hw = <0x06 0x0040>;
};
opp120-600000000 {
opp-hz = /bits/ 64 <600000000>;
opp-microvolt = <1200000 1176000 1224000>;
opp-supported-hw = <0x01 0xFFFF>;
};
[...]
Question 3: Shouldn't "opp100-300000000" be also a compatible mode?
Disabling the cpufreq driver in Linux speeds up the Linux boot process considerably compared to operation at "opp50-300000000". We assume that the MPU PLL settings from U-Boot are left unchanged in this case.
Question 4: Why does it make a difference whether the Linux cpufreq driver is enabled or not if U-Boot configures the MPU PLL correctly to 300MHz?