From: Antheas Kapenekakis <lkml@antheas.dev>
To: Mario.Limonciello@amd.com
Cc: linux-kernel@vger.kernel.org,
platform-driver-x86@vger.kernel.org,
Antheas Kapenekakis <lkml@antheas.dev>
Subject: [RFC v1 0/2] platform/x86/amd: Add AMD DPTCi driver for TDP control in devices without vendor-specific controls
Date: Tue, 3 Mar 2026 19:17:05 +0100 [thread overview]
Message-ID: <20260303181707.2920261-1-lkml@antheas.dev> (raw)
Many AMD-based handheld PCs (GPD, AYANEO, OneXPlayer, AOKZOE, OrangePi)
ship with the AGESA ALIB method at \_SB.ALIB, which accepts Function 0x0C
(the Dynamic Power and Thermal Configuration Interface, DPTCi). This
allows software to adjust APU power and thermal parameters at runtime:
STAPM limit, fast/slow PPT limits, skin-temperature TDP limit, slow/STAPM
time constants, and the thermal control target.
Until now userspace has reached this interface through the acpi_call out-
of-tree module or ryzenadj, which carry no ABI guarantees and no per-device
safety limits. This driver replaces that with a proper in-kernel
implementation that:
* Exposes all seven parameters through the firmware-attributes sysfs ABI,
so that standard tools (fwupd, systemd-bios-vendor, etc.) can enumerate
and modify them without device-specific knowledge.
* Enforces tiered per-device and per-SoC limits. The default "device"
mode restricts writes to a curated safe range (smin..smax) derived from
the device's thermal design. An "expanded" mode exposes the full
hardware-validated range. An optional CONFIG_AMD_DPTC_EXTENDED Kconfig
adds "soc" (raw ALIB_PARAMS envelope) and "unbound" tiers for advanced
use. The active tier is itself a firmware-attribute, switchable at
runtime.
* Stages values and commits them atomically in a single ALIB call,
matching the protocol's intended bulk-update semantics. A save_settings
attribute (per firmware-attributes ABI) controls whether writes commit
immediately ("single" mode) or are held until an explicit "save".
* When in "single" mode, re-applies staged values after system resume,
so suspend/resume cycles do not silently revert to firmware defaults.
Device limits are supplied for GPD Win Mini / Win 4 / Win 5 / Win Max 2 /
Duo / Pocket 4, OrangePi NEO-01, AOKZOE A1/A2, OneXPlayer F1/2/X1/G1,
and numerous AYANEO models. The SoC table covers Ryzen 5000, 6000, 7040,
8000, Z1, AI 9 HX 370, and the Ryzen AI MAX series.
Tested on a GPD Win 5 (Ryzen AI MAX+ 395). Confirmed with ryzenadj -i
that committed values are applied to hardware, and that fast/slow PPT
limits are honoured under a full-CPU stress load.
@Mario: can you suggest a CC list for V2? Thanks. Even if not merged, this
driver is still good for downstream use.
---
Usage
-----
List all exposed attributes (read-only, no root required):
$ fwupdmgr get-bios-settings
This enumerates every attribute under /sys/class/firmware-attributes/,
including current_value, default_value, min_value, max_value, and
display_name for each DPTCi parameter.
Sysfs direct usage
------------------
All paths are under:
ATTR=/sys/class/firmware-attributes/amd_dptc/attributes
Inspect a parameter (no root needed):
$ cat $ATTR/stapm_limit/{display_name,min_value,max_value,default_value,current_value}
Sustained TDP (mW)
4000
85000
25000
<- empty: nothing staged yet
Stage values (held in memory, not yet sent to firmware):
$ echo 25000 | sudo tee $ATTR/stapm_limit/current_value
$ echo 40000 | sudo tee $ATTR/fast_limit/current_value
$ echo 27000 | sudo tee $ATTR/slow_limit/current_value
$ echo 25000 | sudo tee $ATTR/skin_limit/current_value
$ echo 85 | sudo tee $ATTR/temp_target/current_value
Commit all staged values in one ALIB call:
$ echo save | sudo tee $ATTR/save_settings
Switch to auto-commit (each write commits immediately):
$ echo single | sudo tee $ATTR/save_settings
Return to bulk mode:
$ echo bulk | sudo tee $ATTR/save_settings
Clear a staged value without committing:
$ echo | sudo tee $ATTR/stapm_limit/current_value
Query or change the active limit tier (device/expanded/soc/unbound):
$ cat $ATTR/limit_mode/possible_values
device;expanded;soc;unbound
$ echo expanded | sudo tee $ATTR/limit_mode/current_value
Switching tiers clears all staged values (old values may fall outside the
new range). Stages and commits must be redone after a mode switch.
Antheas Kapenekakis (2):
Documentation: firmware-attributes: generalize save_settings entry
platform/x86/amd: Add AMD DPTCi driver
.../testing/sysfs-class-firmware-attributes | 41 +-
MAINTAINERS | 6 +
drivers/platform/x86/amd/Kconfig | 27 +
drivers/platform/x86/amd/Makefile | 2 +
drivers/platform/x86/amd/dptc.c | 1325 +++++++++++++++++
5 files changed, 1386 insertions(+), 15 deletions(-)
create mode 100644 drivers/platform/x86/amd/dptc.c
base-commit: c89ce241c1909d2c2bdde88334c33f3000d364fb
--
2.52.0
next reply other threads:[~2026-03-03 18:18 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-03 18:17 Antheas Kapenekakis [this message]
2026-03-03 18:17 ` [RFC v1 1/2] Documentation: firmware-attributes: generalize save_settings entry Antheas Kapenekakis
2026-03-03 18:17 ` [RFC v1 2/2] platform/x86/amd: Add AMD DPTCi driver Antheas Kapenekakis
2026-03-03 20:10 ` Mario Limonciello (AMD) (kernel.org)
2026-03-03 20:40 ` Antheas Kapenekakis
2026-03-03 20:54 ` Mario Limonciello (AMD) (kernel.org)
2026-03-03 21:20 ` Antheas Kapenekakis
2026-03-03 21:44 ` Sasha Levin
2026-03-03 22:08 ` Antheas Kapenekakis
2026-03-03 18:59 ` [RFC v1 0/2] platform/x86/amd: Add AMD DPTCi driver for TDP control in devices without vendor-specific controls Mario Limonciello
2026-03-03 19:16 ` Antheas Kapenekakis
2026-03-03 19:23 ` Antheas Kapenekakis
2026-03-03 19:27 ` Armin Wolf
2026-03-03 19:34 ` Antheas Kapenekakis
2026-03-03 21:50 ` Armin Wolf
2026-03-03 23:47 ` Antheas Kapenekakis
2026-03-03 19:51 ` Mario Limonciello (AMD) (kernel.org)
2026-03-03 20:04 ` Antheas Kapenekakis
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=20260303181707.2920261-1-lkml@antheas.dev \
--to=lkml@antheas.dev \
--cc=Mario.Limonciello@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=platform-driver-x86@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome