Перераспределение памяти из одного модуля ядра в буфер DMA в другом модуле - PullRequest
0 голосов
/ 09 ноября 2018

Я работаю над проектом, в котором модуль A имеет буфер памяти с содержимым DMA и вызывает функцию модуля B для выполнения операции DMA. Для упрощения это выглядит так:

Модуль A:

void get_info()
{
    void *outBuffer = kmalloc(10);
    void *inBuffer = kmalloc(10);

    perform_dma(outBuffer);       // function from module B

    read_output(&inBuffer);      // function from module B
}

Модуль B:

void perform_dma(void *outBuffer)
{
    void *dma_buffer = dma_alloc_coherent()  // <-- allocate a new DMA buffer
    memcpy(dma_buffer, outBuffer, 10);

    do_dma();  // <-- after this is done, dma_buffer has the content module A needs.
}

void read_output(void **inBuffer)
{
    memcpy(*inBuffer, dma_buffer, 10);
}

Я понимаю, что это может быть неэффективно, но я не могу изменить модуль B и могу использовать только предоставленные API. Мне разрешено изменить B 'perform_dma(void *outBuffer) прототип на perform_dma(void **outBuffer) в лучшем случае. Это работает большую часть времени, но в ситуации (из-за всех прерываний / событий очереди, вовлеченных во весь проект) я не смогу явно вызвать read_output() и предоставить inBuffer для чтения содержимого обратно, но могу получить доступ только к outBuffer адрес после отправки на B .

Есть ли способ сопоставить outBuffer модуль формы A с dma_buffer, расположенным в модуле B , чтобы иметь возможность считывать выходные данные с того же outBuffer ?

1 Ответ

0 голосов
/ 05 января 2019

Я понял, что dma_map_single () / dma_unmap_single () работают в моем случае. Нет необходимости менять прототип функции вообще. Просто используйте dma_map_single (outBuffer ...., DMA_BIDIRECTIONAL) внутри execute_dma (), чтобы получить адрес шины и передать его контроллеру dma, чтобы после завершения DMA outBuffer получал содержимое, возвращаемое контроллером dma.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...