Подтвердить что ты не робот

Как DMA работает с устройствами PCI Express?

Предположим, что ЦП хочет сделать передачу чтения DMA с устройства PCI Express. Связь с устройствами PCI Express обеспечивается пакетами пакетов транзакций (TLP). Теоретически максимальный размер полезной нагрузки составляет 1024 двойного слова для TLP. Итак, как работает контроллер DMA, когда ЦП дает команду чтения DMA для устройства PCI Express размером 4 мегабайта?

4b9b3361

Ответ 1

В фазе перечисления PCIe определяется максимальный разрешенный размер полезной нагрузки (он может быть ниже размера максимальной полезной нагрузки устройства: например, промежуточный переключатель PCIe имеет меньший максимальный размер полезной нагрузки).

Большинство устройств PCIe являются мастерами DMA, поэтому драйвер передает команду на устройство. Устройство отправит несколько пакетов для передачи 4 мегабайтов в размерах TLP размером xx max.

Изменить 1 в ответ на комментарий 1:

Шина на основе PCI не имеет "контроллера DMA" в виде микросхемы или подсхемы в наборе микросхем. Каждое устройство на шине может стать мастером шины. Основная память всегда является подчиненным.

Предположим, вы создали свою собственную карту PCIe, которая может выступать в роли ведущего устройства PCI, а ваша программа (работающая на CPU) хочет отправить данные с этой карты в основную память (4 MiB).

Драйвер устройства знает сопоставление памяти для этой конкретной области памяти из операционной системы (некоторые ключевые слова: отображение с отображением памяти, перечислимость шины PCI, PCI BARs).

Драйвер передает команду (запись), адрес источника, адрес назначения и длину устройства. Это можно сделать, отправив байты на специальный адрес внутри предварительно определенного BAR или записав в конфигурационное пространство PCI. Мастер DMA на карточках проверяет эти особые регионы на новые задачи (списки рассогласования). Если это так, тезисы задаются в очереди.

Теперь мастер DMA знает, куда отправлять, сколько данных. Он будет считывать данные из локальной памяти и переносить их на 512-байтные TLP с максимальным размером полезной нагрузки (максимальный размер полезной нагрузки на основной файловой системе пути - это информация из перечисления) и отправить ее на адрес назначения. Механизмы маршрутизации на основе PCI-адреса направляют эти TLP в основную память.

Ответ 2

Очень полезный пост от вас. У меня есть еще один основной вопрос. У меня есть графическая карта, подключенная через интерфейс x86PC-PCIe> У карты есть собственная внутренняя память. Теперь я хочу передать данные из DDR DDR на карту DDR с использованием PCI-DMA.

Итак, как именно я могу это сделать в своем драйвере (linux).

Здесь я не могу использовать общий dma apis, предоставляемый linux. (Я предполагаю, что этот общий dma apis использует System DMA-контроллер по умолчанию не PCI-DMA).

Есть ли api в linux для ПК x86, который позволяет мне настроить двигатель dma, который хочет использовать мой драйвер?

Любые предложения или указатели будут очень полезны.