问题标签 [pci-e]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4476 浏览

linux-kernel - PCIe 中断号

我正在尝试编写一个可用于服务 PCIe MSI 中断的内核模块。现在我在尝试配置我的中断时遇到了麻烦,我正在尝试遵循“Linux Device Drivers Ed. 3”这本书指出:

“驱动程序不需要检查中断号,因为PCI_INTERRUPT_LINE可以保证找到的值是正确的。”

所以当然这似乎是设置我的中断的合乎逻辑的方式:

现在这为我注册了中断 60。然后我开始使用 jTag 手动触发中断,我收到一条内核消息,指出该中断没有附加处理程序(中断 576)。如果我将 irq_line 硬编码为 576,那么 request_irq 就会失败。

找出我的中断线的最佳方法是什么?为什么我不能得到我需要的 IRQ?

还有一件事,在启动过程中,我的设备自动设置为 IRQ 引脚 1(传统中断 A),它对应于 irq 行 572,这也是存储在 dev->irq 中的值。如果引导顺序自动将 IRQ 设置为引脚 0(禁用传统中断),dev->irq 是否会指向我的 MSI 中断@576?

0 投票
1 回答
1138 浏览

linux-device-driver - pci_disable_msi Oops Bug

I am trying to write a kernel module that will handle MSI interrupts for a PCIe device. I have written a simple skeleton outline for my driver currently and whenever I try to call 'pci_disable_msi(dev)' I get an unable to handle kernel NULL pointer dereference error. I am following along exactly as described from the /Documentation/PCI/MSI-HOWTO.txt and it seems to me that I should not be getting this error. Is this a bug or is my setup incorrect? Judging by the last print that occures, I am pretty sure that it is happening at the fpga_remove() when I call pci_disable_msi(). (Clearly this occures when I am removing the module)

0 投票
0 回答
1365 浏览

linux-kernel - 使用 pci_enable_msi_block

我正在尝试在内核模块中启用多个 MSI irq 行。我在 RC 模式下运行。问题是当我调用pci_enable_msi_block()它时,它不会分配超过 1 个 MSI。如果我调用pci_enable_msi_block(dev, 32)它将返回 4(我假设这意味着我可以使用 4 MSI)。然后我打电话pci_enable_msi_block(dev,4),它返回1。

这是$lspci -vafter的输出,insmod Custom_module.ko但仅成功启用 1 MSI

如何使用超过 1 个 MSI。我可以使用 JTAG 编辑 Enable_MSI 寄存器,然后 EP 可以触发 MSI,但没有专门用于这些 IRQ 的处理程序。

0 投票
3 回答
2993 浏览

linux - 在 Linux 上重新扫描 PCIe 后未分配的 BAR 区域

我有一个 FPGA 卡连接到 Linux 系统上的 PCIe。我可以对 FPGA 重新编程,然后echo 1 > /sys/bus/pci/rescan我的卡就会出现在lspci.

但是 BAR 区域没有分配任何内存:

pci=在 Linux 启动命令行上尝试了各种标志,但效果不大。

我怀疑 BAR 区域太大,因此 Linux 无法在地址空间中找到适当对齐的范围来映射 BAR,因为它们在启动时不存在。

这是一个正确的理论吗?是否可以告诉 Linux 为我的设备保留空间?

0 投票
0 回答
48 浏览

language-agnostic - 将命令存储在视频内存中与通过 PCIe 访问它们

我目前正在阅读Fabian "ryg" Giesen的“图形管道之旅”系列博客的第 2 部分。

在这个特定的部分中,他谈到了一个有趣的观点。GPU 处理的命令既可以从驻留在 GPU 上的视频内存中读取,也可以通过 PCI Express 总线从 CPU 端读取。

我含蓄地理解了一些优点和缺点。但是,我对他们很模糊。我不能说我完全理解这些权衡。无论如何,我将尝试连贯地表达我的想法。

在显存中存储数据:

  • 肯定更快。
  • 但是,它有内存开销(不确定带宽)。

从 CPU 读取:

  • 在将数据存储在视频内存中是一种浪费的情况下可能会更好(也许是因为它永远不会再次使用?)。
  • 我认为在重用数据时将数据存储在视频内存中会很有用,因为它可以节省 PCIe 总线上的带宽。
  • 但是这种通信会比直接从显存中读取要慢。

我有一种感觉,两者之间有更多的复杂性和权衡取舍。另外,我不完全确定我上面所说的是真的。我希望有人:

  1. 说明一些重要的权衡和可能的其他复杂性,只是为了更好地理解。
  2. 验证我上面所说的是否正确!(我还不是很清楚。)
0 投票
2 回答
1269 浏览

verilog - 如何模拟 PCIe 来调试我的 fpga 端点

我正在研究通过 pcie 连接的 fpga 控制器。我可以调试硬件的唯一方法是使用chipscope。所以我通过我的驱动程序执行命令并检查来自 fpga 的信号。

