PCI总线的中断机制

本文详细阐述了PCI总线中断信号的连接、PCIe MSI/MSI-X中断机制的工作原理、MSI Capability结构,以及PowerPC处理器如何处理MSI中断。重点讲解了PCIe中断的同步问题、MSI和MSI-X的对比以及系统软件的初始化步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

中断信号与中断控制器的连接关系

中断信号与PCI总线的连接关系

INTx中断请求的同步问题

MSI

PCIe的MSI/MSI-X中断机制

Capability 简介

MSI/MSI-X Capability 结构

MSI Capability 结构

MSI-X Capability 结构

MSI-X Table

PowerPC处理器如何处理MSI 中断请求

MSI中断机制使用的寄存器

系统软件如何初始化PCIe 设备的 MSI Capability 结构


PCI总线使用INTA#、INTB#、INTC#和INTD#信号向处理器发出中断请求。这些中断请求信号为低电平有效,并与处理器的中断控制器连接。PCI设备可以使用MSI机制向处理器提交中断请求,而不使用这组中断信号。


中断信号与中断控制器的连接关系

不同的处理器使用的中断控制器不同,如x86处理器使用APIC(Advanced Programma—ble Interrupt Controller)中断控制器,而PowerPC处理器使用MPIC(Multiprocessor Interrupt Controller)中断控制器。这些中断控制器都提供了一些外部中断请求引脚IRQ_PINx#。外部设备,包括PCI设备可以使用这些引脚向处理器提交中断请求。

PCI总线规范没有规定PCI设备的INTx信号如何与中断控制器的IRQ_PINx#信号相连,为此系统软件使用中断路由表存放PCI设备的INTx信号与中断控制器的连接关系。(在x86处理器系统中,BIOS可以提供这个中断路由表,而在PowerPC处理器中 Firmware也可以提供这个中断路由表。)

在一些简单的嵌入式处理器系统中,需软系统件开发人员需根据硬件连接关系自己配置中断引脚。

