TI中文支持网
TI专业的中文技术问题搜集分享网站

AM5728: linux 4.9.69 内核驱动通过dma将搬运到内存中,上层应用mmap将数据读取,上层读取到的数据和内核不一致。

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一块地址,在

在通过virt_to_phys转换成物理地址。在把dma搬运到内存中的数据memcpy到新的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:

好的感谢您的答复,我们跟进给工程师看下。

赞(0)
未经允许不得转载:TI中文支持网 » AM5728: linux 4.9.69 内核驱动通过dma将搬运到内存中,上层应用mmap将数据读取,上层读取到的数据和内核不一致。
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1