问题是每次我想检查信号以调试项目时,构建项目并将其加载到 fpga 都需要花费大量时间。

有没有更简单的方法来调试连接到 pcie 的 fpga?

有没有办法可以模拟所有的 pcie 信号而根本不必运行 fpga?

0 投票
1 回答
124 浏览

device-driver - 在 PCIe 总线上设置 I/O 控制器需要多长时间

假设我有一个 InfiniBand 或类似的 PCIe 设备和一个快速的 Intel Core CPU,我想通过 IB 链路发送例如 8 字节的用户数据。还要说没有设备驱动程序或其他内核:我们保持简单,直接写入硬件。最后,假设 IB 硬件先前已针对上下文正确配置,因此它只是在等待执行操作。

问:本地 CPU 需要多少 CPU 周期才能告诉硬件数据在哪里以及应该开始发送数据?

更多信息:我想估算一下使用 PCIe 通信服务与 CPU 本地服务(例如使用协处理器)相比的成本。我期望的是,PCIe 总线上的寄存器会有很多写入,例如设置数据包的地址和长度,可能还有状态和/或控制寄存器的一些读取和写入。我预计每个都需要数百个 CPU 周期,所以我预计整体设置将需要 1000 到 2000 个 CPU 周期。我会是对的吗?

我只是在寻找一个大概的答案...

0 投票
1 回答
184 浏览

cuda - 从 GPU 内核非合并访问时映射的固定主机内存带宽

假设int主机内存中有一个大数组,内核的线程读取或写入该数组,并且不能保存在 GPU 全局内存中。当对阵列元素的访问被合并时,我们可以预期从主机内存/向主机内存进行突发读/写,这接近 PCI-Express 通道的理论带宽。但是当读取或写入完全是零星的(非合并)时,带宽与理论最大带宽相比会是多少?

根据下图对于每个写入事务,都应该有一个 128 位长的数据包。但它假定 32 位寻址(考虑到 UVA 需要 64 位机器)和 4 字节作为数据大小。如果这些假设成立,则可以预期大约四分之一的最大带宽用于写入,七分之一用于读取。我对么?这些假设是真的吗?

在此处输入图像描述

编辑

uint我用数组设计并执行了上述问题的测试。对于带宽约为 6.6 GB/s 的 PCI-Express 链路上的大量零星读取和大量零星写入,我获得的带宽约为 480 MB/s,显示速度降低了 13 到 14 倍。怎么解释?

0 投票
3 回答
1900 浏览

linux - Linux PCI 驱动程序调用 init,但不探测

我正在为通过 PCIe 扩展槽连接到我的机器的 FPGA 板开发驱动程序,如果板在 PC 之前通电,一切都会很好。但是,如果我先预订我的计算机,然后预订 FPGA 板,我会得到设备被识别并加载我的模块的相当不寻常的行为(我看到我的系统日志中调用了“init”函数),但是“probe”函数永远不会被调用。

我认为这是由于 BAR0 无效。上电时的输出dmesg

第一个 reg 应该是 0xb4000000-0xb400ffff 之类的东西,但它却显示为 0。(就像我说的,如果它在计算机之前打开电源,它就可以正常工作)。

是否需要额外的步骤才能分配此块?或者以某种方式向内核表明它需要这样做?

0 投票
0 回答
3402 浏览

linux - Linux驱动PCI错误检测

在我的某个 pcie 设备的 Linux pcie 驱动程序中,我实现了 pcie 错误处理函数(error_detected、slot_reset 方法等)。我想为我触发一个 pci 错误来锻炼这些处理程序并观察它的行为。我从 pci 错误恢复内核文档中了解到,第一步是使用 error_detected 方法,如果系统检测到与 pci 设备相关的任何错误,则会调用该方法。好消息是系统会为驾驶员检测到它,从而简化事情。但是我遇到了错误检测本身的问题。

我试图通过 PCIe 设备触发错误。在它的固件上,我触发了它的 PCIe 子系统的重置。结果,I/O 速率降至零,驱动程序现在无法发送到设备。他们的 PCIe 连接中确实发生了一些事情。但是,当我期望内核会检测到 PCI 错误并调用处理程序时,我看不到我的 error_detected 方法被调用。相反,控制台中出现了一些警告消息,如下所示:

irq 16:没人关心
处理程序:
<...>
<...>
禁用 IRQ #16

更让我感到困惑的是,注入的 PCI 错误似乎也降低了那个 IRQ 16 设备——这绝对不是我的驱动程序/设备的 irq #。这看起来像是公共汽车上的破坏性事件。这个结果是 PCI 错误的预期结果关于为什么内核没有检测到那个 PCI 错误有什么想法吗?在注册错误处理程序方法期间有什么我可能错过的吗?

如果是这样,我想寻求其他注入 PCI 错误的方法,以便我使用我的错误处理程序。谢谢!