【问题标题】:Is there a way to ask the Linux Kernel to re-run its PCI initialization code?有没有办法让 Linux 内核重新运行它的 PCI 初始化代码?
【发布时间】:2010-12-22 02:28:28
【问题描述】:

我正在寻找可以从驱动程序、用户空间实用程序进行的内核模式调用,或者要求内核查看 PCI 总线并完全重新运行其初始化的系统调用,或者初始化特定设备。具体来说,我需要 Kernel 识别一个在启动后添加到总线上的设备,然后配置它的地址空间、中断和其他配置参数,最后启用该设备以便我可以为它加载驱动程序(除非这一切作为驱动程序负载的一部分发生)。

为此,我坚持使用 2.4.x 系列内核,目前正在使用 2.4.20,但如果重要的话,将移至 2.4.37。该发行版是在 ram 磁盘中运行的精简版 Red Hat 7.3,但我可以添加任何需要的工具来使其正常工作(只要它们与 2.4 系列配合得很好)。

如果一些背景知识有助于澄清我正在尝试做的事情:从冷启动,一旦在 Linux 中,我使用 GPIO 对 FPGA 进行编程。 FPGA 的一部分一旦被编程,就实现了一个简单的 PCI 设备。目前,在对 FPGA 进行编程后,我重新启动系统,Linux 会在启动后识别设备并为其加载驱动程序。

不需要重新启动,我只想让内核在启动期间执行任何操作以查找 PCI 设备(我已将内核配置为自行查找 PCI 设备,而不是向 BIOS 询问该信息,因此 BIOS 不需要知道此设备(我希望)。

我相信 Linux 能够在设备编程之后但在重新启动之前看到它,因为scanpci 会在我编程之后显示设备,lspci -H 1 也会显示。我只需要一种方法将其放入/proc/pci,配置并启用。

【问题讨论】:

  • 您应该前往“姐妹”网站:serverfault.com 并在那里询问。这是针对与编码相关的问题,您的确切问题似乎更多地与系统管理员相关,因此他们可能能够更快/更好地帮助您。

标签: linux linux-kernel linux-device-driver pci


【解决方案1】:

http://www.linuxjournal.com/article/5633 建议您应该能够使用 pcihpfs 对 2.4 内核执行此操作。

如果这不起作用,可能驱动程序不支持热插拔?

【讨论】:

    【解决方案2】:

    如果您不知道如何重做 PCI 扫描,您可以使用 kexec 加快重启速度。你可以在 LKML 上问这个,如果你还没有的话。

    卸载/重新加载模块没有帮助,是吗?

    【讨论】:

      【解决方案3】:

      如果您在使用其他 PCI 设备时重新配置它们的地址,可能会导致系统崩溃。

      更好的方法是只配置新卡。如果你的内核支持 Cardus 设备,它就已经知道如何配置一个新插入的 PCI 设备(这就是 Cardbus)。你只需要弄清楚如何让内核去做......

      内核模块应该可以做到这一点。即使您无法获得内置的热插拔代码,您也应该能够通过调用pci_bus_write_config_dword() 和朋友来设置 pci 资源。可能还需要进行一些 IRQ 路由设置。

      【讨论】:

        【解决方案4】:

        以下命令将帮助用户重新扫描它完整的根集线器。

        echo "1" > /sys/class/pci_bus/0000\:00/rescan
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          相关资源
          最近更新 更多