0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PCI設(shè)備是如何連接到PIC/IOAPIC的中斷引腳上呢?

冬至子 ? 來(lái)源:UEFI社區(qū) ? 作者:Wolf ? 2023-06-30 14:22 ? 次閱讀

PCI中斷路由

1

PCI設(shè)備中斷

PCI spec為每個(gè)PCI設(shè)備定義了四個(gè)中斷引腳,分別是INTA#,INTB#,INTC#和INTD#,如圖:

圖片

如果PCI設(shè)備為單功能設(shè)備,則必須使用INTA#,對(duì)于多功能設(shè)備,各功能設(shè)備可任意接至PCI 總線的四條中斷申請(qǐng)線INTA# - INTD# 。那么如何設(shè)定某個(gè)PCI設(shè)備的某個(gè)功能使用那個(gè)中斷引腳呢?實(shí)際上這個(gè)是由PCI設(shè)備制造商決定的,并不能由主板固件后期更改。我們翻出PCI體系結(jié)構(gòu)文中介紹的PCI配置空間,在其中interrupt pin會(huì)告知主板固件該func使用了哪個(gè)引腳,如圖中紅色圈標(biāo)注:

圖片

一個(gè)PCI設(shè)備可以有8個(gè)func,而4個(gè)終端引腳意味著中斷共享不可避免。PCI為了方便中斷共享,定義中斷是電平觸發(fā),低電平有效。中斷信號(hào)與PCI CLK異步,設(shè)備一旦Assert為低,則要維持低電平狀態(tài),直到驅(qū)動(dòng)程序清除這個(gè)中斷請(qǐng)求。這樣PCI中斷可以為通過(guò)鏈的方式來(lái)共享,某個(gè)設(shè)備中斷處理完畢后將其電平置高,只有該中斷信號(hào)上所有的設(shè)備中斷處理都結(jié)束了,該中斷信號(hào)才能恢復(fù)高電平,整個(gè)中斷處理才能結(jié)束。實(shí)際上中斷共享不僅僅存在PCI設(shè)備各個(gè)func中,假設(shè)系統(tǒng)中有10個(gè)PCI設(shè)備,每個(gè)設(shè)備有4個(gè)中斷引腳,要它們每個(gè)都獨(dú)立意味著中斷控制器需要有40個(gè)引腳。我們通過(guò)前文知道PIC只有15個(gè)引腳,IOAPIC通常有24個(gè)引腳,還有很多保留不可用,而一臺(tái)計(jì)算機(jī)內(nèi)部PCI設(shè)備往往超過(guò)20個(gè)。所以,中斷更需要在設(shè)備之間共享。

讓我們舉個(gè)形象的比喻來(lái)理解中斷共享的處理。想象操作系統(tǒng)中斷處理調(diào)度器是個(gè)嚴(yán)厲的老師,設(shè)備中斷處理例程是一群可愛(ài)的小朋友,他們被按照連接在PIC/IOAPIC引腳數(shù)分成若干排。每個(gè)小朋友手里都有個(gè)按鈕,小朋友想要問(wèn)問(wèn)題,就按下按鈕,老師回答完后他會(huì)再按一下恢復(fù)彈起狀態(tài)。問(wèn)題是老師是個(gè)近視眼,他看不見(jiàn)后面的小朋友。為了解決這個(gè)問(wèn)題,在每排座位前面安裝了個(gè)燈泡,當(dāng)這排小朋友有人的按鍵被按下,燈就亮了。老師上課時(shí),看見(jiàn)第2排燈亮了,他就停下來(lái),問(wèn):“第2排第1個(gè)小朋友,是不是你要問(wèn)問(wèn)題?”得到肯定的答復(fù)就解答該小朋友,否定的話就問(wèn)下一個(gè),如此往復(fù),直到該排沒(méi)有人有問(wèn)題,燈才滅,老師才能繼續(xù)講課。

看來(lái)在老師沒(méi)有換個(gè)更好的眼鏡或者做個(gè)近視矯正手術(shù)之前這是唯一的辦法了。那么該如何為這些小朋友分組呢,老師把這個(gè)任務(wù)交給了班長(zhǎng)小張。我們幫小張想想,怎么分配才能既公平又上課效率高呢?是不是平均分最好呢?假設(shè)小朋友都很乖,這樣是最好的辦法,但是小張知道班里有個(gè)話癆小朋友--小明,他什么都不懂但問(wèn)題很多,他會(huì)頻繁提問(wèn)。假設(shè)他被分在第3排最后一個(gè),老師每次看到第3排燈亮了,都從第一個(gè)小朋友問(wèn),經(jīng)過(guò)了好久才問(wèn)到小明,效率好低,小明每次很久才輪到他也很不滿,上課節(jié)奏整體也被拖慢了!

