深入了解iommu系列三:interruptremapping底层硬件工作原理和驱动初始化解析

Linux阅码场 2022-03-10 08:00

序言

iommu系列二主要介绍了dma remapping的工作原理,这一篇我们来详细介绍一下iommu interrupt remapping 底层硬件工作原理和驱动层相关初始化流程

底层硬件工作原理

谈到中断大家可能不太会直接联想到iommu这个硬件,而事实上在虚拟化未出现之前中断的处理确实不需要iommu的参与。interrupt remapping of iommu的引入主要是为了解决虚拟化场景直通设备的中断投递问题,由于iommu的最重要的功能是dma处理,因此在interrupt  remapping enable的情况下,系统当中所有以message signal 的形式来触发的中断都是需要iommu来处理的。或者有人会问为什么是message singal interrupt(msi 或者msix)呢?因为所有的msi中断最底层的实现方式是往特定的地址(0xFEEX_XXXXh)触发一个dma write操作,iommu也是通过0xFEE 这个prefix来判断某个dma write 是否是一个中断请求。引入了iommu之后,系统当中pcie或者pci设备,ioapic,hpet(有些平台hpet是支持msi中断的)等这些设备的msi or msix中断请求都会经过iommu进行处理。

为了让大家更好的理解interrupt remapping的工作机制,我们对比一下相关设备在remapping和非remapping这两种模式下的中断投递和处理方式(这两种方式的对比都是在系统引入了iommu的背景下)。首先介绍一下ioapic,ioapic在系统硬件架构当中所处的位置如图1所示:

图1
通常情况下操作系统是通过acpi表来发现ioapic的,当然有些平台也已经支持通过pcie协议来发现ioapic,其他外设比如大部分的legacy设备的中断都是需要通过ioapic进行路由,那么不同设备的中断是如何通过ioapic投递的呢?原来ioapic维护了一个redirection table,当某个设备中断到达ioapic时,它会根据Redirection Table格式化出一个message  signal interrupt 发往相应的cpu。具体的redirection table entry的格式如下:

图2

接着我们看一下在interrupt remapping enable的场景下,ioapic的redirection table entry的格式是什么样的。

图3

通过图2和图3的对比我们能够看到一些不一样的地方,这里我们总结一下RTE在interrupt remapping 模式下新引入的一些字段说明:

  • bits 49:63 对应的是interrupt_index[14:0],bit 11对应的是interrup_index[15] 即第15位,关于这个16bits的interrupt_index后面会详细说明
  • bit 48表示是否为remapping的中断格式,所以必须要置1
  • bits 10:8 表示SHV(SubHandle Valid),强制设置为000b表示SHV不可用。关于SHV后面也会讲到 至于其他两种模式都有的字段比如vector, Trigger Mode, delivery status等需要对齐。

下面我来看一下pci或者pcie设备的msi or msix 中断在两种模式的差异点,先来看一下非remapping模式下message address 和message data的format。

图4

图5

图4和图5呈现的是在非remapping模式下msi的address和data的相关field,下面我们重点来看一下remapping模式下的address和data。

图6

对照图6还是总结一下在remapping模式下的不同点:

  • address register bit 4需要置为1,表示为interrupt remapping模式。
  • adress register bit 3 表示的是SubHandle Valid(SHV),这里强制为1即SubHandle是有效的。
  • address register bits 19:5 表示的是interrupt_index的0~14位,bit 2表示的是interrupt_index的第15位。这里的interrup_index指的是Interrupt Remapping Table Entry(IRTE) 它里面存储的是interrupt 请求的具体内容。通常情况下pci或者pcie设备一般都会使能多个这里以N来代替中断vector,也就意味着我们要为这个N 个vector分配N个连续的IRTE enteries。这里的interrup_index指的是第一个 IRTE entry,因为SHV是enable的所以后面的N-1个连续的IRTE entries是通过base的interrupt_index加上这个subhandle来寻址的。
  • 第一个 IRTE entry的data register 全部设置为0,后N-1的IRTE的data register bits 15:0 设置为subhandle。

