问题标签 [pci-bus]

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 回答
448 浏览

linux - 关于如何在 Linux 上启动早期运行脚本的任何提示?

问题是我需要在加载驱动程序之前将文本字符串推送到 pci 总线上的 driver_override 中。

我之前确实使用 systemd 解决了这个问题,但是在 systemd 甚至启动之前加载更新驱动程序之后,所以没有运气。

驱动程序也不支持解除绑定。

有任何想法吗 ?

0 投票
1 回答
467 浏览

linux - 子进程不会仅为 SIGBUS 错误生成核心并成为僵尸进程

我的子进程正在尝试访问 PCI 地址空间。它在大多数情况下都能正常工作。

但是,有时子进程会进入僵尸状态。dmesg 日志显示以下总线错误。

在这种情况下没有生成核心文件。

子进程为 SIGSEGV 错误生成核心。所以我认为它与权限/限制设置无关。

有人可以帮我理解为什么在这种情况下没有生成核心吗?

0 投票
1 回答
73 浏览

c - uboot函数pci_hose_read_config_word()定义?

目前我正在研究 uboot pci init 进程

pci总线扫描中有一个函数调用pci_hose_read_config_word()

这是源代码

但是我在uboot中搜索了所有源代码,为什么我找不到功能实现?

谢谢

0 投票
0 回答
3245 浏览

linux - “echo 1 > /sys/bus/pci/rescan”会影响网络流量吗?

我正在尝试使用以下方法删除并重新扫描一组 pci 网卡:

正如我看到echo 1 > /sys/bus/pci/rescan的所有 pci 设备都会触发它会影响我没有删除的网卡上的网络流量吗?

谢谢,

0 投票
2 回答
1399 浏览

caching - PCIE 中的“缓存行大小”相当于什么?

在 PCI 配置空间中,Cache line size 表示系统 cacheline 的大小,以 DWORD 为单位。该寄存器必须由可以生成存储器写入和无效命令的主设备实现。

该寄存器中的值也被主设备用来确定是使用 Read、Read Line 还是 Read Multiple 命令来访问内存。

想要允许使用高速缓存线环绕寻址模式进行内存突发的从设备必须实现此寄存器以了解突发序列何时环绕到高速缓存线的开头。

但该字段由 PCI Express 设备实现为用于传统兼容性目的的读写字段,但对任何 PCI Express 设备行为没有影响。

那么PCIe系统是如何实现memory-write-invalidate特性的呢?

0 投票
1 回答
97 浏览

pci - PCI 3.0 是否与 PCI 2.1 兼容?

我将我的 cPCI 板升级到 adlink-3970 (PCI 3.0)。机器启动到 Windows,所有驱动程序都正确安装,包括我的 PCI 2.1 设备的驱动程序(意味着 CPU 能够通过 PCI 总线读取 ROM)。但是,当我尝试从我的 PCI 2.1 设备读取数据时,所有寄存器都读为 0。这两个板不兼容吗?

更多信息:我读过它们应该兼容,并且电气/机械规格表明它们是兼容的。我也试过换另一块CPU板,但结果相同。升级后的板卡唯一不同的是CPU使用PCIe-PCI桥在PCI总线上进行通信。我想知道这是否是问题所在。

0 投票
1 回答
227 浏览

linux - 谁填充了pci的设备配置空间?

我想知道当新设备连接到 PCI 总线时,谁首先填充了 PCI 的特定设备的配置空间。我知道 bios 和操作系统都可以配置 PCI 空间,但是谁将设备的信息提供给它们两者。

0 投票
1 回答
1175 浏览

operating-system - PCI 配置空间寄存器 - 写入值

我正在为自制操作系统开发网络驱动程序 (RTL8139),但在将值写入 PCI 配置空间寄存器时遇到问题。

