LINUX.ORG.RU

DMA


0

1

В ядре dma_pool_create, dma_alloc_coherent, dma_pool_alloc в случае провала возвращают NULL? (Хочу убедиться что я правильно понял исходники)

Ответ на: комментарий от anonymous

И там ты можешь найти ответы на свои вопросы. Это, конечно, не так круто, как чтение кода, но тоже эффективно.

tailgunner ★★★★★
()

В догонку, как перевести виртуальный адрес ядра (принадлежащий буферу выделенному под dma) в dma_addr_t ?

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> Иными словами сколь корректно говорить что some+ptr + 1 соответствует dma_prt + 1?

Если some_ptr соответствует dma_ptr, то полностью.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Хотя нет, это я глупость ляпнул - зависит от вида some_ptr. Если он от vmalloc, то равенство может и не соблюдаться.

tailgunner ★★★★★
()
Ответ на: комментарий от mskmsk1985

> В догонку, как перевести виртуальный адрес ядра (принадлежащий буферу выделенному под dma) в dma_addr_t ?

Не понял? Тебе dma_pool_alloc() возвращает dma_addr_t + виртуальный адрес в пространстве ядра.

Ты можешь попробовать virt_to_bus, но это 1) не портабельно 2) deprecated 3) я не знаю, есть ли они в последних ядрах.

anonymous
()

>В ядре dma_pool_create, dma_alloc_coherent, dma_pool_alloc в случае провала возвращают NULL?

Либо ты толстый тролль, либо этот вопрос — диагноз.

ttnl ★★★★★
()
Ответ на: комментарий от tailgunner

А даже если и страницами, если у меня буфера на страницу не влезают? (Хотя у меня контроллеры PDC указатели умеют только последовательно инкрементировать и следовательно tailgunner в моем случае прав. А вообще DMA коннтроллеры разве работают не поверх IOMMU? т. е. разве они не видят уже непрерывное отображение?)

mskmsk1985
() автор топика
Ответ на: комментарий от ttnl

А если по делу, то меня очень напрягает наличие в ядре вещей типа PTR_ERR и компании, пока не смог для себя вывести четких правил о границах их применения, если они Вам известны, поделитесь знаниями плиз.

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> Хотя у меня контроллеры PDC указатели умеют только последовательно инкрементировать и следовательно tailgunner в моем случае прав

Если ты хочешь замапить для DMA буфер, выделенный через vmalloc, то я прав только в пределах первой страницы.

А вообще DMA коннтроллеры разве работают не поверх IOMMU?

Поверх или пониз - неважно. Просто IOMMU в той реальности, где я, встречаются реже динозавров.

И независимо от существования IOMMU, память надо мапить точно и через документированные API.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

API для выделения когерентных DMA буферов само их и распределяет и мапирует так что vmalloc там не причем.

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> API для выделения когерентных DMA буферов само их и распределяет и мапирует

Ты говорил о dma_addr_t, не упоминая, из какого источника он получен.

tailgunner ★★★★★
()
Ответ на: комментарий от mskmsk1985

> А вообще DMA коннтроллеры разве работают не поверх IOMMU?

Причём здесь контроллеры DMA? DMA могут делать и сами устройства, если есть доступ к памяти. Адреса, по которым устройство пишет/читает в память ничего общего с адресами, к которым обращается CPU, не имеет. Особенно, если у нас есть IOMMU.

anonymous
()
Ответ на: комментарий от anonymous

Справка, для того чтобы как Вы пишете устройство могло само делать DMA оно должно включать в себя контроллер DMA (как правило программируемый) который от имени этого устройства как раз и осуществляет доступ к памяти, само устройство с бухтф барахты в память не полезет. Так вот этот самый контроллер работает с адресами IOMMU или с физическими адресами (контроллеры первого типа встречал а вот второго нет)?. И вообще CPU к IOMMU не имеен никакого отношения.

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

Есть два «вида» «контроллеров» (если вам так уж нравится слово «контроллер») DMA:

1) Generic purpose

Могут осуществлять трансфер RAM - RAM, Device -> RAM, RAM -> Device, и иногда Device - Device.

Часто поддерживают такие фичи, как произвольный (обычно в словах) инкремент, включая 0 (тогда можно заполнять разные FIFO устройств, например - разные UART'ы), и SG, представленны отдельным «устройством»

2) «Built-in» DMA «controller» (часто называют как 'dma engine', дабы не писать 'usb controller has built-in dma controller')

Обычное bus master устройство. Позволяет делать RAM -> Device / Device -> RAM (Device = это же самое устройство, писать в другие устройства нельзя). В наши дни подобные «контроллеры DMA» есть во всех более-менее сложных устройствах и

То, какие транзакции проходят через IOMMU, зависит от топологии шин устройства. В качества примера советую посмотреть на вот такие старые компьютеры (circa 1995): http://en.wikipedia.org/wiki/SPARCstation_5 и ознакомится с их архитектурой. Все SBus устройства работают с виртуальными адресами, каждое устройство получает виртуальный кусок памяти, начинающийся с 0 адреса и все транзакции проходят через IOMMU

anonymous
()
Ответ на: комментарий от anonymous

Так вот мне и интересно в каких шинах и на каких топологиях при наличии IOMMU транзакции от DMA контроллеров проходят «мимо» IOMMU?

mskmsk1985
() автор топика
Ответ на: комментарий от anonymous

Ну гуглом я пользоваться умею, думал Вам известен пример где при наличии IOMMU DMA работает не с виртуальыми адресами.

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

Блин, какой же ты трудный ;) Что такое GART? Это и есть IOMMU. Найти его можно на x86. Дальше продолжать?

anonymous
()
Ответ на: комментарий от anonymous

Я не спрашивал где можно найти IOMMU, это я и так знаю, я просил привести пример «где DMA при наличие IOMMU работает не с виртуальными адресами» вопрос то хоть понятен?

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

>Положим что some_ptr это char* полученный от dma_alloc_coherent

На arm-ах будет 1:1, тебя же вроде армы интересуют судя по PDC (atmel?). Но если тебе не нужен одновременный доступ и pdc и процессора - лучше использовать streaming DMA - армы и так очень медленно работают с памятью, отключение буферизации и кеширования это вообще лом в колеса.

anonymous
()
Ответ на: комментарий от anonymous

С точки зрения «здесь и сейчас» - да, у меня AT91 и кодеки для SSC над головой висят. Про streaming DMA подумаем, сколь оно покатит, спасибо за совет.

А с точки зрения для «общего развития» - нет, интересен вопрос во всей своей многожелезной красе.

mskmsk1985
() автор топика
Ответ на: комментарий от anonymous

Кроме того как показали опыты когерентный ДМА на arm крайне не стабильная (если не сказать глючная) вещь, приводящая к некоррекному поведению при изменении казалось бы совершенно не связанных мест программы. Оказалось есть большой смысл от того где имено распределяются и уничтожаются буферы (тупая перемена местами десяти строк несвязанного логически между собой кода может поломать все нахрен). Stream работате пока как часы.

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> Я не спрашивал где можно найти IOMMU, это я и так знаю, я просил привести пример «где DMA при наличие IOMMU работает не с виртуальными адресами» вопрос то хоть понятен?

Не строй идиота из себя. Это зависит от топологии. В качестве примера посмотри на х86 и GART. Что не ясно???

anonymous
()
Ответ на: комментарий от anonymous

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

mskmsk1985
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.