Память DMA (первые 2 ГБ)

Я хотел бы выделить память для передачи DMA между устройством PCI и оперативной памятью. Я использую следующую функцию для выделения памяти:

pci_alloc_consistent 

Я хочу выделить память под 2 ГБ. В противном случае устройство PCI выйдет из строя. Но эта функция предоставляет любой адрес из моей оперативной памяти (4Гб). Есть ли какое-нибудь решение?

BR


person manolo tunez    schedule 19.05.2016    source источник


Ответы (1)


Вы можете позвонить pci_set_coherent_dma_mask на struct pci_dev * или, что предпочтительнее, позвонить dma_set_coherent_mask на pcidev->dev, чтобы установить маску. Установка маски на DMA_BIT_MASK(31) ограничит когерентные сопоставления первыми 2 ГиБ. Для согласованности вы также можете ограничить несогласованные сопоставления, вызвав pci_set_dma_mask или dma_set_mask.

Хорошим местом для вызова вышеперечисленных функций является функция «зонда» драйвера PCI.

person Ian Abbott    schedule 20.05.2016
comment
Я думаю, что вы звучите слишком технично, и что-то вроде изменения должно быть сделано в части PCI рассматриваемого драйвера. - person 0andriy; 20.05.2016
comment
@AndyShevchenko, я добавил абзац о том, откуда вызывать функции. Извините, что звучит слишком технично. Я нацелил его на в некоторой степени техническую аудиторию — если аудитория пишет код для передачи DMA, это считается в моей книге техническими! - person Ian Abbott; 23.05.2016
comment
Я не знаю, как долго вы здесь, в SO (ага, меньше года), но по своему опыту могу сказать, что здесь много людей, которые впервые программируют в среде ядра Linux. И иногда тяжело понять, что этот человек мало что знает после нескольких пинг-понговых комментариев... Похоже, что у SO отсутствует хороший механизм предположений для поиска дубликатов (или, по крайней мере, я не знаю об этом), так как слишком много из них часто задавали подобные вопросы снова и снова. - person 0andriy; 23.05.2016