赞
踩
本文将从PCIe角度讲SR-IOV。
PCIe 系列SR-IOV导航:
【PCIe 5.0 - 100】SR-IOV【1】
【PCIe 5.0 - 101】SR-IOV【2】
【PCIe 5.0 - 102】SR-IOV【3】
【PCIe 5.0 - 103】SR-IOV 【4】
行业内,通过使用虚拟化技术来提高硬件资源的有效利用率(即应用程序执行)已经付出了巨大的努力。SR-IOV使多个系统映像 (SI) 能够共享 PCI 硬件资源。
为了说明如何使用该技术来提高有效资源利用率,可以考虑图 9-1 中所示的通用平台配置。
为了减少平台资源开销,PCI-SIG® 开发了包含在该规范中的 SR-IOV 技术。SR-IOV 技术的好处是:
图 9-3 说明了一个支持 SR-IOV 的平台示例。
要将 PCIe 设备与支持 PCIe SR-IOV 的设备进行比较和对比,请查看以下一组图。图 9-4 显示了一个示例 PCIe 兼容设备。
此图说明了具有以下特征的Multi-Function PCIe 设备:
如该图所示,硬件资源随着提供的Function数量而扩展。根据设备的复杂性和大小,每个Function的增量成本会有所不同。为了减少增加的硬件成本,可以使用SR-IOV构建设备以支持单个 PF和多个VF,如图 9-5 所示。
另一个示例使用模型如图 9-6 所示。在此示例中,设备支持多个 PF,每个 PF 都有自己的一组 VF。
如前面的示例所示,PF 和 VF 的数量可以根据使用模型要求而变化。为了支持广泛的选项,SR-IOV 设备可以支持以下数量和组合的 PF 和 VF:
ARI 功能使设备能够支持多达 256 个Functions—Functions、PF 或任意组合的 VF—与捕获的Bus Number相关联。如果使用模型不需要超过 256 个Functions,则强烈建议实现将所有Functions、PF 和 VF 放在捕获的Bus Number内,并且不需要额外的Bus Number来访问 VF。
在最后一个示例(图 9-8)中,设备实现可以混合任意数量的Functions、PF 和 VF。
建立明确的互操作性要求对于任何技术的成功都至关重要。为此,组织了 PCI-SIG I/O 虚拟化规范,以最大限度地提高兼容实施的互操作性潜力。从概念上讲,这被视为一组同心圆,用于定义功能如何分层以构建具有 IOV 功能的组件,如图 9-9 所示。
以下部分描述了软件如何确定设备是否支持 SR-IOV,并通过Virtual Function配置空间识别 VF 资源。
本节介绍在enable PF的IOV Capabilities之前必须配置的字段。通过在 SR-IOV Extended Capability中设置 PF的VF Enable位(参见第 9.3.3.3.1 节)来启用 VF。
NumVFs 字段(参见第 9.3.3.7 节)定义了在关联PF中设置VF Enable时启用的VF数量。
本节介绍如何配置 VF BAR 以映射内存空间。VF 不支持 I/O 空间,因此 VF BAR 不应指示 I/O 空间。
System Page Size字段(见9.3.3.13 节)定义了当 PF 的 IOV 功能启用时系统将用于映射 VF 的 PCIe 内存地址的page大小。PF 使用System Page Size字段将每个 VF BAR 定义的内存空间缝隙与system page边界对齐。为System Page Size选择的值必须是SR-IOV extended capability中支持的page size之一(请参阅第 9.3.3.12 节)。
VF BAR 的行为与PCI Memory Space BARs的行为相同(参见第 7.5.1.2.1 节),除了 VF BAR 描述每个 VF 的孔径,而 PCI BAR 描述单个Function的孔径。如果实现了VF Resizable BAR Extended Capability(请参阅第 9.3.7.5 节),则 VF BAR 中某些位的属性会受到影响。
BARb VFV 起始地址 = VF BARb + (v – 1) x (VF BARb aperture size)
其中 VF BARb孔径大小是 VF BARb的大小,由9.3.3.14 节中描述的常用 BAR 探测算法确定。
直到 VF Enable 和 VF MSE 都已设置(参见 9.3.3.3.1 节和9.3.3.3.4 节)后,才会启用 VF 存储空间。请注意,更改System Page Size( 9.3.3.13 节)可能会影响 VF BAR 孔径大小。
图 9-10 显示了 PF 和 VF 内存空间孔径的示例。
SR-IOV extended capability中的 First VF Offset 和 VF Stride 字段是 16 位Routing ID偏移量。这些偏移用于计算具有以下限制的VF的Routing ID:
表 9-1 描述了用于确定与每个 VF 关联的Routing ID 的算法。
VF Number | VF Routing ID |
---|---|
VF 1 | (PF Routing ID + First VF Offset) Modulo 216 |
VF 2 | (PF Routing ID + First VF Offset + VF Stride) Modulo 216 |
VF 3 | (PF Routing ID + First VF Offset + 2 * VF Stride) Modulo 216 |
… | … |
VF N | (PF Routing ID + First VF Offset + (N-1) * VF Stride) Modulo 216 |
… | … |
VF NumVFs (last one) | (PF Routing ID + First VF Offset + (NumVFs-1) * VF Stride) Modulo 216 |
此路由 ID 计算中使用的所有算法都是 16 位无符号整数。
所有 VF 和 PF 必须具有不同的Routing ID。任何PF或VF的Routing ID 不得与任何其他PF或VF的Routing ID 重叠,前提是设备的所有PF中的 NumVF 设置有效。
VF Stride和First VF Offset是常数。除非在本节前面有说明,否则它们的值可以不受设备的Functions的设置影响。
VF 可能驻留在与相关联的 PF 不同的Bus Number(s)上。如,这可能发生在:First VF Offset的值为 0100h。VF 不应位于数字小于其关联 PF 的Bus Number上。位于与其关联 PF 相同的Bus Number上的 VF 不应位于数字小于 PF 的Device Number上(紧接在Downstream Port下方的 SR-IOV 设备的设备编号始终为 0,因此始终满足这个条件)。
SR-IOV RCiEP 设备的 VF与其 PF 与相同的Root Complex Event Collector(如果有)相关联。此类 VF 不会在 Root Complex Event Collector 的 Root Complex Event Collector Endpoint Association Extended Capability 中报告。
根据第 2.2.6.2 节,与Upstream Port关联的支持 SR-IOV 的设备从任何Type 0 Configuration Write Request中捕获Bus Number。支持 SR-IOV 的设备不会从任何Type 0 Configuration Write Request中捕获Bus Number。支持SR-IOV的RCiEP使用特定实现的机制来分配它们的Bus Number。
Bus Number的切换处理与 PCIe 相同。在基本 PCIe 中,Switch将Secondary Bus Number(含)到Subordinate Bus Number(含)范围内的所有配置请求发送到设备。寻址Secondary Bus Number的Type 1 Configuration Requests被转换为Type 0 Configuration Requests,而寻址Secondary Bus Number(独占)和Subordinate Bus Number(含)之间的Bus Numbers的Type 1 Configuration Requests作为Type 1 Configuration Requests转发到设备。
注意:Bus Numbers是一种有限资源。建议设备避免在其Bus Number使用过程中留下“漏洞”,浪费Bus Number。
所有 PF 必须位于设备捕获的Bus Number上。
跨越多个Bus Numbers的 VF
作为一个例子,考虑一个支持单个 PF 的 SR-IOV 设备。最初,只有 PF 0 可见。软件设置支持 ARI 的层次结构。根据 SR-IOV Extended Capability确定:InitialVFs 为 600,First VF Offset 为 1,VF Stride 为 1。
软件应配置 Switch Secondary 和 Subordinate Bus Number 字段以将足够的Bus Numbers路由到设备。如果没有足够的Bus Numbers可用,软件应通过在启用 SR-IOV 之前不启用 SR-IOV 和/或减少设备的部分或所有 PF 的 NumVF 来降低设备的Bus Numbers要求。
在某些 PF n 中设置 VF Enable 后,设备必须启用 VF n,1 到 VF n,m(含),其中 m 是 InitialVFs 和 NumVFs 中的较小者。接收到以enabled VF 为目标的Type 0 Configuration Request 的设备必须正常处理该请求。接收到针对未位于捕获的Bus Numbers上的eanbled VF 的Type 1 Configuration Request的设备必须正常处理该请求。接收以设备捕获的总线号为目标的Type 1 Configuration Request的设备必须遵循处理Unsupported Requests的规则。此外,如果设置了 VF MSE,则每个enabled VF 必须响应寻址与该 VF 关联的内存空间的 PCIe 内存事务。
PCIe结构中不存在没有enabled Function(即,m 以上的 VF 功能)。根据第 2.3.1 节,寻址不存在的Function将导致返回Unsupported Requests(UR)。这包括附加的Bus Numbers的Function。
SR-IOV 设备可能消耗多个Bus Numbers。除了第一个Bus Number之外的其他Bus Numbers是连续的,并且紧跟在分配给设备的第一个Bus Number之后。如果 SR-IOV 设备还包含 PCI-PCI Bridge(带有Type 1 Configuration Space header),则在为这些Bridges programming Secondary Bus Number时必须考虑 SR-IOV 的使用情况。软件应首先确定 VF 使用的最后一个Bus Number,然后配置任何位于同一位置的网桥以使用高于该值Bus Number。
PCI 设备可能在Function之间具有特定的依赖关系。例如,Function 0 和Function 1 可能提供不同的机制来控制相同的底层硬件。在这种情况下,设备编程模型可能要求将这些相关Functions作为一组分配给 SI。
Function依赖表用于描述这些依赖(或表明不存在Function依赖)。软件应将 PF 和 VF 分配给 SI,以满足相关性。
有关详细信息,请参阅9.3.3.8 节。
如果分配了中断资源,PF 和 VF 支持 MSI、MSI-X 中断或两者。但VF 不应实现 INTx。
本节介绍 PCI-base-defined-reset 机制如何影响支持 SR-IOV 的设备。它还描述了用于Rest单个 VF 和单个 PF 及其关联 VF 的机制。
根据6.6.1 节中的规则,对支持 SR-IOV 的设备进行Conventional Reset会导致所有Functions(包括 PF 和 VF)重置为其原始的上电状态。 9.3 节描述了定义的字段的行为。
注意:Conventional Reset会清除 PF 中的 VF Enable。因此,在Conventional Reset后 VF不再存在。
VF必须支持Function Level Reset (FLR)。
注意:软件可能会使用 FLR 来重置 VF。VF 的 FLR 会影响 VF 的状态,但不影响其在 PCI Configuration Space或 PCI Bus地址空间中的存在。PF 的 SR-IOV extended capability中的 VFs BARn 值(参见第 10 节第 9.3.3.14 节)和 VF MSE(参见第 9.3.3.3.4 节),以及VF Resizable BAR capability的值不受发给 VF 的 FLR 的影响。
PF必须支持FLR。
FLR 发到 PF 会重置 PF 状态以及 SR-IOV extended capability,包括 VF Enable,这意味着 VF 不再存在。
如果 VF Enable 在前面设置后又被清除,则与 PF 关联的所有 VF 不再存在,并且不得再发出 PCIe 事务或响应Configuration Space或Memory Space访问。清除VF Enable后,VF 不得保留任何状态(包括粘滞位,sticky bit)。
VF 迁移是[MR-IOV]中的一个可选功能。不支持MR-IOV Extended Capability的设备不支持 VF 迁移功能。
在Multi-Root系统中,可以在Virtual Hierarchies之间迁移 VF。
要发生 VF 迁移,必须设置VF Migration Capable和VF Migration Enable。VF Migration Capable向 SR-PCIM 指示存在VF Migration Hardware并且Multi-Root PCI Manager(MR-PCIM) 已启用它。VF 迁移的硬件支持是可选的。SR-PCIM 对 VF 迁移的支持也是可选的。
VF Migration Enable 向设备硬件和 MR-PCIM 指示 SR-PCIM 也启用了 VF 迁移。
支持 VF Migration对 SR-PCIM 有以下要求:
本节介绍VF Migration State Array中的初始值。
如果 InitialVFs不为零,则 VF1 到 VFInitialVFs处于 Active.Available 状态。如果 TotalVFs(第 9.3.3.6 节)大于 InitialVFs,则 VFInitialVFs+1 到 VFTotalVFs 处于Inactive.Unavailable状态。如果VF Migration Enable被清除,则不使用高于 InitialVF 的 VF。
如果 InitialVFs 为 0,则没有 VF处于Active.Available状态。如果 TotalVFs 等于 InitialVFs,则所有 VF 都处于 Active.Available 状态。如果 TotalVFs 为 0,则没有 VF 与此 PF 相关联,并且没有VF Migration State Array。
图 9-11 描述了这个初始 VF 状态。
VF 迁移遵循图 9-12 所示的状态图。显示的状态值包含在与 VF 关联的 VF 状态数组条目中。实线指示的状态转换由 MR-PCIM 发起。由点划线表示的状态转换由 SR-PCIM 发起。
SR-PCIM 通过将新值写入 VF 迁移状态阵列来启动状态转换。当 SR-PCIM 尝试启动除表 9-2 之外的任何状态转换时,设备会忽略写入的事务并且不会发生状态转换:
当前VF Enable | 当前VF State | 写入的VF Enable | 写入的VF State | 含义 |
---|---|---|---|---|
1 | Dormant.MigrateIn | 1 | Active.Available | SR Activate VF |
1 | Active.Available | 1 | Dormant.MigrateIn | SR Deactivate VF |
1 | Active.MigrateOut | 1 | Inactive.Unavailable | SR Complete Migrate Out |
1 | 任意值 | 0 | 任意值 | SR Disables all VFs |
0 | 任意值 | 1 | 任意值 | SR Enables all VFs。VF 根据 VF 编号和 InitialVF 转换为 Active.Available 或 Inactive.Unavailable。 |
软件状态迁移更改检测
SR-PCIM 通常需要通过在写入后重新读取 VF 迁移状态来验证状态更改是否生效。
处于 Inactive.Unavailable 状态的 VF 不能被软件以任何方式使用。针对Inactive VF 的请求收到Unsupported Request(UR)。在转换到Inactive或Dormant状态的 100 毫秒内,Device必须确保不会使用指定的 Routing ID发出新的事务。
MR-PCIM 通过使用[MR-IOV]指定的不同数据结构来启动状态转换。此类转换的影响在VF Migration State Array和VF Migration Status位中可见。由 MR-PCI发起的所有状态转换都会导致VF Migration Status位被Set。
每个支持VF Migration的 VF 都存在此迁移状态机。迁移状态机不受Function依赖表的影响。 VF Migration State不影响Function状态。如果作为移出和/或移入操作的一部分需要重置 VF 状态,则 SR-PCIM 必须发出 FLR 来完成此操作。未定义在没有FLR的情况下发生VF迁移时的VF行为。
FLR和VF Migration
VF 从系统 A 到系统 B 的迁移通常涉及在完成 Migrate Out 操作之前系统 A 中的一个 FLR,以及在接受 Migrate In 操作之后但在使用 VF 之前系统 B 中的第二个FLR。系统 A 使用第一个 FLR 来确保其数据不会泄漏。系统 B 使用第二个 FLR 来确保它从一个干净的Function开始。
本节提供了 SR-IOV 添加的用于实现 PF 和 VF 的要求。
跟所有Function一样,PF 可以在配置空间中发现。PF 包含第 9.3.3 节中描述的SR-IOV Extended Capability。PF 用于发现、配置和管理与 PF 关联的 VF 以及本规范中描述的其他内容。
支持 SR-IOV 的 PF 应实现以下部分中定义的 SR-IOV 能力。VF 应实现以下部分中定义的配置空间字段和功能。
这里定义的 SR-IOV Extended Capability 是 PCIe 扩展能力,必须在每个支持 SR-IOV 的 PF 中实现。该能力用于描述和控制 PF 的 SR-IOV Capabilities。
对于Multi-Function Devices,每个支持 SR-IOV 的 PF 应提供本节定义的Capability结构。该Capability结构可以出现在任何具有Type 0 Configuration Space Header的Function中。此Capability不得出现在具有Type 1 Configuration Space Header的Functions中。
表9-3定义了SR-IOV Extended Capability header。表示SR-IOV Extended Capability的Capability ID是0010h。
Bit | Register | 属性 |
---|---|---|
15:0 | PCI Express Extended Capability ID -SR-IOV Extended Capability的Extended Capability ID是固定值0010h | RO |
19:16 | Capability Version- 对PCIe5.0 spec来说是固定值1 | RO |
31:20 | Next Capability Offset:该字段包表示下一个 PCI Express Capability 结构的偏移量,如果没有下个capability,则为 000h。 对于在配置空间中实现的扩展功能,此偏移量相对于 PCI 兼容配置空间的开始,因此必须始终为 000h(用于终止功能列表)或大于 0FFh。 | RO |
Bit | 寄存器 | 属性 |
---|---|---|
0 | VF Migration Capable: 如果设为1,PF 是 Migration Capable 并且在 Migration Capable MR-PCIM 下运行。 | RO |
1 | ARI Capable Hierarchy Preserved PCI Express Endpoint :如果设为1,则 ARI Capable Hierarchy 位在某些功耗状态转换中被保留。建议将此位置 0b。 | RO |
2 | VF 10-Bit Tag Requester Supported :如果设为1,所有VF必须支持 10-Bit Tag Requester功能。如果清为0,则 VF 不支持 10-Bit Tag Requester功能。 如果 PF 的Device Capabilities 2 Register中的 10-Bit Tag Requester Supported 位被清为0,则该位必须为0。 | HwInit |
20:3 | Reserved | RsvdP |
31:21 | VF Migration Interrupt Message Number:表示用于迁移中断的 MSI/MSI-X 向量。如果 VF Migration Capable 为 Clear,则此字段中的值未定义。 | RO |
VF Migration Capable 被设置表示PF 支持VF Migration。如果清除,则 PF 不支持 VF Migration。
VF Migration支持是[MR-IOV]可选功能。如果 PF 没有实现 VF Migration的硬件,则该位应实现为 RO,值 0b。如果 PF 为 VF Migration实现了硬件,则该位由[MR-IOV]的机制控制,并表示对 VF Migration的支持。
仅实现 SR-IOV 的设备应将此字段实现为 RO, 值0b。
支持 VF 迁移的 PF 必须实现 MSI 或 MSI-X 中断(或两者)。
ARI Capable Hierarchy Preserved被置起来表示 PF 在某些功耗状态转换期间保留 ARI Capable Hierarchy 位(9.3.3.3.5 节)。组件必须设置该位或设置 No_Soft_Reset 位(参见第 9.6.2 节)。建议组件设置此位,即使它们也设置了 No_Soft_Reset。
ARI Capable Hierarchy Preserved 仅出现在设备编号最低的 PF(例如 PF0)中。ARI Capable Hierarchy Preserved 在设备的其他 PF 中RO,值为零。
ARI Capable Hierarchy Preserved 不适用于 RCiEP,其值未定义(9.3.3.3 节)。
如果 PF 支持 10-Bit Tag Requester 能力,则其关联的 VF 也被允许支持 10-Bit Tag Requester 能力,但这可选。特别是对于大量流量同时分布在多个 VF 的使用模型,单个 VF 可能没有必要使用 10-bit Tag,以便每个 VF 可以支持超过 256 个未完成的Non-Posted Requests。
对于给定的 PF,要求其关联的 VF 全部或都不 支持 10-Bit Tag Requester能力。这避免了不必要的实施和管理复杂性。见第 10.3.5.9 节。
支持 10-Bit Tag Requester功能的 VF 具有超出其他Function类型的额外要求,以简化错误处理并降低 10-Bit Tag相关错误的可能性导致其中一个 VF 影响其他流量。
如果 SR-IOV Control register中的 VF 10-Bit Tag Requester Enable位被设置,则每个 VF θ必须对它生成的所有Non-Posted Requests使用 10-Bit Tags。
对于每个未完成的10-Bit Tag Request,如果 VF 接收到未完成请求相匹配的Completions,而Tag[9:8]不是 00b,则 VF 必须防止该请求(最终)生成Completion Timeout错误,取而代之的是通过避免数据损坏的特定设备的机制处理错误。
强烈建议软件不要将Unexpected Completion错误配置为Uncorrectable Errors。这可避免它们触发系统错误或硬件错误控制机制,如Downstream Port Containment (DPC)。
VF没有10-Bit Tag Completer Supported位
没有VF 10-Bit Tag Completer Supported位。如果 PF 支持 10-Bit Tag Completer 功能,则其所有关联的 VF 都需要支持 10-Bit Tag Completer 功能,如第 10.3.5.9 节所述。这有助于避免 PCIe 层次结构的复杂性,其中一些 Completers 支持 10-Bit Tag功能,而另一些则不支持。简单来说,VF 值必须与 PF 值相同。
VF Migration Interrupt Message Number必须包含用于与某些VF迁移事件相关联的中断消息的MSI或MSI-X向量编号。对于MSI,VF Migration Interrupt Message Number必须指出用于本节描述的某些SR事件的MSI消息编号[0 … 31]。Function需要更新此字段,以便在软件写入Message Control Register for MSI中的Multiple Message Enable字段时,如果分配给该Function的MSI Messages数量发生变化,该字段是正确的。
对于 MSI-X,VF Migration Interrupt Message Number表示用于生成中断消息的MSI-X Table条目15[0 … 2047]。
如果同时实现了MSI和MSI-X,则允许它们使用不同的向量,但软件一次只能启用一种机制。如果MSI和 MSI-X中断都被enable,则该字段未定义。
如果VF Migration Capable为0,则该字段未定义。
如果PF实现了MSI 并且软件将Multiple Message Enable 设置为小于Multiple Message Capable 的值,则可能会共享某些MSI 向量。这会创建复杂的软件结构,因为可能需要将单个向量同时指向 SR-PCIM 和 PF Device Driver。
表 9-5 定义了 SR-IOV Control字段的布局。
Bit | 寄存器 | 属性 |
---|---|---|
0 | **VF Enable | RW** |
1 | VF Migration Enable:Enables/Disables VFs, 默认值为0 | RW or RO |
2 | VF Migration Interrupt Enable:Enables/Disables VF Migration Support,默认值为0 | RW |
3 | VF MSE:VF Memory Space Enable,默认值为0 | RW |
4 | ARI Capable Hierarchy :PCI Express Endpoint:该bit在在Device最低编号的PF一定是RW,并且在所有其他 PF 中硬连线为 0b。如果该位的值为 1b,则允许设备在捕获的总线编号的Function Numbers 8 至 255 中定位 VF。否则,设备必须像非 ARI 设备一样定位 VF。该位不受任何 PF 或 VF 的 FLR 影响。默认值为 0b。RCiEP:不适用——该位必须硬连线到 0b。在RC中,始终允许将 VF 分配给First VF Offset和VF Stride规则允许的任何Function Number(第 9.3.3.8 和 9.3.3.9 节)。 | RW or RO |
5 | VF 10-Bit Tag Requester Enable:如果为1,所有VF必须对它们生成的所有非发布请求使用 10-Bit Tags。如果为0,则 VF 不得为它们生成的Non-Posted Requests使用 10-Bit Tags。见第 10.3.3.2.3 节。如果在任何 VF 具有未完成的非发布请求时软件更改了该位的值,则结果是不确定的。如果 SR-IOV 功能寄存器中的 VF 10-Bit Tag Requester Supported 位为 Clear,则允许将该位硬连线为0b。默认值为 0b。 | RW or RO |
VF Enable管理VF到关联 PF 的分配。如果设置了VF Enable,则可以在 PCIe结构中访问与PF关联的VF。设置后,VF 会根据 PCIe Endpoint Functions的规则响应并发出 PCIe 事务。
如果 VF Enable 为 Clear,则 VF 被禁用且在 PCIe结构中不可见;对这些 VF 的请求应接收 UR,并且这些VF不应发出PCIe事务。
为了允许组件执行内部初始化,在将 VF Enable位从0更改为1后,系统不许向由该 VF Enable位启用的 VF 发出请求,直到以下任一情况为真:
RC和/或系统软件必须允许在设置 VF Enable位后至少 1.0 秒,然后才能确定VF未能返回Successful Completion Status,因为有效Configuration Request已损坏。设置VF Enable位后,如果VF Enable位启用的 VF 尚未准备好为有效的Configuration Request提供Successful Completion Status,则允许由该 VF Enable位启用的 VF 将 CRS 状态最多 1.0 秒返回到配置请求。在 PF 发送Reason Code为 VF Enabled的FRS Message后,与该PF关联的任何VF都不允许返回没有介于VF 禁用或其他有效的重置条件的CRS,在向任何请求返回Successful Completion后,任何 VF 都不得返回没有介于VF 禁用或其他有效重置条件的 CRS。
由于VF没有 MSE 位(VF中的 MSE由PF中SR-IOV Extended Capability中的 VF MSE 位控制),因此软件有可能在 VF 准备好处理它之前发出Memory Request。因此,在至少满足以下条件之一之前,不得向 VF 发出Memory Request:
在向 VF 发出 FLR 或在相关联的 PF 的 SR-IOV 功能中设置了VF Enable后,VF 被允许静默丢弃Memory Requests,直到 VF 成功响应(不返回 CRS)任何请求。
Clear VF Enable 可有效破坏 VF。Set VF Enable 可有效创建 VF。在先前被清除过后设置 VF Enable 将产生一组新的 VF。如果 PF 处于 D0 power state,则新的 VF 处于D0uninitialized。如果 PF 处于lower power state,则行为未定义(参见第 9.6.1 和 9.6.2 节)。
当清除 VF Enable 时,支持 FRS 的 PF 应发送带有 FRS Reason VF Disabled 的 FRS Message以指示此操作何时完成。如果存在由 PF 或与 PF 关联的任何 VF 发出的未完成的Non-Posted Requests,则不允许 PF 发送此Message。FRS Message只能在这些Requests完成(或超时)后发送。
在 VF Enable被清除后,SR-IOV Extended Capability或VF Migration State Array( 9.3.3.15.1 节)中的任何字段都不能被访问,直到:
必须设置 VF Migration Enable 以允许此 PF 上的 VF 迁移。有关详细信息,请参阅[MR-IOV]。
如果设置了 VF Migration Capable,则该位为 RW,默认值为 0b。否则,该位为 RO 0。
当 VF Enable 被设置时,这个字段是 RO。
每当以下条件的逻辑与从 FALSE 转换为 TRUE 时,必须发送 MSI 或 MSI-X 中断消息:
使用的 MSI 或 MSI-X 向量由VF Migration Interrupt Message Number字段指示。
如果 VF Migration Capable 为 Clear,则该字段未定义。
注意:9.2.4 节描述了 VF Migration事件。
VF MSE控制与此PF关联的所有active VF的内存空间启用,就像Function的PCI Command寄存器中的Memory Space Enable位一样。 该位的默认值为 0b。
当VF Enable为 Set 时,VF存储空间只有在VF MSE为Set时才会响应。 如果在设置VF Enable且清除 VF MSE 时尝试访问VF的内存空间,则 VF 应遵循与 PCIe基本规范中定义的相同的错误报告规则。
当 VF Enable 为 Clear 时,VF 内存空间将响应 Unsupported Request。 因此,当 VF Enable 为 Clear 时,VF MSE 是“无关紧要的”; 但是,在设置VF Enable之前,软件可以选择在对VF BARn 寄存器进行编程之后设置VF MSE。
对于与Upstream Port关联的设备,ARI Capable Hierarchy是对设备的提示,即 ARI 已在设备正上方的Root Port或Switch Downstream Port中启用。 软件应设置此位以匹配设备正上方的Root Port或Switch Downstream Port中的 ARI Forwarding Enable位。
ARI Capable Hierarchy 仅出现在设备的最低编号 PF 中(例如 PF0),并影响设备的所有 PF。 ARI Capable Hierarchy在设备的其他 PF 中只读为零。
设备可以设置ARI Capable Hierarchy 来确定First VF Offset(第 9.3.3.9 节)和VF Stride (第 9.3.3.10 节)的值。 如果在任何 PF 中设置了VF Enable,则更改ARI Capable Hierarchy的效果是不确定的。 该位必须在Conventional Reset时设置为其默认值。 该位不受任何 PF 或VF的 FLR影响。 如果ARI Capable Hierarchy Preserved被设置(见第 9.3.3.2.2 节)或No_Soft_Reset 被设置(见第 9.6.2 节),则该 PF从D3Hot到D0的功耗状态转换不会影响该位的值(第 9.6.2 节)。
ARI Capable Hierarchy不适用于RCiEPs.
ARI Capable Hierarchy
对于与Upstream Port关联的设备,该设备无法知道ARI是否已启用。 如果启用了ARI,设备可以通过将VF分配给捕获的Bus Number上大于 7 的Function Numbers来保存Bus
Number。 ARI 在第 6.13 节中定义。 由于RCiEP不与Upstream Port相关联,因此 ARI 不适用,并且 VF
可以分配给 First VF Offset 和 VF Stride 允许的 Root Complex 内的任何Function
Number(参见第 9.3.3.8 节和第 9.3.3.9 节)。
表 9-6:定义了 SR-IOV Status字段布局。
Bit | 寄存器 | 属性 |
---|---|---|
0 | VF Migration Status - 表示 MR-PCIM 已发出 VF Migration或Migration Out Request。为了确定事件的原因,软件可以扫描VF State Array。 默认值为 0b。 | RW1C |
当VF Enable、VF Migration Capable和VF Migration Enable为Set且VF Migration State Array条目中发生某些状态更改时,VF Migration Status为Set(详见第 9.2.4 节和第 9.3.3.15.1 节)。
VF Migration Status的设置不受VF Migration Interrupt Enable的值或MSI或MSI-X的任何控件的影响。
InitialVFs 向 SR-PCIM 指示最初与 PF 相关联的 VF 的数量。
InitialVFs 的最小值为 0。
对于在Single-Root模式下运行的设备,该字段是 HwInit 并且必须包含与 TotalVFs 相同的值。
对于在Multi-Root模式下运行的设备,当 VF Enable 为 Clear 时,MR-PCIM 可能会更改该字段的值。
注:MR-PCIM影响该字段的机制在[MR-IOV] 中描述。
如果 VF Migration Enable 被设置,VF Enable 被清除然后设置,InitialVFs 的值可能会改变。 这是必要的,因为某些 VF 可能已迁移到其他 PF,并且可能不再可供该 PF 使用。
TotalVFs 表示可以与 PF 关联的最大 VF 数。
TotalVFs 的最小值为 0。
对于在Single-Root模式下运行的设备,该字段是 HwInit 并且必须包含与 InitialVFs 相同的值。
对于在Multi-Root模式下运行的设备,该字段的值可能会被 MR-PCIM 更改。
注:MR-PCIM影响该字段的机制在[MR-IOV] 中描述。
NumVFs 控制可见 VF 的数量。 SR-PCIM 将 NumVFs 设置为创建 VFs 过程的一部分。 在将两个 NumVFs 设置为有效值并且设置 VF Enable 后,此 VFs 数量应在 PCIe结构中可见。 可见的 VF 为其保留了一个Function编号,但可能不存在。 如果 VF 存在,它应响应针对它们的 PCIe事务,并应遵循本规范定义的所有规则。 如果满足以下任一条件,则存在 VF:
如果 NumVFs 设置为大于 TotalVFs 的值,则结果未定义。
NumVFs 只能在 VF Enable 为 Clear 时写入。 如果在设置VF Enable时写入 NumVFs,则结果未定义。
NumVFs 的初始值未定义。
设备的编程模型可能在Functions集之间具有特定依赖关系。 Function Dependency Link字段用于描述这些依赖项。
该字段描述了 PF 之间的依赖关系。 VF 依赖项与其关联 PF 的依赖项相同。
如果 PF 独立于设备的其他 PF,则该字段应包含其自己的Function Number。
如果 PF 依赖于设备的其他 PF,则该字段应包含同一功能依赖列表中下一个 PF 的Function Number。 Function Dependency List中的最后一个 PF 应包含Function Dependency List中第一个 PF 的Function Number。
如果 PFp 和 PFq 在同一个Function Dependency List中,那么任何分配给 VFp,n 的 SI 也应该分配给 VFq,n。
考虑以下场景:
SR-IOV字段 | PF0 | PF1 | PF2 |
---|---|---|---|
Function Dependency Link | 1 | 0 | 2 |
NumVFs | 4 | 4 | 6 |
First VF Offset | 4 | 4 | 4 |
VF Stride | 3 | 3 | 3 |
Function Number | Description | Independent |
---|---|---|
0 | PF 0 | No |
1 | PF 1 | No |
2 | PF2 | Yes |
3 | Function不存在 | |
4 | VF 0,1 | No |
5 | VF 1,1 | No |
6 | VF 2,1 | Yes |
7 | VF 2,2 | No |
8 | VF 1,2 | No |
9 | VF 2,2 | Yes |
10 | VF 0,3 | No |
11 | VF 1,3 | No |
12 | VF 2,3 | Yes |
13 | VF 0,4 | No |
14 | VF 1,4 | No |
15 | VF 2,4 | Yes |
16 to 17 | Function不存在 | |
18 | VF 2,5 | Yes |
19 to 20 | Function不存在 | |
21 | VF 2,6 | Yes |
22 to 255 | Function不存在 |
在此示例中,Functions 4 和 5 必须分配给相同的 SI。 同样,Functions 7 和 8、10 和 11 以及 13 和 14 必须一起分配。 如果 PF 分配给 SI,则Functions 0 和 1 也必须一起分配。 Functions 2、6、9、12、15、18 和 21 是独立的,可以以任何方式分配给 SI。
Function Dependency List的所有 PF 的 InitialVFs、TotalVFs 和 VF Migration Capable 字段应具有相同的值。
SR-PCIM 应确保在 Function Dependency List中的任何 VF 分配给 SI 之前, Function Dependency List中的所有 PF 的 NumVFs、VF Enable和VF Migration Enable字段具有相同的值。
VF Migration和VF Mapping操作对每个 VF 独立进行。 SR-PCIM 不应该将 VF 分配给 SI,直到它可以分配所有相关的 VF。 例如,使用上述场景,如果 VF 0,2(功能 7)和 VF 1,2(功能 8)都处于 Inactive.Unavailable 或 Dormant.MigrateIn 状态,则 SR-PCIM 不应将任一 VF 分配给 SI 直到两个 VF 都达到 Active.Available 状态。
类似地,SR-PCIM 不应从 SI 中删除 VF,直到它可以删除所有相关的 VF。 例如,使用上述场景,只有当 VF 0,2 和 VF 1,2 都达到 Active.MigrateOut 状态时,才应从 SI 中删除它们。 在 SI 停止使用所有相关Functions之前,SR-PCIM 不应将功能转换为 Inactive.Unavailable。
First VF Offset 是一个常量,它定义了与包含此 Capability 结构的 PF 相关联的第一个 VF 的Routing ID 偏移量。 第一个 VF 的 16 位Routing ID 是通过将此字段的内容添加到包含此字段的 PF 的Routing ID 来计算的,忽略任何进位,使用无符号16 位算法。
VF 不应位于数字小于其关联 PF 的Bus Number上。
当编号最低的 PF 的 ARI Capable Hierarchy 值更改或此 PF 的 NumVFs 值更改时,此字段可能会更改值。
注意:如果 NumVFs 为 0,则不使用 First VF Offset。如果 NumVFs 大于 0,则 First VF Offset 不得为零。
VF Stride 定义了与包含此 Capability 结构的 PF 相关联的所有 VF 从一个 VF 到下一个 VF 的Routing ID 偏移。 下一个 VF 的 16 位Routing ID 是通过将此字段的内容添加到当前 VF 的Routing ID 来计算的,忽略任何进位,使用无符号16 位算法。
当编号最低的 PF 的 ARI Capable Hierarchy 值更改或此 PF 的 NumVFs 值更改时,此字段可能会更改值。
注意:如果 NumVFs 为 0 或 1,则不使用VF Stride。如果 NumVFs 大于 1,则VF Stride不得为零。
该字段包含应该为每个 VF 呈现给 SI 的Device ID。
VF Device ID 可能与 PF Device ID 不同。 VF Device ID 必须由供应商管理。 供应商必须确保所选的 VF Device ID 不会导致使用不兼容的设备驱动程序。
该字段指示 PF 支持的page大小。 如果位 n 被设置,则该 PF 支持 2n+12 的page大小。 例如,如果位 0 被设置,PF 支持 4 KB page大小。 PF 需要支持 4-KB、8-KB、64-KB、256-KB、1-MB 和 4-MB 的page大小。 所有其他页面大小都是可选的。
page大小描述了 VF BAR 资源的最低align要求,如第 9.3.3.13 节所述。
非预取地址空间仅限于 4 GB 以下的地址。 32 位系统中的预取地址空间也是有限的。 强烈鼓励供应商利用System Page Size功能来节省地址空间,同时支持具有更大page size的系统。
该字段定义了系统将用于映射 VF 内存地址的page大小。 软件必须将 System Page Size 的值设置为 Supported Page Sizes 字段中设置的page大小之一(请参阅第 9.3.3.12 节)。 与支持的page大小一样,如果在系统page大小中设置了位 n,则与此 PF 关联的 VF 需要支持 2n+12 的page大小。 例如,如果位 1 被设置,则系统使用 8 KB 的page大小。 如果System Page Size为零,则结果未定义。 如果在 System Page Size 中设置了一位以上,则结果是不确定的。 如果在Supported Page Sizes中未设置,而在System Page Size中设置了该bit,则结果未定义。
设置System Page Size时,此 PF 关联的 VF需要与System Page Size边界上的所有 BAR 资源对齐。 每个 VF BARn 或 VF BARn 对(参见第 9.3.3.14 节)应在System Page Size边界上对齐。 定义非零地址空间的每个 VF BARn 或 VF BARn 对的大小应被调整为消耗System Page Size字节的整数倍。 在 VF 中需要page大小对齐的所有数据结构都应在System Page Size边界上对齐。
写入 System Page Size 时,VF Enable 必须为零。 如果在设置VF Enable时写入System Page Size,则结果未定义。
默认值为 0000 0001h(即 4 KB)。
这些字段必须定义 VF 的Base Address Registers(BAR)。 这些字段的行为与正常的 PCI BAR 相同,如第 7.5.1 节所述。 它们可以通过写全 1 并读回 BAR 的内容来调整大小,如第 7.5.1.2.1 节所述,符合定义 BAR 类型字段的低位。
这些字段的属性可能会受到 VF Resizable BAR Extended Capability(见第 9.3.7.5 节)的影响。
每个 BAR 解码的地址空间量应为 System Page Size 的整数倍。
每个 VF BARn,当通过写 1 和读回内容来“调整大小”时,描述了每个 BAR 消耗的地址空间量和单个VF所需的对齐方式。 当使用实际地址值写入并且 VF Enable 和 VF MSE 被设置时,BAR 映射 NumVFs BAR。 换言之,base address是与该 PF 相关联的第一个 VF BARn 的地址,所有后续 VF BARn 地址范围如下所述。
VF BAR 应仅支持 32 位和 64 位内存空间。 VF 不支持 PCI I/O Space。 除了用于映射 64 位内存 VF BAR 对的高 32 位的 VF BARx 外,任何已实现的 VF BARx 的位 0 必须是 RO 0b。
对齐要求和读取大小是针对单个 VF,但是当 VF Enable 为 Set 且 VF MSE 为 Set 时,BAR 包含所有 (NumVFs) VF BARn 的base address。
确定 VF BARn 映射的地址空间量的算法与标准 BAR 算法的不同之处如下:
对于每个 VF BARn 字段,n 对应于 VFs BAR 空间之一。 表 9-7 显示了 n 和Function的 BAR 之间的关系。
n | Type 0 Header的BAR Offset |
---|---|
0 | 10h |
1 | 14h |
2 | 18h |
3 | 1Ch |
4 | 20h |
5 | 24h |
更改System Page Size后,所有 VF BARn 寄存器的内容都不确定。
如果 VF Migration Capable(第 9.3.3.2.1 节)设置并且 TotalVFs(第 9.3.3.6 节)不为零,则该寄存器应包含一个指向VF Migration State Array的 PF BAR 相关指针。 如果VF Migration Capable清除,则该寄存器为 RO 0。 VF Migration State Array在第 9.3.3.15.1 节中定义。 VF Migration State Array的布局在表 9-8 中定义。
Bit | Register | 属性 |
---|---|---|
2:0 | VF Migration State BIR - 指示Function的哪个Base Address寄存器(位置从Configuration Space中的 10h 开始)用于将Function的VF Migration State Array映射到Memory Space。 | RO |
31:3 | VF Migration State Offset- 一个Function的Base Address包含的地址的偏移量,以指向 VF Migration State Array的基址。 低三位 VF Migration State BIR被软件屏蔽(设置为零)以形成 32 位 QW 对齐偏移。 如果 TotalVFs 为 0,则此字段未定义。 | RO |
如果为VF Migration State Array映射地址空间的BAR还映射了与VF Migration无关的其他可用地址空间,则其他地址空间中使用的位置不得与VF Migration State Array驻留的位置共享任何自然对齐的8KB地址范围。
VF Migration State Array使用SR-IOV Extended Capability块的VF Migration State Array Offset寄存器定位。
VF Migration State Array对于每个VF 都有一个VF Migration State Entry。 VF Migration State数组的总大小为NumVFs字节。 如果TotalVFs为0,则 VF Migration State Array不应存在。表9-9定义了VF Migration State Array的布局。
Bit | 寄存器 | 属性 |
---|---|---|
1:0 | VF Migration State - 相关 VF 的状态。 当VF Enable为Clear时,该字段未定义。 VF Migration State Array的初始值在9.2.4.1节中描述。 | RO |
表9-10列出了VF Migration State各种值的含义。
VF State | VF Exists | Description |
---|---|---|
00b | No | Inactive.Unavailable -VF 不存在于 SR 中,也不会移入或移出。 |
01b | No | Dormant.MigrateIn -VF 可供 SR 使用。 VF 存在但无法发起事务。 |
10b | Yes | Active.MigrateOut - 已要求 SR 放弃使用 VF。 |
11b | Yes | Active.Available - 功能齐全。 可以分配给 SI。 |
VF Migration State Array的初始值在9.2.4.1 节中描述。VF Migration State Array在VF Enable用被清除后的 1.0 秒内返回到 9.2.4.1节中描述的配置。
软件通过向entry写入新的状态值来启动状态转换。
有效的状态转换在表9-11和表9-12中列出,并在图9-12中显示。SR只能请求表9-11中的更改。表9-12中的更改由MR-PCIM使用[MR-IOV]机制发起,并具有此处描述的SR可见效果。任何由SR-PCIM发出且未在表9-11中列出的转换都将被忽略并且不会更改VF状态。
Current State | New State | Change Initiated By | SR Visible Effects of Change |
---|---|---|---|
Dormant.MigrateIn | Active.Available | SR-PCIM | VF Activate VF now exists |
Active.Available | Dormant.MigrateIn | SR-PCIM | VF Deactivate VF no longer exists |
Active.MigrateOut | Inactive.Unavailable | SR-PCIM | VF Migrate Out Complete VF no longer exists |
Current State | New State | Change Initiated By | SR Visible Effects of Change |
---|---|---|---|
Active.Available | Active.MigrateOut | MR-PCIM | VF Migrate Out Request VF continues to exist. Sets VF Migration Status |
Inactive.Unavailable | Dormant.MigrateIn | MR-PCIM | VF Migrate In Request VF remains non-existent. Sets VF Migration Status |
Dormant.MigrateIn | Inactive.Unavailable | MR-PCIM | VF Migrate In Retract VF remains non-existent. Sets VF Migration Status |
Active.MigrateOut | Active.Available | MR-PCIM | VF Migrate Out Retract VF continues to exist. Sets VF Migration Status |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。