PCIE系统标准体系结构解读(八):事务顺序和中断

1.9 事务顺序

1.9.1 生产者/使用者模型

生产者/使用者模型可能是两台有请求能力的设备用来相互通信的常用方法。

1 一个网络适配器开始通过网络接收压缩的视频数据流,并执行一系列存储器写事务,将这些压缩的视频数据流存入存储器的数据缓冲区中。

2 生产者将数据存入存储器之后,它就执行一次存储器写事务,在某一存储器单元中设置一个标志,表示数据已经准备好,等待处理。

3 使用者定期对标志单元执行存储器读,以便查看是否有数据要处理。

4 当发现生产者已设置标志时,它执行一个存储器写清除标志,然后执行一次突发存储器读事务,从存储器的数据缓冲区中读取压缩的数据。

5 当使用者使用完数据后,它将完成状态写入状况单元。然后,它重新开始定期地读取标志单元,以确定何时需要处理更多的数据。

6 与此同时,生产者也定期地读取状况单元,查看其他请求者是否已经完成数据处理、在生产者读取状况并发现使用者已经完成数据处理时,生产者接着执行一个存储器写来清楚状况单元。

7只要生产者还有数据要处理,此过程便重复。

1.9.2 真正的PCIe顺序规则

真正的PCIe顺序规则可以概述为下面4条简单的规则:

1. PCIe要求具有相同TC分配的事务按照强顺序通过结构。因为分配了同一TC值的所有事务映射到一个给定的VC,因此这一规则也同样适用于每个VC内的事务。

2. 不同TC分配的事物之间不存在顺序关系。

3. 顺序规则同样适用于所有类型的事务:存储、IO、配置和消息。

4. 在有限的情况下,设置了“灵活的顺序”属性比特的事务能排在其他具有相同TC值的事务之前。

这些基本规则可以保证事务总是按照软件计划的顺序完成。然而,这些规则非常保守,并且无法提供最佳的性能。在这种情况下,为了提高性能,可以应用更冒险的规则。

1.9.3 灵活的顺序

PCIe支持PCI-X引入的灵活的顺序机制,但PCIe引入了一些变化。PCIe环境下灵活的顺序概念允许请求者和完成者之间路径上的交换器,将刚收到的一些事务重新排在其他先前已入队的事务之前。

支持生产者/使用者模型的顺序规则可能导致事务阻塞,事实上阻塞的事务与任何生产者/使用者事务序列无关。因此在某些情况下,设置了灵活的顺序属性比特的事务能重新排在其他事务之前。

如果设备驱动器允许,设备就可以设置灵活的顺序比特。

1.9.4 RO对存储器写和消息的影响

存储器写和消息事务都被当作报告操作,两者被接收到同一报告缓冲区,两者服从相同的顺序要求。当设置了RO比特时,交换器处理这些事务的步骤如下:

允许交换器将刚报告的存储器写事务重新排在之前的报告存储器写事务或消息事务之前。同样,刚报告的消息事务也可以排在之前的报告存储器写或消息事务之前。交换器也必须不修改RO比特的转发事务。

允许根联合体将刚报告的写事务及时地排在早先接收的其他写事务之前。同样,在接收写请求时,要求根联合体将数据有效载荷写入系统存储器内指定的地址单元,但允许以任意地址顺序将每个字节写入存储器。

1.9.5 RO对存储器读事务的影响

设备发出设置了RO比特的存储器读请求时,这个请求在到达完成者的路途中可能穿过一个或多个交换器。完成者以一系列一个或多个分离的完成事务返回请求读取的数据,而且使用与请求相同的RO设置。

1.10 中断

1.10.1 发送中断的两种方法

真正的PCIe中断发送机制——PCIe使用消息信号中断(MSI)消除了对边带信号的需要。消息信号中断不是PCIe消息,而仅仅是存储器写事务。与MSI有关的存储器写与其他存储器写只能通过它们的目标地址单元来区分,与MSI有关的存储器写的目标地址单元时系统专为中断发送而保留的。