上面讲了IRTE,讲了SHV,讲了interrupt_index,讲了subhandle,这些概念之间有什么关联?iommu硬件又是怎么使用这些信息的呢?要回答好这些问题我们还是要从最底层来看,先来看一下在interrupt remapping模式下以iommu视角看到的message signal interrupt request是什么样子的?

图7
当iommu解析出这些信息之后计算irte的索引的公式如下:
if (SHV == 0) {
 irte_index = address.handle;
else {
 irte_index = address.handle + subhandle
}

这个HANDLE等价于图6当中的interrupt_index。找到相应的irte index之后,iommu硬件就会结合相关的信息把中断delivery到相应的cpu上,具体的irte的格式如下:

图8
从图8中是不是看到了很多熟悉的field,其实就是把一些非remapping模式下的field移到了IRTE entry里面。

正常情况下iommu硬件是能够兼容interrupt remapping和非remapping这两中断请求的,下面看一下非remapping模式下的中断请求的格式。

图9
讲完了这两种不同中断模式的interrupt request 格式,下面我们来讲一下iommu硬件是如何兼容这两种中断请求的:
  • iommu硬件通过0xFEE来确认到来的dma写请求是不是一个中断请求。
  • 如果interrupt remapping没有enable(IRES 字段在Global Status Register没有置上),则中断按照Compatibility Format interrupt request来处理。
  • 如果interrupt remapping enable了即IRES在Global Status Register置位,那么中断具体处理流程如下:

    • 如果interrupt request 是compatibility format则具体处理如下:
      • 如果Extended interrupt Mode enable(Interrupt Remapping Table Address register 的EIME 字段被置上)或者Compatibility format interrupts 被disabled(Global Status register的CFIS被clear)则这个中断请求将会被block;如果上述两个条件都不成立则中断将会pass through即bypass remapping。

    • 如果interrupt request 是 remapping 格式则处理流程如下:
      • 首先检查reserved 字段是否为0,如果不为0则中断请求被block;如果为0则source-id, Handle, SHV,Subhandle将被解析出来
      • 根据解析出来的相关信息计算irte_index,如果irte_index大于interrupt remapping tables size则中断请求被block
      • 如果irte_index是一个在正常范围内的值则从interrupt remapping table或者从interrupt Entry Cache里面获取相对应的IRTE。
      • 如果IRTE存在,则iommu硬件还需要确认SVT, SID, SQ这些字段是否正确。
    • 如果IRTE的Mode field clear(即IM=0,如果IM=1则表示这个中断是post interrupt,关于pi我们下一篇再细讲)
      • iommu 硬件根据interrupt remapping 格式对IRTE进行解析,如果发现某些filed异常则该中断被block
    讲完了这些大家可能已经理解中断remapping是怎么一回事了,这个feature的重点就在 remapping 上。为什么要remapping呢?首先,通过上面的分析大家也都应该知道在非虚拟化的场景下相关设备的中断处理一定是不需要remapping的,正如前面的行文所说有个CFIS field来决定在中断remapping 功能enable的情况下如果CFIS set则就可以处理Compatibility format interrupts,具体描述如下:

    图10

    从上面的解释可以看到在interrupt remapping enabled的场景下,CFIS只有在x2apic disabled的情况下它才能起效果。但是目前主流的x86的服务器x2apic都是打开的,也就是说CFIS就是这个摆设根本用不起来。所以只要是iommu打开的场景下,相关设备的msi or msix中断一定是走中断remapping的(即使你的设备并不是直通给vm的),无形中降低了中断的处理效率。从这一点也能说明intel在设计interrup remapping的时候考虑的并不是很全面

    我们接着说虚拟化场景,如果你想把pci or pcie设备直通给虚拟机则中断remapping是必须的,原因其实也很简单:因为pcie设备在host上使能的时候其原生驱动会为其分配中断irq,那么当其直通到vm里面的时候guest os会再一次为其分配中断irq,那这两者如果要关联起来只能通过中断remapping的方式

    驱动层初始化

    中断 remapping feature的初始化是从enable_IR_x2apic 这个函数开始的,具体如下

    void __init enable_IR_x2apic(void)
    {
            unsigned long flags;
            int ret, ir_stat;

            if (skip_ioapic_setup)
                    return;

            ir_stat = irq_remapping_prepare();
            if (ir_stat < 0 && !x2apic_supported())
                    return;

            ret = save_ioapic_entries();
            if (ret) {
                    pr_info("Saving IO-APIC state failed: %d\n", ret);
                    return;
            }

            local_irq_save(flags);
            legacy_pic->mask_all();
            mask_ioapic_entries();

            /* If irq_remapping_prepare() succeeded, try to enable it */
            if (ir_stat >= 0)
                    ir_stat = try_to_enable_IR();
            /* ir_stat contains the remap mode or an error code */
            try_to_enable_x2apic(ir_stat);

            if (ir_stat < 0)
                    restore_ioapic_entries();
            legacy_pic->restore_mask();
            local_irq_restore(flags);
    }

    先说一下irq_remapping_prepare,其核心逻辑调用intel_irq_remap_osprepareintel_prepare_irq_remapping函数,接下来我们看一下这个函数的具体实现逻辑。首先会去解析dmar_table如果大家读过iommu初始化那篇文章应该是有所了解,接着会通过dmar的flag来判断是否支持interrup remapping,具体见下图中flag示意

    图11
    接着判断系统当中的ioapic是不是也都已经与enable interrupt remapping的iommu相关联起来了。然后遍历所有的iommu硬件是不是都支持irq remapping,主要是判断DMAR_ECAP_REG寄存器的bit 3是否置位如为1则说明支持irq remapping,具体如下

    图12

    然后如果系统支持x2apic则通过dmar table flag的Flags的bit 1来判断iommu硬件是否enable了x2apic(注如果这个bit被清0则表示enable了),接着遍历所有的iommu硬件通过检测图12当中的cap regsiter的EIM field是否为0(为0则表示只支持xAPIC,为1则表示直接x2APIC),如果有一个iommu硬件cap不支持EIM,则整个eim_mod也会设置为false。接下来才开始进入真正的核心逻辑

           for_each_iommu(iommu, drhd) {
                    if (intel_setup_irq_remapping(iommu)) {
                            pr_err("Failed to setup irq remapping for %s\n",
                                   iommu->name);
                            goto error;
                    }
            }

    从上面可以看到它会为每个iommu硬件来创建irq_remapping相关的信息,具体还是要分析一下intel_setup_irq_remapping这个函数。首先为每个iommu分配ir_table结构,接着创建1M大小的中断remapping table,接着创建bitmap主要是用它来管理table当中有哪些irte可用,然后再创建ir_domain和ir_msi_domain这两类中断domain,linux当中的irq domain是一个树形结构具体关系如下

    x86_vector_domain ---- 父亲
          |
        |
       ir_domain   -------- 儿子
          |
        |
       ir_msi_domain -------孙子

    接下来通过iommu_set_irq_remapping 这个函数来设置irte table的基地址

    addr = virt_to_phys((void *)iommu->ir_table->base);

    raw_spin_lock_irqsave(&iommu->register_lock, flags);
    //将ir table的基地址写到IRTA寄存器
    dmar_writeq(iommu->reg + DMAR_IRTA_REG,
                        (addr) | IR_X2APIC_MODE(mode) | INTR_REMAP_TABLE_REG_SIZE);
    //这一步的作用主是通知硬件去更新irte table的指针,避免有cache残留
    /* Set interrupt-remapping table pointer */
    writel(iommu->gcmd | DMA_GCMD_SIRTP, iommu->reg + DMAR_GCMD_REG);

    总结

    上面基本上把interrupt remapping的硬件层工作原理和软件层初始化的流程讲完了,在下面的文章当中我会详细的介绍一下interrupt remapping在虚拟化和非虚拟化这两种场景下的工作机制。


    Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
    评论
    • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
      优思学院 2025-01-08 14:54 82浏览
    • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
      知白 2025-01-07 15:02 151浏览
    • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
      丙丁先生 2025-01-07 09:25 126浏览
    • 在智能网联汽车中,各种通信技术如2G/3G/4G/5G、GNSS(全球导航卫星系统)、V2X(车联网通信)等在行业内被广泛使用。这些技术让汽车能够实现紧急呼叫、在线娱乐、导航等多种功能。EMC测试就是为了确保在复杂电磁环境下,汽车的通信系统仍然可以正常工作,保护驾乘者的安全。参考《QCT-基于LTE-V2X直连通信的车载信息交互系统技术要求及试验方法-1》标准10.5电磁兼容试验方法,下面将会从整车功能层面为大家解读V2X整车电磁兼容试验的过程。测试过程揭秘1. 设备准备为了进行电磁兼容试验,技
      北汇信息 2025-01-09 11:24 52浏览
    • 1月7日-10日,2025年国际消费电子产品展览会(CES 2025)盛大举行,广和通发布Fibocom AI Stack,赋智千行百业端侧应用。Fibocom AI Stack提供集高性能模组、AI工具链、高性能推理引擎、海量模型、支持与服务一体化的端侧AI解决方案,帮助智能设备快速实现AI能力商用。为适应不同端侧场景的应用,AI Stack具备海量端侧AI模型及行业端侧模型,基于不同等级算力的芯片平台或模组,Fibocom AI Stack可将TensorFlow、PyTorch、ONNX、
      物吾悟小通 2025-01-08 18:17 43浏览
    •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
      晶台光耦 2025-01-08 16:03 80浏览
    • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
      华普微HOPERF 2025-01-06 17:23 214浏览
    • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
      晶台光耦 2025-01-09 09:58 33浏览
    • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
      Industio_触觉智能 2025-01-08 00:06 105浏览
    • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
      GIRtina 2025-01-07 11:02 129浏览
    • 在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求。然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案。康谋ADTF正是应运而生,它提供了一个广受认可和广泛引用的软件框架,包含模块化的标准化应用程序和工具,旨在为ADAS功能的开发提供一站式体验。一、ADTF的关键之处!无论是奥迪、大众、宝马还是梅赛德斯-奔驰:他们都依赖我们不断发展的ADTF来开发智能驾驶辅助解决方案,直至实现自动驾驶的目标。从新功能的最初构思到批量生
      康谋 2025-01-09 10:04 43浏览
    • 一个真正的质量工程师(QE)必须将一件产品设计的“意图”与系统的可制造性、可服务性以及资源在现实中实现设计和产品的能力结合起来。所以,可以说,这确实是一种工程学科。我们常开玩笑说,质量工程师是工程领域里的「侦探」、「警察」或「律师」,守护神是"墨菲”,信奉的哲学就是「墨菲定律」。(注:墨菲定律是一种启发性原则,常被表述为:任何可能出错的事情最终都会出错。)做质量工程师的,有时会不受欢迎,也会被忽视,甚至可能遭遇主动或被动的阻碍,而一旦出了问题,责任往往就落在质量工程师的头上。虽然质量工程师并不负
      优思学院 2025-01-09 11:48 66浏览
    • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
      hai.qin_651820742 2025-01-07 14:52 115浏览
    • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球中空长航时无人机产值达到9009百万美元,2024-2030年期间年复合增长率CAGR为8.0%。 环洋市场咨询机构出版了的【全球中空长航时无人机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球中空长航时无人机总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析中空长航时无人机市场主要驱动因素、阻碍因素、市场机遇、挑战、新产品发布等。报告从中空长航时
      GIRtina 2025-01-09 10:35 40浏览
    • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
      虹科Pico汽车示波器 2025-01-08 16:51 98浏览
    我要评论
    0
    点击右上角,分享到朋友圈 我知道啦
    请使用浏览器分享功能 我知道啦