一种对cpld数据包进行有序存储的方法及系统的制作方法_2

文档序号:9506141阅读:来源:国知局
等于3的整数。
【附图说明】
[0035]图1为本发明所述标签有序分发机制示意图;
[0036]图2为本发明所述标签页指针机制示意图;
[0037]图3为本发明所述CPLD数据包返回流程示意图;
[0038]图4为本发明所述一种对CPLD数据包进行有序存储的方法流程图;
[0039]图5为本发明所述一种对CPLD数据包进行有序存储的系统框图。
【具体实施方式】
[0040]以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
[0041]本发明针对因PCI Express端点设备发起的DMA读而返回的完成数据包(CPLD)存在乱序的问题,提出了一种基于Tag的寻址方案,从而实现对完成数据包CPLD的有序存储。为了实现大数据量的DMA读操作,需要将整个DMA读传输分割成连续的多个小的DMA读操作来组合完成,每个DMA读数据传输长度为Max Request Size大小,连续的小的DMA读操作,分别以连续的Tag来区分。
[0042]基本上大多数每个DMA读请求而返回的数据CPLD是依顺序返回的(依Tag顺序),但是也存在后发的DMA读请求返回的数据领先于前一个DMA读请求的返回数据,这样对于一个采用FIFO存储或者顺序RAM存储的方案就会存在数据存储地址乱序的问题,本发明就是针对这种乱序问题,提出一种基于Tag的方案,来实现对DMA读请求而返回的CPLD数据的有序存储。
[0043]PCI Express端点设备往主机内存发起DMA读请求时,首先要向主机发起DMA读数据包,这个数据包包括如下内容:访问目标内存的物理地址、目标内存需要传回的数据长度,请求者ID号和标记Tag等内容。主机内存返回给PCI Express端点设备完成数据包CPLD (Complet1n Data),PCI Express端点设备接收到该数据包后,对数据包进行解析,然后将有效数据进行存储。
[0044]本发明技术方案如下:
[0045]一、建立一套标签(Tag)有序分发体制。
[0046]当PCI Express端点设备向主机内存发起DMA读请求时,根据DMA请求包的大小和PCI Express总线规范中的Max Request Size的大小将DMA请求包分割成多个子DMA请求包,多个子DMA请求包对内存的寻址地址前后衔接,每个子DMA请求包按照发送顺序依次被标签有序分发体制分配以连续的标签号码Tag以区别不同的寻址空间。
[0047]如图1所示,当主机对一个PCI Express端点设备发送一个DMA读命令时,这个读命令要求端点设备主动发起对系统内存的某一区域进行读访问,然后把那一区域的数据传送入端点设备内部的存储器。为了增加有效数据吞吐效率,这个读命令一般都是要求访问比较大的区域。但是受制于PCI Express总线规范的约束,PCI Express端点设备一次读请求包所能访问的区域不能超过Max Request Size的大小。通常Max Request Size等于512,也就是说,端点设备一次读请求所能访问的空间也就是512字节。这样一个8K字节的DMA读访问命令,要在PCI Express端点设备里要拆分成16个DMA读请求包(每个512字节)连续发送出去。
[0048]每个DMA读请求包都需要一个独立的标签(Tag)来区分不同的访问地址,本发明中设计了一套标签有序分发机制,该机制总共有16个标签,从0到15。0赋给第一个子DMA读请求,要求访问目标地址的第一个512字节,1赋给第二个DMA读请求,对应目标地址紧邻的第二个512字节,15赋给最后一个DMA读请求包,去访问目标地址的最后一个512字节。
[0049]二、建立一套标签(Tag)页指针体制。
[0050]根据PCI Express规范的要求,标签(Tag)的个数是有限的,每一个标签代表一定数量的寻址范围,如果PCI Express端点设备一次发起的DMA读的寻址范围超过了这一套标签分发体制所能寻址的最大数量,就需要引入一套标签页指针体制,来区分不同的寻址空间,以扩大寻址范围。具体来说,如果一个标签(Tag)未被使用的话,那么该标签对应的页指针即为零,如果该标签被使用过一次,那么该标签对应的页指针就会自动加一以进行区别。这样,标签有序分发体制有多少个标签,就对应多少个标签页指针。
[0051]图2为标签页指针体制示意图。当端点设备接收的DMA读的命令在8K字节以内,标签是足够用的。但是当接收的读命令是访问超过8K字节的空间时,这16个标签就不够用了。因此需要增加一套机制来处理访问目标大于8K字节的访问。于是引入了一套标签页指针体制,每个标签对应一个页指针,当该标签未被使用时,该标签对应的页指针为0,当该标签被使用过一次后,其对应的页指针就自动加一。这样通过标签(Tag)以及该标签所对应的标签页指针Tag repeat可以实现对大包DMA读访问而返回的CPLD数据的有序存储。
[0052]三、建立一套针对完成数据包(CPLD)的同一标签数据的偏移地址计算体制
[0053]PCI Express端点设备进行DMA读时,依据Max Request Size的大小,将整个DMA读分割成多个子DMA读请求分别发送出去,一般来说每个子DMA读的数据大小就是MaxRequest Size大小,比如512字节,返回的CPLD数据包一般受制于PCI Express链路上分配的Max Payload的大小,大多数主板的Max Payload的大小不超过256字节,或为128,或为256。这样一个PCI Express端点设备的DMA读(比如512字节的读),至少需要2次CPLD才能接收到全部数据(每次CPLD的数据为256字节)。在某些慢速主板或者系统繁忙时需要更多次CPLD才能接收到全部数据。这些多次返回的CPLD数据对应的是同一个标签(Tag)的DMA读请求,因此需要对这些先后返回的带着相同标签的CPLD数据进行偏移地址计算以实现准确的存储。
[0054]图3为CPLD返回数据包乱序示意图。PCI Express端点设备发起DMA读请求时,如图所示,端点设备将DMA读拆分成多个子DMA读请求,比如两个连续的512字节读请求,分别用TagO、Tagl来标识。相应的,对应于这些用Tag标识的DMA读请求,相应的返回数据CPLD也以相应的Tag标识,比如对应于TagO的DMA读请求,返回的CPLD由三个TLP组成(有效数据分别为256字节、128字节、128字节);对应于Tagl的DMA读请求,其返回的CPLD数据由2个TLP组成(有效数据分别为256字节、256字节)。从图上可以看到,Tagl的CPLD数据先于TagO的CPLD返回,而不是按照先返回TagO数据再返回Tagl的数据的顺序,这在PCI Express总线上是经常发生的现象,因此对这些数据进行有序存储是非常重要的事情。
[0055]PCI Express端点设备发送DMA请求时,通过标签Tag将不同地址的DMA读访问用以标识,当CPLD数据返回时,根据返回CPLD的Tag以及其对应的页指针Tag repeat决定某一特定标签Tag的CPLD在PCI Express端点设备的内部存储基址。从图3中可以看到,某个Tag(比如TagO)的CPLD往往由多个CPLD组成,这些相同Tag的CPLD对应于内部存储的基址是相同的,但是他们相对于基址的偏移地址是不同的,因此需要计算这些相同Tag的CPLD对应于基址的偏移地址,以实现正确存储。
[0056]如图4所示,一种对CPLD数据包进行有序存储的方法,包括如下步骤:
[0057]步骤1,利用标签有序分发体制将PCI Express端点设备向主机内存发起的DMA读请求以分割的带有连续标签的多个子DMA请求发送至主机。
[0058]步骤2,接收主机返回的CPLD数据包,根据CPLD数据包的标签确定所述CPLD数据包在PCI Express端点设备的存储基址。
[0059]其中,带有相同标签的CPLD数据包具有相同的在PCI Express端点设备的存储基址。当启动标签页指针体制后,则根据CPLD数据包的标签及相应标签的页指针确定所述CPLD数据包在PCI Express端点设备的存储基址。
[0060]步骤3,对带有相同标签的CPLD数据包进行偏移地址计算,确定所述CPLD数据包的偏移地址;
[0061]具体地,带有相同标签的第一个收到的CPLD数据包的偏移地址为0,第二个收到的CPLD数据包的偏移地址为第一收到的CPLD数据包的数据长度,第i个收到的CPLD的数据包的偏移地址为第一至第i_l个收到的CPLD数据包的数据长度之和,其中i为大于等于3的整数。
[0062]步骤4,根据确定的所述CPLD数据包在PCI Express端点设备的存储基址和偏移地址对相应CPLD数据包进行存储。
[0063]如对于带有相同标签的CPLD,第一个接收到的CPLD对应的内部存储首地址为基地址+偏移地址0,第二个CPLD对应的内部存储首地址为基地址+第一个CPLD包的数据长度,第三个CPLD对应的内部存储首地址为基地址+前两个CPLD包的数据长度之和。不管针对某个特定标签Tag的DMA读请求而返回的CPLD数据包有多少个,都是用类似原理来计算该CPLD存储的地址。
[0064]当一个子DMA请求包发出去以后(对应的标签假若为TagO),目标地址所返回的完成数据包(CPLD),往往由多个CPLD组成,图3中TagO标识的DMA读请求分成3个CPLD来完
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1