認識PCI設備,還是要從配置空間說起,當PCI在ACPI和PCI復合體上電和枚舉完成后,PCI根復合體會從PCI設備讀出PCI設備的配置空間,許多信息(例如寄存器、內存空間、中斷信息等等)都是是從配置空間獲取的,所以接下來會詳細講解PCI配置空間。
PCI配置空間的大小是256個字節(0x00~0xFF),而PCIe的配置空間擴大到了0x00~0xFFF;一般來說配置空間會像下面這樣分區:
接下來盡可能詳細的解釋這部分配置:
type 0 Header
配置空間的截圖如下:
這部分需要注意的是寄存器,status寄存器、command寄存器、BIST寄存器、Base Address Register0~5、ROM寄存器、INT寄存器、PMCSR寄存器,其它只讀位的寄存器暫時不討論。
status寄存器:
狀態寄存器用于記錄PCI總線相關事件的狀態信息:
command寄存器:
命令寄存器提供對設備生成和響應PCI周期的能力的粗略控制。當0被寫入該寄存器時,除了配置訪問之外的所有訪問,設備都從PCI總線上邏輯斷開。所有設備都需要支持此基本功能級別。根據設備的功能,可以實現也可以不實現命令寄存器中的各個位:
BIST寄存器:
此可選寄存器用于BIST的控制和狀態。不支持BIST的設備必須始終返回值0(即,將其視為保留寄存器)。調用BIST的設備不得妨礙PCI總線的正常操作。?
Base Address Register0~5:
BAR寄存器比較特殊,它可能有多種形態:
和其他寄存器不一樣,這個寄存器反而不建議去修改,雖然這個寄存器是可以讀寫的,但是往往只有系統知道如何正確的初始化,并且對于驅動來說,直到怎么使用這個寄存器比如何初始化它更重要。
一個經典的PCIe案例中,寄存器被分為三類,64位地址空間需要6個寄存器才能完全映射,如果仔細觀察,就會發現寄存器和資源幾乎一致:
第一個稱之為基礎寄存器空間,它往往用于初始化對應的PCI設備中的子系統以及燒錄系統等特殊行為,在任何時候它都是可用的,一般它會被映射到I/O空間內;
第二個稱之為設備寄存器空間,往往用于具體的PCIe的設備的功能設置,這部分可能大于4KB但是小于1MB;一般大小為4KB的倍數(這并不意外,低于4KB也會被設置為4KB的寄存器空間,因為內存頁面的設置是以頁面為單位的,寄存器設置也是如此),不過這部分需要總線驅動映射之后才可以用,在PCI設備中,一般會有一個嵌入式系統,這個系統初始化之前,是沒辦法映射設備寄存器和功能寄存器空間。
第三個也是功能寄存器空間,這里面可以映射的數量級更多一些;也是需要設備初始化之后才可以使用的。
ROM寄存器:
該寄存器被定義為處理該擴展ROM的基地址和大小信息。PCI設備可以帶一個擴展ROM,通過執行ROM中存放的代碼來完成與設備有關的初始化,同時也有可能完成系統的引導功能。
??
INT LINE寄存器
中斷線路寄存器用于傳輸中斷線路路由信息。寄存器必須由任何使用中斷引腳的設備或設備功能來實現。POST軟件將在初始化和配置系統時將路由信息寫入該寄存器。
該寄存器中的值告訴設備的中斷引腳連接到系統中斷控制器的哪個輸入。設備本身不使用該值,而是由設備驅動程序和操作系統使用。設備驅動程序和操作系統可以使用這些信息來確定優先級和矢量信息。此寄存器中的值是特定于系統體系結構的。
PMCSR寄存器
此16位寄存器用于管理PCI功能的電源管理狀態以及啟用/監視PME: