Linux IOMMU支持

文章目录

  • Linux IOMMU
    • 基本的东西
    • 什么是RMRR?
    • IOVA是如何产生的?
    • 图形问题?
    • IOVA的一些例外情况
    • 故障报告
    • 启动消息示例
    • 故障报告
    • 待决定

Linux IOMMU

架构规范可以从以下位置获得。

vt-directed-io-spec.pdf

本指南提供了一个快速备忘单,以便进行一些基本的了解。

一些关键词:

  • DMAR - DMA重映射
  • DRHD - DMA重映射硬件​​单元定义
  • RMRR - 预留内存区域报告结构
  • ZLR - 从PCI设备读取零长度
  • IOVA - IO虚拟地址。

基本的东西

ACPI枚举并列出平台中的不同DMA引擎,以及PCI设备与DMA引擎控制它们之间的设备范围关系。


什么是RMRR?

BIOS控制一些设备,例如USB设备执行PS2仿真。用于这些设备的存储区域在e820映射中标记为保留。当我们打开DMA转换时,DMA到这些区域将失败。因此,BIOS使用RMRR指定这些区域以及需要访问这些区域的设备。 OS希望为这些区域设置单位映射,以便这些设备访问这些区域。


IOVA是如何产生的?

表现良好的驱动程序在向需要执行DMA的设备发送命令之前调用pci_map _ *()调用。完成DMA并且不再需要映射后,设备将执行pci_unmap _ *()调用以取消映射该区域。

Intel IOMMU驱动程序为每个域分配一个虚拟地址。每个PCIE设备都有自己的域(因此保护)。 p2p网桥下的设备与p2p网桥下的所有设备共享虚拟地址(due to transaction id aliasing for p2p bridges)。

IOVA生成非常通用。我们使用与vmalloc()相同的技术,但这些不是全局地址空间,而是针对每个域分开。不同的DMA引擎可以支持不同数量的域。

我们还为每个映射分配了保护页面,因此我们可以尝试捕获可能发生的任何溢出。


图形问题?

如果您遇到图形设备问题,可以尝试添加选项intel_iommu = igfx_off以关闭集成图形引擎。如果这样可以解决问题,请确保您提交报告问题的错误。


IOVA的一些例外情况

中断范围不是地址转换的,(0xfee00000 - 0xfeefffff)。(The same is true for peer to peer transactions. )因此,我们保留PCI MMIO范围的地址,因此它们不会分配给IOVA地址。


故障报告

报告错误时,DMA引擎通过中断发出信号。导致故障原因的故障原因和设备打印在控制台上。

见下面的样本。


启动消息示例

这样的东西被打印出来,表明ACPI中存在DMAR表。

ACPI:DMAR(v001 A M I OEMDMAR 0x00000001 MSFT 0x00000097)@ 0x000000007f5b5ef0

当ACPI处理和初始化DMAR时,打印DMAR位置和任何已处理的RMRR

ACPI DMAR:Host address width 36
ACPI DMAR:DRHD (flags: 0x00000000)base: 0x00000000fed90000
ACPI DMAR:DRHD (flags: 0x00000000)base: 0x00000000fed91000
ACPI DMAR:DRHD (flags: 0x00000001)base: 0x00000000fed93000
ACPI DMAR:RMRR base: 0x00000000000ed000 end: 0x00000000000effff
ACPI DMAR:RMRR base: 0x000000007f600000 end: 0x000000007fffffff

启用DMAR后,您会注意到…

PCI-DMA: Using DMAR IOMMU

故障报告

DMAR:[DMA Write] Request device [00:02.0] fault addr 6df084000
DMAR:[fault reason 05] PTE Write access is not set
DMAR:[DMA Write] Request device [00:02.0] fault addr 6df084000
DMAR:[fault reason 05] PTE Write access is not set

待决定

  • 对于兼容性测试,可以为所有设备使用统一映射域,只需为所有设备的单个域下的所有有用内存提供1-1。
  • 用于为VMM人员抽象功能的paravirt ops的API。

你可能感兴趣的:(Linux,IOMMU)