系統復位(Reset)
在PCIe Spec中,Reset總共分為兩類:Conventional Reset和Function Level Reset.
1. Conventional Reset
從字面上來講,Conventional Reset是傳統的Reset方式。這一類Reset功能是在PCIe Spec 2.0之前的Spec中定義的,所以稱為傳統的Reset。PCIe設備必須要支持這一類Reset。
Convential Resets包含了三種Resets: Cold Reset,Warm Reset 和 Hot Reset.
另外,還有一個概念: Cold Reset和Warm Reset又被稱為Fundamental Reset, Hot Reset被稱為Non-Fundamental Reset.
什么是Fundamental Reset呢?
這是PCIe最基本的復位方式,主要通過硬件實現,效果是重置整個設備,對每個狀態機、所有硬件邏輯、端口狀態和配置寄存器重新初始化。
但是,也會有例外的情況:在某些寄存器中的字段只有在全部電源(包括VCC電源和Vaux備用電源)切斷的情況下才會被重置。PCIe Spec給這些固執的字段起了個外號"Sticky Bits".
一般來說,Fundamental Reset是針對整個系統做Reset,但是有時也可以針對某個單一設備進行重置。
在這里說明一下Fundamental Reset中的Cold Reset和Warm Reset。
- Cold Reset : 設備的主電源VCC上電時,就會觸發Cold Reset。
- Warm Reset : 在VCC不斷電的情況下,系統可以觸發Warm Reset。比如,電源狀態的變化就會觸發Warm Reset. 不過,PCIe Spec并沒有定義觸發Warm Reset的具體方式,這部分可以有系統設計人員自行決定。
另外,在PCIe Spec中,規定了兩種觸發Fundamental Reset方式。
舉個例子,看看PERST#是如何生成的。
明白了Fundamental Reset,那Non-Fundamental Reset中的Hot Reset又是什么呢?
與Fundatmental Reset相反,Hot Reset是一種軟件控制的復位方式。PCIe設備出現錯誤時,通常情況下用軟件的方式對設備重置。軟件可以通過在Bridge control中設置Secondary Bus Reset bit來觸發Hot Reset.
另外,在PCIe總線中,通過發送TS1序列,并且在TS1序列中設置Hot Reset bit來對下游設備進行Hot Reset(如下圖紅色框).
在這個過程中,發送端會持續發送TS1序列至2ms, 接收端在接到2個連續的TS1序列之后進行Hot Reset.
同樣,舉個例子說明一下Hot Reset:
- 系統通過軟件對Switch A左邊端口的Secondary Bus Reset bit置為1(下圖紅色框),觸發了Hot Reset.
- 之后通過發送TS1序列對PCIe鏈路中的下游設備觸發Hot Reset(下圖黑色箭頭).
2. Function Level Reset
在傳統復位方式的基礎上,PCIe Sepc 2.0以后開始增加了新的復位方式FLR(Function Level Reset)。前面講到的傳統復位方式(Cold Reset, Warm Reset, Hot Reset)均屬于全局復位方式,而FLR的優勢則是對局部復位。
在PCIe協議中,一個PCIe設備可能包含多個功能模塊(Function),每個功能模塊相互對立,共用一個PCIe link。其中,某個功能模塊出問題時,雖然可以采用傳統復位方式對整個PCIe設備復位,但這個顯然不友好,因為其他功能模塊可能正在埋頭苦干。這就好比如,在一個團體中,一個人犯錯了,要團隊所有人一起承擔,這個肯定會影響團結呀。
所以,PCIe深得管理學的精髓,為了不影響團結,FLR允許只對其中出錯的功能模塊(Function)進行重置,其他功能模塊正常工作。
不過,FLR復位方式對PCIe設備并不是必須的,在對PCIe設備使用FLR復位之前必須先檢查是否支持FLR。這部分可以查看Device Capabilities Register是否將Funcion-Level Reset Capability bit置起。
如果PCIe設備支持FLR,那么就可以通過設置Device Control Register中的Function-Level Reset bit觸發FLR復位咯~
觸發FLR之后,PCIe鏈路中都有哪些變化呢?
我們前面提到了,FLR是一個局部復位方式,只對出問題的那個Function起作用。所以說, FLR只會改變當下Function內部的狀態和寄存器的內容 。以下幾個方面不會被影響:
- 執行FLR的Function所在的PCIe鏈路狀態不會改變,因為其他Function也在共用整條PCIe鏈路;
- Sticky Bits . 傳統復位方式也無法改變Sticky bits, 除非完全斷電。
- HwInit Bits . HwInit bits是硬件初始化的內容,這些值由芯片的配置引腳決定,后者上電復位后從EEPROM中獲取。Cold和Warm Reset可以復位這些寄存器,然后從EEPROM中從新獲取數據,但是使用FLR方式不能復位這些寄存器。
- 與Link相關的寄存器 。比如ASPM,Flow control等相應的寄存器。
另外,PCIe Sepc規定,某個Function的FLR必須在100ms之后完成。所以,PCIe Spec寫了一封倡議書給要使用FLR復位方式的"人們"-軟件:
為了創造一個溫馨的FLR工作環境,請做到以下幾點:
- 在FLR工作期間,請不要訪問對應的Function;
- 清除所有的Command Register;
- 通過Polling Device Status Register中的Transaction Pending bit來確保之前請求的Compeletion報文已完成,或者確保后續不會再發送Compeletion報文。
- 觸發FLR之后,請耐心等待至少100ms;
- 初始化Function的配置寄存器,讓其正常工作。
在FLR執行的過程中,如果收到TLP或者Compeletions都會被默默的丟棄,而不會向系統報錯。
舉個栗子,看看FLR執行過程,
- 如下圖,這個PCIe設備中有兩個功能模塊:Function 0和Function 5. 此時,兩個Functions依舊是互不干擾,認真工作,傳輸TLPs.
- 之后,Function 5出了一些問題,需要做FLR。FLR之后,Function5中的之前的TLPs全部被清除。
- Function 5做FLR,并不影響Function 0,繼續TLPs傳輸。如下圖,3個TLPs正常傳輸完畢。
-
控制器
+關注
關注
112文章
16212瀏覽量
177446 -
EEPROM
+關注
關注
9文章
1010瀏覽量
81413 -
TLP
+關注
關注
0文章
32瀏覽量
15605 -
Vcc
+關注
關注
2文章
305瀏覽量
35860 -
PCIe接口
+關注
關注
0文章
120瀏覽量
9679
發布評論請先 登錄
相關推薦
評論