GIC spec之ITS和LPI中断3

2 ITS

        ITS转化一个设备的输入EventID,设备由DeviceID区分,它决定:

(1)输入相对应的INTID;

(2)目标Redistributor,INTID的目标PE;

        对于GICv3,ITS将events转化为物理LPI。LPI可以通过ITS或直接写GICR_SETLPIR直接发送给Redistributor。一个实现必须支持这些方法中的一个。

        对于GICv4,ITS也直接可以注入虚拟LPI,对于GICv4.1,也可以注入虚拟SGI。

        ITS对于物理SGI,SPI或PPI没有效果。

        ITS转换的流程如下:

(1)DeviceID在用于描述使用哪个中断转换表ITT的设备表中的设备表项DTE;

(2)EventID用于选择ITT中的中断转换条目ITE,它描述:

对于物理中断:

- 输出物理INTID;

- 中断collection标号,ICID

对于虚拟中断,GICv4:

- 输出虚拟INTID;

- vPEID

- 在vPE没有被调度时使用doorbell

(3)对于物理中断,ICID选择用于描述目标Redistributor以及路由到哪个目标PE的CT中的CTE;

(4)对于虚拟中断,在GICv4中,vPEID用于选择用于描述将当前目标vPE路由到哪个中断的Redistributor中的vPE表项;

        在转换过程中使用的表在下列部分中进行描述:

  1. ITS表
  2. 设备表DT
  3. 中断转换表ITT
  4. Collection表CT
  5. vPE表

        这些表使用ITS命令进行创建和维护。GICv3和GICv4不支持直接访问表,必须通过ITS命令进行配置。

2.1 ITS表

        当GIC提供一组寄存器来允许下列特性可以被发现,软件为ITS私有表提供内存:

(1)要求的私有表的数目;

(2)每个表中每个表项的大小;

(3)每个表的类型;

        NOTE: 所有ITS表都在非安全物理地址空间。

        ITS表的状态和配置保存在内存中的一组表中。在使能ITS之前软件分配内存。

        GITS_BASER<n>指定了ITS表的基地址和大小,且必须在ITS使能前提供。

        ITS表可以为flat结构或二级结构。该结构时由GITS_BASER<n>决定:

0 Flat结构。在这种情况下会为表非陪一块连续的内存。表的格式是由实现定义的。如果ITS表使用的内存在分配时不包含0,行为则不可预测。

1 二级表。在这种情况下level1表的每个表项为64bit,且由如下格式:

(1)Bit[63] - Valid:

- 如果此位被清0,PhysicalAddress域不指向level2表的基地址;

- 如果此位设置位1,PhysicalAddress域指向level2表的基地址;

(2)Bit[62:52] - RES0

(3)Bit[51:N] - level2表的PhysicalAddress。N位指定page size的位数目。

- level2表的大小由GITS_BASER<n>.Page_Size。

(4)Bit[N-1:0] - RES0。N位指定page size的位数目。

        Level1表由合适的ID索引,因此level 1 entry = ID/(Page Size/Entry Size)。

        NOTE: 这允许软件为level2表必须为给定CollectionID,DeviceID,vPEID分配内存。

对于level1表项,当Valid=0时:

(1)如果Type域指定一个有效表类型而不是一个Collection表,ITS丢弃对level2表的任何写;

(2)如果Type域指定Collection表,ICID大于或等于GITS_TYPER.HCC指定的数目,ITS丢弃level2表的任何写;

        Level2表的格式由实现定义。

下列情况会导致行为不可预测:

(1)用于level2表的内存在ITS分配时不包含0;

(2)多个level1表项Valid=1并指向相同的level2表;

        NOTE: 作为下电事件保存ITS状态的一部分,描述表的寄存器可以指向ITS之前populate到的表,因此可能包含非0的数值。ITS的电源管理细节由实现定义的。

        图5-4描述了这些表是如何在转换过程中被使用的。

如果下列任一条件为真时,当GITS_CTLR.Enabled从0写到1时,行为不可预测:

  1. GITS_CBASER.Valid=0;
  2. GITS_CBAER<n>.Valid=0,对于任何GITS_BASER<n>寄存器其中Type域表明设备;
  3. GITS_BASER<n>.Valid=0,对于任何GITS_BASER<n>寄存器其中Type域表明Collection和GITS_TYPER.HCC=0;
  4. 在GICv4中,GITS_BASER<n>.Valid=0,对于任何GITS_BASER<n>寄存器其中Type域表明一个vPE;

