|
| 1 | +From: Trey Moen <trey@moen.ai> |
| 2 | +Date: Sun, 15 Mar 2026 20:32:18 -0700 |
| 3 | +Subject: [PATCH] Enable reboot edl for emergency download mode |
| 4 | + |
| 5 | +Export qcom_scm_set_download_mode() so the msm-poweroff restart handler |
| 6 | +can enable full-dump download mode before pulling PS_HOLD low when the |
| 7 | +user issues `reboot edl`. This causes the SoC to enter Qualcomm |
| 8 | +Emergency Download (EDL / QDL / 9008) mode on reset. |
| 9 | + |
| 10 | +--- |
| 11 | + drivers/firmware/qcom/qcom_scm.c | 3 ++- |
| 12 | + drivers/power/reset/msm-poweroff.c | 6 ++++++ |
| 13 | + include/linux/firmware/qcom/qcom_scm.h | 1 + |
| 14 | + 3 files changed, 9 insertions(+), 1 deletion(-) |
| 15 | + |
| 16 | +diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c |
| 17 | +index e777b7cb9..85ffd71f7 100644 |
| 18 | +--- a/drivers/firmware/qcom/qcom_scm.c |
| 19 | ++++ b/drivers/firmware/qcom/qcom_scm.c |
| 20 | +@@ -539,7 +539,7 @@ static int qcom_scm_io_rmw(phys_addr_t addr, unsigned int mask, unsigned int val |
| 21 | + return qcom_scm_io_writel(addr, new); |
| 22 | + } |
| 23 | + |
| 24 | +-static void qcom_scm_set_download_mode(u32 dload_mode) |
| 25 | ++void qcom_scm_set_download_mode(u32 dload_mode) |
| 26 | + { |
| 27 | + int ret = 0; |
| 28 | + |
| 29 | +@@ -557,6 +557,7 @@ static void qcom_scm_set_download_mode(u32 dload_mode) |
| 30 | + if (ret) |
| 31 | + dev_err(__scm->dev, "failed to set download mode: %d\n", ret); |
| 32 | + } |
| 33 | ++EXPORT_SYMBOL_GPL(qcom_scm_set_download_mode); |
| 34 | + |
| 35 | + /** |
| 36 | + * qcom_scm_pas_init_image() - Initialize peripheral authentication service |
| 37 | +diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c |
| 38 | +index c7eb6dc8e..970789265 100644 |
| 39 | +--- a/drivers/power/reset/msm-poweroff.c |
| 40 | ++++ b/drivers/power/reset/msm-poweroff.c |
| 41 | +@@ -12,11 +12,17 @@ |
| 42 | + #include <linux/module.h> |
| 43 | + #include <linux/reboot.h> |
| 44 | + #include <linux/pm.h> |
| 45 | ++#include <linux/firmware/qcom/qcom_scm.h> |
| 46 | + |
| 47 | + static void __iomem *msm_ps_hold; |
| 48 | + |
| 49 | ++#define QCOM_DLOAD_FULLDUMP 1 |
| 50 | ++ |
| 51 | + static int do_msm_poweroff(struct sys_off_data *data) |
| 52 | + { |
| 53 | ++ if (data->cmd && !strcmp(data->cmd, "edl")) |
| 54 | ++ qcom_scm_set_download_mode(QCOM_DLOAD_FULLDUMP); |
| 55 | ++ |
| 56 | + writel(0, msm_ps_hold); |
| 57 | + mdelay(10000); |
| 58 | + |
| 59 | +diff --git a/include/linux/firmware/qcom/qcom_scm.h b/include/linux/firmware/qcom/qcom_scm.h |
| 60 | +index a55ca7712..3b459a582 100644 |
| 61 | +--- a/include/linux/firmware/qcom/qcom_scm.h |
| 62 | ++++ b/include/linux/firmware/qcom/qcom_scm.h |
| 63 | +@@ -63,6 +63,7 @@ bool qcom_scm_is_available(void); |
| 64 | + |
| 65 | + int qcom_scm_set_cold_boot_addr(void *entry); |
| 66 | + int qcom_scm_set_warm_boot_addr(void *entry); |
| 67 | ++void qcom_scm_set_download_mode(u32 dload_mode); |
| 68 | + void qcom_scm_cpu_power_down(u32 flags); |
| 69 | + int qcom_scm_set_remote_state(u32 state, u32 id); |
| 70 | + |
0 commit comments