中断

目录
    ⇦

    中断

    PCIe 有两种中断模型 :

    • INTx
    • Message Signaled Interrupt (MSI/MSI-X),消息信号中断

    msi

    Message Signaled Interrupts (MSI, 消息信号中断) 是可选的特征,MSI 允许设备的 function 发起一个服务,该服务会发起一起 Memory Write 传输,向系统指定的地址写系统指定的数据。在设置配置期间,系统软件会初始化 message address 和 message data,分配一个或者多个向量给每个兼容 MSI 的 function

    中断延迟(从中断信号发送到中断服务的时间)与系统有关,与当前的中断体系结构一致,消息信号中断不提供中断延迟时间保证。

    MSI-x 为基本 MSI 功能定义了一个单独的可选扩展。与 MSI 相比,MSI-X 扩展了支持的向量数,当分配的向量少于请求时,软件可以控制混淆的能力,以及每个向量使用独立地址和数据值的能力,由驻留在内存空间中的表指定。然而,MSI-X 的大多数其他特性与MSI相同。

    为了软件的向后兼容性,MSI 和 MSI-X 使用独立的能力结构。在同时支持 MSI 和 MSI-X 的功能上,仅支持 MSI 的系统软件无需修改即可启用和使用 MSI。MSI 功能通过 MSI Capability 结构进行专门管理,而 MSI-X 功能通过 MSI-X Capability 结构进行专门管理。允许一个函数同时实现 MSI 和 MSI-X,但禁止系统软件同时启用这两种功能。如果系统软件同时启用这两者,则行为是未定义的。

    所有能够产生中断的 PCI Express 设备 Functions 必须支持 MSI 或 MSI-X 或都支持。MSI 和 MSI-X 机制通过执行内存写事务来提供中断。MSI 和 MSI-X 是边缘触发的中断机制;PCI spec 和 PCIe spec 都不支持电平触发的 MSI/MSI-X 中断。某些 PCI 设备及其驱动程序依赖于 INTx 类型的电平触发中断行为(由PCI Express 遗留的 INTx 机制解决)。为了利用 MSI 或 MSI-X 功能和边缘触发中断语义,这些设备及其驱动程序可能必须重新设计。

    MSI 和 MSI-X 都支持屏蔽任意一个向量(Per-Vector PVM)。PVM 是 MSI 的可选扩展,也是 MSI-X 的标准特性。支持 PVM 扩展的 MSI 功能向后兼容不识别该扩展的系统软件,既如果 MSI 支持 PVM,系统软件不支持也没关系,不会搜到影响。MSI-X 也支持 mask 某个 function,也就是一个 function 中所有向量都 mask。

    实现了 MSI 的传统 EP 需要支持 MSI 结构的 32-bit 或者 64-bit Message 地址。实现了 MSI 的 PCI Express EP 需要支持 MSI 结构中的 64 比特 Message 地址。

    MSI/MSI-X 事务的请求者必须将事务描述符的 No Snoop 和 relax Ordering 属性设置为 0b。如果启用了 IDO 属性的使用,则允许 MSI/MSI-X 事务的请求者设置基于 id 的排序(IDO)属性。与 INTx 仿真消息不同,MSI/MSI-X 事务不限于 TC0 流量类。

    在一个设备内,不同的 Functions 允许实现不同的 MSI/MSI-X /INTx 中断机制,系统软件独立管理每个函数的中断机制。

    MSI Capability 结构

    所有能产生中断的 PCI Express EP 都必须实现 MSI 或者 MSI-X 或者两者,在多 Function 设备中,每一个设备 Function 都必须实现它自己的 MSI Capability 结构,一个 Function 最多只能实现一个 MSI Capability 结构,但是一个 Function 同时实现 MSI 和 MSI-X Capability 结构

    32 比特 Message 地址 MSI Capability 结构如下图

    pcie7_0_spec_fig_44

    64 比特 Message 地址 MSI Capability 结构如下图
    pcie7_0_spec_fig_45

    如果支持 MSI 支持 PVM,32 比特 Message 地址 MSI Capability 结构如下图(多了 mask 和 pending bit)
    pcie7_0_spec_fig_46

    支持 PVM 的 64 比特 Message 地址 MSI Capability 结构如下图(多了 mask 和 pending bit)
    pcie7_0_spec_fig_47

    要请求服务,MSI Function 会将下面的内容写入到 MSI Address 寄存器指定的地址中(如果使用了 64 比特 message 地址,也可以将内容写到 Message Upper Address Register for MSI 指定的指定)

    1. Message Data Register for MSI 中的内容
    2. Extended Message Data Register for MSI 中的内容既某个 function 发送出的 mwr 中,地址是来源于 MSI Address,payload 是来源于 (Extend) Message Data。

    实现了 MSI 的传统 EP 需要支持 32 比特或者 64 比特消息地址 MSI 结构,实现了 MSI 的 PCIe EP 需要支持 64 比特消息地址 MSI 结构 (fig_7_46 或者 fig_7_47),Message Control Register for MSI 表明了一个 Function 的能力和提供对 MSI 的系统软件控制。

    MSI Capability Header (偏移 00h)

    pcie7_0_spec_fig_48

    比特位置 寄存器描述 属性
    7:0 Capability ID, 05h,表明是 MSI Capalibity 结构 RO
    15:8 Next Capability Pointer,下一个 PCI Capability 结构的偏移地址,如果后面没有了,则为 00h RO

    Message Cotrol Register for MSI (偏移 02h)

    该寄存器提供对 MSI 的系统软件控制,默认是禁用 MSI 。如果 MSI 和 MSI-X 都禁用了,该 Function 使用 INTx 中断(如果支持)来请求服务。系统软件通过将该寄存器的 bit 0 配置为 1 来使能 MSI 功能,系统软件允许修改 Message Control Register for MSI 中的读写比特和域,设备驱动不允许修改 Message Control Register for MSI 中的属性为读写的域

    该寄存器中的域如下图所示:
    pcie7_0_spec_fig_49

    比特位置 描述 属性
    0 MSI Enable 如果设置了该比特,且清掉了 Message Control Register for MSI-X 寄存器的中 MSI-X Enable ,该 Function 允许使用 MSI 来请求服务,禁止使用 INTx 中断来请求服务。为了使用 MSI ,系统配置软件需要设置该比特。
    如果清掉,该 Function 禁止使用 MSI 来请求服务
    在运行期间更改此位可能导致函数丢失待处理的中断条件,或无法识别新的中断条件。
    默认值是 0b
    RO
    3:1 Multiple Message Capable 系统软件通过读取此字段来确定所请求的向量数量。所请求的向量数量必须是2的幂次(如果某个函数需要三个向量,则会初始化此字段为010b,从而请求四个向量)。编码定义如下:
    000b 请求 1 个向量
    001b 请求 2 个向量
    010b 请求 4 个向量
    011b 请求 8 个向量
    100b 请求 16 个向量
    101b 请求 32 个向量
    110b 保留
    111b 保留
    RO
    6:4 Multiple Message Enable 软件写该域决定需要分配多少个向量,分配的向量是 2 的幂。比如 Function 需要 4 个向量(Multiple Message Capable 编码是 010b ),软件可以通过将域写 010b, 001b 或者 000b,表示分配 4 个,2 个或者 1 个向量
    如果分配的数量超过了请求的数量(既bit[6:4] 大于 bit[3:1]),行为是未定义的
    当 MSI Enable 设置后,该域发生了变化,其行为是未定义的
    当 MSI Enable 设置为 1 后,Function 至少需要分配 1 个向量,编码如下:
    000b 分配 1 个向量(默认值)
    001b 分配 2 个向量
    010b 分配 4 个向量
    011b 分配 8 个向量
    100b 分配 16 个向量
    101b 分配 32 个向量
    110b 保留
    111b 保留
    当 MSI Enable 设置后,软件改写该值的行为是未定义的
    RW
    7 64-bit Address Capable 如果设置该比特,则 Function 可以发送 64 比特的 Message 地址,如果清掉该比特,则 Function 不兼容发送 64 比特的 Message 地址。如果 Function 是 PCIe EP(根据 Device/port Type 字段决定),则该比特必须设置为 1,如果是工作在 Flit 模式,该比特必须设置为 1 RO
    8 Per-Vector Masking Capable 如果设置该比特,支持按照屏蔽每一个向量,如果清掉,则不支持单独屏蔽某一个向量。如果 Function 是 SR-IOV PF 或者 SR-IOV VF,则必须设置,如果 Function 是 SIOV PF,该域既可以设置也可以清掉 RO
    9 Extended Message Data Capable 如果设置,该 Function 有能力提供 Extended Message Data,如果清掉,该 Function 不支持提供 Extended Message Data RO
    10 Extened Message Data Enable 如果设置,该 Function 允许提供 Extended Message Data,如果清掉,该 Function 不允许提供 Extended Message Data。默认值为 0
    如果 Extended Message Data Capable 为 1,则该比特是可读可写的,否则必须固定为 0
    RW/RO

    Message Address Register for MSI (偏移 04h)

    pcie7_0_spec_fig_7_50

    比特位置 描述 属性
    1:0 保留 读总是返回 0 ,写没任何效果 RsvdP
    31:2 Message Address 系统指定的 message 地址
    如果设置了 MSI Enable,对于 MSI 事务,该寄存器的内容是跟是跟 DWORD 对齐,address[1:0] 设置为 00b,默认值未定义
    RW

    Message Upper Address Register for MSI (偏移 08h)

    pcie7_0_spec_fig_7_51

    比特位置 描述 属性
    31:0 Message Upper Address 系统指定的 message 高位地址(如果64-bit Address Capable 设置了的话)。PCIe EP 需要实现该寄存器,针对其它 Function 类型是可选的
    如果设置了 MSI Enable ,该寄存器的内容(非0)是用来表明 64 比特 messsage 地址的高 32 bit (Address[63:32])。如果该寄存器的内容为 0, Function 使用 32 比特地址,地址是由 Message Address 寄存器指定
    默认值没有定义
    RW

    NOTE : 该部分是 table 的一部分,如果地址是 32 比特的,则该值为0,不会不存在

    Message Data Register for MSI (偏移 08h 或者 0Ch)

    pcie7_0_spec_fig_7_52

    比特位置 描述 属性
    15:0 Message Data 系统指定的 message 内容
    如果设置了 MSI Enable,该 Function 发送一个 DWORD 大小的 Memory Write 事务,其低 16 比特为 Message Data,所有 4 Byte Enable 都需要设置
    “Multiple Message Enable” 字段定义了 Function 在生成其系统软件分配的向量时,允许修改的低位消息数据位数量。比如 Multiple Message Enable 编码为 010 意味着 Function 分配了 4 个向量,并且允许修改 message data 比特 1 和 0(Function 会修改下层消息数据位,以生成指定数量的向量))。如果 Multiple Message Enable 字段是 000b,Function 不允许修改 message data。当 Multiple Message Enable 是非 0 时,如果该寄存器的对应低位不是 0b,则行为未定义。
    默认值未定义
    RW

    Extended Message Data Register for MSI (可选)

    pcie7_0_spec_fig_7_53

    比特位置 描述 属性
    15:0 Extended Message Data 系统指定的 Message Data
    该寄存器是可选的。针对没有屏蔽单个向量的 MSI Capability 结构,如果 Extended Message Data Capable 设置了,其必须实现该寄存器,否则该寄存器不存在 MSI Capability 结构中且是未定义的。针对实现了屏蔽单个响亮的 MSI Capability 结构,如果 Extended Message Data Capable 比特设置了,则必须实现该寄存器,否者是 RsvdP
    如果设置了 Extended Message Data Enable,DWORD Memory Write 事务高 16 比特使用 Extened Message Data,否则高 16 比特使用 0000h
    默认值是 0000h
    RW/undefined/RsvdP

    Mask Bits Register for MSI (偏移 0Ch 或者 10h)

    该寄存器是可选的,只有当 Per-Vector Masking Capable 设置后,才存在。该寄存器的偏移地址取决于 64-bit Address Capable 的值。

    Mask Bits (掩码比特) 和 Pending Bits(待处理位) 寄存器允许软件按向量为基础禁用或延迟消息发送。

    MSI 向量的编号从 0 到 N-1,其中 N 是软件分配的向量数量。每个向量都与掩码位和待处理位寄存器中相应编号的位相对应。

    Multiple Message Capable 字段指示实现了多少个向量,需要跟 Mask 和 Pending bits 关联。所有未实现的 Mask 和 Pending bits 都是保留的。

    Multiple Message Enable 控制需要使用多少个向量。如果 Mask 和 Pending 比特实现了,但是没分配,硬件必须忽略这些比特;即,这些值不得影响中断的生成。

    pcie7_0_spec_fig_7_54

    比特位置 描述 属性
    31:0 Mask Bits 对于每个被设置的掩码位,该 function 将被禁止发送相应的消息。
    默认为 0
    RW

    Pending Bits Register for MSI (偏移 0Ch 或者 10h)

    该寄存器可选,当 Per-Vector Masking Capable 设置后才存在。寄存器的偏移地址取决于 64-bit Address Capable 的值。
    pcie7_0_msi

    比特位置 描述 属性
    31:0 Pending Bits 对于每个被设置的 Pending 位,该 function 将被延迟发送相应的消息。
    默认为 0
    RW

    MSI 配置

    系统软件读取 Message Control 寄存器来决定每个 function 的 MSI 能力

    系统软件读取Multiple Message Capable字段(Message Control 寄存器的比特 3 到 1)确定请求向量的数量。对于每个 function 而言,MSI 最大支持 32 个向量。系统软件写入Multile Message Enable域(Message Control寄存器的 6 到 4 比特)以分配请求向量的全部或子集。例如,一个函数可以请求四个向量,并分配四个、两个或一个向量。请求或者分配的向量数必须是2的幂次方排列(也就是说,需要三个向量的函数必须请求四个向量)。

    如果设置了 Per-Vector Masking Capable位(Message Control寄存器的第 8 位)并且系统软件支持逐矢量屏蔽,则系统软件可以通过写入掩码位寄存器来屏蔽一个或多个矢量。

    如果设置了 64-bit Address Capabl e位(Message Control寄存器的第 7 位),则系统软件用系统指定的消息地址初始化 MSI Capability structures Message Address 寄存器(指定消息地址的低32位)和 Message Upper Address 寄存器(指定消息地址的高32位)。系统软件可以 Message Upper Address 寄存器设置为0,以便函数为 MSI 事务使用 32 位地址。如果该位 (64-bit Address Capable) 为0,系统软件将用系统指定的消息地址初始化 MSI Capability 结构的消息地址寄存器(指定 32 位消息地址)。

    系统软件用系统指定的数据值的低 16 位初始化 MSI 能力结构的消息数据寄存器。当扩展消息数据能力位为 Clear 时,必须注意只初始化消息数据寄存器(即一个 2 字节的值),而不修改 DWORD 位置的上两个字节。

    如果设置了 Extended Message Data Capable 比特,并且系统软件支持 32 位矢量值,则系统软件可以用系统指定的数据值的高16位初始化MSI功能结构的扩展消息数据寄存器,然后设置扩展消息数据支持位。

    MSI 中断流程

    MSI 本质是一次 Memory Write,当有中断事件产生,比如 flit performance 测试中, flit to ack 的值超过了设定的值之后,就会自动发起一笔 msi 中断。

    msi-x

    MSI-X Capability

    MSI-X Capability 结构如下图所示
    pcie7_0_spec_fig_7_56

    一个 Function 中最多只能有一个 MSI-X Capability 结构,一个 Function 中可以同时拥有 MSI Capability 和 MSI-X Capability,但是不能同时使用。 跟 MSI Capability 结构不同,Function 的 Vector 直接就包含了控制和状态信息,MSI-X Capability 结构指向一个 MSI-X Table (表) 和 MSI-X PBA 结构(待定比特数组结构),他们均位于内存空间中,所以合理的流程是需要通过 mem 操作去配置或者读取其信息,当然也可以使用自定义的寄存器来映射这一片,这都是基于具体实现。MSI-X table 排列如下面两个图所示
    pcie7_0_spec_fig_7_57

    MSI-X PBA 结果如下图所示
    pcie7_0_spec_fig_7_58

    PBA 的作用 : 某个 MSI-X vector 产生了中断,但当前被 Mask 住了,不能发 MSI-X TLP 时,用 PBA 记住 “这个中断发生过”。当后面取消 mask 后,可以寄存触发该中断,比如 pending bit 0 为 1 就表示 vector 1 产生了中断,但是被 mask 了。

    每个结构要么由该 Function 的基地址寄存器 (Base Address Register, BAR,位于配置空间的 10h) 映射,要么由 Enhanced Allocation Capability 中的 entry 决定。BIR (BAR Indicator Register) 用于指定哪个 BAR(在 Enhanced Allocation 为 BEI),而 QWORD 对齐的偏移量则表示该结构相对于与 BAR 关联的基地址的起始位置。BAR 既允许 32 比特,也允许 64 比特,但是必须映射到内存空间。一个 Function 允许将 MSX-X Table 和 MSI-X PBA 既允许映射到一个 BAR,也允许映射到不同的 BAR。

    MSI-X Table 结构由多个 entries 构成,每个由下面几个域构成:

    • Message Address
    • Message Upper Address
    • Message Data
    • Vector Control

    每一个 entry (入口) 都有能力指定一个独一无二的向量, 根据 vector 来确定是哪一个 entry。

    Q : 如何知道用哪一个 entry 呢

    A : 由硬件决定,比如 RTL 直接定义某个中断源(如 DMA_DONE )的向量号为 0, EP 有一块逻辑来存储 MSI-X Table

    Pending Bit Array (PBA) 结构,包含了如下域:

    • Function’s Pending Bits
    • one per Table entry
      以 QWORDs 将这些比特组包。最后一个 QWORD 不一定会被完全填充。

    如果要使用一个指定的 MSI-X Table entry 来发起请求,Function 需要执行 DWORD 的 Memory Write 事务,Memory Write 事务中使用该 Entry 的 Message Data ,Message Upper Address,以及 Message Address (低 32 比特),。针对 MSI-X Message Address 发起的 memory read 事务会产生未定义的结果。

    如果某个基地址寄存器(Base Address Register)或“增强分配”(Enhanced Allocation)能力结构中的条目,在映射 MSI-X 表(MSI-X Table)或 MSI-X PBA 的地址空间的同时,也映射了与 MSI-X 结构无关的其他可用地址空间,则该其他地址空间内使用的位置(例如用于 CSR 的位置)不得与 MSI-X 结构所在的任何自然对齐的 4 KB 地址范围重叠。

    这使得系统软件(在适用情况下)能够针对 MSI-X 结构和其他地址空间使用不同的处理器属性。(某些处理器架构不支持为同一自然对齐的 4 KB 物理地址范围关联不同的处理器属性。)允许 MSI-X 表(Table)和 MSI-X PBA 共存于一个自然对齐的 4 KB 地址范围内,但两者不得重叠。

    对于 SR-IOV 设备,上一段中提到的对齐要求依然适用,但必须基于 PF 的 SR-IOV 扩展能力(Extended Capability)中的“系统页面大小”(System Page Size)值,而不是使用固定的 4 KB 值。

    对于 MSI-X Table 和 MSI-X PBA 字段的所有访问,软件必须使用对齐的完整 DWORD 或对齐的完整 QWORD 事务;否则,结果将是未定义的。

    MSI-X Table entries 和 Pending bits 的编号范围均为 0 到 N-1,其中 N – 1 的值由 MSI-X 消息控制寄存器(Message Control Register)中的“表大小”(Table Size)字段指定。对于任意给定的 MSI-X Table Entry k,其起始地址可通过以下公式计算:

    entry starting address = Table base + k*16

    16 表示是一个 Entry 有 4 个字段, Table Base 由 Table Offset/Table BIR Register for MSI-X 寄存器来确定

    对于相关的 Pending 位 k,其进行 QWORD 访问时的地址以及在该 QWORD 内的位编号,可通过以下公式计算:

    QWORD address = PBA base + (k div 64) * 8

    QWORD bit# = k mod 64

    选择通过 DWORD 访问来读取 Pending bit K 的软件可以使用以下公式:

    DWORD address = PBA base + (k div 32) * 4

    DWORD bit# = k mod 32

    比如需要读取一下 ep 当前哪些 vector 是屏蔽的,可以发送一笔 mrd,其地址就是上述计算的,返回 cpl 中的 payload 是 1 个 DW,其 bit [0] 就是 pending bit 0。

    Message Control Register for MSI-X(offset 02h)

    默认是禁用了 MSI-X,如果 MSI 和 MSI-X 都禁用了,Function 如果支持 INTx,就会通过 INTx 来请求服务。系统软件可以通过设置该寄存器的 bit 15 来使能 MSI-X。系统软件允许修改 Message Control 寄存器属性为读写的比特和域。设备驱动不允许修改 Message Control 寄存器属性为读写的比特和域,既该寄存器是由系统软件来操作的,而不应该由设备驱动来更改。
    pcie7_0_spec_fig_7_60

    比特位 寄存器描述 属性
    10:0 Table Size 系统软件读取该域来决定 MSI-X Table 的大小 N,编码为 N-1,该值加 1 就是 Table 的大小。例如 ,如果返回为 000 0000 0011b 意味着表的大小是 4,说明包含了 4 个 Entry,如果返回为 ff,则说明有 256 个 Entry RO
    13:11 Reserved Reserved 读取总是返回0,写入没有效果 RsvdP
    14 Function Mask 如果设置,该 Function 的所有有关向量都是被屏蔽的,不管 per-vector Mask bit 的值
    如果清掉,向量是否 mask 根据 每个向量的 mask 位来决定
    设置和清楚该比特不会影响 per-vercotr Mask 比特值
    默认值是 0
    RW
    15 MSI-X Enable 如果设置,并且 Message Control Register for MSI 中的 MSI Enable 比特被清掉(为 0),Function 允许使用 MSI-X 来请求服务并且禁止使用 INTx。系统配置软件通过设置该比特来使用 MSI-X。
    如果清掉,Functin 禁止使用 MSI-X 来请求服务
    在运行期间更改此位可能导致函数丢失待处理的中断条件,或无法识别新的中断条件。
    默认值是 0b
    RW

    Table Offset/Table BIR Register for MSI-X (offset 04h)

    pcie7_0_spec_fig_7_61

    比特位 寄存器描述 属性
    2:0 Table BIR 指示函数的基地址寄存器中的哪一个,位于配置空间的 10h,或者在跟 BAR Equivalent Indicator(BEI) 匹配的 Enhanced Allocation Capability 入口,用于将 Function MSI-X Table 匹配到内存空间
    编码如下
    0 基地址寄存器 10h
    1 基地址寄存器 14h
    2 基地址寄存器 18h
    3 基地址寄存器 1Ch
    4 基地址寄存器 20h
    5 基地址寄存器 24h
    6 保留
    7 保留
    对于 64-bit 基地址寄存器,Table BIR 指示低 DWORD, 对于有 Type 1 Function 的配置空间头,BIR bit 2 到 5 也是保留的
    RO
    31:3 Table Offset 从包含 Function BAR 到指向 MSI-X Table 地址的偏移量。Table BIR 的低三笔是被系统软件屏蔽的,目的是跟 32 比特对齐
    对于 VFs, Table Offset 值关联到 VF’s 内存空间地址
    RO

    Table Offset 是表的偏移地址,比如 bit[2:0] 读出来是 0,那说明基地址寄存器位于配置空间的 10h,然后读取配置空间的 10h,可以获取到基地址,基地址加上 Table offset 就是内存空间中表内容的起始地址,也就是 “Entry 0: Message Address” 的地址,Entry 的内容就存放在该地址后面,具体需要多少空间来存 Table,由 Message Control Register for MSI-X 中的 Table Size 来确定,然后 RC 就可以发起一笔 Memory,地址为

    PBA Offset/PBA BIR Register for MSI-X (offset 08h)

    pcie7_0_spec_fig_7_62

    比特位 寄存器描述 属性
    2:0 PBA BIR 指示函数的基地址寄存器中的哪一个,位于配置空间的 10h,或者在跟 BAR Equivalent Indicator(BEI) 匹配的 Enhanced Allocation Capability 入口,用于将 Function MSI-X PBA 映射到内存空间
    PBA BIR 值定义跟Table BIR 一样
    RO
    31:3 PBA Offset 从包含 Function BAR 到指向 MSI-X PBA 地址的偏移量。PBA BIR 的低三笔是被系统软件屏蔽的,目的是跟 32 比特对齐
    对于 VFs, PBA Offset 值关联到 VF’s 内存空间地址
    RO

    Message Address Register for MSI-X Table Entries

    pcie7_0_spec_fig_7_63

    比特位 寄存器描述 属性
    1:0 保留 用于跟 DWORD 对齐,软件总是向这两比特写0,否则其行为是未定义的
    默认值是 00b
    这些比特允许只读或读写
    RO 或者 RW
    31:2 Message Address 系统指定的 message 地位地址
    对于 MSI-X message, 此字段的内容来自 MSI-X Table 条目,用于指定 Memory Write 事务中 DWORD 对齐地址的低位部分。
    默认值未定义
    RW

    Message Upper Address Register for MSI-X Table Entries

    pcie7_0_spec_fig_7_64

    比特位 寄存器描述 属性
    31:0 Message Upper Address 系统 message 高位地址
    如果该比特为 0 ,使用 32比特地址的 message,如果该值为 0,则使用 64 比特地址的 messages
    默认值未定义
    RW

    Message Data Register for MSI-X Table Entries

    pcie7_0_spec_fig_7_65

    比特位 寄存器描述 属性
    31:0 Message Data 系统指定的 message data
    对于 MSI-X 消息,此字段的内容来自 MSI-X Table Entry,用于指定 DWORD Memory Write 事务的 32 位数据有效载荷。所有4字节使能位均被设置为启用状态
    跟 MSI messages 中的 message data 不同,MSI-X message 低地位 message data 比特不能被 Function 修改.
    默认值没有定义
    RW

    Vector Control Register for MSI-X Table Entries

    pcie7_0_spec_fig_7_66

    比特位 寄存器描述 属性
    0 Mask Bit 当该比特设置后,该功能(Function)被禁止使用此 MSI-X Table Entry 发送消息;然而,任何其他配置了相同向量的 MSI-X Table Entry,除非也被屏蔽(masked),否则仍能发送等效的消息。
    默认值是 1b (屏蔽了该入口)
    RW
    15:1 保留 这些比特的默认值是 0,然而,为了适应未来可能的用途,软件在修改其他向量控制位(Vector Control bits)的值时,必须保留这些保留位(Reserved bits)的值。如果软件修改了这些保留位的值,其结果将是未定义的。
    这些比特允许是 RsvdP 或者读写
    RW 或者 RsvdP
    23:16 ST Lower 如果该功能(Function)实现了 TPH 请求者扩展能力(TPH Requester Extended Capability)结构,且 ST 表位置(ST Table Location)字段的值为 10b,则该字段包含 Steering Tag(路由标签)的低 8 位,且必须支持读写。
    否则,该字段允许为读写(read-write)或 RsvdP 类型;为预留日后使用,软件在修改其他向量控制位(Vector Control bits)的值时,必须保持这些保留位的值,否则结果将是未定义的。
    默认值是 00h
    RW/RsvdP
    31:24 ST Upper 如果该功能(Function)实现了 TPH Requester 扩展能力结构(TPH Requester Extended Capability structure),且 ST 表位置(ST Table Location)指示值为 10b,同时“支持扩展 TPH Requester”位(Extended TPH Requester Supported bit)被置位,则该字段包含 Steering Tag 的高 8 位,且必须为可读写。
    否则,该字段允许被实现为可读写或 RsvdP(保留并作为只读位处理);为适应未来可能的用途,软件在修改其他向量控制位的值时,必须保持这些保留位的值,否则结果将是未定义的。
    默认是 00h
    RW/RsvdP

    Pending Bits Register for MSI-X PBA Entries

    pcie7_0_spec_fig_7_67

    比特位 寄存器描述 属性
    63:0 Pending Bits 对于每一个被置位的待处理位(Pending Bit),该功能针对相关的 MSI-X 表项有一条待处理消息。
    未关联 MSI-X 表项的待处理位(Pending bits)属于保留位。默认情况下,保留待处理位的值必须为 0b。 a RO 或者 RW

    MSI-X 配置

    系统软件为该功能的标准基地址寄存器组分配地址空间,并相应地设置这些寄存器。该功能(Function)的一个基地址寄存器(Base Address Register)包含了用于 MSI-X 表的地址空间,但负责分配地址空间的系统软件无需知晓具体是哪个基地址寄存器,也无需知道该地址空间是用于 MSI-X 表的。同一个或另一个基地址寄存器包含了 MSI-X PBA 的地址空间,关于系统软件的同样论点也适用于此。

    根据系统软件策略,系统软件或设备驱动程序软件可能会在不同时间或环境下,利用合适的向量来配置某个功能的 MSI-X 能力及表结构。例如,引导环境通常仅需单个向量;而对于运行应用程序的常规操作系统环境,如果该功能(Function)支持包含多个条目的 MSI-X 表,则使用多个向量可能会带来益处。在本节后续内容中,“软件”一词泛指系统软件或设备驱动程序软件。

    软件从“消息控制”(Message Control)寄存器中读取“表大小”(Table Size)字段,以确定 MSI-X 表的大小。该字段将表项数量编码为 N-1,因此软件必须将从该字段读取的值加 1,才能计算出表项总数 N。MSI-X 支持的最大表大小为 2048 个表项。

    软件通过读取“Table Offset/Table BIR”寄存器中的32位值来计算MSI-X表(MSI-X Table)的基地址:首先屏蔽掉Table BIR字段中的低3位,然后将剩余的、按QWORD对齐的32位表偏移量(Table Offset),与由Table BIR字段所指定的基地址寄存器(Base Address Register)中的地址相加。软件利用“PBA Offset/PBA BIR”寄存器,通过相同的步骤计算MSI-X PBA的基地址。

    对于将要使用的每个 MSI-X 表项,软件需填充“消息地址”(Message Address)字段、“消息高位地址”(Message Upper Address)字段、“消息数据”(Message Data)字段以及“向量控制”(Vector Control)字段。其中,“向量控制”字段可能包含可选的“路由标签”(Steering Tag)字段。当表项处于未屏蔽(unmasked)状态时,软件不得修改该表项的地址、数据或路由标签字段。详情请参阅第 6.1.4.5 节。

    MSI-X 流程

    • 禁用 MSI,使能 MSI-X,读取寄存器 Message Control, 根据 bit[10:0] 确定 Entry 的大小。
    • 配置 Message Control 的 bit[15] MSI-X Enable 为 1
    • 读取 Table BIR 和 Table Offset
    • 读缺 PBA BIR 和 PBA Offset
    • 根据 BIR 的值确定 BAR 寄存器
    • 根据 BAR 寄存器的值和 Table Offset 得到 Entry 基地址
    • 根据 BAR 寄存器的值和 PBA Offset 得到 xxx
    • 分配 msix 向量号
    • 发送 Memory Write 给 EP, 每一个 Entry 都要使能, memory write 要求
      • 地址为 Entry 的地址
      • 如果一次将 Entry 写完,则 length = 4,如果一次一次写,则 length = 1
      • first_dw_be 和 last_dw_be = 4’hf
      • payload[0] 到 payload[2] 自定义
      • payload[3] 为 Vector Control ,也是自定义
    • 产生中断事件(如 flit to ack 延迟超过设定的值)
    • EP 发送 Memory write,地址来源于 MSI-X table 的地址,payload 来源于 MSI-X table 中的 message data
    如果在这个过程中遇到了其它问题,欢迎在评论区留言,如果你已解决,也欢迎把具体的解决方法留在评论区,以供后来者参考
    ×

    感谢您的支持,请扫码打赏

    微信打赏 支付宝打赏
    guest

    0 评论