【ARM系列】GICv3/v4-软件概述(一)

2.介绍

本文档提供了聚焦于软件的GICv3功能特性概述,并描述了GICv3中断控制器的配置操作。这也是在bare metal环境如何使用GICv3中断控制器的入门教程。

2.1 范围

GICv3可以支持许多不同的配置和使用场景。为了简化,本文只关注其中的一个子集,该场景下:

  • 存在2个安全状态
  • 2个安全状态都使能中断路由
  • 所有EL等级都能访问系统寄存器
  • 所关连的处理器都遵循ARMv8-A架构,即全部都实现所有的异常级并且都运行在AArch64状态

本文档不包括:

  • Legacy operation(除了本章中提到的)
  • 运行在AArch32状态下EL等级的使用

2.2 GIC架构历史

在这里插入图片描述

2.3 GICv3架构的实现

GICv3架构对应的具体实现为Arm CoreLink GIC-500。同时GIC-500已应用在了ARM Cortex A53,ARM Cortex A57,ARM Cortex A72中。

2.4 Legacy的支持

GICv3在编程模型上做了许多改变。为了兼容基于GICv2的legacy 软件,GICv3需要支持Legacy operation。
在编程模式中可以通过配置GICD_CTLR的Affinity Routing Enable (ARE)实现:

  • ARE==0,禁止亲和力路由,此时支持Legacy operation
  • ARE==1,使能亲和力路由。

Note:为了可读性,在本文档中,GICD_CTLR.ARE_S和GICD_CTLR.ARE_NS统称为ARE。

在具有两个安全状态的系统中,每个安全状态下的亲和性路由可以独立控制。但是只有特定的组合才被允许。

在这里插入图片描述
本文档着重关注GICv3编程模型,即ARE==1支持两种安全状态的情况,Legacy Operation不讨论。

3.GICv3基础

本章描述了符合GICv3结构的中断控制器的基本操作,同时还描述了不同的编程接口。

3.1 中断类型

  • SPI(Shared Peripheral Interrupt)
    共享外设中断,这类中断可以路由到某个指定的PE或一组PE中的一个去处理。
  • PPI(Private Peripheral Interrupt)
    私有外设中断,这类中断只能路由到特定的PE进行处理。比如某个PE的Generic Timer中断只能路由给该PE处理。
  • SGI(Software Generated Interrupt)
    软件产生中断,这类中断主要用于核间通信,通过配置GIC的SGI寄存器产生。
  • LPI(Locality-specific Peripheral Interrupt)
    特定本地外设中断,是GICv3新增的一类中断。这类中断始终是基于消息的中断,它们的配置保存在内存中的表中,而不是寄存器中

Note:仅在n GICD_CTLR.ARE_NS==1时,才支持LPI中断

3.1.1 中断ID

每一个中断源都使用一个ID进行标识,称为INTID。每种中断类型可以使用的INTID的范围如下表所示。
在这里插入图片描述

3.1.2 中断如何传输到中断控制器

典型的,外设通过专用的硬件信号将中断发送到中断控制器,如下图所示:
在这里插入图片描述
另外,GICv3还支持message-based中断。消息类型的中断的产生和清除都是通过配置中断控制器的寄存器实现的。
在这里插入图片描述
在GICv3中,SPI可以是基于消息的中断,但LPI总是基于消息的中断。两种中断类型使用不同的寄存器产生消息中断。
在这里插入图片描述

3.2 中断状态机

中断控制器为SPI,PPI和SGI的每个中断源都维护了一个状态机,该状态机包括4个状态,状态转移图如下所示:

  • Inactive:中断源当前未触发
  • Pending:中断源已触发中断,但是该中断尚未被PE acknowledge
  • Active:中断源已触发中断,同时该中断被PE acknowledge
  • Active and Pending:一个中断已经被acknowledge,同时又有一个处于pending状态

Note:LPI中断没有active和active and pending状态,上面的状态转移图同样不适用LPI,LPI相关信息可以参考6.2节。

根据中断配置为电平敏感还是边沿敏感,中断的生命周期有所不同。

3.2.1 电平敏感

在这里插入图片描述

  • Inactive -> Pending
    当中断源被触发时,发生该状态的转换。此时GIC会通过FIQ/IRQ将中断送到PE(该中断使能并有足够优先级)。
  • Pending -> Active&Pending
    PE通过读取cpu interface的IAR (Interrupt Acknowledge Registers) 寄存器,acknowledge该中断时,会发生该状态的转换。该操作通常是发生中断异常后执行中断服务程序的一部分。但是,软件也可以轮询IAR。此时,GIC de-assert中断信号给PE。
  • Active&Pending -> Active
    当外设de-assert给GIC的中断信号时,发生该状态的转换。这通常是对在PE上执行的中断处理软件写外设状态寄存器的响应。
  • Active -> Inactive
    当PE写cpu interface中的其中一个EOIR(End of Interrupt Registers)时,发生该状态的转换。此时表明PE完成当前中断的处理。

3.2.2 边沿触发

在这里插入图片描述

  • Inactive -> Pending
    当中断源被触发时,发生该状态的转换。此时GIC会通过FIQ/IRQ将中断送到PE(该中断使能并有足够优先级)。
  • Pending -> Active
    PE通过读取cpu interface的IAR (Interrupt Acknowledge Registers) 寄存器,acknowledge该中断时,会发生该状态的转换。该操作通常是发生中断异常后执行中断服务程序的一部分。但是,软件也可以轮询IAR。此时,GIC de-assert中断信号给PE。
  • Active -> Active&Pending
    当外设re-assert给GIC的中断信号时,发生该状态的转换。
  • Active&Pending -> Pending
    当PE写cpu interface中的其中一个EOIR(End of Interrupt Registers)时,发生该状态的转换。此时表明PE完成当前中断的处理。此时GIC re-assert中断给PE。

