海思 SoC Uncore 性能监控单元 (PMU)

海思 SoC 芯片包含各种独立的系统设备 PMU,例如 L3 缓存 (L3C)、Hydra Home Agent (HHA) 和 DDRC。 这些 PMU 是独立的,并具有硬件逻辑来收集统计数据和性能信息。

海思 SoC 封装了多个 CPU 和 IO 芯片。 每个 CPU 集群 (CCL) 由 4 个共享一个 L3 缓存的 CPU 核心组成; 每个 CPU 芯片称为超级 CPU 集群 (SCCL),由 6 个 CCL 组成。 每个 SCCL 分别有两个 HHA (0 - 1) 和四个 DDRC (0 - 3)。

海思 SoC uncore PMU 驱动程序

每个设备 PMU 都有单独的寄存器用于事件计数、控制和中断,PMU 驱动程序应注册 perf PMU 驱动程序,例如 L3C、HHA 和 DDRC 等。 可用事件和配置选项应在 sysfs 中描述,请参阅

/sys/bus/event_source/devices/hisi_sccl{X}_<l3c{Y}/hha{Y}/ddrc{Y}>。“perf list”命令应列出 sysfs 中的可用事件。

每个 L3C、HHA 和 DDRC 都注册为 perf 的单独 PMU。 PMU 名称将在事件列表中显示为 hisi_sccl<sccl-id>_module<index-id>。 其中“sccl-id”是 SCCL 的标识符,“index-id”是模块的索引。

例如 hisi_sccl3_l3c0/rd_hit_cpipe 是 SCCL ID #3 中 L3C 索引 #0 的 READ_HIT_CPIPE 事件。

例如 hisi_sccl1_hha0/rx_operations 是 SCCL ID #1 中 HHA 索引 #0 的 RX_OPERATIONS 事件。

该驱动程序还提供了一个“cpumask”sysfs 属性,显示用于计算 uncore PMU 事件的 CPU 核心 ID。“associated_cpus”sysfs 属性也用于显示与此 PMU 关联的 CPU。“cpumask”指示打开事件的 CPU,通常作为 perf 等用户空间工具的提示。它只包含来自“associated_cpus”的一个关联 CPU。

perf 的示例用法

$# perf list
hisi_sccl3_l3c0/rd_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl3_l3c0/wr_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl1_l3c0/rd_hit_cpipe/ [kernel PMU event]
------------------------------------------
hisi_sccl1_l3c0/wr_hit_cpipe/ [kernel PMU event]
------------------------------------------

$# perf stat -a -e hisi_sccl3_l3c0/rd_hit_cpipe/ sleep 5
$# perf stat -a -e hisi_sccl3_l3c0/config=0x02/ sleep 5

对于标识符为 0x30 的海思 uncore PMU v2,拓扑结构与 PMU v1 相同,但硬件中添加了一些新功能。

1. L3C PMU 支持按集群中的核心/线程进行过滤,可以将其指定为位图

$# perf stat -a -e hisi_sccl3_l3c0/config=0x02,tt_core=0x3/ sleep 5

这将仅计算此集群中核心/线程 0 和 1 的操作。

2. Tracetag 允许用户选择仅通过 perf 中的 tt_req 参数来计数读取、写入或原子操作。 默认值计算所有操作。 tt_req 是 3 位,3’b100 表示读取操作,3’b101 表示写入操作,3’b110 表示原子存储操作,3’b111 表示原子非存储操作,其他值保留

$# perf stat -a -e hisi_sccl3_l3c0/config=0x02,tt_req=0x4/ sleep 5

这将仅计算此集群中的读取操作。

3. Datasrc 允许用户检查数据来自何处。 它是 5 位。 一些重要的代码如下

  • 5’b00001:来自此芯片中的 L3C;

  • 5’b01000:来自跨芯片的 L3C;

  • 5’b01001:来自另一个插槽中的 L3C;

  • 5’b01110:来自本地 DDR;

  • 5’b01111:来自跨芯片 DDR;

  • 5’b10000:来自跨插槽 DDR;

等等,这主要有助于找到数据源离 CPU 核心最近。 如果在多芯片中使用 datasrc_cfg,则应在 perf 命令中配置 datasrc_skt

$# perf stat -a -e hisi_sccl3_l3c0/config=0xb9,datasrc_cfg=0xE/,
hisi_sccl3_l3c0/config=0xb9,datasrc_cfg=0xF/ sleep 5

4. 一些海思 SoC 封装了多个 CPU 和 IO 芯片。 每个 CPU 芯片包含多个计算集群 (CCL)。 I/O 芯片称为超级 I/O 集群 (SICL),包含多个 I/O 集群 (ICL)。 SoC 中的每个 CCL/ICL 都有一个唯一的 ID。 每个 ID 都是 11 位,包括一个 6 位 SCCL-ID 和一个 5 位 CCL/ICL-ID。 对于 I/O 芯片,ICL-ID 后跟

  • 5’b00000: I/O_MGMT_ICL;

  • 5’b00001: Network_ICL;

  • 5’b00011: HAC_ICL;

  • 5’b10000: PCIe_ICL;

5. uring_channel:UC PMU 事件 0x47~0x59 支持按 tx 请求 uring 通道进行过滤。 它是 2 位。 一些重要的代码如下

  • 2’b11:计算发送到 uring_ext (MATA) 通道的事件;

  • 2’b01:与 2’b11 相同;

  • 2’b10:计算发送到 uring(非 MATA)通道的事件;

  • 2’b00:默认值,计算发送到 uring 和 uring_ext 通道的事件;

用户可以通过设置 srcid_cmd & srcid_msk 来配置 ID 以计算来自特定 CCL/ICL 的数据,并通过设置 tgtid_cmd & tgtid_msk 来配置用于特定 CCL/ICL 的数据。 srcid_msk/tgtid_msk 中的设置位表示 PMU 在与 srcid_cmd/tgtid_cmd 匹配时不检查该位。

如果禁用所有这些选项,它可以按默认值工作,该默认值不区分过滤器条件和 ID 信息,并将返回 PMU 计数器中的总计数器值。

当前驱动程序不支持采样。 因此不支持“perf record”。 也不支持附加到任务,因为事件都是 uncore。

注意:如果需要,请联系维护者以获取 SoC 中 PMU 设备支持的完整事件列表及其信息。