Aleksei_Rostov 0 9 мая, 2020 Опубликовано 9 мая, 2020 · Жалоба Здравствуйте! Уважаемые специалисты не получается зарезервировать буфер для ДМА объемом свыше 8 Мбайт в kernel модуле. Написал свой драйвер для ДМА (axi dma Zynq 7000), в котором резервирую буфер для ДМА. static int my_axi_dma_probe(struct platform_device *pdev) { struct resource *r_irq; /* Interrupt resources */ struct resource *r_mem; /* IO mem resources */ struct device *dev = &pdev->dev; struct my_axi_dma_local *lp = NULL; ...................................................... lp = (struct my_axi_dma_local *) kmalloc(sizeof(struct my_axi_dma_local), GFP_KERNEL); if (!lp) { dev_err(dev, "Cound not allocate my-axi-dma device\n"); return -ENOMEM; } ..................................................... lp->dma_buffer_virtual_address = dma_alloc_coherent ( dev, 0x00080000, &lp->dma_buffer_physical_address , GFP_KERNEL ); dev_info(dev,"my-axi-dma buffer physical address: %x, virtual address: %x\n", lp->dma_buffer_physical_address, lp->dma_buffer_virtual_address ); .................................................... }; Вот когда в функцию dma_alloc_coherent размер буфера записываю больше, чем 8 Мб , то dev_info выдает значение физического адреса 0xFFFFFFFF и виртуального 0. При размере буфера 8 и менее Мб все работает. Объем ДДР у меня 512 Мб. Вопросы: 1. Почему не получается зарезервировать буфер более 8 Мб и увеличение объема ДДР решит проблему? 2. Чем определяется максимальный объем памяти, резервируемый функцией dma_alloc_coherent? 3. Можно ли самому назначить физический адрес начала буфера (lp->dma_buffer_physical_address)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aldec 0 9 мая, 2020 Опубликовано 9 мая, 2020 · Жалоба Ограничение возможно изза организации ддр, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 9 мая, 2020 Опубликовано 9 мая, 2020 · Жалоба 50 минут назад, Alexey_Rostov сказал: Здравствуйте! Уважаемые специалисты не получается зарезервировать буфер для ДМА объемом свыше 8 Мбайт в kernel модуле. оно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 1 9 мая, 2020 Опубликовано 9 мая, 2020 · Жалоба 1. Про CMA - мысль правильная. 2. Читать первоисточник Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksei_Rostov 0 10 мая, 2020 Опубликовано 10 мая, 2020 · Жалоба On 5/9/2020 at 11:31 AM, Jury093 said: оно? Спасибо, Юрий, действительно оно. На форуме Xilinx, как с помощью Petalinux настроить данный параметр https://forums.xilinx.com/t5/Embedded-Linux/wherer-to-set-CMA-for-Petalinux/td-p/936237 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 1 10 мая, 2020 Опубликовано 10 мая, 2020 · Жалоба ПО мне так вариант с DT более правильный и гибкий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksei_Rostov 0 10 мая, 2020 Опубликовано 10 мая, 2020 · Жалоба 1 minute ago, gosha-z said: ПО мне так вариант с DT более правильный и гибкий. А что значит с DT? И в соседнем посте вы как то ответили, что от петалинукса лучше отказаться для сборки модулей (и я так понимаю образа Линукса в целом), чем Петалинукс плох? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 1 10 мая, 2020 Опубликовано 10 мая, 2020 · Жалоба 11 minutes ago, Alexey_Rostov said: А что значит с DT? Описание размера блока CMA в Device Tree 11 minutes ago, Alexey_Rostov said: чем Петалинукс плох? Своей монструозностью. Для того, чтобы банально драйвер поменять надо пройтись по всем рецептам и проверить. не поменялось ли чего. А их там, мягко говоря, дохрена. А время - деньги. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksei_Rostov 0 10 мая, 2020 Опубликовано 10 мая, 2020 · Жалоба 1 hour ago, gosha-z said: Описание размера блока CMA в Device Tree Тестирую свой модуль. С параметром CMA интересно получилось - задал значение 256 Мб, а в модуле могу зарезервировать максимум только 128 Мб. Задал значение 512 Мб, резервирую максимум 256.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 1 10 мая, 2020 Опубликовано 10 мая, 2020 · Жалоба А что я вам без лога кернела скажу? Ну ква... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 23 декабря, 2022 Опубликовано 23 декабря, 2022 · Жалоба Не подскажете, а без этого CMA какой максимальный объем можно выделять через dma_alloc_coherent? И всегда ли на всех системах можно рассчитывать на 512 килобайт даже? Читал где то, что всё бьется на страницы памяти 4 килобайта например, и по мере работы фрагментация снижает шансы на выделение этих несчастных даже 128 килобайт, опасно И не налагает ли в dma_alloc_coherent вот это coherent дополнительных накладных расходов и оверхедов? Поэтому я всегда работал через выделение N буферов по например 4 килобайт (или получал размер страницы памяти настроенной в ядре). Так меня учили гуру, опытные линуксоиды "А что, так можно было?" (с) Просто врубить CMA на сотню мегабайт и наслаждаться однократно выделенным буфером? Какие недостатки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться