Loading drivers/soc/qcom/scm.c +14 −12 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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) Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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; Loading include/soc/qcom/scm.h +3 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -85,7 +87,7 @@ struct scm_desc { u64 ret[MAX_SCM_RETS]; /* private */ void *extra_arg_buf; struct qtee_shm shm; u64 x5; }; Loading Loading
drivers/soc/qcom/scm.c +14 −12 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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) Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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; Loading
include/soc/qcom/scm.h +3 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -85,7 +87,7 @@ struct scm_desc { u64 ret[MAX_SCM_RETS]; /* private */ void *extra_arg_buf; struct qtee_shm shm; u64 x5; }; Loading