From 446a7be36fe4a8653150a75259c57a2f98a733be Mon Sep 17 00:00:00 2001 From: Khaja Hussain Shaik Khaji Date: Fri, 21 Jun 2024 00:35:37 +0530 Subject: [PATCH] firmware: qcom_scm: Add a call for getting dload mode Add an SCM call to read the dload mode cookie, which can be used in various drivers to make decisions based on the dload mode. Earlier, this support was not there and HLOS was not aware of changes in this cookie, outside of its domain. Change-Id: I3bb82b65bc411354090b34b98f7e651dd1888e5b Signed-off-by: Khaja Hussain Shaik Khaji --- drivers/firmware/qcom_scm.c | 19 +++++++++++++++++++ include/linux/qcom_scm.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 5b6543836b50..99593aaebacd 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -207,6 +207,25 @@ void qcom_scm_set_download_mode(enum qcom_download_mode mode, } EXPORT_SYMBOL(qcom_scm_set_download_mode); +int qcom_scm_get_download_mode(unsigned int *mode, phys_addr_t tcsr_boot_misc) +{ + int ret = -EINVAL; + struct device *dev = __scm ? __scm->dev : NULL; + + if (tcsr_boot_misc || (__scm && __scm->dload_mode_addr)) { + ret = qcom_scm_io_readl(tcsr_boot_misc ? : __scm->dload_mode_addr, mode); + } else { + dev_err(dev, + "No available mechanism for getting download mode\n"); + } + + if (ret) + dev_err(dev, "failed to get download mode: %d\n", ret); + + return ret; +} +EXPORT_SYMBOL_GPL(qcom_scm_get_download_mode); + int qcom_scm_config_cpu_errata(void) { return __qcom_scm_config_cpu_errata(__scm->dev); diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index d4ce6f0c7989..5b292531dd2f 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -95,6 +95,7 @@ extern int qcom_scm_set_remote_state(u32 state, u32 id); extern int qcom_scm_spin_cpu(void); extern void qcom_scm_set_download_mode(enum qcom_download_mode mode, phys_addr_t tcsr_boot_misc); +extern int qcom_scm_get_download_mode(unsigned int *mode, phys_addr_t tcsr_boot_misc); extern int qcom_scm_config_cpu_errata(void); extern void qcom_scm_phy_update_scm_level_shifter(u32 val); extern bool qcom_scm_pas_supported(u32 peripheral); @@ -244,6 +245,8 @@ static inline u32 qcom_scm_set_remote_state(u32 state, u32 id) static inline int qcom_scm_spin_cpu(void) { return -ENODEV; } static inline void qcom_scm_set_download_mode(enum qcom_download_mode mode, phys_addr_t tcsr_boot_misc) {} +static inline int qcom_scm_get_download_mode(unsigned int *mode, + phys_addr_t tcsr_boot_misc) {} static inline int qcom_scm_config_cpu_errata(void) { return -ENODEV; } static inline void qcom_scm_phy_update_scm_level_shifter(u32 val) {}