介绍AMD IOMMU driver基于IVRS的硬件初始化情况
1. I/O Virtualization ACPI table
2. drivers/iommu/amd/init.c
1. I/O Virtualization ACPI table [1]
AMD IOMMU的ACPI数据结构,这里只列出一个大概
IVRS (I/O Virtualization Reporting Struct)
-> 48-byte header
-> IVDB:IVHD (I/O Virtualizaiton Hardware Definition) -- info about IOMMU and devices
Types 10h, 11h, 40h, IVHD是关于IOMMU与downstream设备的信息
-> IVDB:IVMD (I/O Virtualizaiton Memory Definition, optional) -- special memory constraints
Types 20h, 21h, 22h, IVMD是相关设备的memory信息
Header:
IVHD:
Flags: PPR,PreF, Coherenet, Iotbl, Isoc, ResPassPW, PassPW, HtTunEn (AMD IOMMU独有)
IOMMU info: UnitID, MSInum (AMD IOMMU独有)
IOMMU feature: HATS, GATS, MSInumPPR, PASmax, GASup, GLXSup, GTSup, XTSup, ... etc. (AMD IOMMU独有)
IVHD Device Entry: (4 or 8 bytes)
DTE settings: Lint0/1Pass, SysMtg[1:0], NMIPass, EIntPass, INITPass (AMD IOMMU独有)
IVMD:
2. drivers/iommu/amd/init.c
注释一下上篇的AMD IOMMU硬件初始化函数
early_amd_iommu_init (case IOMMU_IVRS_DETECTED) :
解析(parse) IVRS
early_enable_iommus (case IOMMU_ACPI_FINISHED):
enable IOMMUs, 主要是针对cmd/event buffer, ga(guest trans)/xt (32 bit APIC dest ID), DT (device table)等的设置
register_syscore_ops/amd_iommu_init_pci/enable_iommus_v2 (case IOMMU_ENABLED)
amd_iommu_init_pci ->
iommu_init_pci:
根据IOMMU PCI CFG,EFRSup (IOMMU Extended Feature Register),设置IOTLB, GT, PPR, V2, GA log, 等变量
amd_iommu_init_api ->
amd_iommu_init_dma_ops :
设置变量swiotlb (0 pt/sme me mask or 1)me: memory encryption
bus_set_iommu:
设置amd_iommu_ops
init_device_table_dma :
使能DTE.V/TV
iommu_flush_all_caches :
flush the caches of all IOMMUs, 包括DTE, IRT, TLB (pages)
enable_iommus_v2:
对于ppr, gt (guest trans)
amd_iommu_enable_interrupts (case IOMMU_PCI_INIT)
3. summary
AMD IOMMU硬件的初始化,首先要解析IVRS表,得到IOMMUs, 及其下属devices的相关信息,根据这些信息,建立数据结构,使能IOMMUs。
根据Cfg space中的Capability以及EFRSup (extended feature register), 设置相应变量,以供后续使用
amd_iommu_ops是amd iommu driver的具体实现
设置DET中的V, TV是允许DMA remapping功能起作用
Reference:
【1】
AMD I/O Virtualization Technology (IOMMU) Specification, 48882