Jump to content

    

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)?

Share this post


Link to post
Share on other sites

Ограничение возможно изза организации ддр,

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

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

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

А что я вам без лога кернела скажу? Ну ква...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now