FreeBSD QandA 852
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 まで
お知らせください。