Arm應用處理器從Arm926(應用于手機和嵌入式系統)開始,歷經
- Arm11,
- 單核Cortex-A8,
- 第一個真正的多核系統Cortex-A9和后面的Cortex-A5,
- 第一個大小核系統A15+A7到后面的A17+A7,A57/A72/A73+A53
- 新的大小核DynamIQ系統A75, A76, A77, A78 + A55
- 最新的Armv9 CPU A710/A720+A510系統
Arm應用處理器始終以極佳的能效,低功耗應用于包括手機在內的移動設備,因而它們的低功耗設計,電源管理是重要的設計考慮。
本文討論arm應用處理的電源管理的硬件的變遷過程。總的來說arm應用處理器的電源管理硬件設計是隨著SoC系統從單核-》多核-》大小核-》DynamIQ的復雜度而復雜的,但是為了提供統一的電源管理接口和簡化和統一軟件上下電的復雜度,arm在這個進化過程,
- 改進了硬件設計,提供了power policy unit(PPU)這樣的標準電源管理組件,通過標準的P-channel硬件接口來統一電源管理。
- 通過硬件對上下電的支持來簡化和標準化軟件電源管理,比如支持硬件自動的刷cache,硬件自動的退出coherency,硬件的CPU靜默(Quiescence)和GIC靜默請求和應答等。
- 定義了系列的軟件接口,如PSCI,SCMI,通過明確的軟件分層和接口定義,提供更加通用portable的軟件系統。
Cortex-A9多核系統
從Cortex-A9說起,A9MP多核系統需要更好的電源控制,如動態控制一個CPU core power down和power up。A9MP提供了一些特用的硬件信號與電源控制器連接和通信,運行在A9應用處理器上的軟件通知電源控制器需要對那個CPU進行哪種控制(Power Down或是Power UP或進入/退出Dormant mode)。A9MP提供了PWRCTLO這組信號,可以連接到電源控制器。電源管理軟件可以設置A9MP SCU CPU Power Status Register寄存器設置CPU要進入的power狀態(power-off或是dormant模式),當A9MP通過執行WFI指令進入WFI低功耗模式,A9MP硬件會驅動PWRCTLO這組信號來表示要進入的power狀態,從而告知power controller。
A9的power Down過程大致為:
- 軟件保存CPU core的通用寄存器,系統寄存器值到內存中。
- 軟件執行DSB指令
- 軟件清除SCTLR.C bit,這防止數據進一步分配在cache中
- 軟件clean and invalidate L1數據cache中的數據到下級內存,如DRAM
- 軟件執行DSB指令
- 軟件執行CLREX指令
- 軟件清除ACTLR.SMP bit, 這使這個CPU核退出硬件coherency(SCU不再snoop這個核),并且SCU不再把TLB invaldate和cache maintainance操作到這個核
- 軟件將原來發送給這個核的中斷disable(保留wakeup中斷)或遷移到其他核,disable這個CPU對應的GIC CPU interface
- 軟件執行ISB,保證之前系統操作完成
- 軟件將要進入的power狀態設置到SCU CPU power status register
- 軟件執行DSB指令,保證之前的內存和cache maintainance操作完成,包括outstanding的AXI, ACP傳輸。
- 軟件執行WFI指令。當這個核進入靜默狀態,A9MP硬件會驅動STANDBYWFI信號,通過它告知與其連接的電源控制器,CPU已進入idle狀態。SCU硬件也會驅動PWRCTLO信號告知電源控制器這個核要進入的power狀態
- 電源控制器驅動CLAMP信號使能核的鉗位電路
- 電源控制器切斷這個核的電源
A9時代的SoC的電源控制比較簡單,一般是芯片設計公司自己設計的PMIC,采用狀態機方式來實現控制。
A9時代電源管理比較容易犯錯誤的地方有:
1.在執行DSB+WFI之前,沒有做好第8步。也就是在執行WFI—電源控制器將電源切斷這中間,還有中斷通過GIC的CPU interface和CPU連接的nIRQ/nFIQ將中斷發送給CPU。這可能導致的問題是:
CPU已經執行了WFI,通知了power controller切斷電源,這兩個操作有時間差,如果這個時間差過程中,有一個中斷通過nIRQ/nFIQ發送給CPU,這會喚醒進入WFI低功耗狀態的CPU(即使CPSR.I/F bit禁止了IRQ/FIQ也會喚醒),CPU會繼續執行IRQ handler或是執行WFI之下的指令(取決于CPSR.I/F bit設置),這可能保護內存訪問指令,但在這些內存訪問(如還在outstanding的AXI訪問)硬件操作沒有完成之前,就被power controller切斷電源。這會使interconnect系統中存在沒法完成的AXI傳輸,最終導致硬件系統的掛死。在我支持客戶的經驗中,這種問題通常在系統的上下電壓力測試時被發現。
2.硬件系統集成時,將GIC CPU interface的nIRQOUT/nFIQOUT而不是nIRQ/nFIQ連接到CPU的nIRQ/nFIQ. 首先這是設計錯誤,然后可能更容易導致上面1的問題。
GIC CPU interface的nIRQOUT/nFIQOUT設計目的為讓喚醒(wakeup)中斷可以在CPU interface disable的情況下(這時包括wakeup的中斷不會通過nIRQ/nFIQ發送給CPU),GIC CPU interface還可以產生nIRQOUT/nFIROUT信號,通知power controller給對應的CPU核上電。
A7+A1x big.LITTLE系統
之后出現了big.LITTLE包括A7+A15/A17系統,支持通過ACE接口和CCI一致性互聯實現ccluster之間的硬件cache一致性。在cluster層面上比A9MP的系統多了L2 cache,電源管理的時候可以關掉一個cluster里面的一些CPU核或者整個cluster. A17還能支持通過power controller硬件L2FLUSHREQ信號請求L2 cache自己在cluster下電時做clean and invalidate操作。為了讓power controller請求/了解cluster的L2 memory system的idle狀態,引入了STANDBYWFIL2信號,它可以連接到power controller以顯示L2的硬件idle狀態。引入了ACINACTM信號,power controller設置這個信號為高時,向cluster保證不再會有任何從一致性互聯(CCI)發送給這個cluster。支持ACP port的A15, A17還引入了AINACTS信號,當power controller將這個信號置高時,向cluster保證不再會有任何從ACP的傳輸發送給這個cluster。
Power off一個A15 cluster時,需要在下面條件都滿足下,STANDBYWFIL2才會被拉高(assert):
這個cluster中所有core都已經進入WFI低功耗狀態,即除最后一個核(也就是正在執行power down的最后這個核)之外,其他核都被power down了。Cluster中的所有核的STANDBYWFI都已經assert了。
SoC將ACINACTM信號拉起,表示外部內存系統不再發snoop給這個cluster
當L2 memory sytem完成ACE,AXI端口上所有的outstanding傳輸時,這個cluster可以進入L2 WFI低功耗狀態,這時cluster可以拉高STANDBYWFIL2輸出,通知power controller L2進入了idle狀態了。
A15,A17支持CPU核和cluster級別的dynamic retention模式。當進入WFI低功耗狀態,它的時鐘停止了,這時可以讓power controller將供電電壓降低,但是CPU,Cluster的狀態(如寄存器值,RAM中的內容)不丟失。這個狀態叫Retention. Retention要求power controller可以保證在退出retention過程中,在重新enable時鐘之前先將電壓恢復到正常可運行的電壓值。
為支持dynamic retention模式,A15, A17采用了Q-channel這樣一個比較簡單靈活的接口,與STANDBYWFI這樣的信號通信相比,Q-channel允許控制器可以根據設備的工作狀態或系統狀態,發出低功耗請求;設備可以根據自己的工作狀態,從而決定是否接受請求。Q-channel接口提供了控制器和設備的握手機制。
Q-channel比較簡單。對于時鐘控制來說,只有打開和關閉兩種狀態就可以了。對于電源控制來說,只有ON和OFF兩種狀態。
Q-Channelinterface定義了幾種握手狀態:
Q_RUN: device處于上電狀態。
Q_REQUEST: device處于上電狀態,但是在idle狀態時,可以接收power request,進入斷電狀態。
Q_STOPPED: device進入了斷電狀態。
Q_EXIT: 等待被提供時鐘或者power的狀態。當device得到外部提供的時鐘或者power時,將QACCEPTn拉高,進入Q_RUN狀態。
Q_DENIED: device拒絕外部power的請求,不進入斷電狀態,而保持上電狀態。
Q_CONTINUE: PMU在Q_DENIED狀態后,將QREQn拉高后的狀態。
A15, A17提供了單個CPU核和L2 cluster級用于retention握手的Q-channel接口。以單個核retention為例:
當A15核進入WFI低功耗狀態,其時鐘停止時,QACTIVE被拉低,用于指示此核可以進入retention模式。外部power controller可以拉低QREQn請求將核置為retention,A15通過將QACCEPTn拉低接受retention請求。當QREQn和QACCEPTn都為低時,A15處于靜默(quiescent)狀態,只要QREQn保持在低狀態,A15的時鐘保持停止。外部power controller可以安全低將電壓降低到retention級別。
如果當QREQn為低時,單個核不能安全地進入靜默狀態,它可以將QDENY拉高。這樣power controller就不能降低此核的電壓。
在A7+A1x big.LITTLE系統設計中,因為有更復雜的電源管理模式的組合和模式,為了靈活的系統設計,一般power controller系統會基于MCU(如Cortex-M0, Cortex-M3的子系統)設置,這樣可以通過MCU軟件firmware來靈活處理電源管理請求。這個MCU一般設置為always on的電源域。
A53+A57/A7x 系統
A53+A57/A72/A73的電源管理硬件機制和A7+A17比較類似,基本上也是通過STANDBYWFI, STANDBYWFIL2, ACINACTM (ACE接口,如果是配置為CHI接口時,信號為SINACT),Q-channel(用于retention)等這些信號與power controller通訊。
一個變化是,arm開始推出power policy unit(PPU)這樣的標準電源管理組件。
PPU提供一個配置接口給SCP,用于功耗策略控制和配置。其次,PPU與設備之間的控制接口,包括低功耗接口(low power interface,簡稱LPI),若干組Q-channel和一組P-channel,還有時鐘/復位控制。最后,還有一個與功耗狀態機之間的P-channel接口。
PPU剛開始是在arm自己的開發平臺Juno(A53+A57和A53+A72)上設置使用的,后來arm以此為基礎推出了PPU規范。
PPU的接口:
1.系統控制器(System Control Processor, SCP)的配置通路,可以訪問PPU寄存器接口,一般是APB
2.PPU可以發送中斷,處理完一次電源管理事件后了可以通過中斷通知SCP
3. PPU與被管理的設備間需要一個通信接口,就是LPI(Low Power Interface, Q-channel或者 P-channel),取決于需要實現的具體功能是什么。
4. PPU還會提供時鐘控制,復位和Clamp控制(如果需要實現電源關斷)給被管理的設備.
5.PCSM(Power Control State Machine)的接口,PPU通過P-channel來告訴PCSM當前的狀態,PCSM根據PPU的狀態決定何時控制電源關斷,retention控制
A53+A57/A72/A73系統上,CPU還基本還是使用STANDBYWFI, STANDBYWFIL2, ACINACTM這些信號,因此需要在SoC集成時將這些信號轉接到PPU或SCP上。后面的DynamIQ處理器就不再使用這些信號,而直接利用P-Channel和Q-channel.
在power down流程上,雖然A7, A15, A17, A53, A57, A72大致相同,但是有一些和微構架相關的配置有所不同,從而導致不同CPU core的power down流程不能復用。以下表格總結來自各CPU的使用手冊。
DynamIQ系統
第二代big.LITTLE系統DynamIQ的電源管理接口標準化為Q-Channel和P-Channel. DynamIQ處理器將L3 cahce包含在DSU cluster中,而L3 cache可以被硬件劃為多個區,可以單獨關掉部分和全部的L3 cache,比如1/4, 1/2 L3 cache. 這帶來更加復雜的電源模式。
Q-channel過于簡單了。對于時鐘控制來說,只有打開和關閉兩種狀態就可以了。但是對于電源控制來說,只有ON和OFF兩種狀態,對于某些復雜的power控制場景來說就不夠用了。要對DSU L3實現全上電,半上電,1/4上電等操作。這時,Q-channel就不夠用了,arm定義了P-channel來解決這個問題。
相比Q-channel,P-channel把PACTIVE信號加寬了,不再是一根信號,設備可以傳遞更多的工作狀態給控制器;控制器會額外多發出一組PSTATE信號,描述切換power狀態的請求。
PPU定義了兩個模式:電源模式(power mode)和操作模式(operating mode)。電源模式是一個電源域里logic和RAM電源狀態的正常組合,以及相關的時鐘、復位和隔離控制。而操作模式代表電源模式的配置。例如,在電源模式是ON的時候,Full L3 cache ON, 1/2 L3 cache ON, 1/4 L3 cache ON是電源模式ON的三種操作模式。
P_Channel接口如下
PACCEPT和PDENY在握手中,只能有一個為高。PACCEPT表示接受請求,PDENY表示拒絕請求.
DynamIQ處理器系統中,每個CPU core都有對應的P-channel, DSU cluster層面還有一個P-channel。DynamIQ CPU core在PACTIVE信號上提供當前要求power mode, power controller可以通過PREQ和PSTATE表示決定和要求的改變。CPU硬件然后進行這個電源模式的必要操作,例如停掉時鐘,涮cache,退出一致性維護等。
以一個CPU核的power down為例:
1. 運行在這個核上的軟件保護寄存器上下文之后,設置CPUPWRCTLR 寄存器的CORE_PWRDN_EN bit, 然后執行WFI指令。這會導致CPU的COREPACTIVE輸出表示可以進入到OFF電源模式
2. PPU通過P-Channel請求OFF
3. CPU hardware進行自動硬件L1數據cache和L2 cache的flush操作
4. 這個CPU硬件將自己退出cluster一致性維護
5. CPU核通過assert COREACCEPT表示接受OFF模式
6. PPU停止CPU核的clock,使能鉗位/隔離邏輯,assert CPU核reset信號
7. PPU控制PCSM切斷CPU核的電源
8. 如果需要的話,PPU可以發送一個中斷給SCP,通知SCP電源模式轉換完成
DynamIQ系統硬件設計還讓電源管理軟件流程更加簡單,標準化,不需要像之前A1x, A5x, A7x CPU power down流程需要做一些微構架相關的操作。
下面以A57和A55為例,看一下它們power down 流程的區別。
由上面對比可知,DynamIQ的CPU比之前的CPU流程更加簡單,因為很多原來流程需要做的事情都被硬件自動完成,不需要軟件參與。
DynamIQ系統普遍使用GICv3中斷控制器。GICv3中斷控制器相對之前GICv2,設置了專門的wakeup request接口(GICv2利用nIRQOUT, nFIQOUT作為wakeup輸入),同時GICv3也有了專門的寄存器GICR_WAKER給軟件來設置某個GIC CPU interface對應的CPU核的power on/power down狀態。在CPU核power down/power up的軟件流程中,需要設置GICR_WAKER寄存器來將GIC CPU interface和Redistibutor的連接斷開。當CPU核在power down狀態,且GICR_WAKER做了相應的設置時,發送給這個CPU核的wakeup interrupt,不再發送給GIC CPU interface,而是由GIC Redistributor通過wakerequest信號發送給SCP,從而讓SCP給這個CPU核上電。
Arm設計了PCK-600 IP,讓客戶可以更簡單地獲取和利用PPU集成到系統中。
Armv9 DynamIQ系統
Armv9 DynamIQ系統在之前DynamIQ的基礎上更近一步,直接將每個核一個的PPU和DSU cluster級的PPU集成到了DSU cluster里面,從而不需要SoC設計者去集成PPU。在DSU cluster總線接口上提供了新的Utility Bus讓SCP可以通過它訪問PPU的寄存器。
總結
Arm的電源管理硬件設計是
1、 每種CPU有自己獨特設計,通過各種信號線與power controller交互的方式進化為采用標準的P-Channel,Q-Channel的交互方式
2、 由每個SoC特有的電源控制logic到采用標準PPU組件的方式
3、 由簡單單核電源控制到多核,到big.LITTLE, DynamIQ的復雜電源控制過程
4、 通過硬件來簡化軟件電源管理的流程的過程
評論