大家好、
我们使用的 是 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? 需要进行哪些更改?
此致
艾伦
