On Tue, May 27, 2003 at 11:53:22AM +0100, Christoph Hellwig wrote:
> > ralf> Use the value returned by pci_alloc_consistent in *dma_handle
> > ralf> instead of trying to do any conversions with of
> > ralf> pci_alloc_consistent's return value.
> >
> > How about virt_to_page()?
> >
> > Currently, many sound drivers (including ALSA) pass a
> > pci_alloc_consistent's return value to virt_to_page.
>
> You are not allow to do so. Any driver doing this is broken.
That however is exactly what's documented in DMA-mapping.txt:
[...]
portably refer to any piece of memory. If you have a cpu pointer
(which may be validly DMA'd too) you may easily obtain the page
and offset using something like this:
struct page *page = virt_to_page(ptr);
unsigned long offset = ((unsigned long)ptr & ~PAGE_MASK);
[...]
While it's officially documented I still don't like it. A double
conversion such as page_address(virt_to_page(ptr)) would accidently
turn a pointer of an uncached mapping into one to a cached area for the
same object - that will almost certainly not work as expected on a
non-coherent machine.
Ralf
|