由于本人英文不好,看英文文档难度较大,所以借助一些工具将文档翻译出来,也可以给同样英文不好的小伙伴一起看,英文好的可以直接去读原文。RISC-V Advanced Core Local Interruptor Specification 官方文档地址
1. 介绍
这份 RISC-V ACLINT 规范定义了一组内存映射设备,为多 HART 的 RISC-V 平台上的每个 HART 提供处理器间中断 (IPI) 和定时器功能。这些 HART 级别的 IPI 和定时器功能是操作系统、引导加载程序和在多 HART RISC-V 平台上运行的固件所必需的。
SiFive Core-Local Interruptor(CLINT)设备已被广泛采用在RISC-V领域提供机器级IPI和定时器功能。不幸的是,SiFive CLINT具有统一的寄存器映射用于IPI和定时器功能,并且它不提供监管者级别的IPI功能。
RISC-V ACLINT规范采用更加模块化的方法,通过为IPI和定时器功能定义独立的内存映射设备。这种模块化使得RISC-V平台可以在具有备用机制时省略一些RISC-V ACLINT设备。除了模块化之外,RISC-V ACLINT规范还为监管者级别的IPI定义了专用的内存映射设备。下表1显示了RISC-V ACLINT规范定义的设备列表。
表格1. ACLINT设备
Name | Privilege | LevelFunctionality |
---|---|---|
MTIMER | Machine | Fixed-frequency counter and timer events 固定频率计数器和定时器事件 |
MSWI | Machine | Inter-processor (or software) interrupts 处理器间(或软件)中断 |
SSWI | Supervisor | Inter-processor (or software) interrupts 处理器间(或软件)中断 |
1.1 与SiFive CLINT向后兼容
RISC-V ACLINT规范被定义为与SiFive CLINT规范向后兼容。MTIMER和MSWI设备的寄存器定义和寄存器偏移与SiFive CLINT规范定义的定时器和IPI寄存器兼容。在RISC-V平台上,SiFive CLINT设备可以被逻辑地看作是在内存地址空间中紧邻放置的一个MSWI设备和一个MTIMER设备,如下表2所示。
表格2. 一个SiFive CLINT设备等效于两个ACLINT设备
SiFive CLINT Offset Range | ACLINT Device | Functionality |
---|---|---|
0x0000_0000 - 0x0000_3fff | MSWI | Machine-level inter-processor (or software) interrupts 机器级处理器间(或软件)中断 |
0x0000_4000 - 0x0000_bfff | MTIMER | Machine-level fixed-frequency counter and timer events 机器级固定频率计数器和定时器事件 |
2. 机器级定时器设备(MTIMER)
MTIMER设备为RISC-V平台上的一组HART提供机器级定时器功能。每个连接到MTIMER设备的HART都有一个固定频率的单调时间计数器(MTIME)寄存器和一个时间比较寄存器(MTIMECMP)。未连接到任何HART的MTIMER设备应只有一个MTIME寄存器,而没有MTIMECMP寄存器。
在具有多个MTIMER设备的RISC-V平台上:
- 每个MTIMER设备为不同的(或不相交的)一组HART提供机器级定时器功能。一个MTIMER设备为与其关联的每个HART分配一个从零开始的HART索引。MTIMER设备分配给HART的HART索引可能与RISC-V Privileged Architecture为HART分配的唯一HART标识符(hart ID)有关,也可能没有。
- 两个或更多的MTIMER设备可以共享同一个物理的MTIME寄存器,同时拥有各自独立的MTIMECMP寄存器。
- MTIMER设备的MTIMECMP寄存器只能与同一MTIMER设备的MTIME寄存器进行比较,以生成机器级定时器中断。
单个MTIMER设备支持的最大HART数是4095,与最大MTIMECMP寄存器数相等。
2.1 寄存器映射
一个MTIMER设备有两个独立的基地址:一个用于MTIME寄存器,另一个用于MTIMECMP寄存器。一个单独的MTIMER设备的这两个独立基地址允许多个MTIMER设备共享同一个物理的MTIME寄存器。
下表3显示了MTIME寄存器的映射,而下表4显示了相对于独立基地址的MTIMECMP寄存器的映射。
Table 3. ACLINT MTIMER Time Register Map
Offset | Width | Attr | Name | Description |
---|---|---|---|---|
0x0000_0000 | 8B | RW | MTIME | Machine-level time counter |
表4. ACLINT MTIMER比较寄存器映射
Offset | Width | Attr | Name | Description |
---|---|---|---|---|
0x0000_0000 | 8B | RW | MTIMECMP0 | HART index 0 machine-level time compare |
0x0000_0008 | 8B | RW | MTIMECMP1 | HART index 1 machine-level time compare |
… | … | … | … | … |
0x0000_7FF0 | 8B | RW | MTIMECMP4094 | HART index 4094 machine-level time compare |
2.2. MTIME 寄存器 (偏移量: 0x00000000)
MTIME寄存器是一个64位的读写寄存器,包含基于固定参考频率计数的周期数。
在MTIMER设备复位时,MTIME寄存器会被清零。
2.3. MTIMECMP寄存器(偏移量: 0x00000000 - 0x00007FF0)
MTIMECMP寄存器是每个HART对应的64位读写寄存器。它包含触发相应HART的机器级定时器中断时的MTIME寄存器值。
当MTIME大于或等于相应的MTIMECMP寄存器中的值时,相应HART的机器级定时器中断处于挂起状态;当MTIME小于相应MTIMECMP寄存器中的值时,相应HART的机器级定时器中断被清除。机器级定时器中断反映在mip CSR的MTIP位上。
在MTIMER设备复位时,MTIMECMP寄存器处于未知状态。
2.4. 多个MTIME寄存器的同步
一个RISC-V平台可以将多个HART分组成层次拓扑组(如集群、节点或插槽),每个拓扑组都有自己的MTIMER设备。此外,这种RISC-V平台还可以在运行时允许对拓扑组(包括MTIMER设备)进行时钟门控或断电。
在一个包含多个位于同一芯片上的MTIMER设备的RISC-V平台上,每个设备必须满足RISC-V架构要求,即所有MTIME寄存器相互之间,以及所有每HART的时间CSR寄存器相互之间都必须在一个MTIME滴答周期内同步。例如,如果MTIME滴答周期是10纳秒,那么MTIME寄存器及其相关的时间CSR寄存器应分别在10纳秒内同步。
在一个包含多个位于不同芯片上的MTIMER设备的RISC-V平台上,不同芯片上的MTIME寄存器(及其相关的时间CSR寄存器)可以在一个比MTIME滴答周期更大的指定间隔内同步。平台可以定义一个最大允许间隔。
为了满足上述MTIME同步要求:
- 所有MTIME寄存器应使用相同的输入时钟,以避免各个MTIME寄存器(及其相关的时间CSR寄存器)在运行时出现漂移。
- 在系统复位时,硬件必须初始化并将所有MTIME寄存器同步为零。
- 当MTIMER设备由于例如电源管理操作而停止并重新启动时,软件应重新将此MTIME寄存器与所有其他MTIME寄存器同步。
当软件更新一个、多个或所有MTIME寄存器时,必须保持先前的同步要求(通过测量并考虑对不同的MTIME寄存器进行读取或写入的延迟差异)。
例如,下面的RISC-V 64位汇编序列可以被软件用来将一个MTIME寄存器与另一个MTIME寄存器进行同步。
清单1. 在RISC-V 64位平台上同步MTIME寄存器
/*
* unsigned long aclint_mtime_sync(unsigned long target_mtime_address,
* unsigned long reference_mtime_address)
* 无符号长整型的 aclint_mtime_sync 函数接受两个参数:目标 MTIME 寄存器地址和参考 MTIME 寄存器地址。
*/
.globl aclint_mtime_sync
aclint_mtime_sync:
/* 读取目标MTIME寄存器到T0寄存器 */
ld t0, (a0)
fence i, i
/* 读取参考MTIME寄存器到T1寄存器 */
ld t1, (a1)
fence i, i
/* 读取目标MTIME寄存器到T2寄存器 */
ld t2, (a0)
fence i, i
/*
* 计算目标MTIME的调整值并存储到T3寄存器
* T3 = T1 - ((T0 + T2) / 2)
*/
srli t0, t0, 1
srli t2, t2, 1
add t3, t0, t2
sub t3, t1, t3
/* 更新目标MTIME寄存器 */
ld t4, (a0)
add t4, t4, t3
sd t4, (a0)
/* 返回MTIME调整值 */
add a0, t3, zero
ret
注意:在某些RISC-V平台上,MTIME同步序列(即上面的aclint_mtime_sync()函数)可能需要重复几次,直到目标MTIME寄存器和参考MTIME寄存器之间的差值为零(或非常接近零)。
3. 机器级软件中断设备(MSWI)
MSWI设备为RISC-V平台上一组HARTs提供机器级IPI功能。它对接到MSWI设备的每个HART都有一个IPI寄存器(MSIP)。
在具有多个MSWI设备的RISC-V平台上,每个MSWI设备为不同(或不相交)的一组HARTs提供机器级IPI功能。MSWI设备为与其相关联的每个HART分配从零开始的HART索引。MSWI设备分配给HART的HART索引可能与RISC-V特权架构为HART分配的唯一HART标识符(hart ID)有关,也可能没有关系。
单个MSWI设备支持的最大HART数量为4095,与最大MSIP寄存器数量相同。
3.1. 寄存器映射
表5. ACLINT MSWI设备寄存器映射
Offset | Width | Attr | Name | Description | ||
---|---|---|---|---|---|---|
0x0000_0000 | 4B | RW | MSIP0 | HART index 0 machine-level IPI register | ||
0x0000_0004 | 4B | RW | MSIP1 | HART index 1 machine-level IPI register | ||
… | … | … | … | … | … | … |
0x0000_3FFC | 4B | RESERVED | Reserved for future use. |
3.2. MSIP寄存器(偏移量:0x00000000 - 0x00003FF8)
每个MSIP寄存器是一个32位宽的WARL寄存器,其中高31位连接至零。最低有效位反映在mip CSR的MSIP中。对应的MSIP寄存器分别写入1或0,可以挂起或清除HART的机器级软件中断。
在MSWI设备复位时,每个MSIP寄存器被清零。
4. Supervisor级别软件中断设备(SSWI)
SSWI设备为RISC-V平台上一组HARTs提供Supervisor级别的IPI功能。它为连接到SSWI设备的每个HART提供了一个用于设置IPI的寄存器(SETSSIP)。
在具有多个SSWI设备的RISC-V平台上,每个SSWI设备为不同(或不相交)的一组HARTs提供Supervisor级别的IPI功能。SSWI设备为与其相关联的每个HART分配从零开始的HART索引。SSWI设备分配给HART的HART索引可能与RISC-V特权架构为HART分配的唯一HART标识符(hart ID)有关,也可能没有关系。
单个SSWI设备支持的最大HART数量为4095,与最大SETSSIP寄存器数量相同。
4.1. 寄存器映射
表6. ACLINT SSWI设备寄存器映射
Offset | Width | Attr | Name | Description |
---|---|---|---|---|
0x0000_0000 | 4B | RW | SETSSIP0 | HART index 0 set supervisor-level IPI register |
0x0000_0004 | 4B | RW | SETSSIP1 | HART index 1 set supervisor-level IPI register |
… | … | … | … | … |
0x0000_3FFC | 4B | RESERVED | Reserved for future use. |
4.2. SETSSIP寄存器(偏移量:0x00000000 - 0x00003FF8)
每个SETSSIP寄存器是一个32位宽的WARL寄存器,其中高31位连接至零。SETSSIP寄存器的最低有效位始终为0。向SETSSIP寄存器的最低有效位写入0没有效果,而向其写入1则会向相应的HART发送边沿敏感的中断信号,导致该HART在mip CSR中设置SSIP。对SETSSIP寄存器的写入保证会反映在相应HART的SSIP上,但不一定是立即反映。
注意:RISC-V特权架构将mip和sip CSR中的SSIP定义为可写位,因此M模式或S模式软件可以直接清除SSIP。