Questions about dma_sync_single_for_cpu() / dma_sync_single_for_device()
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()afterdma_map_single()is called (but before notifying device to perform DMA)
and
dma_sync_single_for_cpu()right beforedma_unmap_single()(as the buffer would be read by caller afterperform_dma()) ?
c linux-kernel dma
add a comment |
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()afterdma_map_single()is called (but before notifying device to perform DMA)
and
dma_sync_single_for_cpu()right beforedma_unmap_single()(as the buffer would be read by caller afterperform_dma()) ?
c linux-kernel dma
add a comment |
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()afterdma_map_single()is called (but before notifying device to perform DMA)
and
dma_sync_single_for_cpu()right beforedma_unmap_single()(as the buffer would be read by caller afterperform_dma()) ?
c linux-kernel dma
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()afterdma_map_single()is called (but before notifying device to perform DMA)
and
dma_sync_single_for_cpu()right beforedma_unmap_single()(as the buffer would be read by caller afterperform_dma()) ?
c linux-kernel dma
c linux-kernel dma
edited Nov 12 '18 at 16:31
red0ct
1,30531023
1,30531023
asked Nov 11 '18 at 6:25
lukeluke
807
807
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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.
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
add a comment |
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.
add a comment |
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.
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.
answered Nov 11 '18 at 23:22
KnightingaleKnightingale
1718
1718
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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