怎么辦?開(kāi)除小明嗎?可惜小明是校董的兒子,絕對(duì)不能少!讓小明坐第一個(gè)位置嗎?校規(guī)規(guī)定座位是流水席,每排都先來(lái)先坐,再說(shuō)讓小明又高問(wèn)題又多,誰(shuí)坐他后面別想問(wèn)問(wèn)題了,太不公平??磥?lái)只有給小明開(kāi)小灶了,讓他單獨(dú)坐一排!

世界上沒(méi)有絕對(duì)的公平,在資源捉襟見(jiàn)肘時(shí)會(huì)叫的孩子有奶吃在我們天朝還少嗎?班長(zhǎng)小張也只有做些妥協(xié)了。我們的計(jì)算機(jī)固件和主板硬件工程師在很多時(shí)候就扮演了左右為難的小張的角色,在硬件的限制下,盡量保證系統(tǒng)的響應(yīng)時(shí)間。他們基于一些簡(jiǎn)單的原則:

A. 公平:盡量減少中斷共享。

B. 效率:緊急或者頻繁的設(shè)備可以獨(dú)占中斷

同時(shí)要充分理解PC系統(tǒng)中絕大多數(shù)設(shè)備都是單功能設(shè)備,所以僅使用INTA#信號(hào),很少使用INTB#和INTC#信號(hào),而INTD#信號(hào)更是極少使用。映射INTA#~INTD#到PIC/IOAPIC IRQ的機(jī)制稱為“Swizzling”,它在不同情況下實(shí)現(xiàn)機(jī)制有很大不同,我們分別來(lái)看看。

2

PCI/PCIe擴(kuò)展插槽

對(duì)主板上的PCI擴(kuò)展插槽,用戶插入什么設(shè)備,插在哪個(gè)槽內(nèi)都不能在出廠時(shí)確定。我們這里要盡量考慮平衡原則和效率原則。我們將所有插槽的INTA#~INTD#分成四組串聯(lián)起來(lái)如何?這樣離得最近的Slot 1高興了,每個(gè)都是我優(yōu)先!萬(wàn)一有個(gè)用戶把重要的網(wǎng)卡插在slot 4,效率會(huì)嚴(yán)重下降。在充分考慮到PCI設(shè)備絕大多數(shù)都是單功能設(shè)備(僅使用INTA#信號(hào),很少使用INTB#和INTC#信號(hào),而INTD#信號(hào)更是極少使用),PCI SIG推薦PCI to PCI bridge后slot連接關(guān)系應(yīng)該組成如下圖:

圖片

即Slot1 INTA#->Slot2 INT B#->Slot3 INTC#->Slot4 INTD#等等。這樣,當(dāng)然slot 1還是占些小便宜,但其他slot也有很大機(jī)會(huì)獨(dú)占某個(gè)中斷線(想想為什么)。這種Swizzling是主板設(shè)計(jì)硬件連線決定的,不由主板固件決定,但是主板固件需要了解這些信息。

PCI橋則將它下面的轉(zhuǎn)換結(jié)果INTx轉(zhuǎn)化為本身的INTx,接入芯片組內(nèi)部的Swizzling。PCIe的插槽是1:1對(duì)應(yīng)PCIe root port,PCIe root port可以看作PCI橋,等同處理。

3

芯片組內(nèi)部

PCI SIG并沒(méi)有規(guī)定芯片組內(nèi)部Swizzling的規(guī)則,而芯片組內(nèi)部設(shè)備在出廠時(shí)就已經(jīng)確定了,芯片是不是可以hard code一個(gè)中斷路由關(guān)系呢?實(shí)際上有些芯片組就是這么做的,在芯片硬件說(shuō)明書(shū)中注明各種PCI設(shè)備INTx到IRQ的關(guān)系表,BIOS只要照著報(bào)告給OS就可以了。而Intel芯片組提供了更靈活的方式,BIOS可以根據(jù)需要設(shè)置中斷路由,以適應(yīng)不同的應(yīng)用市場(chǎng)。不同的芯片組設(shè)置方法不同,有些給出了幾組應(yīng)用場(chǎng)景,BIOS可以根據(jù)需要選擇一種,而在很早開(kāi)始南橋芯片組ICH/PCH就給出了一種更靈活的方式,就是我們前文提到的PIRQ。簡(jiǎn)單來(lái)說(shuō)就是在ICH/PCH內(nèi)部加入了幾個(gè)新的寄存器:IR寄存器組。IR寄存器組用于設(shè)定芯片組內(nèi)部PCI設(shè)備中斷INTA#-H# 連接到具體PIC/IOAPIC的哪個(gè)引腳上。這樣BIOS就可以根據(jù)面向市場(chǎng)不同重新繪制中斷路由圖了,好方便!

OS接口

