原文https://blog.csdn.net/abcamus/article/details/76167747

一、PCIe DMA机制

PCIe控制器也提供DMA(Direct Memory access)功能,用来批量地异步数据传输。

1.1 DMA读写的发起和结束

假设现在RC要从EP mem space读1MB数据,可以有这么两种方式:RC发起DMA读;EP发起DMA写。这两种方式结果是等效的,对最后完成中断的方式会不一样,前者通过local interrupt表示自己DMA读完了,后者需要EP发送一笔IMWr来表示DMA读完成了。

1.2 DMA配置

如图表示本地控制器发起一笔1MB写操作

1.2.1 SAR和DST

SAR表示DMA传输的数据源地址,如果RC发起从EP读操作,那么SAR必定是EP中某个BAR range内。目标地址DAR就是系统ddr中的地址。反之,如上图所示的写操作,DAR就是EP中mem space。

1.2.2 Max_Payload_Size

DMA读写本质上还是通过拆分成TLP来进行的,每次传输的size就是通过tlp header中的length来确定的,而length由控制器的Max_Payload_Size决定,这个值取EP和RC的capability中相应参数的最小值。

1.3、Linked List

对于大批量数据的传输,通常都会有所谓的Linked List Mode。试想一下,在Linux运行时要进行大批量数据传输的时候是很难分配到大块连续的物理地址的,那么势必需要重复发起DMA传输,这样的话DMA的异步传输功能岂不是被变相衰弱了。所以在硬件上要有这样一种机制来避免这个问题,这就是LL DMA

这种机制广泛存在于各种高速设备中,USB3.0传输的时候内部通过链接trb实现的就是Linked List DMA。

如上图所示,Linked List中每个配置块称作element,每个element中的内容就是前面DMA传输时候的配置,硬件在发起DMA传输的时候把这块payload加载到指定的寄存器中。LL mode的结束通过CB来标志,toggle一下即表示到了LL的末尾。

二、PCIe MSI机制

PCIe采用data path才传递interrupt,这就是Message Signal Interrupt。假如RC收到一笔对应的写操作,那么在硬件实现上就会自动转换成中断信号给中断控制器,这笔写请求并不会到任何ram区域。

2.1 硬件支持

2.1.1 Generic Interrupt Controller

https://developer.arm.com/products/system-ip/system-controllers/interrupt-controllers

从CoreLink GIC-500开始支持MSI/MSI-X。CoreLink GIC-400不支持,所以就算PCIe设备支持也无法实现MSI(-X)机制。

2.1.2 PCIe设备支持

每一个具有MSI capability的device都有一组对应的寄存器来表示MSI能力。

MSI Control Register中的multiple message capable(三个比特,假设值为x)表示MSI可产生多少message,计算方法为2的x此方。另外有三个比特multiple message enable,和message capable对应,表示实际使能了多少message。还有一个MSI data寄存器和MSI address寄存器,要结合中断控制器配置,表示具体的message编码和message的目标地址。

到这篇文章为止涉及的知识已经能够让PCIe工作起来了,接下来开始写些Linux PCIe驱动相关的文章

