问题标签 [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 回答
370 浏览

pci-e - 使用 BAR 的 PCIe 通信是如何定义的?

我是 PCIe 的初学者,必须开发一个简单的 PCIe 驱动程序。

如果我确实有一个内存为 1kByte 的 PCIe 设备,那么 BAR 包含什么?1kByte 空间的地址?BAR 被“映射”到内存或 i/o 地址空间是什么意思?

试图在不同的书中找到答案,但没有成功......

最好的问候托马斯

0 投票
2 回答
5218 浏览

linux - 如何强制内核重新读取/重新初始化 PCI 设备 ID?

我的机器(运行 Linux 内核 3.2.38)在启动时有错误的 PCI 设备子系统 ID(子设备和子供应商 ID)。如果我在系统仍处于启动状态(即热插拔)时物理拔出并重新插入 PCI 设备,它会获得正确的 ID。

请注意,它获取的错误子设备和子供应商 ID 与设备的设备和供应商 ID 相同(请参阅下面 lspci 输出中的前两行)。

以下是热插拔设备前后lspci -vvnn的输出:

热插拔前:

热插拔后:

我的问题:有没有办法在不热插拔设备的情况下修复 ID?例如,强制内核重新读取 PCI 设备 ID,例如通过执行 PCI 总线重新扫描/重新枚举/重新配置?

任何帮助将不胜感激。谢谢。

PS。请注意,即使启动到 UEFI 内部 shell,问题也与内核/软件无关。

聚苯乙烯。本例中的 PCI 设备是MEN F206N,“我的机器”是MEN F22P

0 投票
2 回答
1513 浏览

cuda - CUDA 内核中映射固定主机内存上的原子操作:做还是不做?

CUDA 编程指南中指出,映射固定主机内存上的原子操作“从主机或其他设备的角度来看不是原子的”。我从这句话中得到的是,如果主机内存区域仅由一个 GPU 访问,则可以在映射的固定主机内存上执行原子操作(即使在多个同时内核中)。

另一方面,在Nicholas Wilt所著的《CUDA 手册》第 128 页中指出:

不要尝试在映射的固定主机内存上使用原子,无论是用于主机(锁定比较交换)还是设备(atomicAdd())。在 CPU 方面,为锁定操作强制互斥的设施对于 PCI Express 总线上的外围设备是不可见的。相反,在 GPU 方面,原子操作仅适用于本地设备内存位置,因为它们是使用 GPU 的本地内存控制器实现的。

在映射的固定主机内存上从 CUDA 内核内部执行原子操作是否安全?我们能否依靠 PCI-e 总线来保持 atomics 的 read-modify-write 的原子性?

0 投票
1 回答
5266 浏览

c - 在用户空间中启用写组合 IO 访问

我有一个带有用户空间驱动程序的 PCIe 设备。我正在通过 BAR 向设备写入命令,这些命令对延迟敏感,数据量很小(~64 字节),所以我不想使用 DMA。

如果我使用重新映射内核中 BAR 的物理地址,ioremap_wc然后将 64 字节写入内核内部的 BAR ,我可以看到 64 字节作为单个 TLP 在 PCIe 上写入。如果我允许我的用户空间程序进入mmap带有MAP_SHARED标志的区域,然后写入 64 字节,我会在 PCIe 总线上看到多个 TPL,而不是单个事务。

根据内核PAT 文档,我应该能够将写入组合的页面导出到用户空间:

想要将某些页面导出到用户空间的驱动程序通过使用 mmap 接口和结合

1)pgprot_noncached()

2 )io_remap_pfn_range()remap_pfn_range()vm_insert_pfn()

借助 PAT 支持,pgprot_writecombine正在添加一个新的 API。因此,驾驶员可以继续使用上述顺序, pgprot_noncached()或者pgprot_writecombine()在第 1 步中,然后在第 2 步中。

根据此文档,我的 mmap 处理程序中的相关内核代码如下所示:

我的 PCIe 设备显示在 lspci 中,并且 BAR 按预期标记为可预取:

当我mmap从用户空间调用时,我看到一条日志消息(设置了 debugpat 内核引导参数):

添加reserve_memtype [mem 0xd4000000-0xd7ffffff], track write-combining, req write-combining, ret write-combining

我还可以看到/sys/kernel/debug/x86/pat_memtype_listPAT 条目看起来正确并且没有重叠区域:

