AMD IOMMU与Linux (4) -- Domain, Group, Device

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AMD IOMMU与Linux (4) -- Domain, Group, Device 的相关文章

随机推荐

  • OpenCV矩阵cv::Mat通道和位深的整理(CV_8UC1,CV_16UC1,CV_32FC1等等)

    一 数据类型说明 矩阵数据类型 CV lt bit depth gt S U F C lt number of channels gt 1bit depth 比特数 代表8bit 16bit 32bit 64bit2S U F S 代表 s
  • github如何修改repository(仓库)名字

    首先登录你的github 查看你的仓库目录页 xff0c 点击你需要更改的仓库 进入此仓库管理页面 xff0c 点击Settings 进入到设置页面 xff0c 如果你是想要更改名称的话 xff0c 直接在这里改 xff0c 然后点击Ren
  • ROS中tf树,frame未连接的问题。

    今天调节双舵轮的AGV xff0c 一开始无法导航 xff0c 由于学生有些忙 xff0c 没做urdf 我就直接发布静态坐标变换 xff0c odom到basefootprint是里程计自己编写 xff0c 问题是加了laser base
  • The POM for xxxx is missing, no dependency information available

    很久以前用Maven的时候基本都是一个工程 xff0c 后来感觉太落伍了 xff0c 就根据geoserver源码开始分模块对功能进行优化 后来有个新来的同事也碰到了这个问题 xff0c 我就给他解决一下 xff0c 顺便把以前的心得记录一
  • 无人机开发-介绍Mavlink协议的消息组成、如何看懂繁杂的mavlink官网介绍、简单介绍地面站与飞控的通讯流程

    这篇博客主要介绍了mavlink的消息组成和如何看懂繁杂的mavlink官网介绍以及简单介绍了下地面站与飞控的通讯流程 前面已经提到了在mavlink消息帧里最重要的两个东西 xff0c 一个是msgid xff1b 一个是payload
  • 无人机开发-介绍MAVLink代码的大概结构

    可以看到 xff0c 里面有多个文件夹和几个头文件 pixhawk xff0c ardupilotmega xff08 apm xff09 xff0c matrixpilot这类的文件夹里都是各个飞控自己定义的mavlink消息类型 xff
  • 无人机开发-图传技术浅析

    2016年 xff0c 是中国无人机市场的元年 xff0c 无人机能够一跃进入大众视野 xff0c 并迅速在大众市场火热发展 xff0c 是很多人始料未及的 从刚开始的空中摄录 xff0c 到后来的实时摄录 xff0c 方便的无人机图传功能
  • Ubuntu18.04安装ROS+gazebo9+PIX4仿真

    本文仅作安装过程记录之用 1 安装ros Ubuntu18 04选择ROS Melodic 教程网址 xff1a http wiki ros org cn melodic Installation Ubuntu 1 1配置 Ubuntu 软
  • PX4+gazebo仿真给无人机添加摄像头

    1 启动仿真 xff1a cd到Firmware文件夹 xff0c 执行以下代码 roslaunch px4 mavros posix sitl launch 如果启动过程卡住或者很慢 xff0c 下载该链接的压缩包https bitbuc
  • 最全Pycharm教程(10)——Pycharm调试器总篇

    如果觉得这篇文章对您有所启发 xff0c 欢迎关注我的公众号 xff0c 我会尽可能积极和大家交流 xff0c 谢谢 最全Pycharm教程 xff08 1 xff09 定制外观 最全Pycharm教程 xff08 2 xff09 代码风格
  • 关于嵌入式

    学习方向 首先要学习下基础课程单片机 xff0c 汇编和C语言等等 xff0c 然后再学习嵌入式 xff0c 如果说你要想水平高的话 xff0c 最好学习下操作系统 xff0c 数据结构 xff0c 算法及一些硬件方面的知识等等 看你是想在
  • make_unique的使用

    关于make unique的构造及使用例程 xff0c MSDN的讲解非常详细 xff08 https msdn microsoft com zh cn library dn439780 aspx xff09 使用过程中 xff0c 我的理
  • C#学习记录——C#编写串口程序

    因为电气自动化专业出差太多 xff0c 考虑学点其他的看能不能实现转行 xff0c 也没太清晰的路线 xff0c 看网上好多推荐电气自动化转C 上位机开发的 xff0c 也抽时间学习了解下C xff0c 因为非软件专业 xff0c 对计算机
  • the working directory ‘XXX’ does not exist

    积累点滴 今天在idea上重新建了一个项目 xff0c 结果一运行就报了 the working directory XXX does not exist 的错误 明明上一个项目都运行好好的 xff0c 怎么新建一个就出问题了呢 xff1f
  • Git 子模块(Submodule)

    提示 xff1a Git 子模块 Submodule 操作 文章目录 一 Git 子模块 Submodule 是什么 xff1f 二 使用步骤1 创建子仓库2 clone 带有子仓库的git项目 三 子仓库代码的修改和更新 一 Git 子模
  • Java Web项目开发项目经验总结

    一 学会如何读一个JavaWeb项目源代码 步骤 xff1a 表结构 gt web xml gt mvc gt db gt spring ioc gt log gt 代码 1 先了解项目数据库的表结构 xff0c 这个方面是最容易忘记的 x
  • React + TS + Mobx 示例

    一 创建项目 方式一 xff1a create react app todo React ts demo scripts version 61 react scripts ts cd todo React ts demo npm start
  • AMD IOMMU与Linux (2) -- IVRS及AMD IOMMU硬件初始化

    介绍AMD IOMMU driver基于IVRS的硬件初始化情况 1 I O Virtualization ACPI table 2 drivers iommu amd init c 1 I O Virtualization ACPI ta
  • AMD IOMMU与Linux (3) -- DMA

    Linux中DMA会使用硬件IOMMU如AMD IOMMU INTEL VT D xff0c 也会使用软件的SWIOTLB 这篇梳理一下LINUX内核在有AMD IOMMU的情况下 xff0c 是如何做DMA的 xff0c 内容包括如下 1
  • AMD IOMMU与Linux (4) -- Domain, Group, Device

    1 domain的本质是一个页表 xff0c 1对1的关系 2 IOMMU DOMAIN UNMANAGED vs IOMMU DOMAIN DMA a IOMMU DOMAIN UNMANAGED DMA mappings managed