0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PCI设备是如何连接到PIC/IOAPIC的中断引脚上呢?

冬至子 来源:UEFI社区 作者:Wolf 2023-06-30 14:22 次阅读

PCI中断路由

1

PCI设备中断

PCI spec为每个PCI设备定义了四个中断引脚,分别是INTA#,INTB#,INTC#和INTD#,如图:

图片

如果PCI设备为单功能设备,则必须使用INTA#,对于多功能设备,各功能设备可任意接至PCI 总线的四条中断申请线INTA# - INTD# 。那么如何设定某个PCI设备的某个功能使用那个中断引脚呢?实际上这个是由PCI设备制造商决定的,并不能由主板固件后期更改。我们翻出PCI体系结构文中介绍的PCI配置空间,在其中interrupt pin会告知主板固件该func使用了哪个引脚,如图中红色圈标注:

图片

一个PCI设备可以有8个func,而4个终端引脚意味着中断共享不可避免。PCI为了方便中断共享,定义中断是电平触发,低电平有效。中断信号与PCI CLK异步,设备一旦Assert为低,则要维持低电平状态,直到驱动程序清除这个中断请求。这样PCI中断可以为通过链的方式来共享,某个设备中断处理完毕后将其电平置高,只有该中断信号上所有的设备中断处理都结束了,该中断信号才能恢复高电平,整个中断处理才能结束。实际上中断共享不仅仅存在PCI设备各个func中,假设系统中有10个PCI设备,每个设备有4个中断引脚,要它们每个都独立意味着中断控制器需要有40个引脚。我们通过前文知道PIC只有15个引脚,IOAPIC通常有24个引脚,还有很多保留不可用,而一台计算机内部PCI设备往往超过20个。所以,中断更需要在设备之间共享。

让我们举个形象的比喻来理解中断共享的处理。想象操作系统中断处理调度器是个严厉的老师,设备中断处理例程是一群可爱的小朋友,他们被按照连接在PIC/IOAPIC引脚数分成若干排。每个小朋友手里都有个按钮,小朋友想要问问题,就按下按钮,老师回答完后他会再按一下恢复弹起状态。问题是老师是个近视眼,他看不见后面的小朋友。为了解决这个问题,在每排座位前面安装了个灯泡,当这排小朋友有人的按键被按下,灯就亮了。老师上课时,看见第2排灯亮了,他就停下来,问:“第2排第1个小朋友,是不是你要问问题?”得到肯定的答复就解答该小朋友,否定的话就问下一个,如此往复,直到该排没有人有问题,灯才灭,老师才能继续讲课。

看来在老师没有换个更好的眼镜或者做个近视矫正手术之前这是唯一的办法了。那么该如何为这些小朋友分组呢,老师把这个任务交给了班长小张。我们帮小张想想,怎么分配才能既公平又上课效率高呢?是不是平均分最好呢?假设小朋友都很乖,这样是最好的办法,但是小张知道班里有个话痨小朋友--小明,他什么都不懂但问题很多,他会频繁提问。假设他被分在第3排最后一个,老师每次看到第3排灯亮了,都从第一个小朋友问,经过了好久才问到小明,效率好低,小明每次很久才轮到他也很不满,上课节奏整体也被拖慢了!

怎么办?开除小明吗?可惜小明是校董的儿子,绝对不能少!让小明坐第一个位置吗?校规规定座位是流水席,每排都先来先坐,再说让小明又高问题又多,谁坐他后面别想问问题了,太不公平。看来只有给小明开小灶了,让他单独坐一排!

世界上没有绝对的公平,在资源捉襟见肘时会叫的孩子有奶吃在我们天朝还少吗?班长小张也只有做些妥协了。我们的计算机固件和主板硬件工程师在很多时候就扮演了左右为难的小张的角色,在硬件的限制下,尽量保证系统的响应时间。他们基于一些简单的原则:

A. 公平:尽量减少中断共享。

B. 效率:紧急或者频繁的设备可以独占中断

