交換芯片支持:報文、計數、表項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個優先級
同一優先級隊列不能配置到多個通道上,如果所有通道都沒有配置指定的優先級隊列,該優先級上的報文作丟棄處理。