转载 大话pcie的更多相关文章

  1. [转载]PCI/PCIe基础——配置空间

    转载地址:http://blog.csdn.net/jiangwei0512/article/details/51603525 PCI/PCIe设备有自己的独立地址空间,这部分空间会映射到整个系统的地 ...

  2. 嵌入式开发之hi3519---PCIE DMA

    http://blog.csdn.net/abcamus/article/details/76167747 大话pcie dma http://blog.csdn.net/qingfengtsing/ ...

  3. 转载:使用Xilinx IP核进行PCIE开发学习笔记(一)简介篇

    https://zhuanlan.zhihu.com/p/32786076 最近接触到一个项目,需要使用PCIE协议,项目要求完成一个pcie板卡,最终可以通过电脑进行通信,完成电脑发送的指令.这当中 ...

  4. 【转载】Linux查看PCIe版本及速率【方法】PCIE的X4X8X16 查看 数量 怎么看

    Linux查看PCIe版本及速率   PCIE有四种不同的规格,通过下图来了解下PCIE的其中2种规格   查看主板上的PCI插槽 # dmidecode | grep --color "P ...

  5. 【转载】认识SSD的SATA、mSATA 、PCIe和M.2四种主流接口

    认识SSD的SATA.mSATA .PCIe和M.2四种主流接口 2018-09-25 • 工具 • 评论关闭 认识SSD的SATA.mSATA .PCIe和M.2四种主流接口

  6. Atitti 大话存储读后感 attilax总结

    Atitti 大话存储读后感 attilax总结 1.1. 大话存储中心思想(主要讲了磁盘文件等存储)1 1.2. 最耐久的存储,莫过于石头了,要想几千万年的存储信息,使用石头是最好的方式了1 1.3 ...

  7. 转载-centos网络配置(手动设置,自动获取)的2种方法

    转载地址:http://blog.51yip.com/linux/1120.html 重新启动网络配置 # service network restart 或 # /etc/init.d/networ ...

  8. 阿里面试回来,想和Java程序员谈一谈(转载)

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  9. [转载] 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构

    原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209406532&idx=1&sn=2e9b0cc02bdd ...

随机推荐

  1. python 的__init__ 和__new__ 区别

    在此介绍一下  __init__ 和  __new__ 先后调用的区别 代码如下: # __init__ 和 __new__的区别 # 通常在编代码时,__init__ 较为常见,但是__new__却 ...

  2. face recognition[翻译][深度人脸识别:综述]

    这里翻译下<Deep face recognition: a survey v4>. 1 引言 由于它的非侵入性和自然特征,人脸识别已经成为身份识别中重要的生物认证技术,也已经应用到许多领 ...

  3. Recurrent Neural Network[Quasi RNN]

    0.背景 RNN模型,特别是包含着门控制的如LSTM等模型,近年来成了深度学习解决序列任务的标准结构.RNN层不但可以解决变长输入的问题,还能通过多层堆叠来增加网络的深度,提升表征能力和提升准确度.然 ...

  4. redis为什么这么火该怎么用

    最近一些人在介绍方案时,经常会出现redis这个词,于是很多小伙伴百度完redis也就觉得它是一个缓存,然后项目里面把数据丢进去完事,甚至有例如将实体属性拆分塞进redis hash里面的奇怪用法等等 ...

  5. HRBUST - 2347 - 递归画图 - vj大一上寒假训练2.11

    其他题可由本题变形得到. 思路:利用坐标dfs搜索. 注意:1,初始化.2,坐标实时更新(x,y) 代码: #include<iostream> #include<cstdio> ...

  6. 【php增删改查实例】第二十四节 - 文件上传在项目中的具体应用

    文件上传在项目中,一般有两个用武之地,分别为设置用户的头像和上传附件.本节我们演示如果进行用户头像的上传. 因为一个用户单独并且唯一对应了一个头像,是一对一的关系,所以我们需要去给tm_users表添 ...

  7. IdentityServer4 实战文档

    一.前言 IdentityServer4实战这个系列主要介绍一些在IdentityServer4(后文称:ids4),在实际使用过程中容易出现的问题,以及使用技巧,不定期更新,谢谢大家关注.这些问题. ...

  8. IntelliJ IDEA(四) :Settings(上)

    前言 IDEA是一个智能开发工具,每个开发者的使用习惯不同,如何个性化自己的IDEA?我们可以通过Settings功能来设置.Settings文件是IDEA的配置文件,通过他可以设置主题,项目,插件, ...

  9. 【译】参考手册-React组件

    react version: 15.4.2 React.Component 组件能够让你将UI拆分为多个独立自治并可重用的部分.在 React 中提供了 React.Component. 概述 Rea ...

  10. Python股票分析系列——自动获取标普500股票列表.p5

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第5部分.在本教程和接下来的几节中,我们将着手研究如何为更多公司提供大量的定价信息,以及如何一次 ...