同时要充分理解PC系统中绝大多数设备都是单功能设备,所以仅使用INTA#信号,很少使用INTB#和INTC#信号,而INTD#信号更是极少使用。映射INTA#~INTD#到PIC/IOAPIC IRQ的机制称为“Swizzling”,它在不同情况下实现机制有很大不同,我们分别来看看。

2

PCI/PCIe扩展插槽

对主板上的PCI扩展插槽,用户插入什么设备,插在哪个槽内都不能在出厂时确定。我们这里要尽量考虑平衡原则和效率原则。我们将所有插槽的INTA#~INTD#分成四组串联起来如何?这样离得最近的Slot 1高兴了,每个都是我优先!万一有个用户把重要的网卡插在slot 4,效率会严重下降。在充分考虑到PCI设备绝大多数都是单功能设备(仅使用INTA#信号,很少使用INTB#和INTC#信号,而INTD#信号更是极少使用),PCI SIG推荐PCI to PCI bridge后slot连接关系应该组成如下图:

图片

即Slot1 INTA#->Slot2 INT B#->Slot3 INTC#->Slot4 INTD#等等。这样,当然slot 1还是占些小便宜,但其他slot也有很大机会独占某个中断线(想想为什么)。这种Swizzling是主板设计硬件连线决定的,不由主板固件决定,但是主板固件需要了解这些信息

PCI桥则将它下面的转换结果INTx转化为本身的INTx,接入芯片组内部的Swizzling。PCIe的插槽是1:1对应PCIe root port,PCIe root port可以看作PCI桥,等同处理。

3

芯片组内部

PCI SIG并没有规定芯片组内部Swizzling的规则,而芯片组内部设备在出厂时就已经确定了,芯片是不是可以hard code一个中断路由关系呢?实际上有些芯片组就是这么做的,在芯片硬件说明书中注明各种PCI设备INTx到IRQ的关系表,BIOS只要照着报告给OS就可以了。而Intel芯片组提供了更灵活的方式,BIOS可以根据需要设置中断路由,以适应不同的应用市场。不同的芯片组设置方法不同,有些给出了几组应用场景,BIOS可以根据需要选择一种,而在很早开始南桥芯片组ICH/PCH就给出了一种更灵活的方式,就是我们前文提到的PIRQ。简单来说就是在ICH/PCH内部加入了几个新的寄存器:IR寄存器组。IR寄存器组用于设定芯片组内部PCI设备中断INTA#-H# 连接到具体PIC/IOAPIC的哪个引脚上。这样BIOS就可以根据面向市场不同重新绘制中断路由图了,好方便!

OS接口

班长小张终于给小朋友排好了座位,他怎么把这些信息告诉各个老师呢?一个个告诉太麻烦,不如把所有情况打印成一张表贴子讲台上。我们的固件也是通过表告诉OS的,这里有两种表。

1

MP table

有感于DOS阶段中断设置的混乱,微软在推出Win95时联合Intel提出了PCI Interrupt Routing Table的数据结构,它的作用就是用来描述在使用8259中断控制器的系统下,PCI中断的路由关系。它和其他一些表构成了传统的MP table。它只在PIC模式下起作用,而PIC模式已经被淘汰,所以它的具体结构我们这里略过。这里要特别指出的是,固件在提交PIRQ table时要同步更新PCI配置空间的Interrupt line寄存器,如图篮圈部分:

图片

2

ACPI table

在APIC模式下,固件应该通过ACPI的_PRT(PCI Routing Table) method返回主板上无论硬件还是固件设定的中断路由信息。ACPI spec有示例,但内容比较单薄。我们来看一个Intel开源硬件平台Minnowboard MAX固件是怎么处理的。

_PRT代码如下:

Method(_PRT,0)

{

  If(PICM) {Return(AR00)} // APIC mode

  Return (PR00) // PIC Mode

} // end _PRT

这里判断如果是PIC模式,返回PR00,如果是APIC模式返回AR00表。PR00和AR00其实是同一个中断路由关系的两个view,其实质内容是一致的。我们单看一下AR00就好:

