問題の所在
PCI 拡張シャーシに差し込まれた PCI
カードが原因でシステムがクラッシュしたり、そのカードのメモリや
I/O 空間にアクセスできない場合があります。同じカードを直接
PCI ホストスロットに差し込むと問題なく動作します。
問題の原因
以下に PCI
拡張シャーシの問題として考えられる原因を列挙します。
- 割り込みハードウェアの共有。PCI
拡張シャーシ全体で 1
本のハードウェア割り込みラインを共有する。これをすべての割り込みで使用する。
- 複数ベンダーが同時に割り込みを生成する。
- 1 枚の多機能カードから複数の割り込みが生成される。
- 初期化問題
- 割込伝播遅延
これまで問題にならなかった理由
アップルはこれまで、6 スロットシステム (95xx/96xx Mac)
を製造してきました。ホストシステム側で 6 スロットの PCI
カードが使えるため拡張シャーシは不要でした。Power Macintosh
G3 には 3 スロットしかありません。アプリケーションによっては
PCI
拡張シャーシを含むハードウェア構成を取るものも出てきました。
拡張シャーシ問題への対応
PCI
拡張シャーシに関連する問題を解決するのは簡単ではありません。対応作業が必要なのはごくわずかのデベロッパだけでしょう。拡張シャーシに差し込まれたカードは、理論的にはトータルな処理時間に若干の差が出るだけのはずですが、現実にはアーキテクチャそのものからくる微妙な設計上の問題が発生します。
まず、拡張シャーシ内の下位のブリッジ層により余分な伝播遅延が加わります。典型的な場合には、下位のブリッジは
2 段になり、その分、各レベルごとに余分な PCI
クロックサイクルが加算されます。内部に下位の PCI
ブリッジを持つカードがある場合は、さらに遅延が増加します。こうした遅延は、ポスト操作にかかる時間とハードウェアによる実際の伝播遅延との和になります。
ホストの拡張スロットにカードを差し込んだ場合、どのデバイスが割り込みをかけているかはハードウェアレベルでわかります。拡張シャーシからの割り込みはすべて
1
本の割り込みスロットラインに供給されます。これを「割り込みの共有」と呼びます。割り込みラインを共有すると、ドライバは、割り込みの対応付けを行うのにハードウェアスロットの番号だけに頼ることはできません。正しく動作するドライバを作るには『Designing
Cards and Drivers for Power Macintosh
Computers』に書かれた規則にしたがう必要があります。
- 自分のハードウェアが割り込みサービスを必要としているかどうか、ハードウェアをポーリングする。
- サービスの必要がなければ、ただちに KIsrIsNotComplete
を返して戻る。
- サービスの必要がある場合は、処理を行い、KIsrIsComplete
を返して戻る。
割り込みとはもちろん、カードのハードウェアがサービスされる準備ができているときにしか有効になってはいけないものです。しかし、拡張シャーシには複数のベンダーのカードが差し込まれる場合があります。ドライバが割り込み可能にするのが早すぎ、隣りのスロットからの割り込みが待ち状態になっていると、ドライバは間違った割り込みを処理してしまうことになります。この問題も上記の規則を守れば避けられます。Power
Macintosh
は割り込みベクター方式のアーキテクチャは採用していません。待ち状態の割り込みを調べるには割り込み発生源のツリーを辿る必要があります。こうすることでハードウェアの発生源から割り込みハンドラを抽象化できるという利点はありますが、自分のドライバが処理を担当すべきサービスルーチンでない場合は、とにかくすぐに制御を戻すことが何より重要になります。これは割込応答時間を最小にするために必要な処置です。
ハードウェアが、いったんセットされた割り込みフラグを確実にリセットするまでしばらく待つ必要があります。遅延時間が長いと割り込みがまだ有効であるかのようにみえる場合があります。ホストのマザーボードと拡張シャーシ内の発生源のボードとの間で信号が一往復するだけの遅延があるからです。このような状況では、ハンドラが呼び出し元に戻ってからまた呼び出されてしまいます。ところが、ハンドラが制御を得た時点ではもうハードウェア割り込みはクリアされており、ハンドラはただ
KIsrIsNotComplete
ステータスを返して戻ります。結局適切なハンドラが見つからないことにより、割り込みの畳み掛けが生じてしまいます。複雑なのは、この現象がデバイスがローカルバスに置かれた場合には発生せず、拡張シャーシに置かれ割り込みを共有した場合にのみ起こるということです。デバイスのツリーを解析して状況を把握するという方法も可能ですが、一般には、ハンドラは割り込みをクリアした後、ハードウェアを読み直し、クリアされたことを確認してから呼び出し元に戻るようにするのが良い方法です。
カードはさまざまな動きをするので、どのカードをどのスロット順に置けばうまく動作するのかを判断するのは非常に困難です。カード初期化時のローディング特性にもよりますし、プローブの順序によっても違うからです。問題が起こらないかどうか、あらゆる可能な構成でテストするしか方法はありません。問題が起こったら、スロット内のカードの順序を入れ替えてみてください。これを書いている現時点では、OpenFirmware
では拡張シャーシに関連した問題は起こっていません。しかし、OpenFirmware
にはシステムのブート時にひどいスラッシングが起こるという問題があります。OpenFirmware
のアクセスレートが遅いせいです。これからみても、こうした問題はダイナミックな性質を持つものであり、スピードによって起きたり起きなったりもするということを強調しておきます。
最後に、割り込みの畳み掛けは拡張シャーシに特徴的な問題です。この現象が見られたら、割り込み処理のタイミングに潜在的な問題があることを示す兆候であることを覚えておいてください。
注記事項
PCI
拡張シャーシ関連の問題を解決する際に考慮すべき重要事項を示します。
- スロット内のカードを差す順序によっても動作に影響がある。
- 動作に遅れがみられるようなら、割り込みハードウェアがきちんとリセットされているか確認する。
- 割り込み共有に関連した問題。自分が処理を担当すべきハンドラかどうか判断するのに、唯一スロットの割り込みハードウェアに頼ってはいないか。
- 割り込みを有効にする際にはハードウェアの準備ができていることを確認する。
- 下位のブリッジを経由することによる遅延は、カード間のやりとりも割り込みの共有にも影響がある。
要約
PCI 拡張ハードウェアの問題は解決が困難です。6
スロットシステムがなくなる前には問題にならなかったからです。しかし、PCI
仕様に書かれたハンドラの処理順序の規則に厳格にしたがい、カードとスロットは一対一に対応しないことを踏まえて対応策を再考することで、問題は回避できるものと思われます。
|