交換晶元收發包的 DMA 實現原理

2022-08-01 08:24:11 字數 3409 閱讀 8117

交換晶元支援:報文、計數、表項3種dma型別,其中報文dma包括系統從晶元到接收報文或傳送報文到交換晶元,計數dma用來從片上獲取統計計數,表項dma功能分為slam dma(系統記憶體dma到片上交換晶元表項內)和table dma(從晶元的表項內獲取內容dma到系統記憶體),是ram和交換晶元之間的兩個方向上的操作。

交換晶元包含的每乙個cmic控制器都有4個dma通道,其中cmic1和2控制器只在內部使用,只有cmic0控制器的4個dma通道可以被用來收發報文,cmic0內的3個dma通道用於接收晶元上的資料到pci記憶體空間,1個dma通道用於傳送pci記憶體空間上的資料到晶元內,通道的報文收發功能是通過dma control blocks(dcbs)和相關暫存器(cmic_cmc0_dma_desc[3:0], cmic_cmc0_dma_stat and cmic_cmc0_ch[3:0]_dma_ctrl.)配合完成的。

為了提高報文的dma效能,cmic使用cmic_cmc0_dma_ch[3:0]_intr_coal暫存器,基於每乙個通道,使用可配置的定時器中斷和可配置指定數目的描述符請求中斷2種方式配合實現的,只要其中一種條件滿足,都會上報中斷給cpu,實現低時延、高負載的效能要求。

cmic0內的4個dma通道,其中3個用來接收dma,1個用來傳送dma,3個接收dma支援配置cos佇列,交換晶元支援3個接收dma基於cos同時進行收包,滿足cpu通過cos收包的功能,通過cmic_cmc0_ch[3:0]_cos_ctrl_rx_[1:0]暫存器可以把cos配置到不同的dma通道內,如果某乙個cos沒有被配置到dma內,該佇列上的報文會被cmic清空。dma過程中發生的奇偶校驗和其他致命錯誤都會被記錄到cmic_cmc0_dma_stat內,復位該暫存器的enable位可以清除錯誤。bcm交換晶元的dma控制器鍊錶形式的dcbs(dma控制塊)來控制報文的收發操作,每乙個dcm都由16個32長度的bit位組成(需要保證4位元組對齊),包含了所有傳送需要的資訊,通過多個dcb組成的鍊錶可以實現乙個物理上連續的陣列傳送,或者接收報文到多個連續的記憶體位址。

交換晶元所有的dma收發包動作都是通過dcbs來完成的,使用乙個或一組dcb可以實現連續記憶體的報文傳送,或者連續接收不同儲存空間的報文。

收發控制塊描述字格式如下:

描述字內的具體內如如下:

1、 設定dcb在pci記憶體的位址,填充在dcb.memory_address內;

2、 設定傳送報文的物理記憶體位址到block0 [31:0];

3、 設定dcb本次傳送的報文字節個數block1 [15:0];

4、 如果該dcb不是最後乙個,c設定為1,block1 [16];

5、 如果是多分片報文,當前dcb和下乙個dcb描述字連續的,則設定s/g為1,block1 [17];

6、 如果統計已更新,設定stat為1,block1 [20];

7、 如果當前描述字內的報文未pause幀,置位pause,block1 [21];

8、 丟棄的報文,置位purge, block1 [22];

9、 hg型別的報文,置位hg, block1 [19];

10、  如果是hg1或hg2型別的報文,設定block6-block9;

11、  設定已傳送的報文統計個數到block15[15:0]

1、  設定報文在pci的記憶體位址儲存空間,4位元組對齊;

2、  設定本次dma傳送的位元組個數;

3、  如果是連續的dcb,c置位1;

4、  如果下乙個dcb是同一報文的描述字,設定s/g為1;

5、  如果下乙個dcb的儲存空間不連續,設定rld為1;

6、  其他bit置0;

交換晶元的dma動作有2種中斷型別,一種是end-of-descriptor,另一種是end-of-chain,當乙個描述字完成後,end-of-descriptor中斷上報,同一組內的所有描述字完成後,上報end-of-chain中斷,如圖所示:

軟體收到中斷後,通過檢查當前dma的狀態字cmic_cmc0_irq_stat[4:0]判斷中斷型別,通過cmic_cmc0_pcie_irq_mask[4:0]暫存器掩碼該中斷,防止同一型別的中斷多次上報,根據置位的內容處理中斷,處理完成後清空該中斷,重新開啟中斷掩碼。

dma接收通道支援併發讀取操作,3個dma通道最大可以配置48個cos優先順序佇列,配置暫存器cmic_cmc0_ch[3:0]_cos_ctrl_rx_[1:0]內容如下

huahuan(config)# hw-rw 0 command l/cmic_cmc0_ch0_cos_ctrl_rx_0

register: cmic_cmc0_ch0_cos_ctrl_rx_0.cmic0 cpu register address 0x00031168

flags:

blocks: cmic0 (1 copy)

description: when cos_rx_en of cmic_config is set, this register

indicates which cos are admitted by channel. this register

gives only the ls byte.

displaying: reset defaults, reset value 0 mask 0xffffffff

cos_bmp<31:0> = 0

cmic_cmc0_ch0_cos_ctrl_rx_1--配置後16個優先順序

同一優先順序佇列不能配置到多個通道上,如果所有通道都沒有配置指定的優先順序佇列,該優先順序上的報文作丟棄處理。

tcp udp收發包的機制

tcpudp 傳送安全送達 只管傳送 接收與建立連線 是 三次握手 否 有資料報,無需連線 資料大小 無限制每個資料報64k 可靠性可靠 不可靠速度 慢 三次握手才能完成連線 快 無需連線 應用流 qq 握手次數 具體情況 1建立連線時,客戶端傳送同步序列編號到伺服器,並進入傳送狀態,等待伺服器確認...

網絡卡收發包的offload總結

網絡卡的offload是指將cpu對資料報的一些處理操作轉到硬體網絡卡上進行,由此釋放出cpu的計算資源。offload也被稱為硬體解除安裝。從2012年起,offload技術開始在網絡卡上使用。發展至今,網絡卡上已經支援多種形式的offload。目前,在收發方向上,網絡卡各自支援不同的offloa...

盒子裝置介面收發包的思考1

目前在處理盒子產品時,發現wan口和lan口收發報文時還在走核心路由邏輯,因為從wan口進來的包如果 只能從lan口 出去,所以此時路由查詢是個多餘動作!此處應該是乙個可以優化點,來試一試吧!mark,也不想不通為啥乙個產品這麼多年都沒有人去思考這些!工作中還是要多想一想為什麼?不要隨波逐流的接受!...