|
18 | 18 | #include <linux/init.h> |
19 | 19 | #include <linux/interconnect.h> |
20 | 20 | #include <linux/interrupt.h> |
| 21 | +#include <linux/kstrtox.h> |
21 | 22 | #include <linux/module.h> |
22 | 23 | #include <linux/of.h> |
23 | 24 | #include <linux/of_address.h> |
|
32 | 33 | #include "qcom_scm.h" |
33 | 34 | #include "qcom_tzmem.h" |
34 | 35 |
|
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; |
37 | 37 |
|
38 | 38 | struct qcom_scm { |
39 | 39 | struct device *dev; |
@@ -135,6 +135,11 @@ static const char * const qcom_scm_convention_names[] = { |
135 | 135 | [SMC_CONVENTION_LEGACY] = "smc legacy", |
136 | 136 | }; |
137 | 137 |
|
| 138 | +static const char * const download_mode_name[] = { |
| 139 | + [QCOM_DLOAD_NODUMP] = "off", |
| 140 | + [QCOM_DLOAD_FULLDUMP] = "full", |
| 141 | +}; |
| 142 | + |
138 | 143 | static struct qcom_scm *__scm; |
139 | 144 |
|
140 | 145 | 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 |
527 | 532 | return qcom_scm_io_writel(addr, new); |
528 | 533 | } |
529 | 534 |
|
530 | | -static void qcom_scm_set_download_mode(bool enable) |
| 535 | +static void qcom_scm_set_download_mode(u32 dload_mode) |
531 | 536 | { |
532 | | - u32 val = enable ? QCOM_DLOAD_FULLDUMP : QCOM_DLOAD_NODUMP; |
533 | 537 | int ret = 0; |
534 | 538 |
|
535 | 539 | if (__scm->dload_mode_addr) { |
536 | 540 | 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)); |
538 | 542 | } else if (__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_BOOT, |
539 | 543 | 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); |
541 | 545 | } else { |
542 | 546 | dev_err(__scm->dev, |
543 | 547 | "No available mechanism for setting download mode\n"); |
@@ -1897,6 +1901,46 @@ static irqreturn_t qcom_scm_irq_handler(int irq, void *data) |
1897 | 1901 | return IRQ_HANDLED; |
1898 | 1902 | } |
1899 | 1903 |
|
| 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 | + |
1900 | 1944 | static int qcom_scm_probe(struct platform_device *pdev) |
1901 | 1945 | { |
1902 | 1946 | struct qcom_tzmem_pool_config pool_config; |
@@ -1961,7 +2005,7 @@ static int qcom_scm_probe(struct platform_device *pdev) |
1961 | 2005 | __get_convention(); |
1962 | 2006 |
|
1963 | 2007 | /* |
1964 | | - * If requested enable "download mode", from this point on warmboot |
| 2008 | + * If "download mode" is requested, from this point on warmboot |
1965 | 2009 | * will cause the boot stages to enter download mode, unless |
1966 | 2010 | * disabled below by a clean shutdown/reboot. |
1967 | 2011 | */ |
@@ -2012,7 +2056,7 @@ static int qcom_scm_probe(struct platform_device *pdev) |
2012 | 2056 | static void qcom_scm_shutdown(struct platform_device *pdev) |
2013 | 2057 | { |
2014 | 2058 | /* 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); |
2016 | 2060 | } |
2017 | 2061 |
|
2018 | 2062 | static const struct of_device_id qcom_scm_dt_match[] = { |
|
0 commit comments