Skip to content

Commit f82ed58

Browse files
Mukesh Ojhagregkh
authored andcommitted
firmware: qcom: scm: Refactor code to support multiple dload mode
[ Upstream commit c802b0a ] Currently on Qualcomm SoC, download_mode is enabled if CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT is selected or passed a boolean value from command line. Refactor the code such that it supports multiple download modes and drop CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT config instead, give interface to set the download mode from module parameter while being backword compatible at the same time. Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com> Link: https://lore.kernel.org/r/20240715155655.1811178-1-quic_mojha@quicinc.com Signed-off-by: Bjorn Andersson <andersson@kernel.org> Stable-dep-of: d679071 ("firmware: qcom: scm: suppress download mode error") Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent e2c791f commit f82ed58

2 files changed

Lines changed: 52 additions & 19 deletions

File tree

drivers/firmware/qcom/Kconfig

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,6 @@ config QCOM_TZMEM_MODE_SHMBRIDGE
4141

4242
endchoice
4343

44-
config QCOM_SCM_DOWNLOAD_MODE_DEFAULT
45-
bool "Qualcomm download mode enabled by default"
46-
depends on QCOM_SCM
47-
help
48-
A device with "download mode" enabled will upon an unexpected
49-
warm-restart enter a special debug mode that allows the user to
50-
"download" memory content over USB for offline postmortem analysis.
51-
The feature can be enabled/disabled on the kernel command line.
52-
53-
Say Y here to enable "download mode" by default.
54-
5544
config QCOM_QSEECOM
5645
bool "Qualcomm QSEECOM interface driver"
5746
depends on QCOM_SCM=y

drivers/firmware/qcom/qcom_scm.c

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <linux/init.h>
1919
#include <linux/interconnect.h>
2020
#include <linux/interrupt.h>
21+
#include <linux/kstrtox.h>
2122
#include <linux/module.h>
2223
#include <linux/of.h>
2324
#include <linux/of_address.h>
@@ -32,8 +33,7 @@
3233
#include "qcom_scm.h"
3334
#include "qcom_tzmem.h"
3435

35-
static bool download_mode = IS_ENABLED(CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT);
36-
module_param(download_mode, bool, 0);
36+
static u32 download_mode;
3737

3838
struct qcom_scm {
3939
struct device *dev;
@@ -135,6 +135,11 @@ static const char * const qcom_scm_convention_names[] = {
135135
[SMC_CONVENTION_LEGACY] = "smc legacy",
136136
};
137137

138+
static const char * const download_mode_name[] = {
139+
[QCOM_DLOAD_NODUMP] = "off",
140+
[QCOM_DLOAD_FULLDUMP] = "full",
141+
};
142+
138143
static struct qcom_scm *__scm;
139144

140145
static int qcom_scm_clk_enable(void)
@@ -527,17 +532,16 @@ static int qcom_scm_io_rmw(phys_addr_t addr, unsigned int mask, unsigned int val
527532
return qcom_scm_io_writel(addr, new);
528533
}
529534

530-
static void qcom_scm_set_download_mode(bool enable)
535+
static void qcom_scm_set_download_mode(u32 dload_mode)
531536
{
532-
u32 val = enable ? QCOM_DLOAD_FULLDUMP : QCOM_DLOAD_NODUMP;
533537
int ret = 0;
534538

535539
if (__scm->dload_mode_addr) {
536540
ret = qcom_scm_io_rmw(__scm->dload_mode_addr, QCOM_DLOAD_MASK,
537-
FIELD_PREP(QCOM_DLOAD_MASK, val));
541+
FIELD_PREP(QCOM_DLOAD_MASK, dload_mode));
538542
} else if (__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_BOOT,
539543
QCOM_SCM_BOOT_SET_DLOAD_MODE)) {
540-
ret = __qcom_scm_set_dload_mode(__scm->dev, enable);
544+
ret = __qcom_scm_set_dload_mode(__scm->dev, !!dload_mode);
541545
} else {
542546
dev_err(__scm->dev,
543547
"No available mechanism for setting download mode\n");
@@ -1897,6 +1901,46 @@ static irqreturn_t qcom_scm_irq_handler(int irq, void *data)
18971901
return IRQ_HANDLED;
18981902
}
18991903

1904+
static int get_download_mode(char *buffer, const struct kernel_param *kp)
1905+
{
1906+
if (download_mode >= ARRAY_SIZE(download_mode_name))
1907+
return sysfs_emit(buffer, "unknown mode\n");
1908+
1909+
return sysfs_emit(buffer, "%s\n", download_mode_name[download_mode]);
1910+
}
1911+
1912+
static int set_download_mode(const char *val, const struct kernel_param *kp)
1913+
{
1914+
bool tmp;
1915+
int ret;
1916+
1917+
ret = sysfs_match_string(download_mode_name, val);
1918+
if (ret < 0) {
1919+
ret = kstrtobool(val, &tmp);
1920+
if (ret < 0) {
1921+
pr_err("qcom_scm: err: %d\n", ret);
1922+
return ret;
1923+
}
1924+
1925+
ret = tmp ? 1 : 0;
1926+
}
1927+
1928+
download_mode = ret;
1929+
if (__scm)
1930+
qcom_scm_set_download_mode(download_mode);
1931+
1932+
return 0;
1933+
}
1934+
1935+
static const struct kernel_param_ops download_mode_param_ops = {
1936+
.get = get_download_mode,
1937+
.set = set_download_mode,
1938+
};
1939+
1940+
module_param_cb(download_mode, &download_mode_param_ops, NULL, 0644);
1941+
MODULE_PARM_DESC(download_mode,
1942+
"download mode: off/0/N for no dump mode, full/on/1/Y for full dump mode");
1943+
19001944
static int qcom_scm_probe(struct platform_device *pdev)
19011945
{
19021946
struct qcom_tzmem_pool_config pool_config;
@@ -1961,7 +2005,7 @@ static int qcom_scm_probe(struct platform_device *pdev)
19612005
__get_convention();
19622006

19632007
/*
1964-
* If requested enable "download mode", from this point on warmboot
2008+
* If "download mode" is requested, from this point on warmboot
19652009
* will cause the boot stages to enter download mode, unless
19662010
* disabled below by a clean shutdown/reboot.
19672011
*/
@@ -2012,7 +2056,7 @@ static int qcom_scm_probe(struct platform_device *pdev)
20122056
static void qcom_scm_shutdown(struct platform_device *pdev)
20132057
{
20142058
/* Clean shutdown, disable download mode to allow normal restart */
2015-
qcom_scm_set_download_mode(false);
2059+
qcom_scm_set_download_mode(QCOM_DLOAD_NODUMP);
20162060
}
20172061

20182062
static const struct of_device_id qcom_scm_dt_match[] = {

0 commit comments

Comments
 (0)