GIC spec之ITS和LPI中断5

3 ITS命令

        Table 5-6提供了所有ITS命令的集合。

命令

命令参数

描述

CLEAR

DeviceID, EventID

将EventID和DeviceID定义的event转化为ICID和pINTID,并发送到合适的Redistributor移除pending状态

DISCARD

DeviceID, EventID

将EventID和DeviceID定义的event转化为ICID和pINTID,并发送到合适的Redistributor移除pending状态。它也保证与特定的EventID相关的Redistributor的任何缓存与内存中配置保持一致。DISCARD移除了ITT中DeviceID和EventID的映射,保证特定EventID的请求被丢弃。

INT

DeviceID, EventID

将EventID和DeviceID定义的event转化为ICID和pINTID,并发送到合适的Redistributor设置pending状态

INV

DeviceID, EventID

指定ITS必须保证与特定EventID相关的Redistributor的任何缓存与内存中LPI配置表保持一致

INVALL

ICID

指定ITS必须保证由ICID定义的中断collection的任何缓存与所有Redistributor内存中LPI配置表保持一致

INVDB

仅GICv4.1

vPEID

仅GICv4.1。指定ITS必须保证vPEID的默认doorbell相关的任何缓存与所有Redistributor内存中LPI配置表保持一致

MAPC

ICID, RDbase

将ICID定义的collection表映射到RDbase定义的Redistributor

MAPD

DeviceID,ITT_addr,Size

将DeviceID相关的设备表项映射到由ITT_addr和Size定义的ITT

MAPI

DeviceID,EventID, ICID

将EventID和DeviceID定义的event映射到ICID和pINTID=EventID的ITT项

MAPTI

DeviceID,EventID, pINTID, ICID

将EventID和DeviceID定义的event映射到它相关的ITE,ITE由DeviceID相关的ITT中ICID和pINTID定义

MOVALL

RDbase1, RDbase2

让RDbase1指定的Redistributor上所有的中断移到RDbase2指定的Redistributor上

MOVI

DeviceID,EventID, ICID

更新DeviceID和EventID定义的event的ITT表项的ICID域。它也将DeviceID和EventID定义的event转化为ICID和pINTID,并在合适的Redistributor移除pending状态,如果它被设置,将中断移到新的ICID定义的Redistributor,并使用新的ICID更新event相关的ITE

SYNC

RDbase

保证RDbase指定的Redistributor的物理中断相关的所有未完成ITS操作在执行任何更多ITS命令之前全局可见。跟随SYNC的执行,所有之前命令必须应用于后续写入GITS_TRANSLATE。

VINVALL

vPEID

保证与vPEID相关的任何缓存的Redistributor信息与内存中相关的LPI配置表保持一致

VMAPI

DeviceID, EventID,Dbell_pINTID,

vPEID

将由DeviceID和EventID定义的event映射到ITT表项,该表项vPEID, vINTID=EventID, Dbell_pINTID,一个doorbell

VMAPP

GICv4.0

vPEID,RDbase,VPT_addr,

VPT_size

将vPEID定义的vPE表项映射到目标RDbase,包括相关的虚拟LPI pending表(VPT_addr, VPT_size)

VMAPP

GICv4.1

vPEID,RDbase, VCONF_addr,VPT_addr,

VPT_size, PTZ, Alloc,

Default_Doorbell_pINTID

映射vPEID定义的vPE,包括相关的虚拟LPI配置和pending表。可选的指定默认doorbell。

VMAPTI

DeviceID, EventID, vINTID, Dbell_pINTID,vPEID

使用vPEID,vINTID,Dbell_pINTID和doorbell将DeviceID和EventID定义的event映射到ITT表项

VMOVI

DeviceID, EventID, vPEID

为DeviceID和EventID定义的event更新ITT表项的vPEID域。将DeviceID和EventID定义的event转化为vPEID和pINTID,让合适的Redistributor移除pending状态,如果有设置,将中断发送到新vPEID定义的Redistributor,使用新的vPEID更新event相关的ITE

VMOVP

GICv4.0

vPEID, RDbase, SequenceNumber, ITSList

更新vPEID定义的vPE表项到由RDbase定义的目标Redistributor。软件必须使用SequenceNumber和ITSList在超过一个ITS的情况下同步VMOVP命令的执行

VMOVP

GICv4.1

vPEID, RDbase, SequenceNumber, ITSList, Default_Doorbell_pINTID

将vPEID定义的vPE映射更新到RDbase定义的目标Redistributor

VSGI

仅GICv4.1

vPEID, Priority, G, C, E, vPEID

仅GICv4.1。对于vPEID定义的vPE,设置配置或更新由vINTID定义的中断状态

VSYNC

vPEID

保证在任何更多ITS命令被执行之前所有未完成的ITS操作被全局可见。VSYNC接下来的执行,所有之前的命令必须应用到后续写GITS_TRANSLATER。

        实现支持的EventID和DeviceID的位数由GITS_TYPER.Unimplemented位发现。

NOTE:

(1)LPI的INTID的范围为8192-最大数目。最大数目是由实现定义的。

(2)以下参数名从GIC spec最初使用的信息进行修改:

