2009-04-22 85 views
3

當您需要訪問PCI配置空間中的寄存器時,是否只需使用內置BIOS功能將DWORD讀取/寫入配置空間?訪問PCI配置空間中寄存器的正確方法

例如,如果我嘗試使用位於B0:D31:F1上的IDE控制器,是否繼續使用該BDF作爲BIOS功能的參數讀取/寫入配置寄存器?所以,如果我想獲得供應商ID,我會閱讀給定的BDF中的第一個DWORD?

或者我剛剛離開基地?

編輯:

在PCI BIOS規格,我一直在找過的BIOS函數的定義用於讀取和寫入的話到配置空間。我相信這意味着我可以在配置空間內以各種偏移量寫入寄存器。我猜我的問題是,這是在這個級別訪問這些寄存器的正確方式嗎?

+0

什麼是目標操作系統? – Michael 2009-04-22 16:45:59

+0

目標操作系統是一個學校項目:一個學期開發的非常簡單的操作系統。我的項目是開發一個簡單的磁盤驅動程序。 – 2009-04-22 16:50:35

回答

2

讀完PCI規範後,我只需要通過給定的中斷向量(1Ah)調用PCI BIOS功能。然而,由於必須事先發生的PCI配置,這會變得複雜。

PCI配置空間似乎不使用顯式地址進行訪問,而是使用BIOS函數調用。

編輯:其實,事實證明,BIOS比我知道的要多得多。我只需要枚舉PCI總線,直到找到IDE控制器的設備和供應商ID。唯一需要的組件是輸入/輸出端口封裝。


pci_dev_t dev = { 0xffffffff, 0xffffffff, 0xffffffff }; 

for (bus = 0; bus < 0xffff; ++bus) { 
    for (slot = 0; slot < 0xffff; ++slot) { 
    for (func = 0; func < 0xff; ++func) { 
     uint16_t dev_id = _pci_read_config_data(bus, slot, func, 0x00, PCI_READ_CONFIG_WORD); 
     uint16_t vend_id = _pci_read_config_data(bus, slot, func, 0x02, PCI_READ_CONFIG_WORD); 

     if ((vendor == vend_id) && (device == dev_id)) { 
     dev.bus  = bus; 
     dev.device = slot; 
     dev.function = func; 

     return dev; 
     } 
    } 
    } 
}