Zynq-7000 SoC Cache无效 - 是否建议在启动DMA传输之前/之后执行无效操作?

描述

根据ARM参考资料,在访问受传入DMA传输影响的存储器范围之前,应该进行无效。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0228a/index.html

是否建议在启动DMA传输之前/之后执行无效操作?


我正在使用非独占缓存配置在cortex A-9上运行SMP VxWorks系统。

我可以看到缓存失效。

软件流程是 -

  1. 缓存无效
  2. DMA传输
  3. 复制数据

如果在DMA完成后添加无效序列,则没有缓存无效失败。

软件流程是 -

  1. 缓存无效
  2. DMA传输
  3. 缓存无效
  4. 复制数据


如果启用了推测预取,则CPU *可能会在DMA传输进行时获取一些高速缓存行,从而导致数据损坏。

但是,如果我尝试使用以下设置禁用ACTLR寄存器中的推测预取,则Cache invalidate仍会失败:

ACTLR = 0x41(表示非独占),对L1 / L2禁用预取



我的缓存无效序列遵循ARM的建议。

使用非独占缓存安排进行无效的强大代码序列是:

  • InvalLevel2地址 - 强制地址超过2级
  • CACHE SYNC - 确保完成L2 inval
  • InvalLevel1地址 - 这是在群集中广播的
  • DSB - 确保完成第2级的内部。

如果原因不是推测预取,会导致这种行为的原因是什么?

ACTLR中的位禁用特定形式的推测 - 它们不会全局禁用推测。

因此,你很可能仍然看到猜测。

“ARMv7-A / R架构参考手册”给出了附录D7(Barrier Litmus测试)中的示例序列。

但是,预期的顺序将类似于以下内容:

  • <VA对VAC的缓存无效> < - 删除任何可能脏的行
  • DSB < - 假设DMA通过写入存储器映射寄存器启动
  • <启动DMA>
  • <等待DMA完成>
  • DMB < - 假设正在轮询DMA
  • <VA将缓存无效为PoC> < - 确保DMA之后的缓存内容
  • DMB
编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2018-07-30 20:37:17 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它