1. domain的本质是一个页表,1对1的关系

2. IOMMU_DOMAIN_UNMANAGED vs. IOMMU_DOMAIN_DMA

a. IOMMU_DOMAIN_UNMANAGED    - DMA mappings managed by IOMMU-API user, used for VMs
        b. IOMMU_DOMAIN_DMA    - Internally used for DMA-API implementations. This flag allows IOMMU drivers to implement certain optimizations for these domains

IOMMU_DOMAIN_DMA对应default_domain

IOMMU_DOMAIN_UNMANAGED对应VFIO, 或者GPU自行创建的domain

多个domain解决的问题: 用户态发起的DMA,它自己在分配iova,直接设置下来,要求iommu就用这个iova,内核对这个设备做dma_map,也要分配iova, 两者(两个iova)冲突产生。

解决办法 就是:

VFIO:默认情况下,iommu(应该是DMA设备,而不是IOMMU)上会绑定一个default_domain,它具有IOMMU_DOMAIN_DMA属性,原来怎么弄就怎么弄,这时你可以调用dma_map()。但如果你要用VFIO,你就要(DMA设备)先detach原来的驱动,改用VFIO的驱动,VFIO就给你换一个domain,这个domain的属性是IOMMU_DOMAIN_UNMANAGED,之后你爱用哪个iova就用那个iova,你自己保证不会冲突就好,VFIO通过iommu_map(domain, iova, pa)来执行这种映射。

等你从VFIO上detach,把你的domain删除了,这个iommu(同上,应该是DMA设备,而不是IOMMU)就会恢复原来的default_domain,这样你就可以继续用你的dma API了。

这种情况下,你必须给你的设备选一种应用模式,非此即彼

vfio-pci [1]

vfio-pci 驱动中,把这个设备的io空间和iommu_group直接暴露到用户态

vfio_group是vfio对iommu_group的表述

The Intel IOMMU driver allocates a virtual address per domain. Each PCIE device has its own domain (hence protection). Devices under p2p bridges share the virtual address with all devices under the p2p bridge due to transaction id aliasing for p2p bridges.[7]

IOVA generation is pretty generic. We used the same technique as vmalloc() but these are not global address spaces, but separate for each domain. Different DMA engines may support different number of domains.[7]

Interrupt ranges are not address translated, (0xfee00000 - 0xfeefffff). The same is true for peer to peer transactions. Hence we reserve the address from PCI MMIO ranges so they are not allocated for IOVA addresses【7】

IOVA是有domain的属性的

中断, P2P, MMIO不作remapping

3. 关于PASID

AMD IOMMU支持PASID, 由Device ID (BDF) + PASID (TLP Prefix) + GVA构成GVA到SPA的translate

4. IOMMU group

从struct device与struct iommu_group的结构上可以看出,DMA设备隶属于一个iommu group (PCIE 协议中由拓扑结构中ACS支持与否等因素决定设备的iommu group 【3】【4】【5】), 而一个iommu group可以处于default domain或者其它的domain

struct device {

...

struct fwnode_handle        *fwnode; /* firmware device node */ @fwnode:     Associated device node supplied by platform firmware.

struct iommu_group        *iommu_group;  * @iommu_group: IOMMU group the device belongs to.

struct dev_iommu        *iommu;  * @iommu:      Per device generic IOMMU runtime data

...

};

struct iommu_group {

...

struct iommu_domain *default_domain;

struct iommu_domain *domain;

...

};

iommu.c关于PCI设备group的分配 相关函数:pci_device_group/get_pci_alias_group/get_pci_function_alias_group

/* PCI device grouping function */
extern struct iommu_group *pci_device_group(struct device *dev);
/* Generic device grouping function */
extern struct iommu_group *generic_device_group(struct device *dev);
/* FSL-MC device grouping function */
struct iommu_group *fsl_mc_device_group(struct device *dev);

另外,一个DMA设备与一个IOMMU是通过struct dev_iommu作为纽带:

struct device {

...

struct iommu_group        *iommu_group;  * @iommu_group: IOMMU group the device belongs to.

struct dev_iommu        *iommu; * @iommu:      Per device generic IOMMU runtime data

...

}

struct dev_iommu {

...

struct iommu_device                *iommu_dev;

...

};

struct iommu_device {

struct list_head list;

const struct iommu_ops *ops;

struct fwnode_handle *fwnode;

struct device *dev;

};

5. 关于struct iommu_fwspec

其中,固件(比如DTS或者ACPI)对Topo和smmu的描述,从软件管理的角度,称为(定义为)iommu_fwspec,属于device,在device发现的时候就可以生成(比如pcie扫描或者devicetree/ACPI扫描的时候)【1】

struct dev_iommu {

...

struct iommu_fwspec                *fwspec;

...

};

struct iommu_fwspec {

const struct iommu_ops        *ops;

struct fwnode_handle        *iommu_fwnode;

u32                        flags;

unsigned int                num_ids;

u32                        ids[];

};

AMD IOMMU driver没有使用, 因其直接扫描IVRS

6. 关于aux domain, 见【2】

Reference:

