飞思卡尔 i.MX8 DDR 性能监控单元 (PMU)

DRAM 控制器内部没有性能计数器,因此性能信号被带到控制器的边缘,在那里实现了一组 4 x 32 位计数器。这由计数器控制寄存器中编程的 CSV 模式控制,这会导致生成大量 PERF 信号。

每个计数器的值的选择通过配置寄存器完成。每个计数器都有一个寄存器。计数器 0 的特殊之处在于它始终计算“时间”,当过期时,会导致锁定自身和其他计数器,并引发中断。如果任何其他计数器溢出,它将继续计数,并且不会引发中断。

“format” 目录描述了 perf_event_attr 结构的 config(事件 ID)和 config1/2(AXI 过滤器设置)字段的格式,请参阅 /sys/bus/event_source/devices/imx8_ddr0/format/。“events” 目录描述了硬件支持的可以与 perf 工具一起使用的事件类型,请参阅 /sys/bus/event_source/devices/imx8_ddr0/events/。“caps” 目录描述了 DDR PMU 中实现的过滤器功能,请参阅 /sys/bus/events_source/devices/imx8_ddr0/caps/。

perf stat -a -e imx8_ddr0/cycles/ cmd
perf stat -a -e imx8_ddr0/read/,imx8_ddr0/write/ cmd

AXI 过滤仅由 CSV 模式 0x41(axid-read)和 0x42(axid-write)使用,以计数读取或写入匹配过滤器设置。过滤器设置因不同的 DRAM 控制器实现而异,这通过驱动程序中的怪癖来区分。您还可以从用户空间转储信息,“caps” 目录显示 AXI 过滤器的类型(filter、enhanced_filter 和 super_filter)。值 0 表示不支持,值 1 表示支持。

  • 对于 DDR_CAP_AXI_ID_FILTER 怪癖 (filter: 1, enhanced_filter: 0, super_filter: 0)。过滤器定义了两个配置部分:--AXI_ID 定义 AxID 匹配值。--AXI_MASKING 定义 AxID 的哪些位对于匹配有意义。

    • 0:对应的位被屏蔽。

    • 1:对应的位未被屏蔽,即用于进行匹配。

    AXI_ID 和 AXI_MASKING 映射在性能计数器中的 DPCR1 寄存器上。当未屏蔽的位与对应的 AXI_ID 位匹配时,计数器会递增。如果满足以下条件,性能计数器会递增

    AxID && AXI_MASKING == AXI_ID && AXI_MASKING
    

    此过滤器不支持同时为 axid-read 和 axid-write 事件过滤不同的 AXI ID,因为此过滤器在计数器之间共享。

    perf stat -a -e imx8_ddr0/axid-read,axi_mask=0xMMMM,axi_id=0xDDDD/ cmd
    perf stat -a -e imx8_ddr0/axid-write,axi_mask=0xMMMM,axi_id=0xDDDD/ cmd
    

    注意

    axi_mask 在用户空间中是反转的(即,设置的位是要屏蔽的位),它将在驱动程序中自动恢复。这样用户就可以只指定要监视的 axi_id,而不必指定 axi_mask。

    perf stat -a -e imx8_ddr0/axid-read,axi_id=0x12/ cmd, which will monitor ARID=0x12
    
  • 对于 DDR_CAP_AXI_ID_FILTER_ENHANCED 怪癖 (filter: 1, enhanced_filter: 1, super_filter: 0)。这是对 DDR_CAP_AXI_ID_FILTER 怪癖的扩展,允许计算来自 DDR 读取和写入事务的字节数(而不是突发次数),同时并行计算另一组数据计数器。

  • 对于 DDR_CAP_AXI_ID_PORT_CHANNEL_FILTER 怪癖 (filter: 0, enhanced_filter: 0, super_filter: 1)。先前的 AXI 过滤器存在一个限制,它不能同时过滤不同的 ID,因为过滤器在计数器之间共享。这个怪癖是 AXI ID 过滤器的扩展。一个改进是计数器 1-3 有自己的过滤器,这意味着它支持同时过滤各种 ID。另一个改进是计数器 1-3 支持 AXI PORT 和 CHANNEL 选择。支持选择地址通道或数据通道。

    每个计数器 1-3 的过滤器定义了 2 个配置寄存器。--计数器 N MASK COMP 寄存器 - 包括 AXI_ID 和 AXI_MASKING。--计数器 N MUX CNTL 寄存器 - 包括 AXI CHANNEL 和 AXI PORT。

    • 0:地址通道

    • 1:数据通道

    DDR 子系统中的 PMU,只存在一个端口 0,所以 axi_port 被保留,应该为 0。

    perf stat -a -e imx8_ddr0/axid-read,axi_mask=0xMMMM,axi_id=0xDDDD,axi_channel=0xH/ cmd
    perf stat -a -e imx8_ddr0/axid-write,axi_mask=0xMMMM,axi_id=0xDDDD,axi_channel=0xH/ cmd
    

    注意

    axi_channel 在用户空间中是反转的,它将在驱动程序中自动恢复。因此,如果用户想从 DDR 事务中监视数据通道,则不需要指定 axi_channel,因为数据通道更有意义。