如果使用 Linux 作为裸机代码的引导加载程序,PCIe 设备驱动程序是否有益?

Are PCIe device drivers beneficial if using Linux as a bootloader for bare-metal code?

我正在 PowerPC 处理器上开发嵌入式系统,需要通过 PCIe 与 FPGA 进行通信。我希望使用 Linux/embedded-Linux 作为引导加载程序来利用其 PCIe 初始化代码和驱动程序 API 来简化 PCIe 驱动程序开发。然而最后我想成为运行裸机代码(没有OS运行)。所以我正在考虑使用 PetitBoot/kexec 从 Linux 跳转到我自己的代码。

这可能吗?

我目前对 PCIe 驱动程序的理解使我相信一旦设备被初始化,只要我有一个指向地址 space 的指针,我应该能够简单地执行 MMIO R/W直接对内存进行操作space。因此,即使 kexec 覆盖了驱动程序代码,我也应该能够使用该设备,因为驱动程序已经完成了它的工作。

这是正确的吗?

如果不行,我有什么选择?

我不认为这种方法是个好主意。考虑到 Linux OS 编写的驱动程序将假设 OS 的所有资源都可用,而不仅仅是内存分配。例如,它可能会配置中断处理程序,但是当 OS 不再可用时,您的硬件可能会挂起,因为没有任何东西在确认和服务其中断请求。

我也对内存初始化持怀疑态度。我想您理论上可以分配一些 DMA 内存,并在它接管时将生成的物理地址传递给您的裸机应用程序,但整个过程似乎很粗略。在离开 PCIe 子系统 运行 时,很难确保 Linux 中的所有内容都干净地关闭。您必须查看驱动程序的关闭例程,看看它对卡做了什么,以确保它不会关闭设备并使其对您的裸机代码无响应。

我建议您改为通读基于 Linux 的驱动程序,并将其用作构建新裸机驱动程序的指南。复制您需要的初始化代码,并省略 Linux 特定的配置细节。