Перейти к содержанию
    

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 в данном контексте?

Изменено пользователем Gleb80

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

 

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

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

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

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

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не могу принять более 128Кбайт данных от устройства

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В этой статье

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

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

 

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

 

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

http://billauer.co.il/blog/2012/08/irq-zynq-dts-cortex-a9/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

http://billauer.co.il/blog/2012/08/irq-zynq-dts-cortex-a9/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...