[PATCH v1 4/4] platform profile: Document firmware-independent profile selection

From: Daniel Lezcano

Date: Wed Oct 14 2026 - 10:12:20 EST


Describe the firmware-neutral aggregate interface, retained ACPI
compatibility paths and unchanged device-based provider API. Document
hidden choices, mixed profiles and the sequential application of
aggregate writes.

Correct the per-provider attribute reference and extend existing ACPI
maintainer coverage to the extracted core and its interfaces.

Assisted-by: OpenCode:gpt-6.1-sol
Signed-off-by: Daniel Lezcano <daniel.lezcano@xxxxxxxxxxxxxxxx>
---
.../ABI/testing/sysfs-class-platform-profile | 2 +-
.../ABI/testing/sysfs-kernel-platform_profile | 30 ++++++++++++++
.../ABI/testing/sysfs-platform_profile | 7 +++-
.../userspace-api/sysfs-platform_profile.rst | 41 ++++++++++++++-----
MAINTAINERS | 6 +++
include/linux/platform_profile.h | 3 ++
6 files changed, 77 insertions(+), 12 deletions(-)
create mode 100644 Documentation/ABI/testing/sysfs-kernel-platform_profile

diff --git a/Documentation/ABI/testing/sysfs-class-platform-profile b/Documentation/ABI/testing/sysfs-class-platform-profile
index fcab26894ec3..75e0f6e2c128 100644
--- a/Documentation/ABI/testing/sysfs-class-platform-profile
+++ b/Documentation/ABI/testing/sysfs-class-platform-profile
@@ -35,7 +35,7 @@ Date: March 2025
KernelVersion: 6.14
Description: Reading this file gives the current selected profile for this
device. Writing this file with one of the strings from
- platform_profile_choices changes the profile to the new value.
+ choices changes the profile to the new value.

This file can be monitored for changes by polling for POLLPRI,
POLLPRI will be signaled on any changes, independent of those
diff --git a/Documentation/ABI/testing/sysfs-kernel-platform_profile b/Documentation/ABI/testing/sysfs-kernel-platform_profile
new file mode 100644
index 000000000000..c64a175873e2
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-kernel-platform_profile
@@ -0,0 +1,30 @@
+What: /sys/kernel/platform_profile/choices
+Date: October 2026
+Description: Space-separated list of standard profiles supported across all
+ registered platform profile providers. Profile names have the
+ meanings documented in sysfs-class-platform-profile.
+
+ The file is read-only and is present while at least one provider
+ is registered. Reading fails with EINVAL when providers have no
+ common choices. Hidden choices may contribute to the common
+ choices when multiple providers are registered; with a single
+ provider only its visible choices are listed.
+
+What: /sys/kernel/platform_profile/profile
+Date: October 2026
+Description: Reading returns the current profile when all providers agree,
+ or "custom" when they have different profiles or a provider
+ reports a custom configuration.
+
+ Writing a profile listed in choices applies it to all providers.
+ "custom" cannot be written. Changes are applied sequentially;
+ an error does not roll back providers already updated.
+
+ The file is read-write and is present while at least one provider
+ is registered. It can be monitored with poll() for POLLPRI.
+ Notifications cover successful userspace writes and changes
+ reported by providers, for example after a firmware hotkey event.
+
+ On ACPI systems this interface shares its state with the legacy
+ /sys/firmware/acpi/platform_profile interface. The interface is
+ also available without ACPI support or with ACPI disabled.
diff --git a/Documentation/ABI/testing/sysfs-platform_profile b/Documentation/ABI/testing/sysfs-platform_profile
index 125324ab53a9..ee32e222af64 100644
--- a/Documentation/ABI/testing/sysfs-platform_profile
+++ b/Documentation/ABI/testing/sysfs-platform_profile
@@ -2,6 +2,8 @@ What: /sys/firmware/acpi/platform_profile_choices
Date: October 2020
Contact: Hans de Goede <hdegoede@xxxxxxxxxx>
Description: This file contains a space-separated list of profiles supported for this device.
+ This is the ACPI compatibility interface for the system-wide
+ /sys/kernel/platform_profile/choices attribute.

Drivers must use the following standard profile-names:

@@ -23,7 +25,10 @@ Description: This file contains a space-separated list of profiles supported for
What: /sys/firmware/acpi/platform_profile
Date: October 2020
Contact: Hans de Goede <hdegoede@xxxxxxxxxx>
-Description: Reading this file gives the current selected profile for this
+Description: This interface shares its state with
+ /sys/kernel/platform_profile/profile.
+
+ Reading this file gives the current selected profile for this
device. Writing this file with one of the strings from
platform_profile_choices changes the profile to the new value.

