JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
デバイスドライバの記述     Oracle Solaris 11.1 Information Library (日本語)
このドキュメントの評価
search filter icon
search icon

ドキュメントの情報

はじめに

パート I Oracle Solaris プラットフォーム用デバイスドライバの設計

1.  Oracle Solaris デバイスドライバの概要

2.  Oracle Solaris カーネルとデバイスツリー

3.  マルチスレッド

4.  プロパティー

5.  イベントの管理とタスクのキュー

6.  ドライバの自動構成

7.  デバイスアクセス: プログラム式入出力

8.  割り込みハンドラ

9.  ダイレクトメモリーアクセス (DMA)

DMA モデル

デバイス DMA の種類

バスマスター DMA

サードパーティー DMA

ファーストパーティー DMA

ホストプラットフォームの DMA の種類

DMA ソフトウェアコンポーネント: ハンドル、ウィンドウ、cookie

DMA 操作

バスマスター DMA 転送の実行

ファーストパーティー DMA 転送の実行

サードパーティー DMA 転送の実行

DMA 属性

ddi_dma_attr 構造体

SBus の例

ISA バスの例

DMA 資源の管理

オブジェクトのロック

DMA ハンドルの割り当て

DMA 資源の割り当て

デバイスレジスタ構造体

DMA コールバックの例

最大バーストサイズの決定

プライベート DMA バッファーの割り当て

資源割り当てエラーの処理

DMA エンジンのプログラミング

DMA 資源の解放

DMA ハンドルの解放

DMA コールバックの取り消し

メモリーオブジェクトの同期

キャッシュ

ddi_dma_sync() 関数

DMA ウィンドウ

10.  デバイスメモリーおよびカーネルメモリーのマッピング

11.  デバイスコンテキスト管理

12.  電源管理

13.  Oracle Solaris ドライバの強化

14.  階層化ドライバインタフェース (LDI)

パート II 特定の種類のデバイスドライバの設計

15.  文字デバイスのドライバ

16.  ブロックデバイスのドライバ

17.  SCSI ターゲットドライバ

18.  SCSI ホストバスアダプタドライバ

19.  ネットワークデバイスのドライバ

20.  USB ドライバ

21.  SR-IOV ドライバ

パート III デバイスドライバの構築

22.  ドライバのコンパイル、ロード、パッケージ化、およびテスト

23.  デバイスドライバのデバッグ、テスト、およびチューニング

24.  推奨されるコーティング方法

パート IV 付録

A.  ハードウェアの概要

B.  Oracle Solaris DDI/DKI サービスのサマリー

C.  64 ビットデバイスドライバの準備

D.  コンソールフレームバッファードライバ

E.  pci.conf ファイル

索引

ドキュメントの品質向上のためのご意見をください
簡潔すぎた
読みづらかった、または難し過ぎた
重要な情報が欠けていた
内容が間違っていた
翻訳版が必要
その他
Your rating has been updated
貴重なご意見を有り難うございました!

あなたの貴重なご意見はより良いドキュメント作成の手助けとなります 内容の品質向上と追加コメントのためのアンケートに参加されますか?

DMA 操作

DMA 転送の手順は、どの種類の DMA でも似ています。以降のセクションでは、DMA 転送を実行する方法について説明します。


注 - ファイルシステムから生成されるバッファー用のブロックドライバのメモリー内に DMA オブジェクトをロックしておく必要はありません。メモリー内のデータは、ファイルシステムによってすでにロックされています。


バスマスター DMA 転送の実行

ドライバは、バスマスター DMA に関する次の手順を実行します。

  1. DMA 属性を記述します。この手順により、DMA ルーチンで、デバイスがバッファーにアクセスできることを保証できるようになります。

  2. DMA ハンドルを割り当てます。

  3. DMA オブジェクトがメモリー内でロックされていることを確認します。physio(9F) または ddi_umem_lock(9F) のマニュアルページを参照してください。

  4. DMA 資源をオブジェクトに割り当てます。

  5. デバイス上で DMA エンジンをプログラミングします。

  6. エンジンを起動します。

  7. 転送が完了したら、バスマスター操作を続行します。

  8. 必要なオブジェクト同期があれば、それを行います。

  9. DMA 資源を解放します。

  10. DMA ハンドルを解放します。

