• ARM GIC手册学习:Affinity routing


    1 Affinity routing

    Affinity routing是一种基于分层地址的方案,用于标识用于中断路由的特定PE节点。

    AArch64状态下,一个PE的affinity value定义在MPIDR_EL1寄存器中

    Affinity routing value是由4个8-bit字段(a.b.c.d)组成的32bit value。

    • GICv3 AArch64下支持 a.b.c.d四层和 0.b.c.d三层 affinity level 。
    • 通过ICC_CTLR_EL3.A3V, ICC_CTLR_EL1.A3V, and GICD_TYPER.A3V 配置是否支持 four level or three level 的 Affinity routing 。

    这四个字段被标准化为下面的形式:

    Aff3.Aff2.Aff1.Aff0
    

    其中 Affx 代表Affinity level x.


    通过ARE bit来启用Distributor安全状态下的 Affinity routing,Affinity routing 启用的条件:

    • 对于 Secure 中断,GICD_CTLR.ARE_S bit is set to 1.
    • 对于 Non-secure 中断,GICD_CTLR.ARE_NS bit is set to 1.

    当 Affinity routing 启动时,若处理 physical interrupts,那么 System register access 也必须启用。


    1.1 SPI and SGI中断使用 Affinity Routing

    SPI中断的 affinity address 和 routing mode 信息在GICD_IROUTER<n>寄存器中配置。

    SGI中断的 affinity address 和 routing mode 信息由生成中断时通过软件配置。


    SGI中断的生成使用以下寄存器:

    • ICC_SGI0R_EL1.
    • ICC_SGI1R_EL1.
    • ICC_ASGI1R_EL1.

    ARM建议 Aff0 字段使用0-15的值来与 SGI target list 保持一致。


    SPI和SGI中断路由使用不同的寄存器:

    • SPI中断使用GICD_IROUTER<n>.Interrupt_Routing_Mode:
      • If GICD_IROUTER.Interrupt_Routing_Mode is cleared to 0, SPIs are routed to a single PE specified by a.b.c.d.
      • If GICD_IROUTER.Interrupt_Routing_Mode is set to 1, SPIs are routed to any PE defined as a
        participating node.
    • SGI中断使用ICC_SGI0R_EL1.IRM, and ICC_SGI1R_EL1.IRM:
      • 若IRM位为1,SGI被路由到系统中除了源PE以外的所有PE。
      • 若IRM位为0,SGI被路由到由a.b.c.targetlist指定的一组PE。target list 提供 Aff0 的位域编码(0-15)。

    1.2 Participating nodes

    在以下情况下,配置成1 of N distribution model 的 SPI 中断可以转发到此PE:

    • GICR_WAKER.ProcessorSleep == 0 并且该PE启动了此中断的Group。
    • GICD_CTLR.E1NWF == 1.
    • GICR_TYPER.DPGS == 1,并且对于该中断所在的Group, GICR_CTLR.{DPG1S, DPG1NS,
      DPG0} == 0

    对于以上规则确定的PE总称为 Participating nodes.


    1.3 Enable Affinity routing

    本文讨论的都是GICv3架构中启用Affinity routing,于是以下必然成立:

    • GICD_CTLR.ARE_NS == 1
    • GICD_CTLR.ARE_S == 1

    当 GICD_CTLR. DS == 0 :

    • 除非符合以下所有条件,否则无法将GICD_CTLR.ARE_S从0更改为1:
      • GICD_CTLR.EnableGrp0 == 0.
      • GICD_CTLR.EnableGrp1S == 0.
      • GICD_CTLR.EnableGrp1NS == 0.
    • 除非GICD_CTLR.EnableGrp1NS==0,否则无法将GICD_CTLR.ARE_NS从0更改为1.

    当 GICD_CTLR. DS == 1 :

    • 除非符合以下所有条件,否则无法将GICD_CTLR.ARE从0更改为1:
      • GICD_CTLR.EnableGrp0 == 0.
      • GICD_CTLR.EnableGrp1 == 0.
  • 相关阅读:
    我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜
    Memcached双主模型之repcached
    Redis服务之Redis5集群相关命令说明
    Redis服务之集群节点管理
    Redis服务之Redis Cluster
    Redis服务之高可用组件sentinel
    Redis服务之常用数据类型
    Redis服务之常用配置(三)
    Redis服务之常用配置(二)
    Redis服务之常用配置(一)
  • 原文地址:https://www.cnblogs.com/bluettt/p/15061616.html
Copyright © 2020-2023  润新知