Commit b0199258 authored by Mukesh Ojha's avatar Mukesh Ojha Committed by Bjorn Andersson
Browse files

firmware: qcom_scm: Add SHM bridge handling for PAS when running without QHEE



On SoCs running with a non-Gunyah-based hypervisor, Linux must take
responsibility for creating the SHM bridge both for metadata (before
calling qcom_scm_pas_init_image()) and for remoteproc memory (before
calling qcom_scm_pas_auth_and_reset()). We have taken care the things
required for qcom_scm_pas_auth_and_reset(). Lets put these awareness
of above conditions into qcom_scm_pas_init_image() and
qcom_scm_pas_metadata_release().

Reviewed-by: default avatarKonrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: default avatarMukesh Ojha <mukesh.ojha@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20260105-kvmrprocv10-v10-10-022e96815380@oss.qualcomm.com


Signed-off-by: default avatarBjorn Andersson <andersson@kernel.org>
parent 223a8716
Loading
Loading
Loading
Loading
+31 −1
Original line number Diff line number Diff line
@@ -623,6 +623,30 @@ static int __qcom_scm_pas_init_image(u32 pas_id, dma_addr_t mdata_phys,
	return ret;
}

static int qcom_scm_pas_prep_and_init_image(struct qcom_scm_pas_context *ctx,
					    const void *metadata, size_t size)
{
	struct qcom_scm_res res;
	phys_addr_t mdata_phys;
	void *mdata_buf;
	int ret;

	mdata_buf = qcom_tzmem_alloc(__scm->mempool, size, GFP_KERNEL);
	if (!mdata_buf)
		return -ENOMEM;

	memcpy(mdata_buf, metadata, size);
	mdata_phys = qcom_tzmem_to_phys(mdata_buf);

	ret = __qcom_scm_pas_init_image(ctx->pas_id, mdata_phys, &res);
	if (ret < 0)
		qcom_tzmem_free(mdata_buf);
	else
		ctx->ptr = mdata_buf;

	return ret ? : res.result[0];
}

/**
 * qcom_scm_pas_init_image() - Initialize peripheral authentication service
 *			       state machine for a given peripheral, using the
@@ -648,6 +672,9 @@ int qcom_scm_pas_init_image(u32 pas_id, const void *metadata, size_t size,
	void *mdata_buf;
	int ret;

	if (ctx && ctx->use_tzmem)
		return qcom_scm_pas_prep_and_init_image(ctx, metadata, size);

	/*
	 * During the scm call memory protection will be enabled for the meta
	 * data blob, so make sure it's physically contiguous, 4K aligned and
@@ -689,6 +716,9 @@ void qcom_scm_pas_metadata_release(struct qcom_scm_pas_context *ctx)
	if (!ctx->ptr)
		return;

	if (ctx->use_tzmem)
		qcom_tzmem_free(ctx->ptr);
	else
		dma_free_coherent(__scm->dev, ctx->size, ctx->ptr, ctx->phys);

	ctx->ptr = NULL;