參考博文:https://www.pianshen.com/article/28741269430/和https://www.pianshen.com/article/47501269331/
Q_Channel
AMBA提供了,低功耗的接口。用於實現power控制功能。目前,AMBA里面,包含2種低功耗接口。
- Q-Channel:實現簡單的power控制,如上電,下電。
- P-Channel:實現復雜的power控制,如全上電,半上電,1/4上電等。
ARM引入這2種低功耗接口,是為了滿足不同的應用場景下,對power的控制。
在一些場景下,組件只有兩種power狀態,分別為power-up,power-down。因此對這種組件的power控制,只需要對其上電,斷電即可。用Q-Channel,即可實現。
而在另外的場景下,組件擁有多種power狀態,比如全上電,半上電,1/4上電等。因此對這種組件的power控制,就要復雜很多,不能簡單的對其上電,斷電即可,還需要額外的一些控制。此時,用Q-Channel,就不合適了,需要使用P-Channel。
比如在DynamlQ技術中,引入了L3 cache,並且每個core擁有自己的L1 cache,L2 cache,這樣,整個系統中,cache的容量就變大了,相應的,消耗在cache上的功耗,也增多了。此時,就需要復雜的對cache的power控制,來實現低功耗,比如對L3 cache,1/4上電,也就是只有1/4的L3 cache工作,其余的都斷電,以此來節省功耗。此時,就要用到P-Channel。
一、Q-Channel
Q-Channel是從AXI的低功耗接口中,演變過來。但是可以向后兼容。
1、接口
以下是Q-Channel的接口:
分為device端和power controller端(下文均簡稱為PMU)。device端,就是需要被電源控制的組件,比如core,外設等。PMU端,就是提供電源管理的組件。
在Q-Channel中,將device的power狀態,分成了2種,
- operational狀態: device處於工作狀態,簡單理解為上電狀態,下文稱為上電狀態
- quiescent狀態:device處於停止狀態,簡單理解為斷電狀態,下文稱為斷電狀態
接口如下:
信號 |
說明 |
QACTIVE |
提供給device,向PMU發送power請求,更改自己的power狀態 為高,表示device需要PMU將自己置為上電狀態 為低,表示device需要PMU將自己置為斷點狀態 |
QREQn |
power controller發送power請求信號 為高,表示上電 為低,表示斷電 |
QACCEPTn |
為高,表示device接受外部power請求 |
QDENY |
為高,表示device拒絕外部power請求 |
2、Q-Channel接口的握手狀態
ARM對Q-Channel的interface,定義了幾種握手狀態:
- 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拉高后的狀態。
以下是編碼:
下圖是各個握手狀態的切換:
對於握手信號,有以下的規則:
- QREQn只能在QACCEPTn為高並且QDENY為低時,才可以從高變為低。
-
QREQn滿足以下條件,才可以從低變為高
- QACCEPTn和QDENY都為低
- QACCEPTn和QDENY都為高
- QACCEPTn只能在QREQn和QDENY都為低情況下,才可以從高變為低
- QACCEPTn只能在QREQn和QDENY都為高情況下,才可以從低變為高
- QDENY只能在QREQn和QACCEPTn都為高情況下,才可以從高變為低
- QDENY只能在QREQn為低並且QACCEPTn為高情況下,才可以從低變為高
上面的這些原則,在設計Q-Channel時,需要遵守的。
3、Q_Channel的握手協議
3.1、device接受PMU的power請求
以下是握手協議時序圖:
在T1,QREQn和QACCEPTn為高,Q_Channel進入Q_RUN狀態。
在T2,QREQn為低,PMU請求device進入斷電狀態,然后等待外設響應,此時Q_Channel進入Q_REQUEST狀態。
在T3,QACCEPTn為低,表示device接收PMU的請求,將自己進入斷電狀態。此時Q_Channel進入Q_STOPPED狀態。
在T4,QREQn為高,PMU請求device進入上電狀態,然后等待外設響應。此時Q_Channel進入Q_EXIT狀態。
在T5,QACCEPTn為高,表示device接收PMU的請求,將自己進入上電狀態。此時Q_Channel進入Q_RUN狀態。
3.2、device拒絕PMU的power請求
當外部PMU給device發送power請求,device可以拒絕該power請求。PMU收到device的拒絕響應后,應取消該power請求。
在T1,QREQn和QACCEPTn為高,Q_Channel進入Q_RUN狀態。
在T2,QREQn為低,PMU請求device進入斷電狀態,然后等待外設響應,此時Q_Channel進入Q_REQUEST狀態。
在T3,QDENY為高,表示device拒絕PMU的請求,自己保持上電狀態。此時Q_Channel進入Q_DENIED狀態。
在T4,PMU接收到device的拒絕響應,將QREQn拉高,PMU請求device進入上電狀態,然后等待外設響應。此時Q_Channel進入Q_CONTINUE狀態。
在T5,QDENY為低,表示device接收PMU的上電請求,將自己保持上電狀態。此時Q_Channel進入Q_RUN狀態。
4、device復位信號與Q_Channel的結合
復位信號,需要和Q_Channel的信號,進行組合。一般來說,復位信號,也會由PMU來控制。
組合分為以下2種情況。
4.1、RESETn復位無效時,QREQn為低
T2時刻,RESETn為高,復位取消。
T3時刻,QREQn為高,PMU向device請求上電。Q_Channel進入Q_EXIT狀態。
T4時刻,QACCEPTn為高,device接受PMU的上電請求。Q_Channel進入Q_RUN狀態。
T5時刻,QREQn為低,PMU向device請求斷電,Q_Channel進入Q_REQUEST狀態。T6時刻,QACCEPTn為低,device接受PMU的斷電請求。Q_Channel進入Q_STOPPED。
T7時刻,將RESETn拉低。
4.2、RESETn復位有效時,QREQn為高
T2時刻,QREQn拉高,PMU向device請求上電。Q_Channel進入Q_EXIT狀態。
T3時刻,因為RESETn為低,復位有效,device將QACCEPTn保持為低,Q_Channel保持Q_EXIT狀態。
T4時刻,因為RESETn為高,復位無效。device將QACCEPTn拉低,響應PMU的上電請求。Q_Channel進入Q_RUN狀態。
T5時刻,QREQn拉低,PMU向device請求斷電,Q_Channel進入Q_REQUEST狀態。
T6時刻,device將QACCEPTn拉低,響應PMU的斷電請求。Q_Channel進入Q_STOPPED狀態。
T7時刻,RESETn拉低。
5、QACTIVE
QACTIVE,是提供給device,給PMU發送power請求的信號。可以由多個來源的組合。如果為高,那么PMU要給自己上電,並且之后,不能給自己斷電。
QACTIVE和握手信號(QREQn,QACCEPTn,QDENY)是獨立開的。
5.1、請求上電和請求下電
T1時刻,device將QACTIVE拉高,向PMU發起退出斷電請求。T2時刻,PMU將QREQn拉高,Q_Channel進入Q_EXIT狀態,T3時刻,進入Q_RUN狀態。
T4時刻,device將QACTIVE拉低,device向PMU發起進入斷電請求。T5時刻,PMU將QREQn拉低,Q_Channel進入Q_REQUEST狀態,在T6時刻,進入Q_STOPPED狀態。
5.2、PMU不允許斷電
T1時刻,device將QACTIVE拉高,向PMU發起上電請求。T2時刻,PMU將QREQn拉高,Q_Channel進入Q_EXIT狀態,T3時刻,進入Q_RUN狀態。之后,device處於上電狀態。
T4時刻,PMU將QREQn拉低,PMU想讓device進入斷電狀態,但是QACTIVE為高,表示device要一直處於上電狀態。因此QACCEPTn持續保持高,Q_Channel一直維持在Q_REQUEST狀態。device維持在上電狀態。
T5時刻,因為之前QACTIVE拉低,device想進入斷電狀態,device將QACCEPTn拉低,響應PMU的斷電請求,然后Q_Channel進入Q_STOPPED狀態。device進入斷點狀態。
6、Q_Channel的實現
一般來說,device和PMU的時鍾是異步時鍾。因此,需要一些同步化。
下圖是同步化的框圖:
ARM提供了以下的一些實現指導:
- 被使用的所有信號,都需要進行同步化
- 只有當Q_Channel進入Q_STOPPED狀態是,才可以將時鍾和power給關掉
- 為了保證握手信號的正確性,QREQn,QACCEPTn,QDENY需要使用寄存器直接輸出
- QACTIVE使用寄存器直接輸出,或者是相關寄存器輸出的組合輸出。ARM強烈建議組合輸出,使用或門。
7、Q_Channel的向后兼容
Q_Channel是從AXI的低功耗結構,演化過來。但是Q_Channel也可以兼容AXI的低功耗接口。
如下圖,device使用AXI的低功耗接口,PMU使用Q_Channel。只需要按照如下的連接進行連接即可。
如下圖,device使用Q_Channel,PMU使用AXI的低功耗接口,只需要按照如下的連接進行連接即可。
P_Channel
為了滿足復雜的power管理的需求,arm提供了P_Channel的低功耗接口,來滿足這樣的應用場景。
一、P_Channel
P_Channel,提出了一個概念,叫power state transition,power狀態的切換。在P_Channel的應用場景中,power的狀態有很多,這個是實現自己定義的。power的各個狀態之間,是可以切換的。
2個最基本的狀態:
- lower-power狀態:在這個狀態下,power消耗比較少,device處於低功耗狀態(具有部分功能)
- higher-power狀態:在這個狀態,power消耗比較大,device處於正常狀態(具有完整功能)
1、接口
以下是P_Channel接口。
分為device端和power控制端(下文簡稱PMU)。
信號 |
說明 |
驅動端 |
PACTIVE [N-1:0] |
提供wakeup功能 |
device |
PSTATE [M-1:0] |
需要切換的目的power狀態 |
PMU |
PREQ |
為高,表示power狀態切換請求 |
PMU |
PACCEPT |
為高,表示device接受power狀態切換請求 |
device |
PDENY |
為高,表示device拒絕power狀態切換請求 |
device |
PACCEPT和PDENY在握手中,只能有一個為高。PACCEPT表示接受請求,PDENY表示拒絕請求。
PACCEPT,PDENY,PREQ,PSTATE,必須是從寄存器直接輸出。
2、P_Channel接口握手狀態
對P_Channel的接口,arm也定義了一些握手狀態。不過狀態,有加入了RESETn信號的影響。
- P_RESET: device處於reset狀態
- P_STABLE: device處於非reset狀態,並且PMU沒有發送power狀態切換請求
- P_REQUEST: PMU向device發送power狀態切換請求
- P_ACCEPT: device接受PMU的power狀態切換請求
- P_DENIED: device拒絕PMU的power狀態切換請求
- P_COMPLETE: device接受PMU的power狀態切換請求后,PMU取消power狀態切換請求
- P_CONTINUE: device拒絕PMU的power狀態切換請求后,PMU取消power狀態切換請求
編碼:
以下是狀態轉移圖:
握手協議規則:
- PREQ只有在PACCEPT和PDENY都為低情況下,才可以從低變為高
-
PREQ要滿足以下的任意條件,才可以從高變為低:
- PACCETP是高,PDENY為低
- PACCEPT為低,PDENY為高
-
PSTATE滿足以下的任意條件,才可以變化:
- PREQ,PACCEPT,PDENY都為低
- PREQ和PDENY為高,PACCEPT為低
- PACCEPT只有在PREQ為高,並且PDENY為低,才可以從低變為高
- PACCETP只有在PREQ為低,並且PDENY為低,才可以從高變為低
- PDENY只有在PREQ為高,並且PACCEPT為低,才可以從低變為高
- PDENY只有在PREQ為低,並且PACCEPT為低,才可以從高變為低
3、P_Channel的握手協議
握手協議,涉及到PREQ,PSTATE,PACCEPT,PENDY這4個信號。
3.1、device接受power狀態切換
下圖是該時序圖:
在T2時刻之前,P_Channel處於P_STATBLE狀態。
T2時刻,PMU拉高PREQ,將PSTATE置為STATE B。向device發送power狀態切換請求,請求將device切換到STATE B的power狀態。P_Channel進入P_REQUEST狀態。
T3時刻,device將PACCEPT拉高,表示接受PMU的power狀態切換請求。P_Channel進入P_ACCEPT狀態。
T4時刻,PMU接收device的PACCEPT響應,拉低PREQ,取消請求。P_Channel進入P_COMPLETE狀態。
T5時刻,device將PACCEPT拉低,表示完成power狀態切換。P_Channel進入P_STABLE狀態。
3.2、device拒絕power狀態切換
下圖是時序圖:
T2時刻以前,P_Channel處於P_STABLE狀態。
T2時刻,PMU將PREQ拉高,將PSTATE置為STATE B。向device發送power狀態切換請求,請求將device切換到STATE B的power狀態。P_Channel進入P_REQUEST狀態。
T3時刻,device將PDENY拉高,表示拒絕PMU的power切換請求。P_Channel進入P_DENIED狀態。
T4時刻,PMU接收到device的PDENY響應,將PREQ拉低,取消請求,並且把PSTATE置為STATE A。P_Channel進入P_CONTINUE狀態。
T5時刻,device將PDENY拉低,P_Channel進入P_STABLE狀態。
4、device的復位和初始化
device在復位時,必須將PACCEPT和PDENY置為低,但對PACTIVE沒有要求。
P_Channel的狀態為P_STABLE時,device的復位信號,才可以設置為有效。
當device的復位無效時,device要進入初始化,此時PMU要設置PSTATE信號值,device會在復位之后,采樣該信號值,從而采用合適的初始化流程。PSTATE要在復位信號無效后要保持穩定。
device,要提供一個初始化周期時間,tinit。用來表示,復位之后,PSTATE需要保持多久時間,供device初始化使用。PSTATE在tinit時間之內,必須要保持穩定。
以下是時序圖:
T1時刻之前,RESETn為低,復位有效,P_Channel處於P_RESET狀態。
T1時刻,RESETn為高,PMU將PSTATE置為STATE A。P_Channel進入P_STABLE狀態。
T2時刻,由於tinit的限制,PMU要將PSTATE一直保持在STATE A,以便device正確的初始化。device必須要在tinit時間內,采樣PSTATE。此后,PMU就可以發送power切換請求了。
T3時刻,PMU將PREQ置高,並且將PSTATE置為STATE B,發送power切換請求。P_Channel進入P_REQUEST狀態。
T4時刻,device將PACCEPT拉高,表示接受PMU的power狀態切換請求。P_Channel進入P_ACCEPT狀態。
T5時刻,PMU接收device的PACCEPT響應,拉低PREQ,取消請求。P_Channel進入P_COMPLETE狀態。
T6時刻,device將PACCEPT拉低,表示完成power狀態切換。P_Channel進入P_STABLE狀態。
T7時刻,P_Channel在P_STATBLE狀態,可以進行復位,外部拉低RESETn,P_Channel進入P_RESET狀態。
下圖,展示了,當復位時,PMU發送power切換情況的時序圖。
T1時刻,PMU將PREQ拉高,並置PSTATE為STATE A,但是復位信號有效,device不接收PMU請求。P_Channel保持為P_RESET狀態。
T2時刻,復位信號釋放,因為PREQ為高,P_Channel進入P_REQUEST狀態。device接收PMU的power切換請求。
之后的就和上面的分析原理是一樣的了。
下圖,展示了,復位后,PMU發送使device進入STATE A的power狀態請求,當該轉換完成后,PMU又繼續發送使device進入STATE B的power狀態請求。
PMU在發送下一個power切換請求前,必須保證上一個power切換請求,傳輸完畢。
5、多個power狀態切換
利用P_Channel,PMU可以使device,來回切換不同的power狀態。
在T0,device處於STATE A狀態。
在T1到T4,通過P_Channel,使device進入STATE B狀態。在T4,P_Channel進入P_STABLE狀態。
在T5-T8,通過P_Channel,使device進入STATE C狀態。在T8,P_Channel進入P_STABLE狀態。
6、PACTIVE
PACTIVE,提供給device給PMU發送請求。PACTIVE的每一個bit,表示一種請求。bit為高,表示device發送請求給PMU,讓PMU處理,bit為低,表示device沒有發送請求給PMU處理。
PACTIVE和握手協議,是獨立開的。PACTIVE是設計自定義的,請求完全自己定義。當然,也可以不使用PACTIVE,如果不是用PACTIVE,需要將PACTIVE置為0。
以下是PACTIVE的例子:
PACTIVE有3個bit,每個bit,映射到一個power狀態,MSB具有高優先級。
- PACTIVE[2]: STATE C
- PACTIVE[1]: STATE B
- PACTIVE[0]: STATE A
T1時刻,device將PACTIVE設置為3'b011,表示device向PMU發送power切換請求,將自己切換為STATE B。
PMU接收到device的請求后,從T2到T5,向device發送power切換請求,並且切換到STATE B狀態。最后P_Channel進入P_STABLE狀態。
T6時刻,device將PACTIVE設置為3'b111,表示device向PMU發送power切換請求,將自己切換為STATE C。
PMU接收到device的請求后,從T7到T10,向device發送power切換請求,並且切換到STATE C狀態。最后P_Channel進入P_STABLE狀態。
7、對於device,需要提供的信息
為了PMU的設計的正確性,device需要向PMU提供以下的一些信息:
-
device支持的power狀態,包括以下:
- PSTATE定義和編碼
- PACTIVE每個bit代表的請求
- 用於初始化power狀態,推薦的PACTIVE輸出
- PACTIVE需要被忽略,或者一直置0的bit信息
-
power狀態的切換,包括以下:
- power狀態切換之后的device行為
- device拒絕power狀態切換的條件
- 復位釋放后,用於初始化device的PSTATE的合理值
- tinit值
8、實現
對於device和PMU來說,有各自的時鍾,因此他們的時鍾,是當成異步來進行處理的,所以需要同步化的操作。
下圖展示了,P_Channel的實現框圖:
對於PSTATE,PREQ,PACCETP,PDENY,需要從寄存器直接輸出,在接收端,需要使用同步器,對異步輸入信號進行同步化輸出。
對於PACTIVE,如果是多個來源的組合,ARM建議使用或門來實現。並且每個對PACTIVE貢獻的來源,必須是寄存器直接輸出。
9、P_Channel使用例子
以下是P_Channel使用的2個例子。
9.1、獨立的power domain使用P_Channel
device0處於power domain0,PMU使用PD0來控制。
device1處於power domain1和power domain2,PMU使用PD1和PD2來分別控制。
9.2、父子關系的power domain使用P_Channel
device1內部有3個power domain,分別為power domain0,power domain1,power domain2,但是domain0是domain1和domain2的父domain,也就是domain0控制domain1和domain2。
PMU和device1有3個P_Channel接口,但是都是在power domain0中。