[PATCH v3 0/2] perf: Add Raspberry Pi AXI PMU driver
Ian Rogers
irogers at google.com
Tue Aug 11 17:27:26 PDT 2026
This patch series adds an uncore Performance Monitoring Unit (PMU) driver
for Broadcom AXI system and VideoCore VPU performance monitors found on
Raspberry Pi SoCs (BCM2835 through BCM2712 / Raspberry Pi 1 through 5).
Motivation & Background
------------------------
Currently, Linux lacks a standard perf-API compatible driver for the
Broadcom AXI performance counter blocks on Raspberry Pi platforms. Prior
out-of-tree vendor solutions relied on custom debugfs nodes and ad-hoc
kthreads, preventing integration with standard Linux perf tooling (`perf stat`,
`perf list`, etc.).
This driver implements standard `struct pmu` hardware uncore callbacks
under `drivers/perf/`, exposing human-readable sysfs event aliases, unit
scaling (`Bytes`), and bus filtering directly to user space.
Key Architectural Improvements & Features
------------------------------------------
1. Standard Linux Perf Integration:
- Exposes uncore AXI interconnect events via `/sys/bus/event_source/devices/rpi_axi_pmu/`.
- Supports event sampling and hardware counter accumulation (`local64_add`),
automatically managing 31-bit hardware counter wraparound across high-bandwidth
interconnect transfers.
2. CPU Hotplug Support (`cpuhp`):
- Registers dynamic CPU hotplug notifiers (`CPUHP_AP_ONLINE_DYN`).
- Automatically migrates PMU context (`perf_pmu_migrate_context`) to an online
CPU core when a designated CPU goes offline, avoiding stale uncore state.
3. Hybrid Memory-Mapped & Mailbox Work Queue Architecture:
- System Monitor (MMIO): Performs fast atomic-safe memory reads (~15ns)
directly mapped over ARM physical memory space (`MON__SYSTEM`).
- VPU Monitor (Mailbox IPC): For Broadcom BCM2835-BCM2711 platforms (RPi 1-4),
VideoCore VPU monitor IPC calls are offloaded to process context via a dedicated
workqueue (`vpu_work`) and serialized under `vpu_mutex`. This avoids atomic
sleeps or blocking in timer/interrupt context.
4. PREEMPT_RT & Safety Hardening:
- Uses HRTIMER_MODE_REL_SOFT for timer callbacks to execute in softirq context,
ensuring spinlock acquisitions are 100% PREEMPT_RT safe.
- Sets suppress_bind_attrs = true to prevent unsafe manual sysfs unbinding while
active perf events exist.
5. SoC Generation Support:
- Patch 1 adds core driver support for Broadcom BCM2835-BCM2711 (RPi 1-4).
- Patch 2 expands support for Broadcom BCM2712 (Raspberry Pi 5), adding PCIe RP1
Southbridge links, HEVC decoder, HVS display engine, and Cortex-A76 DSU L3
interconnect monitoring.
Hardware Validation
-------------------
The driver has been validated on real hardware across multiple SoC generations:
- Raspberry Pi 400 (BCM2711): Validated System L2, ARM CPU, and VideoCore VPU
firmware mailbox IPC performance counters.
- Raspberry Pi 5 (BCM2712): Validated live byte throughput across HVS display
refresh cycles, Cortex-A76 DSU L3 interconnect memory traffic, and PCIe RP1
Southbridge transfers.
Changes in v3
-------------
- 64-bit Device Tree reg Parsing: Replaced of_property_read_u32_index with
platform_get_resource(pdev, IORESOURCE_MEM, i) to retrieve mailbox offsets,
supporting 64-bit DT layouts (#address-cells = <2>).
- Firmware Phandle Fallback Safety: In rpi_axi_pmu__init(), if firmware node is
missing or rpi_firmware_get() returns NULL, explicitly set MON__VPU use_mailbox_interface = false.
config_is_valid() then returns -EINVAL for VPU events, preventing NULL pointer dereferences.
- Driver Teardown Order: In rpi_axi_pmu__exit(), unregister perf_pmu_unregister(&pmu->pmu)
first to block new event allocations before removing CPU hotplug callbacks, cancelling hrtimer,
and syncing workqueue.
- Probe Error Unwind Safety: Updated rpi_axi_pmu__init() error paths to call hrtimer_cancel()
and cancel_work_sync() before returning probe failure.
- Thread-Safe enabled[idx] Setting: Set enabled[idx] = true under pmu->lock after verifying
event generation sequence in vpu_work_handler(), eliminating TOCTOU race conditions.
- PREEMPT_RT Compatibility: Switched hrtimer setup and start to HRTIMER_MODE_REL_SOFT
so timer callbacks run in softirq context, allowing spinlock_t acquisitions on PREEMPT_RT.
- CPU Offline Timer Migration: In rpi_axi_pmu_offline_cpu(), restart hrtimer using unpinned
HRTIMER_MODE_REL_SOFT so perf migrates timer execution to the target CPU.
- Suppress Unsafe Sysfs Unbind: Set .suppress_bind_attrs = true in platform_driver.
- Kconfig Cleanup: Removed non-existent ARCH_BCM2712 symbol from depends on in Kconfig.
- Legacy Sysfs Alias Filtering: Updated rpi_axi_pmu_events_is_visible() to filter out all
legacy RPi 1-4 System Monitor aliases (ccp2tx_, mphi_, h264_, v3d_, jpeg_, peripheral_,
cpu_uc_, cpu_l2_, etc.) on BCM2712 systems.
Ian Rogers (2):
perf: Add Raspberry Pi BCM2835 AXI PMU driver
perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support
drivers/perf/Kconfig | 10 +
drivers/perf/Makefile | 1 +
drivers/perf/rpi_axi_pmu.c | 2022 ++++++++++++++++++++++++++++++++++++
3 files changed, 2033 insertions(+)
create mode 100644 drivers/perf/rpi_axi_pmu.c
--
2.55.0.679.g6767b8d81c-goog
More information about the linux-arm-kernel
mailing list