Or, you can use IOBufferMemoryDescriptor::inTaskWithPhysicalAddress
() to allocate your DMA buffers, and you can pass a mask to
restrict them to be allocated in 32-bit physical address space.
This is particularly important if your DMA hardware only supports
32 bit physical addresses. One nice thing about this is that you
don't have to change any of your IOMemoryCursor code (and update to
IODMACursor), it just works. Also, this is nice if you need to
support older (PPC) systems. You can just call
inTaskWithPhysicalAddress() if compiling for Intel, and then
require 10.4.8 on the Intel side (this API is present on all Intel
systems as of 10.4.8). On the PPC side you just leave it as it
was. Then you can have a single universal binary.
This only works if you are the one allocating the buffer in the first
place. Since this is a SATA controller, the descriptors come out of
the IOStorageFamily and their physical disposition is entirely
arbitrary.