Skip to content

Commit 614dc98

Browse files
greatgitsbyclaude
andcommitted
kernel: enable reboot edl for emergency download mode
Export qcom_scm_set_download_mode() and call it from the msm-poweroff restart handler when `reboot edl` is issued, so the SDM845 enters QDL/9008 mode on reset. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c2af84b commit 614dc98

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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

Comments
 (0)