GICv3软件overview手册之配置GIC

        本章描述了在裸设备环境下如何使能和配置GICv3中断控制器。对于详细的寄存器描述请查看ARM通用中断控制器用户手册。

        LPI的配置与配置SPI/PPI/SGI不一样,LPI的配置在其他章分开描述。

        使用GICv3中断控制器的大多数系统都是多核系统,并且可能多处理器系统。一些设置都是全局的,他们影响所有连接的PE。其他设置都是针对某个PE的。

        本章首先看全局设置,然后看基于PE的设置。

1. 全局设置

        Distributor控制寄存器GICD_CTLR必须被配置来使能中断group,并设置路由模式。

(1)使能亲和性路由(ARE bits)

        GICD_CTLR中ARE位控制是否亲和性路由使能。若亲和性路由没有使能,GICv3配置为传统操作。是否亲和性路由使能可以被单独控制为安全和非安全状态。

(2)Enables

GICD_CTLR包含group0/安全group1/非安全group1的分开的使能bit。

- GICD_CTLR.EnableGrp1S使能distribution的安全group1中断;

- GICD_CTLR.EnableGrp1NS使能distribution的非安全group1中断;

- GICD_CTLR.EnableGrp0使能distribution的group0中断;

2. 单独的PE设置

2.1 Redistributor配置

        当reset时,Restributor将其连接的PE视为sleeping。通过GICR_WAKER控制唤醒。为使连接PE变为唤醒状态,软件必须:

(1)清GICR_WAKER.ProcessorSleep=0;

(2)轮询GICR_WAKER.ChildrenAsleep直到它为0;

         对LPI的使能和配置在其他章节描述。

        当GICR_WAKER.ProcessorSleep=1或GICR_WAKER.ChildrenAsleep=1时,写CPU接口寄存器,而不是ICC_SRE_ELn,会导致不可预测的行为。

2.2 CPU接口的配置

        CPU接口负责将中断传输到它所连接的PE。为使能CPU接口,软件需要做如下配置:

(1)使能系统寄存器的访问

        前面章节描述了CPU接口寄存器,以及在GICv3中如何访问系统寄存器。软件必须通过设置ICC_SRE_ELn寄存器使能访问CPU接口寄存器。

(2)设置优先级屏蔽和二进制指向寄存器

        CPU接口寄存器包含优先级屏蔽寄存器(ICC_PMR_EL1)和二进制寄存器(ICC_BPRn_EL1)。优先级屏蔽设置中断最小优先级,为了直接给PE。二进制寄存器用来用来优先级分组和抢占。两个寄存器的使用在后面章节中详细描述。

(3)设置EOI模式

        在CPU接口中ICC_CTLR_EL1和ICC_CTLR_EL3中EOI模式控制中断的完成是如何处理的。在后面章节中详细描述。

(4)使能每组中断group的发送

        每个中断group的发送必须在通过CPU接口发送到PE之前使能。为使能发送,软件必须为group1中断写ICC_IGRPEN1_EL1寄存器,为group0中断写ICC_IGRPEN0_EL1寄存器。

        ICC_IGRPEN1_EL1为安全状态。这意味着ICC_GRPEN1_EL1控制当前安全状态的group1。在EL3时,软件通过ICC_IGRPEN1_EL3访问安全group1中断和非安全group1中断使能。

2.3 PE配置

        PE的一些配置也要求允许能接受和处理中断。详细的描述超出了本文档的范围。为AArch64状态的基本步骤:

(1)路由控制

        中断的路由控制在PE的SCR_EL3和HCR_EL2。路由控制位决定中断产生的异常级别。在这些寄存器的路由位在复位时处于UNKNOWN值,因此必须由软件初始化。

(2)中断屏蔽

        PE在PSTATE执行屏蔽位。当这些位需要设置,中断需要屏蔽。在复位时这些位被设置。

(3)Vector表

        PE的向量表的位置由VBAR_ELn寄存器设置。使用SCR_EL3和HCR_EL2.VBAR_ELn在复位时位UNKNOWN值。软件必须设置VBAR_ELn寄存器来指向内存中合适的向量表位置。

3. SPI/PPI/SGI配置

        使用GICD_*寄存器通过Distributor配置SPI。使用GICR_*寄存器通过Dedistributor配置PPI/SGI。对于每个INTID,软件必须配置如下:

(1)优先级(GICD_IPPRORITYn,GICR_IPRIORITYn)

        每个INTID有一个与之相关的优先级,由一个8bit无符号值。0x00为最高优先级,0xff为最低优先级。后面章节会描述GICD_IPRORITYn和GICR_IPRORITYn中的优先级如何屏蔽低优先级中,以及它是如何控制抢占。

        不要求中断控制器实现完整的8bit优先级位。如果GIC支持2个安全状态,至少要实现5bit。如果GIC只支持一个安全状态,至少要实现4bit。

(2)Group(GICD_IGROUPn, GICD_IGRPMODn,GICR_IGROUP0, GICR_IGRPMOD0)

        如前面描述的,一个中断需要被描述位三种中断group中的一种。中断group为group0, 安全group1和非安全group1。

(3)电平触发/边沿触发

        如果中断以物理信号发送,它必须配置为边沿触发或电平触发。SGI通常为边沿触发,因此GICR_ICFGR0通常为RAO/WI。

(4)Enable(GICD_ISENABLERn, GICD_ICENABLER, GICR_ISENABLER0, GICR_ICENABLER0)

          每个INTID有一个enable位。设置-使能寄存器以及清除-使能寄存器不要求进行读-修改-写流程。ARM建议在使能INTID之前进行本章描述的设置。

        对于裸设备,在初始化配置后没有必要经常改变设置。但是,若中断必须要重新配置,比如改变group设置,建议先disable这个INTID。

        大多数配置寄存器的复位后的值为定义实现的。这意味着中断控制器的设计者决定值是多少,这些值在不同的系统上不一样。

3.1 为SPI设置目标PE

        对于SPI,需要配置中断的目标,这由GICD_IROUTERn控制。每个SPI一个GICD_IROUTERn寄存器,Interrupt_Routing_mode位控制路由策略。可选如下:

(1)GICD_IROUTERn.Interrupt_Routing_Mode=0

        SPI被传递给PE A.B.C.D,在寄存器中表明亲和性。

(2)GICD_IROUTERn.Interrupt_Routing_Mode=1

        SPI可以被传递到中断group中Distribution的任一连接的PE。Distributor选择目标PE,而不是软件,因此中断可能每次都不一样。

        这种类型的路由为1:N

        PE可以接受1:N中断。可以通过GICR_CTLR中DPG1S, DPG1NS和DPG0控制。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值