交换芯片收发包的 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个优先级
同一优先级队列不能配置到多个通道上,如果所有通道都没有配置指定的优先级队列,该优先级上的报文作丢弃处理。
交换芯片收发包的 DMA 实现原理的更多相关文章
- DPDK收发包全景分析
前言:DPDK收发包是基础核心模块,从网卡收到包到驱动把包拷贝到系统内存中,再到系统对这块数据包的内存管理,由于在处理过程中实现了零拷贝,数据包从接收到发送始终只有一份,对这个报文的管理在前面的mem ...
- 基于335X平台Linux交换芯片驱动开发
基于335X平台Linux交换芯片驱动开发 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.Kernel版本:4.4.12,采用FDT 3.交换芯片MARVEL ...
- UDP收发buffer尺寸对收发包流量的影响
下午验证一个高流量发包问题时,发现了一个值得记录的问题:socket的收发buffer尺寸是会影响收发包的效率的,高流量通讯时,若socket的收发buffer尺寸过小会一定程度降低收发包效率. 自己 ...
- BCM策略路由交换芯片
BCM几个交换芯片的寄存器和相关的路由 EGR_L3_NEXT_HOP.EGR_L3_INTF.ING_L3_NEXT_HOP BCM XGS系列SDK中和路由相关的几个命令 l3 l3table. ...
- kernel笔记——网络收发包流程
本文将介绍网络连接建立的过程.收发包流程,以及其中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 应用层 对于使用socket进行网络连接的服务器端程序,我们会先调用socket函数创建一个 ...
- 基于335X平台的UBOOT中交换芯片驱动移植
基于335X平台的UBOOT中交换芯片驱动移植 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3 ...
- [development][dpdk][pktgen] 网卡收发包性能测试
一: 多队列及中断信息收集 [root@T185 ~]# ethtool -g eth0 Ring parameters for eth0: Pre-set maximums: RX: RX Mini ...
- python 爬虫 ~ 查看收发包的情况
DebugLog 可以用来查看收发包的情况,比较有意思,现特意记录下来: Sample: import urllib2 httpHandler = urllib2.HTTPHandler(debugl ...
- linux系统上用户态pppoe收发包过程
花了几天看了一下ppp/pppoe有关的东西,画了一下用户态pppoe收发包的示意图.
随机推荐
- Unity3D入门
Unity3D是一款应用广泛的3D游戏引擎,本文主要介绍unity3D的简单应用,安装过程略过. 在游戏的整个开发过程中,游戏界面设计占据非常重要的地位.因为游戏启动后,第一个映入眼帘的就是整个游戏U ...
- select for update行锁
select for update行锁 2008-05-26 15:15:37 分类: Oracle Select-For Update语句的语法与select语句相同,只是在select语句的后面 ...
- 判断ie版本
(function(){ var browser=navigator.appName var b_version=navigator.appVersion var version=b_version. ...
- rabbitmq, windows/linux, c/c++/node.js/golang/dotnet
官网:http://www.rabbitmq.com/ zeromq 相当于 message backbone,而rabbitmq相当于message broker.有的应用系统中,二者并存. (1) ...
- div标签上下滚动
<div id="myInfo" style={{width:'100%',height:'100%', overflow:'scroll'}}></div> ...
- 为什么C#中ref和out 关键字 ?
需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class Program { static void ...
- [2014.01.27]wfChart 统计图组件 5.6
本组件支持多种样式图表,包括柱型图.横柱型图.曲线图.饼图.点图.区域图. 可选择的8大主题风格,且主题可再配置,在加快开发的同时又提供更好的图像效果. 组件图表提供两种输出接口,包括 ...
- React - redux, jsx中写js示例
{ this.state.avatarSource === null ? <Text>Select a Photo</Text> : <Image style={styl ...
- R语言-基本图形
barplot() 条形图 spine() 棘状图 pie() 饼图 hist() 直方图 plot(density(x))核密度图 boxplot(X) 箱线图 vioplot() 小提琴图 dot ...
- vs2010下C++调用lib或dll文件
注: DLL:表示链接库,包含dll,lib文件: dll: 表示my.dll文件 lib: 表示my.lib文件 C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法 1 设置工程的 ...