转载 大话pcie
原文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的更多相关文章
- [转载]PCI/PCIe基础——配置空间
转载地址:http://blog.csdn.net/jiangwei0512/article/details/51603525 PCI/PCIe设备有自己的独立地址空间,这部分空间会映射到整个系统的地 ...
- 嵌入式开发之hi3519---PCIE DMA
http://blog.csdn.net/abcamus/article/details/76167747 大话pcie dma http://blog.csdn.net/qingfengtsing/ ...
- 转载:使用Xilinx IP核进行PCIE开发学习笔记(一)简介篇
https://zhuanlan.zhihu.com/p/32786076 最近接触到一个项目,需要使用PCIE协议,项目要求完成一个pcie板卡,最终可以通过电脑进行通信,完成电脑发送的指令.这当中 ...
- 【转载】Linux查看PCIe版本及速率【方法】PCIE的X4X8X16 查看 数量 怎么看
Linux查看PCIe版本及速率 PCIE有四种不同的规格,通过下图来了解下PCIE的其中2种规格 查看主板上的PCI插槽 # dmidecode | grep --color "P ...
- 【转载】认识SSD的SATA、mSATA 、PCIe和M.2四种主流接口
认识SSD的SATA.mSATA .PCIe和M.2四种主流接口 2018-09-25 • 工具 • 评论关闭 认识SSD的SATA.mSATA .PCIe和M.2四种主流接口
- Atitti 大话存储读后感 attilax总结
Atitti 大话存储读后感 attilax总结 1.1. 大话存储中心思想(主要讲了磁盘文件等存储)1 1.2. 最耐久的存储,莫过于石头了,要想几千万年的存储信息,使用石头是最好的方式了1 1.3 ...
- 转载-centos网络配置(手动设置,自动获取)的2种方法
转载地址:http://blog.51yip.com/linux/1120.html 重新启动网络配置 # service network restart 或 # /etc/init.d/networ ...
- 阿里面试回来,想和Java程序员谈一谈(转载)
引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...
- [转载] 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构
原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209406532&idx=1&sn=2e9b0cc02bdd ...
随机推荐
- object detection[faster rcnn]
这部分,写一写faster rcnn 0. faster rcnn 经过了rcnn,spp,fast rcnn,又到了faster rcnn,作者在对前面的模型回顾中发现,fast rcnn提出的ro ...
- RabbitMQ详解(一)------简介与安装
RabbitMQ 这个消息中间件,其实公司最近的项目中有用到,但是一直没有系统的整理,最近看完了<RabbitMQ实战 高效部署分布式消息队列>这本书,所以顺便写写. 那么关于 Rabb ...
- 【原创】三招搞死你的IE11,可重现代码下载(IE Crash keyframes iframe)!
前言 很多人都知道我们在做FineUI控件库,而且我们也做了超过 9 年的时间,在和浏览器无数次的交往中,也发现了多个浏览器自身的BUG,并公开出来方便大家查阅: 分享IE7一个神奇的BUG(不是封闭 ...
- 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3
备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...
- mybatis-高级结果映射之一对多
目录 1 数据准备 1.2 实体类, 接口和XML 2 一对多映射 2.1 collection集合映射 2.1.1 创建结果实体类 2.1.2 创建结果集 2.1.3 创建对应的方法和XML 2.1 ...
- ESP8266的低功耗方案-睡眠模式
在某些时候我们设计的产品可能不具备持久供电的环境,那通常会采用锂电池.干电池一类的轻便型的非持久性电源.当遇到这种情况时,产品的续航能力可能就会成用户评估产品的一个重要指标,加大电池容量当然是最为直接 ...
- 三、xadmin----内置插件
1.Action Xadmin 默认启用了批量删除的事件,代码见xadmin-->plugins-->action.py DeleteSelectedAction 如果要为list列表添 ...
- 剑指offer--3.从头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路:可以利用push 和unshift /*function ListNode(x){ this.val = x; this. ...
- H5 25-CSS三大特性之层叠性
25-CSS三大特性之层叠性 我是段落 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- c语言之字符串和格式化输入输出
字符串和格式化输入输出 #include<stdio.h> #include<string.h> #define DENSITY 62.4 int main(void) { f ...