реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Device driver + DMA, dma_set_mask и dma_set_coherent_mask
Gleb80
сообщение Jul 2 2015, 11:13
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 25-09-08
Из: Москва
Пользователь №: 40 470



Приветствую уважаемые! Осваиваю тему написания драйверов устройств под 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 - Jul 2 2015, 11:15
Go to the top of the page
 
+Quote Post
des333
сообщение Jul 2 2015, 20:24
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



DMA-отображения бывают двух типов:
  • Потоковые (Streaming)
  • Согласованные (Coherent или Сonsistent)

Согласованные отображение гарантировано доступны одновременно и процессору и устройству.
И при доступе каждая из сторон гарантировано получит "свежие" данные.
Чаще всего используются для долгоживущих буферов, например, когда буфер существует на протяжении всей жизни драйвера.
Пример использование -- память фреймбуфера.

При использовании потоковых отображений доступ возможен строго по очереди.
Чаще всего создаются на время одной операции.
Теоретически, могут быть более производительными.
Пример использования -- приём/отправка сетевых пакетов.


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


--------------------
Go to the top of the page
 
+Quote Post
Gleb80
сообщение Jul 3 2015, 10:49
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 25-09-08
Из: Москва
Пользователь №: 40 470



Здравствуйте Des333
Благодарю за ответ, внесли ясность в сознание.
Изучаю kernel.org/Documentation на эту тему, но там столько всего, что разом трудно в голове создать цельную картину.
Ведь это Ваши статьи на хабре?
http://habrahabr.ru/company/metrotek/blog/235707/
http://habrahabr.ru/company/metrotek/blog/248145/
Использую их как наглядное пособие, очень облегчают вход в тему.
За них отдельное спасибо.


Go to the top of the page
 
+Quote Post
des333
сообщение Jul 4 2015, 19:51
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Не за что.
Да, мои.


--------------------
Go to the top of the page
 
+Quote Post
dm.pogrebnoy
сообщение Jul 6 2015, 14:51
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 747
Регистрация: 11-04-07
Пользователь №: 26 933



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

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


--------------------
Go to the top of the page
 
+Quote Post
Gleb80
сообщение Jul 7 2015, 15:15
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 25-09-08
Из: Москва
Пользователь №: 40 470



Цитата(dm.pogrebnoy @ Jul 6 2015, 17:51) *
не могу принять более 128Кбайт данных от устройства


а это может быть как-то связано с размером страницы виртуальной памяти, которую выделяет ОС?
Go to the top of the page
 
+Quote Post
Gleb80
сообщение Jul 7 2015, 17:28
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 25-09-08
Из: Москва
Пользователь №: 40 470



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

В этой статье
http://habrahabr.ru/company/metrotek/blog/248145/
говорится, чтобы драйвер заработал, нужно добавить вот такой код в DTS:

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


непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>;
вроде бы номера прерываний от FPGA начинаются с 72...
Go to the top of the page
 
+Quote Post
des333
сообщение Jul 15 2015, 22:19
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(Gleb80 @ Jul 7 2015, 20:28) *
непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>;
вроде бы номера прерываний от FPGA начинаются с 72...


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


--------------------
Go to the top of the page
 
+Quote Post
des333
сообщение Jul 15 2015, 22:19
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(Gleb80 @ Jul 7 2015, 20:28) *
непонятно назначение цифр в поле interrupts = <0x0 0x28 0x1>;
вроде бы номера прерываний от FPGA начинаются с 72...


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


--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.0147 секунд с 7
ELECTRONIX ©2004-2016