Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9933a272 authored by Vikram Mulukutla's avatar Vikram Mulukutla
Browse files

qcom: scm: Provide an API that restores security configuration



Drivers require an API to be able to inform the secure world
that their devices have resumed from power collapse and security
settings need to be re-relaxed.

Transition existing users to the new API.

Change-Id: Ia5b49176c797ec9d6d35350ea98964203d622516
Signed-off-by: default avatarVikram Mulukutla <markivx@codeaurora.org>
parent b68bfd41
Loading
Loading
Loading
Loading
+1 −9
Original line number Diff line number Diff line
@@ -426,23 +426,15 @@ fail:
int msm_iommu_sec_program_iommu(struct msm_iommu_drvdata *drvdata,
			struct msm_iommu_ctx_drvdata *ctx_drvdata)
{
	struct msm_scm_sec_cfg {
		unsigned int id;
		unsigned int spare;
	} cfg;
	int ret, scm_ret = 0;

	cfg.id = drvdata->sec_id;
	cfg.spare = ctx_drvdata->num;

	if (drvdata->smmu_local_base) {
		writel_relaxed(0xFFFFFFFF, drvdata->smmu_local_base +
						SMMU_INTR_SEL_NS);
		mb();
	}

	ret = scm_call(SCM_SVC_MP, IOMMU_SECURE_CFG, &cfg, sizeof(cfg),
			&scm_ret, sizeof(scm_ret));
	ret = scm_restore_sec_cfg(drvdata->sec_id, ctx_drvdata->num, &scm_ret);
	if (ret || scm_ret) {
		pr_err("scm call IOMMU_SECURE_CFG failed\n");
		return ret ? ret : -EINVAL;
+2 −13
Original line number Diff line number Diff line
@@ -229,7 +229,6 @@
#define MAX_BUS_NUM 3
#define MAX_PROP_SIZE 32
#define MAX_RC_NAME_LEN 15
#define PCIE_MSM_RESTORE_SCM_CFG_CMD 0x2
#define MSM_PCIE_MAX_VREG 3
#define MSM_PCIE_MAX_CLK 7
#define MSM_PCIE_MAX_PIPE_CLK 1
@@ -807,24 +806,14 @@ static bool pcie_phy_is_ready(struct msm_pcie_dev_t *dev)

static int msm_pcie_restore_sec_config(struct msm_pcie_dev_t *dev)
{
	/* scm command buffer structrue */
	struct msm_pcie_scm_cmd_buf {
		unsigned int device_id;
		unsigned int spare;
	} cbuf;

	int ret, scm_ret = 0;
	int ret, scm_ret;

	if (!dev) {
		pr_err("PCIe: the input pcie dev is NULL.\n");
		return -ENODEV;
	}

	cbuf.device_id = dev->scm_dev_id;

	ret = scm_call(SCM_SVC_MP, PCIE_MSM_RESTORE_SCM_CFG_CMD, &cbuf,
			sizeof(cbuf), &scm_ret, sizeof(scm_ret));

	ret = scm_restore_sec_cfg(dev->scm_dev_id, 0, &scm_ret);
	if (ret || scm_ret) {
		PCIE_ERR(dev,
			"PCIe: RC%d failed(%d) to restore sec config, scm_ret=%d\n",
+33 −0
Original line number Diff line number Diff line
@@ -995,3 +995,36 @@ int scm_get_feat_version(u32 feat)
	return 0;
}
EXPORT_SYMBOL(scm_get_feat_version);

#define RESTORE_SEC_CFG    2
int scm_restore_sec_cfg(u32 device_id, u32 spare, int *scm_ret)
{
	struct scm_desc desc = {0};
	int ret;
	struct restore_sec_cfg {
		u32 device_id;
		u32 spare;
	} cfg;

	cfg.device_id = device_id;
	cfg.spare = spare;

	if (IS_ERR_OR_NULL(scm_ret))
		return -EINVAL;

	if (!is_scm_armv8())
		return scm_call(SCM_SVC_MP, RESTORE_SEC_CFG, &cfg, sizeof(cfg),
				scm_ret, sizeof(*scm_ret));

	desc.args[0] = device_id;
	desc.args[1] = spare;
	desc.arginfo = SCM_ARGS(2);

	ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, RESTORE_SEC_CFG), &desc);
	if (ret)
		return ret;

	*scm_ret = desc.ret[0];
	return 0;
}
EXPORT_SYMBOL(scm_restore_sec_cfg);
+5 −0
Original line number Diff line number Diff line
@@ -115,6 +115,7 @@ extern u32 scm_get_version(void);
extern int scm_is_call_available(u32 svc_id, u32 cmd_id);
extern int scm_get_feat_version(u32 feat);
extern bool is_scm_armv8(void);
extern int scm_restore_sec_cfg(u32 device_id, u32 spare, int *scm_ret);

#define SCM_HDCP_MAX_REG 5

@@ -195,5 +196,9 @@ static inline bool is_scm_armv8(void)
	return true;
}

static inline int scm_restore_sec_cfg(u32 device_id, u32 spare, int *scm_ret)
{
	return 0;
}
#endif
#endif