6.2 PowerPC处理器如何处理MSI中断请求
PowerPC处理器使用OpenPIC中断控制器或者MPIC中断控制器,处理外部中断请求。其中MPIC中断控制器基于OpenPIC中断控制器,但是作出了许多增强,目前Freescale新推出的PowerPC处理器,其中断控制器多与MPIC兼容。
值得注意的是,PowerPC处理器和x86处理器处理MSI报文的方式有较大的不同。其中x86处理器使用的机制比PowerPC处理器更为合理,但是PowerPC处理器使用的方法使用的硬件资源相对较少。本节将MPC8572处理器为例说明MSI机制的处理过程,在第6.3节介绍x86处理器如何实现MSI机制。
MPIC中断控制器是Freescale的PowerPC处理器使用的通用中断控制器,目前基于E500内核的处理器,如MPC854x、8572等处理器使用这种中断控制器。目前Freescale使用QorIP架构,该架构使用的中断控制器与MPIC兼容。
使用MPIC中断控制器处理MSI中断时,PCIe设备的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处理器为例介绍PCIe设备的MSI中断请求。在MPC8572处理器中,MPIC中断控制器的拓扑结构如图6?5所示。
由上图所示,MPIC中断控制器可以处理内部中断请求[1]、外部中断请求,Message、处理器间中断请求和Share MSI中断请求等。而MPIC中断控制器使用Int0、Int1等中断线向处理器提交这些中断请求。其中Internal Interrupts和External Interrupts模块处理MPC8572内部和外部的中断请求,而Share MSI处理来自PCIe设备的MSI或者MSI-X中断请求。
当MPIC中断控制器收到MSI报文后,将使用中断线Int0、Int1或者cintn向处理器内核提交中断请求。处理器内核被中断后,将读取ACK寄存器获得中断向量,然后执行相应的中断服务例程。为此PowerPC处理器设置了一系列寄存器,如下文所示。
6.2.1 MSI中断机制使用的寄存器
PowerPC处理器设置了一系列寄存器,处理来自PCIe设备的MSI报文,其中最重要的寄存器是MSIIR寄存器。在PowerPC处理器系统中,PCIe设备Message Address寄存器中存放的值都为MSIIR寄存器的物理地址,而Message Data寄存器中存放的数据也与MSIIR寄存器相关。
在PowerPC处理器系统中,MSI机制的实现过程是PCIe设备向MSIIR寄存器写入指定的数据。MPIC中断控制器发现该寄存器被写入后,将向处理器提交中断请求。处理器收到这个中断请求后,将通过读取MPIC中断控制器的ACK寄存器确定中断向量,并依此确定中断源。为此PowerPC处理器还设置了其他寄存器实现MSI中断机制。
1 MSIIR寄存器
在PowerPC处理器中,MSIIR(Shared Message Signaled Interrupt Index Register)寄存器是实现MSI机制的重要寄存器。
当PCIe设备对MSIIR寄存器进行写操作时,MPC8572处理器将使能MSIR0–MSIR7寄存器的相应位,从而向MPIC中断控制器提交中断请求,而中断控制器将转发这个中断请求,由处理器进一步处理。该寄存器各字段的详细描述如表6?3所示。
表6?3 MSIIR寄存器
Bits |
定义 |
描述 |
27~31 |
IBS |
该字段用来选择MSIR0~MSIR7寄存器的对应位。0b00000对应SH0;0b00001对应SH1;0b00010对应SH2;以此类推0b11111对应SH31; |
24~26 |
SRS |
该字段用来选择MSIR0~MSIR7寄存器。0b000对应MSIR0;0b001对应MSIR1;0b010对应MSIR2;以此类推0b111对应MSIR7。 |
0~24 |
保留。 |
PCIe设备通过MSI机制,向此寄存器写入数据时,MSIR0~7寄存器的相应位SH0~31将有一位置1。例如PCIe设备向MSIIR寄存器写入0xFF00000时,MSIR7寄存器的SH31位将置1(SRS字段为0b111用来选择MSIR7,而IBS字段为0b11111用来选择SH31)。
2 MSIR寄存器组
MSIR(Shared Message Signaled Interrupt Registers)寄存器组共由8个寄存器组成,分别为MSIR0~MSIR7。其中每一个MSIRx寄存器中有32个有效位,分别为SH0~31。当PCIe设备对MSIIR寄存器进行写操作时,某一个MSIIRx寄存器的某个SH位将被置为有效。系统软件通过读取该寄存器获得中断源,该寄存器读清除,对此寄存器进行写操作没有意义。
该寄存器组的大小决定了一个PowerPC处理器支持的MSI中断请求的个数。在MPC8572处理器中,有8个MSIRx寄存器,每个寄存器由32个有效位组成,因此MPC8572处理器最多能够处理256个MSI中断请求。该寄存器的结构如图6?6所示。
3 MSISR寄存器
MSISR寄存器(Shared Message Signaled Interrupt Status Register)共由8个有效位组成,每一位对应一个MSIR寄存器。MPC8572处理器设置该寄存器的主要目的是方便系统软件定位究竟是哪个MSIR寄存器中存在有效的中断请求。首先系统软件通过MSISR寄存器判断是哪个MSIRx寄存器存在有效请求,之后再读取相应的MSIRx寄存器,该寄存器各字段的详细描述如表6?4所示。
表6?4 MSISR寄存器
Bits |
定义 |
描述 |
0~23 |
保留。 |
|
24~31 |
Sn |
该字段由8位组成,每一位与一个MSIR0~7寄存器对应。该位为0时表示在MSIRn寄存器中没有有效位,即没有中断请求;该位为1时表示MSIRn寄存器中至少有一个有效位,即存在中断请求。Sn位是MSIRn寄存器各个位的“与”,当MSIRn寄存器的相应位清除时,Sn也将被清除。 |
4 MSIVPR寄存器组
MSIVPR(Shared Message Signaled Interrupt Vector/Priority Register)寄存器组由8个寄存器组成,分别为MSIVPR0~7寄存器。该组寄存器设置对应中断请求的优先级别和中断向量。其中每个MSIVPR寄存器对应一个MSIR寄存器,MSIVPR寄存器各字段的详细解释如表6?5所示。
表6?5 MSIVPR寄存器
Bits |
定义 |
描述 |
0 |
MSK |
该位为0,且MSIR寄存器的对应位为1时,则将向中断控制器提交中断请求;如果为1屏蔽该中断请求。 |
1 |
A |
该位为0时,表示MPIC中断控制器没有处理该中断请求;该位为1时,表示MPIC中断控制器正在处理该中断请求,或者该中断控制器准备处理该中断请求,这个中断请求将在IPR(Interrupt Pending Regsiter)寄存器中排队等待处理,或者在ISR(Interrupt Service Register)寄存器中正在被处理。该位的详细描述见MPC8572的数据手册。 |
12~15 |
PRIORITY |
OpenPIC和MPIC中断控制器中为每一个中断请求设置了0~15,共16个优先级。其中1的优先权最低,15的优先权最高,0表示禁止中断请求。 |
16~31 |
VECTOR |
该字段存放该中断的中断向量。当处理器读取IACK寄存器时,将获得对应中断请求的中断向量。 |
通过该组寄存器可以发现,在MPC8572处理器系统中,PCIe设备最多可以使用8个中断向量,并可以共享这些中断向量。
5 MSIDR寄存器组
MSIDR(Shared Message Signaled Interrupt Destination Registers)寄存器组共由8个寄存器组成,分别为MSIDR0~7。其中每一个MSIDRn寄存器对应一个MSIR寄存器。
MPIC中断控制器支持Pass-through方式,在这种方式下,PowerPC处理器可以使用外部中断控制器处理中断请求(这种方法极少使用),而不使用内部中断控制器。MPIC中断控制器可以使用cint#和int#信号提交中断请求,但是绝大多数系统软件都使用int#信号向处理器提交中断请求。
此外在MPC8572处理器中有两个CPU,分别为CPU0和CPU1,MSI机制提交的中断请求可以由CPU0或者CPU1处理。系统软件可以通过设置MSIDRn寄存器完成这些功能,该寄存器各字段的详细描述如表6?6所示。
表6?6 MSIDRn寄存器
Bits |
定义 |
描述 |
0 |
EP |
为1时,表示中断请求输出到IRQ_OUT由外部中断控制器处理;为0时,表示由MPIC中断控制器处理。 |
1 |
CI0 |
为1时,表示中断控制器使用cint#信号向CPU0提交中断请求。 |
2 |
CI1 |
为1时,表示中断控制器使用cint#信号向CPU1提交中断请求。 |
30 |
P1 |
为1时,表示中断控制器使用int#信号向CPU0提交中断请求。 |
31 |
P0 |
为1时,表示中断控制器使用int#信号向CPU1提交中断请求。 |
6.2.2 系统软件如何初始化PCIe设备的MSI Capability结构
如果PCIe设备支持MSI机制,系统软件首先设置该设备MSI Capability结构的Message Address和Message Data字段。如果该PCIe设备支持64位地址空间,即MSI Capability寄存器的64 bit Address Capable位有效时,系统软件还需要设置Message Upper Address字段。系统软件完成这些设置后,将置MSI Cabalibities结构的MSI Enable位有效,使能该PCIe设备的MSI机制。
其中Message Address字段所填写的值是MSIIR寄存器在PCI总线域中的物理地址。在PowerPC处理器中,PCI总线域与存储器域地址空间独立,当PCIe设备访问存储器域的地址空间时,需要通过Inbound寄存器组将PCI总线域地址空间转换为存储器域地址空间。
在PowerPC处理器中,PCIe设备使用MSI机制访问MSIIR寄存器时,可以不使用Inbound寄存器组进行PCI总线地址到处理器地址的转换。在MPC8572处理器中,专门设置了一个PEXCSRBAR窗口[2],进行PCI总线域到存储器域的地址转换,使用这种方法可以节省Inbound寄存器窗口,Linux PowerPC使用了这种实现方式。
在MPC8572处理器中,MSIIR寄存器的基地址为CCSRBAR[3](Configuration, Control, and Status Base Address Register),其偏移为0x1740。为支持MSI中断机制,系统软件需要使用PEXCSRBAR窗口将MSIIR寄存器映射到PCI总线域地址空间,即将CCSRBAR寄存器空间映射到PCI总线域地址空间。之后PCIe设备就可以通过MSIIR寄存器在PCI总线域的地址访问MSIIR寄存器。
Linux PowerPC使用setup_pci_pcsrbar函数[4]设置PEXCSRBAR窗口,该函数的源代码在./arch/powerpc/sysdev/fsl_pci.c文件中,如源代码6?1所示,这段代码来自Linux 2.6.30.5。
源代码6?1 setup_pci_pcsrbar函数
static void __init setup_pci_pcsrbar(struct pci_controller *hose) { #ifdef CONFIG_PCI_MSI phys_addr_t immr_base; immr_base = get_immrbase(); early_write_config_dword(hose, 0, 0, PCI_BASE_ADDRESS_0, immr_base); #endif } |
系统软件除了需要设置PCIe设备的Message Address字段和PEXCSRBAR窗口之外,还需要设置PCIe设备的Message Data字段。PCIe设备向MSIIR寄存器进行存储器写操作的数据存放在Message Data字段中。
系统软件在初始化Message Data字段之前,首先根据Multiple Message Capable字段预先存放的数据初始化Multiple Message Enable字段。一个PCIe设备最多可以申请32个中断请求,但是系统软件根据当前处理器系统的中断资源的使用情况,决定给这个PCIe设备提供多少个中断向量,并将这个结果存放到Multiple Message Enable字段。
MPC8572处理器最多可以为PCIe设备提供256个MSI中断请求。但是在某些极端的情况下,可能会出现PCIe设备需要的中断请求超过系统所能提供的中断请求。此时某些PCIe设备的Multiple Message Enable字段可能会小于Multiple Message Capable字段。
如果在PCIe设备中,使用了多个中断请求,那么Message Data字段存放的是一组中断向量号,而Message Data字段存放这组中断向量号的基地址。MSI机制要求“这组数据”连续,其范围在Message Data~Message Data+Multiple Message Enable-1之间。在多数情况下,MPC8572处理器系统仅为一个PCIe设备分配1个中断向量号。
由上所述,在MPC8572处理器系统中,PCIe设备使用存储器写TLP传送MSI中断报文,这个存储器写TLP使用的地址为PCIe设备Capability结构的Message Address字段,而数据为Message Data~Message Data+Multiple Message Enable-1之间。其中Message Data字段与MSIIR寄存器要求的格式相同。
这个特殊的存储器写TLP报文通过若干Switch,并穿越RC后,最终将数据写入MSIIR寄存器中,并设置MSIIR寄存器的SRS和IBS字段,同时将使能MSIR0~MSIR7寄存器的相应位,从而向中断控制器提交中断请求(如果MSIVPR寄存器的MSK位为1)。MPIC中断控制器获得该中断请求后,向处理器系统转发这个中断请求,并由处理器系统执行相应的中断服务例程进行中断处理。MPC8572处理器也可以处理PCIe设备的MSI-X中断机制,本节对此不做进一步介绍。
6.2 PowerPC处理器如何处理MSI中断请求的更多相关文章
- 6.3 x86处理器如何处理MSI-X中断请求
PCIe设备发出MSI-X中断请求的方法与发出MSI中断请求的方法类似,都是向Message Address所在的地址写Message Data字段包含的数据.只是MSI-X中断机制为了支持更多的中断 ...
- 第6章 MSI和MSI-X中断机制
在PCI总线中,所有需要提交中断请求的设备,必须能够通过INTx引脚提交中断请求,而MSI机制是一个可选机制.而在PCIe总线中,PCIe设备必须支持MSI或者MSI-X中断请求机制,而可以不支持IN ...
- linux arch目录下处理器体系架构介绍
alpha 处理器Alpha 处理器最早由美国DEC 公司设计制造,在Compaq (康柏)公司收购DEC 之后,Alpha 处理器继续得到发展,并且应用于许多高档的Compaq 服务器上,HP (惠 ...
- [转帖]IBM POWER系列处理器的前世今生
IBM POWER系列处理器的前世今生 Power是Power Optimization With Enhanced RISC的缩写,是由IBM开发的一种RISC指令集架构(ISA). IBM的很多服 ...
- 转帖 IBM要推POWER9,来了解一下POWER处理器的前世今生
https://blog.csdn.net/kwame211/article/details/76669555 先来说一下最新的POWER 9 在Hot Chips会议上首次提到的IBM Power ...
- ARM、X86/Atom、MIPS、PowerPC
关注Android的时候,有一些CPU架构方面的术语知识,主要有:ARM.X86/Atom.MIPS.PowerPC1)ARM/MIPS/PowerPC均是基于精简指令集(RISC,Reduced I ...
- 四大CPU体系结构:ARM、X86/Atom、MIPS、PowerPC
补充介绍一下RISC:RISC(reduced instruction set computer,精简指令集计算机)是一种执行较少类型计算机指令的微处理器,起源于80年代的MIPS主机(即RISC机) ...
- PowerPC简单了解
PowerPC相对于ARM优势: Powerpc芯片凭借其出色的性能和高度整合和技术先进特性在网络通信应用,工业控制应用,家用数字化,网络存储领域,军工领域,电力系统控制等都具有非常广泛的应用.由于P ...
- 四大CPU体系结构ARM、X86/Atom、MIPS、PowerPC
http://blog.csdn.net/wangjianno2/article/details/52140936 RISC(reduced instruction set computer,精简指令 ...
随机推荐
- TCP粘包和拆包问题
问题产生 一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题. 下面可以看一张图,是客户端向服务端发送包: 1. 第一种情况 ...
- 包装类和基本类型区别?(integer和int取值范围一样大)
1.声明方式不同,int不需要new .Integer需要new 2.性质上根本不同点:int是基本数据类型.Integer是引用数据类型,它有自己的属性,方法 3.存储位置和方式不同:int是存储在 ...
- AndroidStudio3更改包名失败
使用Android Studio 3.0 Beta6更改包名refactor---rename一直提示:Refactoring cannot be performedFile xxx\build\xx ...
- Oracle 12cR1 RAC 在VMware Workstation上安装(下)—静默安装
Oracle 12cR1 RAC 在VMware Workstation上安装(下)—静默安装 1.1 静默安装 1.1.1 静默安装grid 安装之前使用脚本进行校验,确保所有的failed选项 ...
- Using Custom Domains With IIS Express In Asp.Net Core
IIS Express是一个Mini版的IIS,能够支持所有的Web开发任务,但是这种设计有一些缺陷,例如只能通过localhost:<port>的方式来访问我们的应用程序,看起来就有点不 ...
- BZOJ 4034: [HAOI2015]树上操作 [欧拉序列 线段树]
题意: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a . 操作 3 :询问某个节点 x 到根的路径中所有点的点权和. 显然树链剖分可做 ...
- UVa 1378 A Funny Stone Game [博弈论 SG函数]
A Funny Stone Game 题意: $n \le 23$堆石子,每次选择$i < j \le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败.求先手是否必胜以及第一次取的策略 ...
- js中sum(2,3,4)和sum(2)(3)(4)都返回9并要求扩展性
网上有很多关于sum(1)(2)(3),sum(1,2,3)之类的面试题要求输出相同的结果6并要求可以满足扩展,即有多个参数时也能符合题设的要求,所以自己写了部分例子可以大概满足这些面试题的要求 &l ...
- WPF DataTriger 用法示例代码
用法1: <DataGridTemplateColumn Header="{lex:LocText ExamineRoom}"> <DataGridTemplat ...
- yii2 源码分析Behavior类分析 (四)
Behavior类是所有事件类的基类,它继承自object类 Behavior类的前面注释描述大概意思: * Behavior类是所有事件类的基类 * * 一个行为可以用来增强现有组件的功能,而不需要 ...