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标志将使使用者与生产者同步。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值