蜗窝科技

【微信群技术讨论】deep idle的唤醒问题

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 linuxer · 2017-07-31 · 6 帖

本文是原「蜗窝讨论区」的历史存档(2017-07-31),来自版块「Linux kernel技术问答」,共 6 帖。讨论区已停止服务,此处仅供查阅。

linuxer · 2017-07-31 17:31

问题描述:gic500 下,cpuidle 中core1进了power down的idle state后,ipi 还能唤醒这个core么?

经过大家的讨论,整个系统结构描述如下:

该问题涉及的HW block包括: 1、 PMC 2、 GIC 3、 Cpu core(PE)

涉及的软件模块包括: 1、 CPU idle和CPU PM模块 2、 Gic dirver模块

CPU idle软件模块控制某个cpu core进入深度的idle状态,这将导致cpu core下电,一旦cpu core下电,接收外部中断信号的cpu interface也就不工作了(cpu interface 是包含在cpu core中的一个HW block,cpu interface 是和cpu core 应该是一个power domain),因此cpu core也就没有办法接收到中断了,除非有一个上电过程。

本身cpu idle的定义和system suspend不同,任何的中断都是可以将cpu从 idle中唤醒的,不论是外设的中断还是IPI中断。为了让系统正常运转,在进入深度idle状态的时候,CPU idle模块和GIC driver模块需要交互(通过cpu pm driver模块),确保当中断发生的时候,系统可从deep idle中恢复。

具体交互的内容就是把该PE对应的redistributor给disable了。这需要操作GICR_WAKER寄存器的ProcessorSleep比特。这样,GIC就知道对应的cpu core进入sleep状态,其对应的redistributor也就不会转发中断到该cpu core了。我们称这种cpu interface和对应的redistributor处于quiescent state(是否让你想起了RCU,哈哈)

在quiescent state的时候,如果有中断送达该cpu core会怎么办呢?GIC会assert cpuWakeupRequest信号,而该信号一般会连接到PMC上,PMC收到这个asserted的信号会给对应的PE上电,走上从deep idle状态的恢复之路。IPI的中断也是通过GIC<---->redistributorX<---->cpu interfaceX<---->PEX这样的路径,因此也应该可以唤醒cpu core。

最后的结论: ipi可以唤醒CPU idle的CPU,但需要正确的GIC和PMC的硬件连接。

AlohaJack · 2017-07-31 19:54

厉害!请问郭老师,您学到这种程度,可否给初学者一个学习路线或者说你看过的书单以及顺序!感觉像大海捞针。方向感不够啊!

linuxer · 2017-08-01 00:15

在/forum/中我给出了我的看法,你可以参考。

BTW,技术交流,不必称呼我为老师,大家都是内核爱好者嘛。

AlohaJack · 2017-08-01 00:45

linuxer 写道: 在/forum/中我给出了我的看法,你可以参考。

BTW,技术交流,不必称呼我为老师,大家都是内核爱好者嘛。

好的,谢谢郭大哥!哈哈!我先熟悉基本操作系统概念哈!

happain · 2017-09-19 17:01

您这个方式应该不是目前主流的设计了吧?

linuxer · 2017-09-20 19:30

目前主流的设计是什么样子的呢?能否告知一二。