soc: qcom: Migrate SCM call to disable watchdog

Add support for SCM call to deactivate secure watchdog on Qualcomm
devices.

Change-Id: I4008792e45d2c264b98ca954ea37a94093ea771e
Signed-off-by: Elliot Berman <eberman@codeaurora.org>
This commit is contained in:
Elliot Berman 2019-09-03 09:51:30 -07:00
commit f1624c54ae
5 changed files with 29 additions and 8 deletions

View file

@ -651,6 +651,20 @@ void __qcom_scm_cpu_power_down(struct device *dev, u32 flags)
qcom_scm_call_atomic(dev, &desc);
}
int __qcom_scm_sec_wdog_deactivate(struct device *dev)
{
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_BOOT,
.cmd = QCOM_SCM_BOOT_SEC_WDOG_DIS,
.owner = ARM_SMCCC_OWNER_SIP
};
desc.args[0] = 1;
desc.arginfo = QCOM_SCM_ARGS(1);
return qcom_scm_call(dev, &desc);
}
int __qcom_scm_set_remote_state(struct device *dev, u32 state, u32 id)
{
struct qcom_scm_desc desc = {

View file

@ -128,6 +128,15 @@ void qcom_scm_cpu_power_down(u32 flags)
}
EXPORT_SYMBOL(qcom_scm_cpu_power_down);
/**
* qcm_scm_sec_wdog_deactivate() - Deactivate secure watchdog
*/
int qcom_scm_sec_wdog_deactivate(void)
{
return __qcom_scm_sec_wdog_deactivate(__scm->dev);
}
EXPORT_SYMBOL(qcom_scm_sec_wdog_deactivate);
int qcom_scm_set_remote_state(u32 state, u32 id)
{
return __qcom_scm_set_remote_state(__scm->dev, state, id);

View file

@ -7,6 +7,7 @@
#define QCOM_SCM_SVC_BOOT 0x01
#define QCOM_SCM_BOOT_SET_ADDR 0x01
#define QCOM_SCM_BOOT_TERMINATE_PC 0x02
#define QCOM_SCM_BOOT_SEC_WDOG_DIS 0x07
#define QCOM_SCM_BOOT_SET_REMOTE_STATE 0x0a
#define QCOM_SCM_BOOT_SET_DLOAD_MODE 0x10
extern int __qcom_scm_set_cold_boot_addr(struct device *dev, void *entry,
@ -14,6 +15,7 @@ extern int __qcom_scm_set_cold_boot_addr(struct device *dev, void *entry,
extern int __qcom_scm_set_warm_boot_addr(struct device *dev, void *entry,
const cpumask_t *cpus);
extern void __qcom_scm_cpu_power_down(struct device *dev, u32 flags);
extern int __qcom_scm_sec_wdog_deactivate(struct device *dev);
extern int __qcom_scm_set_remote_state(struct device *dev, u32 state, u32 id);
extern int __qcom_scm_set_dload_mode(struct device *dev, bool enable);
#define QCOM_SCM_FLUSH_FLAG_MASK 0x3

View file

@ -18,7 +18,7 @@
#include <linux/cpu_pm.h>
#include <linux/platform_device.h>
#include <linux/wait.h>
#include <soc/qcom/scm.h>
#include <linux/qcom_scm.h>
#include <soc/qcom/minidump.h>
#include <soc/qcom/watchdog.h>
#include <linux/dma-mapping.h>
@ -40,8 +40,6 @@
#define UNMASKED_INT_EN 1
#define MASK_SIZE 32
#define SCM_SET_REGSAVE_CMD 0x2
#define SCM_SVC_SEC_WDOG_DIS 0x7
#define MAX_CPU_CTX_SIZE 2048
#define WDT_HZ 32765
@ -225,7 +223,6 @@ static ssize_t wdog_disable_set(struct device *dev,
const char *buf, size_t count)
{
struct msm_watchdog_data *wdog_dd = dev_get_drvdata(dev);
struct scm_desc desc = {0};
u8 disable;
int ret;
@ -243,10 +240,7 @@ static ssize_t wdog_disable_set(struct device *dev,
}
disable = 1;
desc.args[0] = 1;
desc.arginfo = SCM_ARGS(1);
ret = scm_call2(SCM_SIP_FNID(SCM_SVC_BOOT,
SCM_SVC_SEC_WDOG_DIS), &desc);
ret = qcom_scm_sec_wdog_deactivate();
if (ret) {
dev_err(wdog_dd->dev,
"Failed to deactivate secure wdog\n");

View file

@ -38,6 +38,7 @@ struct qcom_scm_vmperm {
extern int qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus);
extern int qcom_scm_set_warm_boot_addr(void *entry, const cpumask_t *cpus);
extern void qcom_scm_cpu_power_down(u32 flags);
extern int qcom_scm_sec_wdog_deactivate(void);
extern int qcom_scm_set_remote_state(u32 state, u32 id);
extern bool qcom_scm_pas_supported(u32 peripheral);
extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata,
@ -71,6 +72,7 @@ static inline
int qcom_scm_set_warm_boot_addr(void *entry, const cpumask_t *cpus)
{ return -ENODEV; }
static inline void qcom_scm_cpu_power_down(u32 flags) {}
static inline int qcom_scm_sec_wdog_deactivate(void) { return -ENODEV; }
static inline u32 qcom_scm_set_remote_state(u32 state, u32 id)
{ return -ENODEV; }
static inline bool qcom_scm_pas_supported(u32 peripheral) { return false; }