[ 前のページ ] [ 次のページ ] [ 目次 ] [ DOC Home ]

20 OpenVMS Galaxyデバイス・ドライバ

この章では,OpenVMS Alphaバージョン7.2でPCIドライバに対して, Direct DMAウィンドウがどのように変更されたかについて説明します。

20.1 Direct DMAウィンドウの変更

Galaxy Software Architecture on OpenVMSとメモリ・ホールをサポートするには, ここで説明する変更が必要です。この変更では,Direct DMAウィンドウを物理メモリ0 から他の場所に移動します。この章では,ドライバを更新するのに必要な情報とその背景について, 詳しく説明します。

この章では,バス・アドレス可能プール(BAP)については説明しません。

20.2 OpenVMS V7.2より以前にPCI Direct DMAがどのように機能していたか

すべてのPCIベースのマシンで,Direct DMAウィンドウはPCI空間の(通常は) 1 GB から始まり,1 GBの場合は0から始まる物理メモリを使用します。

     Memory:                                    PCI
            __________-\
       0    |        |  \                    |       |
            |        |   \                   |       |
            |        |    \                  |       |
            |        |     \---------------- |------ |1Gb (IOC$K_DIRECT_DMA_BASE)
       1Gb  |------- |-\                     |       |   \
            |        |  \                    |       |    \
            |        |   \                   |       |      IOC$K_DIRECT_DMA_SIZE
        .   |        |    \                  |       |    /
         .  |        |     \---------------- |_______|2Gb-1
          .

通常,ドライバはそれぞれのバッファ・アドレスを,IOC$K_DIRECT_DMA_ SIZEファンクション・コードを指定してIOC$NODE_DATAを呼び出すことで返されたウィンドウの長さと比較します。 ここでは,メモリ側のウィンドウが0 から始まるものと仮定しています。マップ・レジスタが必要かどうかを判断するためによく使われている別の方法として,MMG$GL_MAXPFN を確認する方法があります。 この方法もOpenVMSバージョン7.2では正しく動作しない可能性があります。


もっとわかりやすい図と説明については

Writing OpenVMS Device Alpha Drivers in C』を参照してください。


20.3 OpenVMSバージョン7.2でPCI Direct DMAがどのように機能するか

Galaxyおよびメモリ・ホールについて考慮すると,Direct DMAウィンドウの位置を変更しなければならなくなります。

     Memory:                                    PCI
            |        |
            |        |
            |        |
     IOC$K_DIRECT_DMA_BASE_PA:
            __________-\
            |        |  \                    |       |
            |        |   \                   |       |
            |        |    \                  |       |
            |        |     \---------------- |------ |1Gb (IOC$K_DDMA_BASE_BA)
            |------- |-\                     |       |   \
            |        |  \                    |       |    \
            |        |   \                   |       |      IOC$K_DDMA_WIN_SIZE
            |        |    \                  |       |    /
            |        |     \---------------- |_______|2Gb-1

メモリ内でDirect DMAウィンドウのベースがどこにあるかをドライバから判断することはできません。 単にバッファ・アドレスをウィンドウの長さと比較しても, バッファがDirect DMAウィンドウの内部にあるかどうか判断するのに十分ではありません。 また,mmg$gl_maxpfnに対して比較しても, すべてのプールがウィンドウの内部にあるかどうか保証できません。 チェックしなければならない正しいセルはmmg$gl_max_node_pfnです。さらに, アライメントについて考慮すると,物理バス・アドレスの計算に少し異なるオフセットを組み込まなければならなくなります。

20.4 0以外のDirect DMAウィンドウをサポートするためのIOC$NODE_DATA の変更

この問題に対処するために,新しいファンクション・コードがioc$node_ dataに追加されました。ここではDirect DMAに関連するすべてのコードのリストを示し, データがどのような意味を持つかについても説明します。

IOC$K_DIRECT_DMA_BASE これはPCI側のベース・ アドレスであるか,またはバス・アドレスである。これは, IOC$K_DDMA_BASE_BAというファンクション・コードの同意語である。
IOC$DIRECT_DMA_SIZE Galaxy以外のマシンでは,これはDirect DMAウィンドウのサイズ(メガバイト数) を返す。Direct DMAウィンドウが0から始まらないシステムでは, 返されるデータは0であり,Direct DMAウィンドウが存在しないことを示す。
IOC$K_DDMA_WIN_SIZE すべてのシステム(x6jh)で,これはDirect DMAウィンドウのサイズを返す( メガバイト単位)。
IOC$K_DIRECT_ DMA_BASE_PA これはDirect DMAウィンドウのメモリ内でのベース物理アドレスである。 おそらくmmg$gl_min_node_pfnに密接に関係しているが, アライメントを考慮したため,少し異なる可能性がある。

IOC$K_DIRECT_DMA_BASE_PAコードを使用して返されるアドレスは,オフセットを計算するのに必要です( これは通常,メモリPAとバス・アドレスの間の1 GB の差として使用されます)。オフセットは,ベース・バス・アドレスとベース・ メモリ・アドレスの間の符号付きの差として定義されます。 これは必ずしも1 GBではありません。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ DOC Home ]