This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
我们使用的 是 AM5728 SoC、PROCESSOR-SDK-Linux 05.02.00.10和4.14.79内核。
请参阅以下文章以支持4G DDR。
根目录@0123456789:~# cat /proc/meminfo
总内存:3918688 KB
MemFree:3421804 KB
可用内存:3503672 KB
根目录@0123456789:~# cat /proc/iomem
(笑声)
8000000000-9ffffffff:系统 RAM
80008000-80dfff:内核代码
81000000-810c1edf:内核数据
a0000000-abffff:CMEM
ac000000-fe5ffff:系统 RAM
200000000-27fcfff:系统 RAM
它可以正常使用和释放。
但是、当使用高于0x200000000的地址作为 DMA 时、无法获取任何数据。
修改了 arch/arm/mm/kconfig 以强制 ARCH_DMA_ADDR_T_64BIT 依赖于 LPAE:
配置 ARCH_DMA_ADDR_T_64位
DEF_Bool ARM_LPAE
我的内核配置:
CONFIG_ARM_LPAL=y
CONFIG_ARCH_PHYS_ADDR_T_64BIN=y
CONFIG_ARCH_DMA_ADDR_T_64位= y
FDT:
dma_memory_region:dma-memory@b0000000{
兼容="共享 dma-pool ";
REG =<0x2 0x00000000 0x0 0x12800000>;
可重复使用;
状态="正常";
};
我可以看到 dma_addr_t 为8个字节。
sizeof (dma_addr_t)=8
DMA 读取的数据全部为0、并发生错误:
[6400.986736]------ [在此处剪切]-----
[6400.991382]警告:CPU:0 PID:0、位于./drivers/bus/omap_l3_noc.c:147 L3_INTERRUPT_Handler+0x254/0x370
[6401.000814] 44000000.OCP:L3自定义错误:主 SDMA 目标 GPMC (空闲):在功能访问期间以用户模式访问数据
当我只将器件树 DMA 保留存储器地址修改为低于0x100000000时:
reg =<0x0 0x0xb0000000 0x0 0x0x800000>;
没有问题。
因此、我想知道0x200000000以上的物理内存是否支持 DMA? 需要进行哪些更改?
此致
艾伦
您好、Allen、
此处理器上的 DMA 只能使用32位地址。
外设 DMA 仅限于32位地址空间–即、它们无法访问 DDR 前2GB 以上的存储器(上层2GB 范围映射到更高阶地址、因此仅可访问 A15、支持 LPAE 模式)。 较高的存储器区域只能用于用户模式
内核中的所有驱动程序都提供了一个 DMA 掩码、该掩码告诉内核支持的缓冲区必须位于32位地址空间内。
此致、
Vishal
您好、Vishal、
感谢您、我在仔细检查 DMA 源代码和 AM5728 DRM 后也了解到了这一点。
此致、
艾伦