|
@@ -397,3 +397,45 @@ int __qcom_scm_restore_sec_cfg(struct device *dev, u32 device_id, u32 spare)
|
|
|
|
|
|
return ret ? : res.a1;
|
|
|
}
|
|
|
+
|
|
|
+int __qcom_scm_iommu_secure_ptbl_size(struct device *dev, u32 spare,
|
|
|
+ size_t *size)
|
|
|
+{
|
|
|
+ struct qcom_scm_desc desc = {0};
|
|
|
+ struct arm_smccc_res res;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ desc.args[0] = spare;
|
|
|
+ desc.arginfo = QCOM_SCM_ARGS(1);
|
|
|
+
|
|
|
+ ret = qcom_scm_call(dev, QCOM_SCM_SVC_MP,
|
|
|
+ QCOM_SCM_IOMMU_SECURE_PTBL_SIZE, &desc, &res);
|
|
|
+
|
|
|
+ if (size)
|
|
|
+ *size = res.a1;
|
|
|
+
|
|
|
+ return ret ? : res.a2;
|
|
|
+}
|
|
|
+
|
|
|
+int __qcom_scm_iommu_secure_ptbl_init(struct device *dev, u64 addr, u32 size,
|
|
|
+ u32 spare)
|
|
|
+{
|
|
|
+ struct qcom_scm_desc desc = {0};
|
|
|
+ struct arm_smccc_res res;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ desc.args[0] = addr;
|
|
|
+ desc.args[1] = size;
|
|
|
+ desc.args[2] = spare;
|
|
|
+ desc.arginfo = QCOM_SCM_ARGS(3, QCOM_SCM_RW, QCOM_SCM_VAL,
|
|
|
+ QCOM_SCM_VAL);
|
|
|
+
|
|
|
+ ret = qcom_scm_call(dev, QCOM_SCM_SVC_MP,
|
|
|
+ QCOM_SCM_IOMMU_SECURE_PTBL_INIT, &desc, &res);
|
|
|
+
|
|
|
+ /* the pg table has been initialized already, ignore the error */
|
|
|
+ if (ret == -EPERM)
|
|
|
+ ret = 0;
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|