ファーストパーティー DMA 転送の実行

ドライバは、ファーストパーティー DMA に関する次の手順を実行します。

  1. DMA チャネルを割り当てます。

  2. ddi_dmae_1stparty(9F) を使用してチャネルを構成します。

  3. DMA オブジェクトがメモリー内でロックされていることを確認します。physio(9F) または ddi_umem_lock(9F) のマニュアルページを参照してください。

  4. DMA 資源をオブジェクトに割り当てます。

  5. デバイス上で DMA エンジンをプログラミングします。

  6. エンジンを起動します。

  7. 転送が完了したら、バスマスター操作を続行します。

  8. 必要なオブジェクト同期があれば、それを行います。

  9. DMA 資源を解放します。

  10. DMA チャネルを解放します。

サードパーティー DMA 転送の実行

ドライバは、サードパーティー DMA に関する次の手順を実行します。

  1. DMA チャネルを割り当てます。

  2. ddi_dmae_getattr(9F) を使用してシステムの DMA エンジンの属性を取得します。

  3. DMA オブジェクトをメモリー内にロックします。physio(9F) または ddi_umem_lock(9F) のマニュアルページを参照してください。

  4. DMA 資源をオブジェクトに割り当てます。

  5. ddi_dmae_prog(9F) を使用して、転送を行うようにシステムの DMA エンジンをプログラミングします。

  6. 必要なオブジェクト同期があれば、それを行います。

  7. ddi_dmae_stop(9F) を使用して DMA エンジンを停止します。

  8. DMA 資源を解放します。

  9. DMA チャネルを解放します。

ハードウェアプラットフォームの中には、バス固有の方法で DMA 機能を制限しているものもあります。ドライバは ddi_slaveonly(9F) を使用して、DMA を使用できるスロット内にデバイスがあるかどうかを確認します。

DMA 属性

DMA 属性には、次のような DMA エンジンの属性と制限が記述されています。

デバイスドライバは、ddi_dma_attr(9S) 構造体を通じて DMA エンジンのすべての制限をシステムに通知する必要があります。この処理により、システムが割り当てた DMA 資源にデバイスの DMA エンジンからアクセスできるようになります。システムでは、デバイス属性にさらなる制限を加えることはありますが、ドライバが設定した制限を削除することはありません。

ddi_dma_attr 構造体

DMA 属性構造体は、次のメンバーで構成されます。

typedef struct ddi_dma_attr {
    uint_t      dma_attr_version;       /* version number */
    uint64_t    dma_attr_addr_lo;       /* low DMA address range */
    uint64_t    dma_attr_addr_hi;       /* high DMA address range */
    uint64_t    dma_attr_count_max;     /* DMA counter register */
    uint64_t    dma_attr_align;         /* DMA address alignment */
    uint_t      dma_attr_burstsizes;    /* DMA burstsizes */
    uint32_t    dma_attr_minxfer;       /* min effective DMA size */
    uint64_t    dma_attr_maxxfer;       /* max DMA xfer size */
    uint64_t    dma_attr_seg;           /* segment boundary */
    int         dma_attr_sgllen;        /* s/g length */
    uint32_t    dma_attr_granular;      /* granularity of device */
    uint_t      dma_attr_flags;         /* Bus specific DMA flags */
} ddi_dma_attr_t;

各表記の意味は次のとおりです。

dma_attr_version

属性構造体のバージョン番号です。dma_attr_version は DMA_ATTR_V0 に設定されます。

dma_attr_addr_lo

DMA エンジンがアクセスできる最下位のバスアドレスです。

dma_attr_addr_hi

DMA エンジンがアクセスできる最上位のバスアドレスです。

dma_attr_count_max

DMA エンジンが 1 つの cookie で処理できる最大転送数を指定します。上限は、最大数から 1 を引いた数で表されます。この数はビットマスクとして使用されるため、2 のべき乗よりも小さくする必要もあります。

dma_attr_align

ddi_dma_mem_alloc(9F) からメモリーを割り当てるときの配置要件を指定します。配置要件の例として、ページ境界での配置があります。dma_attr_align フィールドはメモリーの割り当て時にしか使用されません。バインド操作時には、このフィールドは無視されます。バインド操作では、ドライバはバッファーが適切に配置されるようにする必要があります。

dma_attr_burstsizes