班長(zhǎng)小張終于給小朋友排好了座位,他怎么把這些信息告訴各個(gè)老師呢?一個(gè)個(gè)告訴太麻煩,不如把所有情況打印成一張表貼子講臺(tái)上。我們的固件也是通過(guò)表告訴OS的,這里有兩種表。

1

MP table

有感于DOS階段中斷設(shè)置的混亂,微軟在推出Win95時(shí)聯(lián)合Intel提出了PCI Interrupt Routing Table的數(shù)據(jù)結(jié)構(gòu),它的作用就是用來(lái)描述在使用8259中斷控制器的系統(tǒng)下,PCI中斷的路由關(guān)系。它和其他一些表構(gòu)成了傳統(tǒng)的MP table。它只在PIC模式下起作用,而PIC模式已經(jīng)被淘汰,所以它的具體結(jié)構(gòu)我們這里略過(guò)。這里要特別指出的是,固件在提交PIRQ table時(shí)要同步更新PCI配置空間的Interrupt line寄存器,如圖籃圈部分:

圖片

2

ACPI table

在APIC模式下,固件應(yīng)該通過(guò)ACPI的_PRT(PCI Routing Table) method返回主板上無(wú)論硬件還是固件設(shè)定的中斷路由信息。ACPI spec有示例,但內(nèi)容比較單薄。我們來(lái)看一個(gè)Intel開(kāi)源硬件平臺(tái)Minnowboard MAX固件是怎么處理的。

_PRT代碼如下:

Method(_PRT,0)

{

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

  Return (PR00) // PIC Mode

} // end _PRT

這里判斷如果是PIC模式,返回PR00,如果是APIC模式返回AR00表。PR00和AR00其實(shí)是同一個(gè)中斷路由關(guān)系的兩個(gè)view,其實(shí)質(zhì)內(nèi)容是一致的。我們單看一下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 },

//

。。。。

}

通過(guò)這張大表,OS才能確定主板PCI設(shè)備和IRQ的連接關(guān)系。

其他中斷信息

除了中斷路由表之外,還有很多和中斷相關(guān)的信息也需要通過(guò)ACPI向OS報(bào)告

1. LAPIC和IOAPIC

固件需要在ACPI的MADT表里向OS報(bào)告所有的LAPIC和IOAPIC。LAPIC默認(rèn)映射到物理地是0xFEE00000(想想為什么不會(huì)互相沖突?),不需要報(bào)告,只要LAPIC ID即可。需要特別說(shuō)明的是,因?yàn)锳PIC ID不一定從0開(kāi)始,也不一定連續(xù),所以其值要?jiǎng)討B(tài)枚舉而得。同時(shí)由于很多OS在調(diào)度processor時(shí)是挨個(gè)調(diào)度的,而HT的兩個(gè)thread的APIC ID往往連續(xù),同時(shí)被調(diào)度效能大大降低,Intel推薦HT的兩個(gè)thread隔開(kāi)報(bào)告。如果多個(gè)CPU socket,情況又有變化,這是系統(tǒng)調(diào)優(yōu)的手段之一,這里不再贅述。

IOAPIC的地址和ID都由固件指定,必選準(zhǔn)確的在MADT里向OS報(bào)告,每個(gè)IOAPIC的GSI偏移量也要報(bào)告。

2. SCI

