<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Malgun Gothic";
        panose-1:2 11 5 3 2 0 0 2 0 4;}
@font-face
        {font-family:"Malgun Gothic";
        panose-1:2 11 5 3 2 0 0 2 0 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        text-autospace:none;
        word-break:break-hangul;
        font-size:10.0pt;
        font-family:"Malgun Gothic";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Malgun Gothic";
        color:windowtext;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Malgun Gothic";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:3.0cm 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=KO link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>Further reading down the document, I realized the returned DMA address (=bus address) is used for setting the dma descriptors or the device register so that the address value is used for actual DMA.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>But I’m still confused for cases of using iommu. <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>When the iommu exists for the device, does the dma_alloc function allocates virtual address range (which can be physically dis-contiguous) instead of the (physically contiguous) bus address? <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>I mean, will the handle value below be pointing to virtual address for {this process and the device} pair? (virtual to bus address translation being done by iommu).<o:p></o:p></span></p><p class=MsoNormal style='text-indent:25.0pt'><span lang=EN-US>dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>Any help will be really appreciated.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>Thanks!<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>Chan Kim<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal align=left style='text-align:left;text-autospace:ideograph-numeric ideograph-other;word-break:keep-all'><b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif'>From:</span></b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif'> ckim@etri.re.kr <ckim@etri.re.kr> <br><b>Sent:</b> Thursday, July 22, 2021 4:33 PM<br><b>To:</b> kernelnewbies@kernelnewbies.org<br><b>Subject:</b> a question about dma_set_mask function<o:p></o:p></span></p></div></div><p class=MsoNormal align=left style='text-align:left'><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>Hello,<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>I have a question about DNA (I was reading <a href="https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt">DMA-API-HOWTO.txt</a> ).<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>You know regarding DMA, there is cpu virtual address, cpu physical address and bus address for the device. <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>Bus address is converted to cpu physical address using bridge or bus controller to which the device is attached. <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>And for platform device, bus address is equal to the cpu physical address.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>The <a href="https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt">DMA-API-HOWTO.txt</a> says <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>> When dma_set_mask() or dma_set_mask_and_coherent() is successful, and<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>> returns zero, the kernel saves away this mask you have provided.  The<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>> kernel will use this information later when you make DMA mappings.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>So I guess when the driver later requests memory for dma using dma_map_..(ex. dma_map_single, or dma_map_sg) function, <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>the kernel allocates memory and sets up page table and it sets the bus address in the ranges supported by the dma_mask. <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>The virtual address is returned by the function, but where is this </span>‘<span lang=EN-US>bus address</span>’<span lang=EN-US> 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)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>And when the device has a separate iommu(like arm64</span>’<span lang=EN-US>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?<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>It</span>’<span lang=EN-US>s so confusing.. Any explanation or comment will be deeply appreciated.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>Thanks!<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>Chan Kim<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p></div></div></body></html>