交換芯片收發包的 DMA 實現原理


        交換芯片支持:報文、計數、表項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組成的鏈表可以實現一個物理上連續的數組發送,或者接收報文到多個連續的內存地址。

1、收發報文控制塊描述字

交換芯片所有的DMA收發包動作都是通過DCBs來完成的,使用一個或一組DCB可以實現連續內存的報文發送,或者連續接收不同存儲空間的報文。

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

 

 

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

 

 

  DMA對齊要求:接收時,要求DCB.MEMORY_ADDRESS內存地址是4字節對齊,發送時要求字節對齊即可,DCBs在發送和接收時都要求4字節對齊。

2、DMA報文收發流程

DMA報文發送流程

 

 

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]

 

 

 

DMA報文接收流程

 

 

1、  設置報文在PCI的內存地址存儲空間,4字節對齊;

2、  設置本次DMA發送的字節個數;

3、  如果是連續的DCB,C置位1;

4、  如果下一個DCB是同一報文的描述字,設置S/G為1;

5、  如果下一個DCB的存儲空間不連續,設置RLD為1;

6、  其他BIT置0;

 

 

 

 

 

報文接收或發送的描述字設置后,配置通道((CMIC_CMC0_CH[3:0]_DMA_CTRL))指導讀寫操作,開始讀寫時,CMIC_CMC0_CH[3:0]_DMA_CTRL.DMA_EN 置1,DMA結束后,CPU收到一個中斷,如果只有1個描述字,則CHx_DESC_DONE置1,如果是描述字鏈表,CHx_CHAIN_DONE 位置1; 

3、中斷處理

交換芯片的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]寄存器掩碼該中斷,防止同一類型的中斷多次上報,根據置位的內容處理中斷,處理完成后清空該中斷,重新打開中斷掩碼。

4、配置CoS隊列

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個優先級

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM