狀態機描述
Config.linkwidth.start:
1.
(1)Linkup = 0 + 狀態機沒有執行鏈路寬度的升級(upconfiguration of the Link width):那么tx會在所有active的dsp上發送TS1,其中link num為具體內容,lane num為pad;
(2)upconfigure_capable為1(這個變量為1一般表示上層邏輯執行鏈路寬度的減少),并且狀態機沒有執行upconfiguration of the Link width,那么自從進入到recovery狀態之后,并且在當前子狀態下收到了兩個連續的TS1,其中link num和lane num均為pad,此后檢測到退出Electrical Idle,那么tx會在inactive Lane上發送TS1,其中link num為具體內容,lane num為pad;
那么什么是active的lane呢?-dsp/usp均滿足
從Polling狀態進入此子狀態時,所有檢測到接收端的通道會被視作Active Lane。從Recovery狀態進入此子狀態時,所有歷經 Configuration.Complete 狀態的鏈路上的通道,都會被視作Active Lane。
另外注意一點,DSP必須在發送的TS1中通告自身所有支持的速率,其中也需要包括端口不打算使用的速率。
此外針對usp,還需要注意,如果此時的狀態跳轉不是由 LTSSM 超時觸發的,那么此時發送方應該在 Configuration 狀態中發送的 TS1 中置位 Autonomous Change 比特 (Symbol 4, bit 6) ,表示發送方出于自身(Autonomous )原因想要改變鏈路寬度,從而進入 Configuration 狀態。
2.
(1)dsp:
Linkup = 1 + 狀態機執行鏈路寬度的升級(upconfiguration of the Link width):那么tx會在那么會在下列三類通道上發送link num和lane num均為pad的TS1.
A:當前工作的通道上;
B:想要激活的非工作通道;
C:自從進入recovery狀態之后已經收到兩個連續的TS1接收到TS1的通道上,并且,在該通道上檢測到退出Electrical Idle。
? Usp:tx會在下列三類通道上發送link num和lane num均為pad的TS1.
A:當前工作的通道上;
B:想要激活的非工作通道;
C:如果upconfigure_capable為1,針對inactive的lane,并且這個lane自從進入recovery狀態之后已經收到兩個連續的TS1接收到TS1的通道上,并且,在該通道上檢測到退出Electrical Idle的lane。
注意三點:
A:如果 USP 打算恢復鏈路寬度,LTSSM 首先等待下述兩個條件任意滿足一個:所有待激活的通道上都接收到兩個連續的鏈路編號有效,通道編號為填充符號的TS1或者任意一個待激活通道進入本狀態超過1ms
B:為了避免將鏈路的寬度配置小于正常寬度,協議建議如果在多通道鏈路上發現某些通道出現錯誤或者失去 Block Alignment 狀態,那么延遲一段時間后再進行本過程。8b/10b 編碼時等待至少2個TS1,128b/130b 編碼時至少等待34個 TS1,但任何情況下不要等待超過1ms。
C:在激活不工作的通道后,發送端必須等待發送共模電壓(Tx common mode voltage)穩定,才能退出電氣空閑狀態并開始發送TS1。
(2)那么什么時候開始發送link num為具體數值,但是lane num為pad的TS1呢?在滿足以下條件之一即可:
Dsp
A:在發送TS1的lane上收到了收到了兩個連續的TS1,并且link num和lane num均為pad;
B:1ms超時;
另外注意兩點,在激活不工作的通道時,發送端必須等待發送共模電壓(Tx common mode voltage)穩定,才能退出電氣空閑狀態并開始發送TS1;對于組合為同一鏈路的通道,他們的鏈路編號必須相同。只能在支持多鏈路配置的不同鏈路之間才可以分配不同的鏈路編號。
Usp:
如果一些通道接收到了兩個連續的鏈路編號有效,通道編號為填充符號的TS1, usp選取其中一個接收到的鏈路編號作為這些通道的鏈路編號,并在所有收到鏈路編號非空的TS1的通道上,回復采用該鏈路編號的TS1,通道編號繼續使用填充字符。對于剩下的通道,如果他們檢測到了接收方,但是還沒有收到鏈路編號,那么則發送鏈路編號和通道編號都采用填充符號的TS1。
3.針對支持crosslinks特性:
Dsp
會在所有detect階段檢測為receiver的lane上先發送16~32個TS1,其中link num為具體數值,lane num為pad。在此之后,任意一個lane在收到兩個連續的TS1,其中link num為具體數值,lane為pad,隨后dsp轉變為usp(為了根據timeout機制決定誰才是真正的dsp,如果 DSP 接收到的第一批 TS1 中,鏈路編號就已經不是填充符號了,那么 DSP 通過這種現象就意識到存在交叉鏈路(Crosslink),鏈路對端設備此時也是 DSP。針對這種情況,面向下游的通道將轉換為面向上游通道,DSP 等待長度隨機的超時時間后,重新進入 Configuration.Linkwidth.Start 狀態,只不過此時該通道將變成面向上游的通道)。并且轉變為Configuration.Linkwidth.Start的條件變為和usp一樣。
注意兩點,針對兩端都想變為dsp的情況,可以讓雙方都先變為usp,隨后雙方都隨機等一個時間,超時后usp轉變為dsp。因為雙方的超時時間長度是不同的,最終將有一個端口成為 DSP ,而另一個端口仍然是 USP,這樣一來訓練就可以繼續進行。超時時間長度必須是隨機,這樣即使鏈路雙方的端口實現完全相同,也不會出現死鎖的情況;如果支持交叉鏈路特性,那么在接收的 TS1 的鏈路編號從PAD轉換到非PAD符號的過程中,不允許出現TS2打斷這個過程。
Usp:
對于支持交叉鏈路特性的 USP 來說,當 LinkUp = 0b 時,需要在所有檢測到接收端的通道上至少發送 16-32 個 TS1,其中鏈路編號和通道編號采用填充符號。隨后任何usp的一些通道上接收到了兩個連續的鏈路編號有效,通道編號為填充符號的TS1,那么有如下操作和條件:
A:tx持續發送TS1,link num和lane num均為pad;
B:如果任意通道接收到了兩個連續的鏈路編號有效,通道編號為填充符號的TS1, usp選取其中一個接收到的鏈路編號作為這些通道的鏈路編號,并在所有收到連續兩個鏈路編號非空的TS1的通道上(lane編號為lane),回復采用該鏈路編號的TS1,通道編號繼續使用填充字符。對于剩下的通道,如果他們檢測到了接收方,但是還沒有收到鏈路編號,那么則發送鏈路編號和通道編號都采用填充符號的TS1。下一個狀態是 Configuration.Linkwidth.Accept。
C:為了避免將鏈路的寬度配置小于正常寬度,協議建議如果在多通道鏈路上發現某些通道出現錯誤或者失去 Block Alignment 狀態,那么延遲一段時間后再進行本過程。8b/10b 編碼時等待至少 2 個 TS1,128b/130b 編碼時至少等待 34 個 TS1,但任何情況下不要等待超過 1ms。
注意,如果不滿足上述條件,經過Tcrosslink時間后,16-32個TS1,其中linknum和lane num均為pad,usp變為dsp,下個狀態變為Configuration.Linkwidth.Start(相當于重新開始)。
Config.linkwidth.accept:
Dsp:
dsp提議通道編號值。如果一條鏈路可以由多個通道合并組成,這些通道都可以收到兩個連續的,鏈路編號值相同的 TS1,那么dsp會為他們發送鏈路編號一致,但是通道編號各不相同的TS1。對于剩下的通道,如果他們沒有接收到TS1,那么發送鏈路編號和通道編號都采用填充符號的TS1,不能打斷原有發送過程。
為了避免將鏈路的寬度配置小于正常寬度,協議建議如果在多通道鏈路上發現某些通道出現錯誤或者失去 Block Alignment 狀態,那么延遲一段時間后再進行本過程。8b/10b 編碼時等待至少2個TS1,128b/130b 編碼時至少等待34個TS1,但任何情況下不要等待超過1ms。-dsp/usp均滿足
1.變量變化
A:在滿足如下條件的時候use_modified_TS1_TS2_Ordered_Set變為1:
(1)LinkUp = 0b -dsp/usp均滿足
(2)自從進入polling狀態以來,tx已經在polling/Configuration狀態下發送Modified TS1/TS2,在TS1/TS2中設置symbol5中的Enhanced Link Behavior Control field為‘b11。針對up端,要求在所有的TS1/TS2中發送這樣的序列
(3)導致從polling.configuration轉變到configuration狀態的那8個連續的TS2的data rate中設置了Enhanced Link Behavior Control field位為’b11(symbol5)+TS2中的32.0 GT/s data rate is supported設為1。注意這8個TS2要求是連續的,并且是在所有lane上都收到才能滿足從polling.configuration轉變到configuration狀態。-dsp/usp均滿足
B:在滿足如下變化Flit_Mode_Enabled變量設為1:
(1)LinkUp = 0b-dsp/usp均滿足
(2)自從進入polling狀態以來,tx已經在polling/Configuration狀態下發送相關TS1/TS2,在其中TS1/TS2中設置symbol4中bit0,也就是Flit Mode Supported bit中的Data Rate Identifier為‘b1。-dsp/usp均滿足
(3)導致從polling.configuration轉變到configuration狀態的那8個連續的TS2的data rate中設置了flit mode supported位(也就是symbol4的bit0)為1。注意這8個TS2要求是連續的,并且是在所有lane上都收到才能滿足從polling.configuration轉變到configuration狀態。-dsp/usp均滿足
usp:
usp在從dsp提供的鏈路編號中選擇其中一個,填充至所有通道的TS1中,反饋發送給dsp。這里所有通道指的是那些所有接收鏈路編號不為填充字符TS1的通道。在所有剩余的通道中,如果檢測到對端接收方,但是沒有接收到有效鏈路編號的通道,將繼續發送鏈路編號和通道編號采用填充符號的TS1。
如果一個link可以使用具體數值的link num號來實現configured link(注意,這個link num來自于收到的兩個連續的TS1,并且這兩個TS1中的link num和lane num均不為pad,兩個連續的TS1中的link num和lane num前后一致),那么TS1會發送和收到的TS1的link num/lane num一致或不一致的TS1(針對不一致的TS1往往是存在于lane reversed)。
另外注意三點:
(1)收到的TS1既可以是標準的TS1,也可以是Modified的TS1(Modified的TS1只有在use_modified_TS1_TS2_Ordered_Set為1的情況下);
(2)針對lane進行編號的時候,需要注意,lane num必須要針對連續的grouping的lane進行連續的編號,針對沒有收到TS1的lane,相當于這個lane不屬于一個grouping的lane。剩下的lane必須要發送link num和lane num均設為pad的TS1。
(3)比如說一個 x8 鏈路,將會把它的通道編號為 0-7。端口需要支持鏈路容納其所擁有的最大通道數,也需要支持鏈路容納最少至一個通道。通道總是從 0 開始編號,并且需要是連續編號不中斷的。比如,如果一個 x8 鏈路上有些通道不工作,它可能可以轉而配置成一個 x4 鏈路,這種情況下它必須使用通道 0-3。再舉一個例子,如果是鏈路的通道 2 無法正常工作,無法使用通道 0,1,3,4 組成一個 x4 鏈路,因為它們的編號是不連續的。鏈路上任何剩余的通道必須發送鏈路和通道編號都使用填充符號的 TS1。
Configuration.Lanenum.Wait
如果use_modified_TS1_TS2_Ordered_Set為1,需要注意:
(1)tx需要發送Modified TS1而不是正常的TS1;
(2)rx端必須檢查是否收到Modified TS1(注意一開始進入這個狀態的時候可能還是收到標準的TS1,需要檢查的是收到連續的Modified TS1)
為了避免將鏈路的寬度配置小于正常寬度,協議建議如果在多通道鏈路上發現某些通道出現錯誤或者失去 Block Alignment 狀態,那么延遲一段時間后再進行本過程。8b/10b 編碼時等待至少 2 個 TS1,128b/130b 編碼時至少等待 34 個 TS1,但任何情況下不要等待超過 1ms。
Dsp:
在 Configuration.Lanenum.Wait 狀態期間,DSP 會繼續發送鏈路和通道編號為非填充值的 TS1,直至滿足某個跳轉到其他狀態的條件。
Usp:
在 Configuration.Lanenum.Wait 狀態期間,USP 會繼續發送鏈路和通道編號為非填充值的 TS1,直至滿足某個跳轉到其他狀態的條件。