PCIe Multicast組播功能實現

參考:《PCIe-Multicast(組播)實現》

 

 

PCIe組播概念

傳統 PCIe系統侷限於單目標傳送 ,這種傳輸模式以主機爲中心 ,使得主機在給定的時間,在某一時刻主機只能與衆多子設備中的一個進行通訊 。

現在越來越多的應用需要同時向多個子設備發送數據,也許主機也不只是一個,甚至一個子設備也需要向主機向其他子設備發送數據 ,PCIE multicast應運而生。

組播是指同時像多個目標或者組發送信息,他允許每一個主機在某個時間可以和多個子設備進行通訊,同時向多個子設備發送相同的數據包,組播相比於傳統的傳送模式效率上大大提高,因此在工程實現中得到廣泛的應用 。

PCIe Multicast的組播功能,實現在Switch上。例如 PEX8749、PEX8796等。

PCIe組播實現

組播允許軟件同時將相同的數據寫入一組多個目標。PEX 8796的內存寫入TLP被尋址到MC地址範圍(MC BAR),並且啓用了多播後,PEX 8796會自動生成併發送原始副本到一個或多個目標端口的TLP(稱爲MC複製TLP)。 MC地址空間是分爲MC組(MCG),使用MC基址和MC索引位置定義。每PEX 8796端口可以通過選擇屬於MCG來選擇接收MC Copy TLP。相應的MC接收位。如果需要,可以使用“全部阻止”來阻止MC TLP。MC覆蓋欄可用於將原始MC TLP的地址替換爲單播地址空間,如果端點不支持MC。

PCIE組播實現依賴於對 PCIe Multicast Capability結構的設置。PCIeMulitcastCapability 結構如下:

  • PCIe_Extended_Capability_Header:包含了extend_capability_ID,版本以及下一個 capability 偏移量。
  • MC_Control_and_Capability 寄存器:bit31爲 multicast_enable_bit;Bit30-22:保留爲0;Bit21-16 multicast_groups數量設置,用戶可以根據需要定義組播的組數 ,值爲0時表示只有一組,值爲N時 group=N+I;Bit15.bit0爲capability設置,廠商設定,不能修改。
  • MC_Base_Address寄存器 :Bit 63-l2:播基地址;Bit 11-6:保留爲 0;Bit 5-0:Index_ position組播 memory空間,Memeory大小爲 2 Index_Posiztion.Index_ position<12無效 。
  • MC_Receive寄存器 :Bit 63-0,每個位對應一個組播組用於接收數據,例如 bit3設置爲1,表明該設備要接受第3組播組數據。
  • MC_block_All寄存器 :Bit63-0,每個位對應一個組,用於屏蔽數據,例如bit3設置爲1,對於該設備所有來自第3組數據要被屏蔽。
  • MC_Block_untransated寄存器 :Bit 63-0,每個位對應一個組,用於屏蔽包含非透明地址的數據包 ,例如 bit3設置爲1,對於該設備所有來自第3組數據要被屏蔽 。
  • MC_OVERLAY_BAR 寄存器 :該寄存器用於改變組播TLP中訪問地址,Bit5-0,重定位訪問地址空 間大小,如果該值小於6,地址改變機制無效;Bit63-6:重定向的地址 ,例如原TLP中訪問地址是0x2000,如果重向地址設爲0x1000,設備接收到這個TLP會把訪問地址改爲0x1000。

PCIe組播訪問條件

通過設置 MC Control寄存器和 MC BaseAddress寄存器我們把組地址空間劃分爲基於基地址的 N 組地址空間,每個組地址空 間大小爲 2^MC_Index_Position。

觸發 PCIe_Multicast條件爲 :

  1. MC_Enable被設置。
  2. TLP是一個寫請求 。
  3. 目標地址落在組播地址範圍 。

在這個前提下組播會被激發 ,如果接收的設備 MC_Receive_bit與組播的 group匹配 ,該設備就能接到組播的 TLP。

PCIe組播示例

某系統主機通過 pcie switch連接3個設備,在地址映射中我們可 以看到有四個PCIe端口,假設Port0爲 up_stream_port,Port1、2、3爲 設備端 ,地址 map如下 :

Port 0:F7800000 ~ F7AFFFFF
Port 1:F7A00000 ~ F7AFFFFF
Port 2:F7900000 ~ F79FFFFF
Port 3:F7800000 ~ F78FFFFF

