PCIESS提供了14种中断,能处理MSI和legacy中断。当作为EP端时,PCIESS能够产生MSI或者legacy中断,但是一个PCIe设备不能同时产生这两种中断。EP端能产生的中断类型在配置的时候配置好的。RC端能处理MSI和legacy中断。
2.14.1 中断分配
2.14.2 EP模式产生的中断
当PCIESS作为EP端的时候,会产生legacy中断或者MSI中断,最终在RC设备端产生一个中断。每个PCIe功能只能产生一种类型的中断,这种类型由配置的时候决定的。
2.14.2.1 EP模式产生的legacy中断
EP设备能够通过in-band Assert_INTx / Deassert_INTx消息在RC端产生一个PCI legacy中断。在RC端口产生的中断类型实际是根据EP产生中断的配置信息决定的,可能是INTA,INTB,INTC,或者INTD。在配置空间寄存器中可以查看相关中断寄存器。
为了产生一个中断,需要以下几步:
1. 设置LEGACY_X_IRQ_ENABLE_SET是能够产生legacy中断。
2. 向EP_IRQ_SET寄存器写1来使能legacy中断。
3. An assert INTA/B/C/D message is automatically sent
4. 向EP_IRQ_CLR寄存器写1来disable the legacy interrupt by sending a
deassert INT A/B/C/D message
一旦产生一个assert message,知道产生一个deassert message才会产生下一个assert message。因此,每次只会有一个中断被挂起。这个挂起状态可以通过EP_IRQ_STATUS寄存器来查看。
2.14.2.2 EP模式产生的MSI中断
一个PCIE 32位内存的写事务会产生MSI中断。PCIE系统软件在初始化EP设备的时候会配置在写事务中用到的地址和数据。MSI机制支持多个中断,每个设备能够请求最多32个中断向量,尽管分配的中断可能没有请求的数目多。
产生一个MSI中断,需要下面几步:
1. 在设备中确保支持MSI(设置MSI_CAP的MSI_EN位,关闭legacy中断)。
2. 在本地PCIe配置空间中读取MSI地址寄存器的值(32位地址读取
MSI_LOW32寄存器的值,64位地址读取MSI_UP32和MSI_LOW32(在MSI_CAP寄存器中使能64BIT_EN位))
3. 值)
在本地PCIe配置空间中读取MSI数据寄存器的值(读取MSI_DATA寄存器的
4. 确定分配给设备的MSI向量数目(和请求数目)。
5. 根据分配的MSI中断数目,发送一个内存写请求,地址和MSI地址寄存器一样,
数据和MSI数据寄存器一样。In the data, the LSBs can be modified to reflect the appropriate MSI event that needs to be notified to root complex。
6. 如果目的PCIE地址不可以直接到达的时候,内存写请求也可以通过
outbound地址转换接口进行路由。
在RC端产生MSI终端实际上有MSI_IRQ寄存器决定。MSI中断由RC端向MSI_IRQ寄存器写入MSI向量值而激发的32个事件中的一种产生的。在EP端能够发送MSI中断之前,系统软件必须配置好MSI数据寄存器和地址寄存器,这样确保用合适的MSI向量值来使用MSI_IRQ寄存器。
如果没有软件支持,用户程序需要确保EP端能够用合适的MSI向量值发送内存写事务到RC端的MSI_IRQ寄存器中。
对每个PCIE设备来说,一个EP端设备只能向RC产生MSI中断。但是PCIESS规定允许从EP端向另一个EP端产生MSI中断。为了能够向另一个EP端产生中断,一个EP端能够将内存的写映射到另一个EP设备的类似寄存器。这个内存写应该在BAR0内存空间。
2.14.3 RC端产生的中断
按照PCIE基本标准,RC端口只能够接收中断。没有机制能够产生从RC到EP的中断。但是,PCIESS的确支持从RC向EP产生中断。这个过程和RC端产生和接受MSI中断类似,除了这个功能在EP端同样可以使用。
RC端可以通过PCIE链路写MSI_IRQ寄存器来产生一个32位的EP中断。PCIESS遵循
PCIE MSI规定,不需要对同一个MSI向量计算多次写。只有一个写才会被处理,在清中断之前其余的写可能会丢失。
2.14.4 EP端接受中断
PCIE规定并没有说EP可以接受legacy中断。因此,只会用事件来映射中断。在EP设备上不支持MSI中断,但是PCIESS确实支持这些中断。在EP端向MSI_IRQ寄存器写入MSI向量值的时候会产生32种事件中的一种。
通过写寄存器由链路传送的这些中断也可能来自另一个EP设备,该设备在EP BAR0空间的合适中断寄存器操作。这由软件设计者来决定中断来源的一种方式。
在32个MSI中断事件中,每4个MSI中断共享一个中断事件号,能够向CPU产生中断。通过设置MSIn_IRQ_EN_SET寄存器来使能MSI中断。设置MSIn_IRQ_EN_CLR寄存器来清楚使能。
因篇幅问题不能全部显示,请点此查看更多更全内容