PCIe 中断机制可以分为两类,INTx 和 MSI/MSI-X,INTx 是基于中断引脚的, MSI/MSI-X 是基于带内消息传输的,PCIe 的中断兼容 PCI 设备的中断机制,INTx 是比较传统的中断方式,不支持多核的处理器,spec 上建议去实现 MSI/MSI-X 机制。
INTx
PCI 中关于 INTx 的一些要点:
中断方式为 INTx 的设备功能要实现的寄存器叫 Interrupt line register ,中断线寄存器是一个8位的寄存器,用于通信中断线路由信息。寄存器是读/写的,必须由任何使用中断引脚的设备(或设备功能)来实现。软件在初始化和配置系统时将路由信息写入该寄存器。这个寄存器内容为中断引脚连接到中断控制器上的哪个输入,设备的驱动或者操作系统根据这个信息知道中断优先级中断、中断向量。中断引脚寄存器告诉设备(或设备功能)使用哪个中断引脚。值1对应INTA#。值2对应于INTB#。值3对应于INTC#。值4对应于INTD#。不使用中断引脚的设备(或设备功能)必须在这个寄存器中放一个0。
一旦INTx# 信号被断言,它将保持断言状态,直到设备驱动程序清除挂起的请求。当请求被清除时,设备解除其 INTx# 信号。PCI为单一功能设备定义了一条中断线,为多功能设备或连接器定义了四条中断线 INTA# - INTD#。对于单一功能的设备,只有 INTA #可以使用其他三条中断线没有意义。
中断线到系统中断信号的一个映射:
到了 PCIe 时代,INTx 也是用 message 实现的,叫虚拟中断线,有些 PCI 设备不支持 MSI 中断机制的,只能用中断线,搞一个虚拟中断线。在 PCI 设备发出INTx中断请求时,PCIe 桥将该INTx中断信号转换为INTx中断消息报文,并向Root Complex提交中断请求。这个中断消息包含两类,Assert_INTx 和 Deassert_INTx,x还是有 ABCD 四个,那这样中断消息报文就有8种。虚拟中断线的方式 PCIe 设备也可以用,这是可以去选择的。
可以通过配置空间中的配置命令寄存器(Configuration Command Register)来禁止INTx中断机制
INTx中断线在未来是可能被弃用的,所以尽量选择MSI/MSI_X中断机制。
配置空间结构样例
字节地址 |
配置空间寄存器 |
PCIe规范中的对应部分 |
---|---|---|
0x000-0x03C |
PCI Header Type 0配置寄存器 |
Type 0 Configuration Space Header |
0x040-0x04C |
电源管理 |
PCI Power Management Capability Structure |
0x050-0x05C |
MSI Capability结构 |
MSI Capability Structure,也可参考PCI Local Bus Specification |
0x060-0x06C | 保留 | N/A |
0x070-0x0A8 |
PCI Express Capability结构 | PCI Express Capability Structure |
0x0B0-0x0B8 |
MSI-X Capability结构 |
MSI-X Capability Structure,也可参考PCI Local Bus Specification |
0x0BC-0x0FC | 保留 | N/A |
0x100-0x134 | 高级错误报告(AER)(仅PF) | Advanced Error Reporting Capability |
0x138-0x184 | 保留 | N/A |
0x188-0x1B0 |
下游PCI Express扩展Capability头 |
PCI Express Extended Capability |
0x1B4-0xB7C |
保留 | N/A |
0x1B8-0x1F4 | SR-IOV Capability结构 | Single Root I/O Virtualization and Sharing Specification, Rev, |