Name(AR00, Package()

{

// SD Host #0 - eMMC

Package() {0x0010FFFF, 0, 0, 16 },

// SD Host #1 - SDIO

Package() {0x0011FFFF, 0, 0, 17 },

// SD Host #2 - SD Card

Package() {0x0012FFFF, 0, 0, 18 },

// SATA Controller

Package() {0x0013FFFF, 0, 0, 19 },

// xHCI Host

Package() {0x0014FFFF, 0, 0, 20 },

// Low Power Audio Engine

Package() {0x0015FFFF, 0, 0, 21 },

// USB OTG

Package() {0x0016FFFF, 0, 0, 22 },

//

// MIPI-HSI

Package() {0x0017FFFF, 0, 0, 23 },

//

// LPSS2 DMA

// LPSS2 I2C #4

Package() {0x0018FFFF, 0, 0, 17 },

// LPSS2 I2C #1

// LPSS2 I2C #5

Package() {0x0018FFFF, 2, 0, 19 },

// LPSS2 I2C #2

// LPSS2 I2C #6

Package() {0x0018FFFF, 3, 0, 18 },

// LPSS2 I2C #3

// LPSS2 I2C #7

Package() {0x0018FFFF, 1, 0, 16 },

// SeC

Package() {0x001AFFFF, 0, 0, 21 },

//

// High Definition Audio Controller

Package() {0x001BFFFF, 0, 0, 22 },

//

// EHCI Controller

Package() {0x001DFFFF, 0, 0, 23 },

// LPSS DMA

Package() {0x001EFFFF, 0, 0, 19 },

// LPSS I2C #0

Package() {0x001EFFFF, 3, 0, 16 },

// LPSS I2C #1

Package() {0x001EFFFF, 1, 0, 17 },

// LPSS PCM

Package() {0x001EFFFF, 2, 0, 18 },

// LPSS I2S

// LPSS HS-UART #0

// LPSS HS-UART #1

// LPSS SPI

// LPC Bridge

//

// SMBus Controller

Package() {0x001FFFFF, 1, 0, 18 },

//

。。。。

}

通过这张大表,OS才能确定主板PCI设备和IRQ的连接关系。

其他中断信息

除了中断路由表之外,还有很多和中断相关的信息也需要通过ACPI向OS报告

1. LAPIC和IOAPIC

固件需要在ACPI的MADT表里向OS报告所有的LAPIC和IOAPIC。LAPIC默认映射到物理地是0xFEE00000(想想为什么不会互相冲突?),不需要报告,只要LAPIC ID即可。需要特别说明的是,因为APIC ID不一定从0开始,也不一定连续,所以其值要动态枚举而得。同时由于很多OS在调度processor时是挨个调度的,而HT的两个thread的APIC ID往往连续,同时被调度效能大大降低,Intel推荐HT的两个thread隔开报告。如果多个CPU socket,情况又有变化,这是系统调优的手段之一,这里不再赘述。

IOAPIC的地址和ID都由固件指定,必选准确的在MADT里向OS报告,每个IOAPIC的GSI偏移量也要报告。

2. SCI

在Intel的芯片组中,SCI通常缺省占用了中断9。它的值可以在芯片组的寄存器中修改,并需要通过FADT报告OS。因为这是个特殊指定的中断,所以在MADT中还要通过interrupt override节予以保留。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5304

    浏览量

    119888
  • 中断处理
    +关注

    关注

    0

    文章

    94

    浏览量

    10949
  • 中断控制器
    +关注

    关注

    0

    文章

    59

    浏览量

    9432
  • PCI协议
    +关注

    关注

    0

    文章

    2

    浏览量

    5487
  • 调度器
    +关注

    关注

    0

    文章

    98

    浏览量

    5233
收藏 人收藏

    评论

    相关推荐

    请问amc1200输出voutp和Voutn怎么直接连接到28335的AD采集引脚上

    amc1200输出voutp和Voutn怎么直接连接到28335的AD采集引脚上
    发表于 08-12 08:28

    PIC32MZEF未连接引脚

    嗨,我已经把我的未连接引脚通过电阻连接到接地。现在我想把这些引脚中的一个配置为SCK。可以把这个引脚
    发表于 01-10 15:38

    无法连接到PIC32MX

    32 MX目标电压检测到不能连接到目标DE副设备。未能获得设备IDPIC32 MX530F128H i-PTIT不与ICD3或实际ICE3.3 VDC到0.1和0.01uF陶瓷到Pin
    发表于 02-28 13:43

    请问是否有必要将数据引脚连接到外部中断

    是否存在中断驱动的示例,用于将PS/2键盘/鼠标连接到PIC微控制器?对于硬件,我已经指的是亚当ChaveSeCurruryLy1。我已经把PS/2时钟连接到了IMT0(5V宽容)
    发表于 06-19 08:36

    PIC16F639上的SPI端口也可以用来连接外部设备吗?

    PIC16F639上的SPI端口内部连接到AFE,并且也暴露在端口C引脚上。如果正在使用AFE,SPI端口也可以用来连接外部设备吗?
    发表于 09-24 10:36

    PIC32是否使用Eithernet引脚使用内部生成的中断

    连接到EREFCLK/AERXCLK。这使我激动,哪个是更好的选择。我推测中断PIN启用设计会更好,但我想知道PIC32是否使用Eithernet引脚使用内部生成的
    发表于 10-16 15:43

    怎么通过USB连接pic32连接到API设备

    您好,我需要通过USB USB连接pic32连接到API设备。我使用程序“PIC32_ESK_USB_Host_Simple_Demo”,
    发表于 10-31 07:20

    如何计数这个引脚上的振荡?

    我正在用PIC18F45 K20工作。我有一个板与外部振荡器连接到RA2。这并不打算是一个校准引脚,但我被要求一些如何计数这个引脚上的振荡。我可以将外部振荡器配置为时钟RA2,但我很困
    发表于 11-04 10:51

    PIC24引脚上使用了内部下拉功能

    在我的生活中,我第一次在PIC24(PIC24FV64KA302)引脚上使用了内部下拉功能——它连接到松下公司的PIR传感器,基本上是开放式收集器,但PNP类型(即,空闲时打开,打开时
    发表于 04-13 09:24

    SPI是否应该连接到j11引脚上的VDDIO和VDDI2C引脚

    我读到如果用户想把SPI连接到另一个MCU,这是可以的。我想写它是否应该连接到j11引脚上的VDDIO和VDDI2C引脚。我想与 SPI 通信。
    发表于 03-15 06:31

    PCI中断机制分析

    PCI中断机制分析:PCI 总线有四条中断线,所有PCI 设备共同使用这四条线向系统申请
    发表于 06-28 19:21 26次下载

    PIC单片机引脚中断程序的设计技巧

    PIC单片机引脚中断程序的设计技巧   所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式
    发表于 10-30 08:07 1503次阅读

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

    在一些嵌入式处理器系统中,这个问题较易解决。因为嵌入式处理器系统很清楚在当前系统中存在多少个PCI设备,这些PCI设备使用了哪些中断资源。在
    的头像 发表于 04-11 09:12 6467次阅读

    简述PCI总线的中断机制

    PCI总线的中断机制 PCI总线使用INTA#、INTB#、INTC#和INTD#信号向处理器发出中断请求。这些中断请求信号为低电平有效,并
    的头像 发表于 07-18 10:10 2791次阅读

    连接引脚上锡不良分析

    不断变革创新,就会充满青春活力;否则,就可能会变得僵化。——歌德干货时间来了,关注小欣本期分享,我们一起来学习吧!连接引脚上锡不良主要表现为引脚下表面与焊点相接不良或不相接,那么导致失效的原因究竟
    的头像 发表于 12-16 08:03 2322次阅读
    <b class='flag-5'>连接</b>器<b class='flag-5'>引脚上</b>锡不良分析