配置空間和地址

每個PCIe設備,有這么一段空間,Host軟件可以讀取它獲得該設備的一些信息,也可以通過它來配置該設備,這段空間就叫做PCIe的配置空間。不同于每個設備的其它空間,PCIe設備的配置空間是協(xié)議規(guī)定好的,哪個地方放什么內(nèi)容,都是有定義的。PCI或者PCI-X時代就有配置空間的概念,那時的配置空間如下:

圖6.1

整個配置空間就是一系列寄存器的集合,其中Type 0是Endpoint的配置,Type 1是Bridge(PCIe時代就是Switch)的配置,都由兩部分組成:64 Bytes的Header+192Bytes的Capability結(jié)構(gòu),后者是設備告訴Host它有多牛逼,都會什么絕活。

進入PCIe時代,PCIe能耐更大,192 Bytes不足以羅列它的絕活。為了保持后向兼容,又要不把絕活落下,怎么辦?很簡單,我擴展后者的空間,整個配置空間由256 Bytes擴展成4KB,前面256 Bytes保持不變:

圖6.2

PCIe有什么能耐(Capability)我們不看,我們先挑軟柿子捏,先看看只占64 Bytes的Configuration Header。

圖6.3

像Device ID,Vendor ID,Class Code和Revision ID,是只讀寄存器,PCIe設備通過這些寄存器告訴Host軟件,這是哪個廠家的設備、設備ID是多少、以及是什么類型的(網(wǎng)卡?顯卡?橋?)設備。

其它的我們暫時不看,我們看看重要的BAR(Base Address Register)。

對Endpoint Configuration(Type 0),提供了最多6個BAR,而對Switch(Type 1)來說,只有2個。BAR是干什么用的?

每個PCIe設備,都有自己的內(nèi)部空間,這部分空間如果開放給Host(軟件或者CPU)訪問,那么Host怎樣才能往這部分空間寫入數(shù)據(jù),或者讀數(shù)據(jù)呢?

我們知道,CPU只能直接訪問Host內(nèi)存(Memory)空間(或者IO空間,我們不考慮),不對PCIe等外設直接操作。怎么辦?記得皇帝身邊那個有根的太監(jiān)嗎?Root Complex,RC。RC可以為CPU分憂。

解決辦法是:CPU如果想訪問某個設備的空間,由于它不能(或者不屑)親自跟那些PCIe外設打交道,因此叫太監(jiān)RC去辦。比如,如果CPU想讀PCIe外設的數(shù)據(jù),先叫RC通過TLP把數(shù)據(jù)從PCIe外設讀到Host內(nèi)存,然后CPU從Host內(nèi)存讀數(shù)據(jù);如果CPU要往外設寫數(shù)據(jù),則先把數(shù)據(jù)在內(nèi)存中準備好,然后叫RC通過TLP寫入到PCIe設備。完美!

圖6.4

上圖例子中,最左邊虛線的表示CPU要讀Endpoint A的數(shù)據(jù),RC則通過TLP(經(jīng)歷Switch)數(shù)據(jù)交互獲得數(shù)據(jù),并把它寫入到系統(tǒng)內(nèi)存中,然后CPU從內(nèi)存中讀取數(shù)據(jù)(紫色箭頭所示),從而CPU間接完成對PCIe設備數(shù)據(jù)的讀取。

具體實現(xiàn)就是上電的時候,系統(tǒng)把PCIe設備開放的空間(系統(tǒng)軟件可見)映射到內(nèi)存空間,CPU要訪問該PCIe設備空間,只需訪問對應的內(nèi)存空間。RC檢查該內(nèi)存地址,如果發(fā)現(xiàn)該內(nèi)存空間地址是某個PCIe設備空間的映射,就會觸發(fā)其產(chǎn)生TLP,去訪問對應的PCIe設備,讀取或者寫入PCIe設備。

一個PCIe設備,可能有若干個內(nèi)部空間(屬性可能不一樣,比如有些可預讀,有些不可預讀)需要映射到內(nèi)存空間,設備出廠時,這些空間的大小和屬性都寫在Configuration BAR寄存器里面,然后上電后,系統(tǒng)軟件讀取這些BAR,分別為其分配對應的系統(tǒng)內(nèi)存空間,并把相應的內(nèi)存基地址寫回到BAR。(BAR的地址其實是PCI總線域的地址,CPU訪問的是存儲器域的地址,CPU訪問PCIe設備時,需要把總線域地址轉(zhuǎn)換成存儲器域的地址。)