我还检查了没有与 PAT 配置冲突的 MTRR 条目。据我所见,一切都已正确设置为在用户空间中发生写入组合,但是使用 PCIe 分析器观察 PCIe 总线上的事务,用户空间访问模式与从内核执行的相同写入完全不同通话后ioremap_wc

为什么写入组合在用户空间中不能按预期工作?

我该怎么做才能进一步调试?

我目前在单插槽 6 核 i7-3930K 上运行。

0 投票
2 回答
6620 浏览

linux - 我是否需要在 Linux 3.12 驱动程序中“启用”一个 PCIe 内存区域?

我有代码,从我的 PCIe 驱动程序的 probe() 函数调用(大致基于这篇文章):

编辑: 根据Andreas Bombe 的回复,我将代码更改为使用pci_iomap(),但我仍然遇到系统挂起的情况

但是内核只是挂在对ioread8().

难道我做错了什么?还是我需要看硬件?

这是系统干净启动时的输出lspci -vcat /proc/iomem

内存出现[disabled]我必须启用它吗?

0 投票
1 回答
4046 浏览

linux-kernel - 为什么 setpci 和 lspci -xxxx 显示相同地址的不同数据?

在我的 x86 Linux 系统上,从 PCI 配置空间中的不同位置读取,setpci与从lspci -xxxx.

例如,我在我的公共汽车上选择一个任意设备并执行lspci -s 00:1f.3 -xxxx并获得:

...

现在,来自setpci -s 00:1f.3 0x40+0.lis02800003的输出与上面的输出一致。但是,输出来自上面setpci -s 00:1f.3 0xf8+0.lffffffff转储,我预计会是08040f87.

有人可以帮忙解释一下这里发生了什么。我是 PCI 调试领域的新手,所以我可能在这里遗漏了一些明显的东西。

提前致谢。

0 投票
1 回答
1764 浏览

linux - pci_Driver.probe 未被调用

我开始为通过笔记本电脑的 PCIe 扩展槽连接的 PCI 设备开发 Linux 设备驱动程序。

在启动时,一切正常。但是,我正在尝试在线获得基本的 Hotplug 支持。当我弹出卡时,我可以看到 (in dmesg) 调用了正确的删除内容。但是,当重新插入卡时,什么也没有发生。如果我手动移除模块,然后插入卡(或开机后插入卡),那么我可以看到模块init被调用,但没有probe。此外,该设备不会出现在lspci输出中。

但是,如果 Iecho 1 > /sys/bus/pci/rescan那么它出现在lspci输出中,但模块无法加载并出现错误 ( pci_enable_device failed with code -22)。

有什么想法可以从哪里开始诊断?执行失败.probe是真正让我感到困惑的地方。

我应该提到这是一个连接在这里的 FPGA 板,所以设备本身可能有问题,但我仍然希望探针运行,然后稍后会出现奇怪的错误而失败。

0 投票
1 回答
1457 浏览

pci - 寻找检查 PCIe 设备树的工具

我正在寻找一种可以显示 pci express 设备(包括交换机)的设备树的工具。我正在尝试从根端口检查 pcie 的拓扑结构,以调试我们在设备带宽方面遇到的一些问题。有没有类似的东西?

0 投票
1 回答
164 浏览

linux-device-driver - 在 pcie gen 3 插槽上未检测到 pcie 1.1 设备

我的电脑在内核版本为 3.11.0-23 的 Ubuntu 12.04 LTS 中运行。

下面的链接是我的电脑型号: http: //www.villman.com/Product-Detail/HP_Pavilion_500_232d

我在 x16 PCIE 3.0 插槽上插入了一个 x4 pcie 1.1 设备。当我执行 lspci 时,我的设备未显示在列表中。

我在其他带有 Gen 2.0 插槽的 PC 上测试了我的设备,它被检测到了。

有没有办法检测到我的设备?

提前致谢!

问候,美联储

0 投票
1 回答
3315 浏览

computer-architecture - PCIe 和 QPI 之间的性能和架构差异是什么?

PCIe 3.0 x16 和 QPI 1.1(20 通道)具有相同的有效带宽 (16 GB/s)。因此,我想大致了解两者之间的差异。

两者在延迟和消息速率(每秒数据包数或 TLP 数)方面有什么区别?对于延迟,我的大致数字是 QPI 为 20 ns,PCIe 3.0 为 200 ns。这些是好的估计吗?如果是,为什么 PCIe 的延迟要高得多——是因为线长吗?

除了 QPI 提供缓存侦听这一事实之外,两者之间是否存在显着的架构差异?据我所知,两者都使用分层协议:传输层到物理层。