* [PATCH v2 0/2] firmware: meson: sm: make power-off work on S4 @ 2026-11-06 10:18 christian.koever-draxl 2026-11-06 10:18 ` [PATCH v2 1/2] dt-bindings: firmware: amlogic,meson-gxbb-sm: add amlogic,meson-s4-sm christian.koever-draxl 2026-11-06 10:18 ` [PATCH v2 2/2] firmware: meson: sm: make power-off work on S4 christian.koever-draxl 0 siblings, 2 replies; 5+ messages in thread From: christian.koever-draxl @ 2026-11-06 10:18 UTC (permalink / raw) To: robh, krzk+dt, conor+dt, neil.armstrong, khilman, jbrunet, martin.blumenstingl Cc: devicetree, linux-arm-kernel, linux-amlogic, linux-kernel, Christian Stefan Kövér-Draxl From: Christian Stefan Kövér-Draxl <ckoever@outlook.de> On S4 the firmware implements PSCI SYSTEM_OFF as DDR self-refresh, and the power key then resumes into a kernel that is gone, so the board hangs until it is unplugged. The vendor kernel sets a firmware shutdown flag first and takes the secondary CPUs down through PSCI; do the same, keyed on a new amlogic,meson-s4-sm compatible. Tested: poweroff followed by the remote's power key cold-boots the box. Changes in v2: - Use remove_cpu() instead of freeze_secondary_cpus(), which is not available without CONFIG_PM_SLEEP_SMP and not exported (reported by the kernel test robot and the Sashiko AI review). - One power-off prepare handler that does both steps in order, instead of two. - Link to v1: https://lore.kernel.org/r/20261025192144.208954-1-christian.koever-draxl@student.uibk.ac.at Tool use (Documentation/process/generated-content.rst): This work was done with the help of an AI coding assistant, Claude (Anthropic), used through Claude Code over many sessions. It did a large part of the hands-on work: it read the vendor kernel and the firmware interfaces, probed registers on the board, drafted the code and the changelogs, and ran the builds, checkpatch, dt_binding_check and the tests on the hardware. I directed the work, reviewed every change and the final patches, and take responsibility for them. There is no single prompt to quote; the sessions were of the form "find out why X fails on this board, fix it, test it on the box". Tested on an Amediatech X98Q TV box (Amlogic S905W2, S4 family, 2 GiB), vendor U-Boot and BL31/OP-TEE, Linux 7.3 plus this work. Christian Stefan Kövér-Draxl (2): dt-bindings: firmware: amlogic,meson-gxbb-sm: add amlogic,meson-s4-sm firmware: meson: sm: make power-off work on S4 .../firmware/amlogic,meson-gxbb-sm.yaml | 4 ++- drivers/firmware/meson/meson_sm.c | 31 +++++++++++++++++++ include/linux/firmware/meson/meson_sm.h | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) base-commit: 7be4bc52fd9e0e55dc9a2e0232b89427d2c4b614 -- 2.56.0 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] dt-bindings: firmware: amlogic,meson-gxbb-sm: add amlogic,meson-s4-sm 2026-11-06 10:18 [PATCH v2 0/2] firmware: meson: sm: make power-off work on S4 christian.koever-draxl @ 2026-11-06 10:18 ` christian.koever-draxl 2026-11-06 13:09 ` Rob Herring 2026-11-06 10:18 ` [PATCH v2 2/2] firmware: meson: sm: make power-off work on S4 christian.koever-draxl 1 sibling, 1 reply; 5+ messages in thread From: christian.koever-draxl @ 2026-11-06 10:18 UTC (permalink / raw) To: robh, krzk+dt, conor+dt, neil.armstrong, khilman, jbrunet, martin.blumenstingl Cc: devicetree, linux-arm-kernel, linux-amlogic, linux-kernel, Christian Stefan Kövér-Draxl From: Christian Stefan Kövér-Draxl <ckoever@outlook.de> The S4 secure monitor implements the GXBB interface, but its PSCI SYSTEM_OFF needs an extra firmware call first (a shutdown flag), so the driver has to tell it apart. Add an S4 compatible with the GXBB one as fallback. Signed-off-by: Christian Stefan Kövér-Draxl <ckoever@outlook.de> --- .../devicetree/bindings/firmware/amlogic,meson-gxbb-sm.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/firmware/amlogic,meson-gxbb-sm.yaml b/Documentation/devicetree/bindings/firmware/amlogic,meson-gxbb-sm.yaml index 8f50e698760e..6ff2ddfcaf54 100644 --- a/Documentation/devicetree/bindings/firmware/amlogic,meson-gxbb-sm.yaml +++ b/Documentation/devicetree/bindings/firmware/amlogic,meson-gxbb-sm.yaml @@ -18,7 +18,9 @@ properties: oneOf: - const: amlogic,meson-gxbb-sm - items: - - const: amlogic,meson-gx-sm + - enum: + - amlogic,meson-gx-sm + - amlogic,meson-s4-sm - const: amlogic,meson-gxbb-sm power-controller: -- 2.56.0 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] dt-bindings: firmware: amlogic,meson-gxbb-sm: add amlogic,meson-s4-sm 2026-11-06 10:18 ` [PATCH v2 1/2] dt-bindings: firmware: amlogic,meson-gxbb-sm: add amlogic,meson-s4-sm christian.koever-draxl @ 2026-11-06 13:09 ` Rob Herring 0 siblings, 0 replies; 5+ messages in thread From: Rob Herring @ 2026-11-06 13:09 UTC (permalink / raw) To: christian.koever-draxl Cc: krzk+dt, conor+dt, neil.armstrong, khilman, jbrunet, martin.blumenstingl, devicetree, linux-arm-kernel, linux-amlogic, linux-kernel, Christian Stefan Kövér-Draxl On Fri, Nov 06, 2026 at 11:18:53AM +0100, christian.koever-draxl@student.uibk.ac.at wrote: > From: Christian Stefan Kövér-Draxl <ckoever@outlook.de> > > The S4 secure monitor implements the GXBB interface, but its PSCI > SYSTEM_OFF needs an extra firmware call first (a shutdown flag), so the > driver has to tell it apart. Add an S4 compatible with the GXBB one as > fallback. > > Signed-off-by: Christian Stefan Kövér-Draxl <ckoever@outlook.de> Missing Krzysztof's ack... _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] firmware: meson: sm: make power-off work on S4 2026-11-06 10:18 [PATCH v2 0/2] firmware: meson: sm: make power-off work on S4 christian.koever-draxl 2026-11-06 10:18 ` [PATCH v2 1/2] dt-bindings: firmware: amlogic,meson-gxbb-sm: add amlogic,meson-s4-sm christian.koever-draxl @ 2026-11-06 10:18 ` christian.koever-draxl 2026-11-06 10:26 ` sashiko-bot 1 sibling, 1 reply; 5+ messages in thread From: christian.koever-draxl @ 2026-11-06 10:18 UTC (permalink / raw) To: robh, krzk+dt, conor+dt, neil.armstrong, khilman, jbrunet, martin.blumenstingl Cc: devicetree, linux-arm-kernel, linux-amlogic, linux-kernel, Christian Stefan Kövér-Draxl From: Christian Stefan Kövér-Draxl <ckoever@outlook.de> On S4 the firmware implements PSCI SYSTEM_OFF as DDR self-refresh. A press of the power key afterwards jumps back to the kernel resume address, where nothing is waiting, and the board hangs until it is unplugged. The vendor kernel avoids this in two steps, both needed: - set the firmware shutdown flag (SMC 0x82000042, argument 1) right before SYSTEM_OFF, which makes the firmware cold-boot on the power key instead of resuming; - take the secondary CPUs down through PSCI CPU_OFF first. With them only parked in the kernel, the firmware wake-up path hangs as well. Register a power-off prepare handler that does both, for the amlogic,meson-s4-sm compatible only. It offlines the secondary CPUs with remove_cpu(): machine_power_off() later only parks them with smp_send_stop(), and CPU hotplug no longer works at that point. Tested on an S905W2 board: poweroff followed by the power key cold-boots the board. Signed-off-by: Christian Stefan Kövér-Draxl <ckoever@outlook.de> --- drivers/firmware/meson/meson_sm.c | 31 +++++++++++++++++++++++++ include/linux/firmware/meson/meson_sm.h | 1 + 2 files changed, 32 insertions(+) diff --git a/drivers/firmware/meson/meson_sm.c b/drivers/firmware/meson/meson_sm.c index ab9751a59b55..de0c8e809c51 100644 --- a/drivers/firmware/meson/meson_sm.c +++ b/drivers/firmware/meson/meson_sm.c @@ -10,6 +10,7 @@ #include <linux/arm-smccc.h> #include <linux/bug.h> +#include <linux/cpu.h> #include <linux/io.h> #include <linux/module.h> #include <linux/of.h> @@ -17,6 +18,7 @@ #include <linux/platform_device.h> #include <linux/printk.h> #include <linux/property.h> +#include <linux/reboot.h> #include <linux/types.h> #include <linux/sizes.h> #include <linux/slab.h> @@ -48,6 +50,7 @@ static const struct meson_sm_chip gxbb_chip = { CMD(SM_THERMAL_CALIB_READ, 0x82000047), CMD(SM_A1_PWRC_SET, 0x82000093), CMD(SM_A1_PWRC_GET, 0x82000095), + CMD(SM_SET_POWEROFF_FLAG, 0x82000042), { /* sentinel */ }, }, }; @@ -303,6 +306,28 @@ static struct attribute *meson_sm_sysfs_attrs[] = { }; ATTRIBUTE_GROUPS(meson_sm_sysfs); +/* + * The S4 firmware implements PSCI SYSTEM_OFF as DDR self-refresh: on the + * power key it jumps back to the kernel instead of booting, which hangs the + * board. Setting the shutdown flag first makes it cold-boot instead, and the + * secondary CPUs must have been taken down through PSCI CPU_OFF beforehand, + * otherwise the wake-up path hangs as well. machine_power_off() only parks + * them, so offline them here, while CPU hotplug still works. + */ +static int meson_sm_power_off_prepare(struct sys_off_data *data) +{ + unsigned int cpu, primary = cpumask_first(cpu_online_mask); + + for_each_online_cpu(cpu) { + if (cpu != primary && remove_cpu(cpu)) + pr_warn("meson-sm: failed to stop CPU%u\n", cpu); + } + + meson_sm_call(data->cb_data, SM_SET_POWEROFF_FLAG, NULL, 1, 0, 0, 0, 0); + + return NOTIFY_DONE; +} + static const struct of_device_id meson_sm_ids[] = { { .compatible = "amlogic,meson-gxbb-sm", .data = &gxbb_chip }, { /* sentinel */ }, @@ -343,6 +368,12 @@ static int __init meson_sm_probe(struct platform_device *pdev) if (devm_of_platform_populate(dev)) goto unmap_out_base; + if (of_device_is_compatible(dev->of_node, "amlogic,meson-s4-sm") && + devm_register_sys_off_handler(dev, SYS_OFF_MODE_POWER_OFF_PREPARE, + SYS_OFF_PRIO_DEFAULT, + meson_sm_power_off_prepare, fw)) + dev_warn(dev, "failed to register the power-off handler\n"); + pr_info("secure-monitor enabled\n"); return 0; diff --git a/include/linux/firmware/meson/meson_sm.h b/include/linux/firmware/meson/meson_sm.h index 3ebc2bd9a976..3f2fa160e32f 100644 --- a/include/linux/firmware/meson/meson_sm.h +++ b/include/linux/firmware/meson/meson_sm.h @@ -15,6 +15,7 @@ enum { SM_THERMAL_CALIB_READ, SM_A1_PWRC_SET, SM_A1_PWRC_GET, + SM_SET_POWEROFF_FLAG, }; struct meson_sm_firmware; -- 2.56.0 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] firmware: meson: sm: make power-off work on S4 2026-11-06 10:18 ` [PATCH v2 2/2] firmware: meson: sm: make power-off work on S4 christian.koever-draxl @ 2026-11-06 10:26 ` sashiko-bot 0 siblings, 0 replies; 5+ messages in thread From: sashiko-bot @ 2026-11-06 10:26 UTC (permalink / raw) To: christian.koever-draxl Cc: devicetree, linux-amlogic, robh, conor+dt, neil.armstrong Thank you for your contribution! Sashiko AI review found 1 potential issue to consider: - [Low] firmware: meson: duplicate meson-sm prefix in meson_sm_power_off_prepare() -- commit 0142b0300be6322393138fbe4dbbf32405872dee Author: Christian Stefan Kövér-Draxl <ckoever@outlook.de> firmware: meson: sm: make power-off work on S4 This commit registers a power-off prepare handler for Amlogic S4 that offlines secondary CPUs and sets the firmware shutdown flag before PSCI SYSTEM_OFF. > diff --git a/drivers/firmware/meson/meson_sm.c b/drivers/firmware/meson/meson_sm.c > index ab9751a59b552..de0c8e809c516 100644 > --- a/drivers/firmware/meson/meson_sm.c > +++ b/drivers/firmware/meson/meson_sm.c [ ... ] > @@ -303,6 +306,28 @@ static struct attribute *meson_sm_sysfs_attrs[] = { > }; > ATTRIBUTE_GROUPS(meson_sm_sysfs); > > +/* > + * The S4 firmware implements PSCI SYSTEM_OFF as DDR self-refresh: on the > + * power key it jumps back to the kernel instead of booting, which hangs the > + * board. Setting the shutdown flag first makes it cold-boot instead, and the > + * secondary CPUs must have been taken down through PSCI CPU_OFF beforehand, > + * otherwise the wake-up path hangs as well. machine_power_off() only parks > + * them, so offline them here, while CPU hotplug still works. > + */ > +static int meson_sm_power_off_prepare(struct sys_off_data *data) > +{ > + unsigned int cpu, primary = cpumask_first(cpu_online_mask); > + > + for_each_online_cpu(cpu) { > + if (cpu != primary && remove_cpu(cpu)) > + pr_warn("meson-sm: failed to stop CPU%u\n", cpu); [Severity: Low] Does this duplicate the "meson-sm: " prefix in the kernel log? drivers/firmware/meson/meson_sm.c already defines pr_fmt(fmt) as "meson-sm: " fmt at the top of the file. -- Sashiko AI review · https://sashiko.dev/#/patchset/20261106101854.46569-1-christian.koever-draxl@student.uibk.ac.at?part=2 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-11-06 13:09 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-11-06 10:18 [PATCH v2 0/2] firmware: meson: sm: make power-off work on S4 christian.koever-draxl 2026-11-06 10:18 ` [PATCH v2 1/2] dt-bindings: firmware: amlogic,meson-gxbb-sm: add amlogic,meson-s4-sm christian.koever-draxl 2026-11-06 13:09 ` Rob Herring 2026-11-06 10:18 ` [PATCH v2 2/2] firmware: meson: sm: make power-off work on S4 christian.koever-draxl 2026-11-06 10:26 ` sashiko-bot
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®