Arm linux dma mapping操作

概述

由于处理器存在cache,cache和内存中数据可能不一致,所以驱动在使用dma在内存和device之间搬移数据前后需要cpu对cache和内存中数据进行同步。有些dma寻址能力有限,比如只能寻址内存低128m,但数据在内存的1G地址处,这时需要进行数据转移。

基本概念

cpu读取数据时先查询l1 cache,如果没有再向l2 cache
查询,如果没有在向内存查询,然后把数据从ddr 内存搬移到l2 cache和l1
cache。Cpu写数据,改变了l1 cache中内容,这时l1 cache可能把数据写会到ddr
内存,也可能过段时间再写。两个l1 cache和l2
cache之间数据同步,arm中按照moesi协议同步,这里不进行介绍。

基本概念:

PoU:在单核中在某一存储层级上,指令cache,数据cache和TLB在某一点上能够看到一致内容或相同copy,称为Pou;或者在an Inner Shareable shareability domain中,指令cache,数据cache和TLB在某一点上能够看到一致内容或相同copy,称为Pou;

PoC:系统中所有agents(系统中master,或者observer,例如,cpu,dma)看到的memory
一致点, 称为PoC.

例如,图中CPU core0和CPU core1为一组cluster0,CPU core2和CPU
core3为一组cluster1,

L2 cache为PoU,DDR memory为PoC。

Clean:把cache中指定地址内容写会到PoU或PoC。

Invalidate:
使cache中指定地址内容无效,如果cache中修改没有写回内存,那么这次修改会丢失。

Clean and invalidate:clean指令后执行invalidate指令。

回写(write back)

      修改了cache中内容后,并不把更新立即写到内存,把修改的cache line标记为dirty。但执行clean操作时,把cache修改内容写的内存,或者,替换cache line时,把cache修改内容写的内存。

直写(write through)

    修改了cache中内容后,立即写到内存。

流式 DMA 和一致性 DMA

在一致性 DMA 映射中,它采用的是系统预留的一段 DMA 内存用于 DMA 操作,这一段内核在系统启动阶段就已经预留完毕,比如 arm64 平台会在 dts 文件中写明系统预留的 DMA 内存段位于何处,并且会被标志为用于 dma 一致性内存申请,如果你有关注 DMA 的一致性映射操作 API 就会发现,一致性 DMA 不会去使用别的地方申请的内存,它都是通过dma_alloc_coherent自我申请内存,然后驱动自己填充数据最后被提交给 DMA 控制器。

流式 DMA 中,它可以是随意的内存交给 DMA 进行处理,不需要从系统预留的 DMA 位置进行内存申请,任何普通的 kmalloc 申请的内存都能交给 DMA 控制器进行操作。

二者是如何做到缓存一致性的:

一致性 DMA ,在 DMA 内存申请的过程中,首先进行一个 ioremap_nocache 的映射,然后调用函数 dma_cache_wback_inv 保证缓存已经刷新到位之后,后面使用这一段内存时不存在一二级缓存;

流式 DMA ,不能直接禁止缓存,因为流式 DMA 可以使用系统中的任意地址范围的地址,CPU 总不能将系统所有的地址空间都禁止缓存,这不科学,那么为了实现缓存一致性,流式 DMA 需要不断的对缓存进行失效操作,告诉 CPU 这一段缓存是不可信的,必须从内存中重新获取。一致性 DMA 就是直接将缓存禁止,而流式 DMA 则是将缓存失效刷新。

Cache操作 写数据到device

        cpu执行clean指令,把cache中写到内存 cpu配置dma,dma搬移内存中数据到device

从device读数据 dma搬移device数据到内存

        cpu执行 invalidate指令,使cache中内容无效;cpu处理数据,由于之前设置了cache无效,所以会从内存读取数据到cache

swio技术

swio技术,当dma寻址能力小于cpu分配的物理地址时,swio技术会从低端地址,比如0-64m中分配一块物理地址,建立低端物理地址和cpu分配的物理地址映射,并且后续dma使用低端dma地址进行数据搬移,如果是dma从物理内存搬移数据到设备
(DMA TO DEVICE),那么cpu先把数据从cpu分配物理地址复制到低端物理地址,后续dma从低端物理地址搬移到设备。如果是dma从设备搬移数据到物理内存(DMAFROM DEVICE),那么dma从设备搬移到低端物理地址,然后通知cpu,cpu从低端物理地址复制数据到原高端物理地址,
但如果dma寻址能力够,就不需要这一步。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值