PCI总线使用INTA#、INTB#、INTC#和INTD#信号向处理器发出中断请求。这些中断请求信号为低电平有效,并与处理器的中断控制器连接。在PCI体系结构中,这些中断信号属于边带信号(Sideband Signals),PCI总线规范并没有明确规定在一个处理器系统中如何使用这些信号,因为这些信号对于PCI总线是可选信号。所谓边带信号是指这些信号在PCI总线中是可选信号,而且只能在一个处理器系统的内部使用,并不能离开这个处理器环境。

注:PCI Spec对边带信号的定义如下:

Any signal not part of the PCI specification that connects two or more PCI-compliant agents and has meaning only to those agents.

完整的PCI信号结构图如下:

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

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

在一些简单的嵌入式处理器系统中,Firmware并没有提供中断路由表,此时系统软件开发者需要事先了解PCI设备的INTx信号与中断控制器的连接关系。此时外部设备与中断控制器的连接关系由硬件设计人员指定。

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

此时,PCI插槽A、B、C的INTA#、INTB#和INTC#信号将分散连接到中断控制器的IRQW#、IRQX#和IRQY#信号,而所有INTD#信号将共享一个IRQZ#信号。采用这种连接方式时,整个处理器系统使用的中断请求信号,其负载较为均衡。而且这种连接方式保证了每一个插槽的INTA#信号都与一根独立的IRQx#信号对应,从而提高了PCI插槽中断请求的效率。

在一个处理器系统中,多数PCI设备仅使用INTA#信号,很少使用INTB#和INTC#信号,而INTD#信号更是极少使用。在PCI总线中,PCI设备配置空间的Interrupt Pin寄存器记录该设备究竟使用哪个INTx信号。

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

在PCI总线中,INTx信号属于边带信号。PCI桥也不会处理这些边带信号。这给PCI设备将中断请求发向处理器带来了一些困难,特别是给挂接在PCI桥之下的PCI设备进行中断请求带来了一些麻烦。

在一些嵌入式处理器系统中,这个问题较易解决。因为嵌入式处理器系统很清楚在当前系统中存在多少个PCI设备,这些PCI设备使用了哪些中断资源。在多数嵌入式处理器系统中,PCI设备的数量小于中断控制器提供的外部中断请求引脚数,而且在嵌入式系统中,多数PCI设备仅使用INTA#信号提交中断请求。

在这类处理器系统中,可能并不含有PCI桥,因而PCI设备的中断请求信号与中断控制器的连接关系较易确定。而在这类处理器系统中,即便存在PCI桥,来自PCI桥之下的PCI设备的中断请求也较易处理。

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

而在x86处理器系统中,这个问题需要BIOS参与来解决。在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支持的方式。如果在一个x86处理器系统中,PCI桥下游总线的PCI设备使用的中断映射关系与此不同,那么系统软件程序员需要改动BIOS中的中断路由表。

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

PCI总线的错误处理

PCI设备可以通过奇偶校检来检测到来自AD上的地址或者数据的错误,并通过PERR#或者SERR#报告错误。但是需要注意的是,PCI Spec并未规定任何硬件层面上的错误处理或者恢复机制,因此,这些错误都只能通过软件进行处理。

PCI INTx中断流程

一个简单的PCI总线INTx中断实现流程,如下图所示。

  1. 首先,PCI设备通过INTx边带信号产生中断请求,经过中断控制器(Interrupt Controller,PIC)后,转换为INTR信号,并直接发送至CPU;
  2. CPU收到INTR信号置位后,意识到了中断请求的发生,但是此时并不知道是什么中断请求。于是通过一个特殊的指令来查询中断请求信息,该过程一般被称为中断应答(Interrupt Acknowledge);
  3. 该特殊指令被发送至PIC后,PIC会返回一个8bits的中断向量(Interrupt Vector)值给CPU。该中断向量值与其发送的INTR请求是对应的;
  4. CPU收到来自PIC的中断向量值后,会去其Memory中的中断向量表(Interrupt Table)中查找对应的中断服务程序(Interrupt Service Routines,ISR)在Memory的位置;
  5. 然后CPU读取ISR程序,进而处理该中断。

