PCI DMA

Вопросы программного кода и архитектуры Linux

Модератор: Olej

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

PCI DMA

Непрочитанное сообщение bose » 10 май 2012, 22:19

Возникла следующая проблема. PCI устройство функционирует в нескольких режимах. В одном из режимов для работы с драйвером ему необходим DMA буфер размером 8Мб.
Для выделения буфера использую pci_alloc_consistent (целевое ядро 2.6.32, x86_64). Максимальный объём непрерывной физической памяти, который получается выделить подобным путём - 4Мб (ни страницей больше!!!). Копаясь в исходиках ядра, удалось найти константу, которая задаёт макс. размер памяти, который возможно выделить подобным путём - MAX_ORDER:
http://lxr.free-electrons.com/source/in ... 2.6.32#L24

Код: Выделить всё

#define MAX_ORDER 11
Это означает что можно выделить до 8Мб (PAGE_SIZE == 4096 == 2^12 -> 2^12 * 2^11 == 2^23 == 8Mb).

Собственно вопрос - почему 4Мб это максимальный объём DMA памяти, который я могу выделить для PCI устройства?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: PCI DMA

Непрочитанное сообщение Olej » 11 май 2012, 00:26

bose писал(а):Возникла следующая проблема. PCI устройство функционирует в нескольких режимах. В одном из режимов для работы с драйвером ему необходим DMA буфер размером 8Мб.
Для выделения буфера использую pci_alloc_consistent (целевое ядро 2.6.32, x86_64). Максимальный объём непрерывной физической памяти, который получается выделить подобным путём - 4Мб (ни страницей больше!!!). Копаясь в исходиках ядра, удалось найти константу, которая задаёт макс. размер памяти, который возможно выделить подобным путём - MAX_ORDER:
http://lxr.free-electrons.com/source/in ... 2.6.32#L24

Код: Выделить всё

#define MAX_ORDER 11
Это означает что можно выделить до 8Мб (PAGE_SIZE == 4096 == 2^12 -> 2^12 * 2^11 == 2^23 == 8Mb).

Собственно вопрос - почему 4Мб это максимальный объём DMA памяти, который я могу выделить для PCI устройства?
Я уже не совсем помню что там и как происходит, вспоминать будем ;-)
Поэтому я впрямую на ваш вопрос последний не готов ответить.

Но что обратило на себя внимание? :
- почему вы выделяете буфер pci_alloc_consistent() ?
- это как-то из числа старых API, доставшихся ещё из 2.4 ... (там могут быть всякие неожиданности),
- а взамен ему есть dma_alloc_coherent() ... а то ещё и dma_map_single(), которому буфер можно привязать "вручную".
Вот здесь есть по минимуму: http://rus-linux.net/MyLDP/BOOKS/Moduli ... 07-05.html

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: PCI DMA

Непрочитанное сообщение Olej » 11 май 2012, 00:31

bose писал(а): http://lxr.free-electrons.com/source/in ... 2.6.32#L24

Код: Выделить всё

#define MAX_ORDER 11
Это означает что можно выделить до 8Мб (PAGE_SIZE == 4096 == 2^12 -> 2^12 * 2^11 == 2^23 == 8Mb).

Собственно вопрос - почему 4Мб это максимальный объём DMA памяти, который я могу выделить для PCI устройства?
http://lxr.free-electrons.com/source/in ... 2.6.32#L28

Код: Выделить всё

28 #define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))
- это будет 2^10, а не 2^11 - не в этом ли причина?

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: PCI DMA

Непрочитанное сообщение bose » 11 май 2012, 21:25

Olej писал(а): Но что обратило на себя внимание? :
- почему вы выделяете буфер pci_alloc_consistent() ?
......
- а взамен ему есть dma_alloc_coherent() ...
Всё новое - хорошо забытое старое )))
http://lxr.free-electrons.com/source/in ... 2.6.32#L19

Код: Выделить всё

static inline void *
pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle)
{
        return dma_alloc_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, dma_handle, GFP_ATOMIC);
}

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: PCI DMA

Непрочитанное сообщение Olej » 19 авг 2012, 15:11

Мне тут по поводу совсем другой темы (PnP OS) подбросили ссылку на очень интересный документ для всех, кто интересуется программированием модулей ядра, затрагивающих PCI, DMA, PnP etc. (его и не найдёшь такой случайно по названию, если искать относительно PCI, DMA, IRQ, ...).
Вот этот документ: Plug-and-Play-HOWTO (это ссылка на оглавление, чтоб сразу увидеть затрагиваемые вопросы).
И не очень старый ... настолько, чтобы описываемыми механизмами можно было пользоваться:
v1.15, August 2007
Безумно интересный документ ... даже если что-то слегка и устарело! Воедино собрано то, что приходится собирать по крупицам из разных источников:
...
6. How Do I Find Devices and How Are They Configured?

6.1 Finding and How-Configured Are Related
6.2 Devices May Have Two "Configurations"
6.3 Finding Hardware
6.4 Boot-time Messages
6.5 The /proc Tree
6.6 The /sys Tree
6.7 PCI Bus Inspection
6.8 ISA Bus Introduction
6.9 ISA PnP cards
6.10 LPC Bus
6.11 X-bus
6.12 Non-PnP Cards
6.13 Non-PnP Cards with jumpers
6.14 Neither PnP nor jumpers
6.15 Tools for Detecting and/or Configuring all Hardware
6.16 Tools for Detecting and Configuring One Type of Hardware
6.17 Use MS Windows
7. PCI Interrupts

7.1 Introduction
7.2 History: From ISA to PCI Interrupts
7.3 Advanced Programmable Interrupt Controller (APIC)
7.4 Message Signalled Interrupts (MSI)
7.5 Sharing PCI Interrupts
7.6 Looking at Routing Tables
7.7 For More Information
7.8 PCI Interrupt Linking
...

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: PCI DMA

Непрочитанное сообщение bose » 05 окт 2012, 10:05

Olej писал(а): Вот этот документ: Plug-and-Play-HOWTO (это ссылка на оглавление, чтоб сразу увидеть затрагиваемые вопросы).
Спасибо. Есть интересны главы.
Вот PDF: Plug-and-Play-HOWTO (PDF)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: PCI DMA

Непрочитанное сообщение Olej » 22 ноя 2012, 02:42

bose писал(а):Возникла следующая проблема. PCI устройство функционирует в нескольких режимах.
Очень толковая статья о некоторых приёмах работы с PCI из кода модуля ядра: Реализация низкоуровневой поддержки шины PCI в ядре Linux ... настолько толковая, что её просто нельзя не зафиксировать в теме ;-).
Она хоть и несколько старенькая, но основные вещи там актуальные и ныне.

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей