A tip from From: Juergen Keil <jk@tools.de> 

Solaris 9 x86 will not allow DMA for ATAPI CD/DVD-ROM drives even if
the eeprom command shows: 

	atapi-dma-enabled=1

Here is a patch to the file /platform/i86pc/kernel/drv/ata
that allows you to use DMA again. Note that you need to be extremely careful
when applying the patch because it may completely break your installation
if you don't do it right.

% adb /platform/i86pc/kernel/drv/ata 
ata_init_drive_pcidma,10?ia 
ata_init_drive_pcidma: pushl %ebp 
ata_init_drive_pcidma+1: movl %esp,%ebp 
ata_init_drive_pcidma+3: subl $4,%esp 
ata_init_drive_pcidma+6: movl +8(%ebp),%eax 
ata_init_drive_pcidma+9: cmpb $1,+0x1ad(%eax) 
ata_init_drive_pcidma+0x10: jne +0x111 <ata_init_drive_pcidma+0x121> 
ata_init_drive_pcidma+0x16: movl +0xc(%ebp),%eax 
ata_init_drive_pcidma+0x19: movl +0x204(%eax),%eax 
ata_init_drive_pcidma+0x1f: andl $1,%eax 
ata_init_drive_pcidma+0x22: je +0x1a <ata_init_drive_pcidma+0x3c> 
ata_init_drive_pcidma+0x24: movl +0xc(%ebp),%eax 
ata_init_drive_pcidma+0x27: movzwl +4(%eax),%eax 
ata_init_drive_pcidma+0x2b: sarl $8,%eax 
ata_init_drive_pcidma+0x2e: andl $0x1f,%eax 
ata_init_drive_pcidma+0x31: cmpl $5,%eax 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This is the check for a type 5 ATAPI device 
ata_init_drive_pcidma+0x34: jne +8 <ata_init_drive_pcidma+0x3c> 
ata_init_drive_pcidma+0x36: 

Here's a patch that replaces the "cmpl $5" with a "cmpl $55", so 
that all ATAPI devices will perform DMA transfers: 
 
# cd /platform/i86pc/kernel/drv 
# cp ata ata-orig 
# echo 'ata_init_drive_pcidma+0x31?W 7555f883' | adb -w ata 

Note that the exact position of the instruction that needs to be patched
may vary depending on the version of Solaris you use. Be extremely careful
when applying the patch.

	IMPORTANT NOTE FOR AMD64 Systems

cd /platform/i86pc/kernel/drv/amd64
cp ata ata.orig
adb -w ata
ata_init_drive_pcidma,17?ia
0x50f0:         pushq  %rbp
0x50f1:         xorl   %edx,%edx
0x50f3:         movq   %rsp,%rbp
0x50f6:         subq   $0x20,%rsp
0x50fa:         movq   %rbx,-0x18(%rbp)
0x50fe:         movq   %r12,-0x10(%rbp)
0x5102:         movq   %rdi,%rbx
0x5105:         movq   %r13,-0x8(%rbp)
0x5109:         movq   $0x0,0x0(%rip)
0x5114:         movq   %rsi,%r12
0x5117:         cmpb   $0x1,0x321(%rdi)
0x511e:         je     +0x12    <0x5130>
0x5120:         movq   -0x18(%rbp),%rbx
0x5124:         movq   -0x10(%rbp),%r12
0x5128:         movl   %edx,%eax
0x512a:         movq   -0x8(%rbp),%r13
0x512e:         leave
0x512f:         ret
0x5130:         testb  $0x1,0x208(%rsi)
0x5137:         je     +0xe     <0x5145>
0x5139:         movzbl 0x9(%rsi),%eax
0x513d:         andl   $0x1f,%eax
0x5140:         cmpl   $0x5,%eax
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This is the check for a type 5 ATAPI device 

0x5140?W7455f883       					<<< This changes the code
0x5140:         0x7405f883      =       0x7455f883
?i
0x5140:         cmpl   $0x55,%eax
