ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IOMMU/SMMUV3代码分析(6)DMA MAP API介绍之概述

2022-01-27 21:59:44  阅读:239  来源: 互联网

标签:MAP 映射 dma DMA IOMMU IOVA CPU


1. DMA MAP API在驱动中的使用

        DMA MAP建立起物理地址PA和IO设备的虚拟地址IOVA之间的映射,当IO设备通过SMMU访IOVA实际会访问到对应的物理地址PA。完成访问后DMA UNMAP取消映射。

        在IO设备驱动中DMA MAP/UNMAP使用如下图所示:

        数据如何在CPU和IO device之间的传递和处理?

(1)CPU通过MMU建立起数据的物理地址PA到数据的虚拟地址之间的映射,CPU通过访问VA从而访问到数据(比如CPU填充数据到内存中);

(2)IO设备驱动得到数据的PA,并通过DMA MAP将数据的物理地址PA和IOVA建立映射,然后IO设备驱动将IOVA传递给SMMU设备;

(3)SMMU将IOVA转换为PA,从而对PA处的数据的处理;

(4)完成数据处理后,通过DMA UNMAP取消IOVA到PA的映射;

2 DMA MAP/UNMAP API分类

2.1 一致性DMA

        之前介绍过COHERENT特性,对于一致性DMA,可以保证CPU和IO设备看到的物理地址是一致,因为CPU侧存在CACHE,一致性DMA可通过关CACHE或硬件来保证CPU和IO设备看到的物理地址是一致。函数dma_alloc_coherent()为一致性DMA。一致性DMA通常为静态的,建立起一致性映射后,一般在系统结束时取消映射。

2.2 流式DMA

        流式DMA为动态的,每次都会建立映射,然后取消映射。由于CPU侧存在CACHE,需要软件或硬件来维护一致性。流式DMA包括dma_map_sg/dma_map_single()等。

        目前很多现在SOC如kunpeng920都是硬件来保证coherent一致性。

2.3 DMA MAP API简介

        先简单介绍下面几个函数的作用,后述对每个函数的实现对较为详细的分析。

DMA MAP API

描述

dma_alloc_coherent(dev, size, dma_handle, gfp)

分配size大小的一致性映射,返回IOVA和VA

dma_map_sg(d, s, n, r)

将scatther gather建立映射

dma_map_page(d, p, o, s, r)

将一个物理页建立映射

dma_map_single()

将一块连续物理区域建立映射

        这些函数都会将物理区域与连续的IOVA建立起映射,差别在于物理区域的组织方式不一样,对于*_sg来説,是多个连续的物理区域,*_page是一个物理页,*_single是一块连续的物理区域,这三个函数的物理区域都是提前分配好的。但函数dma_alloc_coherent()则是在分配物理区域的同时,建立物理区域与IOVA的映射,同时返回VA。

标签:MAP,映射,dma,DMA,IOMMU,IOVA,CPU
来源: https://blog.csdn.net/flyingnosky/article/details/122724089

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有