Jump to content

    
Aleksei_Rostov

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
50 минут назад, Alexey_Rostov сказал:

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

оно?

 

Share this post


Link to post
Share on other sites
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

 

 

Share this post


Link to post
Share on other sites
1 minute ago, gosha-z said:

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

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

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

Share this post


Link to post
Share on other sites
11 minutes ago, Alexey_Rostov said:

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

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

11 minutes ago, Alexey_Rostov said:

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

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

Share this post


Link to post
Share on other sites
1 hour ago, gosha-z said:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.