我想更改中断线的值(偏移量 0x3c)以获取另一个 IRQ 编号并启用命令寄存器(偏移量 0x04)的总线主机(设置位 2)。
当我读回这些值时,我看到我的值被正确写入。但不是使用新的 IRQ 编号(在我的情况下为 6),而是使用旧值(11)。
DMA 的总线主控器也无法正常工作(我想发送的数据包大小正确(由 IO-Port 设置)但它们没有内容(所有值都只有 0,收发缓冲区在物理内存上并且具有非零值) .在我仔细检查物理地址后,这总是与我的代码一样工作。我需要这个让网络控制器访问我的物理内存,我的接收/收发缓冲区所在的位置。(RTL8139需要总线主控

我是否必须做其他事情来确认我对 PCI 设备的更改?

作为模拟器,我使用 qemu。

对于读/写,我编写了以下函数:

我希望有人能帮助我。

0 投票
2 回答
5801 浏览

cpu - PCI 段(域)如何与多个主机桥(或根桥)相关?

我试图了解 PCI 段(域)如何与多个主机桥相关?

有人说多个PCI域对应多个Host Bridge,但也有人说是指一个Host Bridge下的多个Root Bridge。我很困惑,在 PCI SIG 基本规范中找不到太多有用的信息。

我想知道

(1) 假设我在 MCFG 中设置了 3 个 PCI 域,我有 3 个连接 3 个 CPU 和总线的主机桥,还是有 3 个支持 3 倍总线但在一个 CPU 中共享一个公共主机桥的根桥?

(2) 如果我有多个主机桥(或根桥),这些桥是共享一个共同的南桥(例如,ICH9),还是有单独的?

我是初学者,谷歌并没有解决我的问题。如果有人能给我一些线索,我将不胜感激。

0 投票
0 回答
171 浏览

linux-kernel - RHEL7.4 on x86 with Intel 82X38/X48 Express 芯片组——完全无法将中断传递给我的驱动程序

我和我的同事正在使用我们的一种基于 PCIe 的产品,我们发现某种平台/芯片组依赖性正在阻止将中断传递到我们的 linux 内核驱动程序 (rapafp)。我们必须在现场继续支持的一个旧版本的产品是对旧 PCI 设计的改造。所以我们有一些 FPGA,其中一个有一个 66MHz PCI-32 接口,并连接到德州仪器 XIO PCI-to-PCIe 桥接器。我应该注意,我已经不知疲倦地研究了好几天,但我没有得到任何结果。我们确实考虑过我们自己设备的硬件问题,但是我们换了多张卡,这并没有什么区别。

有效的参考系统

我们有一个运行 RHEL6.5 的系统运行良好,因此我们将其用作参考。以下是有关该平台的一些信息。我不知道您需要什么级别的详细信息,而且我不想写垃圾邮件问题。请让我知道还有什么有用的以及如何提供(问题中的内联、pastebin 等)。

来自uname -a

从 /proc/interrupts:

来自 dmesg 的信息:

来自 lspci:

安装的 CPU 是:型号名称:Intel(R) Core(TM)2 CPU E8400 @ 3.00GHz

来自 dmidecode 的一些 BIOS 信息:

请注意,驱动程序在编写时从未考虑过 fasteoi,因此它永远不会进行任何结束中断调用。然而,它在该机器上完美运行。

无法对我们的驱动程序产生任何中断的系统

我们有两个系统在接收中断时出现问题。一个是运行RHEL6.5(2.6.32-431.el6.i686),另一个是RHEL7.4(3.10.0-693.17.1.el7.x86_64)。

RHEL6 系统能够中断我们的驱动程序,但只是间歇性的。这可能是由于内核将设备连接到边缘触发的中断线(尽管驱动程序另有请求!)并且驱动程序没有被写入与边缘触发兼容。

RHEL7 系统根本无法中断我们的驱动程序 我们当前的目标是将驱动程序移植到 RHEL7,所以我将专注于那台机器。主机与参考系统有很多相似之处和不同之处。重要的主要区别是内核版本、32 位与 64 位,可能还有 BIOS。首先,以下是一些系统信息。

来自uname -a

/proc/中断:

来自 dmesg:

来自 lspci 的信息:

尝试的解决方案

我尝试了一系列修复。我做的第一件事是检查中断处理代码并重写它,以便它对边缘触发的中断线更友好,但这没有效果。我做的其他事情包括:

  • 没有调用 pci_enable_device,所以我添加了它。没有效果。
  • 我注意到我们对 request_irq 的调用使用以 开头的旧标志SA_,因此我将它们替换为以 开头的较新标志IRQF_。我尝试了各种标志组合。IRQF_TRIGGER_RISING, IRQF_TRIGGER_FALLING, IRQF_TRIGGER_HIGH, IRQF_TRIGGER_LOW, 这些的组合,有和没有 IRQF_SHARED 等等。这些都对 IRQ 传递、/proc/interrupts 报告的内容或 lspci 报告的桥配置没有任何影响。然而,request_irq 从未返回任何错误代码。
  • 我尝试调用 enable_irq 和 set_irq_type。无论我传递给他们什么,都没有效果。没有返回错误代码。

最后我注意到 PCI 桥 00:01.0 有遗留中断 (DisINTx+)。我四处寻找某种预先存在的功能,它可以遍历网桥层次结构并修复所有它们的中断,但我找不到任何东西。所以我决定尝试一下。

首先,我编写了自己的函数来提升桥接层次结构:

这样做的主要影响是导致机器挂起,尽管不是马上。我尝试在 raptor_enable_intx 之前或之后调用 request_irq。IIRC,一个没有效果,而另一个导致系统挂起,尽管不是立即。

我还发现 pci_common_swizzle 有一些关于 PCI 标准要求它的评论,所以我在上述函数之后调用它。在我做完这些事情之后,我会调用 request_irq。通过这些更改,系统会立即在 insmod 上挂起。

当然,我意识到遍历网桥并强制关闭 PCI_COMMAND_INTX_DISABLE 是一种令人作呕的黑客行为,如果是这种情况或导致系统挂起的混乱,我不会感到惊讶。

无论如何,所以我在这里迷路和困惑。有谁知道我做错了什么?我应该如何获得该系统桥以允许遗留中断通过?

在此先感谢您的帮助!