上面的例子主要是基于早期的单核CPU设计的,并没有考虑到目前多核CPU的情况。因此,在后续的PCI Spec中,将PIC替换为IO APIC(Advanced Programmed Interrupt Controller)。如下图所示:

PCIe INTx中断机制

实际上,在PCIe总线中,传统的中断机制(INTx)已经很少被使用,很多应用甚至直接将该功能禁止了。无论是在PCI总线(V2.3及以后的版本),还是PCIe总线中,都可以通过配置空间中的配置命令寄存器(Configuration Command Register来禁止INTx中断机制),如下图所示。不过,需要特别注意的是,虽然该bit的名称为中断禁止(Interrupt Disable),但是其只会影响INTx,对MSI/MSI-X不会造成影响。因为MSI/MSI-X的使能(或禁止)是通过配置空间中的MSI/MSI-X Capability Command Register来实现的,并且一旦使能了MSI/MSI-X,PCI总线/PCIe总线便会自动地禁止INTx。

并且可以通过配置状态寄存器的中断状态(Interrupt Status)bit来确定当前的中断状态,如下图所示:

INTx相关的寄存器在配置空间的位置如下图所示,Interrupt Pin和Interrupt Line分别定义了中断边带信号引脚号(INTA#INTD#)和中断向量号(IRQ0IRQ255)。

然而,PCIe总线继承了PCI总线的INTx中断机制,但是在实际的PCIe设备之间的中断信息传输中使用的并非边带信号INTx,而是基于消息(Message)的。其中Assert_INTx消息表示INTx信号的下降沿。Dessert_INTx消息表示INTx信号的上升沿。当发送这两种消息时,PCIe设备还会将配置空间的相关中断状态bit的值更新。对于PCIe-PCI(X)桥设备来说,会将接收到的来自PCI/PCI-X总线的INTx信号转换为消息,在往上级发送。一个简单的例子如下图所示:

INTx消息的格式为:

桥设备中的INTx消息的类型与设备号的映射关系如下图所示:

对应的,一个简单的例子如下:

当多个设备使用同一个中断信号线时,只有先置位的设备会被中断控制器响应。但是该中断信号线,并不会因为其中一个设备的中断请求得到响应便被清除,而是会等到所有的发送请求的设备的中断请求都得到了响应之后。如下图所示:

INTx Delivery Rules

The rules associated with the delivery of INTx messages have some unique
characteristics:
• Assert_INTx and Deassert_INTx are only issued in the upstream direction.
• Switches that are collapsing interrupts will only issue INTx messages
upstream when there is a change of the interrupt status.
• Devices on either side of a link must track the current state of INTA‐INTD
assertion.
• A Switch tracks the state of the four virtual wires for each of its downstream
ports, and may present a collapsed set of virtual wires on its upstream port.
• The Root Complex must track the state of the four virtual wires (A‐D) for
each downstream port.
• INTx signaling may be disabled with the Interrupt Disable bit in the Command
Register.
• If any INTx virtual wires are active and device interrupts are then disabled,
a corresponding Deassert_INTx message must be sent.
• If a downstream Switch Port goes to DL_Down status, any active INTx virtual
wires must be deasserted, and the upstream port updated accordingly
(Deassert_INTx message required if that INTx was in active state).

PCIe中断--INTx相关推荐

  1. (19)Xilinx PCIE中断理论(学无止境)

    0 PCIE中断应用 a)基于PCIE接口数据采集系统中断应用 系统架构:下位机是FPGA(Xilinx K7/V7/A7 FPGA),上位机是CPU(ARM.PowerPC.DSP.PC主机): 数 ...

  2. PCIE Feature ------ INTx

    PCIE Feature ------ INTx PCIE Feature ------ INTx PCIE Feature ------ INTx 1.简单介绍 2.验证方法 注意 1.简单介绍 I ...

  3. (3)PCIE中断简介(学无止境)

    1 引言 FPGA与CPU进行数据交互时,一般需要进行DMA操作,包括读DMA和写DMA操作.读/写DMA一些控制信号一般需要通过中断的方式实现:例如:DMA开始.DMA结束等. 2 PCIE中断简介 ...

  4. PCI相关(6)- PCIe中断-MSI/MSIX

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

  5. (22)Xilinx FPGA PCIE中断接口(学无止境)

    1 引言 最近在做一个项目,用到PCIE接口.主要是FPGA与ARM通过PCIE接口进行通信,中断调试一直不通有2个月,最近也算是找到原因,FPGA中断上报后,CPU可以收到中断.所以,这里整理一下F ...

  6. (20)Xilinx PCIE中断调试成功(学无止境)

    0 调试环境 FPGA与ARM通过PCIE接口进行数据交互.下位机为FPGA,上位机为ARM. 1 遇到问题 开发软件:vivado 2018.3 硬件型号:Xilinx K7/V7 FPGA FPG ...

  7. 4 --> PCIe 总线的 MSI/MSI-x 中断代码分析

    在 DPDK 中使用的PCIe 网卡.中断类型为 MSI-X 类型,在此描述 PCIe 中断. MSI/MSI-X概述 PCIe有三种中断,分别为INTx中断,MSI中断,MSI-X中断,其中INTx ...

  8. PCIe MSI中断

    detect:检测对端是否在位.前提知识:对端在位,电容变大:发送端发出脉冲,如果脉冲发生变形.幅值降低说明电路总电容大,表明存在对端. 信号名 对ip 来看的方向 含义 cfg_interrupt ...

  9. PCIe MSI 中断相关的启动流程

    文章目录 Linux PCIe 中断相关启动流程 1. PCIe控制器初始化过程 2. PCIe设备初始化过程 驱动详细解读 控制器侧驱动 设备侧驱动 Linux PCIe 中断相关启动流程 1. P ...