- Device被修改为DeviceID;

- ID被修改为EventID;

- pID被修改为pINTID;

- vID被修改为vINTID;

- pCID被修改为ICID;

- 目标地址被修改为RDbase;

- vCPU被修改为vPE

(3)collection目标地址,RDbase的格式由GITS_TYPER.PTA指定。

3.1 在ITS命令参数中实现定义的大小

        一些ITS命令包括下列参数类型是由实现定义的大小。

DeviceID: 相关设备表支持的最大数目的DeviceID由GITS_TYPER.Devbits指定的位数决定。

EventID: 它由最大MAPD大小域决定,由GITS_TYPER.ID_bits限制。

ICID:支持的collection的数目由实现定义。

(1)在外部内存不支持collection表的实现中,GITS_TYPER.HCC指定collection的数目;

(2)在外部内存支持collection表的实现中,支持的collection的数目由分配collection表的大小决定:

- 支持的collection数目可通过如下计算:

GITS_TYPER.HCC + collection表大小/Entry大小

当GITS_TYPER.CIL=1时,collection的最大数目由GITS_TYPER.CIDbits。

pINTID: pINTID由GICR_PROPBASER.IDbits指定,它由GICD_TYPER.IDbits。这也应用于Dbell_pINTID。

RDbase: RDbase与Redistributor相关并被指定由两种格式中的一个:

(1)当GITS_TYPER.PTA=1时RDbase的基本物理地址;

(2)当GITS_TYPER.PTA=0时由GICR_TYPER.Processor_Number指定的PE数目。

vINTID: 它由GICR_VPROPBASER.IDbits限制,这也由GICD_TYPER.IDbits决定。

vPEID:由vPE表的大小决定。

3.2 命令错误

        如果ITS在提供给命令的数据中检测到错误时,由此产生的行为是无法预测的选择,如下:

(1)忽略命令

- 不会有其他行为修改中断的处理;

- GITS_CREADR增加指向下一个命令,如果有必要会wrap;

- 如果GITS_TYPER.SEIS被设置为1时,产生系统错误;

NOTE: 由实现决定系统错误是如何被记录和如何报告给PE。

(2)Stall ITS命令队列

- GITS_CREADR不会增加,并继续指向触发错误的条目;

- GITS_CREADR.Stalled被设置为1;

- 通过对GITS_CWRITER.Retry写1软件可以重新处理命令;

- 如果GITS_TYPER.SEIS被设置为1时,产生系统错误。

NOTE: 由实现决定系统错误是如何被记录和如何报告给PE。

(3)将数据当作有效数据

- 产生错误的数据被当作合法的值,并且该命令被处理;

- GITS_CREADR增加并指向下一个命令,如果必要会wrap;

- 如果GITS_TYPER.SEIS被设置为1,产生系统错误。

NOTE: 由实现决定系统错误是如何被记录和如何报告给PE。

3.3 CLEAR

        命令将EventID和DeviceID定义的event转化为ICID和pINTID,并在合适的Redistributor上移除pending状态。

        图5-6显示了CLEAR命令的格式。

在上图中:

  1. EventID指明了与设备相关的中断,它的pending状态被清除;
  2. DeviceID指定了请求的设备;
  3. DW为32byte双字偏移,或4个双字。

命令和它的参数如下:

CLEAR DeviceID, EventID

如果下列任一发生,命令错误产生:

  1. DeviceID超过ITS支持的最大值;
  2. DeviceID指定的设备没有通过MAPD映射到中断转换表ITT;
  3. EventID超过ITT允许的最大值。当MAPD命令发出时该值由Size域指定。
  4. 设备的EventID没有映射到一个collection,通过MAPI或MAPTI。
  5. 设备的EventID被映射到一个collection,但它没有使用MAPC映射到RDbase。

在这种情况下,ITS必须采用前面描述的行为。

下列伪代码描述了CLEAR命令的操作:

ITS.CLEAR(ITSCommand cmd)
    if DeviceOutOfRange(cmd.DeviceID) then
    UNPREDICTABLE;

    dte = ReadDeviceTable(UInt(cmd.DeviceID))

    if !dte.Valid then
        if GITS_TYPER.SEIS == '1' then IMPLEMENTATION_DEFINED "SError CLEAR_UNMAPPED_DEVICE";
        UNPREDICTABLE;

    if IdOutOfRange(cmd.EventID,dte.ITT_size) then
        if GITS_TYPER.SEIS == '1' then IMPLEMENTATION_DEFINED "SError CLEAR_ID_OOR";
        UNPREDICTABLE;

    InterruptTableEntry ite = ReadTranslationTable(dte.ITT_base, UInt(cmd.EventID));

    if !ite.Valid then
        if GITS_TYPER.SEIS == '1' then IMPLEMENTATION_DEFINED "SError CLEAR_UNMAPPED_INTERRUPT";
        UNPREDICTABLE;

    success = ClearPendingState(ite);

    if !success then
        if GITS_TYPER.SEIS == '1' then IMPLEMENTATION_DEFINED "SError CLEAR_ITE_INVALID";
        UNPREDICTABLE;

    IncrementReadPointer();
    return;

猜你喜欢

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