Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Конференция IP/ESC09
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > ISA/PCI/PCI-X/PCI Express
dsmv
Доброго времени суток.

В декабре 2009 года я принимал участие в конференции IP/ESC 09;
Сайт конференции: http://www.design-reuse.com/ipesc09/

У меня был доклад посвящённый разработке DMA контроллера для PCI Express;
Название доклада: Scatter-Gather DMA IP Core for PLDA EZDMA IP

Текст и презентация прилагаются:

Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
dmitry-tomsk
Спасибо за доклад! Очень ценная информация, тоже сейчас озадачен проблемой приёма completion tlp в своём собственном SGDMA контроллере.
А почему Вы выбрали такие огромные буферы для completion (4 кБ)? Пока не встречал материнок, которые бы выдавали больше 128 байт MAX_READ_SIZE. Да и со стороны корок xilinx ограничение 512 байт.
В теории root complex может разбивать ответ на read request на несколько частей и отправлять несколько completion. Интересует вопрос, может ли root complex поменять местами эти completion? Не пробовали для такого случая отлеживать lower address в заголовке TLP completion, чтобы проверить порядок прихода?
dsmv
Цитата(dmitry-tomsk @ Mar 8 2010, 20:02) *
А почему Вы выбрали такие огромные буферы для completion (4 кБ)?


Это размер минимального фрагмента физической памяти на который делиться выделяемый блок в USER Memory.
Только в USER Memory мы можем выделить большой блок памяти - например 1536 МБайт; Но он будет разбит на страницы по 4 килобайта.

Я использую ядро PLDA. В нём уже достаточно высокий уровень общения с PCI Express. Есть каналы DMA и обращения к регистрам. Т.е. на уровне TLP я не работаю.

Я формирую запрос к контроллеру DMA ядра PLDA на чтение блока размером 4 килобайта.
Ядро PLDA формирует до 8 запросов на чтение. Вот эти запросы ограничены максимальным PAYLOAD 128 или 256 байт.
И ответы могут придти в любом порядке. А могут и вообще не придти - это и будет Completion Timeout.
Если формировать только один запрос и ждать ответа - это очень медленно. А 8 запросов позволяют получить практически непрерывный поток - но требуется сортировка по адресам.
Ядро PLDA сопровождает ответ адресом - скорее всего это как раз используется lower address в заголовке TLP completion.
dmitry-tomsk
Спасибо. Понятно. А что если будете читать непрерывный блок памяти > 4 кБ? На мой взгляд, достаточно иметь буфер MAX_READ_SIZE*8 (1 кБ), общий на все каналы. Правда для сортировки придётся использовать теги пакетов, чтобы узнать старшую часть адреса данных и номер канала. Не знаю, позволит ли ядро plda это делать.
dsmv
Цитата(dmitry-tomsk @ Mar 9 2010, 14:23) *
Спасибо. Понятно. А что если будете читать непрерывный блок памяти > 4 кБ? На мой взгляд, достаточно иметь буфер MAX_READ_SIZE*8 (1 кБ), общий на все каналы. Правда для сортировки придётся использовать теги пакетов, чтобы узнать старшую часть адреса данных и номер канала. Не знаю, позволит ли ядро plda это делать.


У меня непрерывный поток данных. Передача может идти в течении многих часов. Поэтому для канала DMA у меня есть два блока памяти размером 4 кбайта.
После того, как 4 килобайта будут приняты - блоки меняются местами. Во второй блок начинается чтение, а из первого данные передаются в FIFO для дальнейшей обработки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.