PCI burst transactions
От: andykang  
Дата: 25.10.06 06:29
Оценка:
День добрый. Никогда прежде не работал с PCI, однако жизнь заставила. Чтение конфигурационного пространства и чтение/запись в режиме PIO уже освоил. Хочется попробовать burst mode. Платформа x86 (embedded). Есть development board с загруженным ядром PCI. Инфы никакой нет на данный момент, опыта в данной области почти ноль. Может кто подсказать, в каком направлении рыть, что почитать? Может ссылочки на примеры, как это программить. Спецификация PCI есть и иногда почитывается, однако этого явно недостаточно. Спасибо за любую помощь.
Re: PCI burst transactions
От: Геннадий Майко США  
Дата: 25.10.06 07:28
Оценка:
Здравствуйте, andykang,

A>День добрый. Никогда прежде не работал с PCI, однако жизнь заставила. Чтение конфигурационного пространства и чтение/запись в режиме PIO уже освоил. Хочется попробовать burst mode. Платформа x86 (embedded). Есть development board с загруженным ядром PCI. Инфы никакой нет на данный момент, опыта в данной области почти ноль. Может кто подсказать, в каком направлении рыть, что почитать? Может ссылочки на примеры, как это программить. Спецификация PCI есть и иногда почитывается, однако этого явно недостаточно.

--
Прежде всего вопрос — как Вы хотите проверить, что обращение к Вашей плате действительно идет в "burst mode"? Быть может, Вы и так иногда работаете в этом режиме.


При работе с PCI устройствами у программы очень мало возможностей влиять на работу PCI устройств в "burst mode". Даже если Вам и удасться каким-то способом беспечить условия для работе в режиме burst со стороны PCI initiater, PCI target может в любой момент завершить транзакцию.

Однако, в зависимости от конфигурации всех PCI bus и места Вашего устройства в этой иерархии, host PCI и PCI-to-PCI bridge могут самостоятельно объединять некоторые транзакции в burst'ы (см. i.3.2.6 "Combining, merging and collapsing" в PCI Local bus Specification). Поэтому, в принципе, как-то повлиять на эту возможность можно с помощью конфигурация этих bridg'ей; однако, например, Windows не позволяет добраться к регистрам PCI-to-PCI bridge и управляет ими самостоятельно.
Вполне возможно, что в Вашем PCI-устройстве есть внутренние FIFO, конфигурацию которых можно изменить. Это может косвенно повлиять на работу этого устройства в "burst mode".

Мы как-то экспериментировали с одним из наших PCI-устройствов для оценки использования burst при записи в режиме PIO. В процедуре обработки прерывания от этого устройства (это более-или менее гарантировало "непрерываемость" этого кода) мы в цикле записывали 512 DWORD в устройство и наблюдали, что происходит на PCI bus с помощью логического анализатора. Обычно на этой шине мы видели burst'ы в 16-32 DWORD. Можете попробовать проделать то же самое.

Если Ваше устройство поддерживает передачу данных с помощью DMA и является DMA master, то очень часто такая передача данных происходит в режиме burst.

C уважением,
Геннадий Майко.
Re[2]: PCI burst transactions
От: TarasCo  
Дата: 25.10.06 07:52
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Мы как-то экспериментировали с одним из наших PCI-устройствов для оценки использования burst при записи в режиме PIO. В процедуре обработки прерывания от этого устройства (это более-или менее гарантировало "непрерываемость" этого кода) мы в цикле записывали 512 DWORD в устройство и наблюдали, что происходит на PCI bus с помощью логического анализатора. Обычно на этой шине мы видели burst'ы в 16-32 DWORD. Можете попробовать проделать то же самое.


Подтвержадаю. Также в свое время через PIO писали в устройство на базе чипа PLX — также на шине наблюдались пакетные циклы длинной примерно как указал Геннадий.
Да пребудет с тобою сила
Re[2]: PCI burst transactions
От: andykang  
Дата: 25.10.06 11:17
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Прежде всего вопрос — как Вы хотите проверить, что обращение к Вашей плате действительно идет в "burst mode"? Быть может, Вы и так иногда работаете в этом режиме.


Вот я и не знаю, как проверить. Возможно мне это и не совсем нужно. Занимаюсь этим скорее из желания понять, как устроена шина и как ее программировать. Мне важно понять методику работы. К примеру, если мне нужно прочитать данные, я пишу в программе:

ReadFromPCIMemory = *((DWORD volatile*)(Bar[2]));

