Steven Stallion wrote:
> Garrett D'Amore wrote:
>
>> I think you mean "seg".
>>
>> It sounds like you need to have an address that is aligned on a 64K
>> boundary, right? seg doesn't quite get you there, since it only ensures
>> that a segment doesn't *cross* a 64K boundary.
>>
>> I think you should set align to the appropriate alignment restriction,
>> i.e. dma_attr_align = 65536. That should do the trick for you.
>>
>
> Aha!
>
> Question: so does dma_attr_align only affect how a DMA address is
> aligned WRT to virtual memory?
Actually, it makes *no* promises about virtual alignment, only physical
alignment. *HOWEVER*, any alignment of less than a physical page
(either 4K or 8K, I forget which right now -- ETOOMANYARCHITECTURES) is
almost guaranteed to be the same for both physical and kernel virtual
addresses. (I'm not aware of any case where there would be different,
but I don't think anyone has formally made it a promise.)
Your larger alignment (64K) will apply only physical addresses though.
> I had mistakenly thought this had some
> impact on how data was written by the DMA engine.
>
No. ddi_dma_attr is used exclusively for DMA resource allocation, and
does nothing to control the actual DMA process.
-- Garrett
_______________________________________________
driver-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss