软件如何为 PCI 根端口读取请求设置目标地址?

问题描述

我的背景:

我是一名硬件工程师,拥有足够的软件经验,不时打扰内核。我对PCI和PCIe很陌生。

项目背景:

我正在尝试让 Altera(英特尔)Cyclone V SX SOC 的 PCIe 端口与 NVMe SSD 通信。该设计基于 2015 年的英特尔示例,该示例于 2018 年更新。注意:他们仅使用 PCIe 以太网适配器对其进行了测试。我的带宽远高于以太网适配器。

pcie 驱动程序正确加载。 NVMe 驱动程序正确加载。我可以看到设备, lspci -vv 提供了准确的信息。对 SSD 的一些查询工作正常。但是,当我尝试从设备读取或写入大量数据时,出现读取错误。

有一个线程讨论了这个问题:https://forum.rocketboards.org/t/altera-pcie-driver-issue-with-ssd-devices/545/8,但是在那里提出的任何解决方法都不适合我。那可能是我对响应者的描述缺乏理解,或者可能是最新版本的 Quartus 破坏了这项工作。

根据线程和我的经验,问题很简单,Altera 的根端口总线主机正在写入 DRAM 地址 0(Txs 基地址,第一个字节掩码),这恰好是内核所在的位置。第一个解决方法在 FPGA“硬件”中添加了 0x50000000 的偏移量,考虑到它们有 1GB 的 DRAM,就像我一样,这是没有意义的。我查了一下,verilog 表明他们添加的数字 0x50000000 是一个字地址,因此实际上他们将 0x000000014000000 添加到地址中。其中,我认为会将地址环绕到 0x40000000,这仍然在 1GB DRAM 地址之外。如果它有效,我不知道为什么。

另一个修复更有意义。在那个中,他们假设 Txs 地址基被用作根端口目标地址(就像之前的修复一样)并添加了 64 兆字节的偏移量以使其远离内核。他们还保留了从 64MB 开始的 32MB,因此内核不会使用它。它适用于他们,但不适用于我。如果我通过合法方式或通过 hack 移动根端口基地址,nvme 驱动程序会挂起并导致看门狗重置。

驱动程序不会生成太多信息,尤其是在发生故障时。我已经为驱动程序配备了 printks,但如果添加太多,IRQ 延迟就会成为一个问题。根据之前的实验,挂起发生在内核中的块读取期间。

如果你读了,谢谢。

这是我的问题:应该如何设置 MFING 根端口 DMA 基址?

是的,我知道 dts 文件中的 dma-ranges,但据我所知并没有使用。我试过设置它,在这种情况下似乎没有使用它。

我一直认为根端口使用的 DRAM 基址应该设置在其中一个 BAR 中。但在内核或 RTL 中找到链接已被证明是困难的。

我在想,如果我可以将 BAR 中的地址与偏移量相关联,我或许可以在软件或 RTL 中对其进行跟踪,以查看哪里出错了。

我正在寻找讲义,我知道。有人可以扔我一根骨头吗?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...