По идее выполняется команда Memory Read, которая инициируется моей программой, заставляя устройство на том конце шины отдать dword данных (или больше?). А если я хочу читать блоками, не занимаю процессор на чтение каждого двойного слова? По идее я должен разбираться с тем устройством, и задавать ему соотвествующий режим, а в своей программе как-то выделять буфер, куда будут складываться данные (и устройство должно как-то знать об этом) и писать какой-то обработчик прерывания. Вобщем, мне очень нужен элементарный ликбез в данной области.
Спасибо.
Re[3]: PCI burst transactions
От: TarasCo  
Дата: 25.10.06 12:52
Оценка:
Здравствуйте, andykang, Вы писали:

A>А если я хочу читать блоками, не занимаю процессор на чтение каждого двойного слова? По идее я должен разбираться с тем устройством, и задавать ему соотвествующий режим, а в своей программе как-то выделять буфер, куда будут складываться данные (и устройство должно как-то знать об этом) и писать какой-то обработчик прерывания. Вобщем, мне очень нужен элементарный ликбез в данной области.


Тогда Вам нужен PCI Busmaster. Работа с ними происходит примерно по такому алгоритму:
1. Выделяется область памяти.
2. Устройству через его управляющие регистру задается начальный адрес, куда будет происходит запись, длина региона и, возможно, какие то дополнительные данные
3. По окнчанию записи устройство генерирует прерывание ( как правило ). Обработчик выполняет дальнейшие действия по обработке данных. Как правило, регистрирует DPC процедуру, в которой может быть к примеру завершен соответсвующий запрос ВВ ( IRP ).
Да пребудет с тобою сила
Re[3]: PCI burst transactions
От: Геннадий Майко США  
Дата: 25.10.06 13:07
Оценка:
Здравствуйте, andykang,

ГМ>>Прежде всего вопрос — как Вы хотите проверить, что обращение к Вашей плате действительно идет в "burst mode"? Быть может, Вы и так иногда работаете в этом режиме.


A>Вот я и не знаю, как проверить. Возможно мне это и не совсем нужно. Занимаюсь этим скорее из желания понять, как устроена шина и как ее программировать. Мне важно понять методику работы. К примеру, если мне нужно прочитать данные, я пишу в программе:


A>ReadFromPCIMemory = *((DWORD volatile*)(Bar[2]));


A>По идее выполняется команда Memory Read, которая инициируется моей программой, заставляя устройство на том конце шины отдать dword данных (или больше?). А если я хочу читать блоками, не занимаю процессор на чтение каждого двойного слова? По идее я должен разбираться с тем устройством, и задавать ему соотвествующий режим, а в своей программе как-то выделять буфер, куда будут складываться данные (и устройство должно как-то знать об этом) и писать какой-то обработчик прерывания. Вобщем, мне очень нужен элементарный ликбез в данной области.

--
Может быть, Вы смешиваете понятия "burst mode" и Direct Memory Access (DMA)?

