11. Command Completion Coalescing[譯自AHCI1.0]
Command Completion coalescing(CCC)主要的設計是為了減少Interrupt的產生和Command Complete時造成的系統負擔。Enable這個狀態,減少取得完成時的中斷數,並確保最少命令完成的服務特性。軟體會去具體指明命令完成數量,或是指示Time out終止期限,當Interrupt發生時由硬體去允許軟體去處理已完成之命令。這特徵要實用到所有Port,需要選擇由軟體藉著CCC_PORTS register去Command Completion coalescing設定。
Offset 14h: CCC_CTL – Command Completion Coalescing Control
對於整體的HBA,使用command completion coalescing control register去配置command completion coalescing特徵。
執行時需注意: HBA狀態變數(例如包括hCccComplete和hCccTimer)是使用去描述外部需求可見的運作狀態。執行沒被要求的內部狀態值直接對應到它的變數。
Timeout Value(TV):Timeout值詳細指明以1 millisecond為單位。Timer的準確率在5%以內。hCccTimer是裝Timeout value。當Port上的Command未完成時,則HcccTimer只會一只遞減。當hCccTimer遞減成0時,會引發HBA的CCC信號中斷。在每個CCC interrupt 中HCccTimer會reset成timeout value。一個timeout value為0時將保留此狀態。
Command Completions(CC):命令完成指示之數量以至於必須去產生CCC Interrupt。hCccComplete為HBA上的一個Interrupt command completion counter。每一段時間中在這些Port只要有命令完成時hCccComplete都會有遞增。當hCccComplete等於command completions value時,CCC interrupt的信號會發出。每個CCC interrupt都會將Interrupt command completion counter重置成0。當命令完成指示之數量等於0時將Disable CCC interrupt,i.e.這個例子中,CCC interrupt只會發生於Timer。
Interrupt(INT):詳細指明中斷的使用經由CCC特徵。在對應到Ports Implemented(PI) register的bit存在設定成0時,這個中斷可能標記成未使用。此方式在控制器上CCC interrupt對應到未執行的Port interrupt。當Interrupt發生時,這IS.IPS[INT] bit將還是被設定為1。MSI這領域也詳細指明Interrupt vector的使用。
Enable(EN):當此bit清除成0時,Command Completion Coalescing特徵將Disable與沒有CCC中斷的發生。當設定成1時,Command Completion Coalescing特徵將Enable與CCC中斷可能發生於timeout或Command Comoletion狀態。當EN清除成0時,Software才能改變TV和CC的內容值。這bit由0轉換成1時,對於TV和CC若干區域更新值將會生效。
Offset 18h:CCC_PORTS – Command Completion Coalescing Ports
當 CCC_CTL.EN = ‘1’時,command completion coalescing ports register是用
來詳細指定作為組合相同的CCC特徵部分
Ports:
這register的每個bit都有意義。每個bit都對應到個別的Port
,在bit0就對應到Port0。
如果一個bit設定成1,對應Port上的command completion coalescing特徵部份。
如果一個bit清除成0,沒有Port上的command completion coalescing特徵部份。
在這register的Bits設定成1,在這Ports必須執行register
也有對應的bit設定成1。
1個更新值對於這個領域將生效,內部1個Timer值增加 (1 milli second)
11.1 Command Completion Definition
選擇一個Port出現如下兩者之一命令連接內容時,命令完成已經發生 ︰
- (PxCI[x] transitions from ‘1’ to ‘0’) AND (PxSACT[x] = ‘0’)
- PxSACT[x] transitions from ‘1’ to ‘0’
當一個命令完成HBA內部變數hCcccComplete增加1。如果多個bits轉變的同時,則必須參考之前的資料,若對於hCcccComplete上的每個bit只是增加1時,則符合這項準則。
11.2 Timer Definition
HBA執行Command Completion Coalescing會有一個內部的Timer,選擇一Port執行一個命令組合的當命令未完成時,hCccTimer將會遞減。當隨意選擇一個Port與對其下一個命令組合,若命令未完成,則PxCI或PxSACT的值不為0時。HcccTimer每1 milli second減1(software詳細去分析Timeout value)。這些增加完成命令的總數是引起進入到目前CCC interrupt的關鍵。CCC interrupt利用Interrupt Status (IS) register bit指定在CCC_CTL.INT。在控制器中對於未能執行之interrupt,CCC interrupt也會對應到它。
11.3 Selected Port
這執行Port的子集合,如同定義按照Ports Implemented (PI) register,可能詳細指明關於使用對應Command completion coalescing特徵。這子集合是定義經由bit-標誌暫存器CCC_PORTS。如果CCC_PORTS中1個bit設定為1,相同bit的1也要設定在PI中,當這個Port被選擇時,需去包含Command completion coalescing。
在任何時候軟體都可以去更新CCC_PORTS的內容。可是,如果有尚未完成命令在任一個Port中,在其時間內更新CCC_PORTS。HBA可能不立刻適應剛剛被選擇或者被取消的Port。例如,如果命令在進行中使用一個特定的Port,並且命令即將完成接近相同的時刻,CCC_PORTS被更新至最近選擇Port,這HBA可能不遞增hCccComplete。更新CCC_PORTS值被保證寫入到CCC_PORTS register需在1 milli second內生效。
如果一個Port關於command completion coalescing是目前選擇的和每一錯誤發生,都會要求PxCMD.ST清除為0。在到清除PxCMD.ST成為0之前,軟體將會對於command completion coalescing從被選擇的Port移除受影響的Port。
11.4 Interrupt Definition
接下來任何一種狀況將引起Command coalescing completion interrupt呼叫CCC interrupt:
- 在CCC_CTL.CC中HcccComplete >= 軟體指定value ,其CCC_CTL.CC 不可等於 0。
- HCccTimer遞減成0(遞減成0時會引起interrupt,不會遞減從0至-1)。
- HcccComplete是遞增和在Command coalescing completion中選擇工作的Port沒有未作完之命令,還有CCC_CTL.CC 不可等於 0。
當CCC interrupt發生時,hCccComplete將reset成0與在CCC_CTL.TV的hCccTimer將reset成軟體指定timer value。如果幾個命令完成在同一循環內,hCccComplete將reset成0,最後的hCccComplete value將為0又成為之後的另一個循環。
11.5 Enable and Disable Behavior
當CCC_CTL.EN = 1時,CCC特徵可以使用。當CCC_CTL.EN = 0時,不會有CCC interrupt產生。
CCC_CTL.EN由0變成1時,將發生如下:
- HBA使用Timer value指定在CCC_CTL.TV。
- HBA使用Command Completions value指定在CCC_CTL.CC。
- HCccTimer遇到reset時,將載入CCC_CTL.TV。
- HCccComplete遇到reset時,將清除成0。
在CCC_CTL.EN設定為1的時候,軟體將不能去修改CCC_CTL.TV,也不修改CCC_CTL.CC。當Command Completion Coalescing是enable時,寫入這些值其結果將是不確定之運作狀態。
11.6 Software Behavior
11.6.1 Initiallization
初始化一個Port的command completion coalescing feature設定,軟體所需要去執行幾個步驟
- 對於D2H Register FIS與Set Device Bits FIS (清除PxIE.DHRE和PxIE.SDBE為'0')時,軟體將關閉每個Port的interrupt,對於command completion coalescing部分也是如此。
- 在hot plug和error events軟體將開啟每個Port的interrupt。在這些Port的events將有其對應之服務函式。
- 軟體將確保CCC_CTL.EN是清除為0的狀態。
- 這些Port軟體將對指定command completion coalescing的部份去設定CCC_PORTS成其需求值。注意如果Ports Implemented (PI) register的Bit位置符合,軟體將只設定一個CCC_PORTS register對應Bit位置。
- 軟體將設定CCC_CTL.TV與CCC_CTL.CC所需要內容值
- 軟體將CCC_CTL.EN設定1,去Enable這command completion coalescing。
之後 enable command completion coalescing,當執行初始化的時候,軟體將查看不管在什麼Port的什麼指令的完整性。軟體根據得到每個Port的CCC_PORTS的對應bit是設定為1,就去查看PxCI (non-queued commands)或PxSACT (native queued commands) register。
11.6.2 Errors and Hot Plug Events
注意每個Port要進行error和hot plug事件處理的方式前,需先至每個對應Port去enable (PxIE)的bits為1。當error或hot plug事件發生時,軟體將經由更新CCC_PORTS去移除Port的command completion coalescing設定。這個改變的生效時間將在1 milli second以內完成。然後軟體應該服務error和hot plug的事件。之後Port在一次的起作用,軟體可能經由更新CCC_PORTS去加入Port的command completion coalescing設定。當一個Port去加入或移除command completion coalescing的設定時,CCC_CTL.EN會是設定成1。
11.6.3 CCC Interrupt Handling
根據偵測一個CCC中斷的發生,軟體應該執行接下來的步驟順序。
- 經由寫1到這IS.IPS[CCC_CTL.INT]的bit位置,軟體將去清除CCC中斷。注意如果multiple MSI messaging在這裡使用,則不需要執行此步驟。
- 軟體將詢問PxCI(for non-queueing command)和PxSACT(for native queued commands) registers 去確定命令是否完成。
- 在先前的步驟,軟體將完成命令結束命令到OS識別確認。
11.6.4 Updating Timeout Value or Number of Command Completions
基於執行指定的演算法,軟體在引起CCC中斷之前,其運作過程期間會選擇去更新Timer value或命令完成數量需求。去更新這些值,軟體會執行接下來的步驟:
- 軟體將清除CCC_CTL.EN成0。
- 軟體將更新CCC_CTL.TV(Timeout value)與CCC_CTL.CC(命令完成數量)如同其需求值。
- 軟體將設定CCC_CTL.EN成1。
軟體將不修改CCC_CTL.TV的值,也不修改CCC_CTL.CC的值,當CCC_CTL.EN為1時。當Command Completion Coalecing為Enable狀態時,寫入這些值其結果將是不確定之運作狀態。
當Command Completion Coalecing為Disable狀態時,那些Port加入Command Completion Coalecing設定部份的命令可得到完成。之後重新Enable Command Completion Coalecing,軟體將檢查在初始化期間的任何Port的任何Command。對於每個Port對應CCC_PORTS的bit為1時,軟體會去檢查對應的PxCI(for non-queueing command)和PxSACT(for native queued commands) registers。
11.7 Example(Informative)
這個章節描述當使用command completion coalescing中Multiple Port的commands completing事態範例。這個範例打算說明核心的command completion coalescing概念。
軟體選擇Port 2(CCC_PORTS = 0000004h),Port 4(CCC_PORTS = 00000010h),還有Port 5(CCC_PORTS = 0000020h)去至command completion的設定,寫入CCC_PORTS = 00000034h。CCC_CTL.TV由軟體分配給5000(milliseconds),確保一個CCC Interrupr的產生至少每隔5 second,也確保完成命令不會被更高程次的OS去作Time out。CCC_CTL.CC值設定為5時,經由軟體在port 2,4,5之間合計完成5個Command之後去引起一個CCC中斷。軟體選擇值5是根據觀查在Port 2,4,5目前的交易量,還有基於服務需求量。之後設定CCC_CTL.TV和CCC_CTL.CC為適當值,軟體經由設定CCC_CTL.EN = 1去致能CCC。
軟體接收到對於Port 2發怖的3個命令。這個發怖命令為non-queued方式,結果P2 CI的值為00000015h(命令發怖的所在位置分別在0,2,4),還有P2 SACT為0。軟體接收到對於Port 5發怖的2個命令。這個發怖為NCQ Command,與P5 SACT值的結果為00010100h(命令發怖的所在位置分別在標號8和16)。在這裡指出,hCccTimer已經遞減到4700(已經過了300 milli second,這過程中CCC_CTL.EN設為1),還有hCccComplete仍是0h。
當驅動附屬於Port 2完成Command 0,因此P2 CI更新成00000014h。當P2 CI的bit 0由1轉為0,這hCccComplete變數將增加1,過程中P2 SACT的bit 0同樣的清除為0。下一個驅動附屬於Port 5完成兩個Command,因此P5 SACT更新成0。當bit 8和16由1轉為0,hCccComplete變數將增加經由2變成值為3h。每個Command完成hCccComplete變數將增加1;注意當PxSACT的bit由1轉為0,那裡的PxCI值沒有資格去註冊增加hCccComplete。這裡hCccTimer遞減至4200,還有hCccComplete為3h。
軟體又接收到3個對於Port 5的Command。這些命令發佈跟NCQ commands相同及P5 SACT值的結果為00700000h(命令發佈在20,21,還有22 tag上 )。在這裡命令不再完成,所以hCccComplete的內容值為3h,這時hCccTimer繼續遞減到4000。
驅動Port 5完成Command 22 tag。P5SACT去更新成00300000h。當bit 22由1轉換成0,hCccComplete將增加1,此時值變為4h。
驅動Port 2完成Command在位置2。P2 CI更新成00000010h。當bit 2由1轉換成0,hCccComplete將增加1,此時值變為5h,在這過程中P2SACT的bit 2同樣的清除為0。在這裡hCccTimer遞減到3500,以及hCccComplete是5h。
當hCccComplete到5h時(或大於,如果有多個Command在相同的週期內同時完成),硬體將識別命令完成數量已經達到CCC_CTL.CC門檻。此時硬體將hCccComplete清除成0,並設定hCccTimer為CCC_CTL.TV,還有接著去設定IS.IPS[CCC_CTL.INT]為1(Write 1 clear)。如果Interrupt是Enable(GHC.IE = '1'),HBA此時將引起Interrupt至軟體。
在這中斷被引起到軟體之後,過程的延續以及基於完成命令hCccComplete將再一次啟動遞增,此時hCccTimer將繼續去遞減如同時間的消逝。
假設hCccComplete的CCC_CTL.CC等於5
假設hCccTimer的CCC_CTL.TV等於3000
- 當hCccComplete = = 5與hCccTimer ! = 0,此時命令是已經完成的。則PxCI與PxSACT可等於0,此時代表無下一個工作;若PxCI與PxSACT不等於0,此時表示有下一個工作。
- 當hCccComplete = = 5與hCccTimer = = 0,此時命令沒有完成引發錯誤中斷。
- 當hCccComplete = = 2與hCccTimer = = 0,此時命令是已經完成的。再檢查PxCI與PxSACT可等於0,工作完成,則代表無下一個工作;若PxCI與PxSACT不等於0,此時表示命令沒有完成引發錯誤中斷。
- 當hCccComplete = = 2與hCccTimer ! = 0,此時命令尚未完成,沒有引發任何中斷。
沒有留言:
張貼留言