вопрос к уважаемым гуру кернела фрей. 6.1вопрос.. он громадный будет так что если кто просто на литературу толковую ссылку даст то уже буду премного признателен.
собсно.. немогу я раздуплится в использовании bus_dma... framework.
есть у меня железка PCI-ная, умная немеряно. для ее работы в памяти нужно выстроить list из структур дескрипторов типа
struct descr
{
WORD32 info1;
struct descr* next_descr;
BYTE* data;
WORD32 info2;
}
затем пихнуть железке указатель на первый дескриптор в листе, и она сама пойдет на основе info1,info2 и указателей выгребать данные из памяти.
вобщемто я понял примерно что bus_dma_tag_create подготавливает виртуальную машину к тому что будет выделятся память под ДМА и там главное указать размер участка и кол-во сегментов в нем.
затем bus_dmamem_alloc выделяет буфер и возвращает указатель на него.
а потом можно bus_dmamap_load'ом загружать в этот буфер данные и по калбеку вываливатся в процедуру, один из параметров которой - физический адрес буфера.
(это я так из скудной найденой инфы понял.. може и не совсем правильно)
теперь начинается полная каша. bus_dmamem_alloc принмает bus_dma_tag_t и возвращает указатель на буфер и bus_dmamap_t. bus_dmamap_load берет таг, мап и указатель на буффер и лоадит его в область ДМА. bus_dmamap_unload берет только таг и мап.
т.е. - можно загружать несколько буферов (я так и делаю), но выгрузка будет только для всей области целиком?????
я попробовал выделить буфер размером с 1000 дескрипторов (типа пул сделать) и все их связал в очередь. ну и забираю дескрипторы из головы а возвращаю потом в конец.
вот тут и возникает главный вопрос -
допустим я сделаю
bus_dmamap_load(v_tag, v_map, dsc_1, sizeof(struct descr), c_func, c_arg, 0);
потом
bus_dmamap_load(v_tag, v_map, dsc_2, 3*sizeof(struct descr), c_func, c_arg, 0);
bus_dmamap_load(v_tag, v_map, dsc_3, 10*sizeof(struct descr), c_func, c_arg, 0);
dsc_1 - один дескриптор взятый из пула
dsc_2 - 3 дескриптора связаных в очередь
dsc_3 - 10 --^^^^^^^^^^^^^^^^^^^^^^^^^^^^
все они загрузятся по разным физ адресам (проверял).. вот только вопрос как выгрузить использованый дескриптор и вернуть его в пул???????
т.е. чисто алгоритмически понятно - просто добавить использованые дескрипторы в хвост, но вот как это обрабатывает bus_dma я не пойму. что будет когда я при загрузке в dmamap дойду до конца пула и перейду к первому "возвращенному" дескриптору??????
вобщем допоможите чем сильны.
заранее спасибо