05.23 「博文連載」PCIe掃盲——Flow Control基礎(二)

「博文連載」PCIe掃盲——Flow Control基礎(二)

在任何事務層包(TLP)發送之前,PCIe總線必須要先完成Flow Control初始化。當物理層完成鏈路初始化後,便會將LinkUp信號變為有效,告知數據鏈路層可以開始Flow Control初始化了。

如下圖所示:

「博文连载」PCIe扫盲——Flow Control基础(二)

注:由於VC0是默認使能的,所以當Flow Control初始化開始時,其會被自動的初始化。其他的Virtual Channel是可選的,只有當被配置為使能的時候才會被初始化。

Flow Control初始化被分為兩個步驟,FC_Init1和FC_Init2,其在整個數據鏈路控制和管理狀態機(Data Link Control & Management State Machine)的位置如下圖所示:

「博文连载」PCIe扫盲——Flow Control基础(二)

在FC_Init1步驟中,PCIe設備會連續地發送三個InitFC1類型的Flow Control DLLP來報告其接收Buffer 的大小。三個DLLP的順序是固定的:Posted、Non-Posted然後是Completions。如下圖所示:

「博文连载」PCIe扫盲——Flow Control基础(二)

FC_Init2與FC-Init1類似,同樣是連續的發送三個InitFC2類型的DLLP,當完成後,DLCMSM(上一篇文章中提到的狀態機)會切換到DL_Active狀態,表明數據鏈路層初始化完成。

注:可能有人會有疑惑了,FC_Init1和FC_Init2乾的活不是差不多嘛,為什麼還需要FC_Init2呢?原因是,不同的設備完成FC_Init1的時間可能是不同的,增加FC_Init2是為了保證每個設備都能收到FC初始化DLLP。

FC_Init DLLP的格式如下圖所示:

「博文连载」PCIe扫盲——Flow Control基础(二)

在完成FC初始化之後,相鄰的兩個設備之間會週期性的通過Updated FC DLLP更新接收Buffer的大小。如下圖所示:

「博文连载」PCIe扫盲——Flow Control基础(二)

Update FC DLLP的格式與FC_Init的格式是類似的,具體如下:

「博文连载」PCIe扫盲——Flow Control基础(二)

前面說到。Update FC DLLP是週期性發送的,週期的值可以通過以下公式計算得:

「博文连载」PCIe扫盲——Flow Control基础(二)

具體可以參考PCIe的Spec,這裡不再詳細介紹,下面給出Gen1和Gen2的週期表格(根據公式計算的結果)。其中AF為AckFactor。

注:Mindshare的書中,為了便於理解,把AckFactor一詞修改為UpdateFactor,實際上指的是同一個東西。

Gen1 (2.5GT/s)如下表所示:

「博文连载」PCIe扫盲——Flow Control基础(二)

Gen2(5GT/s)如下表所示:

「博文连载」PCIe扫盲——Flow Control基础(二)「博文连载」PCIe扫盲——Flow Control基础(二)
「博文连载」PCIe扫盲——Flow Control基础(二)


分享到:


相關文章: