この章では,OpenVMS Alpha バージョン 7.3 で PCI ドライバに対しての
ダイレクト・マップ DMA ウィンドウについて説明します。
19.1 ダイレクト・マップ DMA ウィンドウの変更
この節で説明する変更は OpenVMS Galaxy とメモリ・ホールをサポートするために OpneVMS バージョン 7.2 で変更されたものです。 この変更では,ダイレクト・マップ DMA ウィンドウを物理メモリ 0 から他の場所に移動します。 この章では,まだ OpenVMS バージョン 7.2 またはそれ以降のドライバにアップデートしていない場合にドライバを更新するのに必要な情報とその背景について,詳しく説明します。
この章では,バス・アドレス可能プール (BAP) については説明しません。
19.2 OpenVMS バージョン 7.2 より以前に PCI ダイレクト・マップ DMA がどのように機能していたか
図 19-1
に示すように,すべての PCI ベースのマシンで,
ダイレクト・マップ DMA ウィンドウは PCI 空間の (通常は) 1 GB から始まり,
1 GB の場合は 0 から始まる物理メモリを使用します。
図 19-1: PCI ベース DMA
通常,ドライバはそれぞれのバッファ・アドレスを, IOC$K_DIRECT_DMA_SIZE ファンクション・コードを指定して IOC$NODE_DATA を呼び出すことで返されたウィンドウの長さと比較します。 ここでは,メモリ側のウィンドウが 0 から始まるものと仮定しています。 マップ・レジスタが必要かどうかを判断するためによく使われている別の方法として, MMG$GL_MAXPFN を確認する方法があります。 この方法も OpenVMS バージョン 7.3 では正しく動作しない可能性があります。
もっとわかりやすい図と説明については『Writing OpenVMS Alpha Device Drivers in C』を参照してください。
19.3 現在のバージョンの OpenVMS で PCI ダイレクト・マップ DMA がどのように機能するか
図 19-2
に示すように Galaxy およびメモリ・ホールについて考慮すると,
ダイレクト・マップ DMA ウィンドウの位置を変更しなければならなくなります。
図 19-2: OpenVMS DMA
メモリ内でダイレクト・マップ DMA ウィンドウのベースがどこにあるかをドライバから判断することはできません。
単にバッファ・アドレスをウィンドウの長さと比較しても,
バッファがダイレクト・マップ DMA ウィンドウの内部にあるかどうか判断するのに十分ではありません。また,MMG$GL_MAXPFN に対して比較しても,
すべてのプールがウィンドウの内部にあるかどうか保証できません。
チェックしなければならない正しいセルは MMG$GL_MAX_NODE_PFN です。
さらに,アライメントについて考慮すると,物理バス・アドレスの計算に少し異なるオフセットを組み込まなければならなくなります。
19.4 0 以外のダイレクト・マップ DMA ウィンドウをサポートするためのIOC$NODE_DATA の変更
この問題に対処するために, 新しいファンクション・コードが IOC$NODE_DATA に追加されました。 ここではダイレクト・マップ DMA に関連するすべてのコードのリストを示し, データがどのような意味を持つかについても説明します。
| コード | 説明 |
IOC$K_DIRECT_DMA_BASE |
これは PCI 側のベース・アドレスであるか,またはバス・アドレスである。 これは,IOC$K_DDMA_BASE_BA というファンクション・コードの同意語である。 32 ビットの結果が返される。 |
IOC$DIRECT_DMA_SIZE |
Galaxy 以外のマシンでは, これはダイレクト・マップ DMA ウィンドウのサイズ (M バイト数) を返す。 ダイレクト・マップ DMA ウィンドウが 0 から始まらないシステムでは, 返されるデータは 0 であり, ダイレクト・マップ DMA ウィンドウが存在しないことを示す。 32 ビットの結果が返される。 |
IOC$K_DDMA_WIN_SIZE |
すべてのシステムで, これはダイレクト・マップ DMA ウィンドウのサイズを返す (M バイト単位)。 32 ビットの結果が返される。 |
IOC$K_DIRECT_DMA_BASE_PA |
これはダイレクト・マップ DMA ウィンドウのメモリ内でのベース物理アドレスである。32 ビットの結果が返される。 |
IOC$K_DIRECT_DMA_BASE_PA コードを使用して返されるアドレスは, オフセットを計算するのに必要です (これは通常,メモリ PA とバス・アドレスの間の 1 GB の差として使用されます)。 オフセットは,ベース・バス・アドレスとベース・メモリ・アドレスの間の符号付きの差として定義されます。これは必ずしも 1 GB ではありません。