Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f1624c54 authored by Elliot Berman's avatar Elliot Berman
Browse files

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: default avatarElliot Berman <eberman@codeaurora.org>
parent bbf72fdc
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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 = {
+9 −0
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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
+2 −8
Original line number Diff line number Diff line
@@ -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");
+2 −0
Original line number Diff line number Diff line
@@ -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; }