Virtual To Physical Address

Hello, I am writing one wireless AP driver for Atheros board with AR5312 processor which is having mips 4kc core running on linux,where AR5212 controller is used to drive the ROCs. Here in xmit part I need to put the Descriptor Queue header in to the QCU block of the AR5212 MAC. The address I supposed to put is physical address of Descriptor Head Queue. I need help to convert the virtual address to physical address. thanks in advance Prakash

Reply to
prakash B
Loading thread data ...

Is virt_to_bus() not giving you what you need ?

Don't forget to pass a virtual address that's suitable for DMA operations. On x86, I use __get_free_page() for this purpose.

You can find the LDD book online at:

formatting link

Simon.

--
Simon Clubley, clubley@remove_me.eisner.decus.org-Earth.UFP       
Microsoft: The Standard Oil Company of the 21st century
Reply to
Simon Clubley

Thanks Simon, I have used one function pci_alloc_consistent() which does the the same functionality what u have said above. But I didn't understand that DMA needs virtual address that's suitable for DMA operation, please give me detail's abt it. Here I am using Mips processor.

Prakash.

Reply to
prakash B

Some devices require that the DMA buffers be aligned on some boundary (for example page aligned). For example, UHCI controllers require that the frame page be aligned on a 4096 byte boundary, and the transfer descriptors/queue headers to be aligned on 16 byte boundaries.

If the device doing DMA needs to transfer more than one page of memory at a time, it can also require that the pages be physically contiguous instead of just virtually contiguous. That requires operating system support, (in the case of Linux that's by using routines such as __get_free_pages()) and means that you cannot, for example, just define a large array within your driver and take the physical address of the array's base.

Finally, assuming that you have taken care of alignment and any possible contiguous memory issues, you still need to pass an address that will not be paged out by the kernel while the DMA is in progress. (You can't, for example, DMA directly into a user space buffer unless you have locked down the buffer.)

The pci_alloc_consistent()/__get_free_page[s]() routines handle all this for you.

Simon.

--
Simon Clubley, clubley@remove_me.eisner.decus.org-Earth.UFP       
Microsoft: The Standard Oil Company of the 21st century
Reply to
Simon Clubley

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.