returned dma address value of dma_alloc_coherent, is it always in the lower 4GB range?

Chan Kim ckim at etri.re.kr
Tue Mar 14 04:03:28 EDT 2023


Hello Valdis,

>-----Original Message-----
>From: Valdis Kletnieks <valdis at vt.edu> On Behalf Of Valdis Kl?tnieks
>Sent: Tuesday, March 14, 2023 2:15 PM
>To: Chan Kim <ckim at etri.re.kr>
>Cc: kernelnewbies at kernelnewbies.org
>Subject: Re: returned dma address value of dma_alloc_coherent, is it always
>in the lower 4GB range?
>
>On Mon, 13 Mar 2023 21:28:28 +0900, "Chan Kim" said:
>
>> which is 32-bit addressable.  Even if the device indicates (via the
>> DMA
>> mask)
>> that it may address the upper 32-bits, consistent allocation will only
>> return > 32-bit addresses for DMA if the consistent DMA mask has been
>> explicitly changed via dma_set_coherent_mask().  This is true of the
>> dma_pool interface as well.
>> ------------------------------
>
>> By context I guess it returns the address in lower 32bit address range
>> even it the coherent_dma_mask is set to some bigger value.
>
>No, you have that backwards.   It's not "even if".  It wil give you a
32-bit
>address *UNLESS* the driver has called dma_set_coherent_mask() to set a
>wider mask *and* the device indicates it supports more than 32 bit
>addresses...

I'm sorry but please allow me to ask one more time.
1. "The consistent DMA mapping interfaces, will by default return a DMA
address
which is 32-bit addressable."  
==> so by default consistent dma mapping API returns 32-bit address, and
this 32-bit address means dma address, not physical address. Am I correct?
(because the dma address will be translated to physical address by the iommu
anyway)

2. " Even if the device indicates (via the DMA mask)
that it may address the upper 32-bits, consistent allocation will only
return > 32-bit addresses for DMA if the consistent DMA mask has been
explicitly changed via dma_set_coherent_mask().  This is true of the
dma_pool interface as well." 
==> So I now understand the first 'even if' is for streaming dma mask
('dma_mask' in the struct device), and the second 'if' is for the
'coherent_dma_mask' in the struct device. And when coherent_dma_mask is not
set, by default, the coherent mapping returns 32 bit address, but if the
coherent_dma_mask is set to use wider than 32 bit addresses, it returns the
wider address which seems obvious now.

Please correct me if I'm wrong.
Thank you!

Chan Kim







More information about the Kernelnewbies mailing list