PCIe ACS机制分析
本文基于 PCI Express Base Specification Revision 6.0,重点总结
Access Control Services (ACS)和ACS Extended Capability。
1. 概述
1.1 定义
ACS(Access Control Services)是在 PCIe 拓扑中设置的一组访问控制点,用来判断一个 TLP 应该正常路由或被阻断,还是被重定向到上游 Root Complex 处理。ACS 适用于 Root Complex、Switch 和 Multi-Function Device 中的相关 Function。
从行为上看,ACS 不是单一开关,而是一组硬件能力和软件可配置控制位。硬件通过 ACS Extended Capability 报告支持哪些控制机制,软件再通过 ACS Control Register 启用对应功能。
1.2 目的
ACS 的核心目的是增强 PCIe 拓扑内的访问隔离,尤其是控制 peer-to-peer(P2P)访问。没有 ACS 时,两个位于同一 Switch 或同一设备内部的 Function 可能直接通信,绕过 Root Complex、Translation Agent 或 IOMMU 之类的上游访问控制逻辑。
启用 ACS 后,系统可以让可疑或需要校验的 P2P Request 走上游路径,由 Root Complex 进行验证;也可以直接阻断不允许的访问,并报告 ACS Violation。
1.3 主要用途
ACS 主要用于以下场景:
- 限制设备之间的 P2P 访问,避免不受控的数据路径。
- 支持虚拟化和设备直通场景中的隔离需求。
- 配合 Translation Agent,使来自虚拟机或设备的 DMA Request 经过地址翻译。
- 通过 P2P Request Redirect、P2P Egress Control 等机制,把访问控制决策集中到 Root Complex 或指定控制点。
- 在发生非法访问时,通过 ACS Violation、AER 日志和 Target Abort 状态帮助定位问题。
下图展示了 ACS 在一个典型 Host、Root Complex、Switch、Endpoint 拓扑中的位置和作用:
图中的黄色节点表示 ACS 控制点。对于 EP A 到 EP B 的 P2P 访问,ACS 可以允许其直接路由,也可以将 Request 重定向到 Root Complex,由上游验证逻辑决定是否转发到下游目标,或者报告 ACS Violation。
2. 适用对象
ACS 不只等价于“桥端口属性”。它既可以是 Root Port、Switch Downstream Port 上的端口级控制,也可以是 Multi-Function Device 内部的 Function 级控制,用来覆盖可能绕过 Root Complex、Translation Agent 或 IOMMU 的 P2P/内部访问路径。
| 对象 | 实现或规范要求 | 主要作用 |
|---|---|---|
| Root Port |
| 控制不同 Hierarchy Domain 之间的 P2P 访问。被重定向到 Root Complex 的 Request 由内部验证逻辑决定是转发到目标,还是阻断为 ACS Violation。 |
| Switch Downstream Port |
| 控制从某个下游端口进入 Switch 的上游 Request 是否允许访问其他下游端口、是否需要重定向上游,或者是否作为违规访问处理。 |
| Switch Upstream Port |
| 补充 Downstream Port 之外的 Function 级保护,避免误解为 Switch Upstream Port 一定没有 ACS 属性。 |
| Multi-Function Device Function |
| 控制同一设备内部不同 Function 之间的 P2P 访问;可以将 Function 间 Request 重定向到上游 Root Complex,或者按 Function Number / Function Group 做细粒度控制。 |
| SR-IOV 设备 |
| 控制 PF/VF 或 VF/VF 之间的直接访问路径,满足虚拟化场景下的设备隔离需求。 |
| RCiEP |
| 降低 RCiEP 发起访问绕过地址翻译或隔离逻辑的风险。 |
3. 控制机制
3.1 Source Validation
Source Validation 用于检查 Upstream 方向的 Request 的 Requester ID 是否合理。对于 Downstream Port,它会检查 Requester ID 中的 Bus Number 是否属于该 Downstream Port 对应虚拟桥的 secondary side。
判断方式可以包括:
- Requester ID 是否落在 Secondary Bus Number 到 Subordinate Bus Number 的 bus aperture 内。
- 如果实现并启用了 FPB,Requester ID 是否通过 FPB Routing ID 机制被识别为该桥的 secondary side。
如果检查失败,该 Request 被报告为 ACS Violation。Completion 不受 Source Validation 影响。
3.2 Translation Blocking
Translation Blocking 用于阻断携带非默认 Address Type(AT)字段的 Upstream 方向的 Memory Request。启用后,Downstream Port 检查每个 Upstream 方向的 Memory Request 的 AT 字段,如果 AT 不是 default,则报告 ACS Violation。
该错误优先级高于 ACS Upstream Forwarding 和其他 P2P 控制机制。Completion 不受 Translation Blocking 影响。
3.3 P2P Request Redirect
P2P Request Redirect 控制 P2P Request 是否被重定向上游。
在 Switch Downstream Port 中,启用后,P2P Request 必须被重定向到 Root Complex 方向。在 Root Port 中,启用后,P2P Request 会进入 Root Complex 内部的 Redirected Request Validation 逻辑。该逻辑可以决定将 Request 转发到原始目标,或将其阻断为 ACS Violation。
Downstream 方向的 Request 不会被 Downstream Port 通过该机制重定向。Completion 不受 P2P Request Redirect 影响。
3.4 P2P Completion Redirect
P2P Completion Redirect 用于避免 P2P Request 被重定向后造成 Completion 与 Request 的排序规则问题。
启用后,非 Relaxed Ordering 的 P2P Completion 需要被重定向上游;如果 Completion 设置了 Relaxed Ordering,则可以正常路由。P2P Completion Redirect 不参与 Request 的访问控制判断,Request 也不受该机制影响。
3.5 Upstream Forwarding
Upstream Forwarding 用于处理已经被下游 ACS 组件重定向上游的 TLP。
对于 Switch Downstream Port,如果其 Ingress Port 收到一个 Upstream 方向的 Request 或 Completion,且正常路由目标是该 Port 自己的 Egress Port,则在启用 Upstream Forwarding 时必须继续向上游转发。对于 Root Port,类似 TLP 会按 Root Port 自己重定向 Request 或 Completion 的方式处理。
如果拓扑中启用了 P2P Request Redirect 或 P2P Completion Redirect,相关路径上的 Root Port 和中间 Switch 通常需要支持 Upstream Forwarding,否则对被重定向 TLP 的处理是未定义的。
3.6 P2P Egress Control
P2P Egress Control 是可选机制,用于更细粒度地控制哪些 P2P Request 可以到达哪些 Egress Port 或 Function。
在 Switch 中,它可以配置某个 Downstream Port 是否允许向其他 Downstream Port 发起 P2P Request。在 Root Complex 中,它可以配置某个 Root Port / Hierarchy Domain 是否允许向其他 Root Port / Hierarchy Domain 发起 P2P Request。在 Multi-Function 或 SR-IOV capable 设备中,它可以按 Function Number 或 Function Group 控制 Function 之间的 P2P 访问。
P2P Egress Control 的判断发生在发送侧,也就是 Ingress Port 或发送 Function。Completion 不受该机制影响。
3.7 Direct Translated P2P
Direct Translated P2P 与 ATS 场景相关。启用后,如果 P2P Memory Request 的 AT 字段表示 Translated address,则该 Request 必须直接路由到 peer Port 或 peer Function,不受 P2P Request Redirect 和 P2P Egress Control 的影响。
其他 P2P Request 仍然要接受 P2P Request Redirect 和 P2P Egress Control 的判断。Completion 不受 Direct Translated P2P 影响。
需要注意的是,如果 ACS Translation Blocking Enable 为 1,则 ACS Direct Translated P2P Enable 被忽略,因为 Translation Blocking 会优先阻断非 default AT 的 Upstream 方向的 Memory Request。
3.8 I/O Request Blocking
I/O Request Blocking 是 ACS Enhanced Capability 引入的机制。启用后,Downstream Port Ingress 收到的 Upstream 方向的 I/O Request 必须作为 ACS Violation 处理。
该机制用于扩展原始 ACS 对 Memory/P2P 访问之外的保护范围。
3.9 DSP Memory Target Access
DSP Memory Target Access 控制 Upstream 方向的 Request 访问 Downstream Port 或 Root Port 相关 Memory BAR Space 时的处理方式。
该控制可以选择:
- 直接访问目标;
- 阻断 Request;
- 将 Request 重定向上游。
在 Switch 中,所有 Downstream Port 都属于适用对象,包括接收该 Request 的 Ingress Port 自身。在 Root Complex 中,适用 Root Port 集合由实现决定,但至少包括接收 Request 的 Root Port。
3.10 USP Memory Target Access
USP Memory Target Access 只适用于 Switch Downstream Port,不适用于 Root Port。它控制 Upstream 方向的 Request 访问 Switch Upstream Port 相关 Memory BAR Space 时的处理方式。
该控制同样可以选择直接访问、阻断或重定向。如果 Upstream Port 还关联了 Switch Upstream Port 之外的其他 Function,则该字段不控制这些 Function 的 Memory BAR Space;这些访问由对应 Function 自己的 ACS Extended Capability 控制。
3.11 Unclaimed Request Redirect
Unclaimed Request Redirect 适用于支持 ACS Enhanced Capability 的 Switch Downstream Port,不适用于 Root Port。
当一个进入 Switch Downstream Port Ingress 的 Request 落在 Switch Upstream Port 的 memory window 内,但不属于 Switch 内任何 Downstream Port 的 memory window 或 Memory BAR Target 时:
- 如果启用 Unclaimed Request Redirect,该 Request 被重定向上游离开 Switch;
- 如果未启用,该 Request 由 Switch Downstream Port 按 Unsupported Request(UR)处理。
4. P2P 控制组合
4.1 P2P Request 路径
对每个 P2P Request,ACS 可能让它进入三类处理路径:
- 正常路由到 peer 目标;
- 立即阻断并报告 ACS Violation;
- 重定向上游到 Root Complex,由上游验证逻辑决定后续处理。
P2P Completion 的重定向不由这些 Request 控制组合决定,而是由 P2P Completion Redirect 独立决定。
4.2 Direct Translated P2P 优先级
如果某个 Port 或 Function 启用了 ACS Direct Translated P2P,且 P2P Memory Request 的 AT 字段表示 Translated address,则该 Request 必须直接路由到 peer Port 或 peer Function。
这一路径优先于 ACS P2P Request Redirect 和 ACS P2P Egress Control。也就是说,对于 Translated P2P Memory Request,只要 Direct Translated P2P 生效,Redirect 和 Egress Control 不再改变它的 P2P 路由。
4.3 Redirect 与 Egress Control
对于不受 Direct Translated P2P 覆盖的 P2P Request,其处理由三个值共同决定:
E:ACS P2P Egress Control Enable;R:ACS P2P Request Redirect Enable;V:与目标 Egress Port、Root Port、Function 或 Function Group 对应的 Egress Control Vector bit。
| E | R | V | P2P Request 处理 |
|---|---|---|---|
| 0 | 0 | X - Don’t Care | 直接路由到 P2P 目标 |
| 0 | 1 | X - Don’t Care | 重定向上游 |
| 1 | 0 | 1 | 作为 ACS Violation 处理 |
| 1 | 0 | 0 | 直接路由到 P2P 目标 |
| 1 | 1 | 1 | 重定向上游 |
| 1 | 1 | 0 | 直接路由到 P2P 目标 |
可以看出,Egress Control Vector bit 为 1 时表示该目标受控。当 Redirect 未启用时,受控目标会被阻断;当 Redirect 启用时,受控目标会被重定向上游。
4.4 Egress Control Vector
Egress Control Vector 是 ACS P2P Egress Control 的位图。它的大小由 ACS Capability Register 中的 Egress Control Vector Size 字段给出。
对于 Root Port 和 Switch Downstream Port,位图中的每一位对应一个 Port Number。对于 Multi-Function Device 中的 Function,位图中的每一位对应一个或多个 Function Number,或者在 ARI Function Group 模式下对应 Function Group Number。
实现该 ACS Extended Capability 的 Function 自身对应的 bit 必须硬连为 0。对于 Root Complex,如果某些 Port Number 表示内部 Port,则对应 bit 也需要硬连为 0。
4.5 Completion Redirect
P2P Completion Redirect 只控制 P2P Completion,不参与 Request 的 allow / block / redirect 决策。
当启用 P2P Completion Redirect 时,非 Relaxed Ordering 的 P2P Completion 会被重定向上游。其目的是让这些 Completion 与已经被重定向的 Posted Request 走一致路径,从而避免 Completion 越过 Posted Request 造成 ordering violation。
4.6 Ordering 影响
ACS Redirect 会改变部分 TLP 的路径,因此可能影响 PCIe ordering rules。
一种典型风险是:P2P Posted Request 被重定向上游,而后续非 Relaxed Ordering 的 P2P Completion 仍直接路由,导致 Completion 实际上越过了 Posted Request。P2P Completion Redirect 可以避免这种情况,但会增加延迟,并可能增加 Link 和 Root Complex 拥塞。
另一种风险出现在 ACS P2P Request Redirect 和 ACS Direct Translated P2P 同时启用时:Translated P2P Memory Request 直接路由,而其他 P2P Request 被重定向,两类 Request 可能走不同路径。软件只有在确认不会破坏正确性时,才应同时启用这些机制。
5. 错误处理
5.1 Violation 触发场景
ACS Violation 可以由硬件缺陷、软件配置错误或非法访问引起。常见触发场景包括:
- Source Validation 检查 Requester ID 失败;
- Translation Blocking 检测到非 default AT 的 Upstream 方向的 Memory Request;
- P2P Egress Control 判定某个 P2P Request 不允许直接访问;
- I/O Request Blocking 阻断 Upstream 方向的 I/O Request;
- DSP / USP Memory Target Access 控制字段选择阻断;
- Root Complex Redirected Request Validation 不允许某个被重定向的 Request。
5.2 Non-Posted Request 处理
当 ACS Violation 涉及 Non-Posted Request 时,作为 Completer 的 ACS 组件必须返回一个 Completion,并将 Completion Status 设置为 Completer Abort(CA)。
虽然 Completion Status 使用 CA,但错误日志应记录为 ACS Violation,而不是普通 Completer Abort。这样软件可以区分真正的访问控制违规和一般完成器异常。
5.3 AER 日志
规范建议 ACS 组件实现 AER,以便在出现 ACS Violation 时提供更好的故障定位能力。
AER 的 Header Log 和 Prefix Log 可以记录违规 Request 的头部或前缀信息。ACS Violation Status、Mask 和 Severity 位可以明确标识该错误,并控制错误是否被屏蔽以及按何种严重性上报。
在 AER 的 Uncorrectable Error Status、Mask 和 Severity Register 中,ACS Violation对应 bit 21:
5.4 Target Abort
发生 ACS Violation 时,Completer 还需要设置其 Status Register 或 Secondary Status Register 中合适的 Signaled Target Abort 位。如果违规 Request 是 Non-Posted Request,则 Requester 收到 CA Completion 后,也需要设置对应的 Received Target Abort 位。
在 Status Register 和 Secondary Status Register 中,Signaled Target Abort对应 bit 11,Received Target Abort对应 bit 12:
5.5 RC Validation 失败
通常情况下,检测到 ACS Violation 的 ACS 组件也是 Completer。一个例外是 Root Complex 的 Redirected Request Validation 逻辑拒绝被重定向的 Request。
如果该 Request 是通过 Root Port 重定向来的,则对应 Root Port 作为 Completer。如果该 Request 来自 RCiEP,则相关 Root Complex Event Collector 作为 Completer。
6. ACS Extended Capability
6.1 结构布局
ACS Extended Capability 是 PCIe Extended Capability 链表中的一个可选 Capability,用于报告和控制 ACS 功能。其 Capability ID 为000Dh,Capability Version 在 PCIe 6.0 中为1h。
结构布局如下:
| Offset | 内容 |
|---|---|
00h | ACS Extended Capability Header |
04h | ACS Capability Register 与 ACS Control Register |
08h | Egress Control Vector Register,如果需要 |
0Ch+ | 额外的 Egress Control Vector DWORD,如果需要 |
6.2 ACS Extended Capability Header
ACS Extended Capability Header 是标准 PCIe Extended Capability Header,包含:
PCI Express Extended Capability ID:ACS 的 ID 为000Dh。Capability Version:PCIe 6.0 中必须为1h。Next Capability Offset:指向下一个 Extended Capability,若不存在则为000h。
6.3 ACS Capability Register
ACS Capability Register 位于 offset04h,用于只读报告硬件支持的 ACS 功能。
| Bit | 名称 | 含义 |
|---|---|---|
| 0 | ACS Source Validation | 支持 Source Validation |
| 1 | ACS Translation Blocking | 支持 Translation Blocking |
| 2 | ACS P2P Request Redirect | 支持 P2P Request Redirect |
| 3 | ACS P2P Completion Redirect | 支持 P2P Completion Redirect |
| 4 | ACS Upstream Forwarding | 支持 Upstream Forwarding |
| 5 | ACS P2P Egress Control | 支持 P2P Egress Control |
| 6 | ACS Direct Translated P2P | 支持 Direct Translated P2P |
| 7 | ACS Enhanced Capability | 支持 Enhanced Capability 相关机制 |
| 15:8 | Egress Control Vector Size | 指示 Egress Control Vector 的 bit 数 |
如果某功能对该 Function 类型不适用,或者硬件未实现,对应 capability bit 必须硬连为 0。若 ACS P2P Egress Control bit 为 0,则 Egress Control Vector Size 字段未定义,Egress Control Vector Register 不要求存在。
6.4 ACS Control Register
ACS Control Register 位于 offset06h,用于由软件启用或配置 ACS 功能。主要字段如下:
| Bit | 名称 | 作用 |
|---|---|---|
| 0 | ACS Source Validation Enable | 启用 Requester ID bus number 检查 |
| 1 | ACS Translation Blocking Enable | 阻断非 default AT 的 Upstream 方向的 Memory Request |
| 2 | ACS P2P Request Redirect Enable | 控制 P2P Request 是否重定向上游 |
| 3 | ACS P2P Completion Redirect Enable | 控制非 RO P2P Completion 是否重定向上游 |
| 4 | ACS Upstream Forwarding Enable | 转发由下游组件重定向上游的 TLP |
| 5 | ACS P2P Egress Control Enable | 结合 Egress Control Vector 控制 P2P Request |
| 6 | ACS Direct Translated P2P Enable | 允许 Translated P2P Memory Request 直接路由 |
| 7 | ACS I/O Request Blocking Enable | 将 Upstream 方向的 I/O Request 作为 ACS Violation |
| 9:8 | ACS DSP Memory Target Access Control | 控制访问 Downstream Port / Root Port Memory BAR Space 的 Request |
| 11:10 | ACS USP Memory Target Access Control | 控制访问 Switch Upstream Port Memory BAR Space 的 Request |
| 12 | ACS Unclaimed Request Redirect Control | 控制未声明 Memory Space Request 是否重定向上游 |
主要 enable bit 的默认值均为 0。如果某功能没有实现,对应 control bit 必须硬连为 0 或作为保留位处理。
DSP / USP Memory Target Access Control 的编码为:
| 编码 | 含义 |
|---|---|
00b | Direct Request access enabled |
01b | Request blocking enabled |
10b | Request redirect enabled |
11b | Reserved |
6.5 Egress Control Vector Register
Egress Control Vector Register 位于 offset08h,在支持 ACS P2P Egress Control 时提供一个可读写 bit-array。bit-array 的长度由 Egress Control Vector Size 字段指定。
对于任意 bitK,其所在 DWORD offset 和 bit number 为:
DWORD offset = 08h + (K div 32) * 4 DWORD bit# = K mod 32如果 bit-array 横跨多个 DWORD,则后续 DWORD 从0Ch开始连续排列。超出 Egress Control Vector Size 指定范围的 bit 为保留位。
在 ARI Device 中,如果启用了 ACS Function Groups,则前 8 个 Egress Control Vector bit 对应 Function Group Number,而不是 Function Number。此时访问控制按 Function Group 粒度执行。
7. 总结
7.1 核心价值
ACS 的核心价值是为 PCIe 拓扑提供可配置的访问控制点,使系统能够判断 P2P Request 是直接路由、阻断,还是重定向上游验证。将原本可能绕过 Root Complex 的设备间访问纳入可控路径,从而提高系统隔离能力。
7.2 隔离关系
ACS 与系统隔离能力密切相关。对于虚拟化、SR-IOV、设备直通等场景,软件通常需要确保设备发起的 DMA 或 P2P Request 不会绕过 Translation Agent、IOMMU 或 Root Complex 中的访问验证逻辑。
ACS 通过 Source Validation、P2P Redirect、Egress Control、Translation Blocking 和 Enhanced Capability 机制,覆盖 Requester ID、地址类型、P2P 目标、Memory BAR 访问和未声明地址区域等多个风险点。
7.3 配置注意点
配置 ACS 时需要注意以下问题:
- ACS 硬件功能默认关闭,需要 ACS-aware 软件启用。
- 未实现的 capability 对应 control bit 不能被软件当作可用功能。
- P2P Request Redirect 依赖路径上的 Upstream Forwarding 支持,否则重定向 TLP 的处理可能未定义。
- P2P Completion Redirect 可以解决部分 ordering 风险,但会带来延迟和拥塞开销。
- Direct Translated P2P 能优化 ATS 场景下的性能,但可能与 Redirect 组合产生不同路径导致的 ordering 风险。
- Enhanced Capability 扩展了对 I/O Request、Memory BAR 目标和 unclaimed memory request 的处理能力,适合需要更完整隔离的系统。
