由于本人英文不好,看英文文档难度较大,所以借助一些工具将文档翻译出来,也可以给同样英文不好的小伙伴一起看,英文好的可以直接去读原文。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设备

NamePrivilegeLevelFunctionality
MTIMERMachineFixed-frequency counter and timer events
固定频率计数器和定时器事件
MSWIMachineInter-processor (or software) interrupts
处理器间(或软件)中断
SSWISupervisorInter-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 RangeACLINT DeviceFunctionality
0x0000_0000 - 0x0000_3fffMSWIMachine-level inter-processor (or software) interrupts
机器级处理器间(或软件)中断
0x0000_4000 - 0x0000_bfffMTIMERMachine-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

OffsetWidthAttrNameDescription
0x0000_00008BRWMTIMEMachine-level time counter

表4. ACLINT MTIMER比较寄存器映射

OffsetWidthAttrNameDescription
0x0000_00008BRWMTIMECMP0HART index 0 machine-level time compare
0x0000_00088BRWMTIMECMP1HART index 1 machine-level time compare
0x0000_7FF08BRWMTIMECMP4094HART 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设备寄存器映射

OffsetWidthAttrNameDescription
0x0000_00004BRWMSIP0HART index 0 machine-level IPI register
0x0000_00044BRWMSIP1HART index 1 machine-level IPI register
0x0000_3FFC4BRESERVEDReserved 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设备寄存器映射

OffsetWidthAttrNameDescription
0x0000_00004BRWSETSSIP0HART index 0 set supervisor-level IPI register
0x0000_00044BRWSETSSIP1HART index 1 set supervisor-level IPI register
0x0000_3FFC4BRESERVEDReserved 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。