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

Commit 764d3221 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: Add support for extra arguments from shmbridge"

parents 4d65c912 ea75fbdf
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include <asm/compiler.h>

#include <soc/qcom/scm.h>
#include <soc/qcom/qtee_shmbridge.h>

#define CREATE_TRACE_POINTS
#include <trace/events/scm.h>
@@ -314,22 +315,23 @@ bool is_scm_armv8(void)
static int allocate_extra_arg_buffer(struct scm_desc *desc, gfp_t flags)
{
	int i, j;
	int rc;
	struct scm_extra_arg *argbuf;
	int arglen = desc->arginfo & 0xf;
	struct qtee_shm shm;
	size_t argbuflen = PAGE_ALIGN(sizeof(struct scm_extra_arg));

	desc->x5 = desc->args[FIRST_EXT_ARG_IDX];

	if (likely(arglen <= N_REGISTER_ARGS)) {
		desc->extra_arg_buf = NULL;
	if (likely(arglen <= N_REGISTER_ARGS))
		return 0;
	}

	argbuf = kzalloc(argbuflen, flags);
	if (!argbuf)
		return -ENOMEM;
	rc = qtee_shmbridge_allocate_shm(argbuflen, &shm);
	if (rc)
		return rc;

	desc->extra_arg_buf = argbuf;
	desc->shm = shm;
	argbuf = shm.vaddr;

	j = FIRST_EXT_ARG_IDX;
	if (scm_version == SCM_ARMV8_64)
@@ -338,10 +340,10 @@ static int allocate_extra_arg_buffer(struct scm_desc *desc, gfp_t flags)
	else
		for (i = 0; i < N_EXT_SCM_ARGS; i++)
			argbuf->args32[i] = desc->args[j++];
	desc->x5 = virt_to_phys(argbuf);

	desc->x5 = shm.paddr;
	__cpuc_flush_dcache_area(argbuf, argbuflen);
	outer_flush_range(virt_to_phys(argbuf),
			  virt_to_phys(argbuf) + argbuflen);
	outer_flush_range(shm.paddr, shm.paddr + argbuflen);

	return 0;
}
@@ -402,7 +404,7 @@ static int __scm_call2(u32 fn_id, struct scm_desc *desc, bool retry)
			x0, ret, desc->ret[0], desc->ret[1], desc->ret[2]);

	if (arglen > N_REGISTER_ARGS)
		kfree(desc->extra_arg_buf);
		qtee_shmbridge_free_shm(&desc->shm);
	if (ret < 0)
		return scm_remap_error(ret);
	return 0;
@@ -488,7 +490,7 @@ int scm_call2_atomic(u32 fn_id, struct scm_desc *desc)
			desc->ret[1], desc->ret[2]);

	if (arglen > N_REGISTER_ARGS)
		kfree(desc->extra_arg_buf);
		qtee_shmbridge_free_shm(&desc->shm);
	if (ret < 0)
		return scm_remap_error(ret);
	return ret;
+3 −1
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@
#ifndef __MACH_SCM_H
#define __MACH_SCM_H

#include <soc/qcom/qtee_shmbridge.h>

#define SCM_SVC_BOOT			0x1
#define SCM_SVC_PIL			0x2
#define SCM_SVC_UTIL			0x3
@@ -85,7 +87,7 @@ struct scm_desc {
	u64 ret[MAX_SCM_RETS];

	/* private */
	void *extra_arg_buf;
	struct qtee_shm shm;
	u64 x5;
};