* [PATCH v24 01/12] power: reset: reboot-mode: Support up to 3 magic values per mode
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 02/12] power: reset: reboot-mode: Add support for predefined reboot modes Shivendra Pratap
` (10 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla
ARM PSCI vendor-specific resets, require a 32-bit reset_type and a 64-bit
cookie as arguments. This cannot be implemented via the reboot-mode
framework, which supports a single 32-bit argument as magic value.
Extend the reboot-mode framework to support up to three 32-bit arguments
as magic, per reboot-mode.
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
drivers/power/reset/reboot-mode.c | 46 +++++++++++++++++++++++++++------------
include/linux/reboot-mode.h | 3 +++
2 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/drivers/power/reset/reboot-mode.c b/drivers/power/reset/reboot-mode.c
index af00c00eceee..c7e9285c64e9 100644
--- a/drivers/power/reset/reboot-mode.c
+++ b/drivers/power/reset/reboot-mode.c
@@ -20,7 +20,8 @@
struct mode_info {
const char *mode;
- u32 magic;
+ u32 magic[3];
+ u32 count;
struct list_head list;
};
@@ -72,8 +73,7 @@ static const struct class reboot_mode_class = {
.dev_groups = reboot_mode_groups,
};
-static unsigned int get_reboot_mode_magic(struct reboot_mode_driver *reboot,
- const char *cmd)
+static struct mode_info *get_reboot_mode_info(struct reboot_mode_driver *reboot, const char *cmd)
{
const char *normal = "normal";
struct mode_info *info;
@@ -84,11 +84,11 @@ static unsigned int get_reboot_mode_magic(struct reboot_mode_driver *reboot,
list_for_each_entry(info, &reboot->head, list)
if (!strcmp(info->mode, cmd))
- return info->magic;
+ return info;
/* try to match again, replacing characters impossible in DT */
if (strscpy(cmd_, cmd, sizeof(cmd_)) == -E2BIG)
- return 0;
+ return NULL;
strreplace(cmd_, ' ', '-');
strreplace(cmd_, ',', '-');
@@ -96,21 +96,25 @@ static unsigned int get_reboot_mode_magic(struct reboot_mode_driver *reboot,
list_for_each_entry(info, &reboot->head, list)
if (!strcmp(info->mode, cmd_))
- return info->magic;
+ return info;
- return 0;
+ return NULL;
}
static int reboot_mode_notify(struct notifier_block *this,
unsigned long mode, void *cmd)
{
struct reboot_mode_driver *reboot;
- unsigned int magic;
+ struct mode_info *info;
reboot = container_of(this, struct reboot_mode_driver, reboot_notifier);
- magic = get_reboot_mode_magic(reboot, cmd);
- if (magic)
- reboot->write(reboot, magic);
+ info = get_reboot_mode_info(reboot, cmd);
+ if (info && info->count) {
+ if (reboot->write_array)
+ reboot->write_array(reboot, info->magic, info->count);
+ else if (reboot->write && info->magic[0])
+ reboot->write(reboot, info->magic[0]);
+ }
return NOTIFY_DONE;
}
@@ -173,16 +177,22 @@ int reboot_mode_register(struct reboot_mode_driver *reboot)
struct property *prop;
struct device_node *np = reboot->dev->of_node;
size_t len = strlen(PREFIX);
- u32 magic;
+ u32 magic[3];
+ int count;
int ret;
INIT_LIST_HEAD(&reboot->head);
for_each_property_of_node(np, prop) {
+ memset(magic, 0, sizeof(magic));
+
if (strncmp(prop->name, PREFIX, len))
continue;
- if (device_property_read_u32(reboot->dev, prop->name, &magic)) {
+ count = device_property_count_u32(reboot->dev, prop->name);
+
+ if (count <= 0 || count > ARRAY_SIZE(magic) ||
+ device_property_read_u32_array(reboot->dev, prop->name, magic, count)) {
dev_dbg(reboot->dev, "reboot mode %s without magic number\n",
prop->name);
continue;
@@ -194,7 +204,15 @@ int reboot_mode_register(struct reboot_mode_driver *reboot)
goto error;
}
- info->magic = magic;
+ if (!memchr_inv(magic, 0, count * sizeof(u32))) {
+ dev_dbg(reboot->dev, "reboot mode %s with zero magic values\n",
+ prop->name);
+ info->count = 0;
+ } else {
+ memcpy(info->magic, magic, count * sizeof(u32));
+ info->count = count;
+ }
+
info->mode = kstrdup_const(prop->name + len, GFP_KERNEL);
if (!info->mode) {
ret = -ENOMEM;
diff --git a/include/linux/reboot-mode.h b/include/linux/reboot-mode.h
index 4a2abb38d1d6..29ae39935d69 100644
--- a/include/linux/reboot-mode.h
+++ b/include/linux/reboot-mode.h
@@ -2,10 +2,13 @@
#ifndef __REBOOT_MODE_H__
#define __REBOOT_MODE_H__
+#include <linux/types.h>
+
struct reboot_mode_driver {
struct device *dev;
struct list_head head;
int (*write)(struct reboot_mode_driver *reboot, unsigned int magic);
+ int (*write_array)(struct reboot_mode_driver *reboot, const u32 *magic, int count);
struct notifier_block reboot_notifier;
};
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 02/12] power: reset: reboot-mode: Add support for predefined reboot modes
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 01/12] power: reset: reboot-mode: Support up to 3 magic values per mode Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 03/12] firmware: psci: Introduce command-based resets Shivendra Pratap
` (9 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla
reboot-mode based drivers can define a reboot-mode by adding it under
the reboot-mode node in device tree. This limits such drivers, to define
any predefined reboot-modes statically within the driver and creates a
dependency on device-tree.
Extend the reboot-mode framework to support driver-defined predefined
reboot modes. Add a centralized initcall to initialize driver state
along with predefined modes.
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
drivers/power/reset/nvmem-reboot-mode.c | 7 +-
drivers/power/reset/qcom-pon.c | 7 +-
drivers/power/reset/reboot-mode.c | 192 ++++++++++++++++++++++---------
drivers/power/reset/syscon-reboot-mode.c | 7 +-
include/linux/reboot-mode.h | 26 ++++-
5 files changed, 175 insertions(+), 64 deletions(-)
diff --git a/drivers/power/reset/nvmem-reboot-mode.c b/drivers/power/reset/nvmem-reboot-mode.c
index d260715fccf6..700732ed0f5b 100644
--- a/drivers/power/reset/nvmem-reboot-mode.c
+++ b/drivers/power/reset/nvmem-reboot-mode.c
@@ -51,8 +51,11 @@ static int nvmem_reboot_mode_probe(struct platform_device *pdev)
if (!nvmem_rbm)
return -ENOMEM;
- nvmem_rbm->reboot.dev = &pdev->dev;
- nvmem_rbm->reboot.write = nvmem_reboot_mode_write;
+ ret = reboot_mode_driver_init(&nvmem_rbm->reboot, &pdev->dev,
+ nvmem_reboot_mode_write, NULL,
+ NULL, 0);
+ if (ret)
+ return ret;
nvmem_rbm->cell = devm_nvmem_cell_get(&pdev->dev, "reboot-mode");
if (IS_ERR(nvmem_rbm->cell)) {
diff --git a/drivers/power/reset/qcom-pon.c b/drivers/power/reset/qcom-pon.c
index 7e108982a582..f63996994a25 100644
--- a/drivers/power/reset/qcom-pon.c
+++ b/drivers/power/reset/qcom-pon.c
@@ -70,9 +70,12 @@ static int qcom_pon_probe(struct platform_device *pdev)
reason_shift = (long)of_device_get_match_data(&pdev->dev);
if (reason_shift != NO_REASON_SHIFT) {
- pon->reboot_mode.dev = &pdev->dev;
+ error = reboot_mode_driver_init(&pon->reboot_mode, &pdev->dev,
+ qcom_pon_reboot_mode_write, NULL,
+ NULL, 0);
+ if (error)
+ return error;
pon->reason_shift = reason_shift;
- pon->reboot_mode.write = qcom_pon_reboot_mode_write;
error = devm_reboot_mode_register(&pdev->dev, &pon->reboot_mode);
if (error) {
dev_err(&pdev->dev, "can't register reboot mode\n");
diff --git a/drivers/power/reset/reboot-mode.c b/drivers/power/reset/reboot-mode.c
index c7e9285c64e9..cf8978c0ce22 100644
--- a/drivers/power/reset/reboot-mode.c
+++ b/drivers/power/reset/reboot-mode.c
@@ -30,12 +30,12 @@ struct reboot_mode_sysfs_data {
struct list_head head;
};
-static inline void reboot_mode_release_list(struct reboot_mode_sysfs_data *priv)
+static void reboot_mode_release_list(struct list_head *head)
{
struct mode_info *info;
struct mode_info *next;
- list_for_each_entry_safe(info, next, &priv->head, list) {
+ list_for_each_entry_safe(info, next, head, list) {
list_del(&info->list);
kfree_const(info->mode);
kfree(info);
@@ -119,6 +119,80 @@ static int reboot_mode_notify(struct notifier_block *this,
return NOTIFY_DONE;
}
+/**
+ * reboot_mode_driver_init - Initialize reboot-mode state
+ * @reboot: reboot mode driver object to initialize
+ * @dev: backing device
+ * @write: write callback to program a single magic value
+ * @write_array: write callback to program multiple magic values
+ * @predefined_modes: optional predefined reboot-mode table
+ * @predefined_mode_count: number of entries in @predefined_modes
+ *
+ * Exactly one write callback must be provided by the driver.
+ *
+ * This function must be called with a valid @dev before calling
+ * reboot_mode_register().
+ *
+ * Returns: 0 on success or -EINVAL if callback/predefined mode configuration
+ * is invalid.
+ */
+int reboot_mode_driver_init(struct reboot_mode_driver *reboot,
+ struct device *dev,
+ int (*write)(struct reboot_mode_driver *reboot, unsigned int magic),
+ int (*write_array)(struct reboot_mode_driver *reboot,
+ const u32 *magic, u32 count),
+ const struct reboot_mode_entry *predefined_modes,
+ size_t predefined_mode_count)
+{
+ if (!reboot || !dev)
+ return -EINVAL;
+
+ if (!write == !write_array)
+ return -EINVAL;
+
+ memset(reboot, 0, sizeof(*reboot));
+ reboot->dev = dev;
+ reboot->write = write;
+ reboot->write_array = write_array;
+ reboot->predefined_modes = predefined_modes;
+ reboot->predefined_mode_count = predefined_mode_count;
+ INIT_LIST_HEAD(&reboot->head);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(reboot_mode_driver_init);
+
+static struct mode_info *reboot_mode_create_info(struct device *dev, const char *mode,
+ const u32 *magic, int count)
+{
+ struct mode_info *info;
+
+ if (!mode || mode[0] == '\0') {
+ dev_err(dev, "invalid mode name\n");
+ return ERR_PTR(-EINVAL);
+ }
+
+ info = kzalloc_obj(*info, GFP_KERNEL);
+ if (!info)
+ return ERR_PTR(-ENOMEM);
+
+ info->mode = kstrdup_const(mode, GFP_KERNEL);
+ if (!info->mode) {
+ kfree(info);
+ return ERR_PTR(-ENOMEM);
+ }
+
+ if (!memchr_inv(magic, 0, count * sizeof(u32))) {
+ dev_dbg(dev, "reboot mode %s with zero magic values\n", mode);
+ info->count = 0;
+ } else {
+ memcpy(info->magic, magic, count * sizeof(u32));
+ info->count = count;
+ }
+
+ return info;
+}
+
static int reboot_mode_create_device(struct reboot_mode_driver *reboot)
{
struct reboot_mode_sysfs_data *priv;
@@ -160,11 +234,38 @@ static int reboot_mode_create_device(struct reboot_mode_driver *reboot)
return 0;
error:
- reboot_mode_release_list(priv);
+ reboot_mode_release_list(&priv->head);
kfree(priv);
return ret;
}
+static int reboot_mode_add_predefined_modes(struct reboot_mode_driver *reboot)
+{
+ const struct reboot_mode_entry *modes = reboot->predefined_modes;
+ struct mode_info *info;
+ size_t i;
+
+ if (!modes)
+ return 0;
+
+ for (i = 0; i < reboot->predefined_mode_count; i++) {
+ if (modes[i].name && strpbrk(modes[i].name, "\n ,/"))
+ return -EINVAL;
+
+ if (!modes[i].count || modes[i].count > ARRAY_SIZE(modes[i].magic))
+ return -EINVAL;
+
+ info = reboot_mode_create_info(reboot->dev, modes[i].name,
+ modes[i].magic, modes[i].count);
+ if (IS_ERR(info))
+ return PTR_ERR(info);
+
+ list_add_tail(&info->list, &reboot->head);
+ }
+
+ return 0;
+}
+
/**
* reboot_mode_register - register a reboot mode driver
* @reboot: reboot mode driver
@@ -173,7 +274,7 @@ static int reboot_mode_create_device(struct reboot_mode_driver *reboot)
*/
int reboot_mode_register(struct reboot_mode_driver *reboot)
{
- struct mode_info *info = NULL;
+ struct mode_info *info;
struct property *prop;
struct device_node *np = reboot->dev->of_node;
size_t len = strlen(PREFIX);
@@ -183,52 +284,36 @@ int reboot_mode_register(struct reboot_mode_driver *reboot)
INIT_LIST_HEAD(&reboot->head);
- for_each_property_of_node(np, prop) {
- memset(magic, 0, sizeof(magic));
-
- if (strncmp(prop->name, PREFIX, len))
- continue;
-
- count = device_property_count_u32(reboot->dev, prop->name);
-
- if (count <= 0 || count > ARRAY_SIZE(magic) ||
- device_property_read_u32_array(reboot->dev, prop->name, magic, count)) {
- dev_dbg(reboot->dev, "reboot mode %s without magic number\n",
- prop->name);
- continue;
- }
-
- info = kzalloc_obj(*info, GFP_KERNEL);
- if (!info) {
- ret = -ENOMEM;
- goto error;
- }
-
- if (!memchr_inv(magic, 0, count * sizeof(u32))) {
- dev_dbg(reboot->dev, "reboot mode %s with zero magic values\n",
- prop->name);
- info->count = 0;
- } else {
- memcpy(info->magic, magic, count * sizeof(u32));
- info->count = count;
- }
-
- info->mode = kstrdup_const(prop->name + len, GFP_KERNEL);
- if (!info->mode) {
- ret = -ENOMEM;
- goto error;
- } else if (info->mode[0] == '\0') {
- kfree_const(info->mode);
- ret = -EINVAL;
- dev_err(reboot->dev, "invalid mode name(%s): too short!\n",
- prop->name);
- goto error;
+ if (np) {
+ for_each_property_of_node(np, prop) {
+ memset(magic, 0, sizeof(magic));
+ if (strncmp(prop->name, PREFIX, len))
+ continue;
+
+ count = device_property_count_u32(reboot->dev, prop->name);
+
+ if (count <= 0 || count > ARRAY_SIZE(magic) ||
+ device_property_read_u32_array(reboot->dev, prop->name, magic, count)) {
+ dev_dbg(reboot->dev, "reboot mode %s without magic number\n",
+ prop->name);
+ continue;
+ }
+
+ info = reboot_mode_create_info(reboot->dev, prop->name + len,
+ magic, count);
+ if (IS_ERR(info)) {
+ ret = PTR_ERR(info);
+ goto error;
+ }
+
+ list_add_tail(&info->list, &reboot->head);
}
-
- list_add_tail(&info->list, &reboot->head);
- info = NULL;
}
+ ret = reboot_mode_add_predefined_modes(reboot);
+ if (ret)
+ goto error;
+
reboot->reboot_notifier.notifier_call = reboot_mode_notify;
register_reboot_notifier(&reboot->reboot_notifier);
@@ -239,7 +324,6 @@ int reboot_mode_register(struct reboot_mode_driver *reboot)
return 0;
error:
- kfree(info);
reboot_mode_unregister(reboot);
return ret;
}
@@ -272,7 +356,7 @@ static inline void reboot_mode_unregister_device(struct reboot_mode_driver *rebo
if (!priv)
return;
- reboot_mode_release_list(priv);
+ reboot_mode_release_list(&priv->head);
kfree(priv);
}
@@ -282,17 +366,11 @@ static inline void reboot_mode_unregister_device(struct reboot_mode_driver *rebo
*/
int reboot_mode_unregister(struct reboot_mode_driver *reboot)
{
- struct mode_info *info;
- struct mode_info *next;
-
unregister_reboot_notifier(&reboot->reboot_notifier);
+ reboot->reboot_notifier.notifier_call = NULL;
reboot_mode_unregister_device(reboot);
- list_for_each_entry_safe(info, next, &reboot->head, list) {
- list_del(&info->list);
- kfree_const(info->mode);
- kfree(info);
- }
+ reboot_mode_release_list(&reboot->head);
return 0;
}
diff --git a/drivers/power/reset/syscon-reboot-mode.c b/drivers/power/reset/syscon-reboot-mode.c
index e0772c9f70f7..7d3a95e8dfd7 100644
--- a/drivers/power/reset/syscon-reboot-mode.c
+++ b/drivers/power/reset/syscon-reboot-mode.c
@@ -45,8 +45,11 @@ static int syscon_reboot_mode_probe(struct platform_device *pdev)
if (!syscon_rbm)
return -ENOMEM;
- syscon_rbm->reboot.dev = &pdev->dev;
- syscon_rbm->reboot.write = syscon_reboot_mode_write;
+ ret = reboot_mode_driver_init(&syscon_rbm->reboot, &pdev->dev,
+ syscon_reboot_mode_write, NULL,
+ NULL, 0);
+ if (ret)
+ return ret;
syscon_rbm->mask = 0xffffffff;
syscon_rbm->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
diff --git a/include/linux/reboot-mode.h b/include/linux/reboot-mode.h
index 29ae39935d69..560d8b4d67ac 100644
--- a/include/linux/reboot-mode.h
+++ b/include/linux/reboot-mode.h
@@ -4,14 +4,38 @@
#include <linux/types.h>
+struct reboot_mode_entry {
+ const char *name;
+ u32 magic[3];
+ u32 count;
+};
+
struct reboot_mode_driver {
struct device *dev;
struct list_head head;
+ /*
+ * Optional predefined reboot-mode table.
+ *
+ * Must be initialized before reboot_mode_register() and remain valid
+ * until reboot_mode_unregister().
+ *
+ * If a predefined mode name duplicates a DT-defined mode name,
+ * the DT-defined mode takes precedence.
+ */
+ const struct reboot_mode_entry *predefined_modes;
+ size_t predefined_mode_count;
+ int (*write_array)(struct reboot_mode_driver *reboot, const u32 *magic, u32 count);
int (*write)(struct reboot_mode_driver *reboot, unsigned int magic);
- int (*write_array)(struct reboot_mode_driver *reboot, const u32 *magic, int count);
struct notifier_block reboot_notifier;
};
+int reboot_mode_driver_init(struct reboot_mode_driver *reboot,
+ struct device *dev,
+ int (*write)(struct reboot_mode_driver *reboot, unsigned int magic),
+ int (*write_array)(struct reboot_mode_driver *reboot,
+ const u32 *magic, u32 count),
+ const struct reboot_mode_entry *predefined_modes,
+ size_t predefined_mode_count);
int reboot_mode_register(struct reboot_mode_driver *reboot);
int reboot_mode_unregister(struct reboot_mode_driver *reboot);
int devm_reboot_mode_register(struct device *dev,
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 03/12] firmware: psci: Introduce command-based resets
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 01/12] power: reset: reboot-mode: Support up to 3 magic values per mode Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 02/12] power: reset: reboot-mode: Add support for predefined reboot modes Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 04/12] mfd: psci-mfd: Add PSCI MFD driver for cpuidle-psci-domain cell Shivendra Pratap
` (8 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla
PSCI currently supports only two resets - SYSTEM_RESET and SYSTEM_RESET2
ARCH WARM reset. The reset patch is selected based on the Linux
reboot_mode variable. The PSCI specification now includes SYSTEM_RESET2
for vendor-specific resets but there's no mechanism to issue these
through psci_sys_reset().
Add a command-based reset mechanism that allows reboot-mode drivers to set
the PSCI reset command by passing a reset_type and a cookie.
Add support for the following reset commands:
- SYSTEM_RESET2 vendor-specific resets.
- SYSTEM_RESET2 ARCH WARM reset and SYSTEM_RESET (reset_type = 0 and
cookie one of psci_standard_resets).
Unsupported commands fall back to the regular PSCI reset path.
Default to the existing reboot_mode-based reset flow unless a reset
command is configured. If a kernel panic() or a emergency_restart()
occurs after a reset command is set but before the final PSCI reset is
issued, ignore the reset command and follow the normal reboot_mode-based
reset path.
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
drivers/firmware/psci/psci.c | 112 ++++++++++++++++++++++++++++++++++++++++++-
include/linux/psci.h | 15 ++++++
2 files changed, 125 insertions(+), 2 deletions(-)
diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c
index e73bae6cb23a..094303ef7c03 100644
--- a/drivers/firmware/psci/psci.c
+++ b/drivers/firmware/psci/psci.c
@@ -12,7 +12,9 @@
#include <linux/debugfs.h>
#include <linux/errno.h>
#include <linux/linkage.h>
+#include <linux/mutex.h>
#include <linux/of.h>
+#include <linux/panic.h>
#include <linux/pm.h>
#include <linux/printk.h>
#include <linux/psci.h>
@@ -22,6 +24,7 @@
#include <uapi/linux/psci.h>
+#include <asm/barrier.h>
#include <asm/cpuidle.h>
#include <asm/cputype.h>
#include <asm/hypervisor.h>
@@ -51,6 +54,15 @@ static int resident_cpu = -1;
struct psci_operations psci_ops;
static enum arm_smccc_conduit psci_conduit = SMCCC_CONDUIT_NONE;
+struct psci_system_reset_cmd {
+ u32 reset_type;
+ u64 cookie;
+};
+
+static struct psci_system_reset_cmd reset_cmd_data;
+static struct psci_system_reset_cmd *reset_cmd;
+static DEFINE_MUTEX(reset_cmd_mutex);
+
bool psci_tos_resident_on(int cpu)
{
return cpu == resident_cpu;
@@ -80,6 +92,61 @@ static u32 psci_cpu_suspend_feature;
static bool psci_system_reset2_supported;
static bool psci_system_off2_hibernate_supported;
+static u32 psci_get_sys_reset_fn(const struct psci_system_reset_cmd *cmd)
+{
+ switch (cmd->cookie) {
+ case PSCI_SYSTEM_RESET2_ARCH_WARM_RESET:
+ if (psci_system_reset2_supported)
+ return PSCI_FN_NATIVE(1_1, SYSTEM_RESET2);
+ return 0;
+ case PSCI_SYSTEM_RESET_COLD_RESET:
+ return PSCI_0_2_FN_SYSTEM_RESET;
+ default:
+ return 0;
+ }
+}
+
+/**
+ * psci_set_reset_cmd() - Configure the PSCI reset command
+ * @reset_type: SYSTEM_RESET2 reset type, or 0 for a standard reset
+ * @cookie: Vendor-defined SYSTEM_RESET2 cookie, or a value from
+ * enum psci_standard_resets when @reset_type is 0
+ *
+ * For vendor-specific SYSTEM_RESET2 resets, @reset_type and @cookie
+ * must contain platform-defined values.
+ *
+ * For standard resets, @reset_type must be 0 and @cookie must be a
+ * value from enum psci_standard_resets.
+ *
+ * The reset command may be configured only once per boot cycle.
+ */
+int psci_set_reset_cmd(u32 reset_type, u64 cookie)
+{
+ if (!reset_type && !cookie)
+ return -EINVAL;
+
+ scoped_guard(mutex, &reset_cmd_mutex) {
+ if (reset_cmd)
+ return -EBUSY;
+
+ reset_cmd_data.reset_type = reset_type;
+ reset_cmd_data.cookie = cookie;
+ /*
+ * Publish the command only after both fields are fully initialized.
+ * Readers run from the atomic restart notifier path and must not block.
+ */
+ smp_store_release(&reset_cmd, &reset_cmd_data);
+ }
+
+ return 0;
+}
+
+bool psci_has_system_reset2_support(void)
+{
+ return psci_system_reset2_supported;
+}
+EXPORT_SYMBOL_NS_GPL(psci_has_system_reset2_support, "PSCI");
+
static inline bool psci_has_ext_power_state(void)
{
return psci_cpu_suspend_feature &
@@ -306,8 +373,25 @@ static int get_set_conduit_method(const struct device_node *np)
return 0;
}
-static int psci_sys_reset(struct notifier_block *nb, unsigned long action,
- void *data)
+static void psci_handle_reset_cmd(const struct psci_system_reset_cmd *cmd)
+{
+ u32 psci_sys_reset_fn;
+
+ /* PSCI_1_1_RESET_TYPE_VENDOR_START identifies vendor reset types. */
+ if ((cmd->reset_type & PSCI_1_1_RESET_TYPE_VENDOR_START) &&
+ psci_system_reset2_supported) {
+ /* PSCI SYSTEM_RESET2 Vendor-specific reset */
+ invoke_psci_fn(PSCI_FN_NATIVE(1_1, SYSTEM_RESET2),
+ cmd->reset_type, cmd->cookie, 0);
+ } else {
+ /* Retrieve the psci reset function from reset_cmd */
+ psci_sys_reset_fn = psci_get_sys_reset_fn(cmd);
+ if (!cmd->reset_type && psci_sys_reset_fn)
+ invoke_psci_fn(psci_sys_reset_fn, 0, 0, 0);
+ }
+}
+
+static void psci_handle_reboot_mode(void)
{
if ((reboot_mode == REBOOT_WARM || reboot_mode == REBOOT_SOFT) &&
psci_system_reset2_supported) {
@@ -320,6 +404,30 @@ static int psci_sys_reset(struct notifier_block *nb, unsigned long action,
} else {
invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);
}
+}
+
+static int psci_sys_reset(struct notifier_block *nb, unsigned long action,
+ void *data)
+{
+ const struct psci_system_reset_cmd *cmd;
+
+ /* The function psci_handle_reboot_mode follows reboot_mode based
+ * reset flow and psci_handle_reset_cmd uses reset_cmd based reset flow.
+ *
+ * The reset_cmd is configured at the reboot_notifier phase.
+ * If panic() or emergency_restart() occurs between the reboot_notifier
+ * and this final reset, skip command-based reset and let reboot_mode drive
+ * the reset flow.
+ *
+ * The function psci_handle_reset_cmd invokes non-returning PSCI SYSTEM_RESET
+ * calls to reset the device. If it returns, either the reset failed, or the
+ * command was unsupported. Fallback to reboot_mode based reset flow.
+ */
+ cmd = smp_load_acquire(&reset_cmd);
+ if (data && cmd && !panic_in_progress())
+ psci_handle_reset_cmd(cmd);
+
+ psci_handle_reboot_mode();
return NOTIFY_DONE;
}
diff --git a/include/linux/psci.h b/include/linux/psci.h
index 4ca0060a3fc4..e81b1cdeca51 100644
--- a/include/linux/psci.h
+++ b/include/linux/psci.h
@@ -8,6 +8,7 @@
#define __LINUX_PSCI_H
#include <linux/arm-smccc.h>
+#include <linux/errno.h>
#include <linux/init.h>
#include <linux/types.h>
@@ -21,6 +22,16 @@ bool psci_power_state_is_valid(u32 state);
int psci_set_osi_mode(bool enable);
bool psci_has_osi_support(void);
+/**
+ * enum psci_standard_resets - Standard reset selectors for PSCI reset
+ * @PSCI_SYSTEM_RESET_COLD_RESET: Standard SYSTEM_RESET command.
+ * @PSCI_SYSTEM_RESET2_ARCH_WARM_RESET: SYSTEM_RESET2 architectural warm reset.
+ */
+enum psci_standard_resets {
+ PSCI_SYSTEM_RESET_COLD_RESET = 1,
+ PSCI_SYSTEM_RESET2_ARCH_WARM_RESET,
+};
+
struct psci_operations {
u32 (*get_version)(void);
int (*cpu_suspend)(u32 state, unsigned long entry_point);
@@ -45,8 +56,12 @@ struct psci_0_1_function_ids get_psci_0_1_function_ids(void);
#if defined(CONFIG_ARM_PSCI_FW)
int __init psci_dt_init(void);
+int psci_set_reset_cmd(u32 reset_type, u64 cookie);
+bool psci_has_system_reset2_support(void);
#else
static inline int psci_dt_init(void) { return 0; }
+static inline int psci_set_reset_cmd(u32 reset_type, u64 cookie) { return -EOPNOTSUPP; }
+static inline bool psci_has_system_reset2_support(void) { return false; }
#endif
#if defined(CONFIG_ARM_PSCI_FW) && defined(CONFIG_ACPI)
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 04/12] mfd: psci-mfd: Add PSCI MFD driver for cpuidle-psci-domain cell
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
` (2 preceding siblings ...)
2026-08-03 9:43 ` [PATCH v24 03/12] firmware: psci: Introduce command-based resets Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 05/12] dt-bindings: arm: Document reboot mode magic Shivendra Pratap
` (7 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla, Bartosz Golaszewski
PSCI has multiple kernel consumers, such as cpuidle-psci-domain.
Currently, both the PSCI core driver and cpuidle-psci-domain bind
directly to the same PSCI node "arm,psci-1.0". Additional consumers, if
introduced, would also need to bind in the same way, leading to several
drivers attached to a single device node.
Introduce a PSCI MFD driver that binds to "arm,psci-1.0" and registers
PSCI child cells. As the first user, register cpuidle-psci-domain as a
child cell.
Update cpuidle-psci-domain to probe as an MFD child and use the parent
PSCI node for power-domain traversal.
Suggested-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
MAINTAINERS | 1 +
drivers/cpuidle/Kconfig.arm | 1 +
drivers/cpuidle/cpuidle-psci-domain.c | 9 +-------
drivers/mfd/Kconfig | 12 ++++++++++
drivers/mfd/Makefile | 2 ++
drivers/mfd/psci-mfd.c | 43 +++++++++++++++++++++++++++++++++++
6 files changed, 60 insertions(+), 8 deletions(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index fe67f7bfa44c..0b6e4f89f319 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -21671,6 +21671,7 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
F: Documentation/devicetree/bindings/arm/psci.yaml
F: drivers/firmware/psci/
+F: drivers/mfd/psci-mfd.c
F: include/linux/psci.h
F: include/uapi/linux/psci.h
diff --git a/drivers/cpuidle/Kconfig.arm b/drivers/cpuidle/Kconfig.arm
index b88b01aa5829..c5ecca0d7397 100644
--- a/drivers/cpuidle/Kconfig.arm
+++ b/drivers/cpuidle/Kconfig.arm
@@ -36,6 +36,7 @@ config ARM_PSCI_CPUIDLE_DOMAIN
bool "PSCI CPU idle Domain"
depends on ARM_PSCI_CPUIDLE
depends on PM_GENERIC_DOMAINS_OF
+ depends on MFD_PSCI
select DT_IDLE_GENPD
default y
help
diff --git a/drivers/cpuidle/cpuidle-psci-domain.c b/drivers/cpuidle/cpuidle-psci-domain.c
index b9e4ad7d43a3..a2d01810f295 100644
--- a/drivers/cpuidle/cpuidle-psci-domain.c
+++ b/drivers/cpuidle/cpuidle-psci-domain.c
@@ -17,7 +17,6 @@
#include <linux/pm_runtime.h>
#include <linux/psci.h>
#include <linux/slab.h>
-#include <linux/string.h>
#include "cpuidle-psci.h"
#include "dt_idle_genpd.h"
@@ -122,14 +121,9 @@ static void psci_pd_remove(void)
}
}
-static const struct of_device_id psci_of_match[] = {
- { .compatible = "arm,psci-1.0" },
- {}
-};
-
static int psci_cpuidle_domain_probe(struct platform_device *pdev)
{
- struct device_node *np = pdev->dev.of_node;
+ struct device_node *np = pdev->dev.parent->of_node;
bool use_osi = psci_has_osi_support();
int ret = 0, pd_count = 0;
@@ -181,7 +175,6 @@ static struct platform_driver psci_cpuidle_domain_driver = {
.probe = psci_cpuidle_domain_probe,
.driver = {
.name = "psci-cpuidle-domain",
- .of_match_table = psci_of_match,
},
};
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index e4fd4572472f..d18655d76172 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -2374,6 +2374,18 @@ config MFD_KHADAS_MCU
additional drivers must be enabled in order to use the functionality
of the device.
+config MFD_PSCI
+ bool "PSCI MFD for psci child cells"
+ depends on ARM_PSCI_FW
+ depends on OF
+ select MFD_CORE
+ default y
+ help
+ PSCI MFD registers PSCI child cells and exposes them as
+ platform devices. Child drivers are probed only if enabled in the
+ kernel configuration. Select this option whenever a supported PSCI
+ child driver is selected.
+
config MFD_ACER_A500_EC
tristate "Support for Acer Iconia Tab A500 Embedded Controller"
depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 72d3944b0ad8..f3edfad702ff 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -24,6 +24,8 @@ obj-$(CONFIG_MFD_EXYNOS_LPASS) += exynos-lpass.o
obj-$(CONFIG_MFD_GATEWORKS_GSC) += gateworks-gsc.o
obj-$(CONFIG_MFD_MACSMC) += macsmc.o
+obj-$(CONFIG_MFD_PSCI) += psci-mfd.o
+
obj-$(CONFIG_MFD_TI_LP873X) += lp873x.o
obj-$(CONFIG_MFD_TI_LP87565) += lp87565.o
obj-$(CONFIG_MFD_TI_AM335X_TSCADC) += ti_am335x_tscadc.o
diff --git a/drivers/mfd/psci-mfd.c b/drivers/mfd/psci-mfd.c
new file mode 100644
index 000000000000..7affd6bb09dd
--- /dev/null
+++ b/drivers/mfd/psci-mfd.c
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#include <linux/mfd/core.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+static const struct mfd_cell psci_cells[] = {
+ {
+ .name = "psci-cpuidle-domain",
+ },
+};
+
+static int psci_mfd_probe(struct platform_device *pdev)
+{
+ return devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO, psci_cells,
+ ARRAY_SIZE(psci_cells), NULL, 0, NULL);
+}
+
+static const struct of_device_id psci_mfd_of_match[] = {
+ { .compatible = "arm,psci-1.0" },
+ { }
+};
+
+static struct platform_driver psci_mfd_driver = {
+ .probe = psci_mfd_probe,
+ .driver = {
+ .name = "psci-mfd",
+ .of_match_table = psci_mfd_of_match,
+ },
+};
+
+static int __init psci_mfd_init(void)
+{
+ return platform_driver_register(&psci_mfd_driver);
+}
+
+core_initcall(psci_mfd_init);
+
+MODULE_LICENSE("GPL");
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 05/12] dt-bindings: arm: Document reboot mode magic
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
` (3 preceding siblings ...)
2026-08-03 9:43 ` [PATCH v24 04/12] mfd: psci-mfd: Add PSCI MFD driver for cpuidle-psci-domain cell Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 11:44 ` Rob Herring (Arm)
2026-08-03 14:02 ` Rob Herring
2026-08-03 9:43 ` [PATCH v24 06/12] power: reset: Add psci-reboot-mode driver Shivendra Pratap
` (6 subsequent siblings)
11 siblings, 2 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla
Add bindings to describe vendor-specific reboot modes. Values here
correspond to valid parameters to vendor-specific reset types in PSCI
SYSTEM_RESET2 call.
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
Documentation/devicetree/bindings/arm/psci.yaml | 58 +++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/Documentation/devicetree/bindings/arm/psci.yaml b/Documentation/devicetree/bindings/arm/psci.yaml
index 6e2e0c551841..7d6a86690a2e 100644
--- a/Documentation/devicetree/bindings/arm/psci.yaml
+++ b/Documentation/devicetree/bindings/arm/psci.yaml
@@ -98,6 +98,41 @@ properties:
[1] Kernel documentation - ARM idle states bindings
Documentation/devicetree/bindings/cpu/idle-states.yaml
+ reboot-mode:
+ type: object
+ $ref: /schemas/power/reset/reboot-mode.yaml#
+ unevaluatedProperties: false
+ properties:
+ # "mode-normal" is just SYSTEM_RESET
+ mode-normal: false
+ patternProperties:
+ "^mode-.*$":
+ minItems: 1
+ maxItems: 3
+ items:
+ - description: arg1 (vendor-specific SYSTEM_RESET2 reset_type)
+ allOf:
+ - $ref: /schemas/types.yaml#/definitions/uint32
+ - minimum: 0x80000000
+ - description: arg2 (cookie_lo in 2-cell form, cookie_hi in 3-cell form)
+ $ref: /schemas/types.yaml#/definitions/uint32
+ - description: arg3 (cookie_lo in 3-cell form)
+ $ref: /schemas/types.yaml#/definitions/uint32
+ description: |
+ Describes a PSCI SYSTEM_RESET2 vendor-specific reset type. The string
+ after "mode-" maps a reboot mode to a vendor-specific reset.
+ A vendor-specific reset takes two arguments, a 32-bit reset_type and a
+ 64-bit cookie. The arguments are encoded as up to three 32-bit cells.
+ Each mode property is encoded as mode-xxx = <arg1[, arg2[, arg3]]>,
+ where:
+ - arg1 is reset_type and must be >= 0x80000000.
+ - In 2-cell form, arg2 is lower 32 bits of cookie.
+ - In 3-cell form, arg2 is high 32 bits of cookie
+ and arg3 is low 32 bits of cookie.
+
+ All values should be provided as per the PSCI SYSTEM_RESET2
+ specification.
+
patternProperties:
"^power-domain-":
$ref: /schemas/power/power-domain.yaml#
@@ -137,6 +172,15 @@ allOf:
required:
- cpu_off
- cpu_on
+ - if:
+ not:
+ properties:
+ compatible:
+ contains:
+ const: arm,psci-1.0
+ then:
+ properties:
+ reboot-mode: false
additionalProperties: false
@@ -260,4 +304,18 @@ examples:
domain-idle-states = <&cluster_ret>, <&cluster_pwrdn>;
};
};
+
+ - |+
+
+ // Case 5: SYSTEM_RESET2 vendor resets
+ psci {
+ compatible = "arm,psci-1.0";
+ method = "smc";
+
+ reboot-mode {
+ mode-edl = <0x80000000 0x00000001>;
+ mode-bootloader = <0x80010001 0x00000002>;
+ mode-vendor = <0x80000000 0x00000001 0x00000002>;
+ };
+ };
...
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH v24 05/12] dt-bindings: arm: Document reboot mode magic
2026-08-03 9:43 ` [PATCH v24 05/12] dt-bindings: arm: Document reboot mode magic Shivendra Pratap
@ 2026-08-03 11:44 ` Rob Herring (Arm)
2026-08-03 12:46 ` Shivendra Pratap
2026-08-03 14:02 ` Rob Herring
1 sibling, 1 reply; 17+ messages in thread
From: Rob Herring (Arm) @ 2026-08-03 11:44 UTC (permalink / raw)
To: Shivendra Pratap
Cc: Florian Fainelli, linux-pm, Rafael J. Wysocki, Mark Rutland,
Lee Jones, Krzysztof Kozlowski, Konrad Dybcio, Bjorn Andersson,
Lorenzo Pieralisi, Dmitry Baryshkov, Ulf Hansson,
Souvik Chakravarty, Mukesh Ojha, Arnd Bergmann, Conor Dooley,
linux-arm-kernel, Sebastian Reichel, Srinivas Kandagatla,
Andy Yan, Greg Kroah-Hartman, Krzysztof Kozlowski,
Matthias Brugger, Christian Loehle, Daniel Lezcano, Pavan Kondeti,
Sudeep Holla, Kathiravan Thirumoorthy, devicetree, Andre Draszik,
Bartosz Golaszewski, John Stultz, mfd, linux-kernel,
linux-arm-msm, Moritz Fischer
On Mon, 03 Aug 2026 15:13:36 +0530, Shivendra Pratap wrote:
> Add bindings to describe vendor-specific reboot modes. Values here
> correspond to valid parameters to vendor-specific reset types in PSCI
> SYSTEM_RESET2 call.
>
> Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
> ---
> Documentation/devicetree/bindings/arm/psci.yaml | 58 +++++++++++++++++++++++++
> 1 file changed, 58 insertions(+)
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/arm/psci.yaml: properties:reboot-mode:patternProperties:^mode-.*$: {'minItems': 1, 'maxItems': 3, 'items': [{'description': 'arg1 (vendor-specific SYSTEM_RESET2 reset_type)', 'allOf': [{'$ref': '/schemas/types.yaml#/definitions/uint32'}, {'minimum': 2147483648}]}, {'description': 'arg2 (cookie_lo in 2-cell form, cookie_hi in 3-cell form)', '$ref': '/schemas/types.yaml#/definitions/uint32'}, {'description': 'arg3 (cookie_lo in 3-cell form)', '$ref': '/schemas/types.yaml#/definitions/uint32'}], 'description': 'Describes a PSCI SYSTEM_RESET2 vendor-specific reset type. The string\nafter "mode-" maps a reboot mode to a vendor-specific reset.\nA vendor-specific reset takes two arguments, a 32-bit reset_type and a\n64-bit cookie. The arguments are encoded as up to three 32-bit cells.\nEach mode property is encoded as mode-xxx = <arg1[, arg2[, arg3]]>,\nwhere:\n- arg1 is reset_type and must be >= 0x80000000.\n- In 2-cel
l form, arg2 is lower 32 bits of cookie.\n- In 3-cell form, arg2 is high 32 bits of cookie\n and arg3 is low 32 bits of cookie.\n\nAll values should be provided as per the PSCI SYSTEM_RESET2\nspecification.\n'} should not be valid under {'required': ['maxItems']}
hint: "maxItems" is not needed with an "items" list
from schema $id: http://devicetree.org/meta-schemas/items.yaml
doc reference errors (make refcheckdocs):
See https://patchwork.kernel.org/project/devicetree/patch/20260803-arm-psci-system_reset2-vendor-reboots-v24-5-889281373870@oss.qualcomm.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH v24 05/12] dt-bindings: arm: Document reboot mode magic
2026-08-03 11:44 ` Rob Herring (Arm)
@ 2026-08-03 12:46 ` Shivendra Pratap
0 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 12:46 UTC (permalink / raw)
To: Rob Herring (Arm)
Cc: Florian Fainelli, linux-pm, Rafael J. Wysocki, Mark Rutland,
Lee Jones, Krzysztof Kozlowski, Konrad Dybcio, Bjorn Andersson,
Lorenzo Pieralisi, Dmitry Baryshkov, Ulf Hansson,
Souvik Chakravarty, Mukesh Ojha, Arnd Bergmann, Conor Dooley,
linux-arm-kernel, Sebastian Reichel, Srinivas Kandagatla,
Andy Yan, Greg Kroah-Hartman, Krzysztof Kozlowski,
Matthias Brugger, Christian Loehle, Daniel Lezcano, Pavan Kondeti,
Sudeep Holla, Kathiravan Thirumoorthy, devicetree, Andre Draszik,
Bartosz Golaszewski, John Stultz, mfd, linux-kernel,
linux-arm-msm, Moritz Fischer
On 8/3/2026 5:14 PM, Rob Herring (Arm) wrote:
>
> On Mon, 03 Aug 2026 15:13:36 +0530, Shivendra Pratap wrote:
>> Add bindings to describe vendor-specific reboot modes. Values here
>> correspond to valid parameters to vendor-specific reset types in PSCI
>> SYSTEM_RESET2 call.
>>
>> Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
>> ---
>> Documentation/devicetree/bindings/arm/psci.yaml | 58 +++++++++++++++++++++++++
>> 1 file changed, 58 insertions(+)
>>
>
> My bot found errors running 'make dt_binding_check' on your patch:
>
> yamllint warnings/errors:
>
> dtschema/dtc warnings/errors:
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/arm/psci.yaml: properties:reboot-mode:patternProperties:^mode-.*$: {'minItems': 1, 'maxItems': 3, 'items': [{'description': 'arg1 (vendor-specific SYSTEM_RESET2 reset_type)', 'allOf': [{'$ref': '/schemas/types.yaml#/definitions/uint32'}, {'minimum': 2147483648}]}, {'description': 'arg2 (cookie_lo in 2-cell form, cookie_hi in 3-cell form)', '$ref': '/schemas/types.yaml#/definitions/uint32'}, {'description': 'arg3 (cookie_lo in 3-cell form)', '$ref': '/schemas/types.yaml#/definitions/uint32'}], 'description': 'Describes a PSCI SYSTEM_RESET2 vendor-specific reset type. The string\nafter "mode-" maps a reboot mode to a vendor-specific reset.\nA vendor-specific reset takes two arguments, a 32-bit reset_type and a\n64-bit cookie. The arguments are encoded as up to three 32-bit cells.\nEach mode property is encoded as mode-xxx = <arg1[, arg2[, arg3]]>,\nwhere:\n- arg1 is reset_type and must be >= 0x80000000.\n- In 2-cel
> l form, arg2 is lower 32 bits of cookie.\n- In 3-cell form, arg2 is high 32 bits of cookie\n and arg3 is low 32 bits of cookie.\n\nAll values should be provided as per the PSCI SYSTEM_RESET2\nspecification.\n'} should not be valid under {'required': ['maxItems']}
> hint: "maxItems" is not needed with an "items" list
> from schema $id: http://devicetree.org/meta-schemas/items.yaml
>
> doc reference errors (make refcheckdocs):
>
> See https://patchwork.kernel.org/project/devicetree/patch/20260803-arm-psci-system_reset2-vendor-reboots-v24-5-889281373870@oss.qualcomm.com
>
> The base for the series is generally the latest rc1. A different dependency
> should be noted in *this* patch.
>
> If you already ran 'make dt_binding_check' and didn't see the above
> error(s), then make sure 'yamllint' is installed and dt-schema is up to
> date:
>
> pip3 install dtschema --upgrade
>
> Please check and re-submit after running the above command yourself. Note
> that DT_SCHEMA_FILES can be set to your schema file to speed up checking
> your schema. However, it must be unset to test all examples with your schema.
>
thanks will check and update this patch.
thanks,
Shivendra
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v24 05/12] dt-bindings: arm: Document reboot mode magic
2026-08-03 9:43 ` [PATCH v24 05/12] dt-bindings: arm: Document reboot mode magic Shivendra Pratap
2026-08-03 11:44 ` Rob Herring (Arm)
@ 2026-08-03 14:02 ` Rob Herring
2026-08-03 14:21 ` Shivendra Pratap
1 sibling, 1 reply; 17+ messages in thread
From: Rob Herring @ 2026-08-03 14:02 UTC (permalink / raw)
To: Shivendra Pratap
Cc: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Souvik Chakravarty, Krzysztof Kozlowski,
Andy Yan, Matthias Brugger, Mark Rutland, Conor Dooley,
Konrad Dybcio, John Stultz, Moritz Fischer, Rafael J. Wysocki,
Daniel Lezcano, Christian Loehle, Lee Jones, Ulf Hansson,
Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Srinivas Kandagatla
On Mon, Aug 03, 2026 at 03:13:36PM +0530, Shivendra Pratap wrote:
> Add bindings to describe vendor-specific reboot modes. Values here
> correspond to valid parameters to vendor-specific reset types in PSCI
> SYSTEM_RESET2 call.
>
> Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
> ---
> Documentation/devicetree/bindings/arm/psci.yaml | 58 +++++++++++++++++++++++++
> 1 file changed, 58 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/arm/psci.yaml b/Documentation/devicetree/bindings/arm/psci.yaml
> index 6e2e0c551841..7d6a86690a2e 100644
> --- a/Documentation/devicetree/bindings/arm/psci.yaml
> +++ b/Documentation/devicetree/bindings/arm/psci.yaml
> @@ -98,6 +98,41 @@ properties:
> [1] Kernel documentation - ARM idle states bindings
> Documentation/devicetree/bindings/cpu/idle-states.yaml
>
> + reboot-mode:
> + type: object
> + $ref: /schemas/power/reset/reboot-mode.yaml#
> + unevaluatedProperties: false
> + properties:
> + # "mode-normal" is just SYSTEM_RESET
> + mode-normal: false
> + patternProperties:
> + "^mode-.*$":
> + minItems: 1
> + maxItems: 3
> + items:
> + - description: arg1 (vendor-specific SYSTEM_RESET2 reset_type)
> + allOf:
Don't need allOf here.
> + - $ref: /schemas/types.yaml#/definitions/uint32
> + - minimum: 0x80000000
> + - description: arg2 (cookie_lo in 2-cell form, cookie_hi in 3-cell form)
> + $ref: /schemas/types.yaml#/definitions/uint32
> + - description: arg3 (cookie_lo in 3-cell form)
> + $ref: /schemas/types.yaml#/definitions/uint32
> + description: |
> + Describes a PSCI SYSTEM_RESET2 vendor-specific reset type. The string
> + after "mode-" maps a reboot mode to a vendor-specific reset.
Blank line if this is a paragraph.
> + A vendor-specific reset takes two arguments, a 32-bit reset_type and a
> + 64-bit cookie. The arguments are encoded as up to three 32-bit cells.
> + Each mode property is encoded as mode-xxx = <arg1[, arg2[, arg3]]>,
> + where:
blank line
> + - arg1 is reset_type and must be >= 0x80000000.
> + - In 2-cell form, arg2 is lower 32 bits of cookie.
> + - In 3-cell form, arg2 is high 32 bits of cookie
> + and arg3 is low 32 bits of cookie.
Indent the list by 2 more spaces.
> +
> + All values should be provided as per the PSCI SYSTEM_RESET2
> + specification.
> +
> patternProperties:
> "^power-domain-":
> $ref: /schemas/power/power-domain.yaml#
> @@ -137,6 +172,15 @@ allOf:
> required:
> - cpu_off
> - cpu_on
> + - if:
> + not:
> + properties:
> + compatible:
> + contains:
> + const: arm,psci-1.0
SYSTEM_RESET2 was introduced in PSCI 1.1...
> + then:
> + properties:
> + reboot-mode: false
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v24 05/12] dt-bindings: arm: Document reboot mode magic
2026-08-03 14:02 ` Rob Herring
@ 2026-08-03 14:21 ` Shivendra Pratap
0 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 14:21 UTC (permalink / raw)
To: Rob Herring
Cc: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Souvik Chakravarty, Krzysztof Kozlowski,
Andy Yan, Matthias Brugger, Mark Rutland, Conor Dooley,
Konrad Dybcio, John Stultz, Moritz Fischer, Rafael J. Wysocki,
Daniel Lezcano, Christian Loehle, Lee Jones, Ulf Hansson,
Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Srinivas Kandagatla
On 8/3/2026 7:32 PM, Rob Herring wrote:
> On Mon, Aug 03, 2026 at 03:13:36PM +0530, Shivendra Pratap wrote:
>> Add bindings to describe vendor-specific reboot modes. Values here
>> correspond to valid parameters to vendor-specific reset types in PSCI
>> SYSTEM_RESET2 call.
>>
>> Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
>> ---
>> Documentation/devicetree/bindings/arm/psci.yaml | 58 +++++++++++++++++++++++++
>> 1 file changed, 58 insertions(+)
>>
>> diff --git a/Documentation/devicetree/bindings/arm/psci.yaml b/Documentation/devicetree/bindings/arm/psci.yaml
>> index 6e2e0c551841..7d6a86690a2e 100644
>> --- a/Documentation/devicetree/bindings/arm/psci.yaml
>> +++ b/Documentation/devicetree/bindings/arm/psci.yaml
>> @@ -98,6 +98,41 @@ properties:
>> [1] Kernel documentation - ARM idle states bindings
>> Documentation/devicetree/bindings/cpu/idle-states.yaml
>>
>> + reboot-mode:
>> + type: object
>> + $ref: /schemas/power/reset/reboot-mode.yaml#
>> + unevaluatedProperties: false
>> + properties:
>> + # "mode-normal" is just SYSTEM_RESET
>> + mode-normal: false
>> + patternProperties:
>> + "^mode-.*$":
>> + minItems: 1
>> + maxItems: 3
>> + items:
>> + - description: arg1 (vendor-specific SYSTEM_RESET2 reset_type)
>> + allOf:
>
> Don't need allOf here.
Ack.
>
>> + - $ref: /schemas/types.yaml#/definitions/uint32
>> + - minimum: 0x80000000
>> + - description: arg2 (cookie_lo in 2-cell form, cookie_hi in 3-cell form)
>> + $ref: /schemas/types.yaml#/definitions/uint32
>> + - description: arg3 (cookie_lo in 3-cell form)
>> + $ref: /schemas/types.yaml#/definitions/uint32
>> + description: |
>> + Describes a PSCI SYSTEM_RESET2 vendor-specific reset type. The string
>> + after "mode-" maps a reboot mode to a vendor-specific reset.
>
> Blank line if this is a paragraph.
Ack.
>
>> + A vendor-specific reset takes two arguments, a 32-bit reset_type and a
>> + 64-bit cookie. The arguments are encoded as up to three 32-bit cells.
>> + Each mode property is encoded as mode-xxx = <arg1[, arg2[, arg3]]>,
>> + where:
>
> blank line
Ack.
>
>> + - arg1 is reset_type and must be >= 0x80000000.
>> + - In 2-cell form, arg2 is lower 32 bits of cookie.
>> + - In 3-cell form, arg2 is high 32 bits of cookie
>> + and arg3 is low 32 bits of cookie.
>
> Indent the list by 2 more spaces.
Ack.
>
>> +
>> + All values should be provided as per the PSCI SYSTEM_RESET2
>> + specification.
>> +
>> patternProperties:
>> "^power-domain-":
>> $ref: /schemas/power/power-domain.yaml#
>> @@ -137,6 +172,15 @@ allOf:
>> required:
>> - cpu_off
>> - cpu_on
>> + - if:
>> + not:
>> + properties:
>> + compatible:
>> + contains:
>> + const: arm,psci-1.0
>
> SYSTEM_RESET2 was introduced in PSCI 1.1...
thanks. will update.
thanks,
Shivendra
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v24 06/12] power: reset: Add psci-reboot-mode driver
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
` (4 preceding siblings ...)
2026-08-03 9:43 ` [PATCH v24 05/12] dt-bindings: arm: Document reboot mode magic Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 07/12] mfd: core: Add firmware-node support to MFD cells Shivendra Pratap
` (5 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla, Bartosz Golaszewski
PSCI supports different types of resets like SYSTEM_RESET, SYSTEM_RESET2
ARCH WARM reset and SYSTEM_RESET2 vendor-specific resets. Currently
there is no common driver that handles all supported psci resets at one
place. Additionally, there is no common mechanism to issue the supported
psci resets from userspace.
Add a psci-reboot-mode driver, and define two types of PSCI resets,
predefined-resets and vendor-specific resets. Predefined-resets are
defined by psci driver and vendor-specific resets are defined by SoC
vendors, under the psci:reboot-mode node of SoC device tree.
Register the driver with the reboot-mode framework to interface these
resets to userspace. When userspace initiates a supported command, pass
the reset arguments to the PSCI driver to enable command-based reset.
This change allows userspace to issue supported PSCI reset commands
using the standard reboot system calls while enabling SoC vendors to
define their specific resets for PSCI.
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
MAINTAINERS | 1 +
drivers/power/reset/Kconfig | 10 +++++
drivers/power/reset/Makefile | 1 +
drivers/power/reset/psci-reboot-mode.c | 82 ++++++++++++++++++++++++++++++++++
4 files changed, 94 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 0b6e4f89f319..a3339b98ba86 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -21672,6 +21672,7 @@ S: Maintained
F: Documentation/devicetree/bindings/arm/psci.yaml
F: drivers/firmware/psci/
F: drivers/mfd/psci-mfd.c
+F: drivers/power/reset/psci-reboot-mode.c
F: include/linux/psci.h
F: include/uapi/linux/psci.h
diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
index bce996bbef28..143f3260f04a 100644
--- a/drivers/power/reset/Kconfig
+++ b/drivers/power/reset/Kconfig
@@ -360,6 +360,16 @@ config NVMEM_REBOOT_MODE
then the bootloader can read it and take different
action according to the mode.
+config PSCI_REBOOT_MODE
+ bool "PSCI reboot mode driver"
+ depends on ARM_PSCI_FW || COMPILE_TEST
+ select REBOOT_MODE
+ help
+ Say y here will enable PSCI reboot mode driver. This gets
+ the PSCI reboot mode arguments and passes them to psci
+ driver. psci driver uses these arguments for issuing
+ device reset into different boot states.
+
config POWER_MLXBF
tristate "Mellanox BlueField power handling driver"
depends on (GPIO_MLXBF2 || GPIO_MLXBF3) && ACPI
diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile
index e31cab4ba78e..45d8aaaffaa1 100644
--- a/drivers/power/reset/Makefile
+++ b/drivers/power/reset/Makefile
@@ -41,5 +41,6 @@ obj-$(CONFIG_REBOOT_MODE) += reboot-mode.o
obj-$(CONFIG_SYSCON_REBOOT_MODE) += syscon-reboot-mode.o
obj-$(CONFIG_POWER_RESET_SC27XX) += sc27xx-poweroff.o
obj-$(CONFIG_NVMEM_REBOOT_MODE) += nvmem-reboot-mode.o
+obj-$(CONFIG_PSCI_REBOOT_MODE) += psci-reboot-mode.o
obj-$(CONFIG_POWER_MLXBF) += pwr-mlxbf.o
obj-$(CONFIG_POWER_RESET_QEMU_VIRT_CTRL) += qemu-virt-ctrl.o
diff --git a/drivers/power/reset/psci-reboot-mode.c b/drivers/power/reset/psci-reboot-mode.c
new file mode 100644
index 000000000000..2f960fda8229
--- /dev/null
+++ b/drivers/power/reset/psci-reboot-mode.c
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#include <linux/array_size.h>
+#include <linux/device.h>
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/psci.h>
+#include <linux/reboot-mode.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+
+static const struct reboot_mode_entry psci_resets[] = {
+ {
+ .name = "psci-system-reset",
+ .magic = { 0, PSCI_SYSTEM_RESET_COLD_RESET },
+ .count = 2,
+ },
+ {
+ .name = "psci-system-reset2-arch-warm-reset",
+ .magic = { 0, PSCI_SYSTEM_RESET2_ARCH_WARM_RESET },
+ .count = 2,
+ },
+};
+
+static u64 psci_reboot_mode_get_cookie(const u32 *magic, int count)
+{
+ u64 cookie = 0;
+ int i;
+
+ /* Build cookie from arg2/arg3 cells in order: cookie_hi then cookie_lo. */
+ for (i = 1; i < count; i++)
+ cookie = (cookie << 32) | magic[i];
+
+ return cookie;
+}
+
+static int psci_reboot_mode_write(struct reboot_mode_driver *reboot,
+ const u32 *magic, u32 count)
+{
+ (void)reboot;
+
+ if (count < 1 || count > 3)
+ return -EINVAL;
+
+ return psci_set_reset_cmd(magic[0], psci_reboot_mode_get_cookie(magic, count));
+}
+
+static int psci_reboot_mode_probe(struct platform_device *pdev)
+{
+ struct reboot_mode_driver *reboot;
+ size_t count;
+ int ret;
+
+ reboot = devm_kzalloc(&pdev->dev, sizeof(*reboot), GFP_KERNEL);
+ if (!reboot)
+ return -ENOMEM;
+
+ /* Skip PSCI SYSTEM_RESET2 modes if unsupported */
+ count = psci_has_system_reset2_support() ? ARRAY_SIZE(psci_resets) : 1;
+
+ ret = reboot_mode_driver_init(reboot, &pdev->dev, NULL,
+ psci_reboot_mode_write, psci_resets, count);
+ if (ret)
+ return ret;
+
+ return devm_reboot_mode_register(&pdev->dev, reboot);
+}
+
+static struct platform_driver psci_reboot_mode_driver = {
+ .probe = psci_reboot_mode_probe,
+ .driver = {
+ .name = "psci-reboot-mode",
+ },
+};
+module_platform_driver(psci_reboot_mode_driver);
+
+MODULE_DESCRIPTION("PSCI reboot mode driver");
+MODULE_LICENSE("GPL");
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 07/12] mfd: core: Add firmware-node support to MFD cells
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
` (5 preceding siblings ...)
2026-08-03 9:43 ` [PATCH v24 06/12] power: reset: Add psci-reboot-mode driver Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 08/12] mfd: psci-mfd: Add psci-reboot-mode child cell Shivendra Pratap
` (4 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla, Bartosz Golaszewski
MFD core has no way to register a child device using an explicit firmware
node. This prevents drivers from registering child nodes when those nodes
do not define a compatible string. One such example is the PSCI
"reboot-mode" node, which omits a compatible string as it describes
boot-states provided by the underlying firmware.
Extend struct mfd_cell with a named firmware-node field to identify a
child node under the MFD parent. The node is added to the MFD child
device during registration when none is assigned by device tree, ACPI,
or software matching.
Suggested-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
drivers/mfd/mfd-core.c | 151 +++++++++++++++++++++++++++++++++++++++++------
include/linux/mfd/core.h | 10 ++++
2 files changed, 142 insertions(+), 19 deletions(-)
diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
index 7aa32b90cf1e..79b400535138 100644
--- a/drivers/mfd/mfd-core.c
+++ b/drivers/mfd/mfd-core.c
@@ -10,6 +10,7 @@
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/acpi.h>
+#include <linux/fwnode.h>
#include <linux/list.h>
#include <linux/property.h>
#include <linux/mfd/core.h>
@@ -22,6 +23,7 @@
#include <linux/regulator/consumer.h>
static LIST_HEAD(mfd_of_node_list);
+static LIST_HEAD(mfd_named_fwnode_list);
static DEFINE_MUTEX(mfd_of_node_mutex);
struct mfd_of_node_entry {
@@ -30,10 +32,91 @@ struct mfd_of_node_entry {
struct device_node *np;
};
+struct mfd_named_fwnode_entry {
+ struct list_head list;
+ struct device *dev;
+ struct fwnode_handle *fwnode;
+};
+
static const struct device_type mfd_dev_type = {
.name = "mfd_device",
};
+static int mfd_claim_named_fwnode(struct platform_device *pdev,
+ struct fwnode_handle *fwnode)
+{
+ struct mfd_named_fwnode_entry *entry, *iter;
+
+ entry = kzalloc_obj(*entry, GFP_KERNEL);
+ if (!entry)
+ return -ENOMEM;
+
+ entry->dev = &pdev->dev;
+ entry->fwnode = fwnode_handle_get(fwnode);
+
+ scoped_guard(mutex, &mfd_of_node_mutex) {
+ list_for_each_entry(iter, &mfd_named_fwnode_list, list)
+ if (iter->fwnode == fwnode) {
+ fwnode_handle_put(entry->fwnode);
+ kfree(entry);
+ return -EAGAIN;
+ }
+
+ list_add_tail(&entry->list, &mfd_named_fwnode_list);
+ }
+
+ return 0;
+}
+
+/*
+ * Temporary MFD-local cleanup for named non-OF child fwnodes.
+ * Remove/rework this when platform core starts owning and dropping
+ * dev->fwnode references for these devices.
+ */
+static void mfd_release_named_fwnode(struct platform_device *pdev)
+{
+ struct mfd_named_fwnode_entry *entry, *tmp;
+
+ scoped_guard(mutex, &mfd_of_node_mutex) {
+ list_for_each_entry_safe(entry, tmp, &mfd_named_fwnode_list, list)
+ if (entry->dev == &pdev->dev) {
+ if (dev_fwnode(&pdev->dev) == entry->fwnode)
+ device_set_node(&pdev->dev, NULL);
+ fwnode_handle_put(entry->fwnode);
+ list_del(&entry->list);
+ kfree(entry);
+ }
+ }
+}
+
+static int mfd_claim_of_node_to_dev(struct platform_device *pdev,
+ struct device_node *np)
+{
+ struct mfd_of_node_entry *of_entry, *iter;
+
+ of_entry = kzalloc_obj(*of_entry, GFP_KERNEL);
+ if (!of_entry)
+ return -ENOMEM;
+
+ of_entry->dev = &pdev->dev;
+ of_entry->np = of_node_get(np);
+
+ /* Skip if OF node has previously been allocated to a device */
+ scoped_guard(mutex, &mfd_of_node_mutex) {
+ list_for_each_entry(iter, &mfd_of_node_list, list)
+ if (iter->np == np) {
+ of_node_put(of_entry->np);
+ kfree(of_entry);
+ return -EAGAIN;
+ }
+
+ list_add_tail(&of_entry->list, &mfd_of_node_list);
+ }
+
+ device_set_node(&pdev->dev, of_fwnode_handle(np));
+ return 0;
+}
+
#if IS_ENABLED(CONFIG_ACPI)
struct match_ids_walk_data {
struct acpi_device_id *ids;
@@ -111,19 +194,11 @@ static int mfd_match_of_node_to_dev(struct platform_device *pdev,
struct device_node *np,
const struct mfd_cell *cell)
{
- struct mfd_of_node_entry *of_entry;
u64 of_node_addr;
- /* Skip if OF node has previously been allocated to a device */
- scoped_guard(mutex, &mfd_of_node_mutex) {
- list_for_each_entry(of_entry, &mfd_of_node_list, list)
- if (of_entry->np == np)
- return -EAGAIN;
- }
-
if (!cell->use_of_reg)
/* No of_reg defined - allocate first free compatible match */
- goto allocate_of_node;
+ return mfd_claim_of_node_to_dev(pdev, np);
/* We only care about each node's first defined address */
if (of_property_read_reg(np, 0, &of_node_addr, NULL))
@@ -134,18 +209,48 @@ static int mfd_match_of_node_to_dev(struct platform_device *pdev,
/* No match */
return -EAGAIN;
-allocate_of_node:
- of_entry = kzalloc(sizeof(*of_entry), GFP_KERNEL);
- if (!of_entry)
- return -ENOMEM;
+ return mfd_claim_of_node_to_dev(pdev, np);
+}
- of_entry->dev = &pdev->dev;
- of_entry->np = of_node_get(np);
- scoped_guard(mutex, &mfd_of_node_mutex)
- list_add_tail(&of_entry->list, &mfd_of_node_list);
+static int mfd_attach_named_fwnode(struct device *parent,
+ struct platform_device *pdev,
+ const struct mfd_cell *cell)
+{
+ struct fwnode_handle *fwnode;
+ struct device_node *named_np;
+ int ret = 0;
- device_set_node(&pdev->dev, of_fwnode_handle(np));
- return 0;
+ /* named_fwnode is a fallback only when no OF/ACPI match and no swnode */
+ if (dev_fwnode(&pdev->dev) || cell->swnode || !cell->named_fwnode)
+ return 0;
+
+ fwnode = device_get_named_child_node(parent, cell->named_fwnode);
+ if (!fwnode)
+ return 0;
+
+ if (!fwnode_device_is_available(fwnode))
+ goto out_put;
+
+ named_np = to_of_node(fwnode);
+ if (named_np)
+ ret = mfd_claim_of_node_to_dev(pdev, named_np);
+ else
+ ret = mfd_claim_named_fwnode(pdev, fwnode);
+
+ if (ret == -EAGAIN) {
+ ret = 0;
+ goto out_put;
+ }
+
+ if (ret)
+ goto out_put;
+
+ if (!named_np)
+ device_set_node(&pdev->dev, fwnode);
+
+out_put:
+ fwnode_handle_put(fwnode);
+ return ret;
}
static int mfd_add_device(struct device *parent, int id,
@@ -224,6 +329,10 @@ static int mfd_add_device(struct device *parent, int id,
mfd_acpi_add_device(cell, pdev);
+ ret = mfd_attach_named_fwnode(parent, pdev, cell);
+ if (ret)
+ goto fail_alias;
+
if (cell->pdata_size) {
ret = platform_device_add_data(pdev,
cell->platform_data, cell->pdata_size);
@@ -295,6 +404,7 @@ static int mfd_add_device(struct device *parent, int id,
if (cell->swnode)
device_remove_software_node(&pdev->dev);
fail_of_entry:
+ mfd_release_named_fwnode(pdev);
scoped_guard(mutex, &mfd_of_node_mutex) {
list_for_each_entry_safe(of_entry, tmp, &mfd_of_node_list, list)
if (of_entry->dev == &pdev->dev) {
@@ -382,7 +492,10 @@ static int mfd_remove_devices_fn(struct device *dev, void *data)
regulator_bulk_unregister_supply_alias(dev, cell->parent_supplies,
cell->num_parent_supplies);
+ get_device(&pdev->dev);
platform_device_unregister(pdev);
+ mfd_release_named_fwnode(pdev);
+ put_device(&pdev->dev);
return 0;
}
diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h
index faeea7abd688..8daa83dd31ea 100644
--- a/include/linux/mfd/core.h
+++ b/include/linux/mfd/core.h
@@ -80,6 +80,16 @@ struct mfd_cell {
/* Software node for the device. */
const struct software_node *swnode;
+ /*
+ * Name of a child firmware node under the MFD parent device.
+ *
+ * Used only as a fallback when no firmware node is assigned to MFD
+ * child and no software node is provided.
+ *
+ * For Device Tree parents, lookup is by base node name only
+ * (the part before '@'). Unit-addresses are not matched.
+ */
+ const char *named_fwnode;
/*
* Device Tree compatible string
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 08/12] mfd: psci-mfd: Add psci-reboot-mode child cell
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
` (6 preceding siblings ...)
2026-08-03 9:43 ` [PATCH v24 07/12] mfd: core: Add firmware-node support to MFD cells Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 09/12] arm64: dts: qcom: Add psci reboot-modes for kodiak boards Shivendra Pratap
` (3 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla, Bartosz Golaszewski
The PSCI "reboot-mode" node does not define a compatible because it is a
configuration of boot-states provided by the underlying firmware. With
the new firmware-node based cells in mfd-core, this node can now be
exposed as a proper child cell.
Add the psci-reboot-mode child cell to the psci-mfd driver with a
named_fwnode. Add psci-cpuidle-domain cell first to isolate it from
reboot-mode failures.
Suggested-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
drivers/mfd/psci-mfd.c | 27 ++++++++++++++++++++++++++-
drivers/power/reset/Kconfig | 2 +-
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/drivers/mfd/psci-mfd.c b/drivers/mfd/psci-mfd.c
index 7affd6bb09dd..7befc4fa86f5 100644
--- a/drivers/mfd/psci-mfd.c
+++ b/drivers/mfd/psci-mfd.c
@@ -14,10 +14,35 @@ static const struct mfd_cell psci_cells[] = {
},
};
+static const struct mfd_cell psci_reboot_mode_cell[] = {
+ {
+ .name = "psci-reboot-mode",
+ .named_fwnode = "reboot-mode",
+ },
+};
+
static int psci_mfd_probe(struct platform_device *pdev)
{
- return devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO, psci_cells,
+ int ret;
+
+ ret = devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO, psci_cells,
ARRAY_SIZE(psci_cells), NULL, 0, NULL);
+ if (ret)
+ goto out;
+
+ ret = devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO,
+ psci_reboot_mode_cell,
+ ARRAY_SIZE(psci_reboot_mode_cell),
+ NULL, 0, NULL);
+ if (ret) {
+ if (ret == -ENOMEM)
+ goto out;
+ dev_warn(&pdev->dev, "reboot-mode child cell failed to add: %d\n", ret);
+ ret = 0;
+ }
+
+out:
+ return ret;
}
static const struct of_device_id psci_mfd_of_match[] = {
diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
index 143f3260f04a..1810482d52e6 100644
--- a/drivers/power/reset/Kconfig
+++ b/drivers/power/reset/Kconfig
@@ -362,7 +362,7 @@ config NVMEM_REBOOT_MODE
config PSCI_REBOOT_MODE
bool "PSCI reboot mode driver"
- depends on ARM_PSCI_FW || COMPILE_TEST
+ depends on (ARM_PSCI_FW && MFD_PSCI) || COMPILE_TEST
select REBOOT_MODE
help
Say y here will enable PSCI reboot mode driver. This gets
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 09/12] arm64: dts: qcom: Add psci reboot-modes for kodiak boards
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
` (7 preceding siblings ...)
2026-08-03 9:43 ` [PATCH v24 08/12] mfd: psci-mfd: Add psci-reboot-mode child cell Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 10/12] arm64: dts: qcom: Add psci reboot-modes for lemans boards Shivendra Pratap
` (2 subsequent siblings)
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla, Bartosz Golaszewski
Add PSCI SYSTEM_RESET2 reboot-modes for qcm6490-idp and qcs6490-rb3gen2
for use by the psci-reboot-mode driver.
The following modes are defined:
- bootloader: reboot into fastboot mode for fastboot flashing.
- edl: reboot into emergency download mode for image loading via
the Firehose protocol.
Support for these modes is firmware dependent and not available across
all kodiak based boards.
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/kodiak.dtsi | 2 +-
arch/arm64/boot/dts/qcom/qcm6490-idp.dts | 7 +++++++
arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts | 7 +++++++
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/boot/dts/qcom/kodiak.dtsi b/arch/arm64/boot/dts/qcom/kodiak.dtsi
index f74fa66f1a67..6e3837c2490c 100644
--- a/arch/arm64/boot/dts/qcom/kodiak.dtsi
+++ b/arch/arm64/boot/dts/qcom/kodiak.dtsi
@@ -866,7 +866,7 @@ pmu-a78 {
interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_LOW>;
};
- psci {
+ psci: psci {
compatible = "arm,psci-1.0";
method = "smc";
diff --git a/arch/arm64/boot/dts/qcom/qcm6490-idp.dts b/arch/arm64/boot/dts/qcom/qcm6490-idp.dts
index bdc02260f902..b7a0b5347639 100644
--- a/arch/arm64/boot/dts/qcom/qcm6490-idp.dts
+++ b/arch/arm64/boot/dts/qcom/qcm6490-idp.dts
@@ -786,6 +786,13 @@ &qup_uart7_tx {
bias-disable;
};
+&psci {
+ reboot-mode {
+ mode-bootloader = <0x80010001 0x2>;
+ mode-edl = <0x80000000 0x1>;
+ };
+};
+
&qupv3_id_0 {
status = "okay";
};
diff --git a/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts b/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
index 90f2eebc349f..4ba5246fe3f1 100644
--- a/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
+++ b/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
@@ -1105,6 +1105,13 @@ &pon_resin {
status = "okay";
};
+&psci {
+ reboot-mode {
+ mode-bootloader = <0x80010001 0x2>;
+ mode-edl = <0x80000000 0x1>;
+ };
+};
+
&qup_uart7_cts {
/*
* Configure a bias-bus-hold on CTS to lower power
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 10/12] arm64: dts: qcom: Add psci reboot-modes for lemans boards
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
` (8 preceding siblings ...)
2026-08-03 9:43 ` [PATCH v24 09/12] arm64: dts: qcom: Add psci reboot-modes for kodiak boards Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 11/12] arm64: dts: qcom: Add psci reboot-modes for monaco boards Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 12/12] arm64: dts: qcom: Add psci reboot-modes for talos boards Shivendra Pratap
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla, Bartosz Golaszewski
Add PSCI SYSTEM_RESET2 reboot-modes for lemans-evk and
lemans-ride-common(sa8775p-ride, sa8775p-ride-r3, qcs9100-ride,
qcs9100-ride-r3) for use by the psci-reboot-mode driver.
The following modes are defined:
- bootloader: reboot into fastboot mode for fastboot flashing.
- edl: reboot into emergency download mode for image loading via
the Firehose protocol.
Support for these modes is firmware dependent.
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/lemans-evk.dts | 7 +++++++
arch/arm64/boot/dts/qcom/lemans-ride-common.dtsi | 7 +++++++
arch/arm64/boot/dts/qcom/lemans.dtsi | 2 +-
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/boot/dts/qcom/lemans-evk.dts b/arch/arm64/boot/dts/qcom/lemans-evk.dts
index 0c53640c42a6..3baad102270d 100644
--- a/arch/arm64/boot/dts/qcom/lemans-evk.dts
+++ b/arch/arm64/boot/dts/qcom/lemans-evk.dts
@@ -911,6 +911,13 @@ usb2_id: usb2-id-state {
};
};
+&psci {
+ reboot-mode {
+ mode-bootloader = <0x80010001 0x2>;
+ mode-edl = <0x80000000 0x1>;
+ };
+};
+
&qup_i2c19_default {
drive-strength = <2>;
bias-pull-up;
diff --git a/arch/arm64/boot/dts/qcom/lemans-ride-common.dtsi b/arch/arm64/boot/dts/qcom/lemans-ride-common.dtsi
index cefb8ff00806..cc96442403e8 100644
--- a/arch/arm64/boot/dts/qcom/lemans-ride-common.dtsi
+++ b/arch/arm64/boot/dts/qcom/lemans-ride-common.dtsi
@@ -800,6 +800,13 @@ &pmm8654au_3_gpios {
"GNSS_BOOT_MODE";
};
+&psci {
+ reboot-mode {
+ mode-bootloader = <0x80010001 0x2>;
+ mode-edl = <0x80000000 0x1>;
+ };
+};
+
&qupv3_id_1 {
status = "okay";
};
diff --git a/arch/arm64/boot/dts/qcom/lemans.dtsi b/arch/arm64/boot/dts/qcom/lemans.dtsi
index 17bc5bcd9d09..cde157f6d7c0 100644
--- a/arch/arm64/boot/dts/qcom/lemans.dtsi
+++ b/arch/arm64/boot/dts/qcom/lemans.dtsi
@@ -549,7 +549,7 @@ pmu {
interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_HIGH>;
};
- psci {
+ psci: psci {
compatible = "arm,psci-1.0";
method = "smc";
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 11/12] arm64: dts: qcom: Add psci reboot-modes for monaco boards
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
` (9 preceding siblings ...)
2026-08-03 9:43 ` [PATCH v24 10/12] arm64: dts: qcom: Add psci reboot-modes for lemans boards Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
2026-08-03 9:43 ` [PATCH v24 12/12] arm64: dts: qcom: Add psci reboot-modes for talos boards Shivendra Pratap
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla, Bartosz Golaszewski
Add PSCI SYSTEM_RESET2 reboot-modes for monaco-evk and
qcs8300-ride for use by the psci-reboot-mode driver.
The following modes are defined:
- bootloader: reboot into fastboot mode for fastboot flashing.
- edl: reboot into emergency download mode for image loading via
the Firehose protocol.
Support for these modes is firmware dependent.
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/monaco-evk.dts | 7 +++++++
arch/arm64/boot/dts/qcom/monaco.dtsi | 2 +-
arch/arm64/boot/dts/qcom/qcs8300-ride.dts | 7 +++++++
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/boot/dts/qcom/monaco-evk.dts b/arch/arm64/boot/dts/qcom/monaco-evk.dts
index 9d17ef7d2caf..df668dbf2bc6 100644
--- a/arch/arm64/boot/dts/qcom/monaco-evk.dts
+++ b/arch/arm64/boot/dts/qcom/monaco-evk.dts
@@ -661,6 +661,13 @@ usb2_id: usb2-id-state {
};
};
+&psci {
+ reboot-mode {
+ mode-bootloader = <0x80010001 0x2>;
+ mode-edl = <0x80000000 0x1>;
+ };
+};
+
&qup_i2c0_data_clk {
drive-strength = <2>;
bias-pull-up;
diff --git a/arch/arm64/boot/dts/qcom/monaco.dtsi b/arch/arm64/boot/dts/qcom/monaco.dtsi
index 2c0af0326147..81cdc4ccf8c9 100644
--- a/arch/arm64/boot/dts/qcom/monaco.dtsi
+++ b/arch/arm64/boot/dts/qcom/monaco.dtsi
@@ -654,7 +654,7 @@ pmu-a78 {
interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_LOW>;
};
- psci {
+ psci: psci {
compatible = "arm,psci-1.0";
method = "smc";
diff --git a/arch/arm64/boot/dts/qcom/qcs8300-ride.dts b/arch/arm64/boot/dts/qcom/qcs8300-ride.dts
index 1ff39530ea3d..aa95584b000d 100644
--- a/arch/arm64/boot/dts/qcom/qcs8300-ride.dts
+++ b/arch/arm64/boot/dts/qcom/qcs8300-ride.dts
@@ -678,6 +678,13 @@ &mdss_dsi0_out {
remote-endpoint = <&dsi2dp_bridge_in>;
};
+&psci {
+ reboot-mode {
+ mode-bootloader = <0x80010001 0x2>;
+ mode-edl = <0x80000000 0x1>;
+ };
+};
+
&qupv3_id_0 {
status = "okay";
};
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH v24 12/12] arm64: dts: qcom: Add psci reboot-modes for talos boards
2026-08-03 9:43 [PATCH v24 00/12] Implement PSCI reboot mode driver for PSCI resets Shivendra Pratap
` (10 preceding siblings ...)
2026-08-03 9:43 ` [PATCH v24 11/12] arm64: dts: qcom: Add psci reboot-modes for monaco boards Shivendra Pratap
@ 2026-08-03 9:43 ` Shivendra Pratap
11 siblings, 0 replies; 17+ messages in thread
From: Shivendra Pratap @ 2026-08-03 9:43 UTC (permalink / raw)
To: Lorenzo Pieralisi, Arnd Bergmann, Bjorn Andersson,
Sebastian Reichel, Rob Herring, Souvik Chakravarty,
Krzysztof Kozlowski, Andy Yan, Matthias Brugger, Mark Rutland,
Conor Dooley, Konrad Dybcio, John Stultz, Moritz Fischer,
Rafael J. Wysocki, Daniel Lezcano, Christian Loehle, Lee Jones,
Ulf Hansson, Pavan Kondeti, Bartosz Golaszewski, Sudeep Holla,
Ulf Hansson
Cc: Florian Fainelli, Krzysztof Kozlowski, Dmitry Baryshkov,
Mukesh Ojha, Andre Draszik, Greg Kroah-Hartman,
Kathiravan Thirumoorthy, linux-pm, linux-kernel, linux-arm-kernel,
linux-arm-msm, devicetree, mfd, Shivendra Pratap,
Srinivas Kandagatla, Bartosz Golaszewski, Song Xue
Add PSCI SYSTEM_RESET2 reboot-modes for qcs615-ride, for use by the
psci-reboot-mode driver.
The following modes are defined:
- bootloader: reboot into fastboot mode for fastboot flashing.
- edl: reboot into emergency download mode for image loading via the
Firehose protocol.
Support for these modes is firmware dependent.
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Signed-off-by: Song Xue <quic_songxue@quicinc.com>
Signed-off-by: Shivendra Pratap <shivendra.pratap@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/qcs615-ride.dts | 7 +++++++
arch/arm64/boot/dts/qcom/talos.dtsi | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/boot/dts/qcom/qcs615-ride.dts b/arch/arm64/boot/dts/qcom/qcs615-ride.dts
index 047b4efb04b9..48d3519f50ff 100644
--- a/arch/arm64/boot/dts/qcom/qcs615-ride.dts
+++ b/arch/arm64/boot/dts/qcom/qcs615-ride.dts
@@ -498,6 +498,13 @@ &pon_resin {
status = "okay";
};
+&psci {
+ reboot-mode {
+ mode-bootloader = <0x80010001 0x2>;
+ mode-edl = <0x80000000 0x1>;
+ };
+};
+
&qspi {
status = "okay";
diff --git a/arch/arm64/boot/dts/qcom/talos.dtsi b/arch/arm64/boot/dts/qcom/talos.dtsi
index 07ba5733ca92..113f10775991 100644
--- a/arch/arm64/boot/dts/qcom/talos.dtsi
+++ b/arch/arm64/boot/dts/qcom/talos.dtsi
@@ -581,7 +581,7 @@ pmu-a76 {
interrupts = <GIC_PPI 5 IRQ_TYPE_LEVEL_HIGH &ppi_cluster1>;
};
- psci {
+ psci: psci {
compatible = "arm,psci-1.0";
method = "smc";
--
2.34.1
^ permalink raw reply related [flat|nested] 17+ messages in thread