传统的PCI中断发送机制——这一机制必须使用为PCI总线定义的PCI兼容中断信号(INITA#、INITB#、INITC#、INITD#)的设备。传统中断设备使用这些中断线之一发出中断信号。首先声明INITx#信号请求中断服务,接下来当服务中断服务程序访问设备专用寄存器时,再取消声明INITx#信号,表示该中断正在被服务。PCIe定义了其作用相当于虚拟INITx#线的带内消息。这些消息以位于根联合体内的中断控制器为目标。

1.10.2 消息信号中断

消息信号中断(MSI)通过存储器写事务被发送到根联合体。MSI功能寄存器提供设备发送MSI信号需要的所有信息。该寄存器由配置软件设置,包括如下信息:

目标存储器地址;

要写入指定单元的数值;

可以编码成数据的消息树。

1.10.2.1 MSI功能寄存器组

真正的PCIe功能必须在其自己的配置空间内实现单独的MSI寄存器组。PCIe规范定义了两种寄存器格式:

64位存储器寻址格式;

32位存储器寻址格式。

 

 

下面介绍MSI寄存器中的每个字段。

功能ID:标志MSI寄存器组的功能ID是05h。这是一个硬连线、只读的值。

下一新功能寄存器的指针:寄存器组的第二个字节若不是指向下一新功能寄存器组,就是包含00h,如果这是新功能列表的结尾。它是一个硬连线、只读的值。如果是非0值,则必须是一个双字对齐的值。

消息控制寄存器:

比特

字段名

描述

15:8

保留

只读,总为0

7

64位地址能力

只读

0=功能未实现消息地址寄存器的高32位,不能产生64位寄存器地址

1=功能实现消息地址寄存器的高32位,能产生64位存储器地址

6:4

多消息允许

读/写。系统软件读取多消息能力字段,从而确定设备请求多少消息之后,对这个字段编程,赋一个3位的值,表明分配给设备的消息实际数目。所分配的消息数目可以等于或小于实际请求的数目。这个字段的状态在复位时为000b

3:1

多消息能力

只读。系统软件读取这个字段确定设备分配了多少消息

0

MSI允许

读/写。复位后的状态为0,表明设备的MSI功能是禁用的。0=禁止功能使用MSI,必须使用INTx消息发送中断;1=允许使用MSI请求服务,禁止使用其中断引脚

消息地址寄存器:低两位硬连线到0。消息控制寄存器的bit7是1时,高32位才出现。

消息数据寄存器:系统软件通过将基消息数据写入该16位读/写寄存器,从而分配设备一个基消息数据模式。当设备必须产生中断请求时,它将32位值写入消息地址寄存器指定的寄存器地址。写入的数据具有如下格式:

高16位总为0;

低16位由消息数据寄存器提供。如果分配给设备的消息多于一个,则设备修改消息数据寄存器的低位,为它希望报告给驱动程序的事件形成适当的消息。

1.10.2.2 MSI配置基础

软件配置PCIe设备的MSI中断采取的步骤如下:

1. 启动时,配置软件扫描PCI总线并发现设备(执行配置读,读取有效的供应商ID)。在发现PCIe功能时,配置软件读取功能列表指针(Capabilities List Pointer),获得寄存器链中第一个功能寄存器的地址。

2. 然后软件搜索功能寄存器组,知道发现MSI功能寄存器组(功能ID位05h)。

3. 软件将一个双字对齐的存储器地址分配给设备的消息地址寄存器。这是发送中断请求时使用的存储器写的目的地址。

4. 软件检查设备消息控制寄存器的多消息能力字段,以确定设备将分配多少事件特定的消息给它。

5. 然后软件向设备分配等于或小于设备请求设备数的消息。最少分配一条消息给设备。

6. 软件将基消息数据模式写入设备的消息数据寄存器。

7. 最后,软件设置设备的消息控制寄存器中的MSI允许比特,从而允许它使用MSI存储器写来生成中断。

 

当设备必须生成中断请求时,它将消息数据寄存器内容写入消息地址寄存器所指定的存储器格式。下图显示了存储器写事务头和数据字段中的内容。关键点包括:

格式字段必须是11b,表明是带数据的4DW头,传统端点的格式字段可以是10b。

头属性比特(不侦测和灵活的顺序)必须是零。

长度字段必须是01h,表明最大1DW的数据有效载荷。

第一个BE字段必须是0011b,表明有效数据在低16位中。

最后一个BE字段必须是0000b,表明是单个DW的事务。

头中的地址字段直接来自于MSI功能寄存器的地址字段。

 

如果系统软件向设备分配多个消息,就允许它修改所分配的消息数据值的低位,为每个设备特定的事件类型发送不同的消息,通过设备驱动程序要求服务。

例如,4个消息已分配给设备,数据值0500h以复制给设备的消息数据寄存器,存储器地址0A000000h已写入设备的消息地址寄存器。当4个不同的设备特定事件之一发生时,设备生成一个请求,通过执行双字写将数据值00000500h、00000501h、00000502h或00000503h写入存储器地址0A000000h。

1.10.3 传统的PCI中断发送机制

1.10.3.1 设备的INTx#引脚

每个物理PCI组件可以实现最多4个INTx#信号(INITA#、INITB#、INITC#、INITD#)。由于PCI设备最多能支持8个功能,如果实现最多8个功能并且所有功能都要求中断,则必须共享INTx#信号。不允许一个功能使用多于一个的INTx#信号。

每一PCI功能通过标准配置头来表明支持INTx#信号。下图展示了只读中断引脚寄存器,它含有配置软件用于确定是佛支持INTx#信号,并且如果支持,这个功能使用哪个INTx#信号所必需的信息。

 

1.10.3.2 中断路由

需要系统设计者确定来自设备的INTx#引脚的路由。可以用多种方式路由每台设备使用的INTx#信号,以便每个INTx#引脚最终到达中断控制器的一个输入。下例中,所有PCI INTx信号被路由到4个输入之一。所有路由到给定输入的INTx信号将定向到中断控制器的特定输入,因此每个路由到共同输入端的INTx也将具有平台软件分配给它的同一种中断线编号。IRQ15有3个来自不同设备的PCI INTx输入——INTB#、INTA#、INTA#。因此,使用这些INTx#线的功能将共享IRQ15以及与之相关的中断向量。

根据与每一功能相关的INTx#引脚的路由情况,配置软件报告中断线号。当来自这一功能的中断出现时,这个值最终告诉功能的设备驱动程序报告哪个中断向量。因此,当这个功能产生中断时,CPU将收到与中断线寄存器指定的IRQ有关的向量号。CPU使用这个向量号索引中断服务表,以读取该功能的相关设备驱动程序的中断服务入口指针。传递该信息所使用的方法是操作系统特有的。

 

1.10.3.3 INTx#信令

当设备发送中断信号时,它也在设备专用寄存器中设置某个比特来表明有一个中断等待处理。可将该寄存器映射在存储器或I/O地址空间中,由设备专用软件读取,以便验证有一个中断待完成。当此比特被清除时,取消声明INTx信号。

设备也必须设置位于配置寄存器的中断状况比特。系统软件可以读取这一比特,以便得知目前是否有一个中断待完成。

禁用中断:PCI2.3规范在配置命令寄存器中增加了禁用中断比特(比特10),如下图所示。复位时,该比特被清除,允许产生INTx信号。软件可以设置该比特,从而禁止生成INTx信号。

 

中断状况:PCI2.3规范在配置状态寄存器中增加了中断状态比特,如下图所示。当中断待处理时,功能必须设置该状况比特。另外,如果配置命令寄存器中的禁用中断比特被清除(即允许中断),则仅在中断状况比特置1后,才能声明该功能的INTx#信号。该比特不受禁用中断比特状态的影响。同时是只读的。

 

1.10.3.4 INTx消息的格式

 

 

设备可以同时支持两种中断,但任何给定的时刻只允许使用一种机制。设置MSI允许比特可以禁止设备使用INTx消息,并允许发送MSI。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章