3.3 亲和性路由

GICv3使用亲和性路由来识别连接的PE,并将中断路由到特定的PE或PE组。PE的亲和性表示为四个8位字段:

<affinity level 3>.<affinity level 2>.<affinity level 1>.<affinity level 0>

下图是亲和性路由层次关系的一个例子:
在这里插入图片描述

affinity level 0对应Redistributor,每一个Redistributor都与一个cpu interface相连,Redistributor用于控制SGI,PPI和LPI。

亲和性方案与ARMv8-A中使用的方案相匹配,与MPIDR_EL1中记录的PE的亲和性一致。系统设计人员必须确保MPIDR_EL1指示的关联值与连接到PE的Redistributor的GICR_TYPER指示的值相同。

不同级别的亲和性路由的含义有具体的处理器或SOC进行定义。同时具体实现中往往不会将所有的亲和性路由结点都实现。例如,用于移动设备的SoC可以按照以下的布局

0.0.0.[0:3] 表示 Cores 0 to 3 of a Cortex-A53 processor
0.0.1.[0:1] 表示 Cores 0 to 1 of a Cortex-A57 processor

在ARMv8-A中,AArch64状态支持四个级别的亲和性路由。AArch32状态和ARMv7可以仅支持三个级别的亲和力。这意味着使用AArch32状态的设计 affinity level 3只能使用单个结点 (0.x.y.z)。寄存器GICD_TYPER.A3V指示中断控制器是否可以支持多个3级节点。

3.4 安全模型

GICv3体系结构支持ARM TrustZone技术。每个INTID都必须分配一个组和安全设置。GICv3支持三种组合:
在这里插入图片描述
Group 0中断总是以FIQ的形式发出信号。根据PE的当前安全状态和异常级别,Group 1中断使用IRQ或FIQ形式发出。
在这里插入图片描述
这些规则旨在补充ARMv8-A安全状态和异常级别的路由控制。下图显示了一个简化的软件堆栈,当在EL0执行时,触发不同类型中断信号时会发生什么:

在这里插入图片描述
在这个例子中,根据PE当前的安全状态和所处EL等级,中断所属的安全分组,中断会分别以FIQ和IRQ的形式进行上报处理。又因为此处SCR_EL3.IRQ0,SCR_EL3.FIQ1表明IRQ会路由到EL1,FIQ会路由到EL3。

3.4.1 软件的影响

在配置中断控制器的时候,软件负责为每个中断分配中断分组,只有安全软件才可以对中断进行中断分组的配置。
通常,只有在安全状态的软件才能访问安全分组中断的设置和状态(Group 0和Secure Group 1)。
但是使用通过配置GICD_NSACRn和GICR_NSACR寄存器独立控制每个INTID,实现非安全状态的软件访问安全分组中断的设置和状态

Note:复位时,一个中断所属的中断分组是由实现定义的。
Note:LPI中断分组为 Non-secure Group 1。

3.4.2 单个安全状态的支持

设计实现可以选择支持一种安全状态或两种安全状态。支持两种安全模式的GICv3实现中,一种安全模式应该被禁止,可以通过GICD_CTLR.DS控制:

  • GICD_CTLR.DS == 0,支持两种安全状态(Secure and Non-secure)
  • GICD_CTLR.DS == 1,仅支持一种安全状态,此时中断分组为Group 0 和 Group 1

3.5 编程模型

GICv3 中断控制器的寄存器接口包括如下三组:

  • Distributor interface
  • Redistributor interface
  • CPU interface
    在这里插入图片描述

3.5.1 Distributor(GICD_*)

Distributor寄存器是memory-mapped寄存器,包含影响所有PE的全局设置。Distributor interface支持如下功能配置:

  • SPI中断优先级和分发
  • 使能、禁止SPI中断
  • 配置各个SPI中断的优先级
  • 每个SPI中断的路由信息
  • 配置各个SPI的中断触发方式(电平敏感或边沿触发)
  • 产生message-based SPI中断
  • 控制SPI中断的active和pending状态
  • 确定各个安全状态中使用的编程模型(affinity routing or legacy)

3.5.2 Redistributor(GICR_*)

每个PE对应一个redistributor,redistributor interface支持如下功能配置:

  • 使能、禁止SGI和PPI中断
  • 配置SGI和PPI中断的优先级
  • 配置PPI中断的触发方式(电平敏感或边沿触发)
  • 给每一个SGI和PPI中断分配一个中断组
  • 控制SGI和PPI中断的状态
  • 控制LPI properties table和LPI pending table在内存中的基地址和属性
  • 每个PE的电源管理

3.5.3 CPU接口(ICC_*_ELn)

每个redistributor都连接一个CPU interface。CPU interface支持如下功能配置:

  • 使能中断处理的控制和配置
  • 应答中断
  • 执行 priority drop 并无效中断
  • 为PE配置中断优先级门限
  • 为PE配置抢占策略
  • 为PE确定最高优先级的挂起中断

在GICv3中,CPU interface寄存器作为系统寄存器(ICC_*_ELn)进行访问。
在使用这些寄存器之前,软件必须启用系统寄存器接口。这由ICC_SRE_ELn寄存器中的SRE位控制,其中“n”指定异常级别(EL1-EL3)。

————————————————
参考文献:GICv3 and GICv4 Software Overview

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值