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 static TEE_Result versal_aes_update_aad_request(enum versal_crypto_api id, 22 struct versal_cmd_args *arg) 23 { 24 struct versal_ipi_cmd cmd = { }; 25 uint32_t a = 0; 26 uint32_t b = 0; 27 28 reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a); 29 30 cmd.data[0] = CRYPTO_API_ID(id); 31 cmd.data[1] = a; 32 cmd.data[2] = b; 33 cmd.data[3] = arg->data[0]; 34 35 cmd.ibuf[0].mem = arg->ibuf[0].mem; 36 37 return versal_mbox_notify(&cmd, NULL, NULL); 38 } 39 40 TEE_Result versal_crypto_request(enum versal_crypto_api id, 41 struct versal_cmd_args *arg, uint32_t *err) 42 { 43 struct versal_ipi_cmd cmd = { }; 44 uint32_t a = 0; 45 uint32_t b = 0; 46 size_t i = 0; 47 48 if (id == VERSAL_AES_UPDATE_AAD) 49 return versal_aes_update_aad_request(id, arg); 50 51 cmd.data[0] = CRYPTO_API_ID(id); 52 for (i = 1; i < arg->dlen + 1; i++) 53 cmd.data[i] = arg->data[i - 1]; 54 55 /* src */ 56 if (!arg->ibuf[0].mem.buf) 57 goto notify; 58 59 reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a); 60 cmd.data[i++] = a; 61 cmd.data[i++] = b; 62 63 /* dst */ 64 if (!arg->ibuf[1].mem.buf) 65 goto cache; 66 67 if (arg->ibuf[1].only_cache) 68 goto cache; 69 70 reg_pair_from_64(virt_to_phys(arg->ibuf[1].mem.buf), &b, &a); 71 cmd.data[i++] = a; 72 cmd.data[i++] = b; 73 cache: 74 for (i = 0; i < VERSAL_MAX_IPI_BUF; i++) 75 cmd.ibuf[i].mem = arg->ibuf[i].mem; 76 notify: 77 return versal_mbox_notify(&cmd, NULL, err); 78 } 79