Перераспределить огромный регион, полученный dma_alloc_coherent - PullRequest
0 голосов
/ 04 марта 2019

В моем старом Linux (2.6.37) выделено 12 МБ (скомпилированная карта памяти) для буферов DMA.
Мне нужно распределить ВСЕ!эта память для моих прямых доступов к памяти в больших регионах, но dma_alloc_coherent () допускает максимальный размер только 4 МБ в одном запросе.
Итак, я планировал запросить все 12 МБ в 3 последовательных запросах к dma_alloc_coherent () и затем использовать эту область в моем пути,Но, глядя на значения, которые возвращает dma_alloc_coherent (), я вижу, что реальные адреса снижаются, а виртуальные адреса ядра подсчитывают!Таким образом, самый низкий реальный адрес из 4-мегабайтной части имеет самый высокий виртуальный адрес: Virt=ff100000, Real=82000000 Virt=ff500000, Real=81c00000 Virt=ff900000, Real=81800000
Я попытался iounmap () для каждого блока, а затем ioremap () для всей 12-мегабайтной области, но получил следующее предупреждение (ошибка?):
BUG: ваш драйвер вызывает ioremap () в системной памяти.Это приводит к непредсказуемому архитектурному поведению на ARMv6 +, и ioremap () завершится с ошибкой в ​​следующем выпуске ядра.Пожалуйста, исправьте свой драйвер.
Как я могу исправить свой драйвер?

...