问题标签 [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.
pci-e - 使用 BAR 的 PCIe 通信是如何定义的?
我是 PCIe 的初学者,必须开发一个简单的 PCIe 驱动程序。
如果我确实有一个内存为 1kByte 的 PCIe 设备,那么 BAR 包含什么?1kByte 空间的地址?BAR 被“映射”到内存或 i/o 地址空间是什么意思?
试图在不同的书中找到答案,但没有成功......
最好的问候托马斯
linux - 如何强制内核重新读取/重新初始化 PCI 设备 ID?
我的机器(运行 Linux 内核 3.2.38)在启动时有错误的 PCI 设备子系统 ID(子设备和子供应商 ID)。如果我在系统仍处于启动状态(即热插拔)时物理拔出并重新插入 PCI 设备,它会获得正确的 ID。
请注意,它获取的错误子设备和子供应商 ID 与设备的设备和供应商 ID 相同(请参阅下面 lspci 输出中的前两行)。
以下是热插拔设备前后lspci -vvnn的输出:
热插拔前:
热插拔后:
我的问题:有没有办法在不热插拔设备的情况下修复 ID?例如,强制内核重新读取 PCI 设备 ID,例如通过执行 PCI 总线重新扫描/重新枚举/重新配置?
任何帮助将不胜感激。谢谢。
PS。请注意,即使启动到 UEFI 内部 shell,问题也与内核/软件无关。
cuda - CUDA 内核中映射固定主机内存上的原子操作:做还是不做?
在CUDA 编程指南中指出,映射固定主机内存上的原子操作“从主机或其他设备的角度来看不是原子的”。我从这句话中得到的是,如果主机内存区域仅由一个 GPU 访问,则可以在映射的固定主机内存上执行原子操作(即使在多个同时内核中)。
另一方面,在Nicholas Wilt所著的《CUDA 手册》第 128 页中指出:
不要尝试在映射的固定主机内存上使用原子,无论是用于主机(锁定比较交换)还是设备(
atomicAdd()
)。在 CPU 方面,为锁定操作强制互斥的设施对于 PCI Express 总线上的外围设备是不可见的。相反,在 GPU 方面,原子操作仅适用于本地设备内存位置,因为它们是使用 GPU 的本地内存控制器实现的。
在映射的固定主机内存上从 CUDA 内核内部执行原子操作是否安全?我们能否依靠 PCI-e 总线来保持 atomics 的 read-modify-write 的原子性?
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_list
PAT 条目看起来正确并且没有重叠区域:
我还检查了没有与 PAT 配置冲突的 MTRR 条目。据我所见,一切都已正确设置为在用户空间中发生写入组合,但是使用 PCIe 分析器观察 PCIe 总线上的事务,用户空间访问模式与从内核执行的相同写入完全不同通话后ioremap_wc
。
为什么写入组合在用户空间中不能按预期工作?
我该怎么做才能进一步调试?
我目前在单插槽 6 核 i7-3930K 上运行。
linux - 我是否需要在 Linux 3.12 驱动程序中“启用”一个 PCIe 内存区域?
我有代码,从我的 PCIe 驱动程序的 probe() 函数调用(大致基于这篇文章):
编辑: 根据Andreas Bombe 的回复,我将代码更改为使用pci_iomap()
,但我仍然遇到系统挂起的情况
但是内核只是挂在对ioread8()
.
难道我做错了什么?还是我需要看硬件?
这是系统干净启动时的输出lspci -v
和cat /proc/iomem
:
内存出现[disabled]
:我必须启用它吗?
linux-kernel - 为什么 setpci 和 lspci -xxxx 显示相同地址的不同数据?
在我的 x86 Linux 系统上,从 PCI 配置空间中的不同位置读取,setpci
与从lspci -xxxx
.
例如,我在我的公共汽车上选择一个任意设备并执行lspci -s 00:1f.3 -xxxx
并获得:
...
现在,来自setpci -s 00:1f.3 0x40+0.l
is02800003
的输出与上面的输出一致。但是,输出来自上面setpci -s 00:1f.3 0xf8+0.l
的ffffffff
转储,我预计会是08040f87
.
有人可以帮忙解释一下这里发生了什么。我是 PCI 调试领域的新手,所以我可能在这里遗漏了一些明显的东西。
提前致谢。
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 板,所以设备本身可能有问题,但我仍然希望探针运行,然后稍后会出现奇怪的错误而失败。
pci - 寻找检查 PCIe 设备树的工具
我正在寻找一种可以显示 pci express 设备(包括交换机)的设备树的工具。我正在尝试从根端口检查 pcie 的拓扑结构,以调试我们在设备带宽方面遇到的一些问题。有没有类似的东西?
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 上测试了我的设备,它被检测到了。
有没有办法检测到我的设备?
提前致谢!
问候,美联储
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 提供缓存侦听这一事实之外,两者之间是否存在显着的架构差异?据我所知,两者都使用分层协议:传输层到物理层。