1. 将新命令添加到命令队列中
为了将新命令添加到命令队列中,软甲需要:
(1)写新命令到队列
GITS_CWRITER指向命令队列中不包含有效命令的entry。软件必须将命令写入该entry,同时要保证此命令全局可见。
(2)更新GITS_CWRITER
软件必须更新GITS_CWRITER指向命令队列中不包含有效命令的entry。更新GITS_CWRITER通知ITS添加了新的entry。
软件可以一次多个命令到命令队列,需要提供在命令队列中足够的空闲空间,然后在更新GITS_CWRITER。
(3)等待命令被ITS读
软件需要通过轮询GITS_CREADER判断是否命令已被读。当GITS_CWRITER.offset = GITS_CREADER.offset,ITS将读取所有的命令。
同样的,INT命令可以产生中断来通知ITS已经读取了一组命令。
ITS从命令队列里顺序读取命令。但这些命令发到Redistributor可能以无序的方式被看见。SYNC命令可以保证之前发送的命令可见。
NOTE: 当GITS_CWRITER指向GITS_CREADER命令的下一个,命令队列为满。软件必须在尝试添加新的命令前必须判断在队列中是否有足够的空间。
2. 将中断映射到Redistributor
(1)将DeviceID映射到转换表
每个外设可以发送中断发送到包含外设DeviceID的ITS。每个DeviceID要求ITT中断转换表来保持自己EventID到INTID的映射。软件必须为ITT分配内存,然后使用MAPD命令来映射DeviceID到ITT。
MAPD <DeviceID>,<ITT_Address>,<Size>
(2)映射INTID到collection,collection映射到Redistributor
当外设的DeviceID已经映射到一个ITT时,不同的EventID必须映射到INTID,INTID必须映射到collection。每个collection映射到目的Redistributor。
通过MAPTI和MAPI命令将INTID命令映射到collection。当EvevntID和INTID相同时使用MAPI命令:
MAPI <DeviceID>,<EventID>,<Collection ID>
当EventID和INTID不同时,使用MAPTI命令:
MAPTI <DeviceID>,<EventID>,<INTID>,<Collection ID>
使用MAPC命令collection被映射到Redistributor:
MAPC <Collection ID>,<Target Redistributor>
目标Redistributor的识别依赖于GITS_TYPER.PTA:
GITS_TYPER.PTA=0: 由ID表明Redistributor,可用从GICR_TYPER.Processor_Number.
GITS_TYPER.PTA=1: 由物理地址表明Redistributor。
(3)例子
一个定时器的DeviceID为5,使用2bit EventID。我们希望Event0映射到INTID 8725。定时器分配的ITT在地址0X84500000。
我们决定使用collection 3并将中断传递给在物理地址0X78400000的Redistributor。
需要执行的命令如下:
MAPD 5, 0x84500000, 2 #将DeviceID 5映射到ITT
MAPTI 5, 0, 8725, 3 #将EventID0映射到INTID 8725和collection 3
MAPC 3, 0x78400000 #将collection 3映射到在地址为0x78400000的Redistributor
NOTE: 这个例子认为之前映射没有建立,GITS_TYPER.PTA=1。
3. 在不同Redistributor间迁移中断
不止一种方法来将中断从一个Redistributor迁移到其他Redistributor上。
(1)重映射collection
软件可通过重映射整个collection来将从一个Redistributor的所有的中断迁移另一个Redistributor上。典型的当连接到Redistributor上的PE下电时会做此操作,中断需要迁移到另一个Redistributor。需要使用如下命令:
MAPC <Collection ID>, <RADDR2> #将collection映射到新的Redistributor
SYNC <RADDR2> #保证映射可见
MOVALL <RADDR1>, <RADDR2> #将pending状态迁移到新的Redistributor
SYNC <RADDR1> #保证迁移可见
在这个命令时序中RADDR1为之前目标Redistributor,RADDR2为新目标Redistributor。
若由多个collection指向RADDR1,需要多个MAPC命令,每个collecttion一个命令。这个时序假设所有被重映射的collection都是映射到相同的目标Redistributor。
(2)将中断映射到不同的collection
一个的中断可以重映射到不同的collection。可通过如下命令时序来完成:
MOVI <DeviceID>, <EventID>, <ID of new Collection>
SYNC <RADDR1>
在上述命令时序中RADDR1为原中断的collection目标的Redistributor。
4. 移除中断映射
为了重映射或移除中断的映射,软件需要:
(1)禁用当前中断的物理INTID。在LPI的配置表中执行。
(2)发送DISCARD命令,移除中断的映射并清除已映射INTID的pending状态。
(3)发送SYNC命令,等待命令完成。
在命令完成后,不在会有中断传递到之前中断映射到的Redistributor上。
5. 重映射或移除设备的映射
为修改或移除设备的映射,软件需要:
(1)根据上一节的步骤,对外设的每个EventID;
(2)发送MAPD命令重映射设备。同样的,在MAPD中有效位清为0来移除映射;
(3)发送SYNC命令并等待命令完成。