diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index 555c22b76eee..d3f96bc65b90 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -1520,6 +1520,27 @@ int __qcom_scm_lmh_read_buf_size(struct device *dev, int *size) return ret; } +int __qcom_scm_lmh_limit_dcvsh(struct device *dev, phys_addr_t payload, + uint32_t payload_size, u64 limit_node, uint32_t node_id, + u64 version) +{ + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_LMH, + .cmd = QCOM_SCM_LMH_LIMIT_DCVSH, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = payload; + desc.args[1] = payload_size; + desc.args[2] = limit_node; + desc.args[3] = node_id; + desc.args[4] = version; + desc.arginfo = QCOM_SCM_ARGS(5, QCOM_SCM_RO, QCOM_SCM_VAL, QCOM_SCM_VAL, + QCOM_SCM_VAL, QCOM_SCM_VAL); + + return qcom_scm_call(dev, &desc); +} + int __qcom_scm_lmh_debug_read(struct device *dev, phys_addr_t payload, uint32_t size) { diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 40c31a147f95..abef50024c7f 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -709,6 +709,14 @@ int qcom_scm_lmh_read_buf_size(int *size) } EXPORT_SYMBOL(qcom_scm_lmh_read_buf_size); +int qcom_scm_lmh_limit_dcvsh(phys_addr_t payload, uint32_t payload_size, + u64 limit_node, uint32_t node_id, u64 version) +{ + return __qcom_scm_lmh_limit_dcvsh(__scm->dev, payload, payload_size, + limit_node, node_id, version); +} +EXPORT_SYMBOL(qcom_scm_lmh_limit_dcvsh); + int qcom_scm_lmh_debug_read(phys_addr_t payload, uint32_t size) { return __qcom_scm_lmh_debug_read(__scm->dev, payload, size); diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index 0e213fa24123..c9eece2edc32 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -164,9 +164,13 @@ extern int __qcom_scm_hdcp_req(struct device *dev, #define QCOM_SCM_SVC_LMH 0x13 #define QCOM_SCM_LMH_DEBUG_SET 0x08 #define QCOM_SCM_LMH_DEBUG_READ_BUF_SIZE 0x09 +#define QCOM_SCM_LMH_LIMIT_DCVSH 0x10 #define QCOM_SCM_LMH_DEBUG_READ 0x0A #define QCOM_SCM_LMH_DEBUG_GET_TYPE 0x0B 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, + u64 version); extern int __qcom_scm_lmh_debug_read(struct device *dev, phys_addr_t payload, uint32_t size); extern int __qcom_scm_lmh_debug_config_write(struct device *dev, u64 cmd_id, diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index ffbe5e8f55d3..242172432db0 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -103,6 +103,8 @@ extern bool qcom_scm_is_lmh_debug_read_buf_size_available(void); extern bool qcom_scm_is_lmh_debug_read_buf_available(void); extern bool qcom_scm_is_lmh_debug_get_type_available(void); extern int qcom_scm_lmh_read_buf_size(int *size); +extern int qcom_scm_lmh_limit_dcvsh(phys_addr_t payload, uint32_t payload_size, + u64 limit_node, uint32_t node_id, u64 version); extern int qcom_scm_lmh_debug_read(phys_addr_t payload, uint32_t size); extern int qcom_scm_lmh_debug_set_config_write(phys_addr_t payload, int payload_size, uint32_t *buf, int buf_size); @@ -215,6 +217,9 @@ static inline bool qcom_scm_is_lmh_debug_read_buf_available(void) static inline bool qcom_scm_is_lmh_debug_get_type_available(void) { return -EINVAL; } static inline int qcom_scm_lmh_read_buf_size(int *size) { return -ENODEV; } +static inline int qcom_scm_lmh_limit_dcvsh(phys_addr_t payload, + uint32_t payload_size, u64 limit_node, uint32_t node_id, + u64 version) { return -ENODEV; } static inline int qcom_scm_lmh_debug_read(phys_addr_t payload, uint32_t size) { return -ENODEV; } static inline int qcom_scm_lmh_debug_set_config_write(phys_addr_t payload,