问题标签 [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 投票
2 回答
795 浏览

cpu - 之间的事务大小和延迟:CPU 和 RAM、RAM 和 PCIE2.0 16x 设备

以字节为单位的最小事务大小是多少,时钟周期或纳秒的延迟是多少?
为了:

  1. 访问 CPU(桑迪/常春藤桥)到 RAM
  2. 通过 PCIE 2.0 16x 在 RAM 和设备之间进行 DMA 访问
0 投票
2 回答
4395 浏览

linux - Linux 如何测试 PCIe 驱动程序?

我写了一个简单的 PCIe 驱动程序,我想测试它是否有效。例如,如果可以对设备使用的内存进行写入和读取。

我怎样才能做到这一点?

哪些东西也应该被证明?

0 投票
3 回答
57109 浏览

linux - linux内核如何强制枚举PCI-e总线?

Linux 内核 2.6

我有一个通过 GPIO 加载的 fpga,连接到运行 linux 的开发板。fpga 将通过 pci-express 总线发送和接收数据。但是,这是在启动时枚举的,因此没有发现任何链接(因为 fpga 未在启动时加载)。

如何在 linux 中强制重新枚举 pci-e 总线?是否有一个简单的命令或者我必须进行内核更改?我需要热插拔 pcie 设备的能力。

0 投票
2 回答
1903 浏览

linux - 是否可以在同一个 PCIe 插槽上写入使用不同 PCIe 通道的多个设备?

我正在编写一个支持多个设备的 Linux 设备驱动程序。我有一个 x8 PCIe 卡,上面有 4 个这样的设备。每个都通过一个 PCIe 交换机并获得 2 个 PCIe 通道。有没有办法让司机同时写入多个车道?如果是这样,我该怎么做?我认为这应该是可能的,因为它都在一个 PCIe 插槽上,但我不知道如何从驱动程序中完成。

0 投票
1 回答
1697 浏览

cuda - 2-GPU 卡上的 PCI-e 通道分配?

操作的数据速率cudaMemcpy很大程度上受分配用于从 CPU 到 GPU 运行的 PCI-e 3.0(或 2.0)通道数量的影响。我很好奇如何在包含两个 GPU 的 Nvidia 设备上使用 PCI-e 通道。

Nvidia 有一些产品在单个 PCI-e 设备上具有两个 GPU。例如:

  • GTX 590 包含两个 Fermi GF110 GPU
  • GTX 690 包含两个 Kepler GK104 GPU

与许多较新的显卡一样,这些设备安装在PCI-e 16插槽中。对于仅包含一个GPU 的卡,GPU 可以使用 16 个 PCI-e 通道。

如果我的设备包含两个 GPU(如 GTX 690),但我只在其中一个GPU上运行计算作业,那么所有 16 个 PCI-e 通道是否可以为正在使用的一个 GPU 提供服务?


将其显示为 ascii 艺术...

[ GTX690 (2x GF110) ] ------16 PCI-e 通道 ----- [ CPU ]


不是在谈论CPU 连接到两张各有一个 GPU 的卡的情况。(如下图)

[ GTX670 (1x GK104) ] ------ PCI-e 通道 ----- [ CPU ] ------ PCI-e 通道 ----- [ GTX670 (1x GK104) ]

0 投票
1 回答
2824 浏览

wmi - WMI: PCIExpress

Does anybody know the way to get devices attached to PCI Express slots by using WMI?

I've been using Win32_PnPEntity class, but I can't make a distinguish between PCI and PCI Express devices.

0 投票
0 回答
964 浏览

linux-kernel - Linux 块驱动程序合并 bio 的

我有一个正在工作的块设备驱动程序,经过一段时间。它适用于 PCIe 设备,我直接使用 make_request_fn 处理 bios,而不是使用请求队列,因为该设备没有寻道时间。但是,它仍然有事务开销。

当我从设备连续读取时,我得到包含许多段的 bios(通常我最多 32 个),每个段由 2 个硬件扇区(所以 2 * 2k)组成,然后将其作为设备的一个分散-收集事务处理,节省大量的信令开销。然而,在写入时,每个 bios 都只有一个 2 个扇区的段,因此操作总共需要更长的时间。我希望以某种方式使传入的 bios 由许多段组成,或者我自己将 bios 明智地合并在一起。这里的正确方法是什么?

的当前内容make_request_fn大致如下:

  • 确定生物的读/写
  • 对于 bio 中的每个部分,在scatterlist*with中添加一个条目sg_set_page
  • 将此散点列表映射到 PCIpci_map_sg
  • 对于 scatterlist 中的每个段,添加到定义多段 DMA scatter-gather 操作的设备特定结构
  • 将该结构映射到 DMA
  • 进行交易
  • 取消映射结构和 SG DMA
  • 如果失败和bio_endio成功则调用。-EIO0

请求队列设置如下:

0 投票
1 回答
281 浏览

linux-kernel - 磁盘 IO 上 swiotlb_unmap_sg_attrs() 中的 NULL 指针取消引用

在使用 PCIe 块设备驱动程序读取或写入文件时,我遇到了一个我真的不明白的错误。我似乎在swiotlb_unmap_sg_attrs()中遇到了一个问题,它似乎正在对sg指针进行 NULL 取消引用,但我不知道这是从哪里来的,因为scatterlist我自己使用的唯一一个被分配为设备信息的一部分只要驱动程序这样做,结构就会持续存在。

有一个堆栈跟踪来解决这个问题。它在确切的细节上往往会有所不同,但它总是会崩溃swiotlb_unmap_sq_attrs()

认为我可能有锁定问题,因为我不确定如何处理 IO 函数周围的锁定。调用函数时已持有锁request,我在调用 IO 函数本身之前释放它,因为它们需要(MSI)IRQ 才能完成。IRQ 处理程序更新 IO 函数正在等待的“状态”值。当 IO 函数返回时,我将锁取回并返回到请求队列处理。

崩溃发生在blk_fetch_request()以下期间:

其中bytes由请求处理程序更新为 IO 的总长度(每个分散聚集段的总长度)。

0 投票
1 回答
5131 浏览

c - 将 linux 设备驱动程序与虚拟 PCI 设备连接

我有一个模拟 PCI 设备的用户空间程序。我已经下载了使用 NVMe 标准与 PCI 设备交互的 nvme linux 设备驱动程序。我必须验证我的用户空间程序是否与标准兼容。

nvme.c(Linux 设备驱动程序)包含 nvme_probe() 函数,该函数将在插入设备时调用。由于我没有该设备,所以我想我会将探测功能合并到 nvme_init() 函数中。

现在我在互联网上进行了大量研究以了解如何模拟 PCI 设备,如 安装 PCI 驱动程序而不连接到设备在 linux 上模拟PCI 设备等帖子 我不知道如何将填充的 struct pci_dev 返回到中nvme_probe()的函数调用pci_set_drvdata(pdev, dev);

如果您可以建议一个教程,关于如何使用虚拟设备配置和用户空间程序函数指针的内存地址手动填充 pci_dev 结构,以模拟与 nvme 驱动程序的交互。

0 投票
1 回答
747 浏览

fpga - FPGA PCIe DMA 写入不会改变 CPU RAM

我正在研究 Xilinx FPGA 和 PC over PCIe 之间的 DMA 连接。但是,从 FPGA 到计算机的 DMA 传输不起作用。我转储了 FPGA 通过 ChipScope 发送的 PCIe 包:

(头)0x6000_0002,0x0600_01FF,(地址)0x0000_0000,0x3740_0000,(数据)0x0000_0001,0x0000_0002

它应该将 0x1,0x2 写入内存地址 0x3740_0000,但写入没有发生。另一方面,从同一地址读取工作完美。32位和64位地址我都试过了,都不行。我正在使用的计算机是 AMD 64 位机器。我错过了什么?