资源描述
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寄存器来清楚使能。
展开阅读全文