its Table 包含设备表、中断翻译表和集合表。its Table的配置是通过core写ITS Command Queue来配置的,Command Queue存储在内存中。当core将命令写入Command Queue后,通过寄存器通知ITS,ITS从内存中依次读取命令,然后根据命令内容配置对应的ITS Table页表项。
一、硬件结构
Command Queue主要由两部分构成:寄存器和内存。
内存用于存储命令队列;寄存器用于记录命令队列所在的内存基地址,属性和对应的状态。
寄存器主要有三个:
1、GITS_CBASER
该寄存器中存放了CommandQueue的基地址、分配内存的访问属性(cacheable/shareable)、分配内存空间的大小(有多少4KB)
2、GITS_CREADR: 用来记录ITS执行的指令的地址相对于命令队列基地址的偏移
3、GITS_CWRITER: 用来记录软件写入指令的地址相对于命令队列基地址的偏移
内存部分:
系统规划了一段以GITS_CBASER.Physical_Address为基地址的连续4KB*size的空间用于存放its Command Queue,其中每个Entry为32 bytes(与its command一致),its Command Queue的存储结构如下所示:
ITS Command按照写入顺序排列在Command Queue内,ITS按照顺序从Command Queue内读取指令并执行。以GITS_CBASER.Physical_Address为基地址,GITS_CREADR标识ITS执行的指令位置。ITS Command Queue支持一边写入指令,一边执行指令。每当写入一条新指令时,GITS_CWRITER.Offset + 0x20;同理,每当ITS执行一条指令时,GITS_CREADR.Offset +0x20。
二、配置过程
ITS指令以32byte为一个entry,通过对[7:0]的不同编码,标识不同的指令,同时在其他位置上加上对应的参数,即构成一个完整的指令内容。本章以LPI配置流程中相关的MAPD,MAPTI,MAPC为例介绍命令结构和组成,其他指令以及详细介绍参考GICv3 SPEC上ITS Commands部分。
本例中分配地址空间如下所示,下面以此为例讲解各its Table的配置过程
itsCommandQueue : 0x0606_0000
Device Table: 0x0603_0000
Interrupt Translation Table: 0x0605_0000
Collection Table: 0x0604_0000
1、MAPD Command
MAPD指令用于映射DeviceID -> ITT页表,需要配置的参数为DeviceID,ITT_addr,Size,以及Valid使能。MAPD数据结构图如下所示:
DeviceID:标识对应的发起中断请求的device
ITT_addr:标识ITT页表的地址
Size:5bit数值,标识该ITT页表项最多支持多少bit的EventID
Valid:标识ITT_addr和Size是否使能
☆ DeviceID=0,配置device table的过程:
1)core 将mapd command写入itsCommandQueue,此处DeviceID=0,size=0xd,ITT_addr=0x0605_0000,Valid = 1
2)通过gicd master将此笔mapd command数据读出
3)gicd master先对device table发起一笔读操作后,然后将device table entry写入到devicetable
☆ DeviceID=1,配置device table的过程:
1)core将mapd command写入itsCommandQueue,此处DeviceID=1,size=0xd,ITT_addr=0x0605_8000,Valid = 1
2)通过gicd master将此笔mapd command数据读出
3)gicd master先对device table发起一笔读操作后,然后将device table entry写入到devicetable
两个DTE在Device Table中的排布如下:
2、MAPTI Command
MAPTI指令用于配置ITT的页表项,即映射DeviceID和EventID到INTID和ICID。MAPTI结构图如下所示:
DeviceID:标识发起中断请求的device
EventID:标识对应device的哪个中断
pINTID:该中断对应的中断号(从8192开始)
ICID:标识该中断对应的collection信息编号,即代表路由到哪个核
配置interrupt translation table的过程:
1)core 将mapti command写入itsCommandQueue,此处DeviceID=1,EventID=8,pINTID=0x2008,ICID=1
2)通过gicd master将此笔mapti command读出
3)gicd master先对device table发起一笔读操作获取到DeviceID=1对应的ITT Addr,然后将Interrupt Translation Entry写入到pINTID对应的ITT Addr
两组ITT在内存中的排布如下表所示:
3、MAPC Command
MAPC指令用于配置CT的页表项,即映射ICID -> RDbase(标识一个Redistributor)。MAPC结构图如下所示:
ICID:标识对应中断的collect编号
RDbase:标识对应的Redistributor
配置collection table的过程:
- core 将mapc command写入itsCommandQueue,此处ICID=1,RDbase=1,Valid=1
2)通过gicd master将此笔mapc command读出
3)gicd master先对collection table发起一笔读操作,然后将Collection Entry写入到对应的CT Addr
CTE在内存中的排布如下表所示: