Freescale 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 控制器实现而异,这通过驱动程序中的 quirks 来区分。 您还可以从用户空间转储信息,“caps”目录显示 AXI 过滤器的类型(filter、enhanced_filter 和 super_filter)。 值 0 表示不支持,值 1 表示支持。

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

    • 0:相应的位被屏蔽。

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

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

    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 来监视特定的 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 quirk(filter: 1, enhanced_filter: 1, super_filter: 0)。 这是对 DDR_CAP_AXI_ID_FILTER quirk 的扩展,允许与另一组数据计数器并发地计数来自 DDR 读取和写入事务的字节数(而不是突发数)。

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

    过滤器定义为每个计数器 1-3 有 2 个配置寄存器。 --Counter N MASK COMP 寄存器 - 包括 AXI_ID 和 AXI_MASKING。 --Counter 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,因为数据通道更有意义。