diff --git a/Documentation/userspace-api/sysfs-platform_profile.rst b/Documentation/userspace-api/sysfs-platform_profile.rst
index 6613e188242a..37b98e5075db 100644
--- a/Documentation/userspace-api/sysfs-platform_profile.rst
+++ b/Documentation/userspace-api/sysfs-platform_profile.rst
@@ -1,6 +1,8 @@
-=====================================================================
-Platform Profile Selection (e.g. /sys/firmware/acpi/platform_profile)
-=====================================================================
+.. SPDX-License-Identifier: GPL-2.0
+
+==========================
+Platform Profile Selection
+==========================

On modern systems the platform performance, temperature, fan and other
hardware related characteristics are often dynamically configurable. The
@@ -15,6 +17,21 @@ operation or towards performance.
The purpose of the platform_profile attribute is to offer a generic sysfs
API for selecting the platform profile of these automatic mechanisms.

+The framework is independent of the firmware interface used by a provider.
+Drivers can implement profile selection using ACPI, an embedded controller,
+or another platform-specific mechanism. The core does not discover providers
+or interpret firmware descriptions.
+
+The system-wide interface is ``/sys/kernel/platform_profile/``, containing
+``choices`` and ``profile`` attributes. These attributes are present while
+at least one provider is registered. Per-provider interfaces are available
+under ``/sys/class/platform-profile/``.
+
+On ACPI systems, ``/sys/firmware/acpi/platform_profile_choices`` and
+``/sys/firmware/acpi/platform_profile`` remain available as compatibility
+interfaces. They operate on the same providers as the system-wide interface,
+and changes are notified through both interfaces.
+
Note that this API is only for selecting the platform profile, it is
NOT a goal of this API to allow monitoring the resulting performance
characteristics. Monitoring performance is best done with device/vendor
@@ -52,13 +69,14 @@ Multiple driver support
=======================
When multiple drivers on a system advertise a platform profile handler, the
platform profile handler core will only advertise the profiles that are
-common between all drivers to the ``/sys/firmware/acpi`` interfaces.
+common between all drivers to the system-wide interface and its ACPI
+compatibility interface.

This is to ensure there is no ambiguity on what the profile names mean when
all handlers don't support a profile.

-Individual drivers will register a 'platform_profile' class device that has
-similar semantics as the ``/sys/firmware/acpi/platform_profile`` interface.
+Individual drivers register a ``platform-profile`` class device with
+``name``, ``choices`` and ``profile`` attributes.

To discover which driver is associated with a platform profile handler the
user can read the ``name`` attribute of the class device.
@@ -74,7 +92,10 @@ same system. If the selected profile by individual drivers differs the
platform profile handler core will display the profile 'custom' to indicate
that the profiles are not the same.

-While the ``platform_profile`` attribute has the value ``custom``, writing a
-common profile from ``platform_profile_choices`` to the platform_profile
-attribute of the platform profile handler core will set the profile for all
-drivers.
+While the system-wide ``profile`` attribute has the value ``custom``, writing
+a common profile from ``choices`` to it will set the profile for all drivers.
+``custom`` cannot be written to the system-wide interface.
+
+Profile changes are applied to providers sequentially. If a provider returns
+an error, providers updated earlier are not rolled back. Userspace can read
+the per-provider interfaces to determine their resulting state.
diff --git a/MAINTAINERS b/MAINTAINERS
index 8014b9f8253e..778275ff20b6 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -285,10 +285,15 @@ B: https://bugzilla.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
F: Documentation/ABI/testing/configfs-acpi
F: Documentation/ABI/testing/sysfs-bus-acpi
+F: Documentation/ABI/testing/sysfs-class-platform-profile
+F: Documentation/ABI/testing/sysfs-kernel-platform_profile
+F: Documentation/ABI/testing/sysfs-platform_profile
F: Documentation/firmware-guide/acpi/
+F: Documentation/userspace-api/sysfs-platform_profile.rst
F: arch/x86/kernel/acpi/
F: arch/x86/pci/acpi.c
F: drivers/acpi/
+F: drivers/platform/profile/
F: drivers/pci/*/*acpi*
F: drivers/pci/*acpi*
F: drivers/pnp/pnpacpi/
@@ -296,6 +301,7 @@ F: include/acpi/
F: include/linux/acpi.h
F: include/linux/fwnode.h
F: include/linux/fw_table.h
+F: include/linux/platform_profile.h
F: lib/fw_table.c
F: rust/helpers/acpi.c
F: rust/kernel/acpi.rs
diff --git a/include/linux/platform_profile.h b/include/linux/platform_profile.h
index 855b28340e95..f23f9827eac6 100644
--- a/include/linux/platform_profile.h
+++ b/include/linux/platform_profile.h
@@ -2,6 +2,9 @@
/*
* Platform profile sysfs interface
*
+ * Providers may use any firmware interface or implement profiles in software.
+ * The parent device does not need an ACPI companion or a firmware node.
+ *
* See Documentation/userspace-api/sysfs-platform_profile.rst for more
* information.
*/
--
2.43.0