From: Mukesh Ojha <quic_mojha@quicinc.com> To: <agross@kernel.org>, <andersson@kernel.org>, <konrad.dybcio@linaro.org>, <corbet@lwn.net>, <keescook@chromium.org>, <tony.luck@intel.com>, <gpiccoli@igalia.com>, <catalin.marinas@arm.com>, <will@kernel.org>, <krzysztof.kozlowski+dt@linaro.org>, <robh+dt@kernel.org>, <linus.walleij@linaro.org>, <linux-gpio@vger.kernel.org>, <srinivas.kandagatla@linaro.org> Cc: <linux-arm-msm@vger.kernel.org>, <linux-remoteproc@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <linux-hardening@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>, <linux-doc@vger.kernel.org>, "Mukesh Ojha" <quic_mojha@quicinc.com> Subject: [PATCH v3 17/18] firmware: qcom_scm: Refactor code to support multiple download mode Date: Wed, 3 May 2023 22:32:31 +0530 [thread overview] Message-ID: <1683133352-10046-18-git-send-email-quic_mojha@quicinc.com> (raw) In-Reply-To: <1683133352-10046-1-git-send-email-quic_mojha@quicinc.com> Currently on Qualcomm SoC, download_mode is enabled if CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT is selected. 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. Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com> --- drivers/firmware/Kconfig | 11 --------- drivers/firmware/qcom_scm.c | 60 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index b59e304..ff7e9f3 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -215,17 +215,6 @@ config MTK_ADSP_IPC config QCOM_SCM tristate -config QCOM_SCM_DOWNLOAD_MODE_DEFAULT - bool "Qualcomm download mode enabled by default" - depends on QCOM_SCM - help - A device with "download mode" enabled will upon an unexpected - warm-restart enter a special debug mode that allows the user to - "download" memory content over USB for offline postmortem analysis. - The feature can be enabled/disabled on the kernel command line. - - Say Y here to enable "download mode" by default. - config SYSFB bool select BOOT_VESA_SUPPORT diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 775ac68..4e8fd4e 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -20,11 +20,11 @@ #include <linux/clk.h> #include <linux/reset-controller.h> #include <linux/arm-smccc.h> +#include <linux/kstrtox.h> #include "qcom_scm.h" -static bool download_mode = IS_ENABLED(CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT); -module_param(download_mode, bool, 0); +static u32 download_mode; #define SCM_HAS_CORE_CLK BIT(0) #define SCM_HAS_IFACE_CLK BIT(1) @@ -32,6 +32,7 @@ module_param(download_mode, bool, 0); #define QCOM_DOWNLOAD_MODE_MASK 0x30 #define QCOM_DOWNLOAD_FULLDUMP 0x1 +#define QCOM_DOWNLOAD_NODUMP 0x0 struct qcom_scm { struct device *dev; @@ -440,8 +441,9 @@ static int __qcom_scm_set_dload_mode(struct device *dev, bool enable) return qcom_scm_call_atomic(__scm->dev, &desc, NULL); } -static void qcom_scm_set_download_mode(bool enable) +static void qcom_scm_set_download_mode(u32 download_mode) { + bool enable = !!download_mode; bool avail; int ret = 0; @@ -452,8 +454,7 @@ static void qcom_scm_set_download_mode(bool enable) ret = __qcom_scm_set_dload_mode(__scm->dev, enable); } else if (__scm->dload_mode_addr) { ret = qcom_scm_io_update_field(__scm->dload_mode_addr, - QCOM_DOWNLOAD_MODE_MASK, - enable ? QCOM_DOWNLOAD_FULLDUMP : 0); + QCOM_DOWNLOAD_MODE_MASK, download_mode); } else { dev_err(__scm->dev, "No available mechanism for setting download mode\n"); @@ -1421,6 +1422,49 @@ static irqreturn_t qcom_scm_irq_handler(int irq, void *data) return IRQ_HANDLED; } + +static int get_download_mode(char *buffer, const struct kernel_param *kp) +{ + int len = 0; + + if (download_mode == QCOM_DOWNLOAD_FULLDUMP) + len = sysfs_emit(buffer, "full\n"); + else if (download_mode == QCOM_DOWNLOAD_NODUMP) + len = sysfs_emit(buffer, "off\n"); + + return len; +} + +static int set_download_mode(const char *val, const struct kernel_param *kp) +{ + u32 old = download_mode; + + if (sysfs_streq(val, "full")) { + download_mode = QCOM_DOWNLOAD_FULLDUMP; + } else if (sysfs_streq(val, "off")) { + download_mode = QCOM_DOWNLOAD_NODUMP; + } else if (kstrtouint(val, 0, &download_mode) || + !(download_mode == 0 || download_mode == 1)) { + download_mode = old; + pr_err("qcom_scm: unknown download mode: %s\n", val); + return -EINVAL; + } + + if (__scm) + qcom_scm_set_download_mode(download_mode); + + return 0; +} + +static const struct kernel_param_ops download_mode_param_ops = { + .get = get_download_mode, + .set = set_download_mode, +}; + +module_param_cb(download_mode, &download_mode_param_ops, NULL, 0644); +MODULE_PARM_DESC(download_mode, + "Download mode: off/full or 0/1 for existing users"); + static int qcom_scm_probe(struct platform_device *pdev) { struct qcom_scm *scm; @@ -1514,12 +1558,12 @@ static int qcom_scm_probe(struct platform_device *pdev) __get_convention(); /* - * If requested enable "download mode", from this point on warmboot + * If "download mode" is requested, from this point on warmboot * will cause the boot stages to enter download mode, unless * disabled below by a clean shutdown/reboot. */ if (download_mode) - qcom_scm_set_download_mode(true); + qcom_scm_set_download_mode(download_mode); return 0; } @@ -1527,7 +1571,7 @@ static int qcom_scm_probe(struct platform_device *pdev) static void qcom_scm_shutdown(struct platform_device *pdev) { /* Clean shutdown, disable download mode to allow normal restart */ - qcom_scm_set_download_mode(false); + qcom_scm_set_download_mode(QCOM_DOWNLOAD_NODUMP); } static const struct of_device_id qcom_scm_dt_match[] = { -- 2.7.4 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: Mukesh Ojha <quic_mojha@quicinc.com> To: <agross@kernel.org>, <andersson@kernel.org>, <konrad.dybcio@linaro.org>, <corbet@lwn.net>, <keescook@chromium.org>, <tony.luck@intel.com>, <gpiccoli@igalia.com>, <catalin.marinas@arm.com>, <will@kernel.org>, <krzysztof.kozlowski+dt@linaro.org>, <robh+dt@kernel.org>, <linus.walleij@linaro.org>, <linux-gpio@vger.kernel.org>, <srinivas.kandagatla@linaro.org> Cc: <linux-arm-msm@vger.kernel.org>, <linux-remoteproc@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <linux-hardening@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>, <linux-doc@vger.kernel.org>, "Mukesh Ojha" <quic_mojha@quicinc.com> Subject: [PATCH v3 17/18] firmware: qcom_scm: Refactor code to support multiple download mode Date: Wed, 3 May 2023 22:32:31 +0530 [thread overview] Message-ID: <1683133352-10046-18-git-send-email-quic_mojha@quicinc.com> (raw) In-Reply-To: <1683133352-10046-1-git-send-email-quic_mojha@quicinc.com> Currently on Qualcomm SoC, download_mode is enabled if CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT is selected. 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. Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com> --- drivers/firmware/Kconfig | 11 --------- drivers/firmware/qcom_scm.c | 60 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index b59e304..ff7e9f3 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -215,17 +215,6 @@ config MTK_ADSP_IPC config QCOM_SCM tristate -config QCOM_SCM_DOWNLOAD_MODE_DEFAULT - bool "Qualcomm download mode enabled by default" - depends on QCOM_SCM - help - A device with "download mode" enabled will upon an unexpected - warm-restart enter a special debug mode that allows the user to - "download" memory content over USB for offline postmortem analysis. - The feature can be enabled/disabled on the kernel command line. - - Say Y here to enable "download mode" by default. - config SYSFB bool select BOOT_VESA_SUPPORT diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 775ac68..4e8fd4e 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -20,11 +20,11 @@ #include <linux/clk.h> #include <linux/reset-controller.h> #include <linux/arm-smccc.h> +#include <linux/kstrtox.h> #include "qcom_scm.h" -static bool download_mode = IS_ENABLED(CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT); -module_param(download_mode, bool, 0); +static u32 download_mode; #define SCM_HAS_CORE_CLK BIT(0) #define SCM_HAS_IFACE_CLK BIT(1) @@ -32,6 +32,7 @@ module_param(download_mode, bool, 0); #define QCOM_DOWNLOAD_MODE_MASK 0x30 #define QCOM_DOWNLOAD_FULLDUMP 0x1 +#define QCOM_DOWNLOAD_NODUMP 0x0 struct qcom_scm { struct device *dev; @@ -440,8 +441,9 @@ static int __qcom_scm_set_dload_mode(struct device *dev, bool enable) return qcom_scm_call_atomic(__scm->dev, &desc, NULL); } -static void qcom_scm_set_download_mode(bool enable) +static void qcom_scm_set_download_mode(u32 download_mode) { + bool enable = !!download_mode; bool avail; int ret = 0; @@ -452,8 +454,7 @@ static void qcom_scm_set_download_mode(bool enable) ret = __qcom_scm_set_dload_mode(__scm->dev, enable); } else if (__scm->dload_mode_addr) { ret = qcom_scm_io_update_field(__scm->dload_mode_addr, - QCOM_DOWNLOAD_MODE_MASK, - enable ? QCOM_DOWNLOAD_FULLDUMP : 0); + QCOM_DOWNLOAD_MODE_MASK, download_mode); } else { dev_err(__scm->dev, "No available mechanism for setting download mode\n"); @@ -1421,6 +1422,49 @@ static irqreturn_t qcom_scm_irq_handler(int irq, void *data) return IRQ_HANDLED; } + +static int get_download_mode(char *buffer, const struct kernel_param *kp) +{ + int len = 0; + + if (download_mode == QCOM_DOWNLOAD_FULLDUMP) + len = sysfs_emit(buffer, "full\n"); + else if (download_mode == QCOM_DOWNLOAD_NODUMP) + len = sysfs_emit(buffer, "off\n"); + + return len; +} + +static int set_download_mode(const char *val, const struct kernel_param *kp) +{ + u32 old = download_mode; + + if (sysfs_streq(val, "full")) { + download_mode = QCOM_DOWNLOAD_FULLDUMP; + } else if (sysfs_streq(val, "off")) { + download_mode = QCOM_DOWNLOAD_NODUMP; + } else if (kstrtouint(val, 0, &download_mode) || + !(download_mode == 0 || download_mode == 1)) { + download_mode = old; + pr_err("qcom_scm: unknown download mode: %s\n", val); + return -EINVAL; + } + + if (__scm) + qcom_scm_set_download_mode(download_mode); + + return 0; +} + +static const struct kernel_param_ops download_mode_param_ops = { + .get = get_download_mode, + .set = set_download_mode, +}; + +module_param_cb(download_mode, &download_mode_param_ops, NULL, 0644); +MODULE_PARM_DESC(download_mode, + "Download mode: off/full or 0/1 for existing users"); + static int qcom_scm_probe(struct platform_device *pdev) { struct qcom_scm *scm; @@ -1514,12 +1558,12 @@ static int qcom_scm_probe(struct platform_device *pdev) __get_convention(); /* - * If requested enable "download mode", from this point on warmboot + * If "download mode" is requested, from this point on warmboot * will cause the boot stages to enter download mode, unless * disabled below by a clean shutdown/reboot. */ if (download_mode) - qcom_scm_set_download_mode(true); + qcom_scm_set_download_mode(download_mode); return 0; } @@ -1527,7 +1571,7 @@ static int qcom_scm_probe(struct platform_device *pdev) static void qcom_scm_shutdown(struct platform_device *pdev) { /* Clean shutdown, disable download mode to allow normal restart */ - qcom_scm_set_download_mode(false); + qcom_scm_set_download_mode(QCOM_DOWNLOAD_NODUMP); } static const struct of_device_id qcom_scm_dt_match[] = { -- 2.7.4
next prev parent reply other threads:[~2023-05-03 17:05 UTC|newest] Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-05-03 17:02 [PATCH v3 00/18] Add basic Minidump kernel driver support Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-03 17:02 ` [PATCH v3 01/18] remoteproc: qcom: Expand MD_* as MINIDUMP_* Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 12:35 ` Krzysztof Kozlowski 2023-05-04 12:35 ` Krzysztof Kozlowski 2023-05-03 17:02 ` [PATCH v3 02/18] remoteproc: qcom: Move minidump specific data to qcom_minidump.h Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 11:38 ` Krzysztof Kozlowski 2023-05-04 11:38 ` Krzysztof Kozlowski 2023-05-04 11:58 ` Mukesh Ojha 2023-05-04 11:58 ` Mukesh Ojha 2023-05-04 12:03 ` Krzysztof Kozlowski 2023-05-04 12:03 ` Krzysztof Kozlowski 2023-05-04 12:26 ` Mukesh Ojha 2023-05-04 12:26 ` Mukesh Ojha 2023-05-04 12:36 ` Krzysztof Kozlowski 2023-05-04 12:36 ` Krzysztof Kozlowski 2023-05-04 12:57 ` Mukesh Ojha 2023-05-04 12:57 ` Mukesh Ojha 2023-05-04 15:16 ` Krzysztof Kozlowski 2023-05-04 15:16 ` Krzysztof Kozlowski 2023-05-03 17:02 ` [PATCH v3 03/18] docs: qcom: Add qualcomm minidump guide Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-08 10:01 ` Bagas Sanjaya 2023-05-25 16:00 ` Mukesh Ojha 2023-05-25 16:00 ` Mukesh Ojha 2023-05-13 18:46 ` Randy Dunlap 2023-05-25 15:59 ` Mukesh Ojha 2023-05-25 15:59 ` Mukesh Ojha 2023-05-03 17:02 ` [PATCH v3 04/18] soc: qcom: Add Qualcomm minidump kernel driver Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 11:36 ` Krzysztof Kozlowski 2023-05-04 11:36 ` Krzysztof Kozlowski 2023-05-04 12:38 ` Mukesh Ojha 2023-05-04 12:38 ` Mukesh Ojha 2023-05-04 15:21 ` Krzysztof Kozlowski 2023-05-04 15:21 ` Krzysztof Kozlowski 2023-05-04 16:34 ` Krzysztof Kozlowski 2023-05-04 16:34 ` Krzysztof Kozlowski 2023-05-08 7:10 ` Mukesh Ojha 2023-05-09 7:11 ` Krzysztof Kozlowski 2023-05-28 11:29 ` Mukesh Ojha 2023-05-28 11:29 ` Mukesh Ojha 2023-05-14 4:16 ` Trilok Soni 2023-05-05 5:34 ` Mukesh Ojha 2023-05-05 5:34 ` Mukesh Ojha 2023-06-02 10:43 ` Mukesh Ojha 2023-06-02 10:43 ` Mukesh Ojha 2023-05-03 17:02 ` [PATCH v3 05/18] soc: qcom: minidump: Add pending region registration support Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-03 17:02 ` [PATCH v3 06/18] soc: qcom: minidump: Add update region support Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 11:40 ` Krzysztof Kozlowski 2023-05-04 11:40 ` Krzysztof Kozlowski 2023-05-03 17:02 ` [PATCH v3 07/18] arm64: defconfig: Enable Qualcomm minidump driver Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 11:23 ` Krzysztof Kozlowski 2023-05-04 11:23 ` Krzysztof Kozlowski 2023-05-04 11:45 ` Mukesh Ojha 2023-05-04 11:45 ` Mukesh Ojha 2023-05-04 12:32 ` Krzysztof Kozlowski 2023-05-04 12:32 ` Krzysztof Kozlowski 2023-05-04 14:43 ` Mukesh Ojha 2023-05-04 14:43 ` Mukesh Ojha 2023-05-04 15:24 ` Krzysztof Kozlowski 2023-05-04 15:24 ` Krzysztof Kozlowski 2023-05-03 17:02 ` [PATCH v3 08/18] remoterproc: qcom: refactor to leverage exported minidump symbol Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-03 17:02 ` [PATCH v3 09/18] soc: qcom: Add qcom's pstore minidump driver support Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 15:35 ` Krzysztof Kozlowski 2023-05-04 15:35 ` Krzysztof Kozlowski 2023-05-09 16:06 ` Luca Stefani 2023-05-16 20:48 ` Kees Cook 2023-05-16 20:48 ` Kees Cook 2023-05-03 17:02 ` [PATCH v3 10/18] dt-bindings: reserved-memory: Add qcom,ramoops-minidump binding Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 11:22 ` Krzysztof Kozlowski 2023-05-04 11:22 ` Krzysztof Kozlowski 2023-05-03 17:02 ` [PATCH v3 11/18] arm64: dts: qcom: sm8450: Add Qualcomm ramoops minidump node Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 7:14 ` Konrad Dybcio 2023-05-04 7:14 ` Konrad Dybcio 2023-05-04 11:26 ` Krzysztof Kozlowski 2023-05-04 11:26 ` Krzysztof Kozlowski 2023-05-03 17:02 ` [PATCH v3 12/18] soc: qcom: Register pstore frontend region with minidump Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-09 15:45 ` Luca Stefani 2023-05-16 20:50 ` Kees Cook 2023-05-16 20:50 ` Kees Cook 2023-05-03 17:02 ` [PATCH v3 13/18] arm64: defconfig: Enable Qualcomm pstore minidump client driver Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 11:23 ` Krzysztof Kozlowski 2023-05-04 11:23 ` Krzysztof Kozlowski 2023-05-03 17:02 ` [PATCH v3 14/18] firmware: qcom_scm: provide a read-modify-write function Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-18 18:48 ` Trilok Soni 2023-05-18 18:48 ` Trilok Soni 2023-05-03 17:02 ` [PATCH v3 15/18] pinctrl: qcom: Use qcom_scm_io_update_field() Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-03 17:02 ` [PATCH v3 16/18] firmware: scm: Modify only the download bits in TCSR register Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha [this message] 2023-05-03 17:02 ` [PATCH v3 17/18] firmware: qcom_scm: Refactor code to support multiple download mode Mukesh Ojha 2023-05-03 17:02 ` [PATCH v3 18/18] firmware: qcom_scm: Add multiple download mode support Mukesh Ojha 2023-05-03 17:02 ` Mukesh Ojha 2023-05-04 11:26 ` [PATCH v3 00/18] Add basic Minidump kernel driver support Krzysztof Kozlowski 2023-05-04 11:26 ` Krzysztof Kozlowski 2023-07-15 22:13 ` (subset) " Bjorn Andersson 2023-07-15 22:13 ` Bjorn Andersson 2023-07-17 1:15 ` Mathieu Poirier 2023-07-17 1:15 ` Mathieu Poirier 2023-07-17 8:02 ` Krzysztof Kozlowski 2023-07-17 8:02 ` Krzysztof Kozlowski 2023-07-17 16:21 ` Bjorn Andersson 2023-07-17 16:21 ` Bjorn Andersson
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1683133352-10046-18-git-send-email-quic_mojha@quicinc.com \ --to=quic_mojha@quicinc.com \ --cc=agross@kernel.org \ --cc=andersson@kernel.org \ --cc=catalin.marinas@arm.com \ --cc=corbet@lwn.net \ --cc=gpiccoli@igalia.com \ --cc=keescook@chromium.org \ --cc=konrad.dybcio@linaro.org \ --cc=krzysztof.kozlowski+dt@linaro.org \ --cc=linus.walleij@linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-arm-msm@vger.kernel.org \ --cc=linux-doc@vger.kernel.org \ --cc=linux-gpio@vger.kernel.org \ --cc=linux-hardening@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-remoteproc@vger.kernel.org \ --cc=robh+dt@kernel.org \ --cc=srinivas.kandagatla@linaro.org \ --cc=tony.luck@intel.com \ --cc=will@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.