我有一个微处理器,通过其数据缓存只能访问DDR中的0xFFFFFF字节。我可以给它偏移量,它可以开始读取这些0xFFFFFF DDR
我想为它分配dma缓冲区。
我看到我可以给一个掩码来限制这些dma缓冲区可以分配的位置。
如何知道dma_coherent_alloc为微处理器设置偏移量的分配位置?
还有其他解决方案吗? 就像分配一个大缓冲区然后在其中做一些子分配(我不知道内核是否已经有一些设施)
提前致谢。
答案 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