启用/禁用PCI中断


8

我正在实现PCIe驱动程序,我想了解可以在或应该启用/禁用中断的级别。我故意不指定操作系统,因为我认为它应该与任何平台相关。按级别,我的意思是:

  • 操作系统特定的中断处理框架
  • 可以在PCI / PCIe配置空间寄存器(例如COMMAND寄存器)中禁用或启用中断
  • 中断也可以在设备级别屏蔽,例如,我们可以配置设备不触发对主机的某些中断

我知道,无论PCIe使用哪种中断类型(INTx仿真,MSI或MSI-X),都必须将其传递给主机OS。

所以我的问题是-我们实际上是否必须在每个层上启用或禁用中断,还是仅在最接近硬件的位置(例如在相关的PCI寄存器中)才足够?


1
在Windows KMDF驱动程序中,您可以在驱动程序.inf文件中指定要使用的中断类型(MSI,INTx和MSI-x),并且驱动程序框架将在加载时自行正确配置PCIe配置空间。我不了解其他操作系统,但是由于.inf特定于Windows,因此我认为它可能取决于操作系统。
汤姆·卡彭特

2
通常,您必须通过提供有关中断应执行的配置来完全启用它们。完成此操作后,仅在短暂的不间断计算期间在CPU上禁用,直到取消配置设备为止(例如,用于省电)
pjc50

1
如果您使用的是Linux,则可以为您的应用程序使用DMA框架吗?很好,您创建了事务,事务完成后它会返回一个可选的超时-您不必傻于实际的中断
johnnymopo 2015年

@ pjc50,如果驱动程序选择使用某种类型的中断(例如INTx),是否必须禁用通过MSI_CAP pci寄存器传递的MSI / MSI-X中断?(反之亦然-使用MSI时禁用INTx)
2015年

Answers:


1

操作系统通常会大声抱怨意外中断,因为这些中断在驱动程序中很容易检测到。

通常,您的硬件在重置后将以某种相当惰性的状态启动,等待配置。在这种状态下,没有有意义的方式来生成中断,因为尚未建立映射,并且您不知道哪个中断。

在配置过程中,存在中断映射,并告知卡使用哪条中断线(INTA..INTD作为旧式PCI或MSI / MSI-X),但仍然没有驱动程序可以处理中断。Linux此处有一个默认处理程序,它会向系统日志发出投诉,然后禁用中断源,因为硬件似乎有故障(即,默认情况下,所有中断均已启用,但只有实际注册了处理程序的中断才会发生) 。

驱动程序最终注册中断处理程序并启用它感兴趣的中断。如果驱动程序不再对特定条件感兴趣,则需要禁用设备中的中断,因为这是设备特定中断原因被掩盖的地方-下层只知道“发生了什么事”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.