FreeBSD QandA 852

FreeBSD QandA

Q. FreeBSD では ATA HDD (EIDE) 及び ATAPI デバイスの DMA 転送をサポート
   していますか?

A. FreeBSD のバージョンによりサポート状況は異なります。また、以下の記述は
   基本的に FreeBSD/i386 (いわゆる PC/AT 互換機) の話です。FreeBSD(98) で
   は全く事情が違いますので注意してください。

   1. FreeBSD 4.3-RELEASE 以降

     まず IDE コントローラが DMA をサポートしていれば、HDD に関しては自動
   的に DMA 転送を有効にしようとします。それに対して ATAPI デバイス 
   (CDROM, ZIP, LS-120 など) は、デフォルトでは DMA は無効にされています。
   この動作は次の MIB によって制御できます。

     hw.ata.ata_dma   ‥‥ ATA HDD
     hw.ata.atapi_dma ‥‥ ATAPI デバイス

   この MIB に対して `1' を設定すれば DMA 転送を有効に、`0' を設定すれば 
   DMA 転送を無効にすることができます。設定方法は、/boot/loader.conf に
   次のような行を追加するか、

     hw.ata.ata_dma="0"   ‥‥ ATA HDD の DMA 転送を無効化し PIO モードへ
     hw.ata.atapi_dma="1" ‥‥ ATAPI デバイスの DMA 転送を有効化

   boot loader(8) のプロンプトで set hw.ata.atapi_dma="1" などとします。
   詳しくは ata(4) と loader.conf(5) の man page を参照してください。

   2. FreeBSD 4.0-RELEASE 以降 4.2-RELEASE まで

     デフォルトの動作に関しては 4.3-RELEASE 以降と同じですが、HDD につい
   てはブート時に DMA 転送を強制的に無効にすることができません。これは
   特定のハードウェアの組み合わせによっては問題となることがあります。
   起動後であれば sysctl(8) を使って、次のようにすれば良さそうです。

     # sysctl -w hw.atamodes=pio,pio

     ATAPI デバイスについては、カーネルオプションを使用することで DMA
   転送に対応します。GENERIC カーネルではこのオプションはコメントアウトさ
   れていますので、カーネルの再構築が必要です。

     options     ATA_ENABLE_ATAPI_DMA    #Enable DMA on ATAPI devices

   3. FreeBSD 3.x-RELEASE

     wd ドライバの flags を指定することにより、DMA 転送が可能になります。
   マニュアル wd(4) を御覧下さい。ただし、サポートされている ATA chipset 
   は Intel PIIX のみのようで、他の chipset で有効かどうかは不明です。
   (src/sys/i386/isa/wdreg.h 参照)

     controller  wdc0  at isa? port "IO_WD1" bio irq 14 flags 0xa0ffa0ff

     0x8000 … 32bit 転送
     0x4000 … スリープモードによる HDD の一時停止への対応
     0x2000 … DMA 転送
     0x1000 … LBA モード
     0x00ff … 下位 8bit は multi-sector 転送。0xff はドライブの最大数。
     下位 16bit が Master、上位 16bit が Slave に対する設定です。

   4. FreeBSD 2.2.x ではサポートされていません。

間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。