PCIe 數據鏈路層的主要功能時保證兩臺設備之間傳送TLP的完整性。還負責鏈路的初始化和電源管理,包括跟蹤鏈路狀態以及上面的處理層和下面的物理層之間傳遞的消息和狀況。
在管理鏈路時,由3組重要的DLLP:TLP確認Ack/Nak DLLP;電源管理DLLP;流控制數據包DLLP。
DLLP與TLP不同,沒有攜帶目標信息,因爲它們只用於相鄰最近組件之間的通信。
當DLLP從發送器發送至接收器時,立即被處理,不能對DLLP進行流量控制。與TLP不同,DLLP沒有確認協議,PCIe規範定義了超時機制,能夠用來從丟失或者丟棄DLLP的狀態中恢復出來。
固定大小的DLLP數據包:8個字節。所有的數據鏈路層數據包由如下幾部分組成:①由一個字節的類型字段和3個附加屬性字節組成的1DW核心,其中屬性隨DLLP類型的變化而變化;②一個根據DW核心內容計算的16比特CRC,附加在覈心之後;③然後,把這6個字節傳送至物理層,物理層給數據包添加一個DLLP開始控制字符和一個數據包結束控制字符。
DLLP中不會有數據有效載荷,所有有用信息都在類型字段和屬性字段中。
1.5.1 DLLP數據包的類型
規範定義了3組DLLP,每組都有許多變體。
DLLP類型 |
類型字段編碼 |
用途 |
ACK |
0000 0000b |
TLP傳送的完整性 |
Nak |
0001 0000b |
TLP傳送的完整性 |
PM_Enter_L1 |
0010 0000b |
電源管理 |
PM_Enter_L23 |
0010 0001b |
電源管理 |
PM_Active_State_Request_L1 |
0010 0011b |
電源管理 |
PM_Request_Ack |
0010 0100b |
電源管理 |
廠商專用 |
0011 0000b |
廠商 |
INitFC1-P(xxx-VC#) |
0100 0xxxb |
TLP流控制 |
INitFC1-NP(xxx-VC#) |
0101 0xxxb |
TLP流控制 |
INitFC1-Cpl(xxx-VC#) |
0110 0xxxb |
TLP流控制 |
INitFC2-P(xxx-VC#) |
1100 0xxxb |
TLP流控制 |
INitFC2-NP(xxx-VC#) |
1101 0xxxb |
TLP流控制 |
INitFC2-Cpl(xxx-VC#) |
1110 0xxxb |
TLP流控制 |
UpdateFC-P(xxx-VC#) |
1000 0xxxb |
TLP流控制 |
UpdateFC-NP(xxx-VC#) |
1001 0xxxb |
TLP流控制 |
UpdateFC- Cpl (xxx-VC#) |
1010 0xxxb |
TLP流控制 |
保留 |
其他 |
保留 |
1.5.2 Ack或Nak DLLP數據包的格式
下圖是接收器用來確認或否認一個TLP傳送的DLLP數據包的格式。
各字段定義如下表:
字段名 |
頭字節/比特 |
DLLP功能 |
AckNak_Seq_Num[11:0] |
字節3的比特7:0 字節2的比特3:0 |
ACK DLLP:對於接收的序列號等於EXT_RCV_SE count的正確TLP數據包,使用NEXT_RCV_SEQ count-1;對於接收的序列號小於EXT_RCV_SE count的正確TLP數據包,使用NEXT_RCV_SEQ count-1; NAK DLLP:與CRC校驗失敗的TLP有關,使用NEXT_RCV_SEQ count-1;對接收的序列號早於NEXT_RCV_SEQ count的TLP,使用NEXT_RCV_SEQ count-1;發送器一旦接收到NAK DLLP,它就會清除序列號等於或早於該序列號的TLP,重發剩餘的TLP |
類型[7:0] |
字節0的比特7:0 |
表示DLLP的類型 0000 0000b = ACK DLLP 0001 0000b = NAK DLLP |
16比特的CRC |
字節5的比特7:0 字節4的比特7:0 |
16比特的CRC用來保護此DLLP的內用,根據ACK/NAK的字節0~3計算的 |
1.5.3 電源管理DLLP數據包的格式
PCIe電源管理DLLP和TLP數據包可代替大部分與電源管理狀態變化有關的信號。用於電源管理的DLLP的格式如下圖。
字段名 |
頭字節/比特 |
DLLP功能 |
類型[7:0] |
字節0的比特7:0 |
0010 0000b = PM_Enter_L1 0010 0001b = PM_Enter_L2 0010 0011b = PM_Active_State_Request 0010 0100b = PM_Request_Ack |
鏈路CRC |
字節5的比特7:0 字節4的比特7:0 |
16比特的CRC用來保護此DLLP的內用,根據ACK/NAK的字節0~3計算的 |
1.5.4 流控制數據包的格式
PCIe通過使用基於信用的流控制方案消除了早期總線協議中許多效率低下的方面。初始化信用和當接收器緩衝區空間可用時更新信用要使用3個略有不同的DLLP。兩個流控制初始化數據包分別稱爲InitFC1和InitFC2。更新DLLP稱爲UpdateFC。
字段名 |
頭字節/比特 |
DLLP功能 |
DataFC 11:0 |
字節3的比特7:0 |
此字段含有與數據存儲相關的信用。數據信用的單位時每信用16個字節,能夠應用於對V[2:0]表示的虛擬信道和字節0中比特7:4代碼表示的流量類別的流控制計數 |
HdrFC 11:0 |
字節2的比特7:6 字節1的比特5:0 |
此字段含有與頭存儲相關的信用。數據信用的單位時每信用一個頭,能夠應用於對V[2:0]表示的虛擬信道和字節0中比特7:4代碼表示的流量類別的流控制計數 |
VC[2:0] |
字節0的比特2:0 |
此字段表示接收信用的虛擬信道(VC0~7) |
類型[3:0] |
字節0的比特7:4 |
0100b = INitFC1-P 0101b = INitFC1-NP 0110b = INitFC1-Cpl 0101b = INitFC2-P 1101b = INitFC2-NP 1110b = INitFC2-Cpl 1000b = UpdateFC-P 1001b = UpdateFC-NP 1010b = UpdateFC- Cpl |
鏈路CRC |
字節5的比特7:0 字節4的比特7:0 |
16比特的CRC用來保護此DLLP的內用,根據ACK/NAK的字節0~3計算的 |
1.5.5 廠商專用DLLP
字段名 |
頭字節/比特 |
DLLP功能 |
類型[3:0] |
字節0的比特7:4 |
廠商專用 |
鏈路CRC |
字節5的比特7:0 字節4的比特7:0 |
16比特的CRC用來保護此DLLP的內用,根據ACK/NAK的字節0~3計算的 |