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.

[参考译文] Linux/AM3352:C1状态问题

Guru**** 2931100 points

Other Parts Discussed in Thread: AM3352

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/667525/linux-am3352-c1-state-issue

器件型号:AM3352

工具/软件:Linux

各位专家:

 

对于使用 AM3352的系统、我们有一个症状、即整个系统的 CPU 使用率系统在特定时刻跳至60-70%。

虽然这种严重的 CPU 负载在症状出现后仍然存在、但它可以通过 DVFS 暂时解决为 CPU 频率的变化。

 

在深入了解时、我们发现 CM_CLKMODE_DPLL_MPU 寄存器(0x44e0_0488)的位0-2从7 (锁定模式)更改为5 (空闲旁路低功耗)、同时出现此症状。

该寄存器由 M3固件针对 PM 进行更改、在采用 C1 (旁路 MPU PLL)作为空闲状态时、似乎出现症状。

 

虽然我们通过进行以下修改来改善问题、但我们不能确定这是否正确。

请您为我们核实一下。

请注意、我们使用固件版本0x192进行确认。

 

diff --git a/src/sound/ext_intr_handers.c b/src/sound/ext_intr_handers.c

索引31f3728..be991a1 100644

-- A/src/sound/ext_intr_handers.c

++ b/src/sound/ext_intr_handler

