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中断机制,本节对此不做进一步介绍。




[1] PowerPC处理器中含有许多模块,如千兆以太网、ATM等,这些模块包含在芯片内部,由这些内部模块发起的中断请求,被称为内部中断请求。

[2] 该窗口的大小为1MB,其基地址由PEXCSRBAR寄存器确定。

[3] 在Linux PowerPC中使用immr_base变量保存该寄存器。IMMR寄存器是PQ2处理器使用的寄存器,该寄存器在PQ3之后的处理器中升级为CCSRBAR。

[4] 该函数来自Linux 2.6.30.5内核。

6.2 PowerPC处理器如何处理MSI中断请求的更多相关文章

  1. 6.3 x86处理器如何处理MSI-X中断请求

    PCIe设备发出MSI-X中断请求的方法与发出MSI中断请求的方法类似,都是向Message Address所在的地址写Message Data字段包含的数据.只是MSI-X中断机制为了支持更多的中断 ...

  2. 第6章 MSI和MSI-X中断机制

    在PCI总线中,所有需要提交中断请求的设备,必须能够通过INTx引脚提交中断请求,而MSI机制是一个可选机制.而在PCIe总线中,PCIe设备必须支持MSI或者MSI-X中断请求机制,而可以不支持IN ...

  3. linux arch目录下处理器体系架构介绍

    alpha 处理器Alpha 处理器最早由美国DEC 公司设计制造,在Compaq (康柏)公司收购DEC 之后,Alpha 处理器继续得到发展,并且应用于许多高档的Compaq 服务器上,HP (惠 ...

  4. [转帖]IBM POWER系列处理器的前世今生

    IBM POWER系列处理器的前世今生 Power是Power Optimization With Enhanced RISC的缩写,是由IBM开发的一种RISC指令集架构(ISA). IBM的很多服 ...

  5. 转帖 IBM要推POWER9,来了解一下POWER处理器的前世今生

    https://blog.csdn.net/kwame211/article/details/76669555 先来说一下最新的POWER 9 在Hot Chips会议上首次提到的IBM Power ...

  6. ARM、X86/Atom、MIPS、PowerPC

    关注Android的时候,有一些CPU架构方面的术语知识,主要有:ARM.X86/Atom.MIPS.PowerPC1)ARM/MIPS/PowerPC均是基于精简指令集(RISC,Reduced I ...

  7. 四大CPU体系结构:ARM、X86/Atom、MIPS、PowerPC

    补充介绍一下RISC:RISC(reduced instruction set computer,精简指令集计算机)是一种执行较少类型计算机指令的微处理器,起源于80年代的MIPS主机(即RISC机) ...

  8. PowerPC简单了解

    PowerPC相对于ARM优势: Powerpc芯片凭借其出色的性能和高度整合和技术先进特性在网络通信应用,工业控制应用,家用数字化,网络存储领域,军工领域,电力系统控制等都具有非常广泛的应用.由于P ...

  9. 四大CPU体系结构ARM、X86/Atom、MIPS、PowerPC

    http://blog.csdn.net/wangjianno2/article/details/52140936 RISC(reduced instruction set computer,精简指令 ...

随机推荐

  1. TCP那些事儿(上)

    TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是推荐你去 ...

  2. 关于Scanner类

    Scanner类 1.常用的两个方法:         public int nextInt():获取一个int类型的值         public String nextLine():获取一个St ...

  3. SQLServer2008修改sa密码的方法与SQL server 2008数据库的备份与还原

    sa密码的修改转载自:http://blog.csdn.net/templar1000/article/details/20211191 SQL server 2008数据库的备份与还原转自 :htt ...

  4. python os模块实用函数

    os.sep可以取代操作系统特定的路径分隔符.windows下为 “\\” os.name字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'pos ...

  5. C# 语法学习整理

    1.协变与逆变的概念 文章地址:https://segmentfault.com/a/1190000007005115 **************************************** ...

  6. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

  7. SDN第二次上机作业

    作业链接 安装floodlight 生成拓扑并连接控制器floodlight,利用控制器floodlight查看图形拓扑 from mininet.topo import Topo class MyT ...

  8. MySQL学习记录(不断更新)

    MySQL设置数据集为UTF8仍无法输入中文的解决办法: 我们的机器默认为gbk,因此可在进入数据库之前,使用以下这条语句将默认编码改为gbk,注意没有单引号,也不要用分号. mysql -uroot ...

  9. Spring Mybatis-分页插件使用

    Mybatis分页切入点 Mybatis内部有个plugins(插件)概念,本质上属于拦截器的思想.具体的解析可见外文MyBatis拦截器原理探究.本文将在此基础上直接展示实现代码和其他的相关解析 分 ...

  10. ThreadLocal 简述

    ThreadLocal的理解 Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量.因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们 ...