a question about dma_set_mask function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

 

I have a question about DNA (I was reading DMA-API-HOWTO.txt ).

You know regarding DMA, there is cpu virtual address, cpu physical address and bus address for the device.

Bus address is converted to cpu physical address using bridge or bus controller to which the device is attached.

And for platform device, bus address is equal to the cpu physical address.

 

The DMA-API-HOWTO.txt says

 

> When dma_set_mask() or dma_set_mask_and_coherent() is successful, and

> returns zero, the kernel saves away this mask you have provided.  The

> kernel will use this information later when you make DMA mappings.

 

So I guess when the driver later requests memory for dma using dma_map_..(ex. dma_map_single, or dma_map_sg) function,

the kernel allocates memory and sets up page table and it sets the bus address in the ranges supported by the dma_mask.

The virtual address is returned by the function, but where is this ‘bus address’ kept? I see a pointer to the struct page in the function argument, Is it kept in this struct array? Or is the bus address just the physical address(pfn) in the page table?(I guess so)

And when the device has a separate iommu(like arm64’s SMMU), I guess the DMA virtual address (assigned for dma by the kernel) for the device is first converted to the bus address by iommu and then the bus address is converted to physical address by bus bridge. Is my understanding correct?

It’s so confusing.. Any explanation or comment will be deeply appreciated.

Thanks!

 

Chan Kim

 

 

 

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]

  Powered by Linux