diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index 416389de8294..953890dca1a5 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -1497,6 +1497,28 @@ int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, bool en) return qcom_scm_call_atomic(dev, &desc); } +int __qcom_scm_qdss_invoke(struct device *dev, phys_addr_t addr, size_t size, + u64 *out) +{ + int ret; + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_QDSS, + .cmd = QCOM_SCM_QDSS_INVOKE, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = addr; + desc.args[1] = size; + desc.arginfo = QCOM_SCM_ARGS(2, QCOM_SCM_RO, QCOM_SCM_VAL); + + ret = qcom_scm_call(dev, &desc); + + if (out) + *out = desc.res[1]; + + return ret ? : desc.res[0]; +} + int __qcom_scm_ice_restore_cfg(struct device *dev) { struct qcom_scm_desc desc = { diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index e199b75e550c..eb5a89263f7a 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -672,6 +672,12 @@ int qcom_scm_qsmmu500_wait_safe_toggle(bool en) } EXPORT_SYMBOL(qcom_scm_qsmmu500_wait_safe_toggle); +int qcom_scm_qdss_invoke(phys_addr_t paddr, size_t size, u64 *out) +{ + return __qcom_scm_qdss_invoke(__scm->dev, paddr, size, out); +} +EXPORT_SYMBOL(qcom_scm_qdss_invoke); + int qcom_scm_ice_restore_cfg(void) { return __qcom_scm_ice_restore_cfg(__scm->dev); diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index aba137729ebc..692973ec678e 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -161,6 +161,11 @@ extern int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, bool enable); #define QCOM_SCM_SMMU_CONFIG_ERRATA1_CLIENT_ALL 0x2 +#define QCOM_SCM_SVC_QDSS 0x16 +#define QCOM_SCM_QDSS_INVOKE 0x01 +extern int __qcom_scm_qdss_invoke(struct device *dev, phys_addr_t addr, + size_t size, u64 *out); + // TOS Services and Function IDs #define QCOM_SCM_SVC_QSEELOG 0x01 #define QCOM_SCM_QSEELOG_REGISTER 0x06 diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index 8ca5fe630ef0..38e1d3643bd6 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -97,6 +97,7 @@ extern int qcom_scm_create_shm_bridge(u64 pfn_and_ns_perm_flags, u64 ns_vmids, u64 *handle); extern int qcom_scm_smmu_change_pgtbl_format(u64 dev_id, int cbndx); extern int qcom_scm_qsmmu500_wait_safe_toggle(bool en); +extern int qcom_scm_qdss_invoke(phys_addr_t addr, size_t size, u64 *out); extern int qcom_scm_ice_restore_cfg(void); extern int qcom_scm_get_tz_log_feat_id(u64 *version); extern int qcom_scm_register_qsee_log_buf(phys_addr_t buf, size_t len); @@ -189,6 +190,8 @@ static inline int qcom_scm_smmu_change_pgtbl_format(u64 dev_id, int cbndx) { return -ENODEV; } static inline int qcom_scm_qsmmu500_wait_safe_toggle(bool en) { return -ENODEV; } +static inline int qcom_scm_qdss_invoke(phys_addr_t data, size_t size, u64 *out) + { return -EINVAL; } static inline int qcom_scm_ice_restore_cfg(void) { return -ENODEV; } static inline int qcom_scm_get_tz_log_feat_id(u64 *version) { return -ENODEV; }