AMD IOMMU与Linux (2) -- IVRS及AMD IOMMU硬件初始化

2023-05-16

介绍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

[2] IOMMU(三)-初始化 - 云+社区 - 腾讯云 (tencent.com)

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

AMD IOMMU与Linux (2) -- IVRS及AMD IOMMU硬件初始化 的相关文章

随机推荐