Re: [PATCH v3 0/3] Add RISC-V RPMI device power service support
From: Ulf Hansson
Date: Mon Sep 21 2026 - 11:19:01 EST
On Thu, Sep 3, 2026 at 11:24 AM Joshua Yeong
<joshua.yeong@xxxxxxxxxxxxxxxx> wrote:
>
> The RISC-V Platform Management Interface (RPMI) specification defines a
> modular and extensible messaging protocol between the supervisor software
> and a platform microcontroller (PuC). Among the service groups it defines
> is the device power service group (service group ID 0x00009), which allows
> the supervisor to enumerate the power domains of platform devices managed
> by the PuC, query their attributes, and get/set their power state.
>
> This series adds supervisor-side support for that service group:
>
> - DT bindings for the power domain controller exposed to the supervisor
> ("riscv,rpmi-device-power") and for the SBI MPXY channel that the SBI
> implementation uses to expose the service group to the supervisor
> ("riscv,rpmi-mpxy-device-power").
>
> - A generic power domain (genpd) provider driver under
> drivers/pmdomain/riscv/ which talks to the PuC over an SBI MPXY
> mailbox channel. At probe it queries GET_NUM_DOMAINS, then for each
> domain queries GET_ATTRS for the name and transition latency and
> GET_STATE for the initial state, and registers the whole set as a
> onecell genpd provider. Domain power on/off is driven through
> SET_STATE with the generic ON/OFF power state parameters, so devices
> can simply reference a domain through the "power-domains" property.
>
> The series is based on the existing RISC-V RPMI/MPXY infrastructure
> already present in the tree (drivers/mailbox/riscv-sbi-mpxy-mbox.c and
> include/linux/mailbox/riscv-rpmi-message.h), and only adds the device
> power service group definitions on top of it.
>
> Changes in v3:
> - Move the MAINTAINERS change into its own patch, and add a new
> "RISC-V RPMI DEVICE POWER DRIVER" section scoped to this driver and
> its bindings instead of adding an M: entry to the existing "RISC-V
> RPMI AND MPXY DRIVERS" section, which covers drivers maintained by
> others.
> - Drop the redundant trailing "bindings" from the dt-bindings subject.
> - Compare only the value field of the RPMI power state word. The word
> also carries a context bit, so a full word comparison would report
> -EIO after a successful transition, and would drop a domain at probe,
> whenever the PuC reports context as lost.
> - Check the pm_genpd_init() return value and leave a failed domain out
> of the onecell array. Every failure path in pm_genpd_init() returns
> before the genpd is linked into gpd_list, so the previous code could
> hand a half initialised genpd to of_genpd_add_provider_onecell() and
> then list_del() an uninitialised list head in the unwind loop.
> - Set GENPD_FLAG_DEV_NAME_FW. The domain names come from the PuC and
> are not guaranteed to be unique or non-empty, and were used verbatim
> as the sysfs and debugfs names, where a duplicate fails device_add()
> with -EEXIST and takes down the whole provider.
>
> v1: https://lore.kernel.org/r/20260829205520.1691-1-joshua.yeong@xxxxxxxxxxxxxxxx
> v2: https://lore.kernel.org/r/20260830152812.312663-1-joshua.yeong@xxxxxxxxxxxxxxxx
>
> Testing
> =======
>
> The series was tested under QEMU with the RPMI device power service
> implemented in firmware.
>
> Components:
>
> - OpenSBI: latest master branch
> https://github.com/riscv-software-src/opensbi
>
> - QEMU: the RPMI-enabled tree at
> https://github.com/yeongjoshua/qemu/tree/rpmi-v11.1.0
>
> Kernel config: enable CONFIG_RISCV_RPMI_DEVICE_POWER (default y on RISC-V
> when MAILBOX is enabled) along with the SBI MPXY mailbox driver.
>
> Run with:
>
> qemu-system-riscv64 \
> -M virt -m 2G -smp 4 \
> -bios fw_dynamic.bin \
> -kernel Image \
> -M rpmi=true \
> -nographic \
> -initrd rootfs-busybox.cpio \
> -append "root=/dev/ram rw console=ttyS0,115200 no_console_suspend mem=2048M earlycon=uart8250,mmio,0x10000000"
>
> The RPMI device power domains advertised by the emulated platform
> microcontroller show up as generic power domains and can be inspected
> through /sys/kernel/debug/pm_genpd/. The series was additionally booted
> with CONFIG_PROVE_LOCKING, CONFIG_DEBUG_MUTEXES and
> CONFIG_DEBUG_ATOMIC_SLEEP enabled, with no lockdep reports.
>
> Joshua Yeong (3):
> dt-bindings: power: Add RPMI device power service
> pmdomain: riscv: Add RPMI device power service
> MAINTAINERS: Add RISC-V RPMI device power driver
>
> .../power/riscv,rpmi-device-power.yaml | 65 +++
> .../power/riscv,rpmi-mpxy-device-power.yaml | 65 +++
> MAINTAINERS | 8 +
> drivers/pmdomain/Kconfig | 1 +
> drivers/pmdomain/Makefile | 1 +
> drivers/pmdomain/riscv/Kconfig | 15 +
> drivers/pmdomain/riscv/Makefile | 3 +
> .../pmdomain/riscv/riscv-rpmi-device-power.c | 485 ++++++++++++++++++
> include/linux/mailbox/riscv-rpmi-message.h | 11 +
> 9 files changed, 654 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/power/riscv,rpmi-device-power.yaml
> create mode 100644 Documentation/devicetree/bindings/power/riscv,rpmi-mpxy-device-power.yaml
> create mode 100644 drivers/pmdomain/riscv/Kconfig
> create mode 100644 drivers/pmdomain/riscv/Makefile
> create mode 100644 drivers/pmdomain/riscv/riscv-rpmi-device-power.c
>
>
> base-commit: 8d3ae59288f1e7d58d76558a6ee96d533bc5019f
> --
> 2.43.0
The v3 series applied for next, thanks!
Kind regards
Uffe