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

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

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

PCI Express體系結(jié)構(gòu)導(dǎo)讀筆記之寄存器和配置

jf_78858299 ? 來源:布魯斯的讀書圈 ? 作者: BruceL ? 2023-01-30 15:34 ? 次閱讀

之前調(diào)試了幾個(gè)PCI網(wǎng)卡驅(qū)動(dòng),雖然功能沒什么問題,但驅(qū)動(dòng)中調(diào)用的某些內(nèi)核提供的PCI相關(guān)的接口一直沒搞太清楚,所以最近準(zhǔn)備深入研究一把。

PCI設(shè)備的識別及配置方式

PCI總線使用單端并行數(shù)據(jù)總線,采用地址譯碼方式進(jìn)行數(shù)據(jù)傳遞,而采用ID譯碼方式進(jìn)行配置信息(比如配置某個(gè)PCI設(shè)備的物理地址)的傳遞。其中地址譯碼方式使用地址信號,而ID譯碼方式使用PCI設(shè)備的ID號,包括Bus Number、Device Number、Function Number和Register Number。Linux系統(tǒng)中使用了Bus Number、Device Number和Function Number區(qū)分不同的設(shè)備;對于有兩個(gè)接口的網(wǎng)卡,Linux會(huì)按照兩個(gè)設(shè)備處理,因?yàn)檫@兩個(gè)接口會(huì)呈現(xiàn)出不同的Function Number。

Posted和Non-Posted傳送方式

PCI總線規(guī)定了兩類數(shù)據(jù)傳送方式,分別是Posted和Non-Posted數(shù)據(jù)傳送方式。又分別對應(yīng)了Posted和Non-Posted總線事務(wù)。

Posted總線事務(wù)指PCI主設(shè)備向PCI目標(biāo)設(shè)備進(jìn)行數(shù)據(jù)傳遞時(shí),當(dāng)數(shù)據(jù)到達(dá)PCI橋后,即由PCI橋接管來自上游總線的總線事務(wù),并將其轉(zhuǎn)發(fā)到下游總線。采用這種數(shù)據(jù)傳遞方式,在數(shù)據(jù)還沒有到達(dá)最終的目的地之前,PCI總線就可以結(jié)束當(dāng)前總線事務(wù),從而在一定程度上解決了PCI總線的擁塞問題,所以這種方式的PCI總線利用率較高。只有存儲(chǔ)器寫請求可以采用Posted總線事務(wù),簡稱為PMW(Posted Memory Write)。

Non-Posted總線事務(wù)是指PCI主設(shè)備向PCI目標(biāo)設(shè)備進(jìn)行數(shù)據(jù)傳遞時(shí),數(shù)據(jù)必須到達(dá)最終目的地之后,才能結(jié)束當(dāng)前總線事務(wù)的一種數(shù)據(jù)傳遞方式。存儲(chǔ)器讀請求、I/O讀寫請求、配置讀寫請求只能采用Non-Posted總線事務(wù)。

中斷請求和數(shù)據(jù)傳送的同步問題(MSI中斷機(jī)制不存在這個(gè)問題)

在PCI總線中,INTx信號是一個(gè)異步信號。所謂異步,是指INTx信號的傳遞并不與PCI總線的數(shù)據(jù)傳送同步。假設(shè)某個(gè)PCI設(shè)備在使用DMA方式將一組數(shù)據(jù)寫入存儲(chǔ)器,該設(shè)備在最后一個(gè)數(shù)據(jù)離開自己的發(fā)送FIFO時(shí),即認(rèn)為DMA操作已經(jīng)完成。此時(shí)這個(gè)設(shè)備將通過INTx信號,通知處理器DMA寫操作完成。

但是,當(dāng)處理器收到INTx信號時(shí),并不意味著PCI設(shè)備已經(jīng)將數(shù)據(jù)寫入存儲(chǔ)器中,因?yàn)镻CI設(shè)備的數(shù)據(jù)傳遞需要經(jīng)過PCI橋/HOST主橋,最終才能到達(dá)存儲(chǔ)器。