Если Вы хотите передавать данные, не занимая такты процессора, Вы можете использовать механизм DMA. Для PCI шины контроллер DMA обычно встраивается в само это устройство. Для его работы нужно выделить non-pageable буфер в памяти PC и запрограммировать этот контроллер соответствующим образом, примерно так, как Вы описали (передавая ему адрес этого буфера, размер передаваемого блока данных и т.п.). После запуска DMA передача данных осуществляется независимо от работы CPU. После окончания передачи этот контроллер прерываний может, например, сгенерировать прерывание для сигнализации CPU, что операция передачи закончена. Есть еще контроллеры DMA, поддерживающие режим scatter-gather; некоторые контроллеры могут работать в demand mode, могут делать еще какие-то действия над передаваемыми данными и т.п. К cожалению (или к счастью , нет стандартного контроллеры DMA для PCI устройств, каждый производитель делает что-то свое. Какое именно устройство Вы используете и есть ли в нем контроллер DMA?

А вот сама передача данных по шине PCI может осуществляться или одиночными транзакциями, или в виде burst, и она не зависит от того, кто передает эти данные — CPU или контроллер DMA. Например, вполне можно найти контроллер DMA, передающий данные по шине PCI одиночными транзакциями.

Кстати, в Вашем примере (чтение данных из PCI устройства) CPU будет ждать окончания этой сравнительно медленной операции. При записи данных сама операция закончилась бы гораздо быстрее, так как PCI bridge возвращают успешный результат окончания операции, даже если физически сама запись еще не закончилась. И в таком случае вполне возможно добиться объединения последовательных одиночных записей в один burst.

C уважением,
Геннадий Майко.
Re[3]: PCI burst transactions
От: 486 США  
Дата: 25.10.06 13:21
Оценка:
To andykang.

По идеи ты должен прошерстить документацию по загружаемому PCI ядру. Если это официально купленная , то вопрос о доступности документации к производителю, ну а если нет ...... Но должен быть гдето описан этот процесс подробно.

Я работаю с DSP так там поддерживается DMA трансфер, но весе нужно делать самому, т е перепрограммировать DMA, потом проверять были ли ошибки и повторять блок. Очень тяжкая это работа , т к на ассемблере писал (это все вчерашний день. Я читал описание некоторых контроллеров, так там есть FIFO, в него ложим данные и ждем пока данные передадутся из FIFO на PCI шину.) Так вот, весь этот процесс описан в документации к DSP. Примерно это выглядел он так. Драйвер аллоцирует память, потом передает этот адрес в PCI устройство, это устройство гонит данные прямо в память компьютера. Когда буфер заполнен PCI устройство дергает интеррапт линию и драйвер начинает вычерпывать данные из буфера.

По поводу берстов. Через PCI шину можно гарантированно гнать данные блоками определенной длины (32 слова максимум) и никто не заберет шину во время этой передачи. Поэтому я программировал DMA на PCI плате , чтоб он трансферил по 32 слова. В этом случае получалась максимальная производительность. В современных БИОСах это значение можно менять 8/16/32.

Экспериментальным путем выяснил, что верст в 32 слова не работает на некоторых хреновых материнках, а 16 работает стабильно.
Также плохо это дело обстояло с индустриальными компьютерами , у которых стояли PCI bridge. На таких системах только при 8 словах все работало нормально.

Драйвер не читал значение берстов из БИОСА , не программировал бриджи и чипсеты. Пользователь мог только из своего приложения установить ширину берста 8 или 16.
Re[4]: PCI burst transactions
От: Геннадий Майко США  
Дата: 25.10.06 14:37
Оценка:
Здравствуйте, 486,

486>По поводу берстов. Через PCI шину можно гарантированно гнать данные блоками определенной длины (32 слова максимум) и никто не заберет шину во время этой передачи. Поэтому я программировал DMA на PCI плате , чтоб он трансферил по 32 слова. В этом случае получалась максимальная производительность. В современных БИОСах это значение можно менять 8/16/32.

--
Мне кажется немного странным то, что DMA контроллер программируется на передачу только 32 DWORD. Да, Вы сможете обеспечить полную загрузку PCI шины сразу же после старта DMA, но после окончания передачи Вам нужно будет перепрограммировать DMA контроллер, нет? Если да, то для передачи, скажем 1024 DWORD'ов у Вас возникнет 32 прерывания, обработка каждого из которых наверняка занимает 5-10 обращений к PCI устройству.
С другой стороны, если запрограммировать DMA контроллер, например, на передачу 1024 DWORD, то мы получим, во-первых, только одно прерывание и, во-вторых, PCI устройство по прежнему сможет передавать данные в виде burst'a.

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

C уважением,
Генадий Майко.
Re[5]: PCI burst transactions
От: 486 США  
Дата: 25.10.06 17:01
Оценка:
ГМ>С другой стороны, если запрограммировать DMA контроллер, например, на передачу 1024 DWORD, то мы получим, во-первых, только одно прерывание и, во-вторых, PCI устройство по прежнему сможет передавать данные в виде burst'a.

ГМ>В среднем во втором случае вроде бы должен получиться выигрыш в производительности за счет меньшего использования медленных операций на PCI шине при обработке операций прерывания и перепрограммирования DMA контроллера.



Да конечно , в результате получается не полная загрузка, т к теряется время на перестартовку.

Я говорил за мой конкретный случай с DSP. Там весь механизм контроля передачи возложен на плечи программера. В смоем случае для передачи 1024 DWORD'ов нужно 32 раза перезапустить DSPшний DMA , предварительно проверив наличие ошибок при передаче предыдущего блока. После 32 перезапусков DMAя , DSP дергает PCIю интеррапт линию. В таком режиме получалось передать данные быстрее, чем гнать весь блок размером в 1024 слова. Если была ошибка, то приходилось снова передавать полный блок размером 1024.

Другое дело на PowerPСшных процах от Мотололлы/Фриискеил (не на всех, в семье не без урода) программируется: откуда брать данные, куда их ложить, размер блока. DMA блок сам передает данные на хост, проверяет ошибки PCI шины, а потом рапортует об успешной передаче. Как работает этот DMA не знаю, т к тайминг не мерил. Это было не критично для меня.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.