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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM