Jump to content

    

Device driver + DMA

Приветствую уважаемые! Осваиваю тему написания драйверов устройств под Linux с использованием DMA. Читаю документацию по DMA API. Там есть такие слова:

The query for streaming mappings is performed via a call to

dma_set_mask():

 

int dma_set_mask(struct device *dev, u64 mask);

 

The query for consistent allocations is performed via a call

to dma_set_coherent_mask():

 

int dma_set_coherent_mask(struct device *dev, u64 mask);

 

В целом понятно, что функции проверяют способность DMA аппаратуры работать с адресами, маска которых передается в параметре mask. Но мне не понятно следующее:

1. Что подразумевается под streaming mappings и под consistent allocations?

2. В чем различие этих двух ф-ций?

3. Что значит слово coherent в данном контексте?

Edited by Gleb80

Share this post


Link to post
Share on other sites

DMA-отображения бывают двух типов:

  • Потоковые (Streaming)
  • Согласованные (Coherent или Сonsistent)

Согласованные отображение гарантировано доступны одновременно и процессору и устройству.

И при доступе каждая из сторон гарантировано получит "свежие" данные.

Чаще всего используются для долгоживущих буферов, например, когда буфер существует на протяжении всей жизни драйвера.

Пример использование -- память фреймбуфера.

 

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

Чаще всего создаются на время одной операции.

Теоретически, могут быть более производительными.

Пример использования -- приём/отправка сетевых пакетов.

 

 

Уточню, что через dma_set_mask() и схожие функции Вы сообщаете ядру, с какими адресами может

работать Ваше устройство, а ядро отвечает, возможен ли DMA для такой маски.

Share this post


Link to post
Share on other sites

Здравствуйте Des333

Благодарю за ответ, внесли ясность в сознание.

Изучаю kernel.org/Documentation на эту тему, но там столько всего, что разом трудно в голове создать цельную картину.

Ведь это Ваши статьи на хабре?

http://habrahabr.ru/company/metrotek/blog/235707/

http://habrahabr.ru/company/metrotek/blog/248145/

Использую их как наглядное пособие, очень облегчают вход в тему.

За них отдельное спасибо.

 

 

 

Share this post


Link to post
Share on other sites

Не за что.

Да, мои.

Share this post


Link to post
Share on other sites

В продолжении темы, если позволите. Есть задача передавать данные посредством DMA Linux из памяти DDR во внешнее устройство и назад. Столкнулся с проблемой, что не могу принять более 128Кбайт данных от устройства, когда как в устройство данных отсылаются хорошо. Для моего контроллера DMA важно, что бы буфер в памяти лежал физически непрерывно. Для этого выделил системе CMA область, для инициализации буфера использую функцию dmam_alloc_coherent().

Через символьное устройство имею доступ к этим буферам. На передачу очень похоже что все работает (вижу внутрисистемным аппаратным отладчиком). А вот на прием данных в буфер DDR записывается только первые 128Кбайт. Какой здесь может быть подвох?

 

P.S. Если кого-нибудь не затруднит, можете взглянуть на модуль ядра, который я использую. http://forums.xilinx.com/xlnx/attachments/...3/1/dma_proxy.c

 

Share this post


Link to post
Share on other sites
не могу принять более 128Кбайт данных от устройства

 

а это может быть как-то связано с размером страницы виртуальной памяти, которую выделяет ОС?

 

Share this post


Link to post
Share on other sites

Появился еще один вопрос:

 

В этой статье

http://habrahabr.ru/company/metrotek/blog/248145/

говорится, чтобы драйвер заработал, нужно добавить вот такой код в DTS:

 

fpga {
    compatible = "mtk,etn";
    interrupts = <0x0 0x28 0x1>;
};

 

непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>;

вроде бы номера прерываний от FPGA начинаются с 72...

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now