2017年11月26日 星期日

PCI-to-PCI 橋接器

PCI to PCI 的 Class Code

強制要實作的。在DWORD 2的byte 0, byte 1, byte 2。
對PCI-to-PCI 橋接器而言,類別碼為06h,子類別04h,
程式介面:

  • 00h:正常的PCI-to-PCI橋接器
  • 01h:除了正常的PCI-to-PCI橋接器操作以外,還可以在橋接器主要端進行相減解碼的PCI-to-PCI橋接器。
還沒有組態橋接器之前,PCI Scan只會掃到BUS 0上看得到的PCI device與PCI橋接器。
EX: host/PCI橋接器(0600)、PCI/ISA橋接器(0601)、PCI-to-PCI橋接器(0604)。


可延展的匯流排架構

只含有一個PCI匯流排的機器受到很明顯的限制,EX:
  • 假如有太多電力負載被放在同一條PCI匯流排上,會無法正常運作。
  • 安裝在特定PCI匯流排上的裝置可能無法好好的共存。某些Master裝置可能需要大量匯流排時間,會降子系統效能。
  • 一條PCI匯流排只支援有限數量的PCI擴充連接器。

每一個PCI-to-PCI橋接器連接兩條PCI匯流排,被稱為它的主匯流排(Primary)與次(Secondary)匯流排。

  • Downstream(下游):當交易被起始,透過一或多個PCI-to-PCI橋接器被傳遞,並流向遠離主處理器的方向時,它就被稱為下游。
  • Upstream(上游):當交易被起始,透過一或多個PCI-to-PCI橋接器被傳遞,並流向主處理器時,它就被稱為上游。
  • 主匯流排(Primary bus):在橋接器的上游端之PCI匯流排。
  • 次匯流排(Secondary bus):在橋接器的下游端之PCI匯流排。[write to video memory]
  • 附屬匯流排(Subordinate bus):在橋接器的下游端號碼最大的PCI匯流排。


主匯流排號碼,被軟體以橋接器上游的PCI匯流排號碼初始化。由於host/PCI橋接器只會連接一個PCI匯流排,所以只有實作一個匯流排號碼暫存器。即host/PCI橋接器不需要實作次匯流排號碼暫存器。

次匯流排號碼,被軟體以橋接器下游的PCI匯流排號碼(換言之,第幾個BUS的編號)初始化。pci scan往下游找的時候,找到新的橋接器開始依序填值在次匯流排號碼中,新的橋接器代表下面又連了一個新的匯流排。每找到一個新的次匯流排,就往上回填附屬匯流排號碼。

匯流排號碼暫存器

剛開始作PCI SCAN的時候,要先掃出所有PCI裝置,掃到橋接器的時候要開始記錄號碼,並填入匯流排號碼。否則橋接器下游的裝置會看不到,往下游繼續找直到掃出所有裝置。

每一個PCItoPCI橋接器必須實作三個強制性的匯流排暫存器。它們都是可讀寫的,並且在重置時會被清除為0。在組態過程中,組態軟體會初始化這三暫存器,來指定匯流排號碼。這些暫存器是:

  • 主匯流排號碼暫存器(Primary Bus Number register)
  • 次匯流排號碼暫存器(Secondary Bus Number register)
  • 附屬匯流排號碼暫存器(Subordinate Bus Number register)

在主要端的Type 1組態讀取與寫入,它會被當作Type 0組態存取(假如target是在橋接器的次匯流排上)或是Type 1組態存取(假如Target是在附屬屬於橋接器次匯流排的匯流排上)。
在主要或次要端上接收到Type 1組態寫入,會被轉換成在指定的target匯流排上的特殊週期。

顯示器組態

可能有兩個顯示配接卡存在
假設一個平台安裝了兩張顯示配接卡,但是只有一個顯示器。其中一張配接卡是與VGA相容的ˊ,另一張是Advanced Graphics Adapter(進階圖形配接卡),或GFX。

兩張配接卡中都有DAC,用來驅動CRT,DAC含有一組調色盤暫存器集(color palette register set)。當每一個點(dot/pixel)被寫到顯示幕上時,圖形配接卡會提供資料給DAC。

兩個配接卡的識別
VGA配接卡的類別碼為03h,其子類別碼為00h,GFX配接卡的類別碼為03h,其子類別碼為08h。

BUS上可能的CASE

配接卡可能在相同或不同的匯流排上

對調色盤暫存器的IO寫入都必須同時更新在VGA和GFX這兩個配接卡DAC裡的調色盤暫存器。這兩個顯示配接卡會位於機器的何處有許多不同可能。

假如它們是在相同的PCI匯流排上,且IO寫入進行對調色盤暫存器寫入,除非有某件事情可以阻止它,否則在IO讀取或寫入在調色盤暫存器上進行時,兩個裝置都可以驅動DEVSEL#到低態來宣告交易。 >>>> 這會違反協定的現象。

假如配接卡在不同匯流排上,則是兩匯流排間的橋接器必須被程式規劃,以確保兩個配接卡都看到IO寫入交易,但是只有一個會當作交易的target來主動參與。

配接卡在不同BUS上的解決方案

  • 在顯示配接卡的指令暫存器裡的VGA調色盤監控(Palette Snoop)位元。
  • 在橋接器的橋接器控制暫存器裡的VGA致能位元。
  • 在橋接器的指令暫存器裡的VGA調色盤監控位元。

配接卡與橋接器的偵測與組態

用來偵測及設定VGA相容的控制器與非VGA,即GFX控制器的程序如下:
  1. 確認要在啟動程序中使用的VGA顯示裝置。這是藉著先掃描標準擴充匯流排(EX:ISA、EISA)的方式達成的。假如在擴充匯流排上找到顯示裝置的話,該顯示器會在啟動程序中使用,而且初始化程序完成。不用進行下列的步驟。假如在擴充匯流排上找不到VGA裝置,則從具有最大匯流排號碼的匯流排開始,掃描PCI匯流排。假如在PCI匯流排上找到的話,則儲存匯流排號碼,給在初始化程序的其餘步驟使用。
  2. 設定在裝置的指令暫存器裡的IO空間與記憶體空間致能位元,讓它可以回應VGA存取。
  3. 從啟動顯示裝置所在的PCI匯流排開始,掃描PCI匯流排階層的上游(到匯流排0為止)。在每一個偵測到的PCI-to-PCI橋接器裡,設定在其橋接器控制暫存器裡的VGA致能位元。
  4. 從啟動顯示器裝置所在的PCI匯流排開始,掃描PCI匯流排下游(所有附屬於此匯流排的匯流排),尋找GFX。當找到第一個GFX的案例時,中止掃描。設定GFX裝置指令暫存器的IO空間與VGA調色盤監控致能位元。
  5. 從GFX所在的匯流排往上游方向掃描回去,直到啟動顯示器所在的匯流排。在每一個所遇到的PCI-to-PCI橋接器裡,設定橋接器指令暫存器的VGA調色盤監控致能位元。
  6. 最後,設定在啟動顯示裝置的指令暫存器內的VGA調色盤監控致能位元。
PCI-to-PCI橋接器規格提供了兩個虛擬碼(pseudo-code),它們可以用來實作上述步驟的程序。

  • DispalyInit()。這是最頂層的程序。沒有輸入參數,並且它呼叫GFXScanR程序。
  • GFXScanR(BusNum)。此程序掃描附屬於啟動顯示器所在之匯流排的匯流排,以尋找第一個GFX裝置案例(Instance)







沒有留言:

張貼留言