@@-70、7 + 70、8 @@ void extint34_handler (void)

      对于(I = 0;I < cm3_NUM_EXT_INTERRUPTS;I++)

      {

            NVIC_DISABLE_IRQ (I);

-           NVIC_CLEAR_IRQ (I);

+           IF (I!= cm3_IRQ_MPU_WAKE)

+                 NVIC_CLEAR_IRQ (I);

      }

 

      MSG_cmd_dispatcher();

 

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

    您好、Akira、

    [引用 USER="Akira Kobayashi"]我们有一个症状,即整个系统的 CPU 使用率系统在某个时刻跳至60-70%。[/引用]

    [引用用户="Akira Kobayashi"]

    在深入了解时、我们发现 CM_CLKMODE_DPLL_MPU 寄存器(0x44e0_0488)的位0-2从7 (锁定模式)更改为5 (空闲旁路低功耗)、同时出现此症状。

    该寄存器由 M3固件针对 PM 进行更改、在采用 C1 (旁路 MPU PLL)作为空闲状态时、似乎出现症状。

    [/报价]

    只有当 Linux 调度程序没有要运行的线程时、才应进入 CPUIdle 状态。 这意味着在没有 CPU 使用时输入 CPUIdle。 当 CPU 仍在工作时、您似乎以某种方式进入 CPUIdle 状态、这是不正确的。 有关 正确的 CPUIdle 用法的详细信息、请参阅以下 wiki 页面:

    processors.wiki.ti.com/.../Linux_Core_Power_Management_User's_Guide_(v4.4)

    此致、
    帕维尔

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

    Linux 内核版本为3.12.10、带有"ARM:AM33XX:添加 CPU 空闲支持"补丁。
    PM:CM3固件版本= 0x185
    顺便说一下、我们尝试了 cm3固件版本的0x193、但我们无法确认改进。

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

    我发现、即使 CPU 相对繁忙、它也会根据每个进程的状态进入空闲状态。
    此时、对于上述内核、M3的 CMD_ID_CPUIDLE_V2 (0xd)命令用于进入空闲状态。
    在这种情况下,必须始终同时调用 M3固件中的以下两个(我的意思是配对),但有时不调用后者。
    A8_cpuidle_v2_handler ()
    a8_WAKE_cputidle_v2_handler()
    我想这就是为什么 CM_CLKMODE_DPLL_MPU 寄存器的值不会恢复的原因。

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

    Akira、

    [引用 user="Akira Kobayashi"]我发现,即使 CPU 相对繁忙,它也会根据每个进程的状态进入空闲状态。

    这是不正确的。 AM335x Cortex-A8 MPU 仅在没有更多进程要运行时才应自动进入低功耗空闲状态。 似乎您使用的是非常旧的 AM335x TI SDK7 (内核3.12.10)、其中 CPUIdle 默认不执行、您自己执行 CPUIdle、但您自己的实现存在问题。

    请尝试使用最新的 AM335x TI PSDK4.02 (内核4.9.59)重现此问题、其中默认实现了 CPUIdle。 如果您无法使用最新的 PSDK 重现问题、则应在 SDK7中仔细检查自定义的 CPUIdle 实现。

    此致、
    帕维尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Pavel、您好、
    
    感谢您的评论。
    
    因为我使用的是专用硬件,所以内核升级必须花一段时间。 
    嗯、我相信4.x 内核使用 M3的 CMD_ID_CPUIDLE (0x10)命令进入空闲状态。
    
    drivers/soc/ti/wkup_m3_ipc.c
    #define IPC_CMD_IDLE0x10
    
    您能告诉我、CMD_ID_CPUIDLE_V2 (0xd)是否能正常工作?
    
    此致、
    Akira 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Akira Kobayashi"]通过深入了解,我们发现 CM_CLKMODE_DPLL_MPU 寄存器(0x44e0_0488)的位0-2已从7 (锁定模式)更改为5 (空闲旁路低功耗),同时出现这种症状。[/QUEQ]

    CPUIdle 允许系统在无活动期间进入低功耗状态。 当 Linux 调度程序没有要运行的线程时、执行空闲循环。 当执行空闲循环时、调用电流"调节器"来确定目标 C 状态。 C 状态用于识别通过 CPU 空闲循环支持的电源状态。

    AM335x 器件支持两种 C 状态:

    MPU WFI

    2. MPU WFI +旁路 MPU DPLL

    当您进入 CPUIdle 低功耗状态时、似乎会进入第二个 C 状态。

    此致、
    帕维尔

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

    [引用用户="Akira Kobayashi"]

    因为我使用的是专用硬件,所以内核升级必须花一段时间。 
    嗯、我相信4.x 内核使用 M3的 CMD_ID_CPUIDLE (0x10)命令进入空闲状态。
    
    drivers/soc/ti/wkup_m3_ipc.c
    #define IPC_CMD_IDLE0x10
    
    您能告诉我、CMD_ID_CPUIDLE_V2 (0xd)是否能正常工作? 

    [/报价]

    我们在以下 e2e 线程中提供了一些信息、请查看:

    我还找到了以下信息:

    问题:

    有时、当退出此空闲状态时、MPU PLL 似乎仍处于旁路状态、因此它们的 ARM 内核性能非常差。
    当再次进入 C1空闲状态时、情况会恢复正常、因为有时 MPU PLL 会再次起作用。 其主要缺点是、在特定负载下、当 MPU PLL 旁路时 CPU 卡在100%使用时、因此永远不会在 C1空闲时再次进入。

    唯一建议的解决方案是完全禁用 C1状态的权变措施。 当然、这对功耗有一些缺点。

    另一种权变措施是保持 C1状态被启用、但如果您发现 MPU PLL 处于旁路模式、则强制其锁定。 一旦 Cortex-A8退出 WFI、我们就会检查 MPU DPLL 是否始终处于锁定状态。 但是、如果我们多次读取 AM33XX_CM_CLKMODE_DPLL_MPU 寄存器(通常大于50)、有时我们会看到它从0x07值发生变化(这意味着 DPLL 配置为锁定)、在这些情况下、我们遇到了这个问题。 如果发现 DPLL 已解锁、我们会通过锁定 DPLL 来尝试一个脏的 Hack、我们再也不会遇到该问题。

    AFAIK 意味着出于某种原因(同步问题?)其他的东西(Cortex-M3) 在某些情况下、告诉 DPLL 进入旁路模式、同时 Cortex-A8已从 WFI 恢复。

    建议的解决方案:

    他需要改变

    #define IPC_CMD_IDLE 0xd

    ARM/ARM/mach-OMAP2/pm33xx.h 中

    更改为

    #define IPC_CMD_IDLE 0x10

    这最终是在 v3.14内核中修复的、他需要在 v3.12中执行同样的操作。

    这会导致 MPU 时钟域进入睡眠状态、但会阻止旁路 MPU PLL、但无论如何也不会节省大量功耗。

    在这两种情况下、时钟都会选通、而这正是功率降低的主要原因、MPU PLL 的旁路就是导致问题的原因、 不值得使用、因为与时钟门控本身相比、它节省的功耗非常小。

    此致、
    帕维尔

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

    非常感谢您真诚地回复我的问题。

    完全禁用 C1状态似乎是我的案例的一个很好的解决方法。
    这可能是由3.12内核引起的、但有时 M3固件的 A8_cpuidle_handler ()和 A8_WAKE_cpuidle_handler ()不会一起调用。
    不过、由于修改的寄存器较少、因此它不会像 CMD_ID_CPUIDLE_V2 (0xd)那样大。
    如果您有机会检查并确认我之前发布的 M3固件补丁、我将不胜感激。

    diff --git a/src/sound/ext_intr_handers.c b/src/sound/ext_intr_handers.c
    索引31f3728..be991a1 100644
    -- A/src/sound/ext_intr_handers.c
    ++ b/src/sound/ext_intr_handler
    @@-70、7 + 70、8 @@ void extint34_handler (void)
    对于(I = 0;I < cm3_NUM_EXT_INTERRUPTS;I++)

    NVIC_DISABLE_IRQ (I);
    - NVIC_CLEAR_IRQ (I);
    + if (i!= cm3_IRQ_MPU_WAKE)
    + NVIC_CLEAR_IRQ (I);


    MSG_cmd_dispatcher();

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

    Akira、

    [引用 user="Akira Kobayashi)]如果您有机会检查并确认我之前发布的 M3固件补丁,我将不胜感激。

    diff --git a/src/sound/ext_intr_handers.c b/src/sound/ext_intr_handers.c
    索引31f3728..be991a1 100644
    -- A/src/sound/ext_intr_handers.c
    ++ b/src/sound/ext_intr_handler
    @@-70、7 + 70、8 @@ void extint34_handler (void)
    对于(I = 0;I < cm3_NUM_EXT_INTERRUPTS;I++)

    NVIC_DISABLE_IRQ (I);
    - NVIC_CLEAR_IRQ (I);
    + IF (I!= cm3_IRQ_MPU_WAKE)
    + NVIC_CLEAR_IRQ (I);


    MSG_CMD_DEPLOADCENT();[/报价]

    您是不是要禁用 CPUIdle C1状态(MPU WFI 和 MPU PLL 旁路)、只应用该补丁、而不应用其他补丁?

    此致、
    帕维尔

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

    当我应用此补丁时、如果进入 CPU IDLE C1状态、我不会解决此问题。
    我想让您的团队查看此补丁。

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

    我知道。

    您在 cm3固件版本192 (以下链接)之上应用该补丁、是否正确?

    git.ti.com/.../ti-v4.1.y

    我将与 cm3固件所有者核实补丁审核情况。

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

    您好、Pavel、

    感谢您的理解。
    之前的修补程序适用于 v05.00.00.02 (0x185)。
    我相信这个补丁也可以应用于 ti-v4.1.Y (0x192)、但是 ti-v4.1.Y (0x192)的补丁如下。

    -- ext_intr 处理程序.c.orig   2016-09-07 05:29:38.000000000 +0900
    ++ ext_intr 处理程序.c   2018-03-03 08:17:18.381015900 +0900
    @@-79、7 +79、8 @@
        对于(I = 0;I < cm3_NUM_EXT_INTERRUPTS;I++)
        {
            NVIC_DISABLE_IRQ (I);
    -       NVIC_CLEAR_IRQ (I);
    +       IF (I!= cm3_IRQ_MPU_WAKE)
    +           NVIC_CLEAR_IRQ (I);
        }
        IF (SoC_id = AM43XX_SOC_ID){
            NVIC_DISABLE_IRQ (cm3_IRQ_TPM_WAKE);

    此致、
    Akira

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

    Akira、

    这是来自 cm3固件所有者的反馈:

    通过查看您的 e2e 线程、您会发现它位于3.12内核上。 您不想修改固件、此问题已通过以下补丁在3.14内核中得到解决。 您是否能够使用固件补丁测量功耗? 我想快速看一下、它很高。 我可以告诉您、通过立即唤醒系统、可以有效地防止任何时间处于 C 状态。 我在下面添加了完整的补丁、因为提交消息解释了切换 CPU 空闲模式是一个更好的解决方案的原因。 它对功耗的影响可以忽略不计。

     

    提交 dd1af75f2773ffb2060aaad51e04d23fce0cdd1
    作者:Dave Gerlach
    日期:  2014年3月26日13:41:47 2015年-0500

       ARM:OMAP2+:cpuidle33xx:更改 wkup_m3空闲状态以避免 MPU PLL 旁路

       为了在 cpuidle 中进入 c1状态、am33xx 目前使用 wkup_m3进行门控
       并旁路 MPU PLL。 因为我们不会关闭
       在该 C 状态下、在 MPU 电源域之外、两者都是可能的
       唤醒并同时执行、我们没有能力
       在 cputleidle 路径中的两个之间执行同步、原因是
       无中断上下文。

       这会导致两者之间在某些情况下出现频率行为
       其中、通常在 CPU 活动较高期间进入 C1状态
       可能会干扰 wkup_m3上的唤醒路径、
       这可防止 MPU PLL 被重新锁定并导致极端情况
       系统减速。

       因此、我们现在必须使用上可用的不同空闲状态
       当前的 wkup_m3固件(0x190)、其作用只不过是放置
       将 MPU 时钟域设置为睡眠模式、从而实现与之前相同的功耗节省
       之前在 MPU 电源轨上运行、但上的功率稍高
       MPU_PLL 电压轨。

       签字人:Dave Gerlach

    diff --git a/arch/arm/mach-omap2/pm33xx.h b/arch/arm/mach-omap2/pm33xx.h
    索引8c4f45995b63..7b6a6f7164ba 100644
    --- a/arch/arm/mach-OMAP2/pm33xx.h
    ++ b/arch/arm/mach-OMAP2/pm33xx.h
    @@-65、7 + 65、7 @@ void __iomem * OMAP-RTC_GET_base_addr (void);
     #define IPC_CMD_RTC_ONLY              0x1
     #define       IPC_CMD_DS0                    0x4
     #define       IPC_CMD_STANDBY                0xc
    -#define       IPC_CMD_IDLE                   0xd
    +#define       IPC_CMD_IDLE                   0x10
     #define IPC_CMD_RESET                 0xe
     #define DS_IPC_DEFAULT                0xFFFF
     #define M3_VERSION_UNKNOWN            0x0000FFFF