This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM3356:CPU 时钟父级、U-Boot 与 Linux

Guru**** 1761415 points
Other Parts Discussed in Thread: AM3356
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/948247/am3356-cpu-clock-parent-u-boot-vs-linux

器件型号:AM3356

根据我们的 AM3356电子保险丝(0x44E10600为0x0001fef)、它仅支持300MHz 的 CPU 时钟。 我们的 U-Boot 和 Linux 配置基于 Arago 处理器 SDK 中的 AM3356 EVM。 查看 U-Boot 代码、我们的板级代码使用以下 MPU PLL 配置:

const 结构 DPLL_params * get_DPLL_MPU_params (void)

   int ind = get_sys_clk_index();
   int freq = AM335x_get_efuse_mpu_max_freq (cdev);

   开关(freq){
[...]
   MPUPLL_M_300案例:
      返回&DPLL_MPU_opp[ind][0];
   }
[...]

const 结构 DPLL_params DPLL_MPU_opp[NUM_CRYSTRAL_FREQ][NUM_OPPS]={
[...]
   {   /* 25MHz */
      {24、0、2、-1、-1、 -1、-1}、   /* OPP 50 */
[...]

我们可以确认这些是实际使用的 PLL 设置(M2 = 2)。

问题1:产生的 CPU 频率是多少? 是25MHz * 24 = 600MHz 还是25MHz * 24 / 2 = 300MHz?

当 Linux 启动时、它 仅使用 MPU PLL N 和 M (而不是 M2)计算 CPU 时钟、并假设 CPU 以600MHz 运行:

[1.365424]   cpufreq:cpufreq_online:cpu0:以未列出的 freq 运行:600000 KHz

问题2:Linux 是否正确使用 CPU 时钟"DPLL_MPU_ck "作为 CPU 时钟源而不是"DPLL_MPU_m2_ck "?

使用我们的 efuse 值0x0001fef、根据 arch/arm/boot/dts/am33xx.dtsi、唯一兼容的 OPP 是"opp50-3000000":

   CPU0_opp_table:opp-table{
      兼容="操作点 v2-ti-cpu";
      SYSCON =<&SCM_conf>;

      /*
      *以下三个节点标有 opp-suspend
      因为不能在上同时启用
      *单个 SoC。
      *
      opp50-300000000{
         opp-Hz =/bits/64 <300000000>;
         op-microvolt =<950000 931000 96900000>;
         opp-supported-HW =<0x06 0x0010>;
         opp-suspend;
      };

      opp100-275000000{
         opp-Hz =/bits/64 <275000000>;
         op-microvolt =<1100000 1078000 1122000>;
         opp-supported-HW =<0x01 0x00FF>;
         opp-suspend;
      };

      opp100-300000000{
         opp-Hz =/bits/64 <300000000>;
         op-microvolt =<1100000 1078000 1122000>;
         opp-supported-HW =<0x06 0x0020>;
         opp-suspend;
      };

      opp100-500000000{
         opp-Hz =/bits/64 <500000000>;
         op-microvolt =<1100000 1078000 1122000>;
         opp-supported-HW =<0x01 0xFFF>;
      };

      opp100-600000000{
         opp-Hz =/bits/64 <6000000000000>;
         op-microvolt =<1100000 1078000 1122000>;
         opp-supported-HW =<0x06 0x0040>;
      };

      opp120-600000000{
         opp-Hz =/bits/64 <6000000000000>;
         op-microvolt =<1200000 1176000 1224000>;
         opp-supported-HW =<0x01 0xFFF>;
      };
[...]

问题3:"opp100-300000000"也不应该是兼容模式?

在 Linux 中禁用 cpufreq 驱动程序与"opp50-300000000"下的操作相比、显著加快了 Linux 启动过程。 我们假设 U-Boot 中的 MPU PLL 设置在本例中保持不变。

问题4:如果 U-Boot 将 MPU PLL 正确配置为300MHz、为什么 Linux cpufreq 驱动程序是否启用有所不同?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Christoph、
    感谢您对问题的详细描述。
    在 AM335x 上、SPL/u-boot 根据读取 CM EFUSE_SMA 寄存器@44E107Fc 来设置器件支持的最大速度。
    在我的 AM335x GP EVM 上、器件为1GHz 器件、如下所示、u-boot 配置
    get_DPLL_MPU_params ()基于 freq=AM335x_get_efuse_MPU_max_freq (cdev)、其中对于1GHz 器件、freq = 0x3E8 (1000)。

    devmem2 0x44e107fc
    /dev/mem 已打开。
    映射到地址 bb6efe000的内存。
    在地址0x44E107FC (bb6efe7fc):0x00013C2F 处读取 

    启用动态电压和频率调节(DVFS)后、Linux 内核会根据需要动态调节电压和频率、
    用户首选项或其他因素。 有关 DVFS 框架的详细信息、请参阅以下链接。
    software-dl.ti.com/.../Power_Management.html
    我在具有1GHz 器件的 AM335x GP EVM 上捕获了 DVFS 的一些日志。

    root@AM335x-hs-evm:~
    
    @~ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available__frequencies 300000 720000 800000 1000000 root
    
    
    
    @AM335x-hs-evm:
    
    ~ cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq 600000 root@AM335x-dt-evm:~# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq 600000 root@AM335x-hs-evm:~ü
    
    @cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available__governors usspace powersave onDemand performance root~ AM335x-evms:/sys/devices/system/cpu/cpu0/cpufreq/scaling_driver root am335x-hs-cpui-frands
    root:am-cpu-evm /sys/devices/system/cpu/cpu0/cpufreq/stats/trans_table
    :300000 600000 720000 800000 1000000
    300000: 0 129. 14. 15. 59
    600000: 126. 0 9. 7. 44
    720000: 20. 7. 0 4. 21
    800000: 22. 9. 2. 0 29
    1000000: 49 42. 27. 36. 0
    root 用户@AM335x-hs-evm:~# cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_statte
    300000 79303
    600000 610
    720000 131
    800000 186
    1000000 3556 

    最棒的

    -香港

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Hong、

    感谢您的快速回答。 我们理解 DVFS 的概念、但在本例中、只有50@300000000可用。 我们的一个问题是为什么只有这个操作点、而不是至少100@300000000可用。

    但是、我们的主要问题是、在"M2"分频器之前或之后、确切地生成 CPU 频率的位置? 当然,我们仍然对其他问题感兴趣。

    此致、
    Christoph

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Christoph、
    我计算了 MPU 速度(MHz)与 OPP 间的关系、并添加为下面的第一列。

    {/* 25MHz */
    300{24、0、2、-1、-1、 -1、-1}、/* OPP 50 */
    {-1、-1、-1、-1、-1、-1、-1、 -1、-1}、/* OPP 保留*/
    600{24、0、1、-1、-1、-1、 -1、-1}、/* OPP 100 */
    720{144、4、1、-1、-1、 -1、-1}、// OPP 120 */
    800{32、0、1、-1、-1、-1、 -1、-1}、/* OPP TB */
    1000{40、0、1、-1、-1、-1、 -1、-1}/* OPP NT */
    }、

    MPU 速度通过[M/(N+1)]*CLKINP*[1/M2]计算、其中 CLKINP=25MHz 基于您的电路板设置。
    => 300MHz/OPP50在 SPL/u-boot 中配置。
    公式见表8-17。 AM335x TRM 锁定状态下的输出时钟。

    具体器件(300MHz 速度等级)、如 AM335x 数据表中所示。
    表5-7. 具有器件版本代码"A"或更高版本的 ZCZ 封装的 VDD_MPU 选项

    OPP100 (3)1.056 V 1.100 V 1.144 V 300 MHz
    OPP500.912 V 0.950 V 0.988 V 300 MHz
    (3)适用于所有可订购的 AM335_ZCZ_30 (300 MHz 速度等级)器件。 

    OPP100/300MHz 和 OPP50/300MHz 似乎是300MHz 速度等级的有效组合。
    但 VDD_CORE 也有影响(对于 DDR、L3/L4……) 如所示
    表5-9. 具有器件版本代码"A"或更高版本的 ZCE 封装的 VDD_CORE 运算。

    内核启动后、让您检查 MPU 速度、OPP 等... 通过 omapconf

    /omapconf show DPLL
    ./omapconf show opp 

    最棒的

    -香港

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Hong、

    您是说 MPU 速度*是* CPU 速度吗? 在本例中、am33xx.dtsi 应为:

    CPU@0{
    [...]
    运行点-v2 =<&CPU0_opp_table>;
    
    时钟=<&DPLL_MPU_m2_ck>;
    时钟名称="cpu";
    [...]
    }; 

    不是

    CPU@0{
    [...]
    运行点-v2 =<&CPU0_opp_table>;
    
    时钟=<&DPLL_MPU_ck>;
    时钟名称="cpu";
    [...]
    }; 

    Linux 认为 CPU 以600MHz 的频率运行、而 U-Boot 似乎将其配置为300MHz、这让我们感到非常困惑。

    此致、
    Christoph

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Christoph、
    我已经在具有1GHz 样本的 AM335x GP EVM 上运行了 SDK6.3测试。
    我在低于 cmds 运行时附加日志文件、其中显示 ARM MPU 速度、OPP 等... 以供您参考。
    由于在捕获日志时有 DVFS、因此 ARM MPU 以600MHz 的频率运行。

    /omapconf show DPLL;
    ./omapconf show opp;
    ./omapconf show pwst;
    cat /proc/cpuinfo;
    cat /sys/kernel/debug/clk/clk_summary 

    最棒的

    -香港

    e2e.ti.com/.../am3_5F00_gp_5F00_6.3_5F00_dvfs.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Hong、

    谢谢你。 但我必须坚持:

    1. 您是说 MPU 速度*是* CPU 速度吗?
    2. 在"M2"分频器之前或之后、确切地生成 CPU 频率的位置是什么?

    器件树呢?

    此致、
    Christoph

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Christoph、
    AM335x 电源、复位和时钟管理(PRCM)(AM335x TRM Chatper 8)负责生成时钟
    用于 MPU (ARM cortex-A8)、内核、显示、DDR、外设。
    例如、在 AM335x 数据表的图8-1 (AM335x 器件命名规则)中、
    30 = 300MHz Cortex-A8 => 300MHz 是 MPU 或 ARM Cortex-A8内核能够运行的最大速度。

    回答您的问题
    1.您是说 MPU 速度*是 CPU 速度吗*?
    是的、
    2.在"M2"分频器之前或之后、确切地生成 CPU 频率在哪里?
    MPU 时钟的生成如图8-8所示。 AM335x TRM 的 ADPLLS 或"M2"分频器之后。

    器件树呢?
    您是否曾尝试在我的上次回复中运行 cmds 以显示 MPU 速度、OPP 等...在 DVFS 下、查看与设备树设置的任何关联?

    最棒的

    -香港

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Hong、

    感谢您的确认! 是的、我运行了这些命令:当 U-Boot 将 M2分频器设置为2 (对于300MHz)时、它们肯定错误地报告了600MHz 的 CPU 速率(25MHz 振荡器* 24 / 2 (= M2))。 因此、am33xx.dtsi 应该为:

    /{
    CPU{
    CPU@0{
    时钟=<&DPLL_MPU_m2_ck>;
    };
    };
    };}; 

    此致、
    Christoph