老男孩讀PCIe之五:TLP結構

原創內容,轉載請注明:  [http://www.od-music.com]  謝謝!

無論Request TLP,還是作為回應的Completion TLP,它們模樣都差不多:

?

?

TLP主要由三部分組成:Header,Data和CRC。TLP都是生于發送端的事務層(Transaction Layer),終于接收端的事務層。

?

每個TLP都有一個Header,跟動物一樣,沒有頭就活不了,所以TLP可以沒手沒腳,但不能沒有頭。事務層根據上層請求內容,生成TLP Header。Header內容包括發送者的相關信息、目標地址(該TLP要發給誰)、TLP類型(前面提到的諸如Memory read,Memory Write之類的)、數據長度(如果有的話)等等。

?

Data Payload域,用以放有效載荷數據。該域不是必須的,因為并不是每個TLP都必須攜帶數據的,比如Memory Read TLP,它只是一個請求,數據是由目標設備通過Completion TLP返回的。后面我們會整理哪些TLP需要攜帶數據,哪些TLP不帶數據的。前面也提到,一個TLP最大載重是4KB,數據長度大于4KB的話,就需要分幾個TLP傳輸。

?

ECRC(End to End CRC)域,它對之前的Header和Data(如果有的話)生成一個CRC,在接收端然后根據收到的TLP,重新生成Header和Data(如果有的話)的CRC,和收到的CRC比較,一樣則說明數據在傳輸過程中沒有出錯,否則就有錯。它也是可選的,可以設置不加CRC。

?


Data域和CRC域沒有什么好說的,有花頭的是Header域,我們要深入其中看看。

?

一個Header大小可以是3DW,也可以是4DW。以4DW的Header為例,TLP的Header長下面樣子:

紅色區域為所有TLP Header公共部分,所有Header都有這些;其它則是跟具體的TLP相關。

?

稍微解釋一下:

Fmt:Format, 表明該TLP是否帶有數據,Header是3DW還是4DW;

Type:TLP類型,上一節提到的,Memory Read, Memory Write, Configuration Read, Configuration Write, Message和Completion,等等;

R: Reserved,為0;

TC: Traffic Class,TLP也分三六九等,優先級高的先得到服務。這里是3比特,說明可以分為8個等級,0-7,TC默認是0,數字越大,優先級越高;

Attr: Attrbiute, 屬性,前后共三個bit,先不說;

TH: TLP Processing Hints,先不說;

TD: TLP Digest,之前說ECRC可選,如果這個這個bit置起來,說明該TLP包含ECRC,接收端應該做CRC校驗;

EP: Poisoned data, 有毒的數據,遠離,哈哈;

AT: Address Type,地址種類,先不說;

Length: Payload數據長度,10個bit,最大1024,單位DW,所以TLP最大數據長度是4KB; 該長度總是DW的整數倍,如果TLP的數據不是DW的整數倍(不是4Byte的整數倍),則需要用到下面兩個域:

Last DW BE 和 1st DW BE。

?

我覺得,到目前為止,對于Header,我們只需知道它大概有什么內容,沒有必要記住每個域是什么。

?

這里重點講講Fmt和Type,看看不同的TLP(精簡版的,Native PCIe設備所有)其Fmt和Type應該怎樣編碼:

?

?

?

?

?

?

?

TLP

Fmt

Type

Comment

Memory Read Request

000=3DW,no data

001=4DW,no data

0 0000

3DW或者4DW是指Header大小,Memory Read不帶數據

Memory Write Request

010=3DW,with data

011=4DW,with data

0 0000

Memory Write必須帶數據

Configuration Type 0 Read Request

000=3DW,no data

0 0100

EndpointConfiguration,不帶數據,Header總是3DW

Configuration Type 0 Write Request

010=3DW,with data

0 0100

EndpointConfiguration,帶數據,Header總是3DW

Configuration Type 1 Read Request

000=3DW,no data

0 0101

SwitchConfiguration,不帶數據,Header總是3DW

Configuration Type 1 Write Request

010=3DW,with data

0 0101

SwitchConfiguration,帶數據,Header總是3DW

Message Request

001 = 4DW, no data

1 0rrr

MessageHeader總是4DW

Message Request with Data

011 = 4DW, with data

1 0rrr

MessageHeader總是4DW

Completion

000=3DW,no data

0 1010

CompletionHeader總是3DW

Completion with Data

010=3DW,with data

0 1010

CompletionHeader總是3DW

?

從上可以看出,Configuration和Completion 的TLP(以C打頭的TLP),其Header大小總是3字節;Message TLP的Header總是4字節;而Memory相關的TLP取決于地址空間的大小,地址空間小于4GB的,Header大小為3DW,大于4GB的,Header大小則為4DW。

?

上面介紹了幾個TLP Header的通用部分,下面分別介紹具體TLP的Header。

?

  • Memory TLP

?

有兩個重要的東西在前面沒有提到,那就是TLP的源和目標,即,該TLP是哪里產生的,它要到哪里去,它們都包含在Header里面的。因為不同的TLP類型,尋址方式不同,因此要具體TLP具體來看這兩個東西。

?

?

對一個PCIe設備來說,它開放給Host訪問的設備空間首先會映射到Host的內存空間,Host如果想訪問設備的某個空間,TLP Header當中的地址應該設置為該訪問空間在Host內存的映射地址。如果Host內存空間小于4GB,則Memory讀寫TLP的Header大小為3DW,大于4GB,則為4DW。那是因為,對4GB內存空間,32bit的地址用1DW就可以表示,該地址位于Byte8-11;而4GB以上的內存空間,需要2DW表示地址,該地址位于Byte8-15。

?

該TLP經過Switch的時候,Switch會根據地址信息,把該TLP轉發到目標設備。之所以能唯一的找到目標設備,那是因為不同的Endpoint設備空間會映射到Host內存空間的不同位置。

?

關于TLP路由,后面還會專門講。

?

Memory TLP的目標是通過內存地址告知的,而源是通過”Requester ID”告知。每個設備在PCIe系統中都有唯一的ID,該ID由總線(Bus)、設備(Device)、功能(Function)三者唯一確定。這個后面也會專門講,這里只需知道一個PCIe組成有唯一的ID,不管是RC,Switch還是Endpoint。

?

  • Configuration TLP

?

Endpoint和Switch的配置(Configuration)格式不一樣,分別為Type 0和 Type 1來表示。配置可以認為是一個Endpoint或者Switch的一個標準空間,這段空間在初始化時也需要映射到Host的內存空間。與設備的其他空間不同,該空間是標準化的,即不管哪個廠家生產的設備,都需要有這么段空間,而且哪個地方放什么東西,都是協議規定好的,Host按協議訪問這部分空間。由于每個設備ID唯一,而其Configuration又是固定好的,因此,Host訪問PCIe設備的配置空間,只需指定目標設備的ID就可以了,不需要內存地址。

?

下面是訪問Endpoint的配置空間的TLP Header (Type 0):

Bus Number + Device + Function就唯一決定了目標設備; Ext Reg Number + Register Number相當于配置空間的偏移。找到了設備,然后指定了配置空間的偏移,就能找到具體想訪問的配置空間的某個位置。

?

  • Message TLP

Message TLP用以傳輸中斷、錯誤、電源管理等信息,取代PCI時代的邊帶信號傳輸。Message TLP的Header 大小總是4DW。

Message Code來指定該Message的類型,具體如下:

不同的Message Code,最后兩個DW的意義也不同,這里不展開。

?

  • Completion TLP

有non-posted request TLP,才有Completion TLP。有因才有果。前面看到,Requester 的TLP當中都有Requester ID和Tag,來告訴接收者發起者是誰。那么響應者的目標地址就很簡單,照抄發起者的源地址就可以了。因此,Completion TLP的Header如下:

Completion TLP,一方面,可以返回請求者的數據,比如作為Memory或者Configuration Read的響應;另一方面,還可以返回該事務(Transaction)的狀態,因此,在Completion TLP的Header里面有一個Completion Status,用以返回事務狀態:

?

分類目錄 存儲, 技術文章.
掃一掃二維碼或者微信搜索公眾號ssdfans關注(添加朋友->點最下面的公眾號->搜索ssdfans),可以經??吹絊SD技術和產業的文章(SSD Fans只推送干貨)。
ssdfans微信群介紹
技術討論群 覆蓋2000多位中國和世界華人圈SSD以及存儲技術精英
固件、軟件、測試群 固件、軟件和測試技術討論
異構計算群 討論人工智能和GPU、FPGA、CPU異構計算
ASIC-FPGA群 芯片和FPGA硬件技術討論群
閃存器件群 NAND、3D XPoint等固態存儲介質技術討論
企業級 企業級SSD、企業級存儲
銷售群 全國SSD供應商都在這里,砍砍價,會比某東便宜20%
工作求職群 存儲行業換工作,發招聘,要關注各大公司招聘信息,趕快來
高管群 各大SSD相關存儲公司高管和創始人、投資人

想加入這些群,請微信掃描下面二維碼,或搜索nanoarchplus,加阿呆為微信好友,介紹你的昵稱-單位-職務,注明群名,拉你進群。SSD業界需要什么幫助,也可以找阿呆聊。