From: Ian Rogers <irogers@google.com>
To: irogers@google.com, linux-perf-users@vger.kernel.org,
linux-rpi-kernel@lists.infradead.org
Cc: linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, mark.rutland@arm.com,
u.kleine-koenig@baylibre.com, will@kernel.org
Subject: [PATCH v6 0/2] perf: Add Raspberry Pi AXI PMU driver
Date: Wed, 12 Aug 2026 21:35:31 -0700 [thread overview]
Message-ID: <20260813043533.2744442-1-irogers@google.com> (raw)
In-Reply-To: <20260812230145.2644281-1-irogers@google.com>
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 rigorously validated on physical hardware across multiple
SoC generations:
- Raspberry Pi 400 (BCM2711): Validated System MMIO and VideoCore VPU firmware
mailbox IPC performance counters. Explicitly mechanically verified precisely zero
lockup behaviors across 100Hz aggressive asynchronous timer interrupts. Profiling
the `h264_v4l2m2m` pipeline hardware isolated >11.1MB in pure AXI VPU hardware matrix reads.
- 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 v6
-------------
- Reorganized commit structure rigorously into two cleanly bisectable patches
(BCM2835 core in Patch 1, BCM2712 additions in Patch 2).
- Resolved unmet Kconfig dependency warnings when MAILBOX=n by cleanly relying
on 'depends on RASPBERRYPI_FIRMWARE || (COMPILE_TEST && !RASPBERRYPI_FIRMWARE)'
rather than forcefully using 'select' (Patch 1).
- Resolved catastrophic PREEMPT_RT/softirq deadlocks associated with atomic
spinlocks globally preempting 'hrtimer_cancel()' routines by permitting the
timer loop to detect 0 active events and cleanly self-terminate (Patch 1).
- Purged unsafe 'spin_unlock_irqrestore' lock dropping maneuvers occurring
abruptly inside 'rpi_axi_pmu_read()', ensuring atomic contexts and missing
flags no longer inadvertently trigger kernel panics (Patch 1).
- Eliminated silent ABA VPU slot data-corruption and event hardware leaks by
decoupling 'vpu_work_handler' loops safely onto a 'vpu_disable_pending' matrix.
Deleted VPU watchers are safely disabled exactly prior to newly allocated slots
executing initialization within the same asynchronous worker loop (Patch 1).
- Resolved lockless data races across VPU mailbox hardware mutation checks by fully
protecting 'monitor_running' and 'enabled' state modifications structurally inside
the 'rpi_axi_pmu_start' and 'rpi_axi_pmu_vpu_work_handler' core locks.
- Disentangled rigid 'cancel_work_sync' usages back to safe 'flush_work' variants in
teardown unloading contexts so dynamic Mailbox IPC teardown flows successfully
execute without aborting directly in mid-flight (Patch 2).
- Sharpened the sysfs 'is_visible' string-masking logic to properly accommodate
Raspberry Pi 5 aliases, resolving an overzealous 'strstr' bug directly hiding
"bcm2712_peripheral_" aliases on RPi 5 hardware (Patch 2).
- Rewrote component destruction sequencing logic completely onto safe CPU hotplug
'_nocalls' handlers to strictly avoid User-After-Free events from persisting
against unregistered/defunct driver models during 'perf_pmu_unregister' (Patch 1).
- Eradicated cross-execution bus tracker leaks across failed/zombied workflows where
'monitored' mask properties remained structurally trapped inside invalid state
loops by surgically injecting manual 'enabled = false' boolean teardowns into 'del()'.
- Inserted explicit comments explaining the critical 31-bit counter-masking logic
regarding standard U32_MAX hardware exception signaling (Patch 1).
- Scrubbed all erroneous 'TAG=agy' trailing metadata from commit descriptions.
Ian Rogers (2):
perf: Add Raspberry Pi BCM2835 AXI PMU driver
perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support
drivers/perf/Kconfig | 9 +
drivers/perf/Makefile | 1 +
drivers/perf/rpi_axi_pmu.c | 2119 ++++++++++++++++++++++++++++++++++++
3 files changed, 2129 insertions(+)
create mode 100644 drivers/perf/rpi_axi_pmu.c
--
2.47.0
next prev parent reply other threads:[~2026-08-13 4:35 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 8:38 [PATCH v1 0/2] perf: Add Raspberry Pi AXI PMU driver Ian Rogers
2026-08-11 8:38 ` [PATCH v1 1/2] perf: Add Raspberry Pi BCM2835 " Ian Rogers
2026-08-11 14:32 ` Uwe Kleine-König
2026-08-11 8:38 ` [PATCH v1 2/2] perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-11 23:51 ` [PATCH v2 0/2] perf: Add Raspberry Pi AXI PMU driver Ian Rogers
2026-08-11 23:51 ` [PATCH v2 1/2] perf: Add Raspberry Pi BCM2835 " Ian Rogers
2026-08-12 0:04 ` sashiko-bot
2026-08-11 23:51 ` [PATCH v2 2/2] perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-12 0:05 ` sashiko-bot
2026-08-12 0:27 ` [PATCH v3 0/2] perf: Add Raspberry Pi AXI PMU driver Ian Rogers
2026-08-12 0:27 ` [PATCH v3 1/2] perf: Add Raspberry Pi BCM2835 " Ian Rogers
2026-08-12 0:40 ` sashiko-bot
2026-08-12 0:27 ` [PATCH v3 2/2] perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-12 0:40 ` sashiko-bot
2026-08-12 5:24 ` [PATCH v4 0/2] perf: Add Raspberry Pi AXI PMU driver Ian Rogers
2026-08-12 5:24 ` [PATCH v4 1/2] perf: Add Raspberry Pi BCM2835 " Ian Rogers
2026-08-12 5:36 ` sashiko-bot
2026-08-12 5:24 ` [PATCH v4 2/2] perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-12 5:34 ` sashiko-bot
2026-08-12 8:27 ` [PATCH v4 0/2] perf: Add Raspberry Pi AXI PMU driver Will Deacon
2026-08-12 13:38 ` Ian Rogers
2026-08-12 16:26 ` Uwe Kleine-König
2026-08-12 21:37 ` Ian Rogers
2026-08-13 6:59 ` Uwe Kleine-König
2026-08-13 8:41 ` Will Deacon
2026-08-13 9:08 ` Peter Robinson
2026-08-12 23:01 ` [PATCH v5 " Ian Rogers
2026-08-12 23:01 ` [PATCH v5 1/2] perf: Add Raspberry Pi BCM2835 " Ian Rogers
2026-08-12 23:15 ` sashiko-bot
2026-08-12 23:01 ` [PATCH v5 2/2] perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-12 23:18 ` sashiko-bot
2026-08-12 23:07 ` [PATCH v5 0/2] perf: Add Raspberry Pi AXI PMU driver Ian Rogers
2026-08-12 23:07 ` Ian Rogers
2026-08-12 23:07 ` [PATCH v5 1/2] perf: Add Raspberry Pi BCM2835 " Ian Rogers
2026-08-12 23:25 ` sashiko-bot
2026-08-13 0:06 ` Florian Fainelli
2026-08-12 23:08 ` [PATCH v5 2/2] perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-12 23:24 ` sashiko-bot
2026-08-13 4:35 ` Ian Rogers [this message]
2026-08-13 4:35 ` [PATCH v6 1/2] perf: Add Raspberry Pi BCM2835 AXI PMU driver Ian Rogers
2026-08-13 4:48 ` sashiko-bot
2026-08-13 4:35 ` [PATCH v6 2/2] perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-13 4:43 ` sashiko-bot
2026-08-13 5:24 ` [PATCH v7 0/2] perf: Add Raspberry Pi AXI PMU driver Ian Rogers
2026-08-13 5:24 ` [PATCH v7 1/2] perf: Add Raspberry Pi BCM2835 " Ian Rogers
2026-08-13 5:35 ` sashiko-bot
2026-08-13 5:24 ` [PATCH v7 2/2] perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-13 5:46 ` sashiko-bot
2026-08-13 6:42 ` [PATCH v8 0/2] perf: Add Raspberry Pi AXI PMU driver Ian Rogers
2026-08-13 6:42 ` [PATCH v8 1/2] perf: Add Raspberry Pi BCM2835 " Ian Rogers
2026-08-13 6:51 ` sashiko-bot
2026-08-13 6:42 ` [PATCH v8 2/2] perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-13 6:52 ` sashiko-bot
2026-08-13 7:30 ` [PATCH v9 0/2] perf: Add Raspberry Pi AXI PMU driver Ian Rogers
2026-08-13 8:03 ` [PATCH v10 " Ian Rogers
2026-08-13 7:30 ` perf: Add Raspberry Pi BCM2835 " Ian Rogers
2026-08-13 7:40 ` sashiko-bot
2026-08-13 7:30 ` perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
2026-08-13 8:03 ` perf: Add Raspberry Pi BCM2835 AXI PMU driver Ian Rogers
2026-08-13 8:13 ` sashiko-bot
2026-08-13 8:03 ` perf: Add Raspberry Pi 5 (BCM2712) AXI PMU support Ian Rogers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260813043533.2744442-1-irogers@google.com \
--to=irogers@google.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=linux-rpi-kernel@lists.infradead.org \
--cc=mark.rutland@arm.com \
--cc=u.kleine-koenig@baylibre.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.