本文主要是介绍PCIe DMA Link list (PCS-CCS-CB-TCB Producer-Consumer Synchronization),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. Linked List Mode
DMA提供了一个链表(LL)模式,可以有效地将数据从源移动到目标地址,而本地CPU的干预最少。这种模式提供了一种可以多次编程DMA来传输多个数据块的替代方案。每个内存块的编程信息(地址、大小等)由软件预先编程到本地内存中的 LL element(也称为描述符)中。LL结构(称为传输列表)中的每个元素(称为 data element)最多可以传输4 GB的数据。
通过将DMA_CH_CONTROL1_OFF_WRCH_i寄存器的LLE字段设置为1,可以启用通道的LL操作。您可以为每个通道单独启用LL模式。当为多个通道启用LL时,必须让每个通道在本地内存中拥有单独的LL structure。应用程序必须在本地内存中生成LL element structure,如下图所示:
当您开始DMA传输(通过写入DMA写DMA Write Doorbell Register DMA_WRITE_DOORBELL_OFF or DMA Read Doorbell Register DMA_READ_DOORBELL_OFF), DMA读取(消耗)本地内存中的每个元素,并将该元素中的信息(SAR、DAR、大小等)加载到DMA中的 channel context registers 中。这些Channel Context 寄存器决定DMA控制器当前正在服务的通道的操作.然后DMA继续传输数据块(由元素定义),当它完成时,从本地内存读取下一个元素。通常,所有元素在内存中都是连续的(一个接一个),起始地址在Channel Context DMA链表指针低寄存器DMA_LLP_LOW_OFF_WRCH_0中定义。
当你想在本地内存中跳转到另一个元素列表(或回收使用的元素)时,你可以在元素中设置LLP位(例如上图中的链接元素#N-1),使用LL指定下一个元素结构的位置
1.1 元素dword和Channel Context 寄存器之间的关系
1.1.1 数据元素
注意数据元素和每个通道的DMA Channel Context 寄存器之间的相似性。每个元素有6个dword,如上图所示。一个通道有8个Channel Context 寄存器(dword)。DMA将6个元素dword加载到以下Channel Context :
- CB, LLP, LIE, and RIE fields of the DMA Channel Control 1 register.
- DMA Transfer Size
- DMA SAR Low and DMA SAR High
- DMA DAR Low and DMA DAR High
元素DWORD位域的定义与“DMA软件寄存器映射”中描述的DMA Channel Context 寄存器相同,除了LIE和RIE位。
LL元素中的LIE和RIE位只启用已完成的中断。在非ll模式下,RIE和LIE位(在Channel Context 寄存器中)启用done和abort中断。
1.1.2 链接元素
当元素中第一个DWORD的LLP字段设置为1时,该元素为链接元素。DMA只将以下信息加载到Channel Context 寄存器中:
- 第一个DWORD的CB、TCB和LLP位。在link元素中没有定义LIE和RIE位。
- LL元素指针(第3和第4个DWORDs)进入DMA链表指针寄存器(DMA_LLP_LOW_OFF_WRCH_0 和DMA_LLP_HIGH_OFF_WRCH_0)。
链接元素的结构与数据元素的结构不同。数据元素没有TCB字段。link元素没有LIE或RIE字段。它没有SAR, DAR,或者Transfer Size DWORDs,但有 LL Element Pointer DWORDs而不是SARdword。
2. Linked List Operation
2.1 LL Operation Overview
在本节中,将详细描述一个名为recying的普通LL操作。此操作是针对写通道描述的,但也可以为其他写或读通道并行运行多个进程。在这个过程中,中断被用来触发生产者(软件)回收元素。通常是Watermark 中断(位于传输列表(TL)的中间位置附近)和Empty中断(在最后一个数据元素中)通过将这两个元素中的LIE设置为’ 1 '。这个过程的步骤是:
1. 软件在本地内存中创建一个名为TL的LL元素结构,由N-1个数据元素和一个链接元素组成。
- link元素的“link元素的“LL Element Pointer Low/High DWORDs” 被编程为指向第一个数据元素的开头。
- 其中一个数据元素(靠近TL的中间位置)被编程来生成一个“Watermark”中断
- 最后一个数据元素被编程为生成一个“Empty”中断。
2. 软件用TL的位置对DMA进行编程,这是通过写入DMA Linked List Pointer Low Register(DMA_LLP_LOW_OFF_WRCH_0)和 DMA Linked List Pointer High Register (DMA_LLP_HIGH_OFF_WRCH_0)来完成的。
3. 软件通过按写通道门铃启动DMA进程。这是通过写入DMA Write Doorbell Register(DMA_WRITE_DOORBELL_OFF)
下图的紫色实环“L1”对应步骤1-3。
4. DMA从本地内存读取(消耗)每个数据元素,如果CB和CCS位匹配,则从该数据元素将信息(SAR、DAR、大小等)加载到通道上下文寄存器。这些上下文寄存器决定DMA当前服务的通道的操作。DMA在评估TCB和切换CCS之后执行CB/CCS匹配的检查。DMA总是将链接元素加载到通道上下文中。
Note:如果DMA在一个链接元素上停止,那么您的软件必须设置DMA链表指针寄存器,并通过ringing the
doorbell重新启动DMA进程。
5. 然后DMA继续传输数据块(由元素定义),当它完成时,从本地内存读取下一个元素。 上图中的绿色实心圈L2对应步骤4-5。
6. 列表中的最后一个元素(称为链接元素,并将其LLP字段设置为1表示)不用于传输数据块。
- 它使DMA有效地重复步骤4中的任务
- 它的TCB通常设置为1。这导致DMA切换它的CCS位,软件切换它的PCS位。该软件和DMA使用“PCS-CCS-CB-TCB”生产者-消费者同步机制,以确保:
- 软件不会回收DMA尚未使用的元素
- DMA正确地识别和使用回收的元素。
上图中的红色实心圈L4对应步骤6。
7. 在接收到中断(在第1步中提到)之后,软件开始回收TL。
- 软件用新的DMA传输信息重新编程每个数据元素。
- 该软件和DMA使用“PCS-CCS-CB-TCB”生产者-消费者同步机制,将在本节稍后介绍
上图中紫色虚线部分L3对应步骤7。
8. 在某些情况下,软件希望通过不再回收任何元素来终止完整的DMA过程。当CB !=CCS时,DMA识别这种情况,并将通道状态设置为stopped
上图中虚线的红色环路L5对应步骤8。
2.2 Using Interrupts for Linked List Producer-Consumer Synchronization
当DMA处理完一个元素时,DMA在读取下一个LL元素之前检查LIE位。更多信息请参见上图圈出的步骤A 。当LIE被设置时,DMA不会立即断言“已完成”中断,而是设置一个内部中断挂起标志(LIEP)。它在从系统内存中读取下一个数据元素后断言实际的done中断。请参见图中圈出的步骤B。这种延迟中断的自动内部过程避免了在设置LIE位时DMA和软件之间的竞争条件
你的软件应该尽早设置“Watermark”中断,以安排回收使用的元素。将 Watermark 中断放置在列表的下方,加上应用程序中缓慢的元素回收过程;确保DMA在你的软件回收它之前返回到LL的开始。DMA通道停止,您必须通过写入它的门铃来重新启动它。通常是通过将这两个元素中的LIE设置为1b1,可以使用“Watermark interrupt”(位于TL中间附近)和”Empty interrupt“(在最后一个数据元素中)。在接收到中断后,软件开始回收TL。
3. PCS-CCS-CB-TCB Producer-Consumer Synchronization
软件和DMA使用“PCS-CCS-CB-TCB”生产者-消费者同步机制,以确保软件不会回收DMA尚未使用的元素,并且DMA正确地识别和使用回收的元素。这个过程,是由DMA和软件,通过下图中的生产者-消费者流程示例来说明
在详细查看示例之前,需要注意DMA在此过程中执行以下两个测试:
1. Consumer-Owned Element, or Transfer List (TL) Empty Test
上图中的红色实心圈L4对应此测试项。。 The Cycle Bit (CB)(DMA_CH_CONTROL1_OFF_WRCH_0) 针对同一寄存器的DMA消费者周期状态(CCS)位进行测试。当CB =CCS时,元素归消费者(DMA)所有,并执行数据传输。当CB !=CCS时,TL为空,DMA将DMA通道控制1寄存器(DMA_CH_CONTROL1_OFF_WRCH_0)中的通道状态(CS)设置为“停止”
2.Toggle Cycle Bit (TCB) Test
上图中标注L5的红色虚线对应此测试。 the Toggle Cycle Bit(TCB) (DMA_CH_CONTROL1_OFF_WRCH_0)设置为1,DMA切换DMA通道控制1寄存器的CCS位为~CB。生产者(软件)也对其本地变量“生产者周期状态”(PCS)执行类似的操作,将它设置PCS =~PCS。TCB字段只在最后一个LL元素(link元素)中有效。以这种方式切换PCS和CCS标志将使使用者与生产者同步。
这篇关于PCIe DMA Link list (PCS-CCS-CB-TCB Producer-Consumer Synchronization)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!