1ae8ec5e1SHisping Lin /* 2ae8ec5e1SHisping Lin * Copyright 2017, Rockchip Electronics Co., Ltd 3ae8ec5e1SHisping Lin * hisping lin, <hisping.lin@rock-chips.com> 4ae8ec5e1SHisping Lin * 5ae8ec5e1SHisping Lin * SPDX-License-Identifier: GPL-2.0+ 6ae8ec5e1SHisping Lin */ 7ae8ec5e1SHisping Lin 8ae8ec5e1SHisping Lin #include <common.h> 9bb1ba6acSHisping Lin #include <optee_include/OpteeClientInterface.h> 10ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h> 11ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h> 1278ef5fbdSqiujian #include <optee_include/tee_api_defines.h> 133251364cSHisping Lin #include <boot_rkimg.h> 14a7df4868Stony.xu #include <stdlib.h> 151e8c0e44STony Xu #include <attestation_key.h> 16a7df4868Stony.xu 17a7df4868Stony.xu #define BOOT_FROM_EMMC (1 << 1) 18c7de5349SHisping Lin #define STORAGE_CMD_READ_ATTRIBUTE_HASH 0 19c7de5349SHisping Lin #define STORAGE_CMD_WRITE_ATTRIBUTE_HASH 1 20c7de5349SHisping Lin #define STORAGE_CMD_UBOOT_END_OTP 2 21c7de5349SHisping Lin #define STORAGE_CMD_READ_VBOOTKEY_HASH 3 22c7de5349SHisping Lin #define STORAGE_CMD_WRITE_VBOOTKEY_HASH 4 23c7de5349SHisping Lin #define STORAGE_CMD_READ_ENABLE_FLAG 5 241ef63c75SHisping Lin #define STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY 9 25fbf29bfbSHisping Lin #define STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG 10 26f39d4289SHisping Lin #define STORAGE_CMD_WRITE_OEM_HUK 11 27d5913350SHisping Lin #define STORAGE_CMD_WRITE_OEM_NS_OTP 12 28d5913350SHisping Lin #define STORAGE_CMD_READ_OEM_NS_OTP 13 2990e849a0Sxb.wang #define STORAGE_CMD_WRITE_OEM_OTP_KEY 14 30a405238aSHisping Lin #define STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK 15 319deb34f6SHisping Lin #define STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN 16 32*10f41197SHisping Lin #define STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN 20 33ae8ec5e1SHisping Lin 342f8c34bdSxb.wang #define CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER 0x00000002 35fc3694d6Sxb.wang 36fc3694d6Sxb.wang #define RK_CRYPTO_SERVICE_UUID { 0x0cacdb5d, 0x4fea, 0x466c, \ 37fc3694d6Sxb.wang { 0x97, 0x16, 0x3d, 0x54, 0x16, 0x52, 0x83, 0x0f } } 38fc3694d6Sxb.wang 39ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 40ae8ec5e1SHisping Lin { 41ae8ec5e1SHisping Lin if (in > 9) 42ae8ec5e1SHisping Lin return in + 55; 43ae8ec5e1SHisping Lin else 44ae8ec5e1SHisping Lin return in + 48; 45ae8ec5e1SHisping Lin } 46ae8ec5e1SHisping Lin 47c7de5349SHisping Lin static uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 48ae8ec5e1SHisping Lin { 49ae8ec5e1SHisping Lin uint32_t i = 0; 50ae8ec5e1SHisping Lin 51ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 52ae8ec5e1SHisping Lin return 0; 53ae8ec5e1SHisping Lin 54ae8ec5e1SHisping Lin for (; i < blen; i++) { 55ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 56ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 57ae8ec5e1SHisping Lin } 58ae8ec5e1SHisping Lin hs[blen * 2] = 0; 59ae8ec5e1SHisping Lin 60ae8ec5e1SHisping Lin return blen * 2; 61ae8ec5e1SHisping Lin } 62ae8ec5e1SHisping Lin 632f8c34bdSxb.wang static void crypto_flush_cacheline(uint32_t addr, uint32_t size) 642f8c34bdSxb.wang { 652f8c34bdSxb.wang ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 662f8c34bdSxb.wang ulong aligned_input, aligned_len; 672f8c34bdSxb.wang 682f8c34bdSxb.wang if (!addr || !size) 692f8c34bdSxb.wang return; 702f8c34bdSxb.wang 712f8c34bdSxb.wang /* Must flush dcache before crypto DMA fetch data region */ 722f8c34bdSxb.wang aligned_input = round_down(addr, alignment); 732f8c34bdSxb.wang aligned_len = round_up(size + (addr - aligned_input), alignment); 742f8c34bdSxb.wang flush_cache(aligned_input, aligned_len); 752f8c34bdSxb.wang } 762f8c34bdSxb.wang 77a900eef3SHisping Lin static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) 78a900eef3SHisping Lin { 79a900eef3SHisping Lin ulong alignment = CONFIG_SYS_CACHELINE_SIZE; 80a900eef3SHisping Lin ulong aligned_input, aligned_len; 81a900eef3SHisping Lin 82a900eef3SHisping Lin if (!addr || !size) 83a900eef3SHisping Lin return; 84a900eef3SHisping Lin 85a900eef3SHisping Lin /* Must invalidate dcache after crypto DMA write data region */ 86a900eef3SHisping Lin aligned_input = round_down(addr, alignment); 87a900eef3SHisping Lin aligned_len = round_up(size + (addr - aligned_input), alignment); 88a900eef3SHisping Lin invalidate_dcache_range(aligned_input, aligned_input + aligned_len); 89a900eef3SHisping Lin } 90a900eef3SHisping Lin 91c7de5349SHisping Lin static uint32_t trusty_base_write_security_data(char *filename, 92c7de5349SHisping Lin uint32_t filename_size, 93c7de5349SHisping Lin uint8_t *data, 94c7de5349SHisping Lin uint32_t data_size) 95ae8ec5e1SHisping Lin { 96ae8ec5e1SHisping Lin TEEC_Result TeecResult; 97ae8ec5e1SHisping Lin TEEC_Context TeecContext; 98ae8ec5e1SHisping Lin TEEC_Session TeecSession; 99ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 100ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 101ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 102ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 103ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 1043251364cSHisping Lin struct blk_desc *dev_desc; 1053251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1066651d4c0SJason Zhu if (!dev_desc) { 1076651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1086651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1096651d4c0SJason Zhu } 1103251364cSHisping Lin 111f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 112f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 113f4e1db95SHisping Lin return TeecResult; 114ae8ec5e1SHisping Lin 115ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 116f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 117f4e1db95SHisping Lin return TeecResult; 118ae8ec5e1SHisping Lin 1193251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1203251364cSHisping Lin TEEC_NONE, 1213251364cSHisping Lin TEEC_NONE, 1223251364cSHisping Lin TEEC_NONE); 1233251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 124b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 125b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 126b9a7e756SHisping Lin else 127b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1283251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1293251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1303251364cSHisping Lin #endif 1313251364cSHisping Lin 132ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 133ae8ec5e1SHisping Lin &TeecSession, 134ae8ec5e1SHisping Lin TeecUuid, 135ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 136ae8ec5e1SHisping Lin NULL, 1373251364cSHisping Lin &TeecOperation, 138ae8ec5e1SHisping Lin &ErrorOrigin); 139f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 140f4e1db95SHisping Lin return TeecResult; 141ae8ec5e1SHisping Lin 142ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 143ae8ec5e1SHisping Lin 144c7de5349SHisping Lin SharedMem0.size = filename_size; 145ae8ec5e1SHisping Lin SharedMem0.flags = 0; 146ae8ec5e1SHisping Lin 147ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 148f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 149f4e1db95SHisping Lin goto exit; 150ae8ec5e1SHisping Lin 151c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 152ae8ec5e1SHisping Lin 153ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 154ae8ec5e1SHisping Lin 155c7de5349SHisping Lin SharedMem1.size = data_size; 156c7de5349SHisping Lin SharedMem1.flags = 0; 157c7de5349SHisping Lin 158c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 159c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 160c7de5349SHisping Lin goto exit; 161c7de5349SHisping Lin 162c7de5349SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 163c7de5349SHisping Lin 164c7de5349SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 165c7de5349SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 166c7de5349SHisping Lin 167c7de5349SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 168c7de5349SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 169c7de5349SHisping Lin 170c7de5349SHisping Lin 171c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 172c7de5349SHisping Lin TEEC_MEMREF_TEMP_INOUT, 173c7de5349SHisping Lin TEEC_NONE, 174c7de5349SHisping Lin TEEC_NONE); 175c7de5349SHisping Lin 176c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 177c7de5349SHisping Lin 1, 178c7de5349SHisping Lin &TeecOperation, 179c7de5349SHisping Lin &ErrorOrigin); 180c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 181c7de5349SHisping Lin goto exit; 182c7de5349SHisping Lin exit: 183c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 184c7de5349SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 185c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 186c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 187c7de5349SHisping Lin 188c7de5349SHisping Lin return TeecResult; 189c7de5349SHisping Lin } 190c7de5349SHisping Lin 191c7de5349SHisping Lin static uint32_t trusty_base_read_security_data(char *filename, 192c7de5349SHisping Lin uint32_t filename_size, 193c7de5349SHisping Lin uint8_t *data, 194c7de5349SHisping Lin uint32_t data_size) 195c7de5349SHisping Lin { 196c7de5349SHisping Lin TEEC_Result TeecResult; 197c7de5349SHisping Lin TEEC_Context TeecContext; 198c7de5349SHisping Lin TEEC_Session TeecSession; 199c7de5349SHisping Lin uint32_t ErrorOrigin; 200c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 201c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 202c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 203c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 204c7de5349SHisping Lin 205c7de5349SHisping Lin struct blk_desc *dev_desc; 206c7de5349SHisping Lin dev_desc = rockchip_get_bootdev(); 207c7de5349SHisping Lin if (!dev_desc) { 208c7de5349SHisping Lin printf("%s: dev_desc is NULL!\n", __func__); 209c7de5349SHisping Lin return -TEEC_ERROR_GENERIC; 210c7de5349SHisping Lin } 211c7de5349SHisping Lin 212c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 213c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 214c7de5349SHisping Lin return TeecResult; 215c7de5349SHisping Lin 216c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 217c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 218c7de5349SHisping Lin return TeecResult; 219c7de5349SHisping Lin 220c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 221c7de5349SHisping Lin TEEC_NONE, 222c7de5349SHisping Lin TEEC_NONE, 223c7de5349SHisping Lin TEEC_NONE); 224c7de5349SHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 225c7de5349SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 226c7de5349SHisping Lin TeecOperation.params[0].value.a = 1; 227c7de5349SHisping Lin else 228c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 229c7de5349SHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 230c7de5349SHisping Lin TeecOperation.params[0].value.a = 0; 231c7de5349SHisping Lin #endif 232c7de5349SHisping Lin 233c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 234c7de5349SHisping Lin &TeecSession, 235c7de5349SHisping Lin TeecUuid, 236c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 237c7de5349SHisping Lin NULL, 238c7de5349SHisping Lin &TeecOperation, 239c7de5349SHisping Lin &ErrorOrigin); 240c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 241c7de5349SHisping Lin return TeecResult; 242c7de5349SHisping Lin 243c7de5349SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 244c7de5349SHisping Lin 245c7de5349SHisping Lin SharedMem0.size = filename_size; 246c7de5349SHisping Lin SharedMem0.flags = 0; 247c7de5349SHisping Lin 248c7de5349SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 249c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 250c7de5349SHisping Lin goto exit; 251c7de5349SHisping Lin 252c7de5349SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 253c7de5349SHisping Lin 254c7de5349SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 255c7de5349SHisping Lin 256c7de5349SHisping Lin SharedMem1.size = data_size; 257ae8ec5e1SHisping Lin SharedMem1.flags = 0; 258ae8ec5e1SHisping Lin 259ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 260f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 261f4e1db95SHisping Lin goto exit; 262ae8ec5e1SHisping Lin 263ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 264ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 265ae8ec5e1SHisping Lin 266ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 267ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 268ae8ec5e1SHisping Lin 269ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 270ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 271ae8ec5e1SHisping Lin TEEC_NONE, 272ae8ec5e1SHisping Lin TEEC_NONE); 273ae8ec5e1SHisping Lin 274ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 275ae8ec5e1SHisping Lin 0, 276ae8ec5e1SHisping Lin &TeecOperation, 277ae8ec5e1SHisping Lin &ErrorOrigin); 27846b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 279c7de5349SHisping Lin memcpy(data, SharedMem1.buffer, SharedMem1.size); 280f4e1db95SHisping Lin exit: 281ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 282ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 283ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 28446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 285ae8ec5e1SHisping Lin 286ae8ec5e1SHisping Lin return TeecResult; 287ae8ec5e1SHisping Lin } 288ae8ec5e1SHisping Lin 289c7de5349SHisping Lin static uint32_t trusty_base_end_security_data(void) 290c7de5349SHisping Lin { 291c7de5349SHisping Lin TEEC_Result TeecResult; 292c7de5349SHisping Lin TEEC_Context TeecContext; 293c7de5349SHisping Lin TEEC_Session TeecSession; 294c7de5349SHisping Lin uint32_t ErrorOrigin; 295c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 296c7de5349SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 297c7de5349SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 298c7de5349SHisping Lin TEEC_Operation TeecOperation = {0}; 299c7de5349SHisping Lin 300c7de5349SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 301c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 302c7de5349SHisping Lin return TeecResult; 303c7de5349SHisping Lin 304c7de5349SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 305c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 306c7de5349SHisping Lin return TeecResult; 307c7de5349SHisping Lin 308c7de5349SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 309c7de5349SHisping Lin &TeecSession, 310c7de5349SHisping Lin TeecUuid, 311c7de5349SHisping Lin TEEC_LOGIN_PUBLIC, 312c7de5349SHisping Lin NULL, 313c7de5349SHisping Lin NULL, 314c7de5349SHisping Lin &ErrorOrigin); 315c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 316c7de5349SHisping Lin return TeecResult; 317c7de5349SHisping Lin 318c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 319c7de5349SHisping Lin TEEC_NONE, 320c7de5349SHisping Lin TEEC_NONE, 321c7de5349SHisping Lin TEEC_NONE); 322c7de5349SHisping Lin 323c7de5349SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 324c7de5349SHisping Lin 2, 325c7de5349SHisping Lin &TeecOperation, 326c7de5349SHisping Lin &ErrorOrigin); 327c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 328c7de5349SHisping Lin goto exit; 329c7de5349SHisping Lin exit: 330c7de5349SHisping Lin TEEC_CloseSession(&TeecSession); 331c7de5349SHisping Lin TEEC_FinalizeContext(&TeecContext); 332c7de5349SHisping Lin 333c7de5349SHisping Lin return TeecResult; 334c7de5349SHisping Lin } 335c7de5349SHisping Lin 33634f2e8f6SHisping Lin static void trusty_notify_always_use_security(void) 33734f2e8f6SHisping Lin { 33834f2e8f6SHisping Lin #if defined(CONFIG_OPTEE_V2) && defined(CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION) 33934f2e8f6SHisping Lin TEEC_Result TeecResult; 34034f2e8f6SHisping Lin TEEC_Context TeecContext; 34134f2e8f6SHisping Lin TEEC_Session TeecSession; 34234f2e8f6SHisping Lin uint32_t ErrorOrigin; 34334f2e8f6SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 34434f2e8f6SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 34534f2e8f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 34634f2e8f6SHisping Lin TEEC_Operation TeecOperation = {0}; 34734f2e8f6SHisping Lin 34834f2e8f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 34934f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 35034f2e8f6SHisping Lin return; 35134f2e8f6SHisping Lin 35234f2e8f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 35334f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 35434f2e8f6SHisping Lin return; 35534f2e8f6SHisping Lin 35634f2e8f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 35734f2e8f6SHisping Lin &TeecSession, 35834f2e8f6SHisping Lin TeecUuid, 35934f2e8f6SHisping Lin TEEC_LOGIN_PUBLIC, 36034f2e8f6SHisping Lin NULL, 36134f2e8f6SHisping Lin NULL, 36234f2e8f6SHisping Lin &ErrorOrigin); 36334f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 36434f2e8f6SHisping Lin return; 36534f2e8f6SHisping Lin 36634f2e8f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 36734f2e8f6SHisping Lin TEEC_NONE, 36834f2e8f6SHisping Lin TEEC_NONE, 36934f2e8f6SHisping Lin TEEC_NONE); 37034f2e8f6SHisping Lin 37134f2e8f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 37234f2e8f6SHisping Lin 9, 37334f2e8f6SHisping Lin &TeecOperation, 37434f2e8f6SHisping Lin &ErrorOrigin); 37534f2e8f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 37634f2e8f6SHisping Lin debug("notify always use security fail! please update optee!"); 37734f2e8f6SHisping Lin 37834f2e8f6SHisping Lin TEEC_CloseSession(&TeecSession); 37934f2e8f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 38034f2e8f6SHisping Lin 38134f2e8f6SHisping Lin return; 38234f2e8f6SHisping Lin #endif 38334f2e8f6SHisping Lin } 38434f2e8f6SHisping Lin 385c7de5349SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 386c7de5349SHisping Lin { 387c7de5349SHisping Lin char hs[9]; 388c7de5349SHisping Lin 389c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 390c7de5349SHisping Lin 391c7de5349SHisping Lin return trusty_base_read_security_data(hs, 8, (uint8_t *)value, 8); 392c7de5349SHisping Lin } 393c7de5349SHisping Lin 394ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 395ae8ec5e1SHisping Lin { 396c7de5349SHisping Lin char hs[9]; 3973251364cSHisping Lin 398c7de5349SHisping Lin b2hs((uint8_t *)&slot, (uint8_t *)hs, 4, 9); 399ae8ec5e1SHisping Lin 400c7de5349SHisping Lin return trusty_base_write_security_data(hs, 8, (uint8_t *)&value, 8); 401ae8ec5e1SHisping Lin } 402ae8ec5e1SHisping Lin 403ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 404ae8ec5e1SHisping Lin { 405c7de5349SHisping Lin return trusty_base_read_security_data("attributes", 406c7de5349SHisping Lin sizeof("attributes"), attributes, size); 407ae8ec5e1SHisping Lin } 408ae8ec5e1SHisping Lin 409ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 410ae8ec5e1SHisping Lin { 411c7de5349SHisping Lin return trusty_base_write_security_data("attributes", 412c7de5349SHisping Lin sizeof("attributes"), attributes, size); 4136651d4c0SJason Zhu } 414ae8ec5e1SHisping Lin 415c7de5349SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 416c7de5349SHisping Lin { 417c7de5349SHisping Lin return trusty_base_read_security_data("attributes_flag", 418c7de5349SHisping Lin sizeof("attributes_flag"), attributes, 1); 419c7de5349SHisping Lin } 420ae8ec5e1SHisping Lin 421c7de5349SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 422c7de5349SHisping Lin { 423c7de5349SHisping Lin return trusty_base_write_security_data("attributes_flag", 424c7de5349SHisping Lin sizeof("attributes_flag"), &attributes, 1); 425ae8ec5e1SHisping Lin } 426ae8ec5e1SHisping Lin 427564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 428564654ebSJason Zhu uint32_t size) 429564654ebSJason Zhu { 430c7de5349SHisping Lin return trusty_base_read_security_data("rsacer", 431c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 432564654ebSJason Zhu } 433564654ebSJason Zhu 434564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 435564654ebSJason Zhu uint32_t size) 436564654ebSJason Zhu { 437c7de5349SHisping Lin return trusty_base_write_security_data("rsacer", 438c7de5349SHisping Lin sizeof("rsacer"), attributes, size); 439564654ebSJason Zhu } 440564654ebSJason Zhu 441ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 442ae8ec5e1SHisping Lin { 443c7de5349SHisping Lin return trusty_base_read_security_data("lock_state", 444c7de5349SHisping Lin sizeof("lock_state"), lock_state, 1); 445ae8ec5e1SHisping Lin } 446ae8ec5e1SHisping Lin 447ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 448ae8ec5e1SHisping Lin { 449c7de5349SHisping Lin return trusty_base_write_security_data("lock_state", 450c7de5349SHisping Lin sizeof("lock_state"), &lock_state, 1); 451ae8ec5e1SHisping Lin } 452ae8ec5e1SHisping Lin 453ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 454ae8ec5e1SHisping Lin { 455c7de5349SHisping Lin return trusty_base_read_security_data("flash_lock_state", 456c7de5349SHisping Lin sizeof("flash_lock_state"), flash_lock_state, 1); 457c7de5349SHisping Lin } 458c7de5349SHisping Lin 459c7de5349SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 460c7de5349SHisping Lin { 461c7de5349SHisping Lin return trusty_base_write_security_data("flash_lock_state", 462c7de5349SHisping Lin sizeof("flash_lock_state"), &flash_lock_state, 1); 463c7de5349SHisping Lin } 464c7de5349SHisping Lin 465c7de5349SHisping Lin static uint32_t trusty_base_end_efuse_or_otp(void) 466c7de5349SHisping Lin { 467ae8ec5e1SHisping Lin TEEC_Result TeecResult; 468ae8ec5e1SHisping Lin TEEC_Context TeecContext; 469ae8ec5e1SHisping Lin TEEC_Session TeecSession; 470ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 471c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 472c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 473c7de5349SHisping Lin 474ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 475ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 476ae8ec5e1SHisping Lin 477f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 478f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 479f4e1db95SHisping Lin return TeecResult; 480ae8ec5e1SHisping Lin 481ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 482f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 483f4e1db95SHisping Lin return TeecResult; 484ae8ec5e1SHisping Lin 485ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 486ae8ec5e1SHisping Lin &TeecSession, 487ae8ec5e1SHisping Lin TeecUuid, 488ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 489ae8ec5e1SHisping Lin NULL, 490c7de5349SHisping Lin NULL, 491ae8ec5e1SHisping Lin &ErrorOrigin); 492f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 493f4e1db95SHisping Lin return TeecResult; 494ae8ec5e1SHisping Lin 495c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 496c7de5349SHisping Lin TEEC_NONE, 497ae8ec5e1SHisping Lin TEEC_NONE, 498ae8ec5e1SHisping Lin TEEC_NONE); 499ae8ec5e1SHisping Lin 500ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 501c7de5349SHisping Lin STORAGE_CMD_UBOOT_END_OTP, 502ae8ec5e1SHisping Lin &TeecOperation, 503ae8ec5e1SHisping Lin &ErrorOrigin); 504c7de5349SHisping Lin if (TeecResult != TEEC_SUCCESS) 505c7de5349SHisping Lin goto exit; 506f4e1db95SHisping Lin exit: 507ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 50846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 509ae8ec5e1SHisping Lin 510ae8ec5e1SHisping Lin return TeecResult; 511ae8ec5e1SHisping Lin } 512ae8ec5e1SHisping Lin 513c7de5349SHisping Lin static uint32_t trusty_base_efuse_or_otp_operation(uint32_t cmd, 514c7de5349SHisping Lin uint8_t is_write, 515c7de5349SHisping Lin uint32_t *buf, 516c7de5349SHisping Lin uint32_t length) 517ae8ec5e1SHisping Lin { 518ae8ec5e1SHisping Lin TEEC_Result TeecResult; 519ae8ec5e1SHisping Lin TEEC_Context TeecContext; 520ae8ec5e1SHisping Lin TEEC_Session TeecSession; 521ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 522c7de5349SHisping Lin 523c7de5349SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 524c7de5349SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 525ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 526ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 527ae8ec5e1SHisping Lin 528f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 529f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 530f4e1db95SHisping Lin return TeecResult; 531ae8ec5e1SHisping Lin 532ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 533f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 534f4e1db95SHisping Lin return TeecResult; 535ae8ec5e1SHisping Lin 536ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 537ae8ec5e1SHisping Lin &TeecSession, 538ae8ec5e1SHisping Lin TeecUuid, 539ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 540ae8ec5e1SHisping Lin NULL, 541c7de5349SHisping Lin NULL, 542ae8ec5e1SHisping Lin &ErrorOrigin); 543f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 544f4e1db95SHisping Lin return TeecResult; 545ae8ec5e1SHisping Lin 546ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 547ae8ec5e1SHisping Lin 548c7de5349SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 549ae8ec5e1SHisping Lin SharedMem0.flags = 0; 550ae8ec5e1SHisping Lin 551ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 552f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 553f4e1db95SHisping Lin goto exit; 554ae8ec5e1SHisping Lin 555ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 556ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 557ae8ec5e1SHisping Lin 558c7de5349SHisping Lin if (is_write) { 559c7de5349SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 560ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 561c7de5349SHisping Lin TEEC_NONE, 562ae8ec5e1SHisping Lin TEEC_NONE, 563ae8ec5e1SHisping Lin TEEC_NONE); 564ae8ec5e1SHisping Lin 565c7de5349SHisping Lin } else { 566c7de5349SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 567c7de5349SHisping Lin TEEC_NONE, 568c7de5349SHisping Lin TEEC_NONE, 569c7de5349SHisping Lin TEEC_NONE); 570c7de5349SHisping Lin } 571c7de5349SHisping Lin 572ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 573c7de5349SHisping Lin cmd, 574ae8ec5e1SHisping Lin &TeecOperation, 575ae8ec5e1SHisping Lin &ErrorOrigin); 576f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 577f4e1db95SHisping Lin goto exit; 578c7de5349SHisping Lin 579c7de5349SHisping Lin if (!is_write) 580c7de5349SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 581c7de5349SHisping Lin 582f4e1db95SHisping Lin exit: 583ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 584ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 58546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 586ae8ec5e1SHisping Lin 587ae8ec5e1SHisping Lin return TeecResult; 588ae8ec5e1SHisping Lin } 589ae8ec5e1SHisping Lin 5906ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 5916ef445a4SHisping Lin { 592c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ATTRIBUTE_HASH, 593c7de5349SHisping Lin false, buf, length); 5946ef445a4SHisping Lin } 5956ef445a4SHisping Lin 5966ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 5976ef445a4SHisping Lin { 598c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_ATTRIBUTE_HASH, 599c7de5349SHisping Lin true, buf, length); 60016539616SHisping Lin } 60116539616SHisping Lin 60216539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 60316539616SHisping Lin { 60416539616SHisping Lin TEEC_Result res; 605c7de5349SHisping Lin 606c7de5349SHisping Lin res = trusty_base_end_security_data(); 607c7de5349SHisping Lin res |= trusty_base_end_efuse_or_otp(); 60816539616SHisping Lin return res; 60916539616SHisping Lin } 6102cd27853SHisping Lin 6112cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 6122cd27853SHisping Lin { 613c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_VBOOTKEY_HASH, 614c7de5349SHisping Lin false, buf, length); 6152cd27853SHisping Lin } 616c7de5349SHisping Lin 6172cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 6182cd27853SHisping Lin { 619c7de5349SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_VBOOTKEY_HASH, 620c7de5349SHisping Lin true, buf, length); 6212cd27853SHisping Lin } 622095e2a82SHisping Lin 623468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 624468df3b2SHisping Lin { 625468df3b2SHisping Lin uint32_t bootflag; 626c7de5349SHisping Lin TEEC_Result TeecResult; 627468df3b2SHisping Lin 628f07e1686SHisping Lin *flag = 0; 629f07e1686SHisping Lin 630c7de5349SHisping Lin TeecResult = trusty_base_efuse_or_otp_operation(STORAGE_CMD_READ_ENABLE_FLAG, 631c7de5349SHisping Lin false, &bootflag, 1); 632468df3b2SHisping Lin 633468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 6340202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 6350202ee8aSHisping Lin if (bootflag == 0x00000001) 6360202ee8aSHisping Lin *flag = 1; 6370202ee8aSHisping Lin #else 638468df3b2SHisping Lin if (bootflag == 0x000000FF) 639468df3b2SHisping Lin *flag = 1; 6400202ee8aSHisping Lin #endif 641468df3b2SHisping Lin } 642095e2a82SHisping Lin return TeecResult; 643095e2a82SHisping Lin } 6444aa61755SAndy Ye 6451ef63c75SHisping Lin uint32_t trusty_write_ta_encryption_key(uint32_t *buf, uint32_t length) 6461ef63c75SHisping Lin { 6471ef63c75SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_TA_ENCRYPTION_KEY, 6481ef63c75SHisping Lin true, buf, length); 6491ef63c75SHisping Lin } 6501ef63c75SHisping Lin 651*10f41197SHisping Lin uint32_t trusty_ta_encryption_key_is_written(uint8_t *value) 652*10f41197SHisping Lin { 653*10f41197SHisping Lin TEEC_Result TeecResult; 654*10f41197SHisping Lin TEEC_Context TeecContext; 655*10f41197SHisping Lin TEEC_Session TeecSession; 656*10f41197SHisping Lin uint32_t ErrorOrigin; 657*10f41197SHisping Lin 658*10f41197SHisping Lin *value = 0; 659*10f41197SHisping Lin 660*10f41197SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 661*10f41197SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 662*10f41197SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 663*10f41197SHisping Lin TEEC_Operation TeecOperation = {0}; 664*10f41197SHisping Lin 665*10f41197SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 666*10f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 667*10f41197SHisping Lin return TeecResult; 668*10f41197SHisping Lin 669*10f41197SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 670*10f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 671*10f41197SHisping Lin return TeecResult; 672*10f41197SHisping Lin 673*10f41197SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 674*10f41197SHisping Lin &TeecSession, 675*10f41197SHisping Lin TeecUuid, 676*10f41197SHisping Lin TEEC_LOGIN_PUBLIC, 677*10f41197SHisping Lin NULL, 678*10f41197SHisping Lin NULL, 679*10f41197SHisping Lin &ErrorOrigin); 680*10f41197SHisping Lin if (TeecResult != TEEC_SUCCESS) 681*10f41197SHisping Lin return TeecResult; 682*10f41197SHisping Lin 683*10f41197SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_OUTPUT, 684*10f41197SHisping Lin TEEC_NONE, 685*10f41197SHisping Lin TEEC_NONE, 686*10f41197SHisping Lin TEEC_NONE); 687*10f41197SHisping Lin 688*10f41197SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 689*10f41197SHisping Lin STORAGE_CMD_TA_ENCRYPTION_KEY_IS_WRITTEN, 690*10f41197SHisping Lin &TeecOperation, 691*10f41197SHisping Lin &ErrorOrigin); 692*10f41197SHisping Lin if (TeecResult == TEEC_SUCCESS) 693*10f41197SHisping Lin *value = TeecOperation.params[0].value.a; 694*10f41197SHisping Lin 695*10f41197SHisping Lin TEEC_CloseSession(&TeecSession); 696*10f41197SHisping Lin TEEC_FinalizeContext(&TeecContext); 697*10f41197SHisping Lin 698*10f41197SHisping Lin return TeecResult; 699*10f41197SHisping Lin } 700*10f41197SHisping Lin 701fbf29bfbSHisping Lin uint32_t trusty_check_security_level_flag(uint8_t flag) 702fbf29bfbSHisping Lin { 703fbf29bfbSHisping Lin uint32_t levelflag; 704fbf29bfbSHisping Lin 705fbf29bfbSHisping Lin levelflag = flag; 706fbf29bfbSHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_CHECK_SECURITY_LEVEL_FLAG, 707fbf29bfbSHisping Lin true, &levelflag, 1); 708fbf29bfbSHisping Lin } 709fbf29bfbSHisping Lin 710f39d4289SHisping Lin uint32_t trusty_write_oem_huk(uint32_t *buf, uint32_t length) 711f39d4289SHisping Lin { 712f39d4289SHisping Lin return trusty_base_efuse_or_otp_operation(STORAGE_CMD_WRITE_OEM_HUK, 713f39d4289SHisping Lin true, buf, length); 714f39d4289SHisping Lin } 715f39d4289SHisping Lin 71634f2e8f6SHisping Lin static void trusty_select_security_level(void) 7177504da74SHisping Lin { 7187504da74SHisping Lin #if (CONFIG_OPTEE_SECURITY_LEVEL > 0) 7197504da74SHisping Lin TEEC_Result TeecResult; 7207504da74SHisping Lin 7217504da74SHisping Lin TeecResult = trusty_check_security_level_flag(CONFIG_OPTEE_SECURITY_LEVEL); 7227504da74SHisping Lin if (TeecResult == TEE_ERROR_CANCEL) { 7237504da74SHisping Lin run_command("download", 0); 7247504da74SHisping Lin return; 7257504da74SHisping Lin } 7267504da74SHisping Lin 7277504da74SHisping Lin if (TeecResult == TEEC_SUCCESS) 7287504da74SHisping Lin debug("optee select security level success!"); 7297504da74SHisping Lin else 7307504da74SHisping Lin panic("optee select security level fail!"); 7317504da74SHisping Lin 7327504da74SHisping Lin return; 7337504da74SHisping Lin #endif 7347504da74SHisping Lin } 7357504da74SHisping Lin 73651ac7005SHisping Lin void optee_client_init(void) 73751ac7005SHisping Lin { 73851ac7005SHisping Lin trusty_select_security_level(); 73934f2e8f6SHisping Lin trusty_notify_always_use_security(); 74051ac7005SHisping Lin } 74151ac7005SHisping Lin 742d5913350SHisping Lin uint32_t trusty_write_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 743d5913350SHisping Lin { 744d5913350SHisping Lin TEEC_Result TeecResult; 745d5913350SHisping Lin TEEC_Context TeecContext; 746d5913350SHisping Lin TEEC_Session TeecSession; 747d5913350SHisping Lin uint32_t ErrorOrigin; 748d5913350SHisping Lin 749d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 750d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 751d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 752d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 753d5913350SHisping Lin 754d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 755d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 756d5913350SHisping Lin return TeecResult; 757d5913350SHisping Lin 758d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 759d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 760d5913350SHisping Lin return TeecResult; 761d5913350SHisping Lin 762d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 763d5913350SHisping Lin &TeecSession, 764d5913350SHisping Lin TeecUuid, 765d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 766d5913350SHisping Lin NULL, 767d5913350SHisping Lin NULL, 768d5913350SHisping Lin &ErrorOrigin); 769d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 770d5913350SHisping Lin return TeecResult; 771d5913350SHisping Lin 772d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 773d5913350SHisping Lin 774d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 775d5913350SHisping Lin 776d5913350SHisping Lin SharedMem.size = byte_len; 777d5913350SHisping Lin SharedMem.flags = 0; 778d5913350SHisping Lin 779d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 780d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 781d5913350SHisping Lin goto exit; 782d5913350SHisping Lin 783d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 784d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 785d5913350SHisping Lin 786d5913350SHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 787d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 788d5913350SHisping Lin TEEC_MEMREF_TEMP_INPUT, 789d5913350SHisping Lin TEEC_NONE, 790d5913350SHisping Lin TEEC_NONE); 791d5913350SHisping Lin 792d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 793d5913350SHisping Lin STORAGE_CMD_WRITE_OEM_NS_OTP, 794d5913350SHisping Lin &TeecOperation, 795d5913350SHisping Lin &ErrorOrigin); 796d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 797d5913350SHisping Lin goto exit; 798d5913350SHisping Lin 799d5913350SHisping Lin exit: 800d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 801d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 802d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 803d5913350SHisping Lin 804d5913350SHisping Lin return TeecResult; 805d5913350SHisping Lin } 806d5913350SHisping Lin 807d5913350SHisping Lin uint32_t trusty_read_oem_ns_otp(uint32_t byte_off, uint8_t *byte_buf, uint32_t byte_len) 808d5913350SHisping Lin { 809d5913350SHisping Lin TEEC_Result TeecResult; 810d5913350SHisping Lin TEEC_Context TeecContext; 811d5913350SHisping Lin TEEC_Session TeecSession; 812d5913350SHisping Lin uint32_t ErrorOrigin; 813d5913350SHisping Lin 814d5913350SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 815d5913350SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 816d5913350SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 817d5913350SHisping Lin TEEC_Operation TeecOperation = {0}; 818d5913350SHisping Lin 819d5913350SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 820d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 821d5913350SHisping Lin return TeecResult; 822d5913350SHisping Lin 823d5913350SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 824d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 825d5913350SHisping Lin return TeecResult; 826d5913350SHisping Lin 827d5913350SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 828d5913350SHisping Lin &TeecSession, 829d5913350SHisping Lin TeecUuid, 830d5913350SHisping Lin TEEC_LOGIN_PUBLIC, 831d5913350SHisping Lin NULL, 832d5913350SHisping Lin NULL, 833d5913350SHisping Lin &ErrorOrigin); 834d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 835d5913350SHisping Lin return TeecResult; 836d5913350SHisping Lin 837d5913350SHisping Lin TeecOperation.params[0].value.a = byte_off; 838d5913350SHisping Lin 839d5913350SHisping Lin TEEC_SharedMemory SharedMem = {0}; 840d5913350SHisping Lin 841d5913350SHisping Lin SharedMem.size = byte_len; 842d5913350SHisping Lin SharedMem.flags = 0; 843d5913350SHisping Lin 844d5913350SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 845d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 846d5913350SHisping Lin goto exit; 847d5913350SHisping Lin 848d5913350SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 849d5913350SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 850d5913350SHisping Lin 851d5913350SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 852d5913350SHisping Lin TEEC_MEMREF_TEMP_OUTPUT, 853d5913350SHisping Lin TEEC_NONE, 854d5913350SHisping Lin TEEC_NONE); 855d5913350SHisping Lin 856d5913350SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 857d5913350SHisping Lin STORAGE_CMD_READ_OEM_NS_OTP, 858d5913350SHisping Lin &TeecOperation, 859d5913350SHisping Lin &ErrorOrigin); 860d5913350SHisping Lin if (TeecResult != TEEC_SUCCESS) 861d5913350SHisping Lin goto exit; 862d5913350SHisping Lin 863d5913350SHisping Lin memcpy(byte_buf, SharedMem.buffer, SharedMem.size); 864d5913350SHisping Lin 865d5913350SHisping Lin exit: 866d5913350SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 867d5913350SHisping Lin TEEC_CloseSession(&TeecSession); 868d5913350SHisping Lin TEEC_FinalizeContext(&TeecContext); 869d5913350SHisping Lin 870d5913350SHisping Lin return TeecResult; 871d5913350SHisping Lin } 872d5913350SHisping Lin 87390e849a0Sxb.wang uint32_t trusty_write_oem_otp_key(enum RK_OEM_OTP_KEYID key_id, 874bb1ba6acSHisping Lin uint8_t *byte_buf, uint32_t byte_len) 875bb1ba6acSHisping Lin { 876bb1ba6acSHisping Lin TEEC_Result TeecResult; 877bb1ba6acSHisping Lin TEEC_Context TeecContext; 878bb1ba6acSHisping Lin TEEC_Session TeecSession; 879bb1ba6acSHisping Lin uint32_t ErrorOrigin; 880bb1ba6acSHisping Lin 881bb1ba6acSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 882bb1ba6acSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 883bb1ba6acSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 884bb1ba6acSHisping Lin TEEC_Operation TeecOperation = {0}; 885bb1ba6acSHisping Lin 886bb1ba6acSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 887bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 888bb1ba6acSHisping Lin return TeecResult; 889bb1ba6acSHisping Lin 890bb1ba6acSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 891bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 892bb1ba6acSHisping Lin return TeecResult; 893bb1ba6acSHisping Lin 894bb1ba6acSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 895bb1ba6acSHisping Lin &TeecSession, 896bb1ba6acSHisping Lin TeecUuid, 897bb1ba6acSHisping Lin TEEC_LOGIN_PUBLIC, 898bb1ba6acSHisping Lin NULL, 899bb1ba6acSHisping Lin NULL, 900bb1ba6acSHisping Lin &ErrorOrigin); 901bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 902bb1ba6acSHisping Lin return TeecResult; 903bb1ba6acSHisping Lin 904bb1ba6acSHisping Lin TeecOperation.params[0].value.a = key_id; 905bb1ba6acSHisping Lin 906bb1ba6acSHisping Lin TEEC_SharedMemory SharedMem = {0}; 907bb1ba6acSHisping Lin 908bb1ba6acSHisping Lin SharedMem.size = byte_len; 909bb1ba6acSHisping Lin SharedMem.flags = 0; 910bb1ba6acSHisping Lin 911bb1ba6acSHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem); 912bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 913bb1ba6acSHisping Lin goto exit; 914bb1ba6acSHisping Lin 915bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem.buffer; 916bb1ba6acSHisping Lin TeecOperation.params[1].tmpref.size = SharedMem.size; 917bb1ba6acSHisping Lin 918bb1ba6acSHisping Lin memcpy(SharedMem.buffer, byte_buf, SharedMem.size); 919bb1ba6acSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 920bb1ba6acSHisping Lin TEEC_MEMREF_TEMP_INPUT, 921bb1ba6acSHisping Lin TEEC_NONE, 922bb1ba6acSHisping Lin TEEC_NONE); 923bb1ba6acSHisping Lin 924bb1ba6acSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 92590e849a0Sxb.wang STORAGE_CMD_WRITE_OEM_OTP_KEY, 926bb1ba6acSHisping Lin &TeecOperation, 927bb1ba6acSHisping Lin &ErrorOrigin); 928bb1ba6acSHisping Lin if (TeecResult != TEEC_SUCCESS) 929bb1ba6acSHisping Lin goto exit; 930bb1ba6acSHisping Lin 931bb1ba6acSHisping Lin exit: 932bb1ba6acSHisping Lin TEEC_ReleaseSharedMemory(&SharedMem); 933bb1ba6acSHisping Lin TEEC_CloseSession(&TeecSession); 934bb1ba6acSHisping Lin TEEC_FinalizeContext(&TeecContext); 935bb1ba6acSHisping Lin 936bb1ba6acSHisping Lin return TeecResult; 937bb1ba6acSHisping Lin } 938bb1ba6acSHisping Lin 9399deb34f6SHisping Lin uint32_t trusty_oem_otp_key_is_written(enum RK_OEM_OTP_KEYID key_id, uint8_t *value) 9409deb34f6SHisping Lin { 9419deb34f6SHisping Lin TEEC_Result TeecResult; 9429deb34f6SHisping Lin TEEC_Context TeecContext; 9439deb34f6SHisping Lin TEEC_Session TeecSession; 9449deb34f6SHisping Lin uint32_t ErrorOrigin; 9459deb34f6SHisping Lin 9469deb34f6SHisping Lin *value = 0xFF; 9479deb34f6SHisping Lin 9489deb34f6SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 9499deb34f6SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 9509deb34f6SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 9519deb34f6SHisping Lin TEEC_Operation TeecOperation = {0}; 9529deb34f6SHisping Lin 9539deb34f6SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 9549deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9559deb34f6SHisping Lin return TeecResult; 9569deb34f6SHisping Lin 9579deb34f6SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 9589deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9599deb34f6SHisping Lin return TeecResult; 9609deb34f6SHisping Lin 9619deb34f6SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 9629deb34f6SHisping Lin &TeecSession, 9639deb34f6SHisping Lin TeecUuid, 9649deb34f6SHisping Lin TEEC_LOGIN_PUBLIC, 9659deb34f6SHisping Lin NULL, 9669deb34f6SHisping Lin NULL, 9679deb34f6SHisping Lin &ErrorOrigin); 9689deb34f6SHisping Lin if (TeecResult != TEEC_SUCCESS) 9699deb34f6SHisping Lin return TeecResult; 9709deb34f6SHisping Lin 9719deb34f6SHisping Lin TeecOperation.params[0].value.a = key_id; 9729deb34f6SHisping Lin 9739deb34f6SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, 9749deb34f6SHisping Lin TEEC_NONE, 9759deb34f6SHisping Lin TEEC_NONE, 9769deb34f6SHisping Lin TEEC_NONE); 9779deb34f6SHisping Lin 9789deb34f6SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 9799deb34f6SHisping Lin STORAGE_CMD_OEM_OTP_KEY_IS_WRITTEN, 9809deb34f6SHisping Lin &TeecOperation, 9819deb34f6SHisping Lin &ErrorOrigin); 9829deb34f6SHisping Lin if (TeecResult == TEEC_SUCCESS) 9839deb34f6SHisping Lin *value = TeecOperation.params[0].value.b; 9849deb34f6SHisping Lin 9859deb34f6SHisping Lin TEEC_CloseSession(&TeecSession); 9869deb34f6SHisping Lin TEEC_FinalizeContext(&TeecContext); 9879deb34f6SHisping Lin 9889deb34f6SHisping Lin return TeecResult; 9899deb34f6SHisping Lin } 9909deb34f6SHisping Lin 99190e849a0Sxb.wang uint32_t trusty_set_oem_hr_otp_read_lock(enum RK_OEM_OTP_KEYID key_id) 992a405238aSHisping Lin { 993a405238aSHisping Lin TEEC_Result TeecResult; 994a405238aSHisping Lin TEEC_Context TeecContext; 995a405238aSHisping Lin TEEC_Session TeecSession; 996a405238aSHisping Lin uint32_t ErrorOrigin; 997a405238aSHisping Lin 998a405238aSHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, 999a405238aSHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1000a405238aSHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1001a405238aSHisping Lin TEEC_Operation TeecOperation = {0}; 1002a405238aSHisping Lin 1003a405238aSHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1004a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1005a405238aSHisping Lin return TeecResult; 1006a405238aSHisping Lin 1007a405238aSHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1008a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1009a405238aSHisping Lin return TeecResult; 1010a405238aSHisping Lin 1011a405238aSHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1012a405238aSHisping Lin &TeecSession, 1013a405238aSHisping Lin TeecUuid, 1014a405238aSHisping Lin TEEC_LOGIN_PUBLIC, 1015a405238aSHisping Lin NULL, 1016a405238aSHisping Lin NULL, 1017a405238aSHisping Lin &ErrorOrigin); 1018a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1019a405238aSHisping Lin return TeecResult; 1020a405238aSHisping Lin 1021a405238aSHisping Lin TeecOperation.params[0].value.a = key_id; 1022a405238aSHisping Lin 1023a405238aSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1024a405238aSHisping Lin TEEC_NONE, 1025a405238aSHisping Lin TEEC_NONE, 1026a405238aSHisping Lin TEEC_NONE); 1027a405238aSHisping Lin 1028a405238aSHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1029a405238aSHisping Lin STORAGE_CMD_SET_OEM_HR_OTP_READ_LOCK, 1030a405238aSHisping Lin &TeecOperation, 1031a405238aSHisping Lin &ErrorOrigin); 1032a405238aSHisping Lin if (TeecResult != TEEC_SUCCESS) 1033a405238aSHisping Lin goto exit; 1034a405238aSHisping Lin 1035a405238aSHisping Lin exit: 1036a405238aSHisping Lin TEEC_CloseSession(&TeecSession); 1037a405238aSHisping Lin TEEC_FinalizeContext(&TeecContext); 1038a405238aSHisping Lin 1039a405238aSHisping Lin return TeecResult; 1040a405238aSHisping Lin } 1041a405238aSHisping Lin 10422f8c34bdSxb.wang uint32_t trusty_oem_otp_key_cipher(enum RK_OEM_OTP_KEYID key_id, rk_cipher_config *config, 10432f8c34bdSxb.wang uint32_t src_phys_addr, uint32_t dst_phys_addr, 10442f8c34bdSxb.wang uint32_t len) 1045fc3694d6Sxb.wang { 1046fc3694d6Sxb.wang TEEC_Result TeecResult; 1047fc3694d6Sxb.wang TEEC_Context TeecContext; 1048fc3694d6Sxb.wang TEEC_Session TeecSession; 1049fc3694d6Sxb.wang TEEC_Operation TeecOperation = {0}; 1050fc3694d6Sxb.wang uint32_t ErrorOrigin; 1051fc3694d6Sxb.wang TEEC_UUID uuid = RK_CRYPTO_SERVICE_UUID; 1052fc3694d6Sxb.wang TEEC_SharedMemory SharedMem_config = {0}; 1053fc3694d6Sxb.wang 10542f8c34bdSxb.wang if (key_id != RK_OEM_OTP_KEY0 && 10552f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY1 && 10562f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY2 && 10572f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY3 && 10582f8c34bdSxb.wang key_id != RK_OEM_OTP_KEY_FW) 1059fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1060fc3694d6Sxb.wang 10612f8c34bdSxb.wang if (!config) 1062fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1063fc3694d6Sxb.wang 1064fc3694d6Sxb.wang if (config->algo != RK_ALGO_AES && config->algo != RK_ALGO_SM4) 1065fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1066fc3694d6Sxb.wang 1067fc3694d6Sxb.wang if (config->mode >= RK_CIPHER_MODE_XTS) 1068fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1069fc3694d6Sxb.wang 1070fc3694d6Sxb.wang if (config->operation != RK_MODE_ENCRYPT && 1071fc3694d6Sxb.wang config->operation != RK_MODE_DECRYPT) 1072fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1073fc3694d6Sxb.wang 1074fc3694d6Sxb.wang if (config->key_len != 16 && 1075fc3694d6Sxb.wang config->key_len != 24 && 1076fc3694d6Sxb.wang config->key_len != 32) 1077fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1078fc3694d6Sxb.wang 10792f8c34bdSxb.wang if (key_id == RK_OEM_OTP_KEY_FW && config->key_len != 16) 10802f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10812f8c34bdSxb.wang 10822f8c34bdSxb.wang #if defined(CONFIG_ROCKCHIP_RV1126) 10832f8c34bdSxb.wang if (config->key_len == 24) 10842f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10852f8c34bdSxb.wang #endif 10862f8c34bdSxb.wang 1087fc3694d6Sxb.wang if (len % AES_BLOCK_SIZE || 1088fc3694d6Sxb.wang len == 0) 1089fc3694d6Sxb.wang return TEEC_ERROR_BAD_PARAMETERS; 1090fc3694d6Sxb.wang 10912f8c34bdSxb.wang if (!src_phys_addr || !dst_phys_addr) 10922f8c34bdSxb.wang return TEEC_ERROR_BAD_PARAMETERS; 10932f8c34bdSxb.wang 1094fc3694d6Sxb.wang TeecResult = OpteeClientApiLibInitialize(); 1095fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1096fc3694d6Sxb.wang return TeecResult; 1097fc3694d6Sxb.wang 1098fc3694d6Sxb.wang TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1099fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1100fc3694d6Sxb.wang return TeecResult; 1101fc3694d6Sxb.wang 1102fc3694d6Sxb.wang TeecResult = TEEC_OpenSession(&TeecContext, 1103fc3694d6Sxb.wang &TeecSession, 1104fc3694d6Sxb.wang &uuid, 1105fc3694d6Sxb.wang TEEC_LOGIN_PUBLIC, 1106fc3694d6Sxb.wang NULL, 1107fc3694d6Sxb.wang NULL, 1108fc3694d6Sxb.wang &ErrorOrigin); 1109fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1110fc3694d6Sxb.wang goto exit; 1111fc3694d6Sxb.wang 1112fc3694d6Sxb.wang SharedMem_config.size = sizeof(rk_cipher_config); 1113fc3694d6Sxb.wang TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem_config); 1114fc3694d6Sxb.wang if (TeecResult != TEEC_SUCCESS) 1115fc3694d6Sxb.wang goto exit; 1116fc3694d6Sxb.wang 1117fc3694d6Sxb.wang memcpy(SharedMem_config.buffer, config, sizeof(rk_cipher_config)); 1118fc3694d6Sxb.wang TeecOperation.params[0].value.a = key_id; 1119fc3694d6Sxb.wang TeecOperation.params[1].tmpref.buffer = SharedMem_config.buffer; 1120fc3694d6Sxb.wang TeecOperation.params[1].tmpref.size = SharedMem_config.size; 11212f8c34bdSxb.wang TeecOperation.params[2].value.a = src_phys_addr; 11222f8c34bdSxb.wang TeecOperation.params[2].value.b = len; 11232f8c34bdSxb.wang TeecOperation.params[3].value.a = dst_phys_addr; 1124fc3694d6Sxb.wang TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1125fc3694d6Sxb.wang TEEC_MEMREF_TEMP_INPUT, 11262f8c34bdSxb.wang TEEC_VALUE_INPUT, 11272f8c34bdSxb.wang TEEC_VALUE_INPUT); 11282f8c34bdSxb.wang 11292f8c34bdSxb.wang crypto_flush_cacheline(src_phys_addr, len); 11302f8c34bdSxb.wang crypto_flush_cacheline(dst_phys_addr, len); 11312f8c34bdSxb.wang 1132fc3694d6Sxb.wang TeecResult = TEEC_InvokeCommand(&TeecSession, 11332f8c34bdSxb.wang CRYPTO_SERVICE_CMD_OEM_OTP_KEY_PHYS_CIPHER, 1134fc3694d6Sxb.wang &TeecOperation, 1135fc3694d6Sxb.wang &ErrorOrigin); 1136fc3694d6Sxb.wang 1137a900eef3SHisping Lin crypto_invalidate_cacheline(dst_phys_addr, len); 1138a900eef3SHisping Lin 1139fc3694d6Sxb.wang exit: 1140fc3694d6Sxb.wang TEEC_ReleaseSharedMemory(&SharedMem_config); 1141fc3694d6Sxb.wang TEEC_CloseSession(&TeecSession); 1142fc3694d6Sxb.wang TEEC_FinalizeContext(&TeecContext); 1143fc3694d6Sxb.wang return TeecResult; 1144fc3694d6Sxb.wang } 1145fc3694d6Sxb.wang 11464aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 11474aa61755SAndy Ye { 11484aa61755SAndy Ye TEEC_Result TeecResult; 11494aa61755SAndy Ye TEEC_Context TeecContext; 11504aa61755SAndy Ye TEEC_Session TeecSession; 11514aa61755SAndy Ye uint32_t ErrorOrigin; 11524aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 11534aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 11544aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 11554aa61755SAndy Ye } 11564aa61755SAndy Ye }; 11574aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 11584aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 11593251364cSHisping Lin struct blk_desc *dev_desc; 11603251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 11616651d4c0SJason Zhu if (!dev_desc) { 11626651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 11636651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 11646651d4c0SJason Zhu } 11654aa61755SAndy Ye 1166f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1167f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1168f4e1db95SHisping Lin return TeecResult; 11694aa61755SAndy Ye 11704aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1171f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1172f4e1db95SHisping Lin return TeecResult; 11734aa61755SAndy Ye 11743251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 11753251364cSHisping Lin TEEC_NONE, 11763251364cSHisping Lin TEEC_NONE, 11773251364cSHisping Lin TEEC_NONE); 11783251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1179b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1180b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1181b9a7e756SHisping Lin else 1182b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1183b9a7e756SHisping Lin 11843251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 11853251364cSHisping Lin TeecOperation.params[0].value.a = 0; 11863251364cSHisping Lin #endif 11873251364cSHisping Lin 11884aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 11894aa61755SAndy Ye &TeecSession, 11904aa61755SAndy Ye TeecUuid, 11914aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 11924aa61755SAndy Ye NULL, 11933251364cSHisping Lin &TeecOperation, 11944aa61755SAndy Ye &ErrorOrigin); 1195f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1196f4e1db95SHisping Lin return TeecResult; 11974aa61755SAndy Ye 11984aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 11994aa61755SAndy Ye 12004aa61755SAndy Ye SharedMem0.size = *dh_size; 12014aa61755SAndy Ye SharedMem0.flags = 0; 12024aa61755SAndy Ye 12034aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1204f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1205f4e1db95SHisping Lin goto exit; 12064aa61755SAndy Ye 12074aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12084aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 12094aa61755SAndy Ye 12104aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 12114aa61755SAndy Ye TEEC_NONE, 12124aa61755SAndy Ye TEEC_NONE, 12134aa61755SAndy Ye TEEC_NONE); 12144aa61755SAndy Ye 12154aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 12164aa61755SAndy Ye 143, 12174aa61755SAndy Ye &TeecOperation, 12184aa61755SAndy Ye &ErrorOrigin); 1219f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1220f4e1db95SHisping Lin goto exit; 12214aa61755SAndy Ye 12224aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 12234aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1224f4e1db95SHisping Lin exit: 12254aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 12264aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1227f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 12284aa61755SAndy Ye 12294aa61755SAndy Ye return TeecResult; 12304aa61755SAndy Ye } 12314aa61755SAndy Ye 12324aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 12334aa61755SAndy Ye { 12344aa61755SAndy Ye TEEC_Result TeecResult; 12354aa61755SAndy Ye TEEC_Context TeecContext; 12364aa61755SAndy Ye TEEC_Session TeecSession; 12374aa61755SAndy Ye uint32_t ErrorOrigin; 12384aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 12394aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 12404aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 12414aa61755SAndy Ye } 12424aa61755SAndy Ye }; 12434aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 12444aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 12453251364cSHisping Lin struct blk_desc *dev_desc; 12463251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 12476651d4c0SJason Zhu if (!dev_desc) { 12486651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 12496651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 12506651d4c0SJason Zhu } 12514aa61755SAndy Ye 1252f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1253f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1254f4e1db95SHisping Lin return TeecResult; 12554aa61755SAndy Ye 12564aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1257f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1258f4e1db95SHisping Lin return TeecResult; 12594aa61755SAndy Ye 12603251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 12613251364cSHisping Lin TEEC_NONE, 12623251364cSHisping Lin TEEC_NONE, 12633251364cSHisping Lin TEEC_NONE); 12643251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1265b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1266b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1267b9a7e756SHisping Lin else 1268b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1269b9a7e756SHisping Lin 12703251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 12713251364cSHisping Lin TeecOperation.params[0].value.a = 0; 12723251364cSHisping Lin #endif 12733251364cSHisping Lin 12744aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 12754aa61755SAndy Ye &TeecSession, 12764aa61755SAndy Ye TeecUuid, 12774aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 12784aa61755SAndy Ye NULL, 12793251364cSHisping Lin &TeecOperation, 12804aa61755SAndy Ye &ErrorOrigin); 1281f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1282f4e1db95SHisping Lin return TeecResult; 12834aa61755SAndy Ye 12844aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 12854aa61755SAndy Ye 12864aa61755SAndy Ye SharedMem0.size = *uuid_size; 12874aa61755SAndy Ye SharedMem0.flags = 0; 12884aa61755SAndy Ye 12894aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1290f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1291f4e1db95SHisping Lin goto exit; 12924aa61755SAndy Ye 12934aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12944aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 12954aa61755SAndy Ye 12964aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 12974aa61755SAndy Ye TEEC_NONE, 12984aa61755SAndy Ye TEEC_NONE, 12994aa61755SAndy Ye TEEC_NONE); 13004aa61755SAndy Ye 13014aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 13024aa61755SAndy Ye 144, 13034aa61755SAndy Ye &TeecOperation, 13044aa61755SAndy Ye &ErrorOrigin); 1305f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1306f4e1db95SHisping Lin goto exit; 13074aa61755SAndy Ye 13084aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 13094aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1310f4e1db95SHisping Lin exit: 13114aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 13124aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1313f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 13144aa61755SAndy Ye 13154aa61755SAndy Ye return TeecResult; 13164aa61755SAndy Ye } 13174aa61755SAndy Ye 13184aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 13194aa61755SAndy Ye uint32_t *operation_size, 13204aa61755SAndy Ye uint8_t *out, 13214aa61755SAndy Ye uint32_t *out_len) 13224aa61755SAndy Ye { 13234aa61755SAndy Ye TEEC_Result TeecResult; 13244aa61755SAndy Ye TEEC_Context TeecContext; 13254aa61755SAndy Ye TEEC_Session TeecSession; 13264aa61755SAndy Ye uint32_t ErrorOrigin; 13274aa61755SAndy Ye 13284aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 13294aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 13304aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 13314aa61755SAndy Ye } 13324aa61755SAndy Ye }; 13334aa61755SAndy Ye 13344aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 13354aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 13363251364cSHisping Lin struct blk_desc *dev_desc; 13373251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 13386651d4c0SJason Zhu if (!dev_desc) { 13396651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 13406651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 13416651d4c0SJason Zhu } 13424aa61755SAndy Ye 1343f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1344f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1345f4e1db95SHisping Lin return TeecResult; 13464aa61755SAndy Ye 13474aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1348f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1349f4e1db95SHisping Lin return TeecResult; 13504aa61755SAndy Ye 13513251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 13523251364cSHisping Lin TEEC_NONE, 13533251364cSHisping Lin TEEC_NONE, 13543251364cSHisping Lin TEEC_NONE); 13553251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1356b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1357b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1358b9a7e756SHisping Lin else 1359b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1360b9a7e756SHisping Lin 13613251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 13623251364cSHisping Lin TeecOperation.params[0].value.a = 0; 13633251364cSHisping Lin #endif 13643251364cSHisping Lin 13654aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 13664aa61755SAndy Ye &TeecSession, 13674aa61755SAndy Ye TeecUuid, 13684aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 13694aa61755SAndy Ye NULL, 13703251364cSHisping Lin &TeecOperation, 13714aa61755SAndy Ye &ErrorOrigin); 1372f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1373f4e1db95SHisping Lin return TeecResult; 13744aa61755SAndy Ye 13754aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 13764aa61755SAndy Ye 13774aa61755SAndy Ye SharedMem0.size = *operation_size; 13784aa61755SAndy Ye SharedMem0.flags = 0; 13794aa61755SAndy Ye 13804aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1381f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1382f4e1db95SHisping Lin goto exit; 13834aa61755SAndy Ye 13844aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 13854aa61755SAndy Ye 13864aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13874aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 13884aa61755SAndy Ye 13894aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 13904aa61755SAndy Ye 13914aa61755SAndy Ye SharedMem1.size = *out_len; 13924aa61755SAndy Ye SharedMem1.flags = 0; 13934aa61755SAndy Ye 13944aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1395f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1396f4e1db95SHisping Lin goto exit; 13974aa61755SAndy Ye 13984aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 13994aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 14004aa61755SAndy Ye 14014aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 14024aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 14034aa61755SAndy Ye TEEC_NONE, 14044aa61755SAndy Ye TEEC_NONE); 14054aa61755SAndy Ye 14064aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 14074aa61755SAndy Ye 145, 14084aa61755SAndy Ye &TeecOperation, 14094aa61755SAndy Ye &ErrorOrigin); 1410f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1411f4e1db95SHisping Lin goto exit; 14124aa61755SAndy Ye 14134aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 14144aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1415f4e1db95SHisping Lin exit: 14164aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 14174aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1418f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1419f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 14204aa61755SAndy Ye 14214aa61755SAndy Ye return TeecResult; 14224aa61755SAndy Ye } 14234aa61755SAndy Ye 14244aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 14254aa61755SAndy Ye { 14264aa61755SAndy Ye TEEC_Result TeecResult; 14274aa61755SAndy Ye TEEC_Context TeecContext; 14284aa61755SAndy Ye TEEC_Session TeecSession; 14294aa61755SAndy Ye uint32_t ErrorOrigin; 14304aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 14314aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 14324aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 14334aa61755SAndy Ye } 14344aa61755SAndy Ye }; 14354aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 14364aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 14373251364cSHisping Lin struct blk_desc *dev_desc; 14383251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 14396651d4c0SJason Zhu if (!dev_desc) { 14406651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 14416651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 14426651d4c0SJason Zhu } 1443f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1444f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1445f4e1db95SHisping Lin return TeecResult; 14464aa61755SAndy Ye 14474aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1448f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1449f4e1db95SHisping Lin return TeecResult; 14504aa61755SAndy Ye 14513251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 14523251364cSHisping Lin TEEC_NONE, 14533251364cSHisping Lin TEEC_NONE, 14543251364cSHisping Lin TEEC_NONE); 14553251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1456b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1457b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1458b9a7e756SHisping Lin else 1459b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1460b9a7e756SHisping Lin 14613251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 14623251364cSHisping Lin TeecOperation.params[0].value.a = 0; 14633251364cSHisping Lin #endif 14643251364cSHisping Lin 14654aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 14664aa61755SAndy Ye &TeecSession, 14674aa61755SAndy Ye TeecUuid, 14684aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 14694aa61755SAndy Ye NULL, 14703251364cSHisping Lin &TeecOperation, 14714aa61755SAndy Ye &ErrorOrigin); 1472f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1473f4e1db95SHisping Lin return TeecResult; 14744aa61755SAndy Ye 14754aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 14764aa61755SAndy Ye 14774aa61755SAndy Ye SharedMem0.size = *ca_response_size; 14784aa61755SAndy Ye SharedMem0.flags = 0; 14794aa61755SAndy Ye 14804aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1481f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1482f4e1db95SHisping Lin goto exit; 14834aa61755SAndy Ye 14844aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 14854aa61755SAndy Ye 14864aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 14874aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 14884aa61755SAndy Ye 14894aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 14904aa61755SAndy Ye TEEC_NONE, 14914aa61755SAndy Ye TEEC_NONE, 14924aa61755SAndy Ye TEEC_NONE); 14934aa61755SAndy Ye 14944aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 14954aa61755SAndy Ye 146, 14964aa61755SAndy Ye &TeecOperation, 14974aa61755SAndy Ye &ErrorOrigin); 1498f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1499f4e1db95SHisping Lin goto exit; 1500f4e1db95SHisping Lin exit: 15014aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 15024aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1503f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 15044aa61755SAndy Ye 15054aa61755SAndy Ye return TeecResult; 15064aa61755SAndy Ye } 1507