PCI總線提供了以下兩種方法解決這個(gè)同步問題。

(1)PCI設(shè)備保證在數(shù)據(jù)到達(dá)目的地之后,再提交中斷請求。具體來說,PCI設(shè)備在提交中斷請求之前,向DMA寫的數(shù)據(jù)區(qū)域發(fā)出一個(gè)讀請求。PCI總線的“序”機(jī)制,保證了在這個(gè)存儲(chǔ)器讀請求完成前,會(huì)將以前發(fā)出的DMA數(shù)據(jù)寫入存儲(chǔ)器。PCI總線規(guī)范要求HOST主橋和PCI橋必須保證這種讀操作可以刷新寫操作。但問題是,沒有多少芯片設(shè)計(jì)者愿意提供這種機(jī)制,因?yàn)檫@將極大地增加他們的設(shè)計(jì)難度。除此之外,使用這種方法也將增加中斷請求的延時(shí)。

(2)中斷服務(wù)程序在使用“PCI設(shè)備寫入存儲(chǔ)器”的這些數(shù)據(jù)之前,需要對這個(gè)PCI設(shè)備進(jìn)行讀操作。這個(gè)讀操作也可以強(qiáng)制將數(shù)據(jù)最終寫入存儲(chǔ)器。這種方法也是利用了PCI總線的傳送序規(guī)則,與第1種方法類似。只是這種方法使用軟件方式,而第1種方式使用硬件方式。這是絕大多數(shù)處理器系統(tǒng)采用的方法。在中斷服務(wù)程序中,往往都是先讀取PCI設(shè)備的中斷狀態(tài)寄存器,判斷中斷產(chǎn)生原因之后,才對PCI設(shè)備寫入的數(shù)據(jù)進(jìn)行操作。這個(gè)讀取中斷狀態(tài)寄存器的過程,一方面可以獲得設(shè)備的中斷狀態(tài),另一方面可以保證DMA寫的數(shù)據(jù)(在被CPU讀取前)已經(jīng)到達(dá)存儲(chǔ)器。

PCI配置空間中的幾個(gè)寄存器的作用

(1)Cache Line Size寄存器:記錄HOST處理器使用的Cache Line長度。在PCI總線中和Cache相關(guān)的總線事務(wù),如存儲(chǔ)器寫并無效和Cache多行讀等總線事務(wù)需要使用這個(gè)寄存器。該寄存器由系統(tǒng)軟件設(shè)置,但是在PCI設(shè)備的運(yùn)行過程中,只有其硬件邏輯才會(huì)使用該寄存器。對于PCIe設(shè)備,該寄存器的值無意義,因?yàn)镻CIe設(shè)備在進(jìn)行數(shù)據(jù)傳送時(shí),在其報(bào)文中含有一次數(shù)據(jù)傳送的大小,PCIe總線控制器可以使用這個(gè)“大小”,判斷數(shù)據(jù)區(qū)域與Cache Line的對應(yīng)關(guān)系。

(2)Interrupt Line寄存器:由系統(tǒng)軟件對PCI設(shè)備進(jìn)行配置時(shí)寫入,記錄當(dāng)前PCI設(shè)備使用的中斷向量號。設(shè)備驅(qū)動(dòng)程序可以通過這個(gè)寄存器,判斷當(dāng)前PCI設(shè)備使用處理器中的哪個(gè)中斷向量號,并將驅(qū)動(dòng)程序中的中斷服務(wù)例程注冊到操作系統(tǒng)中。但是,目前在絕大多數(shù)處理器系統(tǒng)中,并沒有使用該寄存器存放PCI設(shè)備使用的中斷向量號。