软件访问私有ITS表

如果GITS_BASER<n>.Indirect=0时,当ITS表所使用的内存不是全0时,行为不可预测。

如果GITS_BASER<n>.Indirect=1时,当level2表所使用内存不全为0时,行为不可预测。

当GITS_CTLR.Enabled=0且GITS_CTLR.Quiescent=0时:

(1)实现不会访问任一GITS_BASER<n>寄存器指定的表。

当GITS_CTLR.Enabled=1且GITS_CTLR.Quiescent=0时:

(2)实现不会访问任一GITS_BASER<n>寄存器指定的表,其中GITS_BASER<n>.Valid=0;

(3)对于GITS_BASER<n>寄存器(其中GITS_BASER<n>.Valid=1且GITS_BASER<n>.Indirect=0)指定的表,如果软件写表,行为不可预测;

(4)对于GITS_BASER<n>寄存器(其中GITS_BASER<n>.Valid=1且GITS_BASER<n>.Indirect=1)指定的表:

- 如果软件写任一level2表项,行为不可预测;

- 当valid位被清0时,ITS不会缓存level1表任一表项。

- 如果被软件写valid位为1的任一level1表项,行为不可预测;

- 写level1表项,将valid位从0到1时,这个写在软件增加命令到ITS命令队列之前必须全局可见。否则如果命令成功或命令被忽略,行为不可知。

2.2 中断collection

        在GICv4中,ITS考虑所有产生的物理LPI作为collection的成员。与collection相关的数据可以被保持在ITS中或外部内存中,或保持在两者中。如果GITS_BASER<n>.Type=0b100时,ITS支持保持在内存中的collection:

(1)当ITS支持保持在内存中的collection时,支持的collection整个大小由软件分配的内存决定:

- 如果GITS_BASER<n>.Indirect=0时,内存中支持的collection数目可以使用下列公式计算:

pages的数目*page size /entry size

这个公式的相关值由GITS_BASER<n>.Size、GITS_BASER<n>.PageSize、GITS_BASER<n>.EntrySize指定。

- 如果GITS_BASER<n>.Indirect=1时,内存中支持的collection数目可以使用下列公式计算:

((Level1的page的数目 * page size)/8)/(page size/entry size)

这个公式的相关值由GITS_BASER<n>.Size、GITS_BASER<n>.PageSize、GITS_BASER<n>.EntrySize指定。

NOTE:Indirect表允许sparse collection,因此并不是所有ICID都能被使用。

(3)当collection被保持在ITS和外部内存中时,collection的数目由GITS_TYPER.CCT指定。

当GITS_TYPER.HCC!=0时:

(1)标号为{0...GITS_TYPER.HCC-1}的collection保持在ITS中;

(2)标号超过GITS_TYPER.HCC的collection保持在外部内存中;

当GITS_TYPE.HCC==0时:

(1)ITS必须支持collection在外部内存中,所有collection都保持在外部内存中;

collection支持的最大数目由ICID的数目限制:

(1)如果GITS_TYPER.CIL=0时,ICID为16位;

(2)如果GITS_TYPER.CIL=1时,ICID位由GITS_TYPER.CIDbits报告;

2.3 Device Table

        Device Table提供设备表项DTE的表。每个DTE描述了DeviceID和ITT基地址的映射,ITT基地址指向存储EventID的转换的内存。ITS使用ITT来存储指定的DeviceID的每个EventID的转换。DeviceID为赋予给每个设备的唯一ID,每个设备会创建一组EventID。比如,Arm期望PCIe RC的16位RID提供给ITS作为DeviceID。

        DeviceID位表提供索引值。

Table 5-2显示了赋予给每个DTE的位数。

位数

Assignment

备注

1

Valid

BOOL值

40

ITT地址

基物理地址

5

ITT范围

Log2 (ITT支持的EventID)

猜你喜欢

转载自blog.csdn.net/flyingnosky/article/details/124285099
GIC