GIC spec之ITS和LPI中断4

2.4 中断转换表

        中断转换表ITT指定每个设备可以创建一定数量的event。ITT中的每个表项为ITE。

        在GICv3中,ITE仅被物理中断定义。

        在GICv4中,ITE被物理中断和虚拟中断定义,并提供如下区分:

(1)物理LPI的entry和使用ICT作为路由信息;

(2)虚拟LPI的entry和使用vPE表;

    ITT必须赋予起始ITT地址的连续物理地址空间。大小为2^(DTE.ITT range + 1) * GITS_TYPER.ITT_entry_size。

        如果内存在开始分配时不全为0时,行为不可预测。

        如果多个ITT在内存中重叠,行为不可预测。

        ITS访问ITT使用相同的Shareability和Cacheability属性来指定给Device Table。

        对于物理中断,每个ITE描述输入EventID和下列项的映射:

(1)被发送到目的PE的输出物理INTID(pINTID);

(2)ICID区分Collection表中的项,这决定了LPI的目标PE。为获取更多信息,可以查看Collection table。

        对于虚拟中断,每个ITE描述了EventID和下列项的映射:

(1)被发送到目的PE的输出虚拟INTID(vINTID);

(2)虚拟PE标号(vPEID)区分vPE表中的表项来决定当前host Redistributor。为获取更多信息,查看vPE表;

(3)当目标vPE当前没有被调度到物理PE上,如果虚拟中断被转换,物理LPI被发送到物理PE;

        EventID提供了表的索引值。

Table 5-3 显示了可以被保存在ITE的位数。

位数

Assignment

备注

1

Valid

BOOL型

1

Interrupt_Type

BOOL型,表明中断为物理还是虚拟中断

LPI数字空间的大小

Interrupt_Number

依赖于中断类型的pINTID或vINTID

Interrupt_Number_HypervisorID

在GICv4中pINTID被当doorbell使用。在GICv3中和不要求doorbell的GICv4中,可编程值为1023

16

ICID

中断collection ID,仅物理中断

16

vPEID

vPE,仅虚拟中断

2.5 collection表

        Collection表CT提供了collection表项的表。仅对于物理LPI,每个CTE描述了下列两者之间的映射:

(1)ITT产生ICID;

(2)以GITS_TYPER.PTA定义的格式的目标Redistributor的地址;

        对于每个ITS存在单独的CT,它可以保持在寄存器中或内存中,或同时存在两者中。查看GITS_BASER<n>.Type和GITS_TYPER.HCC获取更多信息。

        TableID提供表的索引值。它源自于ICID。

        Table 5-4给出位数可能被赋予给每个CT的例子。

位数

Assignment

备注

1

Valid

BOOL型

RDbase identifier大小

RDbase

GIC支持两种格式RDbase

2.6 vPE表

        vPE表由vPE表项组成,vPE表项提供了ITS产生vPEID映射到:

(1)目标Redistributor,以GITS_TYPER.PTA定义的格式;

(2)与目标vPE相关的虚拟LPI Pending表的基地址;

        GITS_BASER<n>定义的内存区域保持vPE表并指定了表中的每个项大小。

        vPE表描述与ITS相关的所有vPE。Table5-5 描述了在vPE表实现位数。

        16bit vPEID提供了表的索引值。

位数

Assignment

备注

1

Valid

BOOL型

RDbase identifier大小

RDbase

GIC支持RDbase的两种格式

地址的大小

VPT_addr

当VM不驻留在Redistributor中时,VPT_addr找到LPI pending表的位置。当vPE在与RDbases相关的GICR_*寄存器中被调度时它被用来在GICR_VPENDBASER作为地址

5

Size

支持的vINTID范围大小

