PCIe DMA Link list (PCS-CCS-CB-TCB Producer-Consumer Synchronization)

2023-10-14 19:50

本文主要是介绍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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/212771

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

ora-01017 ora-02063 database link,oracle11.2g通过dblink连接oracle11.2g

错误图示: 问题解决 All database links, whether public or private, need username/password of the remote/target database. Public db links are accessible by all accounts on the local database, while private

List list = new ArrayList();和ArrayList list=new ArrayList();的区别?

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。 List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了A

处理List采用并行流处理时,通过ForkJoinPool来控制并行度失控的问题

在使用parallelStream进行处理list时,如不指定线程池,默认的并行度采用cpu核数进行并行,这里采用ForJoinPool来控制,但循环中使用了redis获取key时,出现失控。具体上代码。 @RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)@Slf4jpublic class Fo

Java中集合类Set、List和Map的区别

Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。那么它们有什么区别呢? Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对

List对象过滤

List materialInventoryList = materialInventories.stream().filter(mat -> mat.getQty().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList()); stream().filter()方法可以过滤掉List的数据