From 44992a2dfab59649842dd00dc6a6023d9a09e366 Mon Sep 17 00:00:00 2001 From: Siddharth Gupta Date: Thu, 26 Sep 2019 12:02:54 -0700 Subject: [PATCH] soc: qcom: Migrate SCM calls in jtagv8 Adding API to upstream driver to get JTAG ETM feat id. Migrating SCM calls used in the JTAG driver. Change-Id: I60cd57d5c6aae62ec089e960b55ac221f0474f64 Signed-off-by: Siddharth Gupta Signed-off-by: Elliot Berman --- drivers/firmware/qcom_scm-smc.c | 20 ++++++++++++++++++++ drivers/firmware/qcom_scm.c | 7 +++++++ drivers/firmware/qcom_scm.h | 4 ++++ include/linux/qcom_scm.h | 3 +++ 4 files changed, 34 insertions(+) diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index 5bbdc7a29847..c2e92b68b7c5 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -870,6 +870,26 @@ int __qcom_scm_is_call_available(struct device *dev, u32 svc_id, u32 cmd_id) return ret ? : desc.res[0]; } +int __qcom_scm_get_feat_version(struct device *dev, u64 feat_id, u64 *version) +{ + int ret; + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_INFO, + .cmd = QCOM_SCM_INFO_GET_FEAT_VERSION_CMD, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = feat_id; + desc.arginfo = QCOM_SCM_ARGS(1); + + ret = qcom_scm_call(dev, &desc); + + if (version) + *version = desc.res[0]; + + return ret; +} + void __qcom_scm_mmu_sync(struct device *dev, bool sync) { int ret; diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 53c3bc01a7aa..0f23479e107d 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -334,6 +334,13 @@ int qcom_scm_io_writel(phys_addr_t addr, unsigned int val) } EXPORT_SYMBOL(qcom_scm_io_writel); +int qcom_scm_get_jtag_etm_feat_id(u64 *version) +{ + return __qcom_scm_get_feat_version(__scm ? __scm->dev : NULL, + QCOM_SCM_TZ_DBG_ETM_FEAT_ID, version); +} +EXPORT_SYMBOL(qcom_scm_get_jtag_etm_feat_id); + void qcom_scm_mmu_sync(bool sync) { __qcom_scm_mmu_sync(__scm ? __scm->dev : NULL, sync); diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index e8bffb5ee040..b2c897b8933c 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -45,8 +45,12 @@ extern int __qcom_scm_io_writel(struct device *dev, phys_addr_t addr, unsigned i #define QCOM_SCM_SVC_INFO 0x06 #define QCOM_SCM_INFO_IS_CALL_AVAIL 0x01 +#define QCOM_SCM_INFO_GET_FEAT_VERSION_CMD 0x03 extern int __qcom_scm_is_call_available(struct device *dev, u32 svc_id, u32 cmd_id); +extern int __qcom_scm_get_feat_version(struct device *dev, u64 feat_id, + u64 *version); +#define QCOM_SCM_TZ_DBG_ETM_FEAT_ID 0x08 #define QCOM_SCM_SVC_PWR 0x09 #define QCOM_SCM_PWR_MMU_SYNC 0x08 diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index 79522b0e09d6..9a38f9ce12b0 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -49,6 +49,7 @@ extern int qcom_scm_pas_auth_and_reset(u32 peripheral); extern int qcom_scm_pas_shutdown(u32 peripheral); extern int qcom_scm_io_readl(phys_addr_t addr, unsigned int *val); extern int qcom_scm_io_writel(phys_addr_t addr, unsigned int val); +extern int qcom_scm_get_jtag_etm_feat_id(u64 *version); extern void qcom_scm_mmu_sync(bool sync); extern int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare); extern int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size); @@ -94,6 +95,8 @@ static inline int qcom_scm_io_readl(phys_addr_t addr, unsigned int *val) { return -ENODEV; } static inline int qcom_scm_io_writel(phys_addr_t addr, unsigned int val) { return -ENODEV; } +static inline int qcom_scm_get_jtag_etm_feat_id(u64 *version) + { return -ENODEV; } static inline void qcom_scm_mmu_sync(bool sync) {} static inline int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare) { return -ENODEV; }