From f0092d5391e7b7cfa10320544b2ddd5815be2c31 Mon Sep 17 00:00:00 2001 From: Ram Chandrasekar Date: Tue, 16 Jun 2020 17:33:19 -0700 Subject: [PATCH] firmware: qcom_scm: Add support to read LMH data Add support to a new scm call to read LMH data. Change-Id: Ifb8161292363bd18fb63a389692e67c547ac8bb6 Signed-off-by: Ram Chandrasekar --- drivers/firmware/qcom_scm-smc.c | 24 ++++++++++++++++++++++++ drivers/firmware/qcom_scm.c | 15 +++++++++++++++ drivers/firmware/qcom_scm.h | 3 +++ include/linux/qcom_scm.h | 5 +++++ 4 files changed, 47 insertions(+) diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index 88df279945c77..40d154811146a 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -1773,6 +1773,30 @@ int __qcom_scm_lmh_get_type(struct device *dev, phys_addr_t payload, return ret; } +int __qcom_scm_lmh_fetch_data(struct device *dev, + u32 node_id, u32 debug_type, uint32_t *peak, uint32_t *avg) +{ + int ret; + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_LMH, + .cmd = QCOM_SCM_LMH_DEBUG_FETCH_DATA, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = node_id; + desc.args[1] = debug_type; + desc.arginfo = SCM_ARGS(2, QCOM_SCM_VAL, QCOM_SCM_VAL); + + ret = qcom_scm_call(dev, &desc); + + if (peak) + *peak = desc.res[0]; + if (avg) + *avg = desc.res[1]; + + return ret; +} + int __qcom_scm_smmu_change_pgtbl_format(struct device *dev, u64 dev_id, int cbndx) { diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index dea56a41741b9..2c4be9d36114d 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -857,6 +857,21 @@ int qcom_scm_lmh_get_type(phys_addr_t payload, u64 payload_size, } EXPORT_SYMBOL(qcom_scm_lmh_get_type); +int qcom_scm_lmh_fetch_data(u32 node_id, u32 debug_type, uint32_t *peak, + uint32_t *avg) +{ + int ret; + + ret = __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_LMH, + QCOM_SCM_LMH_DEBUG_FETCH_DATA); + if (ret <= 0) + return ret; + + return __qcom_scm_lmh_fetch_data(__scm->dev, node_id, debug_type, + peak, avg); +} +EXPORT_SYMBOL(qcom_scm_lmh_fetch_data); + int qcom_scm_smmu_change_pgtbl_format(u64 dev_id, int cbndx) { return __qcom_scm_smmu_change_pgtbl_format(__scm->dev, dev_id, cbndx); diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index cef00d7f5bf70..04afabc82ca12 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -188,6 +188,7 @@ extern int __qcom_scm_hdcp_req(struct device *dev, #define QCOM_SCM_LMH_LIMIT_DCVSH 0x10 #define QCOM_SCM_LMH_DEBUG_READ 0x0A #define QCOM_SCM_LMH_DEBUG_GET_TYPE 0x0B +#define QCOM_SCM_LMH_DEBUG_FETCH_DATA 0x0D extern int __qcom_scm_lmh_read_buf_size(struct device *dev, int *size); extern int __qcom_scm_lmh_limit_dcvsh(struct device *dev, phys_addr_t payload, uint32_t payload_size, u64 limit_node, uint32_t node_id, @@ -200,6 +201,8 @@ extern int __qcom_scm_lmh_debug_config_write(struct device *dev, u64 cmd_id, extern int __qcom_scm_lmh_get_type(struct device *dev, phys_addr_t payload, u64 payload_size, u64 debug_type, uint32_t get_from, uint32_t *size); +extern int __qcom_scm_lmh_fetch_data(struct device *dev, + u32 node_id, u32 debug_type, uint32_t *peak, uint32_t *avg); #define QCOM_SCM_SVC_SMMU_PROGRAM 0x15 #define QCOM_SCM_SMMU_CHANGE_PGTBL_FORMAT 0x01 diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index 833d15d0d1b87..cf2519efb7b4c 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -174,6 +174,8 @@ extern int qcom_scm_lmh_debug_set_config_write(phys_addr_t payload, int payload_size, uint32_t *buf, int buf_size); extern int qcom_scm_lmh_get_type(phys_addr_t payload, u64 payload_size, u64 debug_type, uint32_t get_from, uint32_t *size); +extern int qcom_scm_lmh_fetch_data(u32 node_id, u32 debug_type, uint32_t *peak, + uint32_t *avg); 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_smmu_notify_secure_lut(u64 dev_id, bool secure); @@ -330,6 +332,9 @@ static inline int qcom_scm_lmh_debug_set_config_write(phys_addr_t payload, static inline int qcom_scm_lmh_get_type(phys_addr_t payload, u64 payload_size, u64 debug_type, uint32_t get_from, uint32_t *size) { return -ENODEV; } +static inline int qcom_scm_lmh_fetch_data(u32 node_id, u32 debug_type, + uint32_t *peak, uint32_t *avg) + { return -ENODEV; } 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)