前言
今天要講的是PCI,是一種parallel interface,paraller和serial的差別是bus上每個clock傳輸多bits或1 bit,因次在相同bus clock頻率下parallel interface遠比serial interface快多了,data bus有8 bits就是八倍快,data bus有16 bits就是16倍快,這樣來說serial interface不就很糟糕?其實不然,一方面data bus越多代表chip需要做的pin腳越多,chip就需要變大顆塞這些pin腳,封裝成本、裝置小型化都會受影響,另一方面parallel interface有頻率上限,data bus的各根pin腳可能在chip內的走線、在chip外的走線,或線材的影響,各bit在clock posedge變化後,抵達接收端的時間有點差距,在頻率低時沒甚麼,頻率高時這點差距可能是半個clock周期或更長,影響極大,因為clock的抵達時間也是有差距,最糟狀況差如果某bit和clock差了一週期就可能讓接收端取錯資料,所以PCI演化到PCIe、PATA演化到SATA,都是parallel interface到頻率上限,再怎麼改進接頭和線材,差距還是有顯著影響,只好回頭用serial interface來增加傳輸速率。
PCI簡介
PCI涵蓋的東西很多,一整本spec幾百頁,而且大部分現在用不到,所以我只講我覺得該知道的東西。
PCI的來源
早期的電腦系統可以說是一顆微控制器(MCU),再加上外部裝置,外部裝置可能是memory,例如SRAM,也可能是IO裝置,例如printer。(網路上抓一張8086的圖來說明,有侵權請跟我說)
在MCU外部要區分去SRAM或是去printer的access靠M/IO那個訊號決定,read/write靠RD和WR這兩根決定,在MCU內部FW的寫法就是用MOV存取SRAM,用IN、OUT存取printer這種IO裝置,IO的address和memory的address是獨立的,寫IO的address 0(OUT [0x0], R1)和寫memory的address 0(MOV [0x0], R1),在外部是兩回子事,IO的address範圍稱為IO space,memory的address範圍稱為memory space。
因為各家MCU和各種外部裝置的pin腳和控制方式不盡相同,所以每一款MCU要連接外部裝置都要特別設計,到了PC-XT時代提出了ISA bus,只要MCU和外部裝置的pin腳和行為都符合ISA spec,那它們就能互相溝通,算是工業技術的一大突破。
隨著技術的進步,CPU可以也需要跑越來越高頻,memory裝置跟得上但IO裝置沒必要跑這麼高浪費設計也浪費電,因此有chipset、南北橋的設計,高頻的memory做在北橋,低頻的IO做在南橋,可以掛的裝置也越來越多。
因為CPU外的裝置很多,雖然用ISA bus可以直接接上,但BIOS需要為每個裝置配置IO或memory的address,掛5個就設5個,掛10個就設10個,沒設定好就會資源衝突掛掉(要像我這樣夠老的才有這一段體驗),相當麻煩,因此懶惰的資訊人們想說這應該讓電腦做掉,所以規劃了PCI spec,規定所有PCI裝置都要有個configuration header讓BIOS讀,同時bus上有多少個PCI裝置有上限,所以BIOS就去掃所有可能的address,如果讀不到合法的configuration header就代表裝置不存在,讀到合法的就由BIOS看裝置種類自動配置IO或memory address,這種技術就叫做Plug-and-Play,關電、插上去、開電就能用。(和現代的hot-plug不同,hot-plug更先進,不用關店直接插就能用)
PCI的使用
先來講configuration header,PCI spec為此定義了一個configuration space,獨立於IO space和memory space之外,所以PCI的pin腳就是除了有決定IO/memory access的pin腳,還要決定configuration access的部分,這些合起來就是PCI的command bus。
CPU外部可以區分要讀Config、IO、或memory了,內部FW怎麼辦呢?compiler不可能為這個大改來支援一個CONFIG_IN、CONFIG_OUT的指令,所以PCI協會就規定IO space的0x3F8是Config的address register,0x3FC是Config的data register,先寫好PCI的address在address register,再看要read還是write就對0x3FC做read、write,這樣chipset收到0x3F8、0x3FC的IO access會自動轉成對外的PCI動作。
Configuration space的address是由bus、device、function組成,bus是經過了幾個PCI bridge,device是PCI bus上實體接上的東西,一個device又可以有多個function,但這些對FW無所謂,每個bus的每個device的每個function都是獨立的,為每個合法的function配置足夠的IO address range或memory address range就好。
以上應該就是軟體人在操控PCI/PCIe裝置知識無法連貫的部分,明天來講PATA這個早期硬碟的介面。