2021年3月29日 星期一

簡介PCI Express: Link Training and Status State Machine( LTSSM 狀態機 )

PCIe LTSSM,全名為Link Training and Status State Machine,主要是用在PCIePhysical Layer Link的初始化與設置,讓device之間建立起溝通橋梁。整個LTSSM狀態機總共有11state,每個state又可以分為多個substates,所以整個狀態機的跳轉可以說是非常的錯綜且複雜且完善,此篇主要是前情提要,介紹一些名詞,之後會在用另外一個篇幅講解實際兩個PCIe Device LTSSM是如何運做的(更新:連結如下)。

原理PCI Express - LTSSM 狀態機推演 "Detect -> Polling -> Configuration -> L0"

原理PCI Express - LTSSM Equalization狀態機推演


■ Training Sequences

Traning Sequences Order Sets主要有兩種,分別為TS1TS2,主要目的是為了建立Bit LockSymbol 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/s5 GT/s8 GT/s(目前已經有Gen4 16 GT/sGen5 32GT/s的出現,但由於我閱讀的版本為 Gen3 spec,所以範圍以Gen3為主),每個link一開始必須以Gen1的Data Rate開始initial過程,在Training Sequence Ordered SetData Rate Identifier欄位就是用來標記device所有supportdata rate

 

■ Link Width and Lane Sequence Negotiation
PCIE link
的組成方式必須要是1248121632,也可以表達成x1(by one)x2x4x8x12x16x32,一個Link上所有的Lane必須以相同的頻率,同時地傳送資料。

negotiation的過程當中,LTSSM會決定PCIe Portlink numberlane number,舉例來說,一個x16 Root Port可以分為兩個x8 Link接到不同的device,因此這兩個linklink number分別為01,然後lane number都是為0~7。那如果一個x16 Root Port,其中只有12lanes有連接device,那剩餘4lanes必須保持在Electrical Idle

 

■ LTSSM Introduction

● Detect State

這個state主要是用來偵測另一頭有沒有device存在,Detect State又可以分為兩個substates,分別為Detect.QuietDetect.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 lockSymbol lockPolling又可以分為三個substates,分別為Polling.ActivePolling.CompliancePolling.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.StartConfiguration.Linkwidth.AcceptConfiguration.Lanenum.WaitConfiguration.Lanenum.AcceptConfiguration.CompleteConfiguration.Idle

P.S. Configuration State比較特別,spec中有分為DownStream LanesUpStream 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 State主要任務有幾個,(1)想要改變Data Rate,例如雙方都有宣稱自己support 高於Gen1 speed data rate,則會進入Recovery State 來training link speed to Gen3,(2)當Link開始不穩定的時候,可能會傳出format錯誤的TLP,這時候必須進入Recovery來重新建立Bit Lock、Symbol Lock和Lane-to-Lane de-skew

Recovery 可以分為5個substates,分別為 Recovery.RcvrLockRecovery.RcvrCfgRecovery.SpeedRecovery.IdleRecovery.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。

 

 Reference:PCI Express® Base Specification Revision 3.0


12 則留言:

  1. PCIE小弟不是專業,但大大編列的很棒,從Training Sequences都有說
    獲益良多~

    回覆刪除
    回覆
    1. 感謝回覆,因為撰寫的目的不只是讓更多人可以來討論,同時也是為了自己筆記,所以盡量寫的完整一點

      刪除
  2. 假設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嗎?

    回覆刪除
  3. 假設Upstream&Downstream支援到GEN3
    Detect會先GEN1執行到L0,在跳到Recovery traning到GEN3嗎?

    回覆刪除
    回覆
    1. 會,我的另外一篇最下面有提到,但我還沒整理,雙方都支援Gen3 Data Rate Identifier,則會進入到Recovery State做Equalization(EQ)升速到Gen3
      http://datongfirmware.blogspot.com/2021/11/pci-express-ltssm-state-detect-polling.html

      刪除
  4. 感謝大神 受益良多
    期待EQ的篇章

    回覆刪除
  5. 感謝大神整理,
    不過請問在Link Width and Lane Sequence Negotiation這個段落提到的8個lane number是不是應該為0~7?而不是0~8?

    回覆刪除
  6. 你真的是高手,解釋得很清楚。
    Root Port底下接了一個PCIe device,那Root Port就是Host的腳色,也就是DownStream Lanes
    請問這句話的意思就是Root Port的接口因為是downstram port,所以接到的Lanes就是downstream lanes,這樣理解是對的嗎?

    回覆刪除

解析 NVM Express - 透過Linux OS 解析M.2 NVMe SSD

在之前,我撰寫了三篇有關NVMe的文章 ,分別是" 原理NVM Express - NVMe Submission Queue & Completion Queue (SQ & CQ) "、" 原理NVM Express - Admi...