(3)Base Address Register 0~5 寄存器:簡稱為BAR寄存器。保存的是PCI設(shè)備在PCI總線域中的基地址,由操作系統(tǒng)配置。在PCI設(shè)備復(fù)位之后,該寄存器將存放PCI設(shè)備需要使用的基址空間大小、這段空間是I/O空間還是存儲(chǔ)器空間、如果是存儲(chǔ)器空間是否可預(yù)取等。

系統(tǒng)軟件對PCI總線進(jìn)行配置時(shí),先獲取BAR寄存器中的初始化信息,之后根據(jù)處理器系統(tǒng)的配置,將合理的基地址寫入相應(yīng)的BAR寄存器中。系統(tǒng)軟件還可以使用該寄存器獲得PCI設(shè)備使用的BAR空間的長度,方法是向BAR寄存器中寫入0xFFFFFFFF,然后再讀取該寄存器。

(4)Command寄存器:在初始化時(shí),其值為0,此時(shí)這個(gè)PCI設(shè)備除了能夠接收配置請求總線事務(wù)外,不能接收任何存儲(chǔ)器或者I/O請求。在Linux系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序調(diào)用pci_enable_device函數(shù)(也可以是pci_enable_device_mem-> pci_enable_device_flags-> do_pci_enable_device-> pcibios_enable_device-> pci_enable_resources-> pci_write_config_word),使能該寄存器的I/O和Memory Space位之后,才能訪問該設(shè)備的存儲(chǔ)器或者I/O地址空間。

另外,該寄存器中還有Bus Master位表示該設(shè)備是否可以作為主設(shè)備(Linux驅(qū)動(dòng)程序中調(diào)用pci_set_master函數(shù),將此位設(shè)置為1,表示設(shè)備可作為master)。寄存器中的Interrupt Disable位默認(rèn)為0,為1時(shí)表示不允許該設(shè)備使用INTx信號提交中斷請求,當(dāng)PCI設(shè)備使用MSI中斷方式時(shí),該位將被設(shè)置為1(Linux驅(qū)動(dòng)程序中調(diào)用的函數(shù)為pci_alloc_irq_vectors-> pci_alloc_irq_vectors_affinity-> __pci_enable_msi_range-> msi_capability_init-> pci_intx_for_msi-> pci_intx)。

Linux的PCI設(shè)備驅(qū)動(dòng)程序中調(diào)用的dma_set_mask_and_coherent函數(shù)有什么作用

Linux的PCI設(shè)備驅(qū)動(dòng)中一般都會(huì)調(diào)用諸如dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64))之類的接口。這是用來通知內(nèi)核當(dāng)前設(shè)備支持的DMA訪問的尋址能力,作用是限制內(nèi)核為當(dāng)前設(shè)備分配的內(nèi)存地址范圍。比如之前的例子就表示當(dāng)前設(shè)備支持64位尋址,并且在此范圍內(nèi)支持一致性DMA訪問。

Linux的PCI設(shè)備驅(qū)動(dòng)程序中調(diào)用的pci_disable_link_state函數(shù)有什么作用

有些PCI設(shè)備的驅(qū)動(dòng)中會(huì)調(diào)用諸如pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM)之類的接口。其作用是設(shè)置PCIe設(shè)備的擴(kuò)展配置空間中的Link Control寄存器。具體到前例,是把Link Control寄存器中的“ASPM Control”字段和“Enable clkreq”字段設(shè)置為0,作用分別是禁止PCI設(shè)備進(jìn)入L0s和L1(低功耗)狀態(tài)以及禁止CLKREQ功能(相當(dāng)于禁止設(shè)備的時(shí)鐘管理功能,起到性能優(yōu)先的效果,不考慮省電;具體效果還取決于內(nèi)核中CONFIG_PCIEASPM_XXXX相關(guān)的配置)。

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

    關(guān)注

    3

    文章

    300

    瀏覽量

    27305
  • PCI
    PCI
    +關(guān)注

    關(guān)注

    4

    文章

    659

    瀏覽量

    130075
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2855

    瀏覽量

    87864
