日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--7.PCI設(shè)備( 三 )



6.5.2PCI-PCI橋接器:PCI配置循環(huán)及PCI總線編號方式





圖6.3 0類型PCI配置循環(huán)






圖6.4 1類型PCI配置循環(huán)

為了讓CPU上運(yùn)行的PCI初始化代碼能訪問位于分支PCI總線上的設(shè)備 , 必須為橋接器提供某種機(jī)制以便它可以決定是否將配置循環(huán)從主干接口傳遞到其二級接口 。循環(huán)是出現(xiàn)在PCI總線上的一個(gè)地址 。PCI 標(biāo)準(zhǔn)定義了兩種PCI配置尋址格式;類型0和類型1;它們分別如圖6.3及6.4所示 。類型0 PCI配置循環(huán)不包含總線序號,同時(shí)在此PCI總線上對應(yīng)于這個(gè)PCI配置地址的所有PCI設(shè)備都會(huì)來對它們進(jìn)行解釋 。類型0 配置循環(huán)的11 位到31位用來進(jìn)行PCI設(shè)備選擇 。有種設(shè)計(jì)方式是讓每位代表系統(tǒng)中一個(gè)不同的設(shè)備 。這時(shí)11位對應(yīng)PCI槽0中的PCI設(shè)備而12位標(biāo)識槽1中的設(shè)備等等 , 如此類推 。另外一種方式是直接將設(shè)備的槽號寫入到位31到11中 。系統(tǒng)使用哪種機(jī)制依賴于系統(tǒng)PCI內(nèi)存控制器 。

類型1 PCI配置循環(huán)包含一個(gè)PCI總線序號,同時(shí)這種配置循環(huán)將被除橋接器外的所有PCI設(shè)備所忽略 。所有發(fā)現(xiàn)類型1 配置循環(huán)的PCI-PCI橋接器把它們看到的地址傳遞到各自的下級PCI總線 。至于PCI-PCI橋接器是否忽略類型1 配置循環(huán)或?qū)⑵鋫鬟f到PCI總線則依賴于PCI-PCI橋接器的配置方式 。每個(gè)PCI-PCI橋接器都擁有一個(gè)主干總線接口序號以及一個(gè)二級總線接口序號 。主干總線是那個(gè)離CPU最近的PCI總線而二級總線是離它稍遠(yuǎn)的PCI總線 。任何PCI-PCI橋接器還包含一個(gè)從屬總線序號 , 這是所有二級總線接口所橋接的PCI總線中序號最大的那個(gè) ?;蛘哒f這個(gè)從屬總線序號是PCI-PCI橋接器向下連接中PCI總線的最大序號 。當(dāng)PCI-PCI橋接器看到類型1 PCI配置循環(huán)時(shí)它將進(jìn)行如下操作:


如果此總線序號不在橋接器的二級總線序號和從屬總線序號之間則忽略掉它 。

如果此總線序號與橋接器的二級總線序號相同則將其轉(zhuǎn)換成類型0 配置命令 。

如果此總線序號位于橋接器的二級總線序號與從屬總線序號之間則將它不作改變的傳遞到二級總線接口中 。
所以如果想尋址PCI-PCI配置例4中總線3上的設(shè)備1 , 我們繼續(xù)從CPU中產(chǎn)生一個(gè)類型1 配置命令 。橋接器1將其傳遞給總線1 。橋接器2雖然忽略它但會(huì)將其轉(zhuǎn)換成一個(gè)類型0 配置命令并送到總線3上 , 在那里設(shè)備1將作出相應(yīng)反應(yīng) 。

PCI配置中總線序號由操作系統(tǒng)來分配 。但是序號分配策略必須遵循對系統(tǒng)中所有PCI-PCI橋接器都正確的描敘:

“位于PCI-PCI橋接器后所有的PCI總線必須位于二級總線序號和從屬總線序號之間” 。

如果這個(gè)規(guī)則被打破 , 則PCI-PCI橋接器將不能正確的傳遞與轉(zhuǎn)換類型1 PCI配置循環(huán),同時(shí)系統(tǒng)將找不到或者不能正確地初始化系統(tǒng)中的PCI設(shè)備 。為了滿足這個(gè)序號分配策略 , Linux以特殊的順序配置這些特殊的設(shè)備 。PCI-PCI總線序號分配一節(jié)詳細(xì)描敘了Linux的PCI橋接器與總線序號分配策略 。


6.6Linux PCI 初始化過程
Linux中的PCI初始化代碼邏輯上可分成三個(gè)部分:


PCI 設(shè)備驅(qū)動(dòng)
這個(gè)偽設(shè)備驅(qū)動(dòng)程序?qū)目偩€0開始搜索PCI系統(tǒng)并定位系統(tǒng)中所有的PCI設(shè)備與橋接器 。它將建立起一個(gè)描敘系統(tǒng)拓?fù)浣Y(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)鏈表 。另外它還為所有的橋接器進(jìn)行編號 。

PCI BIOS
這個(gè)軟件層提供了在bib-pci-bios定義中描敘的服務(wù) 。即使Alpha AXP沒有BIOS服務(wù) , Linux核心也將為它提供具有相同功能的代碼 。

PCI Fixup
系統(tǒng)相關(guān)補(bǔ)丁代碼將整理PCI初始化最后階段的一些系統(tǒng)相關(guān)事物 。

6.6.1Linux 核心PCI數(shù)據(jù)結(jié)構(gòu)



圖6.5 Linux核心PCI數(shù)據(jù)結(jié)構(gòu)


Linux核心初始化PCI系統(tǒng)時(shí)同時(shí)也建立了反應(yīng)系統(tǒng)中真實(shí)PCI拓?fù)涞臄?shù)據(jù)結(jié)構(gòu) 。圖6.5顯示了圖6.1所標(biāo)識的PCI示例系統(tǒng)中數(shù)據(jù)結(jié)構(gòu)間關(guān)系 。每個(gè)PCI設(shè)備(包括PCI-PCI橋接器)用一個(gè)pci_dev數(shù)據(jù)結(jié)構(gòu)來描敘 。每個(gè)PCI總線用一個(gè)pci_bus數(shù)據(jù)結(jié)構(gòu)來描敘 。這樣系統(tǒng)中形成了一個(gè)PCI總線樹 , 每棵樹上由一些子PCI設(shè)備組成 。由于PCI總線僅能通過PCI-PCI橋接器(除了主干PCI總線0)存取 , 所以pci_bus結(jié)構(gòu)中包含一個(gè)指向PCI-PCI橋接器的指針 。這個(gè)PCI設(shè)備是PCI總線的父PCI總線的子設(shè)備 。

推薦閱讀