【微信群技术讨论】deep idle的唤醒问题
本文是原「蜗窝讨论区」的历史存档(2017-07-31),来自版块「Linux kernel技术问答」,共 6 帖。讨论区已停止服务,此处仅供查阅。
问题描述: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的硬件连接。
厉害!请问郭老师,您学到这种程度,可否给初学者一个学习路线或者说你看过的书单以及顺序!感觉像大海捞针。方向感不够啊!
在/forum/中我给出了我的看法,你可以参考。
BTW,技术交流,不必称呼我为老师,大家都是内核爱好者嘛。
linuxer 写道: 在/forum/中我给出了我的看法,你可以参考。
BTW,技术交流,不必称呼我为老师,大家都是内核爱好者嘛。
好的,谢谢郭大哥!哈哈!我先熟悉基本操作系统概念哈!
您这个方式应该不是目前主流的设计了吧?
目前主流的设计是什么样子的呢?能否告知一二。
