Cache Coherent 非一致性内存解决与验证

  • Post author:
  • Post category:其他


1        摘要

使用J6平台开发项目中,使用DMA拷贝数据,针对DMA物理内存和Cache的一致性进行测试和验证。

2        解决方法和目的

方法目的:使用dma_sync_single_for_device();dma_sync_single_for_cpu()对内存进行一致性管理,通过下文的介绍可以正确使用这两个函数。

方法验证:

A.    验证Cache与DMA存在不一致的问题。

B.     dma_sync_single_for_device();dma_sync_single_for_cpu()对物理内存和Cache的实际操作内容。

C.     验证函数效率。

2.1     INV和CLEAN概念






invalidate






清除


cache


的意思是清除


cache


中存储的全部数据。对处理器而言,清除操作只要清零相应


cache


行的有效位即可。当存储器配置上有变化时,整体或部分


cache


可能需要进行清除操作。











clean






清理


cache


的意思是把脏的(即被改写过的)


cache





强制


写到主存,并把


cache


行中的脏位清零。清理


cache


可以重建


cache


与主存之间的一致性,它只用在使用写回策略的


D-cache


上。





2.2     测试使用程序列表

名称

功能

Dmatest

测试应用程序

omap_ds_dma.ko

测试对应驱动程序

2.3     测试程序命令列表

命令名称

功能

@cc  <n>

Set cache on(1)/off(0)驱动内DMA的cache管理功能

@ccsrc [size]

Make src cached

@ccdst [size]

Make dst cached

@ccsrcn [size]

Make src cached write 0x66

@ccdstn [size]

Make src cached write 0x33

@up

Update src dynamic val

@dmacp

Dma Cp test 0x1000 DMAsrc->dst拷贝4K

@dmacp1

Dma Cp test max DMAsrc->dst拷贝8M

@dmacpn <n>

Dma Cp test n times

@showm <addr>

Show Mem 0x—-  test 显示物理地址内数据

@shows

Show Mem 0xAC000000

@showd

Show Mem 0xAC800000

@coset <val>

Set coherent data 设置Coherent驱动内缓冲区的值

@coshow

Show coherent data显示Coherent驱动内缓冲区的值

@setwb <paddr>

Set write back 设置指定区域的clean功能WB

@setinv <paddr>

Set invalide  设置指定区域的invalid功能

@cotocc

Coherent to cache Coherent to dst(cached) DMA拷贝

@cctoco

Cache to Coherent dst(cached) to Coherent 的DMA拷贝

@exit

@help

2.4     验证条件

a.      驱动程序提供一块一致性内存;

b.      使用物理内存0xAC000000~0xAC800000为src带cache内存。

c.      使用物理内存0xAC800000~0xAD000000为dst带cache内存

2.5     验证1一致性问题存在

使用DMA将no cache数据传送到cached内存,需要将目的内存进行cache,然后启动DMA,再查看目的内存的内容,结果会导致CPU与物理内存不一致

<UT>:coset 0x65

[61901.806422]

[D]Paddr:0xAB859000 Paddr:0xEB859000

[D]coset 0x65

=============BUFF MSG============

[D]  65  65 65  65  65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65  65

[D]  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65

[D]  65  65 65  65  65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65  65

[D]  65  65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65  65

[D]

[D]=============BUFF END============

<UT>:showd

showd

pMemDstVirtAddr is 0xB5E0C000

=============BUFF MSG============

22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22

22  22 22  22  22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22  22

22  22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22  22

22  22 22  22  22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22 22  22  22  22

=============BUFF END============

<UT>:cotocc

cotocc

func_get_coherent_arg ioctl paddr 0xab859000, size 0x00001000,

Dma Cp [0xAB859000] -> [0xAC800000] oK,Use time: 1009 us

<UT>:showd

showd

pMemDstVirtAddr is 0xB5E0C000

=============BUFF MSG============


65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65  65 65  65


65  65  65 6



版权声明:本文为kevinzd9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。