2009-04-22 25 views
3

PCIコンフィギュレーションスペースのレジスタにアクセスする必要がある場合、DWORDをコンフィギュレーションスペースに読み書きするために、ビルトインBIOS機能を使用するだけですか?PCIコンフィギュレーションスペースのレジスタにアクセスする適切な方法

たとえば、B0:D31:F1にあるIDEコントローラを使用しようとしている場合、そのBDFをBIOS機能のパラメータとして使用してコンフィギュレーションレジスタを読み書きしますか?だから私がベンダーのIDを取得したいのであれば、私は特定のBDFの最初のDWORDを読むでしょうか?

私は基本から離れていますか?

EDIT:PCI BIOSの仕様で

、私は、コンフィギュレーション空間に言葉を読み書きするためにBIOS関数の定義を見ているされています。私は、コンフィギュレーションスペース内のさまざまなオフセットでレジスタに書き込むことができると信じています。私は私の質問は、このレベルでこれらのレジスタにアクセスする正しい方法ですか?

+0

ターゲットOSとは何ですか? – Michael

+0

ターゲットOSは学校プロジェクトです:学期中に開発された非常にシンプルなOSです。私のプロジェクトは単純なディスクドライバを開発することです。 –

答えて

2

PCI仕様を読んだ後、PCI BIOS機能を特定の割り込みベクタ(1Ah)で呼び出すだけで済みます。しかし、これは手作業で行わなければならないPCI構成によって複雑になります。

PCI構成スペースは、アクセスのための明示的なアドレスを使用するのではなく、BIOS関数呼び出しを使用しているようです。

EDIT:実際には、BIOSは私が知る以上に多くのことが判明しています。私がしなければならなかったのは、IDEコントローラのデバイスとベンダーIDを見つけるまで、PCIバスを列挙することだけでした。必要なアセンブリは、イン/アウトポートラッパーのみでした。


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; 
     } 
    } 
    } 
} 
+0

コード/コールの例を提供することがありますか? –

+0

@IanVaughanおそらく質問はあまりよく聞かれなかったかもしれませんが、投稿されたコードは私が必要としていたものでした。私はそれがより簡単だとわかる前に、ループの束をたどっただけです。 –

関連する問題