圖6.5

如上圖例子,一個Native PCIe Endpoint,只支持Memory Map,它有兩個不同屬性的內(nèi)部空間要開放給系統(tǒng)軟件,因此,它可以分別映射到系統(tǒng)內(nèi)存空間的兩個地方;還有一個Legacy Endpoint,它既支持Memory Map,還支持IO Map,它也有兩個不同屬性的內(nèi)部空間,分別映射到系統(tǒng)內(nèi)存空間和IO空間。

來個例子,看一下一個PCIe設備,系統(tǒng)軟件是如何為其分配映射空間的。

圖6.6

上電時,系統(tǒng)軟件首先會讀取PCIe設備的BAR0,得到數(shù)據(jù):

圖6.7

然后系統(tǒng)軟件往該BAR0寫入全1,得到:

圖6.8

BAR寄存器有些bit是只讀的,是PCIe設備在出廠前就固定好的bit,寫全1進去,如果值保持不變,就說明這些bit是廠家固化好的,這些固化好的bit提供了這塊內(nèi)部空間的一些信息:

怎么解讀?低12沒變,表明該設備空間大小是4KB(2的12次方),然后低4位表明了該存儲空間的一些屬性(IO映射還是內(nèi)存映射,32bit地址還是64bit地址,能否預???做過單片機的人可能知道,有些寄存器只要一讀,數(shù)據(jù)就會清掉,因此,對這樣的空間,是不能預讀的,因為預讀會改變原來的值),這些都是PCIe設備在出廠前都設置好的,提供給系統(tǒng)軟件的信息。

然后系統(tǒng)軟件根據(jù)這些信息,在系統(tǒng)內(nèi)存空間找到這樣一塊地方來映射這4KB的空間,把分配的基地址寫入到BAR0:

圖6.9

從而最終完成了該PCIe空間的映射。一個PCIe設備可能有若干個內(nèi)部空間需要開放出來,系統(tǒng)軟件依次讀取BAR1,BAR2。。。,直到BAR5,完成所有內(nèi)部空間的映射。

上面主要講了Endpoint的BAR,Switch也有兩個BAR,今天不打算講,下節(jié)講TLP路由,再回過頭來講。繼續(xù)說配置空間。

前面說每個PCIe設備都有一個配置空間,其實這樣說是不準確的,而是每個PCIe設備至少有一個配置空間。一個PCIe設備,它可能具有多個功能(function),比如既能當硬盤,還能當網(wǎng)卡。每個功能對應一個配置空間。

在一個PCIe拓撲結(jié)構(gòu)里,一條總線下面可以掛幾個設備,而每個設備可以具有幾個功能,如下所示:

圖6.10

因此,在整個PCIe系統(tǒng)中,只要知道了Bus+Device+Function,就能找到對應的Function。尋址基本單元是功能(function),它的ID就由Bus+Device+Function組成 (BDF)。一個PCIe系統(tǒng),可以最多有256條Bus,每條Bus上可以掛最多32個Device,而每個Device最多又能實現(xiàn)8個Function,而每個Function對應著4KB的配置空間。上電的時候,這些配置空間都是需要映射到Host的內(nèi)存空間,因此,需要占用內(nèi)存空間是:256*32*8*4KB =256MB。在這個動輒4GB、8GB內(nèi)存的時代,256MB算不了什么。

系統(tǒng)軟件是如何讀取Configuration空間呢?不能通過BAR中的地址,為什么?別忘了BAR是在Configuration中的,你首先要讀取Configuration,才能得到BAR。前面不是系統(tǒng)為所有可能的Configuration預留了256MB內(nèi)存空間嗎?系統(tǒng)軟件想訪問哪個Configuration,只需指定相應Function對應的內(nèi)存空間地址,RC發(fā)現(xiàn)這個地址是Configuration映射空間,就會產(chǎn)生相應的Configuration Read TLP去獲得相應Function的Configuration。

再回想一下前面介紹的Configuration Read TLP的Header格式:

圖6.11

Bus Number + Device + Function就唯一決定了目標設備; Ext Reg Number + Register Number相當于配置空間的偏移。找到了設備,然后指定了配置空間的偏移,就能找到具體想訪問的配置空間的某個位置。

結(jié)束前,強調(diào)一下,只有RC才能發(fā)起Configuration的訪問請求,其他設備是不允許對別的設備進行Configuration讀寫的。

作者:idorax

鏈接:http://www.itdecent.cn/p/574e9a2cbc4e

來源:簡書

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容