PCIe LTSSM,全名為Link Training and Status State Machine,主要是用在PCIe中Physical Layer Link的初始化與設置,讓device之間建立起溝通橋梁。整個LTSSM狀態機總共有11個state,每個state又可以分為多個substates,所以整個狀態機的跳轉可以說是非常的錯綜且複雜且完善,此篇主要是前情提要,介紹一些名詞,之後會在用另外一個篇幅講解實際兩個PCIe Device LTSSM是如何運做的(更新:連結如下)。
原理PCI Express - LTSSM 狀態機推演 "Detect -> Polling -> Configuration -> L0"
原理PCI Express - LTSSM Equalization狀態機推演
■ Training Sequences
Traning Sequences Order Sets主要有兩種,分別為TS1和TS2,主要目的是為了建立Bit Lock和Symbol Lock和交換Physical Layer的參數。當Link運作在2.5 GT/s(Gen 1)或5 GT/s(Gen 2)時,TS1/TS2使用8b/10b編碼,8 GT/s則使用128b/130b編碼。
■ Link
Data Rate Negotiation
PCIe Link主要可以分為三個Data Rates,分別為2.5 GT/s、5 GT/s和8 GT/s(目前已經有Gen4 16 GT/s、Gen5 32GT/s的出現,但由於我閱讀的版本為 Gen3 spec,所以範圍以Gen3為主),每個link一開始必須以Gen1的Data Rate開始initial過程,在Training Sequence Ordered Set的Data Rate
Identifier欄位就是用來標記device所有support的data rate。
■ Link Width and Lane Sequence Negotiation
PCIE link的組成方式必須要是1、2、4、8、12、16和32,也可以表達成x1(by one)、x2、x4、x8、x12、x16和x32,一個Link上所有的Lane必須以相同的頻率,同時地傳送資料。
在negotiation的過程當中,LTSSM會決定PCIe Port的link number和lane number,舉例來說,一個x16 Root Port可以分為兩個x8 Link接到不同的device,因此這兩個link的link number分別為0和1,然後lane number都是為0~7。那如果一個x16 Root Port,其中只有12個lanes有連接device,那剩餘4個lanes必須保持在Electrical Idle。
■ LTSSM Introduction
● Detect State
這個state主要是用來偵測另一頭有沒有device存在,Detect State又可以分為兩個substates,分別為Detect.Quiet和Detect.Active。
- Detect.Quiet: Quiet的狀態下,Tx會處於Electrical Idle的狀態,且起始會以2.5 GT/S的速度開始,也就是Gen1 Link Speed。
- Detect.Active: 在這個state,會perform一個叫做Receiver Detection Sequence。Receiver Detection Sequence首先會讓Transmitter處於一個穩定的電壓狀態,然後持續的對D+與D-增加電壓直到符合VTX-RCV-DETECT,另一放面持續的去偵測Receiver的高阻抗,然後用充電的曲線(rate)來判斷是否有device的存在。
● Polling State
在這個階段PCIe Port會開始傳送TS Order Set,並且回應所接收到的TS Order Set,且在這個state必須要建立Bit lock和Symbol lock。Polling又可以分為三個substates,分別為Polling.Active、Polling.Compliance和Polling.Configuration。
- Polling.Active: 在這個狀態下,Transmitter會開始傳送TS1 Order Set,並且將"Link Number" & "Lane number within Link"的欄位(參考上面TS1 Order Set的Symbol 1&2),設為PAD(類似C語言的NULL的意思,只是初始值,沒有任何意義),而且所有傳送的TS1中的Data Rate Identifier欄位必須將所有support的date rate設為1。
- Polling.Compliance: 這個state主要透過示波器、封包產生器或位元錯誤率測試儀用來做interoperability testing,舉例來說只有EE想要量測訊號才會需要進入此state,一般的link training是可以跳過這個狀態的。
- Polling.Configuration: 在上面有提到Polling.Active會傳送Lane/Link number為PAD/PAD的TS1,Polling.Configuration則是傳送Lane/Link number為PAD/PAD的TS2,所以Polling.Configuration的TS2有點像是TS1的Double Confirm 的概念。
● Configuration State
Configuration State主要任務是分配Port上所有的Lanes,且分組成個別獨立的Links,主要是透過TS1、TS2中的Link Number & Lane number within Link欄位來達成,與Polling State不一樣,這裡的Link/Lane number不再是PAD,而是實際的數字。
Configuration可以分為6個substates,分別為Configuration.Linkwidth.Start、Configuration.Linkwidth.Accept、Configuration.Lanenum.Wait、Configuration.Lanenum.Accept、Configuration.Complete和 Configuration.Idle。
P.S. Configuration State比較特別,spec中有分為DownStream Lanes和UpStream Lanes,且兩個角色的一些判斷rules會不太一樣,原因是因為從屬關係,很多事情必須要由Host來發動,舉例來說,Root Port底下接了一個PCIe device,那Root Port就是Host的腳色,也就是DownStream Lanes,且DownStream & UpStream 的每一個Lane的Tx & Rx都是同時在傳送與接收的。
- Configuration.Linkwidth.Start:
- DownStream: 由於Downstream不知道現在port的連接如何,所以會以試探性的方式,在所傳送出的TS1中的Link number欄位選擇任意號碼做為初始值,然後Lane number維持PAD。
- UpStream: 傳送TS1,且Link/Lane number欄位保持PAD,並且在收到一定數量和條件的TS1後,比DownStream較早進入Linkwidth.Accept。
- Configuration.Linkwidth.Accept:
- DownStream: 當DownStream接收一定數量的TS1中,Link Number欄位符合Linkwidth.Start state所傳出的號碼,那就可以形成一個Link Group。
- UpStream: 會根據在DownStream在Linkwidth.Start階段所發出的Link Number中,選定一個號碼作為此port的Link Number,因此會在傳送TS1中將Link Number欄位填入這個號碼,所以顧名思義,UpStream接受了(Accept)了這個Link Number。
- Configuration.Lanenum.Wait:
- DownStream: 由於在Linkwidth.Accept的階段某些Lanes已經組成一個Link Group,因此DownStream會開始在這個階段傳送獨立的 Lane Number值到每個Lane上。
- UpStream: 會根據接收到的Lane number,直接回傳相同的號碼或者不同(Lane Reversal),這裡spec有提到相同或不相同,都還是可以進入下一個state。
- Configuration.Lanenum.Accept:
- 當接收到TS1 Link/Lane number都與自己所傳送的相符合,則會進入Configuration.Complete state。
- Configuration.Complete:
- 接續Lanenum.Accept state,Complete階段會開始傳送相同的Link/Lane number,只是與Lanenum.Accept的差異在於Complete傳送的是TS2。
- Configuration.Idle:
- 在這個state,雙方會開始傳送Idle Symbols,當接收到連續8個Idle Symbols後,則會進入L0。
■ Recovery State
Recovery 可以分為5個substates,分別為 Recovery.RcvrLock、Recovery.RcvrCfg、Recovery.Speed、Recovery.Idle和Recovery.Equalization。
- Recovery.RcvrLock: 在這個階段Up&Down會開始傳送TS1,其中Link/Lane Number必須要和Configuration.Complete階段所傳送的值相同。如果是為了升速,TS1 Symbol 4[7] "speed_change"欄位會設為1。
- Recovery.RcvrCfg: 在這個階段如果當前速度運行在2.5 GT/s(Gen1),且是為了升速到5.0 GT/s(Gen2),那必須在這個階段傳送TS2,Link/Lane number必須和RcvrLock的值相同,且speed_change bit必須為1。如果當前速度運行在8.0 GT/s(Gen3),DownStream Port會在此階段傳送一個EQ TS2來通知UpStream,需要進入Recovery.Equalization state來進行Equalization的動作,Equalization 之後可能在另外寫一個章節來完整描述。
- Recovery.Speed: 在這個階段,表示Up&Down要開始進行升速的動作,當一進入這個state,會直接進入Electrical Idle的狀態,並且開始傳送EIOS,當升速成功雙方都會在自己的hardware register "successful_speed_negotiation" bit設為1,表示升速成功,否則為0。
- Recovery.Idle: 在這個階段會開始傳送Idle data,當符合一定數量和條件的data後則會進入L0。
PCIE小弟不是專業,但大大編列的很棒,從Training Sequences都有說
回覆刪除獲益良多~
感謝回覆,因為撰寫的目的不只是讓更多人可以來討論,同時也是為了自己筆記,所以盡量寫的完整一點
刪除假設Upstream&Downstream支援到GEN3https://datongfirmware.blogspot.com/logout?d=https://www.blogger.com/logout-redirect.g?blogID%3D8996770369363414048%26postID%3D8047565090425692965
回覆刪除Detect會先GEN1執行到L0,在跳到Recovery traning到GEN3嗎?
假設Upstream&Downstream支援到GEN3
回覆刪除Detect會先GEN1執行到L0,在跳到Recovery traning到GEN3嗎?
會,我的另外一篇最下面有提到,但我還沒整理,雙方都支援Gen3 Data Rate Identifier,則會進入到Recovery State做Equalization(EQ)升速到Gen3
刪除http://datongfirmware.blogspot.com/2021/11/pci-express-ltssm-state-detect-polling.html
謝謝~~
刪除感謝大神 受益良多
回覆刪除期待EQ的篇章
謝謝,我太懶了,我努力
刪除感謝大神整理,
回覆刪除不過請問在Link Width and Lane Sequence Negotiation這個段落提到的8個lane number是不是應該為0~7?而不是0~8?
沒錯,謝謝指正,已修改
刪除你真的是高手,解釋得很清楚。
回覆刪除Root Port底下接了一個PCIe device,那Root Port就是Host的腳色,也就是DownStream Lanes
請問這句話的意思就是Root Port的接口因為是downstram port,所以接到的Lanes就是downstream lanes,這樣理解是對的嗎?
我也是這樣理解
刪除