[1] Linux iommu和vfio概念空间解构 - 知乎 (zhihu.com)

[2] IOMMU的现状和发展 - 知乎 (zhihu.com)

【3】 pci: Enable overrides for missing ACS capabilities - Patchwork (kernel.org)

【4】IOMMU是如何划分PCI device group的? - 知乎 (zhihu.com)

【5】IOMMU group and PCIe ACS问题 - 知乎 (zhihu.com)

[7] 14. Linux IOMMU Support — The Linux Kernel documentation

[8]dmar 与 IOMMU | Linux Performance

AMD IOMMU与Linux (4) -- Domain, Group, Device相关推荐

  1. 从一个NPU失效问题看Linux PM Domain Framework的实现逻辑

    用最新SDK测试NPU AI Demo用例的时候,发现对NPU的寄存器操作直接导致内核show callstack,打印堆栈显示在调用NPU的初始化CMD (CMD号:KERNEL_CMD_INIT) ...

  2. linux raw 分区 读取,在linux上使用raw device方式

    在linux上使用raw device一般有两个方式,下面分别测试一下: 第一种方式是非lvm方式,直接使用partion方式如下: 一,创建分区 [root@localhost ~]# fdisk ...

  3. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  4. Linux 设备树(Device Tree)简介

    DTS (device tree source) .dts文件是一种ASCII 文本格式的Device Tree描述,此文本格式非常人性化,适合人类的阅读习惯.基本上,在ARM Linux在,一个.d ...

  5. linux内核 设备列表,Linux 设备树(Device Tree)(转载)

    ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称 "this whole ARM thing is a f*cking ...

  6. linux设备忙碌无法删除文件夹,linux umount 提示"device is busy" 终极解决方法 无法卸载分...

    linux umount 提示"device is busy" 终极解决方法 无法卸载分 为了干净地关闭或热交换 UNIX 或类 UNIX 系统上的存储硬件,必须能够卸载使用此设备上的存储的所有文件系 ...

  7. Linux命令 - /etc/group文件详解

    Linux命令 - /etc/group文件详解   在Linux /etc/group文件是有关于系统管理员对用户和用户组管理的文件,linux用户组的所有信息都存放在/etc/group文件中.具 ...

  8. AMD 宣布开源 Linux 显卡驱动与 GPUOpen 工具

    不过AMD刚刚为公司的未来作出了一个走向开源的重要决定,除了宣布将AMDGPU Linux驱动开源之外,还推出了面向开发者的GPUOpen工具.考虑到AMD当前在市场上处于老二的位置,其作出这样的决定 ...

  9. linux losetup命令,loop device介绍及losetup使用

    一.loop 设备介绍 1. 在类 UNIX 系统里,loop设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们像块设备一样访问一个文件.在使用之前,一个 loop设备 ...

  10. amd支持嵌入式linux,AMD 发布针对 Linux 的 Radeon Software 19.30,支持Radeon RX 5700

    如果你的Linux环境是Ubuntu 18.04 LTS,那么你应该看看本文,AMD现在已经为那些想在Linux上使用这些新的RDNA/NAVI显卡而不需要构建自己的内核/Mesa/libdrm/LL ...

最新文章

  1. 安全隐患:神经网络可以隐藏恶意软件
  2. python3.6使用教程-如何使用python编程《python3.6 教程》
  3. 实现数组(java)
  4. 最大整数(Noip1998连接多位数)
  5. 数据表的创建(一对多,多对多)
  6. Mac. IntelliJ IDEA maven+springmvc添加包时小插曲
  7. FCN数据预处理(code)
  8. o(n)复杂度下实现数组去除重复项
  9. NVIDIA H264解码是硬件电路还是CUDA
  10. 教科书级——黑盒测试设计用例的方法的介绍
  11. 【181129】VC++ 屏幕截取(窗口截图、选区截图)、屏幕拾色器、放大镜源代码
  12. 对龙果支付系统的简单了解
  13. Android Studio 工具栏添加图标
  14. 使用js在线将pdf转为图片
  15. 修改谷歌浏览器缓存位置总结
  16. java计算机毕业设计高校四六级报名管理系统源程序+mysql+系统+lw文档+远程调试
  17. 物联网行业解决方案之智慧畜牧
  18. 为什么只有T字型人才实用价值才比较大?
  19. HTTPS学习笔记:(3)一文彻底了解PKI与证书
  20. vue路由守卫beforeEach和afterEach

热门文章

  1. 现代操作系统笔记2(操作系统概念和系统调用)
  2. Android学习资料整理:流行框架网站书籍推荐---博客推荐
  3. VS2010使用教程(使用VS2010编写C语言程序)
  4. Intel/Altera 系列FPGA简介
  5. Bolt界面引擎中XLUE布局XML文件节点属性配置详解
  6. 计算机EXE文件改参数,exe文件修改器(eXeScope)
  7. jQuery实现滑动门效果
  8. python 抢购小米_利用Python+selenium实现小米商城抢购代码
  9. 类似Windows开始菜单的右键菜单
  10. Chapter 2 大规模MIMO系统信息论基础及信道容量分析