如何在linux内核中的特定范围内分配dma缓冲区?

时间:2015-09-24 17:02:30

标签: linux linux-kernel pool restriction dma

我有一个微处理器,通过其数据缓存只能访问DDR中的0xFFFFFF字节。我可以给它偏移量,它可以开始读取这些0xFFFFFF DDR

我想为它分配dma缓冲区。

我看到我可以给一个掩码来限制这些dma缓冲区可以分配的位置。

如何知道dma_coherent_alloc为微处理器设置偏移量的分配位置?

还有其他解决方案吗? 就像分配一个大缓冲区然后在其中做一些子分配(我不知道内核是否已经有一些设施)

提前致谢。

2 个答案:

答案 0 :(得分:0)

只有当你有多个处理器时才需要使用dma_alloc_coherent。

如果是微处理器,你可以使用kmalloc并禁用缓存并使用dma_map_sg()来获取dma句柄!

答案 1 :(得分:0)

如果要在特定区域中进行分配,则可以在设备树中保留此内存,并通过DMA-API(例如dma_alloc_coherent)使用它

在设备树中:

reserved-memory {
      #address-cells = <2>;
      #size-cells = <2>;
      ranges;
  
      reserved: buffer@0 {
         compatible = "shared-dma-pool"; // to be able to access this memory throught the DMA-API
         no-map;
         reg = <0x0 0x70000000 0x0 0x10000000>;
      };
   };
  
   reserved-driver@0 {
      compatible = "xlnx,reserved-memory";
      memory-region = <&reserved>;
   };

在设备驱动程序中:

  /* Initialize reserved memory resources */
  rc = of_reserved_mem_device_init(dev);
  if(rc) {
    dev_err(dev, "Could not get reserved memory\n");
    goto error1;
  }

  /* Allocate memory */
  dma_set_coherent_mask(dev, 0xFFFFFFFF);
  lp->vaddr = dma_alloc_coherent(dev, ALLOC_SIZE, &lp->paddr, GFP_KERNEL);
  dev_info(dev, "Allocated coherent memory, vaddr: 0x%0llX, paddr: 0x%0llX\n", (u64)lp->vaddr, lp->paddr);

有关其工作原理的详尽解释:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841683/Linux+Reserved+Memory