2.7 ITS的控制和配置

        ITS通过内存映射接口被控制和配置:

  1. 可以从GITS_IIDR和GITS_PIDR2中读取版本;
  2. GITS_TYPER指定ITS支持的特性;
  3. GITS_CTLR控制ITS的操作;
  4. GITS_TRANSLATER接受EventID信息。由实现定义DeviceID是如何提供的。
  5. GITS_BASER<n>寄存器提供架构相应的ITS内存结构体的类型,大小和访问属性;
  6. GITS_CBASER,GITS_CREADR,和GITS_CWRITER保存ITS命令队列接口的地址信息;

        每个ITS有一个使能位GITS_CTLR.Enabled。

2.8 ITS命令接口

图5-5 描述了ITS如何提供ITS命令队列使用的基地址和大小。

GITS_CBASER,GITS_CREADR,和GITS_CWRITER定义ITS命令队列。

(1)GITS_CBASER使用下列域:

- Valid。该域表明了ITS命令队列分配的内存。

- Cacheability。该域表明了ITS命令队列的访问cacheability属性。

- Shareability。该域表明了ITS命令队列的访问shareability属性。

- Physical address。该域表明包含ITS命令队列的内存的物理基地址。

- Size。该域表明了ITS命令队列的4KB物理内存页的数目。

(2)GITS_CREADR指定了ITS读取下一个命令的基地址偏移;

(3)GITS_CWRITER指定了软件写下一个命令free entry的基地址偏移。

一个ITS命令队列项的大小为32byte。这意味着在每个4KB页支持128个项。

ITS命令队列使用小端内存模型。

在ITS命令队列:

  1. 基地址通常对齐于64KB;
  2. Size为4KB的整数倍;
  3. 队列的地址对齐于4KB,为(base address + (size * 4KB));

NOTE: 所有地址为非安全物理地址。

当第一个命令完成时,ITS开始处理下一个命令。读指针GITS_CREADR随着ITS处理命令的前进。如果GITS_CREADR达到GITS_CBASER指定的内存顶端,指针wrap回到GITS_CBASER指定的基地址。GITS_CWRITER由软件控制。

当GITS_CWRITER和GITS_CREADR指定相同的基地址偏移值时,ITS命令队列为空。

当GITS_CWRITER指向GITS_CREADR后的一个32byte时,ITS命令队列为满。

当GITS_CREADR.Stalled=1时,没有后续命令被处理。

INT ITS命令在执行时产生中断,这会在命令的一个特定的时序完成时产生一个中断。

2.9 转换的顺序及输出到ITS命令

        每个命令队列entry自动被执行,因此一个转换请求或在一个命令之前看到ITS的状态或在这个命令之后看到ITS的状态。

        在SYNC或VSYNC命令完成后一个初始化的转换请求使用ITS状态被转换,在命令被执行后ITS状态与该状态保持一致。

        在缺少SYNC或VSYNC命令时,ITS命令和转换请的顺序不是由架构定义的。

2.10 INTID映射规则的限制

        如果软件有下列行为,GIC的行为不可预测:

  1. 将多个EventID-DeviceID连结映射到相同的物理LPI INTID;
  2. 将doorbell中断赋予给相同物理LPI INTID给不同物理PE。这仅应用于GICv4。
  3. 映射EventID-DeviceID,并将一个单独的doorbell中断映射到相同物理LPI INTID,如果他们不是目标到相同物理PE。这应用于GICv4所有的版本。
  4. 将多个EventID-DeviceID映射到相同虚拟LPI INTID-vPEID。这应用于GICv4。
  5. 映射一个EventID-DeviceID,并一个默认doorbell中断到相同的物理LPI INTID。这仅应用于GICv4.1。
  6. 将一个默认doorbell和一个独立的doorbell映射到相同物理LPI INTID。这仅应用于GICv4.1。

        NOTE:概念上限制为软件不能映射多个EventID-DeviceID到给定的虚拟机上的vLPI。但是,ITS没有意识到哪个vPE属于相同的虚拟机。

猜你喜欢

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