假设在一个处理器系统中,共有3个PCI插槽(分别为PCI插槽A、B和C),这些PCI插槽与中断控制器的IRQ_PINx引脚(分别为IRQW#、IRQX#、IRQY#和IRQZ#)可以按照 下图所示的拓扑结构进行连接。

 由于多数PCI设备仅用INTA#信号,就是的这种连接最大限度提高PCI插槽中断请求效率。PCI设备的配置空间中Interrupt Pin寄存器记录该设备使用的哪个INTx#信号。


中断信号与PCI总线的连接关系

在多数情况下,嵌入式处理器系统使用的PCI设备仅使用INTA#信号进行中断请求,所以只要将这些INTA#信号挂接到中断控制器的独立 IRQ_PIN#引脚上即可。这样每一个PCI设备都可以独占一个单独的中断引脚。

在x86处理器系统中,有许多PCI插槽,处理器系统并不知道在这些插槽上将要挂接哪些PCI设备,也并不知道这些PCI设备是否需要使用所有的INTx#信号线。因此x86处理器系统必须对各种情况进行处理。

x86处理器系统还经常使用PCI桥进行PCI总线扩展,扩展出来的PCI总线还可能挂接一些PCI插槽,这些插槽上的INTx#信号仍然需要处理。PCI桥规范并没有要求桥片传递其下PCI设备的中断请求。事实上多数PCI桥也没有为下游PCI总线提供中断引脚INTx#,管理其下游总线的PCI设备。但是PCI桥规范推荐使用下表建立下游PCI设备的INTx信号与上游PCI总线INTx信号之间的映射关系。

该表含义如下,在PCI桥下游总线上的PCI设备,如果其设备号为0,那么这个设备的INTA#引脚将和PCI总线的INTA#引脚相连;如果其设备号为1,其INTA#引脚将和PCI总线的INTB#引脚相连;如果其设备号为2,其INTA#引脚将和PCI总线的INTC#引脚相连;如果其设备号为3,其INTA#引脚将和PCI总线的INTD#引脚相连。

在x86处理器系统中,由BIOS或者APCI表记录PCI总线的INTA~D#信号与中断控制器之间的映射关系,保存这个映射关系的数据结构也被称为中断路由表。大多数BIOS默认使用上表中的映射关系,否则系统软件程序员需要改动BIOS中的中断路由表。

BIOS初始化代码根据中断路由表中的信息,可以将PCI设备使用的中断向量号写入到该PCI设备配置空间的 Interrupt Line register 寄存器中。


INTx中断请求的同步问题


在PCI总线中,INTx信号是一个异步信号。所谓异步是指INTx信号的传递并不与PCI总线的数据传送同步,即INTx信号的传递与PCI设备使用的CLK#信号无关。这个“异步”信号给系统软件的设计带来了一定的麻烦。

系统软件程序员需要注意“异步”这种事件,因为几乎所有“异步”事件都会带来系统的“同步”问题。如下图为例,当PCI设备11使用DMA写方式,将一组数据写入存储器,该设备在最后一个数据离开PCI设备11的发送FIFO时,会认为DMA写操作已经完成。此时这个设备将通过INTx信号,通知处理器DMA写操作完成。

此时处理器(驱动程序的中断服务例程)需要注意,因为INTx信号与数据分别使用了两个不同的路径,是一个异步信号,当处理器收到INTx信号时,并不意味着PCI设备11已经将数据写入存储器中。从而在处理器系统中存在“中断同步”的问题,PCI总线提供了以下两种方法解决这个同步问题。

(1)PCI设备保证在数据到达目的地之后,再提交中断请求。

显然这种方法不仅加大了硬件的开销,而且也不容易实现。PCI设备在提交中断请求之前,向DMA写的数据区域发出一个读请求,再向处理器提交中断请求。

(2)中断服务例程使用“读刷新”方法。

中断服务例程在使用“PCI设备写入存储器”的这些数据之前,需要对这个PCI设备进行读操作。这个读操作也可以强制将数据最终写入存储器,这种方法利用了PCI总线的传送序规则,与第1种方法基本相同,只是这种方法使用软件方式,而第1种方式使用硬件方式。

第2种方法也是绝大多数处理器系统采用的方法。程序员在编写中断服务例程时,往往都是先读取PCI设备的中断状态寄存器,判断中断产生原因之后,才对PCI设备写入的数据进行操作。这个读取中断状态寄存器的过程,一方面可以获得设备的中断状态,另一方面可以保证DMA写的数据最终到达存储器。如果驱动程序不这样做,就可能产生数据完整性问题。产生这种数据完整性问题的原因是INTx这个异步信号。

在PCIe规范中,虽然已经没有了INTA~D#信号线,但仍然实现了INTx中断且使用配置空间的Interrupt Pin寄存器,以保证对PCI设备的兼容性。实现方式为:INTx中断消息报文 <-> PCIe桥 <-> INTA~D#中断信号。


MSI

PCI总线V2.2规范还定义了一种新的中断机制,即MSI中断机制。MSI中断机制采用存储器写总线事务(可称之为MSI报文)向处理器系统提交中断请求,其实现机制是向HOST处理器指定的一个存储器地址写指定的数据,类似RapidIO的doorbell。这个存储器地址一般是中断控制器规定的某段存储器地址范围,而且数据也是事先安排好的数据,通常含有中断向量号。

HOST 主桥会将MSI这个特殊的存储器写总线事务进一步翻译为中断请求,提交给处理器。目前PCI设备大部分都不支持MSI中断机制。

目前MSI中断机制虽然在PCIe总线上已经成为主流,但是在PCI设备中并不常用。首先PCI设备具有INTx#信号可以传递中断,且PCI总线是一个共享总线,传递MSI中断需要占用PCI总线的带宽,需要进行总线仲裁等一系列过程,远没有使用INTx#信号线直接。

使用MSI中断机制可以解决使用INTx中断机制所带来的数据完整性问题。而更为重要的是,PCI设备使用MSI中断机制,向处理器系统提交中断请求时,还可以通知处理器系统产生该中断的原因,最多支持32个中断,要求中断向量连续。


PCIe的MSI/MSI-X中断机制

不同处理器系统使用了不同的机制处理MSI/MSI-X中断请求,PowerPC处理器使用MPIC,X86处理器使用FSB Interrupt Message。

PCIe设备在提交MSI/MSI-X中断请求时,都是向MSI/MSI-X Capability结构中的Message Address的地址写Message Data数据,从而组成一个存储器写TLP,向处理器提交中断请求。

有些PCIe 设备还可以支持Legacy中断方式(通过发送Assert_INTx和Deassert_INTx消息报文进行中断请求,即虚拟中断线方式)。但是PCIe总线并不鼓励其设备使用Legacy 中断方式,在绝大多数情况下,PCle设备使用MSI或者MSI/X方式进行中断请求。

PCle总线提供 Legacy中断方式的主要原因是,在PCle体系结构中,存在许多PCI设备,而这些设备通过PCIe桥连接到PCle总线中。这些PCI设备可能并不支持MSI/MSI-X中断机制,因此必须使用INTx信号进行中断请求。

当PCIe桥收到PCI设备的INTx信号后,并不能将其直接转换为MSI/MSI-X中断报文,因为PCI设备使用INTx信号进行中断请求的机制与电平触发方式类似,而MSI/MSI-X中断机制与边沿触发方式类似。这两种中断触发方式不能直接进行转换。因此当PCI设备的IN-Tx信号有效时,PCle桥将该信号转换为Assert_INTx报文,当这些INTx信号无效时,PCIe 桥将该信号转换为 Deassert_INTx报文。

与Legacy中断方式相比,PCle 设备使用MSI或者MSI-X中断机制,可以消除INTx这个边带信号,而且可以更加合理地处理 PCIe总线的“序”。目前绝大多数PCle 设备使用MSI或者MSI-X中断机制提交中断请求。

MSI和MSI-X机制的基本原理相同,其中MSI中断机制最多只能支持32个中断请求而且要求中断向量连续,而MSI-X中断机制可以支持更多(2048个)的中断请求,而并不要求中断向量连续。与MSI中断机制相比,MSI-X中断机制更为合理。
 

Capability 简介

在介绍MSI/MSI-X Capability 结构之前先简单介绍一下PCIe的Capability。

在配置空间0x34处一个字节的字段称为Capability Pointer,用于存放Capabilities 结构链表的头指针offset,offset是相对于配置空间的偏移量。在PCI中offset范围为[0x40, 0xff],在PCIe中范围为[0x40, 0xfff]。

在一个PCIe 设备中,可能含有多个Capability 结构,这些寄存器组成一个链表。其中每一个Capability 结构都有唯一的ID 号,每一个Capability 寄存器都有一个指针,这个指针指向下一个Capability 结构,从而组成一个单向链表结构,这个链表的最后一个Capability 结构的指针为0。

Capability组成:

bit[7-0]:Capability ID。

bit[15-8]:Next Pointer。

bit[xxx-16]:由具体ID来定义。

 如Redhat虚拟机上的SATA控制器配置空间中的Capability位置。

MSI/MSI-X Capability 结构

PCIEcapability的布局如下:落在offset0x00~0xff之间的属于PCIE capability structure对应于PCI配置空间;而落在offset0x100~0x1000之间的属于extendedPCIE capability, 对应于PCIEextended 配置空间。

PCIe设备可以使用MSI或者MSI-X报文向处理器提交中断请求,但是对于某个具体的PCle设备,可能仅支持一种报文。在PCle设备中含有两个Capability结构,一个是MSI Capability结构,另一个是MSI-X Capability结构。

MSI Capability 结构

MSI Capability 结构共有四种组成方式,分别是32和64位的Message结构,32位和64位带中断Masking的结构。MSI报文可以使用32位地址或者64位地址,而且可以使用Masking 机制使能或者禁止某个中断源。MSI Capability 寄存器的结构如图所示。

Capability ID:记载 MSI Capability 结构的ID号,其值为0x05。在PCle设备中,每 一个Capability 结构都有唯一的ID号。
Next Pointer:存放下一个Capability结构的地址。
Message Control:该字段存放当前PCle 设备使用MSI机制进行中断请求的状态与控制信息,如下所示。

Bits	定 义						描述
----    -----                       ----------------------------------
15:9	Reserved					保留位。系统软件读取该字段时将返回全零,对此字段写无意义
8		Per-vector Masking Capable	该位为1时,表示支持带中断Masking的结构;如果为0,表示不支持带中断Masking的结构。该位对系统软件只读,在PCIe设备初始化时设置7
7		64 bit Address Capable		该位为1时,表示支持64位地址结构;如果为0,表示只能支持带32位地址结构。该位对系统软件只读,在PCIe设备初始化时设置
6:4		Multiple Message Enable		该字段可读写,表示软件分配给当前PCIe设备的中断向量数目。系统软件根Multiple Message Capable 字段的大小确定该字段的值。在系统的中断向量资源并不紧张时,Multiple Message Capable字段和该字段的值相等;而资源紧张时,该字段的值可能小于Multiple Message Capable字段的值
3:1		Multiple Message Capable	该字段对系统软件只读,表示当前PCIe设备可以使用几个中断向量号,在不同的PCIe设备中该字段的值不同。当该字段为0b000时,表示PCIe设备可以使用1个中断向量;为0b001、0b010、0b011、0b100和0b101时,表示使用4、8、16和32个中断向量;而0b110和0b111为保留位。该字段与Multiple Message Enable字段的含义不同,该字段表示当前PCIe设备支持的中断向量个数,而 Multiple Message Enable 字段是系统软件分配给PCIe设备实际使用的中断向量个数
0		MSI Enable					该位可读写,是MSI中断机制的使能位。该位为1而且MSI—X Enable位为0时,当前PCIe设备可以使用MSI中断机制,此时Legacy中断机制被禁止。一个PCIe设备的MSI Enable和MSI-X Enable位都被禁止时,将使用INTx中断消息报文发出/结束中断请求

Message Address当MSI Enable位有效时,该字段存放MSI存储器写事务的目的地址的低32位。该字段的31:2字段有效,系统软件可以对该字段进行读写操作;该字段的第1~0位为0。

Message Upper Address:如果64 bit Address Capable位有效,该字段存放MSI存储器写事务的目的地址的高32位。

Message Data该字段可读写。当MSI Enable位有效时,该字段存放MSI报文使用的数据。该字段保存的数值与处理器系统相关,在PCle设备进行初始化时,处理器将初始化该字段,而且不同的处理器填写该字段的规则并不相同。如果 MultipleMessage Enable字段不为0b000时(即该设备支持多个中断请求时),PCle 设备可以通过改变 Message Data字段的低位数据发送不同的中断请求。

Mask Bits:PCIe总线规定当一个设备使用MSI中断机制时,最多可以使用32个中断向量,从而一个设备最多可以发送32种中断请求。Mask Bits 字段由32位组成,其中每一位对应一种中断请求。当相应位为1时表示对应的中断请求被屏蔽,为0时表示允许该中断请求。系统软件可读写该字段,系统初始化时该字段为全0,表示允许所有中断请求。该字段和Pending Bits字段对于MSI中断机制是可选字段,但是PCle 总线规范强烈建议所有PCIe设备支持这两个字段。

Pending Bits:该字段对于系统软件是只读位,PCle设备内部逻辑可以改变该字段的值。该字段由32位组成,并与PCle设备使用的MSI中断一一对应。该字段需要与Mask Bits字段联合使用。
当Mask Bits字段的相应位为1时,如果PCle设备需要发送对应的中断请求,PendingBits字段的对应位将被PCIe设备的内部逻辑置1,此时PCle 设备并不会使用MSI报文向中断控制器提交中断请求;当系统软件将Mask Bits字段的相应位从1改写为0时,PCIe设备将发送MSI报文向处理器提交中断请求,同时将 Pending Bit字段的对应位清零。在设备驱动程序的开发中,有时需要联合使用Mask Bits和Pending Bits字段防止处理器丢弃中断请求。

MSI-X Capability 结构

MSI-X Capability中断机制与MSI Capability的中断机制类似。PCle总线引出MSI-X机制的主要目的是为了扩展PCIe设备使用中断向量的个数,同时解决MSI中断机制要求使用中断向量号连续所带来的问题。

MSI中断机制最多只能使用32个中断向量,而MSI-X可以使用更多的中断向量。目前Intel的许多PCIe设备支持MSI-X中断机制。与MSI中断机制相比,MSI-X机制更为合理。首先MSI-X可以支持更多的中断请求,但这并不是引人MSI-X中断机制最重要的原因。因为对于多数PCle设备,32种中断请求已经足够了。而引人MSI-X中断机制的主要原因是,使用该机制不需要中断控制器分配给该设备的中断向量号连续

如果一个PCIe设备需要使用8个中断请求且使用MSI机制时, Message Data的[2:0]字段可以为0b000 ~0b111,因此可以发送8个中断请求,但是这8个中断请求的Message Data字段必须连续。在许多中断控制器中, Message Data字段连续也意味着中断控制器需要为这个PCIe设备分配8个连续的中断向量号。

有时在一个中断控制器中,虽然具有8个以上的中断向量号,但是很难保证这些中断向量号是连续的。因此中断控制器将无法为这些PCIe设备分配足够的中断请求,此时该设备的"Multiple Message Enable"字段小于"Multiple Message Capable'。

而使用MSI-X机制可以合理解决该问题。在MSI-X Capability结构中,每一个中断请求都使用独立的Message Address字段和Message Data字段,从而中断控制器可以更加合理地为该设备分配中断资源。

与MSI Capability寄存器相比, MSI-X Capability寄存器使用一个数组存放Message Address字段和Message Data字段,而不是将这两个字段放入Capability寄存器中,将这个数组称为MSI-X Table。从而当PCIe设备使用MSI-X机制时,每一个中断请求可以使用独立的Message Address 段和Message Data字段。

除此之外MSI-X中断机制还使用了独立的Pending Table表,该表用来存放与每一个中断向量对应的Pending位。这个Pending位的定义与MSI Capability寄存器的Pending位类似。MSI-X Table和Pending Table存放在PCIe设备的BAR空间。MSI-X机制必须支持这个Pending Table,而MSI 机制的Pending Bits 字段是可选的。

MSI-X Capability 结构比MSI Capability结构复杂一些。在该结构中,使用MSI-X Table存放该设备使用的所有 Message Address和 Message Data字段,这个表格存放在该设备的BAR 空间中,从而PCIe设备可以使用MSI-X机制时,中断向量号可以不连续,也可以申请更多的中断向量号。MSI-X Capability结构的组成方式如下图所示。

上图中各字段的含义如下所示。

Capability ID:记载 MSI-X Capability 结构的ID号,其值为0x11。在PCIe设备中, 每个Capability 都有唯一的ID号。

Next Pointer:存放下一个Capability结构的地址。

Message Control:存放当前PCIe 设备使用MSI-X机制进行中断请求的状态与控制信息,如下。

Bits	定义			    描述
----	----			----------------
15		MSI-X Enable	该位可读写,是MSI-X中断机制的使能位,复位值为0,表示不使能MSI-X中断机制。该位为1且MSI Enable位为0时,当前PCle设备使用MSI-X中断机制,此时INTx和MSI 
14		Function Mask	中断机制被禁止。当PCle设备的MSI Enble和MSI-X Enable位为0时,将使用INTx中断 消息报文发出/结束中断请求该位可读写,是中断请求的全局Mask位,复位值为0。如果该位为1,该设备所有的中断请求都将被屏蔽;如果该位为0,则由Per Vector Mask 位决定是否屏蔽相应的中断请求。Per Vector Mask 位在MSI-X Table中定义,详见下文
10:0	Table Size		MSI-X中断机制使用MSI-X Table 存放 Message Address 字段和Message Data 字段。该字 段用来存放MSI-X Table的大小,该字段对系统软件只读

Table BIR (BAR Indicator Register):存放MSI-X Table所在的位置,PCIe总线 规范规定 MSI-X Table存放在设备的BAR空间中。该字段表示设备使用BARO~5寄存器中的哪个空间存放MSI-X table。该字段由三位组成,其中0b000~0b101与BARO~5空间一一对应。

Table Offset:存放 MSI-X Table 在相应BAR空间中的偏移。

PBA(Pending Bit Array)BIR:表示 Pending Table 存放在PCIe 设备的哪 个BAR空间中,0表示BARO空间,1表示BAR1空间,依此类推。在通常情况下,Pending Table和MSI-X Table存放在PCle设备的同一个BAR空间中。

PBA Offset:存放 Pending Table在相应BAR空间中的偏移。

MSI-X Table

MSI-X Table的组成结构如下图所示。

由该图可见,MSI-X Table由多个Entry组成,其中每个Entry与一个中断请求对应。每个Entry中有四个参数,其含义如下所示。

·Msg Addr:当MSI-X Enable位有效时,该字段存放MSI-X存储器写事务的目的地址的低32位。该双字的31:2字段有效,系统软件可读写;1:0字段复位时为0,PCle 设备可以根据需要将这个字段设为只读,或者可读写。不同的处理器填入该寄存器的数据并不相同。

·Msg Upper Addr:该字段可读写,存放MSI-X存储器写事务的目的地址的高32位。

·Msg Data:该字段可读写,存放MSI-X报文使用的数据。其定义与处理器系统使用的中断控制器和PCIe 设备相关。

·Vector Control:该字段可读写。该字段只有第0位(即Per Vector Mask位)有效,其他位保留。当该位为1时,PCle设备不能使用该Entry提交中断请求;为0时可以提交中断请求。该位在复位时为0。Per Vector Mask 位的使用方法与MSI机制的Mask位类似。


PowerPC处理器如何处理MSI 中断请求

PowerPC处理器使用OpenPIC 中断控制器或者MPIC中断控制器,处理外部中断请求。其中MPIC中断控制器基于OpenPIC中断控制器,但是做出了许多增强,目前 Freescale 新推出的PowerPC处理器,其中断控制器多与MPIC兼容。

值得注意的是,PowerPC处理器和x86处理器处理MSI报文的方式有较大的不同。其中x86处理器使用的机制比PowerPC处理器更为合理,但是PowerPC处理器的方法使用的硬件资源相对较少。

使用MPIC 中断控制器处理MSI中断时,PCle设备的MSI报文,其目的地址为MPIC中断控制器的MSIIR 寄存器。当该寄存器被PCIe设备写入后,MPIC中断控制器将向处理器内核提交中断请求,之后处理器再通过读取MPIC中断控制器的ACK寄存器获得中断向量号,并进行相应的中断处理。这种方式与x86处理器的 FSB Interrupt Message 机制相比,处理器需要读取ACK寄存器,从而中断处理的延时较大。

目前 Freescale的P4080处理器对MPIC中断控制器进行了优化。在P4080处理器中,MPIC中断控制器向处理器提交中断请求的同时,也向处理器内核提交中断向量,处理器内核不必读取ACK 寄存器获得中断向量,从而缩短了中断处理延时。使用这种方法的效率与x86处理器使用的 FSB Interrupt Message 机制相当。

目前 Freescale 并没有完全公开P4080处理器的实现细节,因此仍以MPC8572处理器为例介绍PCle 设备的MSI中断请求。在MPC8572处理器中,MPIC中断控制器的拓扑结构如下图。

由上图所示,MPIC中断控制器可以处理内部中断请求、外部中断请求,Message、处理器间中断请求和Share MSI中断请求等。而MPIC中断控制器使用Int0、Int1等中断线向处理器提交这些中断请求。其中 Internal Interrupts和 External Interrupts 模块处理 MPC8572内部 和外部的中断请求,而Share MSI处理来自PCIe设备的MSI或者MSI-X中断请求。

当MPIC中断控制器收到MSI报文后,将使用中断线Int0、Intl或者 cintn 向处理器内核提交中断请求。处理器内核被中断后,将读取ACK寄存器获得中断向量,然后执行相应的中断服务例程。为此PowerPC处理器设置了一系列寄存器。

MSI中断机制使用的寄存器

最重要的寄存器是MSIIR 寄存器,在PowerPC处理器系统中,PCle 设备 Message Address 寄存器中存放的值都为MSIIR寄存器的物理地址,而Message Data 寄存器中存放的数据也与MSIIR 寄存器相关。

在PowerPC处理器系统中,MSI机制的实现过程是PCIe设备向MSIIR 寄存器写入指定的数据。MPIC中断控制器发现该寄存器被写入后,将向处理器提交中断请求。处理器收到这个中断请求后,将通过读取MPIC中断控制器的ACK 寄存器确定中断向量,并依此确定中断源。为此PowerPC处理器还设置了其他寄存器实现MSI中断机制。MSIIR寄存器定义如下:

Bits        定义    描述
-------     ----   -------
27 ~ 31     IBS    该字段用来选择MSIRO—MSIR7寄存器的对应位。0b00000对应SHO;0b00001 对应SHI; 0b00010 对应SH2;以此类推0b11111对应SH31
24 ~ 26     SRS    该字段用来选择MSIRO—MSIR7寄存器。0b000对应MSIRO; 0b001对应MSIR1; 0b010 对应 MSIR2;以此类推0bl11对应MSIR
0 ~  24            保留。

MPC8572处理器共8个MSIR寄存器,每个寄存器32位,共256位,所以最多处理256个MSI中断请求。

系统软件如何初始化PCIe 设备的 MSI Capability 结构

在Linux中,配置Capability的位置为pci_enable_msi > ... > pci_write_msi_msg。

如果PCIe 设备支持MSI机制,系统软件首先设置该设备 MSI Capability 结构的 Message Address和Message Data字段。如果该PCIe设备支持64位地址空间,即 MSI Capability 寄存 器的64 bit AddressCapable 位有效时,系统软件还需要设置 Message Upper Address字段。系 统软件完成这些设置后,将置 MSI Capability 结构的 MSI Enable位有效,使能该PCle设备的 MSI机制。

Message Address:在该字段中填写的值是MSIIR寄存器在PCI总线域中的物理地址。在PowerPC处理器中,PCIe设备使用MSI机制访问MSIIR 寄存器时,可以不使用Inbound 寄存器组进行PCI总线地址到处理器地址的转换。在MPC8572处理器中,专门设置了一个PEXCSRBAR窗口(该窗口大小为1MB,基地址由PEXCSRBAR寄存器决定),进行PCI总线域到存储器域的地址转换,使用这种方法可以节省Inbound 寄存器窗口(个数很有限),Linux PowerPC使用了这种实现方式。(MSIIR寄存器地址 > PCI总线域地址 > MSI Capability 结构的 Message Address 字段

Message Data:存放这组中断向量号的基地址,MSI机制要求“这组数据”连续,这些数据与MSIIR寄存器要求的格式相同。

在MPC8572处理器系统中,PCle设备使用存储器写TLP传送MSI中断报文,这个MSI中断报文使用的地址为PCle 设备 Capability 结构的 Message Address字段,而数据为 Message Data指向的中断向量号数组中的一个,其值与MSIIR寄存器要求的格式相同。

其实PCIe设备在发送MSI中断报文时只是根据中断类型选择对应的Message Data数据,再组装上Message Address后发送TLP报文。

 MSI-X中断与MSI中断类似,只是Message Address与Message Data在BAR空间而不是配置空间,而且中断数量更多不要求连续。

其他处理器对MSI中断的处理也大同小异,思路都是往处理器系统的某个Address发送某个Data,从而触发了某个中断,不同中断Data不同,对MSI-X而言不同中断Address也可能不同。对PCIe设备而言,Address和Data是固定数值,并不会去修改,只需根据不同事件选择不同Address和Data从而触发不同的中断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值