Questions about dma_sync_single_for_cpu() / dma_sync_single_for_device()










0















My code uses stream DMA APIs to map an allocated buffer to DMA region like below:



void perform_dma(void *buffer)

dma_map_single(buffer... DMA_BIDIRECTIONAL); <- map buffer to physical address

ring_doorbell() -> notify device to read DMA content

// wait until DMA is done or wake up by interrupts
.....

dma_unmap_single(... , DMA_BIDIRECTIONAL) <- unmap buffer



The DMA direction is BIDIRECTIONAL and buffer is allocated, filled by caller before perform_dma() is called and freed after it is done.



Should I use




  • dma_sync_single_for_device() after dma_map_single() is called (but before notifying device to perform DMA)

and




  • dma_sync_single_for_cpu() right before dma_unmap_single() (as the buffer would be read by caller after perform_dma()) ?









share|improve this question




























    0















    My code uses stream DMA APIs to map an allocated buffer to DMA region like below:



    void perform_dma(void *buffer)

    dma_map_single(buffer... DMA_BIDIRECTIONAL); <- map buffer to physical address

    ring_doorbell() -> notify device to read DMA content

    // wait until DMA is done or wake up by interrupts
    .....

    dma_unmap_single(... , DMA_BIDIRECTIONAL) <- unmap buffer



    The DMA direction is BIDIRECTIONAL and buffer is allocated, filled by caller before perform_dma() is called and freed after it is done.



    Should I use




    • dma_sync_single_for_device() after dma_map_single() is called (but before notifying device to perform DMA)

    and




    • dma_sync_single_for_cpu() right before dma_unmap_single() (as the buffer would be read by caller after perform_dma()) ?









    share|improve this question


























      0












      0








      0








      My code uses stream DMA APIs to map an allocated buffer to DMA region like below:



      void perform_dma(void *buffer)

      dma_map_single(buffer... DMA_BIDIRECTIONAL); <- map buffer to physical address

      ring_doorbell() -> notify device to read DMA content

      // wait until DMA is done or wake up by interrupts
      .....

      dma_unmap_single(... , DMA_BIDIRECTIONAL) <- unmap buffer



      The DMA direction is BIDIRECTIONAL and buffer is allocated, filled by caller before perform_dma() is called and freed after it is done.



      Should I use




      • dma_sync_single_for_device() after dma_map_single() is called (but before notifying device to perform DMA)

      and




      • dma_sync_single_for_cpu() right before dma_unmap_single() (as the buffer would be read by caller after perform_dma()) ?









      share|improve this question
















      My code uses stream DMA APIs to map an allocated buffer to DMA region like below:



      void perform_dma(void *buffer)

      dma_map_single(buffer... DMA_BIDIRECTIONAL); <- map buffer to physical address

      ring_doorbell() -> notify device to read DMA content

      // wait until DMA is done or wake up by interrupts
      .....

      dma_unmap_single(... , DMA_BIDIRECTIONAL) <- unmap buffer



      The DMA direction is BIDIRECTIONAL and buffer is allocated, filled by caller before perform_dma() is called and freed after it is done.



      Should I use




      • dma_sync_single_for_device() after dma_map_single() is called (but before notifying device to perform DMA)

      and




      • dma_sync_single_for_cpu() right before dma_unmap_single() (as the buffer would be read by caller after perform_dma()) ?






      c linux-kernel dma






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 12 '18 at 16:31









      red0ct

      1,30531023




      1,30531023










      asked Nov 11 '18 at 6:25









      lukeluke

      807




      807






















          1 Answer
          1






          active

          oldest

          votes


















          0














          Yes. You can lookup in here in this KernelTLV presentation (slide 13). There's an explanation there regarding buffer responsibility.



          In the example in the presentation it is said you (the driver) can alter the buffer content after dma_sync_single_for_cpu() and return ownership to the device by calling dma_sync_single_for_device().



          It's a question of ownership. dma_sync_single_for_device() grants ownership to the DMA controller where dma_sync_single_for_cpu() gains ownership back.






          share|improve this answer






















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53246379%2fquestions-about-dma-sync-single-for-cpu-dma-sync-single-for-device%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            Yes. You can lookup in here in this KernelTLV presentation (slide 13). There's an explanation there regarding buffer responsibility.



            In the example in the presentation it is said you (the driver) can alter the buffer content after dma_sync_single_for_cpu() and return ownership to the device by calling dma_sync_single_for_device().



            It's a question of ownership. dma_sync_single_for_device() grants ownership to the DMA controller where dma_sync_single_for_cpu() gains ownership back.






            share|improve this answer



























              0














              Yes. You can lookup in here in this KernelTLV presentation (slide 13). There's an explanation there regarding buffer responsibility.



              In the example in the presentation it is said you (the driver) can alter the buffer content after dma_sync_single_for_cpu() and return ownership to the device by calling dma_sync_single_for_device().



              It's a question of ownership. dma_sync_single_for_device() grants ownership to the DMA controller where dma_sync_single_for_cpu() gains ownership back.






              share|improve this answer

























                0












                0








                0







                Yes. You can lookup in here in this KernelTLV presentation (slide 13). There's an explanation there regarding buffer responsibility.



                In the example in the presentation it is said you (the driver) can alter the buffer content after dma_sync_single_for_cpu() and return ownership to the device by calling dma_sync_single_for_device().



                It's a question of ownership. dma_sync_single_for_device() grants ownership to the DMA controller where dma_sync_single_for_cpu() gains ownership back.






                share|improve this answer













                Yes. You can lookup in here in this KernelTLV presentation (slide 13). There's an explanation there regarding buffer responsibility.



                In the example in the presentation it is said you (the driver) can alter the buffer content after dma_sync_single_for_cpu() and return ownership to the device by calling dma_sync_single_for_device().



                It's a question of ownership. dma_sync_single_for_device() grants ownership to the DMA controller where dma_sync_single_for_cpu() gains ownership back.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 11 '18 at 23:22









                KnightingaleKnightingale

                1718




                1718



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53246379%2fquestions-about-dma-sync-single-for-cpu-dma-sync-single-for-device%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

                    ャフサォクコ ケウ,コ,ワ メ,ロスョノ゙,クネ,フムカヤヲニ,エコ゚ツ ウイオン゙ケワサネォキモュキォウイノンコチ゚メヌナイゥフュ,カヒウネェ ネ,ホノケ,ムュキ ッボーミュハ,チ ツス ィ メウイマヤ,゙ウチ ヅ ロ,ォジヌェ ャヌット ェ,マャ,チナエヒネソキツテ トホヲヲミーァ

                    How do I collapse sections of code in Visual Studio Code for Windows?