漫談傳輸介面-PCIe


前言

活動最後一天來講PCIe,每天寫下來其實各個題目都需要分幾天寫才夠,只有一天只能寫些別人比較少寫的部分,之後還是找時間把這些再重寫一次還還債吧。

PCI協會是個很奇怪的協會,定Spec如果覺得之前版本提過的就完全不提,所以直接看PCIe Spec會有股我是誰、我在哪裡、我在讀什麼的感覺,如果從PCI開始知道這個bus就是系統匯流排,要讓FW能做到IO read/write或Memory read/write動作的bus,另外還要達成plug-and-play的能力而能做config read/write,看PCIe spec的規範也是為了達成上述目標,只是它用它的封包傳遞parallel interface各訊號線的資訊。


PCIe簡介

PCIe和SATA類似,spec定義了底層的三層,Physical Layer、Data Link Layer、Transaction Layer,再高層就是CPU或PCI device發出的access request。

Physical Layer

和SATA一樣用差動訊號,一樣使用clock recovery技術得到RX clock,一樣用elastic buffer調速,只是在PCIe的dummy symbol叫做SKIP ordered set,和SATA不太一樣的資料的編解碼規劃在Physical Layer,因此到PCIe Gen3編碼從8b/10b改成128b/130b時Link Layer大部分沒變動(調速到Gen3的LTSSM行為一定要改這沒辦法),PCIe PHY的成功,讓USB3.0定規格的時候直接使用PCIe PHY來做做Physical Layer,只是多定義了USB專屬的LFPS(Low Frequency Periodic Signaling),類似SATA的OOB,以有值沒值的寬度來做區別,後來SATA也可以用PCIe PHY了。PCIe沒有這種Out of Band訊號,直接在Detect對面RX terminiation之後就開始Link Layer的ordered set傳輸來training。

Data Link Layer

要認識Data Link Layer,先知道ordered set,類似SATA的Primitive,以K-code開頭的symbol組合,只是ordered set更長、帶更多的handshake資訊。再來知道Link Layer的State Machine,LTSSM,它描述了怎麼建立PCIe link,如何進出power management state,傳輸過程出錯如何recovery,最後就是DLLP這種封包用來保證Transaction Layer的傳輸正常,SATA的Link Layer是用primitive做handshake,每個動作都要等對面回應latency比較大,PCIe使用封包做handshake,data傳輸不用等對面回應節省很多時間。

Transaction Layer

這邊該知道的就是TLP封包,它可以實現Config Read/Write、IO Read/Write、Memory Read/Write,還有Message TLP可以實現PCI的interrupt pin行為,再來就是PCIe的interrupt機制(其實PCI就有了),MSI和MSI-X,利用memory write動作取代message TLP,可以實現更多的interrupt vector,PCI只有4根interrupt pin,OS看到interrupt還要去找出哪個Device發interrupt,MSI則一個PCI fuction就可以有32個interrupt,MSI-X更可以多到誇張,在NVMe可以使用很多command queue時可以為每個command queue都配一個獨立的interrupt vector。


簡單的講了要認識PCIe該如何開頭,以後有空再來補充內容囉,總算完成七天任務了。

#PCIe







你可能感興趣的文章

什麼是Base64 ?

什麼是Base64 ?

一個資淺工程師年末的自我省視

一個資淺工程師年末的自我省視

1. 開始java 17前,我們先快速了解一下spring boot

1. 開始java 17前,我們先快速了解一下spring boot






留言討論