收藏 人收藏

    評論

    相關(guān)推薦

    淺析PCI體系結(jié)構(gòu)

    PCI總線作為處理系統(tǒng)的局部總線,主要目的是為了連接外部設(shè)備,而不是作為處理的系統(tǒng)總線連接Cache和主存儲(chǔ)。但是PCI總線、系統(tǒng)總線
    發(fā)表于 08-06 06:02

    ARM體系結(jié)構(gòu)寄存器詳解

    ARM寄存器ARM微處理共有37個(gè)32位寄存器,其中31個(gè)為通用寄存器,6個(gè)為狀態(tài)寄存器。但是這些寄存
    發(fā)表于 08-25 15:23

    Microarchitecture指令集體系結(jié)構(gòu)

    第二章 ARM微處理概述與編程模型ARM體系結(jié)構(gòu)及其發(fā)展歷史處理體系結(jié)構(gòu)處理微架構(gòu) Microarchitecture指令集
    發(fā)表于 12-14 07:13

    ARM體系結(jié)構(gòu)標(biāo)準(zhǔn)配置

    ARM體系結(jié)構(gòu)包含大量功能,這些功能被描述為可選或定義的實(shí)施。來自平臺(tái)操作系統(tǒng)供應(yīng)商的反饋表明這種可變性對于系統(tǒng)代碼的開發(fā)人員來說是一個(gè)實(shí)質(zhì)性的問題,由于操作系統(tǒng)必須滿足各種不同的系統(tǒng)配置,導(dǎo)致開發(fā)
    發(fā)表于 08-08 07:40

    ARM通用中斷控制體系結(jié)構(gòu)規(guī)范GIC體系結(jié)構(gòu)版本3和版本4

    本手冊中的體系結(jié)構(gòu)描述使用了與Armv8體系結(jié)構(gòu)相同的術(shù)語。有關(guān)該術(shù)語的更多信息,請參閱Armv8-A架構(gòu)配置文件Armv8 Arm?架構(gòu)參考手冊A部分的介紹。此外,在適當(dāng)?shù)那闆r下使用AArch64
    發(fā)表于 08-11 07:45

    ARM微處理體系結(jié)構(gòu)

    ARM微處理體系結(jié)構(gòu): 2.2.1 數(shù)據(jù)類型 2.2.2 ARM微處理的工作狀態(tài) 2.2.3 ARM體系結(jié)構(gòu)的存儲(chǔ)
    發(fā)表于 06-17 00:24 ?42次下載

    FPGA在PCI Express總線接口中的應(yīng)用

    PCIE(PCI express)是用來互聯(lián)諸如計(jì)算機(jī)和通信平臺(tái)應(yīng)用中外圍設(shè)備的第三代高性能I/0總線。PCIE體系結(jié)構(gòu)繼承了第二代總線體系結(jié)構(gòu)最有用的特點(diǎn),采用與
    發(fā)表于 10-17 16:14 ?1092次閱讀
    FPGA在<b class='flag-5'>PCI</b> <b class='flag-5'>Express</b>總線接口中的應(yīng)用

    用于基于超級體系結(jié)構(gòu)設(shè)備的PCI Express總線接口資料免費(fèi)下載

    從簡單的寄存器訪問到移動(dòng)數(shù)百GB的數(shù)據(jù),UltraScale?體系結(jié)構(gòu)中最新的PCI Express集成塊為下一代系統(tǒng)提供了多種連接。
    發(fā)表于 02-19 11:53 ?7次下載
    用于基于超級<b class='flag-5'>體系結(jié)構(gòu)</b>設(shè)備的<b class='flag-5'>PCI</b> <b class='flag-5'>Express</b>總線接口資料免費(fèi)下載

    采用PCI9052芯片的配置寄存器及加載其驅(qū)動(dòng)程序的開發(fā)

    的大小為256字節(jié),分為頭標(biāo)區(qū)和設(shè)備有關(guān)區(qū)。直接影響設(shè)備特性的配置寄存器在頭標(biāo)區(qū),其他部分則因設(shè)備而異。PCI總線的配置空間通常與PCI接口
    發(fā)表于 04-04 18:14 ?1584次閱讀
    采用<b class='flag-5'>PCI</b>9052芯片的<b class='flag-5'>配置</b><b class='flag-5'>寄存器</b>及加載其驅(qū)動(dòng)程序的開發(fā)

    ARM體系結(jié)構(gòu)的基本特性介紹

    01ARM匯編指令 操作系統(tǒng)中硬件相關(guān)的部分集中體現(xiàn)在匯編指令和對寄存器的操作中,因此我們對ARM體系結(jié)構(gòu)的介紹也圍繞ARMv8-A的匯編指令和寄存器來展開。 處理架構(gòu)是處理
    的頭像 發(fā)表于 09-26 10:04 ?6476次閱讀
    ARM<b class='flag-5'>體系結(jié)構(gòu)</b>的基本特性介紹

    淺談PCI Express體系結(jié)構(gòu)(四)

    PCI總線的中斷機(jī)制PCI總線使用INTA#、INTB#、INTC#和INTD#信號向處理發(fā)出中斷請求。這些中斷請求信號為低電平有效,并與處理的中斷控制
    發(fā)表于 12-17 18:26 ?10次下載
    淺談<b class='flag-5'>PCI</b> <b class='flag-5'>Express</b><b class='flag-5'>體系結(jié)構(gòu)</b>(四)

    PowerPC的發(fā)展與體系結(jié)構(gòu)概述

    第一部分 PowerPC ? 精簡指令集計(jì)算機(jī)(RISC)簡介 PowerPC 體系結(jié)構(gòu)是一種精減指令集計(jì)算機(jī)(Reduced Instruction Set Computer,RISC)體系結(jié)構(gòu)
    的頭像 發(fā)表于 06-18 20:02 ?3808次閱讀
    PowerPC的發(fā)展與<b class='flag-5'>體系結(jié)構(gòu)</b>概述

    PCI Express體系結(jié)構(gòu)導(dǎo)讀筆記橋和中斷的基礎(chǔ)知識

    1. PCI設(shè)備能直接使用的地址是PCI總線域的地址,處理能夠直接使用的是存儲(chǔ)域的地址,PCI主橋負(fù)責(zé)在這兩種地址之間轉(zhuǎn)換。當(dāng)然為了方便
    的頭像 發(fā)表于 01-30 15:38 ?672次閱讀
    <b class='flag-5'>PCI</b> <b class='flag-5'>Express</b><b class='flag-5'>體系結(jié)構(gòu)</b><b class='flag-5'>導(dǎo)讀</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b>橋和中斷的基礎(chǔ)知識

    PCI Express體系結(jié)構(gòu)導(dǎo)讀筆記基本連接方式

    1. 每一個(gè)PCI設(shè)備都有獨(dú)立的配置空間,在配置空間中含有該設(shè)備在PCI總線中使用的基地址。系統(tǒng)軟件可以動(dòng)態(tài)配置這個(gè)基地址,保證每一個(gè)
    的頭像 發(fā)表于 01-30 15:39 ?814次閱讀

    寄存器間接尋址和寄存器尋址的區(qū)別

    寄存器間接尋址和寄存器尋址是計(jì)算機(jī)體系結(jié)構(gòu)中兩種重要的尋址方式,它們在指令執(zhí)行過程中起著關(guān)鍵作用。下面將從定義、原理、特點(diǎn)、應(yīng)用場景以及區(qū)別等方面對這兩種尋址方式進(jìn)行詳細(xì)闡述。
    的頭像 發(fā)表于 10-05 17:13 ?370次閱讀