1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (C) Foundries Ltd. 2022 4 * Author: Jorge Ramirez <jorge@foundries.io> 5 */ 6 7 #include <arm.h> 8 #include <initcall.h> 9 #include <ipi.h> 10 #include <kernel/panic.h> 11 #include <mm/core_memprot.h> 12 #include <string.h> 13 #include <tee/cache.h> 14 #include <util.h> 15 16 #define SEC_MODULE_SHIFT 8 17 #define SEC_MODULE_ID 5 18 19 #define CRYPTO_API_ID(__x) ((SEC_MODULE_ID << SEC_MODULE_SHIFT) | (__x)) 20 21 TEE_Result versal_crypto_request(enum versal_crypto_api id, 22 struct versal_cmd_args *arg, uint32_t *err) 23 { 24 struct versal_ipi_cmd cmd = { }; 25 uint32_t a = 0; 26 uint32_t b = 0; 27 size_t i = 0; 28 29 cmd.data[0] = CRYPTO_API_ID(id); 30 for (i = 1; i < arg->dlen + 1; i++) 31 cmd.data[i] = arg->data[i - 1]; 32 33 /* src */ 34 if (!arg->ibuf[0].mem.buf) 35 goto notify; 36 37 reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a); 38 cmd.data[i++] = a; 39 cmd.data[i++] = b; 40 41 /* dst */ 42 if (!arg->ibuf[1].mem.buf) 43 goto cache; 44 45 if (arg->ibuf[1].only_cache) 46 goto cache; 47 48 reg_pair_from_64(virt_to_phys(arg->ibuf[1].mem.buf), &b, &a); 49 cmd.data[i++] = a; 50 cmd.data[i++] = b; 51 cache: 52 for (i = 0; i < VERSAL_MAX_IPI_BUF; i++) 53 cmd.ibuf[i].mem = arg->ibuf[i].mem; 54 notify: 55 return versal_mbox_notify(&cmd, NULL, err); 56 } 57