Перейти к содержанию
    

dma_alloc_coherent: резервирование буфера для ДМА

Здравствуйте! Уважаемые специалисты не получается зарезервировать буфер для ДМА объемом свыше 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)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

50 минут назад, Alexey_Rostov сказал:

Здравствуйте! Уважаемые специалисты не получается зарезервировать буфер для ДМА объемом свыше 8 Мбайт в kernel модуле.

оно?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, gosha-z said:

ПО мне так вариант с DT более правильный и гибкий.

А что значит с DT?

И в соседнем посте вы как то ответили, что от петалинукса лучше отказаться для сборки модулей (и я так понимаю образа Линукса в целом), чем Петалинукс плох?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, Alexey_Rostov said:

А что значит с DT?

Описание размера блока CMA в Device Tree

11 minutes ago, Alexey_Rostov said:

чем Петалинукс плох?

Своей монструозностью. Для того, чтобы банально драйвер поменять надо пройтись по всем рецептам и проверить. не поменялось ли чего. А их там, мягко говоря, дохрена. А время - деньги.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, gosha-z said:

Описание размера блока CMA в Device Tree

Тестирую свой модуль. С параметром CMA интересно получилось - задал значение 256 Мб, а в модуле могу зарезервировать максимум только 128 Мб. Задал значение 512 Мб, резервирую максимум 256....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не подскажете, а без этого CMA какой максимальный объем можно выделять через dma_alloc_coherent? И всегда ли на всех системах можно рассчитывать на 512 килобайт даже? Читал где то, что всё бьется на страницы памяти 4 килобайта например, и по мере работы фрагментация снижает шансы на выделение этих несчастных даже 128 килобайт, опасно

 

И не налагает ли в dma_alloc_coherent вот это coherent дополнительных накладных расходов и оверхедов?
 


Поэтому я всегда работал через выделение N буферов по например 4 килобайт (или получал размер страницы памяти настроенной в ядре). Так меня учили гуру, опытные линуксоиды

 

"А что, так можно было?" (с) Просто врубить CMA на сотню мегабайт и наслаждаться однократно выделенным буфером? Какие недостатки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...