交换芯片收发包的 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个优先级

同一优先级队列不能配置到多个通道上,如果所有通道都没有配置指定的优先级队列,该优先级上的报文作丢弃处理。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

posted @ 2016-12-26 10:16  yha)  阅读(4255)  评论(0编辑  收藏  举报