CXL 访问坐标计算

延迟和带宽计算

内存区域性能坐标(延迟和带宽)通常通过 ACPI 表 SRATHMAT 提供。但是,平台固件 (BIOS) 无法为热插拔的 CXL 设备注释这些信息,因为它们在平台固件初始化期间不存在。CXL 驱动程序可以通过从多个组件检索数据来计算性能坐标。

SRAT 提供了一个通用端口亲和性子表,该子表将邻近域绑定到设备句柄,在这种情况下,该句柄将是 CXL 主桥。使用此关联,可以从 HMAT 子表中检索通用端口的性能坐标。这部分表示 CPU 和通用端口(CXL 主桥)之间的性能坐标。

CDAT 提供了 CXL 设备本身的性能坐标。即访问该设备内存区域的带宽和延迟。DSMAS 子表提供了一个 DSMADHandle,它绑定到设备物理地址 (DPA) 范围。DSLBIS 子表提供了与 DSMADhandle 绑定的性能坐标,并将两个表条目绑定在一起,从而为每个 DPA 区域提供性能坐标。例如,如果设备导出一个 DRAM 区域和一个 PMEM 区域,那么每个区域将具有不同的性能特征。

如果拓扑中存在 CXL 交换机,则交换机的性能坐标由 SSLBIS 子表提供。这提供了用于遍历交换机的带宽和延迟,从交换机上游端口到指向端点设备的交换机下游端口。

简单的拓扑示例

GP0/HB0/ACPI0016-0
       RP0
        |
        | L0
        |
    SW 0 / USP0
    SW 0 / DSP0
        |
        | L1
        |
       EP0

在此示例中,端点和根端口之间有一个 CXL 交换机。本示例中的延迟计算如下: L(EP0) - 来自 EP0 CDAT DSMAS+DSLBIS 的延迟 L(L1) - EP0 和 SW0DSP0 之间的链路延迟 L(SW0) - 来自 SW0 CDAT SSLBIS 的交换机延迟。 L(L0) - SW0 和 RP0 之间的链路延迟 L(RP0) - 通过 SRAT 和 HMAT(通用端口)从根端口到 CPU 的延迟。总读取和写入延迟是所有这些部分的总和。

本示例中的带宽计算如下: B(EP0) - 来自 EP0 CDAT DSMAS+DSLBIS 的带宽 B(L1) - EP0 和 SW0DSP0 之间的链路带宽 B(SW0) - 来自 SW0 CDAT SSLBIS 的交换机带宽。 B(L0) - SW0 和 RP0 之间的链路带宽 B(RP0) - 通过 SRAT 和 HMAT(通用端口)从根端口到 CPU 的带宽。总读取和写入带宽是所有这些部分中的 min()。

要计算链路带宽: LinkOperatingFrequency (GT/s) 是当前协商的链路速度。 DataRatePerLink (MB/s) = LinkOperatingFrequency / 8 带宽 (MB/s) = PCIeCurrentLinkWidth * DataRatePerLink 其中 PCIeCurrentLinkWidth 是链路中的通道数。

要计算链路延迟: LinkLatency (皮秒) = FlitSize / LinkBandwidth (MB/s)

有关详细信息,请参见 CXL 内存设备 SW 指南 r1.0,第 2.11.3 和 2.11.4 节。

最后,构造的内存区域的访问坐标是从每个 CXL 设备的一个或多个内存分区计算得出的。

QTG ID

每个 CEDT 都有一个 QTG ID 字段。此字段提供与 CFMWS 窗口的 QoS 节流组 (QTG) 关联的 ID。一旦计算出访问坐标,就可以向 ACPI0016 设备发出 ACPI 设备特定方法,以检索 QTG ID,具体取决于提供的访问坐标。该设备的 QTG ID 可用作匹配 CFMWS 的指导,以设置设备的最佳 Linux 根解码器性能。