在Intel的芯片組中,SCI通常缺省占用了中斷9。它的值可以在芯片組的寄存器中修改,并需要通過(guò)FADT報(bào)告OS。因?yàn)檫@是個(gè)特殊指定的中斷,所以在MADT中還要通過(guò)interrupt override節(jié)予以保留。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5273

    瀏覽量

    119661
  • 中斷處理
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    10942
  • 中斷控制器
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    9425
  • PCI協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    5484
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    98

    瀏覽量

    5223
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)amc1200輸出voutp和Voutn怎么直接連接到28335的AD采集引腳上

    amc1200輸出voutp和Voutn怎么直接連接到28335的AD采集引腳上
    發(fā)表于 08-12 08:28

    PIC32MZEF未連接引腳

    嗨,我已經(jīng)把我的未連接引腳通過(guò)電阻連接到接地。現(xiàn)在我想把這些引腳中的一個(gè)配置為SCK??梢园堰@個(gè)引腳
    發(fā)表于 01-10 15:38

    無(wú)法連接到PIC32MX

    32 MX目標(biāo)電壓檢測(cè)到不能連接到目標(biāo)DE副設(shè)備。未能獲得設(shè)備IDPIC32 MX530F128H i-PTIT不與ICD3或?qū)嶋HICE3.3 VDC到0.1和0.01uF陶瓷到Pin
    發(fā)表于 02-28 13:43

    請(qǐng)問(wèn)是否有必要將數(shù)據(jù)引腳連接到外部中斷?

    是否存在中斷驅(qū)動(dòng)的示例,用于將PS/2鍵盤(pán)/鼠標(biāo)連接到PIC微控制器?對(duì)于硬件,我已經(jīng)指的是亞當(dāng)ChaveSeCurruryLy1。我已經(jīng)把PS/2時(shí)鐘連接到了IMT0(5V寬容)
    發(fā)表于 06-19 08:36

    PIC16F639上的SPI端口也可以用來(lái)連接外部設(shè)備嗎?

    PIC16F639上的SPI端口內(nèi)部連接到AFE,并且也暴露在端口C引腳上。如果正在使用AFE,SPI端口也可以用來(lái)連接外部設(shè)備嗎?
    發(fā)表于 09-24 10:36

    PIC32是否使用Eithernet引腳使用內(nèi)部生成的中斷?

    連接到EREFCLK/AERXCLK。這使我激動(dòng),哪個(gè)是更好的選擇。我推測(cè)中斷PIN啟用設(shè)計(jì)會(huì)更好,但我想知道PIC32是否使用Eithernet引腳使用內(nèi)部生成的
    發(fā)表于 10-16 15:43

    怎么通過(guò)USB連接pic32連接到API設(shè)備?

    您好,我需要通過(guò)USB USB連接pic32連接到API設(shè)備。我使用程序“PIC32_ESK_USB_Host_Simple_Demo”,
    發(fā)表于 10-31 07:20

    如何計(jì)數(shù)這個(gè)引腳上的振蕩?

    我正在用PIC18F45 K20工作。我有一個(gè)板與外部振蕩器連接到RA2。這并不打算是一個(gè)校準(zhǔn)引腳,但我被要求一些如何計(jì)數(shù)這個(gè)引腳上的振蕩。我可以將外部振蕩器配置為時(shí)鐘RA2,但我很困
    發(fā)表于 11-04 10:51

    PIC24引腳上使用了內(nèi)部下拉功能

    在我的生活中,我第一次在PIC24(PIC24FV64KA302)引腳上使用了內(nèi)部下拉功能——它連接到松下公司的PIR傳感器,基本上是開(kāi)放式收集器,但PNP類型(即,空閑時(shí)打開(kāi),打開(kāi)時(shí)
    發(fā)表于 04-13 09:24

    SPI是否應(yīng)該連接到j11引腳上的VDDIO和VDDI2C引腳?

    我讀到如果用戶想把SPI連接到另一個(gè)MCU,這是可以的。我想寫(xiě)它是否應(yīng)該連接到j11引腳上的VDDIO和VDDI2C引腳。我想與 SPI 通信。
    發(fā)表于 03-15 06:31

    PCI中斷機(jī)制分析

    PCI中斷機(jī)制分析:PCI 總線有四條中斷線,所有PCI 設(shè)備共同使用這四條線向系統(tǒng)申請(qǐng)
    發(fā)表于 06-28 19:21 ?26次下載

    PIC單片機(jī)引腳中斷程序的設(shè)計(jì)技巧

    PIC單片機(jī)引腳中斷程序的設(shè)計(jì)技巧   所有的中檔系列PIC單片機(jī),PORTB端口最高的4個(gè)引腳(RB7~RB4)在設(shè)為輸入模式
    發(fā)表于 10-30 08:07 ?1492次閱讀

    PCI總線的中斷信號(hào)與中斷控制器的連接關(guān)系

    在一些嵌入式處理器系統(tǒng)中,這個(gè)問(wèn)題較易解決。因?yàn)榍度胧教幚砥飨到y(tǒng)很清楚在當(dāng)前系統(tǒng)中存在多少個(gè)PCI設(shè)備,這些PCI設(shè)備使用了哪些中斷資源。在
    的頭像 發(fā)表于 04-11 09:12 ?6440次閱讀

    簡(jiǎn)述PCI總線的中斷機(jī)制

    PCI總線的中斷機(jī)制 PCI總線使用INTA#、INTB#、INTC#和INTD#信號(hào)向處理器發(fā)出中斷請(qǐng)求。這些中斷請(qǐng)求信號(hào)為低電平有效,并
    的頭像 發(fā)表于 07-18 10:10 ?2761次閱讀

    連接引腳上錫不良分析

    不斷變革創(chuàng)新,就會(huì)充滿青春活力;否則,就可能會(huì)變得僵化?!璧赂韶洉r(shí)間來(lái)了,關(guān)注小欣本期分享,我們一起來(lái)學(xué)習(xí)吧!連接引腳上錫不良主要表現(xiàn)為引腳下表面與焊點(diǎn)相接不良或不相接,那么導(dǎo)致失效的原因究竟
    的頭像 發(fā)表于 12-16 08:03 ?2175次閱讀
    <b class='flag-5'>連接</b>器<b class='flag-5'>引腳上</b>錫不良分析