Part Number:AM5728Other Parts Discussed in Thread:AM4378
linux版本:linux 4.9.69
操作:内核驱动通过dma_alloc_coherent申请内存,然后通过dma将gpmc数据搬运到申请到的内存中,通过netlink将物理地址发送给上层应用程序,上层应用程序将地址mmap后把数据读取.
结果:上层读取到的数据和内核不一致。(内核将发送的地址数据存成文件,上层应用程序也将数据存成文件,将两个文件compare。)
初步分析:1.内核驱动通过dma_alloc_coherent申请内存,然后通过dma将gpmc数据搬运到申请到的内存中,在zmalloc一块地址,在
2.对比出错的两个文件发现,出错的地方正是上一次的数据,初步怀疑是上层应用程序读取数据时,cache中的数据没有刷入内存中。
3.相同的操作在am4378上是没有问题的,但是4378上linux版本为4.1.18。
请帮忙分析一下吧,看看是哪里配置不正确吗?谢谢!
Cherry Zhou:
您好,我们已收到您的问题并升级到英文论坛寻求帮助,链接如下,如有答复将尽快回复您:
e2e.ti.com/…/am5728-the-data-read-by-the-upper-layer-is-inconsistent-with-the-kernel
,
?? ?:
昨天我做的有一个实验有新的发现,step1.将配置文件中#CONFIG_SMP、#CONFIG_SMP_ON_UP 将多核屏蔽,step2.CONFIG_CPU_DCACHE_DISABLE=y、CONFIG_CPU_ICACHE_DISABLE=y将cache禁止掉,step3.重新按上述操作,内核和应用程序读取到的数据是一致的。结论:问题差不多应该是多核cache不一致导致的,但是当前我们是需要使用多核的,该怎么配置,才能正常使用呢?
,
?? ?:
这是在最新的 6.3 SDK 上重现。
我的操作步骤如下:step1.内核通过dma_alloc_coherent申请大小为100M的地址,然后通过dma将gpmc的数据搬移到内存step2.内核将内存的数据保存到文件step3.内核通过netlink将dma的物理地址发送给应用程序,应用程序mmap后,将数据保存到文件step4.比较两个文件内容数据,部分数据不一致
,
Cherry Zhou:
好的我们反馈给工程师了,有新的进展会尽快给到您。
,
Cherry Zhou:
您好,
十分抱歉这么晚才回复您。
根据上述步骤:我们是否需要向 GPMC 驱动程序添加代码?
方便提供下代码或者应用程序吗?工程师这边想重现下这个问题。
,
?? ?:
您好,
1.不需要向 GPMC 驱动程序添加代码。
2.代码和应用程序涉及公司核心东西,不方便提高。
3.最近实验发现,当两个文件内容数据不一致时,存在差异的数据正好是上次内核发送写入该内存中的数据。
4.将配置文件中#CONFIG_SMP、#CONFIG_SMP_ON_UP 将多核屏蔽,CONFIG_CPU_DCACHE_DISABLE=y、CONFIG_CPU_ICACHE_DISABLE=y将cache禁止掉,重新按上述操作,内核和应用程序读取到的数据是一致的。
,
Cherry Zhou:
好的感谢您的答复,我们跟进给工程师看下。