最新文章

  1. java取list中最大数值_Java后台通过Collections获取list集合中最大数,最小数代码
  2. MindMotion MM32F3277 SoftI2C功能测试
  3. java js 转换_[Java教程]javascript 类型转换。
  4. in java中文版百度云 thinking_小程序订阅消息推送(含源码)java实现小程序推送,springboot实现微信消息推送...
  5. 1032 Sharing (25 分) 【难度: 一般 / 知识点: 链表】
  6. Python中必学知识点:类方法、实例方法和静态方法
  7. 算法练习day3——190320(对数器、归并排序)
  8. java process exit_Java Process exitValue()方法
  9. PIR 宣布被营利性机构收购,.org 顶级域名注册费用或上涨
  10. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信
  11. 自己做网站有哪些方法呢?方法分享
  12. Dynamics 365 On Premises V9.1千呼万唤始出来
  13. the win16 subsystem was unable to enter protected mode,DOSX.EXE must be in your AUTOEXEC.NT and pres
  14. 探索式测试之隐喻(种植)
  15. 用HTML5图形拼成的画房子,未来的房子绘画作品图片欣赏
  16. 两个List数据集合合并成一个List
  17. Python OpenCV 自动生成快乐源泉小瓶子图片(OpenCV中文写字)
  18. [摘录]第四部分 教训篇(1)
  19. STM32 FSMC 驱动16脚12864lcd液晶显示屏
  20. 解决git clone与git push出现的若干问题:Failed to connect to github.com port 443: Timed out

热门文章

  1. 华为OD机试真题 Python 实现【统一限载最小值】【2023 Q1 | 200分】
  2. Word2Vec教程 - Skip-Gram模型
  3. 网站带不带www真的不一样,很多新手不知道区别会被坑死的
  4. java mysql 生僻字_mysql/Java服务端对emoji或者生僻字的支持
  5. Android RSA 加密
  6. 五姐妹因没嫁妆集体自杀 绝望跳河
  7. wince 百度地图懒人包_【分享】路虎高德V6.0+V33图资懒人包(WIN CE)【亲测】
  8. 基于扩张状态观测器eso扰动补偿和权重因子调节的电流预测控制,相比传统方法,增加了参数鲁棒性
  9. 20 JNI - c++层 操作 java 层对象
  10. attention综述论文阅读:An Overview of the Attention Mechanisms in ComputerVision