作者uniquelegend (back7590)
看板LinuxDev
标题[问题] DMA driver相关问题
时间Thu Feb 24 15:56:08 2022
最近突然需要实现用dma与fpga沟通,
但由於一直以来都没有碰有关driver的东西,
而且有时间压力,
所以一直都是在网路上瞎找资料。
(因为真的没有按部就班的从基础学起,
所以可能会有非常严重的概念错误,
请各位见谅。)
想请问一些观念问题或有没有推荐的书?
1.
像是使用持续性(coherent)的DMA是在挂载driver时就将配置buffer的部分写在driver中了;
那如果是streaming这种,既然是每次动作时重新map,那是不是配置buffer的部分就是直接写在软体动作里?
2.
(这问题不知道会不会错版)
fpga的部分等软体分配完buffer後,将总线地址传给fpga。
照着TLP格式来放入此地址,并将TLP丢给RQ/RC通道,
就会自动判定成DMA请求并执行吗?
(因为部分原因,所以pcie ip的部分没有使用官方含有dma的ip,而是使用最基础的Ultrasc
目前只是要将fpga内的资料在软体请求时,透过dma写入主机。
但因为相关概念真的非常不足,
也没有人可以询问,所以可能很多观念有严重错误,烦请大家不吝指教。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.200.42.183 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1645689370.A.628.html
※ 编辑: uniquelegend (1.200.42.183 台湾), 02/24/2022 16:30:26
1F:推 breeze08: 我不是driver的专家,虽然不能给你什麽建议,但在你问 02/25 00:03
2F:→ breeze08: 题的描述上想探讨厘清一下,更清楚的描述或许有助於其 02/25 00:03
3F:→ breeze08: 他人帮助你。以下是我对问题的理解,目前看起来是你有 02/25 00:03
4F:→ breeze08: 一台x86主机,主机上有一套软体要透过PCIe介面来跟FPGA 02/25 00:03
5F:→ breeze08: 沟通,而你想使用DMA的方式来实现,到这部分我的理解对 02/25 00:03
6F:→ breeze08: 吗?假如这部分理解没错,再来会有几个延伸问题,这个F 02/25 00:03
7F:→ breeze08: PGA的供应商有提供基本的驱动给你吗?还是你要自己从从 02/25 00:03
8F:→ breeze08: 无到有?如果从无到有的话工程量可能颇巨大,就我的理 02/25 00:04
9F:→ breeze08: 解来说你需要先阅读那块FGPA的Spec知道如何操作那块FPG 02/25 00:04
10F:→ breeze08: A,再来是根据Spec来撰写主机上的PCIe驱动来实现跟FPGA 02/25 00:04
11F:→ breeze08: 基本的沟通,然後以此为基础调整成以DMA的方式传送。还 02/25 00:04
12F:→ breeze08: 是说你已经有厂商给的基本驱动只是要调整成DMA的方式? 02/25 00:04
13F:→ breeze08: 另外根据你最後提到的透过DMA传给主机这句话来看,我有 02/25 00:04
14F:→ breeze08: 疑惑的是你这块FPGA的角色是主动式还是被动式?他会主 02/25 00:04
15F:→ breeze08: 动给PC讯号还是PC给讯号後才会动?这块FPGA上的程式是 02/25 00:04
16F:→ breeze08: 你撰写的吗?还是厂商提供的?你有需要去调整这上面的 02/25 00:04
17F:→ breeze08: 程式码吗?还是程式码是已经固化的? 02/25 00:05
不好意思!因为怕手机排版不好看,所以用截图回覆! 非常谢谢您的帮助
※ 编辑: uniquelegend (36.230.25.93 台湾), 02/25/2022 00:33:34
19F:→ breeze08: 这边在厘清一下你想实现的DMA部份,指的是FPGA那一侧还 02/25 00:40
20F:→ breeze08: 是指主机那一侧?还是两侧都要? 02/25 00:40
21F:→ breeze08: 关於主机的PCIe驱动撰写,参考书籍可以看看Linux Devic 02/25 00:44
22F:→ breeze08: e Driver 3/e 或是平田丰的 Linux Device Driver Progr 02/25 00:44
23F:→ breeze08: amming 02/25 00:44
24F:→ breeze08: 这两本也有关於DMA的章节 02/25 00:46
25F:→ breeze08: 话说硕班一个人做这个感觉是有点惨,如果真的没有人可 02/25 00:54
26F:→ breeze08: 以帮的话可能就要考虑descent大说的外包了 02/25 00:54
27F:→ breeze08: 啊 抱歉 我看到你是要实现FPGA上的DMA了,但如果是要实 02/25 01:03
28F:→ breeze08: 现FPGA上的DMA可能就不属於Linux driver的范畴了,而是 02/25 01:03
29F:→ breeze08: 属於积体电路设计的部分 02/25 01:03
不好意思!我可能没有表达清楚。 是两边都需要的,驱动/fpga/软体都需要实现。目前打算先新增完驱动的部分,再来进一步测试硬体到底该如何实现 因为目前我可能观念有点模糊,所以不确定像这种streaming dma的buffer配置到底应不应该在驱动里实现? 因为在网路上查到的介绍看起来是在「每次执行读写动作时,重新配置。」 感觉这个动作(每次执行)比较偏向软体的部分而不是驱动。 我想确认我这个判断方式是否有误? 因为目前看到的范例都是比较简短的小例子,我不大会分辨该在哪部分实现他才是对的。 谢谢您的回答
※ 编辑: uniquelegend (36.230.25.93 台湾), 02/25/2022 02:09:20
30F:→ breeze08: 关於buffer该放在哪,以我粗浅的认知,放在用户态(也就 02/25 15:40
31F:→ breeze08: 是你的软体)的效能会比较好,因为假如buffer放在驱动中 02/25 15:40
32F:→ breeze08: (内核态),你的软体还需要进行系统呼叫才能读取,这步 02/25 15:40
33F:→ breeze08: 骤就多了一份overhead。那所谓的buffer放在用户态,其 02/25 15:40
34F:→ breeze08: 具体实现也是透过驱动来达成的,通常是透过驱动中实现m 02/25 15:41
35F:→ breeze08: map这个file operation来把内核态的空间映射至用户态。 02/25 15:41
36F:→ uniquelegend: 了解!太感谢您的帮忙了! 02/27 00:52