SMMU
文章平均质量分 74
linux解码者
熟悉linux存储相关。日拱一卒
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
IOMMU/SMMUV3代码分析(10)页表的操作
从前面IOMMU DMA MAP/UNMAP API调用可以知道,DMA MAP时无论是dma_alloc_coherent() 还是dma_map_sg(),最终调用函数__iommu_map()函数。它会计算需要映射的pgsize页表大小和count个数。当支持ops->map_pages时,表示一次可映射多个连续的页,此时会调用arm_lpae_map_pages(),SMMUv3支持此方式。对于DMA UNMAP API,无论是dma_free_cohe...原创 2022-02-15 20:30:55 · 4818 阅读 · 3 评论 -
IOMMU/SMMUV3代码分析(9)函数dma_map_single()和dma_map_page()
对于函数dma_map_single()和函数dma_map_page(),它们的操作类似,对一块物理内存进行映射,且最终会调用dma_map_page_attrs()。它们的差别为,dma_map_single()将一块物理连续内存进行映射,而dma_map_page()将一页物理内存进行映射。与之前dma_map_sg()类似,同样分为直接映射和使能SMMU情况。1 DMA直接映射情况与dma_map_sg()类似,dma_map_pag...原创 2022-02-09 20:31:06 · 9293 阅读 · 1 评论 -
IOMMU/SMMUV3代码分析(8)函数dma_map_sg()
函数dma_map_sg()为流式DMA MAP函数,它将包含多个物理内存区域的SGL映射到连续的IOVA上。与dma_alloc_coherent()相比,它将要映射的物理内存已经分配好,不需要像dma_alloc_coherent()那样在函数中分配,因此速度比dma_alloc_coherent()快,适用于动态分配的场景;另外dma_alloc_coherent()的设备一致性通常通过硬件保证(关CACHE或硬件自动回写/无效化来实现),而dma_map_sg()的设备一致性可以通过...原创 2022-01-29 21:00:00 · 7000 阅读 · 0 评论 -
IOMMU/SMMUV3代码分析(7)函数dma_alloc_coherent()
一致性映射也称为静态映射,它与dma_map_*()相关函数另外一个差异为在调用函数dma_map_*()之前已经提前分配好物理内存,只需要建立映射即可;但dma_alloc_coherent()需要分配物理内存并建立映射。由于分配物理内存比较耗时,因此通常需要长期存在的一般用dma_alloc_coherent(),对于需要不停的动态映射和取消映射,一般使用dma_map_*()。与dma_alloc_coherent()相对应的取消静态映射函数为dma_free_co...原创 2022-01-28 20:44:20 · 5089 阅读 · 1 评论 -
IOMMU/SMMUV3代码分析(6)DMA MAP API介绍之概述
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从而访问到数据(比如CP...原创 2022-01-27 21:52:45 · 2964 阅读 · 0 评论 -
IOMMU/SMMUV3代码分析(5)IO设备与SMMU的关联2
函数Iommu_probe_device()是通过如下图所示建立起IO设备与SMMU的关联:其中红色部分会调用SMMUV3驱动中定义的iommu_ops,后面在被调用时再对涉及的回调作介绍。这里分成以下几个部分进行讲解:1. 为IO设备分配iommu_device在上述函数中,通过ops->probe_device()为IO设备分配iommu_device。对于SMMUV3驱动,ops->probe_device = arm_s...原创 2022-01-19 23:28:41 · 3360 阅读 · 0 评论 -
IOMMU/SMMUV3代码分析(4)IO设备与SMMU的关联1
前面介绍了SMMU设备的生成和识别,但IO设备是如何与SMMU设备关联的呢?一个SMMU设备下面可能有多个IO设备,但每个IO设备只在一个SMMU设备下。根据驱动设备模型,当IO设备与IO驱动匹配时,会触发IO驱动的probe函数,在其实在调用驱动probe()之前,会调用与IOMMU相关的函数。其过程如下:整个匹配的probe过程中执行的内容较多,这里仅介绍红色部分,即我们关心的DMA相关的设置和设备驱动的probe()(对于IO设备来説,它为I...原创 2022-01-18 21:56:53 · 3596 阅读 · 0 评论 -
SMMU架构手册之中断和通知
event被记录到event队列,PRI请求和全局error有相关中断来允许异步通知给PE。实现可能支持MSI中断,该中断以32位数据写一个配置值到配置寄存器中,在GICv3系统中,为GITS_TRANSLATER或GICD_SETSPI_NSR寄存器。当SMMU_S_IDR1.SECURE_IMPL=1时,ARM希望安全event产生的notification在系统中使用GICD_SETSPI_SR寄存器来设置安全SPI。实现必须支持一个,或选择性两...原创 2022-01-17 07:00:00 · 2065 阅读 · 0 评论 -
SMMU架构手册之结构体和队列的所有权
ARM期望非安全stream table,命令队列,event队列和PRI队列由权限最高的非安全系统软件控制。如果存在,ARM期望安全stream table,安全命令队列,安全event队列和安全PRI队列由安全软件控制。比如,如果一个操作由安全EL1和EL3控制,他们都由EL3软件控制。ARM期望所有STE指明的stage2转换表由hypervisor控制。stage1的CD和转换表的所有权依赖于使用的配置。如果由一个安全STE指向,它们由安全软件(EL3或E...原创 2022-01-16 10:29:50 · 563 阅读 · 0 评论 -
SMMU架构手册之command和event队列(2)
2.队列项可见语义任何生产者(无论SMMU还是软件)必须保证如果消耗者可以看见更新PROD值,那么消耗者也可以看到所有新的队列项。对于SMMU输出队列(Event队列和PRI队列),SMMU写队列数据到内存中,当数据在内存共享域中变得可见,SMMU允许更新的PROD值可见。这是新队列项对消耗者可见的第一步。消耗者只能通过观察更新的PROD索引来观察队列中新的有效项在存在。如果消耗者读取一个超出PROD最后索引的队列项,这个项中保含的数据未知。NOTE: 中断顺序...原创 2022-01-15 08:00:00 · 1301 阅读 · 0 评论 -
IOMMU/SMMUV3代码分析(3)SMMUV3驱动初始化2
接上一节继续将SMMUV3驱动初始化的剩下部分分析完。5. 复位SMMU设备通过函数arm_smmu_device_reset()复位SMMU设备,此过程主要是设置SMMU相关寄存器,对SMMU初始化操作。在进行寄存器描述之前,对SMMU相关的寄存器布局做简单介绍。5.1 SMMU相关寄存器布局SMMU相关寄存器布局如下图所示:(1) SMMU寄存器分为三部分:page0, page1, pmcg寄存器;page0寄...原创 2022-01-13 20:18:29 · 2101 阅读 · 0 评论 -
IOMMU/SMMUV3代码分析(2)SMMUV3驱动初始化1
当SMMU设备生成platform device后,加载SMMUV3驱动会触发SMMUV3驱动的probe函数arm_smmu_device_probe(),该函数进行SMMUV3驱动初始化。总体上SMMUV3驱动初始化流程如下图所示:它总体上分为以下几个部分:1. 从ACPI或DT表中获取SMMU硬件的信息使用函数arm_smmu_device_acpi_probe()从ACPI表中(SMMUV3 IORT)获取SMMU...原创 2022-01-12 22:23:01 · 3360 阅读 · 1 评论 -
SMMU架构手册之command和event队列(1)
SMMU所有的输入和输出队列都是内存中的环形buffer。编程接口包括一个输入的command队列和一个输出的event队列(可选一个PRI队列)。每个队列用于producer-consumer方式,一个输出队列包含SMMU产生和软件消耗的数据。输入队列包含软件产生的数据,SMMU来消耗。1. SMMU环形队列一个队列为2^n大小的FIFO环形,带一个基指针和两个index寄存器PROD和CONS,表明队列中的生产者和消耗者的当前位置。对输入和输出情况,仅SMMU维护一个index,...原创 2022-01-14 19:30:00 · 1705 阅读 · 0 评论 -
IOMMU/SMMUV3代码分析(1)SMMU设备的分配
对于SMMUV3驱动,它以platform device驱动加载,而SMMU设备为platform device,根据platform设备驱动模型,当两者匹配时,会触发SMMUV3驱动的probe函数。本节将介绍SMMU如何作为platform device被分配以及识别。1. IORT中SMMUV3结点SMMU设备在IORT表中被定义,它定义了SMMU设备的资源、特性以及SPI中断等。IORT描述了用ACPI描述IO设备拓扑,其中SMMUV3结点...原创 2022-01-11 22:22:19 · 3712 阅读 · 1 评论 -
IOMMU/SMMUV3代码分析(0)IOMMU架构
结合SMMU架构手册,计划分多次对IOMMU/SMMUV3代码进行简要的分析。在分析代码之前,仍需要对IOMMU及SMMUV3软硬件架构作简要介绍,其实在之前的博文中有作介绍,在这里重新梳理一下。1. SMMU的作用和位置SMMU为System Memory Management Unit,它的功能与MMU功能类似,将IO设备的DMA地址请求(IOVA)转化为系统总线地址(PA),实现地址映射、属性转换、权限检查等功能,实现不同设备的DMA地址空间...原创 2022-01-10 22:16:47 · 3683 阅读 · 1 评论 -
SMMU架构手册之Address Size(3)
从client设备访问到系统,SMMU发起对系统访问的目的如下:配置结构的访问(STE,CD); 队列的访问(命令队列,Event队列,PRI队列); 最后一阶段TTW;NOTE:在nested配置中stage1的地址输出是stage2的输入,以期望的方式(包括造成stage1地址size fault,或stage2转换fault超出stage2转换范围)进行转换,而不是直接输出到系统。若访问地址超过允许的Address Size,访问的地址可能超出范围。若in...原创 2022-01-05 23:46:32 · 966 阅读 · 0 评论 -
SMMU架构手册之Address Size(2)
1. 输入Address Size和虚拟Address Size架构上SMMU输入地址size为64bit。如果client设备输出一个小于64bit,或在client设备和SMMU输入之间的中间size小于64bit,小于64bit的地址会被转化为64bit SMMU输入地址。这种转换不是本文档的范围。ARMv8.0 和 ARMv8.1在AArch64上支持最大49bit,这意味着49bit地址要符号扩展为64bit地址。ARMv8.2支持最大53bit VA或49...原创 2021-12-26 19:35:07 · 1039 阅读 · 0 评论 -
SMMU架构手册之Address Size(1)
在SMMU中需要考虑三种地址size概念,从系统来的输入地址size,中间地址size(IAS),以及输出地址size(OAS)。1. SMMU输入地址size为64bitNOTE: 可以查看章节3.4.1 Input Address size and virtual address size,它介绍了如何向SMMU提供小的互联或设备地址能力。2. IAS反映了stage1产生的最大可用的IPA,IPA为stage2的输入。该术语用来定义中间地...原创 2021-12-24 21:39:59 · 1614 阅读 · 0 评论 -
SMMU架构手册之数据结构和转换流程(4)
4 事务的属性:incoming,两阶段转换和overrides除了地址,size和读写属性,传入的事务还可能带有其他属性,如访问类型(例如对于设备,WB-cached普通内存),共性性(如outer shareable),缓存分配提示,和权限相关的属性,指令/数据,特权和非特权,安全和非安全。部分属性用来检查访问决定转换表的页权限。在通过SMMU,面对系统的一个事务也可能有一组属性,这些属性可能被SMMU影响。输入属性如何影响系统中的输出属性(与转换表属性和其他配置...原创 2021-12-23 21:52:20 · 1538 阅读 · 0 评论 -
SMMU架构手册之数据结构和转换流程(3)
3. 配置和转换的查找图中 描述了配置查找和转换查找所涉及的相关概念。正如3.3.2中所描述的,传入的事务首先受配置查找的约束,而SMMU决定怎样开始进行事务的转换。这涉及到找到合适的STE,如果有必要也需要CD。配置的查找不依赖于输入的地址,它取决于:SMMU全局寄存器的配置; 传入事务的StreamID; 传入事务的SubstreamID(如果有应用)配置查找的结果是找到转换的stream或substream相关的...原创 2021-12-22 21:44:10 · 2404 阅读 · 0 评论 -
SMMU架构手册之数据结构和转换流程(1)
SMMU使用内存中一组数据结构来放置转换数据。寄存器指向初始根结构STE的基地址。STE包含stage2转换表基地址指针,同时也指向stage1的配置结构,该配置结构包含转换表基指针。CD表示stage1转换,STE表示stage2转换。因此SMMU使用两组明确的结构:配置结构,用来将事务的streamID映射到转换表的基地址,配置以及转换表访问的上下文; 转换表的结构,用来表示stage1和stage2的VA到IPA和IPA到PA的转换;对于即将...原创 2021-12-20 22:00:39 · 3072 阅读 · 0 评论 -
SMMU架构手册之stream编号(译)
每个即将到来的事务有地址、size和属性如READ/WRITE,安全/非安全,共享性,CACHE一致性。若超过一个client device连接到SMMU,这需要使用StreamID来区分不同的来源。StreamID是如何构建和传递的是由实现定义的。从逻辑上看,StreamID对应于启动事务的设备。NOTE: 从物理设备到StreamID的映射必须由系统软件描述。ARM建议StreamID为起始于0的密集命名空间。SteamID命令空间是基于SMMU。...原创 2021-12-18 09:05:26 · 3995 阅读 · 2 评论 -
SMMU架构手册之软件接口(译)
SMMU存在三个软件可用的接口:基于内存的数据结构用来将设备映射到转换表,这些转换表用来转换client设备的地址; 基于内存的环形缓冲队列。对于SMMU,存在一个命令队列,一个用于记录event和fault的Event队列,一个用于PCIE页请求的PRI队列; 一组寄存器用于discovery和SMMU全局的配置,部分仅安全;这些寄存器指明了数据结构和队列的基地址,提供了特性的发现和识别,提供了全局控制寄存器用来使能事务的处理。当支持安全时,另外一组寄存器允许安全软件来维护设备结...原创 2021-12-18 08:29:00 · 897 阅读 · 0 评论 -
SMMU架构手册之HTTU(译)
HTTU(Hardware Translation Table Udate)即硬件更新转换表。SMMU可以支持硬件更新转换表的AF和dirty状态,该功能可选。一些PE可能支持HTTU(Hardware Transation Table Update)。SMMU支持的HTTU可以与PE软件和硬件更新标志可以共存。SMMU更新描述符部分与ARM用户手册一致,SMMU特别的部分在章节HTTU behavior summary中描述,虽然配置方法不一样。...原创 2021-12-16 22:38:30 · 2794 阅读 · 0 评论 -
MSI/MSI-X中断重定向
对于MSI或MSI-X中断,通过外设访问某个特定内存,从而触发对应的中断的产生。在没有SMMU时,外设直接访问该内存对应的物理地址即可。但在使能SMMU时,外设在访问某个物理内存前需要建立起IOVA到该物理地址的映射,然后发起对IOVA访问即可访问该物理地址,此过程称为MSI/MSI-X中断重定向。该过程在linux内核中是由函数iommu_dma_prepare_msi()实现。int iommu_dma_prepare_msi(struct msi_desc *desc, ...原创 2021-12-11 17:37:37 · 1943 阅读 · 0 评论 -
SMMU 介绍
SMMU在系统中位置和作用SMMU功能与MMU功能类似,将IO设备的DMA地址请求(IOVA)转化为系统总线地址(PA),实现地址映射、属性转换、权限检查等功能,实现不同设备的DMA地址空间隔离。SMMU软硬件交互过程硬件结构如下图所示:SMMU处于IO设备和总线之间,负责将设备的输入IOVA转化为系统总线的物理地址PA; SMMU硬件包含configuration lookup/TLB/Page Table Walk以及cmdq/eventq等部分,其中configurati.原创 2021-08-04 18:53:41 · 11929 阅读 · 0 评论 -
内核自带DMA benchmark的使用
使用如下步骤使用DMA benchmark:1 在内核下编译测试工具make -C tools/testing/selftests TARGETS=dma run_原创 2021-06-16 09:30:41 · 986 阅读 · 0 评论 -
IOVA框架(3)
1 RCACHE框架介绍 对于设备,其访问的地址称为IOVA(也称DMA地址),经过SMMU转换才是物理地址PA。IOVA的生成和释放是影响性能的重要一环。在进行一次转换时,首先会分配IOVA,然后将IOVA及对应的PA进行映射,这样CPU侧想要操作PA对应的数据时使用VA,而设备若访问对应的PA的数据时使用IOVA;在设备不需要使用数据时,取消IOVA和PA对应的映射。 IOVA的真正分配是通过在SLAB中分配结构体[],并在IOVA所在范围里找到一个对齐于2^n ...原创 2021-05-13 23:32:22 · 3995 阅读 · 1 评论 -
DMA MAP/UNMPA过程(2)
在使能SMMU情况下,设备通过SMMU访问内存,在访问之前,须建立起设备访问地址即IOVA到物理内存地址PA之间的映射(保存在内存中), 此过程称为DMA MAP过程,后续设备需要访问时SMMU自动将设备发送的IOVA转化为PA,当不需要再访问时取消之前建立的映射,此过程称为DMA UNMAP过程。若在没有建立映射前对物理内存进行访问,产生缺页中断。DMA MAP过程DMA MAP过程基本上分为如下过程:分配需要映射的物理内存; 根据RCACE缓存机制分配IOVA; 根据...原创 2021-05-13 23:22:18 · 2065 阅读 · 0 评论 -
DMA框架介绍(1)
对SMMU驱动已经熟悉了一段时间,接下来计划对相关的内容进行分析。内核DMA框架用于将内存物理地址PA进行映射为设备可访问的IOVA,并对驱动提供API可用接口。它包括IOVA框架(包括IOVA的分配和释放)、IOMMU框架(DMA MAP/UNMAP过程)、页表操作、ARM SMMU驱动及提供给驱动的框架。...原创 2021-05-13 21:44:57 · 1483 阅读 · 0 评论
分享