デバイスがサポートするバーストサイズを指定します。バーストサイズとは、デバイスがバスを放棄する前に転送できるデータ量のことです。バーストこのメンバーはバイナリ符号化方式のバーストサイズです。このサイズは、2 のべき乗になるものとみなされます。たとえば、デバイスが 1 バイト、2 バイト、4 バイト、および 16 バイトのバーストを処理できる場合、このフィールドは 0x17 に設定されます。システムでは、このフィールドを使用して配置制限も決めます。

dma_attr_minxfer

デバイスが実行できる効果的な最低転送サイズです。このサイズは、配置やパディングの制限にも影響を及ぼします。

dma_attr_maxxfer

DMA エンジンが 1 回の入出力コマンドで格納できる最大バイト数を記述します。この制限が意味を持つのは、dma_attr_maxxfer(dma_attr_count_max + 1) * dma_attr_sgllen よりも小さい場合のみです。

dma_attr_seg

DMA エンジンのアドレスレジスタの上限です。dma_attr_seg は、アドレスレジスタの上位 8 ビットがセグメント番号を含むラッチである場合に頻繁に使用されます。下位 24 ビットはセグメントのアドレス指定に使用されます。この場合、dma_attr_seg は 0xFFFFFF に設定されます。これにより、オブジェクトへの資源の割り当て時にシステムは 24 ビットのセグメント境界を越えることはできません。

dma_attr_sgllen

scatter/gather リストに含まれる最大エントリ数を指定します。dma_attr_sgllen は、DMA エンジンがデバイスへの 1 回の入出力要求で使用できる cookie の数です。DMA エンジンに scatter/gather リストがない場合、このフィールドは 1 に設定されます。

dma_attr_granular

このフィールドは、デバイスの DMA 転送機能の粒度をバイト単位で指定します。この値の使用方法の例として、外部ストレージデバイスのセクターサイズの指定が挙げられます。バインド操作で部分的なマッピングが必要な場合、このフィールドを使用して、DMA ウィンドウ内の cookie のサイズ合計が粒度の整数倍になるようにします。ただし、デバイスに scatter/gather 機能がない場合は、DDI で粒度を保証することはできません。この場合、 dma_attr_granular フィールドの値は 1 になります。

dma_attr_flags

このフィールドには DDI_DMA_FORCE_PHYSICAL を設定できます。これは、システムが物理入出力アドレスと仮想入出力アドレスの両方をサポートしている場合に、仮想ではなく物理アドレスが返されることを示します。システムが物理 DMA をサポートしていない場合、ddi_dma_alloc_handle(9F) の戻り値は DDI_DMA_BADATTR になります。この場合、ドライバは DDI_DMA_FORCE_PHYSICAL をクリアし、処理を再試行する必要があります。

SBus の例

SPARC マシンの SBus 上の DMA エンジンには、次の属性があります。

SPARC マシンの SBus 上の DMA エンジンには、次の属性構造体があります。

static ddi_dma_attr_t attributes = {
    DMA_ATTR_V0,   /* Version number */
    0xFF000000,    /* low address */
    0xFFFFFFFF,    /* high address */
    0xFFFFFFFF,    /* counter register max */
    1,             /* byte alignment */
    0x7,           /* burst sizes: 0x1 | 0x2 | 0x4 */
    0x1,           /* minimum transfer size */
    0xFFFFFFFF,    /* max transfer size */
    0xFFFFFFFF,    /* address register max */
    1,             /* no scatter-gather */
    512,           /* device operates on sectors */
    0,             /* attr flag: set to 0 */
};

ISA バスの例

x86 マシンの ISA バス上の DMA エンジンには、次の属性があります。

x86 マシンの ISA バス上の DMA エンジンには、次の属性構造体があります。

static ddi_dma_attr_t attributes = {
    DMA_ATTR_V0,   /* Version number */
    0x00000000,    /* low address */
    0x00FFFFFF,    /* high address */
    0xFFFF,        /* counter register max */
    1,             /* byte alignment */
    0x7,           /* burst sizes */
    0x1,           /* minimum transfer size */
    0xFFFFFFFF,    /* max transfer size */
    0x000FFFFF,    /* address register max */
    17,            /* scatter-gather */
    512,           /* device operates on sectors */
    0,             /* attr flag: set to 0 */
};