diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index 953890dca1a5..5dc3b7319b19 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -1486,7 +1486,7 @@ int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, bool en) { struct qcom_scm_desc desc = { .svc = QCOM_SCM_SVC_SMMU_PROGRAM, - .cmd = QCOM_SCM_SMMU_CONFIG_ERRATA1, + .cmd = QCOM_SCM_SMMU_SECURE_LUT, .owner = ARM_SMCCC_OWNER_SIP, }; @@ -1497,6 +1497,22 @@ int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, bool en) return qcom_scm_call_atomic(dev, &desc); } +int __qcom_scm_smmu_notify_secure_lut(struct device *dev, u64 dev_id, + bool secure) +{ + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_SMMU_PROGRAM, + .cmd = QCOM_SCM_SMMU_SECURE_LUT, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = dev_id; + desc.args[1] = secure; + desc.arginfo = QCOM_SCM_ARGS(2); + + return qcom_scm_call(dev, &desc); +} + int __qcom_scm_qdss_invoke(struct device *dev, phys_addr_t addr, size_t size, u64 *out) { @@ -1519,6 +1535,22 @@ int __qcom_scm_qdss_invoke(struct device *dev, phys_addr_t addr, size_t size, return ret ? : desc.res[0]; } +int __qcom_scm_camera_protect_phy_lanes(struct device *dev, bool protect, + u64 regmask) +{ + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_CAMERA, + .cmd = QCOM_SCM_CAMERA_PROTECT_PHY_LANES, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = protect; + desc.args[1] = regmask; + desc.arginfo = QCOM_SCM_ARGS(2); + + return qcom_scm_call(dev, &desc); +} + 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 eb5a89263f7a..c53835171f2c 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -672,12 +672,25 @@ int qcom_scm_qsmmu500_wait_safe_toggle(bool en) } EXPORT_SYMBOL(qcom_scm_qsmmu500_wait_safe_toggle); +int qcom_scm_smmu_notify_secure_lut(u64 dev_id, bool secure) +{ + return __qcom_scm_smmu_notify_secure_lut(__scm->dev, dev_id, secure); +} +EXPORT_SYMBOL(qcom_scm_smmu_notify_secure_lut); + 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_camera_protect_phy_lanes(bool protect, u64 regmask) +{ + return __qcom_scm_camera_protect_phy_lanes(__scm->dev, protect, + regmask); +} +EXPORT_SYMBOL(qcom_scm_camera_protect_phy_lanes); + 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 692973ec678e..4e925c19ee5a 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -154,11 +154,13 @@ extern int __qcom_scm_hdcp_req(struct device *dev, #define QCOM_SCM_SVC_SMMU_PROGRAM 0x15 #define QCOM_SCM_SMMU_CHANGE_PGTBL_FORMAT 0x01 -#define QCOM_SCM_SMMU_CONFIG_ERRATA1 0x3 +#define QCOM_SCM_SMMU_SECURE_LUT 0x03 extern int __qcom_scm_smmu_change_pgtbl_format(struct device *dev, u64 dev_id, int cbndx); extern int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, bool enable); +extern int __qcom_scm_smmu_notify_secure_lut(struct device *dev, u64 dev_id, + bool secure); #define QCOM_SCM_SMMU_CONFIG_ERRATA1_CLIENT_ALL 0x2 #define QCOM_SCM_SVC_QDSS 0x16 @@ -166,6 +168,11 @@ extern int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, extern int __qcom_scm_qdss_invoke(struct device *dev, phys_addr_t addr, size_t size, u64 *out); +#define QCOM_SCM_SVC_CAMERA 0x18 +#define QCOM_SCM_CAMERA_PROTECT_PHY_LANES 0x07 +extern int __qcom_scm_camera_protect_phy_lanes(struct device *dev, + bool protect, u64 regmask); + // 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 38e1d3643bd6..ef19c6793b3e 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -97,7 +97,9 @@ 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_smmu_notify_secure_lut(u64 dev_id, bool secure); extern int qcom_scm_qdss_invoke(phys_addr_t addr, size_t size, u64 *out); +extern int qcom_scm_camera_protect_phy_lanes(bool protect, u64 regmask); 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); @@ -190,8 +192,12 @@ 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_smmu_notify_secure_lut(u64 dev_id, bool secure) + { return -EINVAL; } static inline int qcom_scm_qdss_invoke(phys_addr_t data, size_t size, u64 *out) { return -EINVAL; } +static inline int qcom_scm_camera_protect_phy_lanes(bool protect, u64 regmask) + { 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; }