История изменений
Исправление I-Love-Microsoft, (текущая версия) :
Довольно подозрительная фраза. Я хоть и не железячник, но мне кажется, что в BARn вообще не адреса RAM. Прошивке просто нечего оттуда читать.
Поправьте если ошибаюсь:
Насколько я понял, при включении компьютера, BIOS довольно простым способом опрашивает устройства с целью выяснить сколько диапазонов и каких размеров хотят устройства. Так, выяснив что устройство хочет диапазон 4K - выделяет его в общем адресном пространстве и это значение адреса попадает например в BAR0, причем адреса соседних устройств оказываются рядом, как на шашлыке нанизываются диапазон за диапазоном (в lspci это видно).
Всё общение происходит пакетами MRd->CplD (чтение - в ответ пакет с данными что лежат по этому адресу) и MWr (запись по адресу, без ответа). Если компьютер хочет записать мегабайт в устройство, то он, например начиная с адреса в BAR0, записывает этот мегабайт. Это выливается в N пакетов MWr (в зависимости от max payload к пакетам), в каждом пакете свое значение начального адреса + данные, и адрес инкрементируется. Чтение по адресу - это тоже N пакетов MRd.
Я почему засомневался... Вижу примеры для ПЛИСины по части PCI-E+SG-DMA, но там есть и другой пример, который чисто на проверку пропускной способности... и там PCI-E БЕЗ DMA на стороне ПЛИС. Там чисто чтение и запись по инициативе хоста (драйвера).
Именно так я и хочу поступить. Хочу чтобы когда нужные данные накопятся (например, если это изображение, то несколько строк) - я формирую прерывание (Message Signaled Interrupt, корка поддерживает) из ПЛИС и драйвер считывает новые данные САМ. А когда надо - записывает, т.е. всё будет по инициативе хоста.
Поэтому хочется понять как инициировать такие протяженные действия (запись большого числа байт) из драйвера Linux.
Исходная версия I-Love-Microsoft, :
Довольно подозрительная фраза. Я хоть и не железячник, но мне кажется, что в BARn вообще не адреса RAM. Прошивке просто нечего оттуда читать.
Поправьте если ошибаюсь:
Насколько я понял, при включении компьютера, BIOS довольно простым способом опрашивает устройства с целью выяснить сколько диапазонов и каких размеров хотят устройства. Так, выяснив что устройство хочет диапазон 4K - выделяет его в общем адресном пространстве и это значение адреса попадает например в BAR0, причем адреса соседних устройств оказываются рядом, как на шашлыке нанизываются диапазон за диапазоном (в lspci это видно).
Всё общение происходит пакетами MRd->CplD (чтение - в ответ пакет с данными что лежат по этому адресу) и MWr (запись по адресу, без ответа). Если компьютер хочет записать мегабайт в устройство, то он, например начиная с адреса в BAR0, записывает этот мегабайт. Это выливается в N пакетов MWr (в зависимости от max payload к пакетам), в каждом пакете свое значение начального адреса + данные, и адрес инкрементируется. Чтение по адресу - это тоже N пакетов MRd.
Я почему засомневался... Вижу примеры для ПЛИСины по части SG-DMA, но там есть и другой пример, который чисто на проверку пропускной способности... и там БЕЗ DMA на стороне ПЛИС. Там чисто чтение и запись по инициативе хоста (драйвера).
Именно так я и хочу поступить. Хочу чтобы когда нужные данные накопятся (например, если это изображение, то несколько строк) - я формирую прерывание (Message Signaled Interrupt, корка поддерживает) из ПЛИС и драйвер считывает новые данные САМ. А когда надо - записывает, т.е. всё будет по инициативе хоста.
Поэтому хочется понять как инициировать такие протяженные действия (запись большого числа байт) из драйвера Linux.