自 2014 年以来启用的 iommu 在 /sys (sysfs) 特殊文件系统中注册为类iommu
(记录在ABI/testing/sysfs-class-iommu 中):
https ://patchwork.kernel.org/patch/4345491/ “[2/3 ] iommu/intel:利用 IOMMU sysfs 支持” - 2014 年 6 月 12 日
注册我们的 DRHD IOMMU、交叉链接设备,并为 IOMMU 提供一组基本属性。...在典型的桌面系统上,这提供了以下(修剪):
$ find /sys | grep dmar
/sys/devices/virtual/iommu/dmar0
...
/sys/class/iommu/dmar0
/sys/class/iommu/dmar1
代码是iommu_device_create
(http://elixir.free-electrons.com/linux/v4.5/ident/iommu_device_create,大约 4.5)或iommu_device_sysfs_add
(http://elixir.free-electrons.com/linux/v4.11/ident /iommu_device_sysfs_add)在更新的内核中。
/*
* Create an IOMMU device and return a pointer to it. IOMMU specific
* attributes can be provided as an attribute group, allowing a unique
* namespace per IOMMU type.
*/
struct device *iommu_device_create(struct device *parent, void *drvdata,
const struct attribute_group **groups,
const char *fmt, ...)
仅对启用的 IOMMU 进行注册。DMA:
if (intel_iommu_enabled) {
iommu->iommu_dev = iommu_device_create(NULL, iommu,
intel_iommu_groups,
"%s", iommu->name);
AMD IOMMU:
static int iommu_init_pci(struct amd_iommu *iommu)
{ ...
if (!iommu->dev)
return -ENODEV;
...
iommu->iommu_dev = iommu_device_create(&iommu->dev->dev, iommu,
amd_iommu_groups, "ivhd%d",
iommu->index);
英特尔:
int __init intel_iommu_init(void)
{ ...
pr_info("Intel(R) Virtualization Technology for Directed I/O\n");
...
for_each_active_iommu(iommu, drhd)
iommu->iommu_dev = iommu_device_create(NULL, iommu,
intel_iommu_groups,
"%s", iommu->name);
许多 IOMMU 驱动程序iommu_device_sysfs_add
都引用了4.11 linux 内核版本,因此检查 /sys/class/iommu 以编程方式检测启用的 IOMMU 比解析输出或搜索驱动程序特定的启用消息更好(更通用)的方法:dmesg
/var/log/kern.log
/var/log/messages
在 10 个文件中引用:
- 驱动程序/iommu/amd_iommu_init.c,第 1640 行
- 驱动程序/iommu/arm-smmu-v3.c,第 2709 行
- 驱动程序/iommu/arm-smmu.c,第 2163 行
- 驱动程序/iommu/dmar.c,第 1083 行
- 驱动程序/iommu/exynos-iommu.c,第 623 行
- 驱动程序/iommu/intel-iommu.c,第 4878 行
- 驱动程序/iommu/iommu-sysfs.c,第 57 行
- 驱动程序/iommu/msm_iommu.c,第 797 行
- 驱动程序/iommu/mtk_iommu.c,第 581 行