按如下 設置設定 :

  1. 每個端口MC_Control_Capability寄存器爲 0x8002803F,3 groups。
  2. 每個端口的 MC Baseaddress寄存器 設爲 0x7800014,基地址爲 0x7800000,組地址大小爲 1MB。
  3. 每個端口的 MC Receive寄存器設爲0x7。如此設置每個下行端口都能收到主機發出的 TLP。

PCIe組播實踐

JD4000 總共19個芯片(3536*6 + 3519*12 + 6678),pci下的樹形結構如下:

lspci -t -vxxx
-[0000:00]-+-00.0  Intel Corporation Sky Lake Host Bridge/DRAM Registers
           +-01.0-[01-14]----00.0-[02-14]--+-04.0-[03]----00.0  Device 19e5:3536
           |                               +-05.0-[04]----00.0  Device 19e5:3536
           |                               +-06.0-[05]----00.0  Device 19e5:3536
           |                               +-07.0-[06]----00.0  Device 19e5:3536
           |                               +-08.0-[07]----00.0  Device 19e5:3519
           |                               +-09.0-[08]----00.0  Device 19e5:3519
           |                               +-0a.0-[09]----00.0  Device 19e5:3519
           |                               +-0b.0-[0a]----00.0  Device 19e5:3519
           |                               +-0c.0-[0b]----00.0  Device 19e5:3519
           |                               +-0d.0-[0c]----00.0  Device 19e5:3519
           |                               +-0e.0-[0d]----00.0  Device 19e5:3519
           |                               +-0f.0-[0e]----00.0  Device 19e5:3519
           |                               +-10.0-[0f]----00.0  Device 19e5:3519
           |                               +-11.0-[10]----00.0  Device 19e5:3519
           |                               +-12.0-[11]----00.0  Device 19e5:3536
           |                               +-14.0-[12]----00.0  Device 19e5:3519
           |                               +-15.0-[13]----00.0  Device 19e5:3519
           |                               \-16.0-[14]----00.0  Device 19e5:3536

即有20個PCI橋片,01:00.0爲02:04.0~02:16.0等橋片的上游。

簡單點來說,在00:01.0 PCI bridge上的地址map大小爲1536M.

地址映射中可以看到總共有18個端口。

BUS         PORT    BAR
02:16.0	22	0x2058000000-0x205bffffff	0x205c000000-0x205fffffff
02:15.0	21	0x2054000000-0x2057ffffff
02:14.0	20	0x2050000000-0x2053ffffff 	
02:12.0	18	0x2048000000-0x204bffffff	0x204c000000-0x204fffffff
02:11.0	17	0x2044000000-0x2047ffffff
02:10.0	16	0x2040000000-0x2043ffffff
02:07.0	7	0x2018000000-0x201bffffff	0x201c000000-0x201fffffff
02:0e.0	14	0x2038000000-0x203bffffff
02:0f.0	15	0x203c000000-0x203fffffff
02:06.0	6	0x2010000000-0x2013ffffff	0x2014000000-0x2017ffffff
02:0c.0	12	0x2030000000-0x2033ffffff
02:0d.0	13	0x2034000000-0x2037ffffff
02:05.0	5	0x2008000000-0x200bffffff	0x200c000000-0x200fffffff
02:0a.0	10	0x2028000000-0x202bffffff 
02:0b.0	11	0x202c000000-0x202fffffff
02:04.0	4	0x2000000000-0x2003ffffff	0x2004000000-0x2007ffffff
02:09.0	9	0x2024000000-0x2027ffffff 

粗略的,可以將整個00:01.0 PCI bridge上的地址map大小分爲24塊。(12*3519 + 6*3536*2)

每塊map地址的大小都爲64M大小(1536M / 24)。

按如下 設置設定 ,通過setpci設置相關組播寄存器:

每個端口MC_Control_Capability寄存器爲 0x8017803F,24 group

setpci -s 01:00.0 0x334.l=0x8017803F

每個端口的 MC_Base_address寄存器 設爲 0x00000020 0000001A,基地址爲 0x0000002000000000,組地址大小爲 64MB。

setpci -s 01:00.0 0x338.l=0x0000001A
setpci -s 01:00.0 0x33C.l=0x00000020

每個端口的 MC_Receive寄存器設爲0x1FFFFFF(24個端口)。如此設置每個下行端口都能收到主機發出的 TLP。

setpci -s 01:00.0 0x340.l=0x1FFFFFF
setpci -s 01:00.0 0x344.l=0x0

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章