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> 9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h> 10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h> 1178ef5fbdSqiujian #include <optee_include/tee_api_defines.h> 123251364cSHisping Lin #include <boot_rkimg.h> 13a7df4868Stony.xu #include <stdlib.h> 141e8c0e44STony Xu #include <attestation_key.h> 15a7df4868Stony.xu 16a7df4868Stony.xu #define BOOT_FROM_EMMC (1 << 1) 17ae8ec5e1SHisping Lin 18f4e1db95SHisping Lin uint32_t test_optee(void) 19ae8ec5e1SHisping Lin { 20ae8ec5e1SHisping Lin TEEC_Result TeecResult; 21ae8ec5e1SHisping Lin TEEC_Context TeecContext; 22ae8ec5e1SHisping Lin TEEC_Session TeecSession; 23ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 24a7df4868Stony.xu TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, \ 25ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 26ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 27ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 283251364cSHisping Lin struct blk_desc *dev_desc; 293251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 306651d4c0SJason Zhu if (!dev_desc) { 316651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 32f4e1db95SHisping Lin return -TEEC_ERROR_GENERIC; 336651d4c0SJason Zhu } 34ae8ec5e1SHisping Lin 35f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 36f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 37f4e1db95SHisping Lin return TeecResult; 38ae8ec5e1SHisping Lin 39ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 40f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 41f4e1db95SHisping Lin return TeecResult; 42ae8ec5e1SHisping Lin 433251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 443251364cSHisping Lin TEEC_NONE, 453251364cSHisping Lin TEEC_NONE, 463251364cSHisping Lin TEEC_NONE); 473251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 483251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 493251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 503251364cSHisping Lin TeecOperation.params[0].value.a = 0; 513251364cSHisping Lin #endif 523251364cSHisping Lin 53ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 54ae8ec5e1SHisping Lin &TeecSession, 55ae8ec5e1SHisping Lin TeecUuid, 56ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 57ae8ec5e1SHisping Lin NULL, 583251364cSHisping Lin &TeecOperation, 59ae8ec5e1SHisping Lin &ErrorOrigin); 60f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 61f4e1db95SHisping Lin return TeecResult; 62ae8ec5e1SHisping Lin 63ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 64ae8ec5e1SHisping Lin 65ae8ec5e1SHisping Lin SharedMem0.size = sizeof("filename_test"); 66ae8ec5e1SHisping Lin SharedMem0.flags = 0; 67ae8ec5e1SHisping Lin 68ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 69f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 70f4e1db95SHisping Lin goto exit; 71ae8ec5e1SHisping Lin 72ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size); 73ae8ec5e1SHisping Lin 74ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 75ae8ec5e1SHisping Lin 76ae8ec5e1SHisping Lin SharedMem1.size = 32; 77ae8ec5e1SHisping Lin SharedMem1.flags = 0; 78ae8ec5e1SHisping Lin 79ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 80f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 81f4e1db95SHisping Lin goto exit; 82ae8ec5e1SHisping Lin 83ae8ec5e1SHisping Lin memset(SharedMem1.buffer, 'a', SharedMem1.size); 84ae8ec5e1SHisping Lin 85ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 86ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 87ae8ec5e1SHisping Lin 88ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 89ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 90ae8ec5e1SHisping Lin 91ae8ec5e1SHisping Lin 92ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 93ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 94ae8ec5e1SHisping Lin TEEC_NONE, 95ae8ec5e1SHisping Lin TEEC_NONE); 96ae8ec5e1SHisping Lin 97ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 98ae8ec5e1SHisping Lin 1, 99ae8ec5e1SHisping Lin &TeecOperation, 100ae8ec5e1SHisping Lin &ErrorOrigin); 101f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 102f4e1db95SHisping Lin goto exit; 103f4e1db95SHisping Lin exit: 104ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 105ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 106ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 10746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 108f4e1db95SHisping Lin return TeecResult; 109ae8ec5e1SHisping Lin } 110ae8ec5e1SHisping Lin 111ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 112ae8ec5e1SHisping Lin { 113ae8ec5e1SHisping Lin if (in > 9) 114ae8ec5e1SHisping Lin return in + 55; 115ae8ec5e1SHisping Lin else 116ae8ec5e1SHisping Lin return in + 48; 117ae8ec5e1SHisping Lin } 118ae8ec5e1SHisping Lin 119ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 120ae8ec5e1SHisping Lin { 121ae8ec5e1SHisping Lin uint32_t i = 0; 122ae8ec5e1SHisping Lin 123ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 124ae8ec5e1SHisping Lin return 0; 125ae8ec5e1SHisping Lin 126ae8ec5e1SHisping Lin for (; i < blen; i++) { 127ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 128ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 129ae8ec5e1SHisping Lin } 130ae8ec5e1SHisping Lin hs[blen * 2] = 0; 131ae8ec5e1SHisping Lin 132ae8ec5e1SHisping Lin return blen * 2; 133ae8ec5e1SHisping Lin } 134ae8ec5e1SHisping Lin 135ae8ec5e1SHisping Lin 136ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 137ae8ec5e1SHisping Lin { 138ae8ec5e1SHisping Lin TEEC_Result TeecResult; 139ae8ec5e1SHisping Lin TEEC_Context TeecContext; 140ae8ec5e1SHisping Lin TEEC_Session TeecSession; 141ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 142ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 143ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 144ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 145ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 146ae8ec5e1SHisping Lin uint8_t hs[9]; 147ae8ec5e1SHisping Lin 1483251364cSHisping Lin struct blk_desc *dev_desc; 1493251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1506651d4c0SJason Zhu if (!dev_desc) { 1516651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1526651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1536651d4c0SJason Zhu } 1543251364cSHisping Lin 155ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 156f4e1db95SHisping Lin 157f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 158f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 159f4e1db95SHisping Lin return TeecResult; 160ae8ec5e1SHisping Lin 161ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 162f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 163f4e1db95SHisping Lin return TeecResult; 164ae8ec5e1SHisping Lin 1653251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1663251364cSHisping Lin TEEC_NONE, 1673251364cSHisping Lin TEEC_NONE, 1683251364cSHisping Lin TEEC_NONE); 1693251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1703251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 1713251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1723251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1733251364cSHisping Lin #endif 1743251364cSHisping Lin 175ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 176ae8ec5e1SHisping Lin &TeecSession, 177ae8ec5e1SHisping Lin TeecUuid, 178ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 179ae8ec5e1SHisping Lin NULL, 1803251364cSHisping Lin &TeecOperation, 181ae8ec5e1SHisping Lin &ErrorOrigin); 182f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 183f4e1db95SHisping Lin return TeecResult; 184ae8ec5e1SHisping Lin 185ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 186ae8ec5e1SHisping Lin 187ae8ec5e1SHisping Lin SharedMem0.size = 8; 188ae8ec5e1SHisping Lin SharedMem0.flags = 0; 189ae8ec5e1SHisping Lin 190ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 191f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 192f4e1db95SHisping Lin goto exit; 193ae8ec5e1SHisping Lin 194ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 195ae8ec5e1SHisping Lin 196ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 197ae8ec5e1SHisping Lin 198ae8ec5e1SHisping Lin SharedMem1.size = 8; 199ae8ec5e1SHisping Lin SharedMem1.flags = 0; 200ae8ec5e1SHisping Lin 201ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 202f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 203f4e1db95SHisping Lin goto exit; 204ae8ec5e1SHisping Lin 205ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 206ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 207ae8ec5e1SHisping Lin 208ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 209ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 210ae8ec5e1SHisping Lin 211ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 212ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 213ae8ec5e1SHisping Lin TEEC_NONE, 214ae8ec5e1SHisping Lin TEEC_NONE); 215ae8ec5e1SHisping Lin 216ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 217ae8ec5e1SHisping Lin 0, 218ae8ec5e1SHisping Lin &TeecOperation, 219ae8ec5e1SHisping Lin &ErrorOrigin); 22046b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 221ae8ec5e1SHisping Lin memcpy((char *)value, SharedMem1.buffer, SharedMem1.size); 222f4e1db95SHisping Lin exit: 223ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 224ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 225ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 22646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 227ae8ec5e1SHisping Lin 228ae8ec5e1SHisping Lin return TeecResult; 229ae8ec5e1SHisping Lin } 230ae8ec5e1SHisping Lin 231ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 232ae8ec5e1SHisping Lin { 233ae8ec5e1SHisping Lin TEEC_Result TeecResult; 234ae8ec5e1SHisping Lin TEEC_Context TeecContext; 235ae8ec5e1SHisping Lin TEEC_Session TeecSession; 236ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 237ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 238ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 239ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 240ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 241ae8ec5e1SHisping Lin uint8_t hs[9]; 2423251364cSHisping Lin struct blk_desc *dev_desc; 2433251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 2446651d4c0SJason Zhu if (!dev_desc) { 2456651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 2466651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 2476651d4c0SJason Zhu } 2483251364cSHisping Lin 249ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 250f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 251f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 252f4e1db95SHisping Lin return TeecResult; 253ae8ec5e1SHisping Lin 254ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 255f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 256f4e1db95SHisping Lin return TeecResult; 257ae8ec5e1SHisping Lin 2583251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 2593251364cSHisping Lin TEEC_NONE, 2603251364cSHisping Lin TEEC_NONE, 2613251364cSHisping Lin TEEC_NONE); 2623251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2633251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 2643251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 2653251364cSHisping Lin TeecOperation.params[0].value.a = 0; 2663251364cSHisping Lin #endif 2673251364cSHisping Lin 268ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 269ae8ec5e1SHisping Lin &TeecSession, 270ae8ec5e1SHisping Lin TeecUuid, 271ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 272ae8ec5e1SHisping Lin NULL, 2733251364cSHisping Lin &TeecOperation, 274ae8ec5e1SHisping Lin &ErrorOrigin); 275f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 276f4e1db95SHisping Lin return TeecResult; 277ae8ec5e1SHisping Lin 278ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 279ae8ec5e1SHisping Lin 280ae8ec5e1SHisping Lin SharedMem0.size = 8; 281ae8ec5e1SHisping Lin SharedMem0.flags = 0; 282ae8ec5e1SHisping Lin 283ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 284f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 285f4e1db95SHisping Lin goto exit; 286ae8ec5e1SHisping Lin 287ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 288ae8ec5e1SHisping Lin 289ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 290ae8ec5e1SHisping Lin 291ae8ec5e1SHisping Lin SharedMem1.size = 8; 292ae8ec5e1SHisping Lin SharedMem1.flags = 0; 293ae8ec5e1SHisping Lin 294ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 295f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 296f4e1db95SHisping Lin goto exit; 297ae8ec5e1SHisping Lin 298ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size); 299ae8ec5e1SHisping Lin 300ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 301ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 302ae8ec5e1SHisping Lin 303ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 304ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 305ae8ec5e1SHisping Lin 306ae8ec5e1SHisping Lin 307ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 308ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 309ae8ec5e1SHisping Lin TEEC_NONE, 310ae8ec5e1SHisping Lin TEEC_NONE); 311ae8ec5e1SHisping Lin 312ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 313ae8ec5e1SHisping Lin 1, 314ae8ec5e1SHisping Lin &TeecOperation, 315ae8ec5e1SHisping Lin &ErrorOrigin); 316f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 317f4e1db95SHisping Lin goto exit; 318f4e1db95SHisping Lin exit: 319ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 320ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 321ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 32246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 323ae8ec5e1SHisping Lin 324ae8ec5e1SHisping Lin return TeecResult; 325ae8ec5e1SHisping Lin } 326ae8ec5e1SHisping Lin 327ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 328ae8ec5e1SHisping Lin { 329ae8ec5e1SHisping Lin TEEC_Result TeecResult; 330ae8ec5e1SHisping Lin TEEC_Context TeecContext; 331ae8ec5e1SHisping Lin TEEC_Session TeecSession; 332ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 33399830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 33499830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 335ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 336ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 3373251364cSHisping Lin struct blk_desc *dev_desc; 3383251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 3396651d4c0SJason Zhu if (!dev_desc) { 3406651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 3416651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 3426651d4c0SJason Zhu } 343ae8ec5e1SHisping Lin 344f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 345f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 346f4e1db95SHisping Lin return TeecResult; 347ae8ec5e1SHisping Lin 348ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 349f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 350f4e1db95SHisping Lin return TeecResult; 351ae8ec5e1SHisping Lin 3523251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 3533251364cSHisping Lin TEEC_NONE, 3543251364cSHisping Lin TEEC_NONE, 3553251364cSHisping Lin TEEC_NONE); 3563251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 3573251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 3583251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 3593251364cSHisping Lin TeecOperation.params[0].value.a = 0; 3603251364cSHisping Lin #endif 3613251364cSHisping Lin 362ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 363ae8ec5e1SHisping Lin &TeecSession, 364ae8ec5e1SHisping Lin TeecUuid, 365ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 366ae8ec5e1SHisping Lin NULL, 3673251364cSHisping Lin &TeecOperation, 368ae8ec5e1SHisping Lin &ErrorOrigin); 369f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 370f4e1db95SHisping Lin return TeecResult; 371ae8ec5e1SHisping Lin 372ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 373ae8ec5e1SHisping Lin 374ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 375ae8ec5e1SHisping Lin SharedMem0.flags = 0; 376ae8ec5e1SHisping Lin 377ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 378f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 379f4e1db95SHisping Lin goto exit; 380ae8ec5e1SHisping Lin 381ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 382ae8ec5e1SHisping Lin 383ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 384ae8ec5e1SHisping Lin 385ae8ec5e1SHisping Lin SharedMem1.size = size; 386ae8ec5e1SHisping Lin SharedMem1.flags = 0; 387ae8ec5e1SHisping Lin 388ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 389f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 390f4e1db95SHisping Lin goto exit; 391ae8ec5e1SHisping Lin 392ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 393ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 394ae8ec5e1SHisping Lin 395ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 396ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 397ae8ec5e1SHisping Lin 398ae8ec5e1SHisping Lin 399ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 400ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 401ae8ec5e1SHisping Lin TEEC_NONE, 402ae8ec5e1SHisping Lin TEEC_NONE); 403ae8ec5e1SHisping Lin 404ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 40599830019SHisping Lin 0, 406ae8ec5e1SHisping Lin &TeecOperation, 407ae8ec5e1SHisping Lin &ErrorOrigin); 40846b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 409ae8ec5e1SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 410f4e1db95SHisping Lin exit: 411ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 412ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 413ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 41446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 415ae8ec5e1SHisping Lin 416ae8ec5e1SHisping Lin return TeecResult; 417ae8ec5e1SHisping Lin } 418ae8ec5e1SHisping Lin 419ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 420ae8ec5e1SHisping Lin { 421ae8ec5e1SHisping Lin TEEC_Result TeecResult; 422ae8ec5e1SHisping Lin TEEC_Context TeecContext; 423ae8ec5e1SHisping Lin TEEC_Session TeecSession; 424ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 42599830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 42699830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 427ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 428ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 4293251364cSHisping Lin struct blk_desc *dev_desc; 4303251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 4316651d4c0SJason Zhu if (!dev_desc) { 4326651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 4336651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 4346651d4c0SJason Zhu } 435ae8ec5e1SHisping Lin 436f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 437f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 438f4e1db95SHisping Lin return TeecResult; 439ae8ec5e1SHisping Lin 440ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 441f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 442f4e1db95SHisping Lin return TeecResult; 443ae8ec5e1SHisping Lin 4443251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 4453251364cSHisping Lin TEEC_NONE, 4463251364cSHisping Lin TEEC_NONE, 4473251364cSHisping Lin TEEC_NONE); 4483251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 4493251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 4503251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 4513251364cSHisping Lin TeecOperation.params[0].value.a = 0; 4523251364cSHisping Lin #endif 4533251364cSHisping Lin 454ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 455ae8ec5e1SHisping Lin &TeecSession, 456ae8ec5e1SHisping Lin TeecUuid, 457ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 458ae8ec5e1SHisping Lin NULL, 4593251364cSHisping Lin &TeecOperation, 460ae8ec5e1SHisping Lin &ErrorOrigin); 461f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 462f4e1db95SHisping Lin return TeecResult; 463ae8ec5e1SHisping Lin 464ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 465ae8ec5e1SHisping Lin 466ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 467ae8ec5e1SHisping Lin SharedMem0.flags = 0; 468ae8ec5e1SHisping Lin 469ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 470f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 471f4e1db95SHisping Lin goto exit; 472ae8ec5e1SHisping Lin 473ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 474ae8ec5e1SHisping Lin 475ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 476ae8ec5e1SHisping Lin 477ae8ec5e1SHisping Lin SharedMem1.size = size; 478ae8ec5e1SHisping Lin SharedMem1.flags = 0; 479ae8ec5e1SHisping Lin 480ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 481f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 482f4e1db95SHisping Lin goto exit; 483ae8ec5e1SHisping Lin 484ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, attributes, SharedMem1.size); 485ae8ec5e1SHisping Lin 486ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 487ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 488ae8ec5e1SHisping Lin 489ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 490ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 491ae8ec5e1SHisping Lin 492ae8ec5e1SHisping Lin 493ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 494ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 495ae8ec5e1SHisping Lin TEEC_NONE, 496ae8ec5e1SHisping Lin TEEC_NONE); 497ae8ec5e1SHisping Lin 498ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 49999830019SHisping Lin 1, 500ae8ec5e1SHisping Lin &TeecOperation, 501ae8ec5e1SHisping Lin &ErrorOrigin); 502f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 503f4e1db95SHisping Lin goto exit; 504f4e1db95SHisping Lin exit: 505ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 506ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 507ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 50846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 509ae8ec5e1SHisping Lin 510ae8ec5e1SHisping Lin return TeecResult; 511ae8ec5e1SHisping Lin } 512ae8ec5e1SHisping Lin 513564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 514564654ebSJason Zhu uint32_t size) 515564654ebSJason Zhu { 516564654ebSJason Zhu TEEC_Result TeecResult; 517564654ebSJason Zhu TEEC_Context TeecContext; 518564654ebSJason Zhu TEEC_Session TeecSession; 519564654ebSJason Zhu uint32_t ErrorOrigin; 520564654ebSJason Zhu TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 521564654ebSJason Zhu { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 522564654ebSJason Zhu TEEC_UUID *TeecUuid = &tempuuid; 523564654ebSJason Zhu TEEC_Operation TeecOperation = {0}; 524564654ebSJason Zhu struct blk_desc *dev_desc; 525564654ebSJason Zhu 526564654ebSJason Zhu dev_desc = rockchip_get_bootdev(); 527564654ebSJason Zhu if (!dev_desc) { 528564654ebSJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 529564654ebSJason Zhu return -TEEC_ERROR_GENERIC; 530564654ebSJason Zhu } 531564654ebSJason Zhu 532f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 533f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 534f4e1db95SHisping Lin return TeecResult; 535f4e1db95SHisping Lin 536564654ebSJason Zhu TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 537f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 538f4e1db95SHisping Lin return TeecResult; 539f4e1db95SHisping Lin 540564654ebSJason Zhu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 541564654ebSJason Zhu TEEC_NONE, 542564654ebSJason Zhu TEEC_NONE, 543564654ebSJason Zhu TEEC_NONE); 544564654ebSJason Zhu /*0 nand or emmc "security" partition , 1 rpmb*/ 545564654ebSJason Zhu TeecOperation.params[0].value.a = 546564654ebSJason Zhu (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 547564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 548564654ebSJason Zhu TeecOperation.params[0].value.a = 0; 549564654ebSJason Zhu #endif 550564654ebSJason Zhu 551564654ebSJason Zhu TeecResult = TEEC_OpenSession(&TeecContext, 552564654ebSJason Zhu &TeecSession, 553564654ebSJason Zhu TeecUuid, 554564654ebSJason Zhu TEEC_LOGIN_PUBLIC, 555564654ebSJason Zhu NULL, 556564654ebSJason Zhu &TeecOperation, 557564654ebSJason Zhu &ErrorOrigin); 558f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 559f4e1db95SHisping Lin return TeecResult; 560564654ebSJason Zhu 561564654ebSJason Zhu TEEC_SharedMemory SharedMem0 = {0}; 562564654ebSJason Zhu 563564654ebSJason Zhu SharedMem0.size = sizeof("rsacer"); 564564654ebSJason Zhu SharedMem0.flags = 0; 565564654ebSJason Zhu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 566f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 567f4e1db95SHisping Lin goto exit; 568564654ebSJason Zhu memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size); 569564654ebSJason Zhu TEEC_SharedMemory SharedMem1 = {0}; 570564654ebSJason Zhu 571564654ebSJason Zhu SharedMem1.size = size; 572564654ebSJason Zhu SharedMem1.flags = 0; 573564654ebSJason Zhu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 574f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 575f4e1db95SHisping Lin goto exit; 576564654ebSJason Zhu TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 577564654ebSJason Zhu TeecOperation.params[0].tmpref.size = SharedMem0.size; 578564654ebSJason Zhu TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 579564654ebSJason Zhu TeecOperation.params[1].tmpref.size = SharedMem1.size; 580564654ebSJason Zhu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 581564654ebSJason Zhu TEEC_MEMREF_TEMP_INOUT, 582564654ebSJason Zhu TEEC_NONE, 583564654ebSJason Zhu TEEC_NONE); 584564654ebSJason Zhu 585564654ebSJason Zhu TeecResult = TEEC_InvokeCommand(&TeecSession, 586564654ebSJason Zhu 0, 587564654ebSJason Zhu &TeecOperation, 588564654ebSJason Zhu &ErrorOrigin); 589564654ebSJason Zhu if (TeecResult == TEEC_SUCCESS) 590564654ebSJason Zhu memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 591f4e1db95SHisping Lin exit: 592564654ebSJason Zhu TEEC_ReleaseSharedMemory(&SharedMem0); 593564654ebSJason Zhu TEEC_ReleaseSharedMemory(&SharedMem1); 594564654ebSJason Zhu TEEC_CloseSession(&TeecSession); 595564654ebSJason Zhu TEEC_FinalizeContext(&TeecContext); 596564654ebSJason Zhu 597564654ebSJason Zhu return TeecResult; 598564654ebSJason Zhu } 599564654ebSJason Zhu 600564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 601564654ebSJason Zhu uint32_t size) 602564654ebSJason Zhu { 603564654ebSJason Zhu TEEC_Result TeecResult; 604564654ebSJason Zhu TEEC_Context TeecContext; 605564654ebSJason Zhu TEEC_Session TeecSession; 606564654ebSJason Zhu uint32_t ErrorOrigin; 607564654ebSJason Zhu TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 608564654ebSJason Zhu { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 609564654ebSJason Zhu TEEC_UUID *TeecUuid = &tempuuid; 610564654ebSJason Zhu TEEC_Operation TeecOperation = {0}; 611564654ebSJason Zhu struct blk_desc *dev_desc; 612564654ebSJason Zhu 613564654ebSJason Zhu dev_desc = rockchip_get_bootdev(); 614564654ebSJason Zhu if (!dev_desc) { 615564654ebSJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 616564654ebSJason Zhu return -TEEC_ERROR_GENERIC; 617564654ebSJason Zhu } 618564654ebSJason Zhu 619f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 620f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 621f4e1db95SHisping Lin return TeecResult; 622f4e1db95SHisping Lin 623564654ebSJason Zhu TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 624f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 625f4e1db95SHisping Lin return TeecResult; 626f4e1db95SHisping Lin 627564654ebSJason Zhu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 628564654ebSJason Zhu TEEC_NONE, 629564654ebSJason Zhu TEEC_NONE, 630564654ebSJason Zhu TEEC_NONE); 631564654ebSJason Zhu /*0 nand or emmc "security" partition , 1 rpmb*/ 632564654ebSJason Zhu TeecOperation.params[0].value.a = 633564654ebSJason Zhu (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 634564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 635564654ebSJason Zhu TeecOperation.params[0].value.a = 0; 636564654ebSJason Zhu #endif 637564654ebSJason Zhu 638564654ebSJason Zhu TeecResult = TEEC_OpenSession(&TeecContext, 639564654ebSJason Zhu &TeecSession, 640564654ebSJason Zhu TeecUuid, 641564654ebSJason Zhu TEEC_LOGIN_PUBLIC, 642564654ebSJason Zhu NULL, 643564654ebSJason Zhu &TeecOperation, 644564654ebSJason Zhu &ErrorOrigin); 645f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 646f4e1db95SHisping Lin return TeecResult; 647564654ebSJason Zhu 648564654ebSJason Zhu TEEC_SharedMemory SharedMem0 = {0}; 649564654ebSJason Zhu 650564654ebSJason Zhu SharedMem0.size = sizeof("rsacer"); 651564654ebSJason Zhu SharedMem0.flags = 0; 652564654ebSJason Zhu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 653f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 654f4e1db95SHisping Lin goto exit; 655564654ebSJason Zhu memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size); 656564654ebSJason Zhu TEEC_SharedMemory SharedMem1 = {0}; 657564654ebSJason Zhu 658564654ebSJason Zhu SharedMem1.size = size; 659564654ebSJason Zhu SharedMem1.flags = 0; 660564654ebSJason Zhu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 661f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 662f4e1db95SHisping Lin goto exit; 663564654ebSJason Zhu memcpy(SharedMem1.buffer, attributes, SharedMem1.size); 664564654ebSJason Zhu TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 665564654ebSJason Zhu TeecOperation.params[0].tmpref.size = SharedMem0.size; 666564654ebSJason Zhu TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 667564654ebSJason Zhu TeecOperation.params[1].tmpref.size = SharedMem1.size; 668564654ebSJason Zhu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 669564654ebSJason Zhu TEEC_MEMREF_TEMP_INOUT, 670564654ebSJason Zhu TEEC_NONE, 671564654ebSJason Zhu TEEC_NONE); 672564654ebSJason Zhu 673564654ebSJason Zhu TeecResult = TEEC_InvokeCommand(&TeecSession, 674564654ebSJason Zhu 1, 675564654ebSJason Zhu &TeecOperation, 676564654ebSJason Zhu &ErrorOrigin); 677f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 678f4e1db95SHisping Lin goto exit; 679f4e1db95SHisping Lin exit: 680564654ebSJason Zhu TEEC_ReleaseSharedMemory(&SharedMem0); 681564654ebSJason Zhu TEEC_ReleaseSharedMemory(&SharedMem1); 682564654ebSJason Zhu TEEC_CloseSession(&TeecSession); 683564654ebSJason Zhu TEEC_FinalizeContext(&TeecContext); 684564654ebSJason Zhu 685564654ebSJason Zhu return TeecResult; 686564654ebSJason Zhu } 687564654ebSJason Zhu 688ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 689ae8ec5e1SHisping Lin { 690ae8ec5e1SHisping Lin TEEC_Result TeecResult; 691ae8ec5e1SHisping Lin TEEC_Context TeecContext; 692ae8ec5e1SHisping Lin TEEC_Session TeecSession; 693ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 694ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 695ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 696ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 697ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 6983251364cSHisping Lin struct blk_desc *dev_desc; 6993251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7006651d4c0SJason Zhu if (!dev_desc) { 7016651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7026651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7036651d4c0SJason Zhu } 704ae8ec5e1SHisping Lin 705f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 706f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 707f4e1db95SHisping Lin return TeecResult; 708ae8ec5e1SHisping Lin 709ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 710f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 711f4e1db95SHisping Lin return TeecResult; 712ae8ec5e1SHisping Lin 7133251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7143251364cSHisping Lin TEEC_NONE, 7153251364cSHisping Lin TEEC_NONE, 7163251364cSHisping Lin TEEC_NONE); 7173251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 7183251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 7193251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7203251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7213251364cSHisping Lin #endif 722ae8ec5e1SHisping Lin 723ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 724ae8ec5e1SHisping Lin &TeecSession, 725ae8ec5e1SHisping Lin TeecUuid, 726ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 727ae8ec5e1SHisping Lin NULL, 7283251364cSHisping Lin &TeecOperation, 729ae8ec5e1SHisping Lin &ErrorOrigin); 730f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 731f4e1db95SHisping Lin return TeecResult; 732ae8ec5e1SHisping Lin 733ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 734ae8ec5e1SHisping Lin 735ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 736ae8ec5e1SHisping Lin SharedMem0.flags = 0; 737ae8ec5e1SHisping Lin 738ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 739f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 740f4e1db95SHisping Lin goto exit; 741ae8ec5e1SHisping Lin 742ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 743ae8ec5e1SHisping Lin 744ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 745ae8ec5e1SHisping Lin 746ae8ec5e1SHisping Lin SharedMem1.size = 1; 747ae8ec5e1SHisping Lin SharedMem1.flags = 0; 748ae8ec5e1SHisping Lin 749ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 750f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 751f4e1db95SHisping Lin goto exit; 752ae8ec5e1SHisping Lin 753ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 754ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 755ae8ec5e1SHisping Lin 756ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 757ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 758ae8ec5e1SHisping Lin 759ae8ec5e1SHisping Lin 760ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 761ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 762ae8ec5e1SHisping Lin TEEC_NONE, 763ae8ec5e1SHisping Lin TEEC_NONE); 764ae8ec5e1SHisping Lin 765ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 766ae8ec5e1SHisping Lin 0, 767ae8ec5e1SHisping Lin &TeecOperation, 768ae8ec5e1SHisping Lin &ErrorOrigin); 76946b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 770ae8ec5e1SHisping Lin memcpy(lock_state, SharedMem1.buffer, SharedMem1.size); 771f4e1db95SHisping Lin exit: 772ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 773ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 774ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 77546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 776ae8ec5e1SHisping Lin 777ae8ec5e1SHisping Lin return TeecResult; 778ae8ec5e1SHisping Lin } 779ae8ec5e1SHisping Lin 780ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 781ae8ec5e1SHisping Lin { 782ae8ec5e1SHisping Lin TEEC_Result TeecResult; 783ae8ec5e1SHisping Lin TEEC_Context TeecContext; 784ae8ec5e1SHisping Lin TEEC_Session TeecSession; 785ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 786ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 787ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 788ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 789ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 7903251364cSHisping Lin struct blk_desc *dev_desc; 7913251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7926651d4c0SJason Zhu if (!dev_desc) { 7936651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7946651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7956651d4c0SJason Zhu } 796ae8ec5e1SHisping Lin 797f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 798f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 799f4e1db95SHisping Lin return TeecResult; 800ae8ec5e1SHisping Lin 801ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 802f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 803f4e1db95SHisping Lin return TeecResult; 804ae8ec5e1SHisping Lin 8053251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8063251364cSHisping Lin TEEC_NONE, 8073251364cSHisping Lin TEEC_NONE, 8083251364cSHisping Lin TEEC_NONE); 8093251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 8103251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 8113251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8123251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8133251364cSHisping Lin #endif 8143251364cSHisping Lin 815ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 816ae8ec5e1SHisping Lin &TeecSession, 817ae8ec5e1SHisping Lin TeecUuid, 818ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 819ae8ec5e1SHisping Lin NULL, 8203251364cSHisping Lin &TeecOperation, 821ae8ec5e1SHisping Lin &ErrorOrigin); 822f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 823f4e1db95SHisping Lin return TeecResult; 824ae8ec5e1SHisping Lin 825ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 826ae8ec5e1SHisping Lin 827ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 828ae8ec5e1SHisping Lin SharedMem0.flags = 0; 829ae8ec5e1SHisping Lin 830ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 831f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 832f4e1db95SHisping Lin goto exit; 833ae8ec5e1SHisping Lin 834ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 835ae8ec5e1SHisping Lin 836ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 837ae8ec5e1SHisping Lin 838ae8ec5e1SHisping Lin SharedMem1.size = 1; 839ae8ec5e1SHisping Lin SharedMem1.flags = 0; 840ae8ec5e1SHisping Lin 841ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 842f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 843f4e1db95SHisping Lin goto exit; 844ae8ec5e1SHisping Lin 845ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size); 846ae8ec5e1SHisping Lin 847ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 848ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 849ae8ec5e1SHisping Lin 850ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 851ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 852ae8ec5e1SHisping Lin 853ae8ec5e1SHisping Lin 854ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 855ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 856ae8ec5e1SHisping Lin TEEC_NONE, 857ae8ec5e1SHisping Lin TEEC_NONE); 858ae8ec5e1SHisping Lin 859ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 860ae8ec5e1SHisping Lin 1, 861ae8ec5e1SHisping Lin &TeecOperation, 862ae8ec5e1SHisping Lin &ErrorOrigin); 863f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 864f4e1db95SHisping Lin goto exit; 865f4e1db95SHisping Lin exit: 866ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 867ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 868ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 86946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 870ae8ec5e1SHisping Lin 871ae8ec5e1SHisping Lin return TeecResult; 872ae8ec5e1SHisping Lin } 873ae8ec5e1SHisping Lin 874ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 875ae8ec5e1SHisping Lin { 876ae8ec5e1SHisping Lin TEEC_Result TeecResult; 877ae8ec5e1SHisping Lin TEEC_Context TeecContext; 878ae8ec5e1SHisping Lin TEEC_Session TeecSession; 879ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 880ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 881ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 882ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 883ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 8843251364cSHisping Lin struct blk_desc *dev_desc; 8853251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8866651d4c0SJason Zhu if (!dev_desc) { 8876651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8886651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8896651d4c0SJason Zhu } 890ae8ec5e1SHisping Lin 891f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 892f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 893f4e1db95SHisping Lin return TeecResult; 894ae8ec5e1SHisping Lin 895ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 896f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 897f4e1db95SHisping Lin return TeecResult; 898ae8ec5e1SHisping Lin 8993251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9003251364cSHisping Lin TEEC_NONE, 9013251364cSHisping Lin TEEC_NONE, 9023251364cSHisping Lin TEEC_NONE); 9033251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 9043251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 9053251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9063251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9073251364cSHisping Lin #endif 908ae8ec5e1SHisping Lin 909ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 910ae8ec5e1SHisping Lin &TeecSession, 911ae8ec5e1SHisping Lin TeecUuid, 912ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 913ae8ec5e1SHisping Lin NULL, 9143251364cSHisping Lin &TeecOperation, 915ae8ec5e1SHisping Lin &ErrorOrigin); 916f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 917f4e1db95SHisping Lin return TeecResult; 918ae8ec5e1SHisping Lin 919ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 920ae8ec5e1SHisping Lin 921ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 922ae8ec5e1SHisping Lin SharedMem0.flags = 0; 923ae8ec5e1SHisping Lin 924ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 925f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 926f4e1db95SHisping Lin goto exit; 927ae8ec5e1SHisping Lin 928ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 929ae8ec5e1SHisping Lin 930ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 931ae8ec5e1SHisping Lin 932ae8ec5e1SHisping Lin SharedMem1.size = 1; 933ae8ec5e1SHisping Lin SharedMem1.flags = 0; 934ae8ec5e1SHisping Lin 935ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 936f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 937f4e1db95SHisping Lin goto exit; 938ae8ec5e1SHisping Lin 939ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 940ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 941ae8ec5e1SHisping Lin 942ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 943ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 944ae8ec5e1SHisping Lin 945ae8ec5e1SHisping Lin 946ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 947ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 948ae8ec5e1SHisping Lin TEEC_NONE, 949ae8ec5e1SHisping Lin TEEC_NONE); 950ae8ec5e1SHisping Lin 951ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 952ae8ec5e1SHisping Lin 0, 953ae8ec5e1SHisping Lin &TeecOperation, 954ae8ec5e1SHisping Lin &ErrorOrigin); 95546b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 956ae8ec5e1SHisping Lin memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size); 957f4e1db95SHisping Lin exit: 958ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 959ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 960ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 96146b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 962ae8ec5e1SHisping Lin 963ae8ec5e1SHisping Lin return TeecResult; 964ae8ec5e1SHisping Lin } 965ae8ec5e1SHisping Lin 966ae8ec5e1SHisping Lin 967ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 968ae8ec5e1SHisping Lin { 969ae8ec5e1SHisping Lin TEEC_Result TeecResult; 970ae8ec5e1SHisping Lin TEEC_Context TeecContext; 971ae8ec5e1SHisping Lin TEEC_Session TeecSession; 972ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 973ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 974ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 975ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 976ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 9773251364cSHisping Lin struct blk_desc *dev_desc; 9783251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 9796651d4c0SJason Zhu if (!dev_desc) { 9806651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 9816651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 9826651d4c0SJason Zhu } 983ae8ec5e1SHisping Lin 984f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 985f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 986f4e1db95SHisping Lin return TeecResult; 987ae8ec5e1SHisping Lin 988ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 989f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 990f4e1db95SHisping Lin return TeecResult; 991ae8ec5e1SHisping Lin 9923251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9933251364cSHisping Lin TEEC_NONE, 9943251364cSHisping Lin TEEC_NONE, 9953251364cSHisping Lin TEEC_NONE); 9963251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 9973251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 9983251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9993251364cSHisping Lin TeecOperation.params[0].value.a = 0; 10003251364cSHisping Lin #endif 10013251364cSHisping Lin 1002ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1003ae8ec5e1SHisping Lin &TeecSession, 1004ae8ec5e1SHisping Lin TeecUuid, 1005ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 1006ae8ec5e1SHisping Lin NULL, 10073251364cSHisping Lin &TeecOperation, 1008ae8ec5e1SHisping Lin &ErrorOrigin); 1009f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1010f4e1db95SHisping Lin return TeecResult; 1011ae8ec5e1SHisping Lin 1012ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1013ae8ec5e1SHisping Lin 1014ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 1015ae8ec5e1SHisping Lin SharedMem0.flags = 0; 1016ae8ec5e1SHisping Lin 1017ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1018f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1019f4e1db95SHisping Lin goto exit; 1020ae8ec5e1SHisping Lin 1021ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 1022ae8ec5e1SHisping Lin 1023ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1024ae8ec5e1SHisping Lin 1025ae8ec5e1SHisping Lin SharedMem1.size = 1; 1026ae8ec5e1SHisping Lin SharedMem1.flags = 0; 1027ae8ec5e1SHisping Lin 1028ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1029f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1030f4e1db95SHisping Lin goto exit; 1031ae8ec5e1SHisping Lin 1032ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size); 1033ae8ec5e1SHisping Lin 1034ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1035ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1036ae8ec5e1SHisping Lin 1037ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1038ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1039ae8ec5e1SHisping Lin 1040ae8ec5e1SHisping Lin 1041ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1042ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1043ae8ec5e1SHisping Lin TEEC_NONE, 1044ae8ec5e1SHisping Lin TEEC_NONE); 1045ae8ec5e1SHisping Lin 1046ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1047ae8ec5e1SHisping Lin 1, 1048ae8ec5e1SHisping Lin &TeecOperation, 1049ae8ec5e1SHisping Lin &ErrorOrigin); 1050f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1051f4e1db95SHisping Lin goto exit; 1052f4e1db95SHisping Lin exit: 1053ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1054ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1055ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 105646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 1057ae8ec5e1SHisping Lin 1058ae8ec5e1SHisping Lin return TeecResult; 1059ae8ec5e1SHisping Lin } 1060ae8ec5e1SHisping Lin 10616ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 10626ef445a4SHisping Lin { 10636ef445a4SHisping Lin TEEC_Result TeecResult; 10646ef445a4SHisping Lin TEEC_Context TeecContext; 10656ef445a4SHisping Lin TEEC_Session TeecSession; 10666ef445a4SHisping Lin uint32_t ErrorOrigin; 10676ef445a4SHisping Lin 10686ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 10696ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 10706ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 10716ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 10726ef445a4SHisping Lin 1073f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1074f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1075f4e1db95SHisping Lin return TeecResult; 10766ef445a4SHisping Lin 10776ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1078f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1079f4e1db95SHisping Lin return TeecResult; 10806ef445a4SHisping Lin 10816ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 10826ef445a4SHisping Lin &TeecSession, 10836ef445a4SHisping Lin TeecUuid, 10846ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 10856ef445a4SHisping Lin NULL, 10866ef445a4SHisping Lin NULL, 10876ef445a4SHisping Lin &ErrorOrigin); 1088f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1089f4e1db95SHisping Lin return TeecResult; 10906ef445a4SHisping Lin 10916ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 10926ef445a4SHisping Lin 10936ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 10946ef445a4SHisping Lin SharedMem0.flags = 0; 10956ef445a4SHisping Lin 10966ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1097f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1098f4e1db95SHisping Lin goto exit; 10996ef445a4SHisping Lin 11006ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11016ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 11026ef445a4SHisping Lin 11036ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 11046ef445a4SHisping Lin TEEC_NONE, 11056ef445a4SHisping Lin TEEC_NONE, 11066ef445a4SHisping Lin TEEC_NONE); 11076ef445a4SHisping Lin 11086ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 11096ef445a4SHisping Lin 0, 11106ef445a4SHisping Lin &TeecOperation, 11116ef445a4SHisping Lin &ErrorOrigin); 11126ef445a4SHisping Lin 11136ef445a4SHisping Lin if (TeecResult == TEEC_SUCCESS) 11146ef445a4SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 1115f4e1db95SHisping Lin exit: 11166ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 11176ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 11186ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 11196ef445a4SHisping Lin 11206ef445a4SHisping Lin return TeecResult; 11216ef445a4SHisping Lin } 11226ef445a4SHisping Lin 11236ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 11246ef445a4SHisping Lin { 11256ef445a4SHisping Lin TEEC_Result TeecResult; 11266ef445a4SHisping Lin TEEC_Context TeecContext; 11276ef445a4SHisping Lin TEEC_Session TeecSession; 11286ef445a4SHisping Lin uint32_t ErrorOrigin; 11296ef445a4SHisping Lin 11306ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 11316ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 11326ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 11336ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 11346ef445a4SHisping Lin 1135f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1136f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1137f4e1db95SHisping Lin return TeecResult; 11386ef445a4SHisping Lin 11396ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1140f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1141f4e1db95SHisping Lin return TeecResult; 11426ef445a4SHisping Lin 11436ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 11446ef445a4SHisping Lin &TeecSession, 11456ef445a4SHisping Lin TeecUuid, 11466ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 11476ef445a4SHisping Lin NULL, 11486ef445a4SHisping Lin NULL, 11496ef445a4SHisping Lin &ErrorOrigin); 1150f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1151f4e1db95SHisping Lin return TeecResult; 11526ef445a4SHisping Lin 11536ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 11546ef445a4SHisping Lin 11556ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 11566ef445a4SHisping Lin SharedMem0.flags = 0; 11576ef445a4SHisping Lin 11586ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1159f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1160f4e1db95SHisping Lin goto exit; 11616ef445a4SHisping Lin 11626ef445a4SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 11636ef445a4SHisping Lin 11646ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11656ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 11666ef445a4SHisping Lin 11676ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 11686ef445a4SHisping Lin TEEC_NONE, 11696ef445a4SHisping Lin TEEC_NONE, 11706ef445a4SHisping Lin TEEC_NONE); 11716ef445a4SHisping Lin 11726ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 11736ef445a4SHisping Lin 1, 11746ef445a4SHisping Lin &TeecOperation, 11756ef445a4SHisping Lin &ErrorOrigin); 1176f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1177f4e1db95SHisping Lin goto exit; 1178f4e1db95SHisping Lin exit: 11796ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 11806ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 11816ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 11826ef445a4SHisping Lin 11836ef445a4SHisping Lin return TeecResult; 11846ef445a4SHisping Lin } 118516539616SHisping Lin 118616539616SHisping Lin uint32_t notify_optee_rpmb_ta(void) 118716539616SHisping Lin { 118816539616SHisping Lin TEEC_Result TeecResult; 118916539616SHisping Lin TEEC_Context TeecContext; 119016539616SHisping Lin TEEC_Session TeecSession; 119116539616SHisping Lin uint32_t ErrorOrigin; 119216539616SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 119316539616SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 119416539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 119516539616SHisping Lin TEEC_Operation TeecOperation = {0}; 119616539616SHisping Lin 1197f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1198f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1199f4e1db95SHisping Lin return TeecResult; 120016539616SHisping Lin 120116539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1202f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1203f4e1db95SHisping Lin return TeecResult; 120416539616SHisping Lin 120516539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 120616539616SHisping Lin &TeecSession, 120716539616SHisping Lin TeecUuid, 120816539616SHisping Lin TEEC_LOGIN_PUBLIC, 120916539616SHisping Lin NULL, 121016539616SHisping Lin NULL, 121116539616SHisping Lin &ErrorOrigin); 1212f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1213f4e1db95SHisping Lin return TeecResult; 121416539616SHisping Lin 121516539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 121616539616SHisping Lin TEEC_NONE, 121716539616SHisping Lin TEEC_NONE, 121816539616SHisping Lin TEEC_NONE); 121916539616SHisping Lin 122016539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 122116539616SHisping Lin 2, 122216539616SHisping Lin &TeecOperation, 122316539616SHisping Lin &ErrorOrigin); 1224f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1225f4e1db95SHisping Lin goto exit; 1226f4e1db95SHisping Lin exit: 122716539616SHisping Lin TEEC_CloseSession(&TeecSession); 122816539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 122916539616SHisping Lin 123016539616SHisping Lin return TeecResult; 123116539616SHisping Lin } 123216539616SHisping Lin 123316539616SHisping Lin uint32_t notify_optee_efuse_ta(void) 123416539616SHisping Lin { 123516539616SHisping Lin TEEC_Result TeecResult; 123616539616SHisping Lin TEEC_Context TeecContext; 123716539616SHisping Lin TEEC_Session TeecSession; 123816539616SHisping Lin uint32_t ErrorOrigin; 123916539616SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 124016539616SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 124116539616SHisping Lin 124216539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 124316539616SHisping Lin TEEC_Operation TeecOperation = {0}; 124416539616SHisping Lin 1245f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1246f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1247f4e1db95SHisping Lin return TeecResult; 124816539616SHisping Lin 124916539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1250f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1251f4e1db95SHisping Lin return TeecResult; 125216539616SHisping Lin 125316539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 125416539616SHisping Lin &TeecSession, 125516539616SHisping Lin TeecUuid, 125616539616SHisping Lin TEEC_LOGIN_PUBLIC, 125716539616SHisping Lin NULL, 125816539616SHisping Lin NULL, 125916539616SHisping Lin &ErrorOrigin); 1260f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1261f4e1db95SHisping Lin return TeecResult; 126216539616SHisping Lin 126316539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 126416539616SHisping Lin TEEC_NONE, 126516539616SHisping Lin TEEC_NONE, 126616539616SHisping Lin TEEC_NONE); 126716539616SHisping Lin 126816539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 126916539616SHisping Lin 2, 127016539616SHisping Lin &TeecOperation, 127116539616SHisping Lin &ErrorOrigin); 1272f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1273f4e1db95SHisping Lin goto exit; 1274f4e1db95SHisping Lin exit: 127516539616SHisping Lin TEEC_CloseSession(&TeecSession); 127616539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 127716539616SHisping Lin 127816539616SHisping Lin return TeecResult; 127916539616SHisping Lin } 128016539616SHisping Lin 128116539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 128216539616SHisping Lin { 128316539616SHisping Lin TEEC_Result res; 128416539616SHisping Lin res = notify_optee_rpmb_ta(); 128516539616SHisping Lin res |= notify_optee_efuse_ta(); 128616539616SHisping Lin return res; 128716539616SHisping Lin } 12882cd27853SHisping Lin 12892cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 12902cd27853SHisping Lin { 12912cd27853SHisping Lin TEEC_Result TeecResult; 12922cd27853SHisping Lin TEEC_Context TeecContext; 12932cd27853SHisping Lin TEEC_Session TeecSession; 12942cd27853SHisping Lin uint32_t ErrorOrigin; 12952cd27853SHisping Lin 12962cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 12972cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 12982cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 12992cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 13002cd27853SHisping Lin 1301f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1302f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1303f4e1db95SHisping Lin return TeecResult; 13042cd27853SHisping Lin 13052cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1306f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1307f4e1db95SHisping Lin return TeecResult; 13082cd27853SHisping Lin 13092cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13102cd27853SHisping Lin &TeecSession, 13112cd27853SHisping Lin TeecUuid, 13122cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 13132cd27853SHisping Lin NULL, 13142cd27853SHisping Lin NULL, 13152cd27853SHisping Lin &ErrorOrigin); 1316f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1317f4e1db95SHisping Lin return TeecResult; 13182cd27853SHisping Lin 13192cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13202cd27853SHisping Lin 13212cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 13222cd27853SHisping Lin SharedMem0.flags = 0; 13232cd27853SHisping Lin 13242cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1325f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1326f4e1db95SHisping Lin goto exit; 13272cd27853SHisping Lin 13282cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13292cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 13302cd27853SHisping Lin 13312cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 13322cd27853SHisping Lin TEEC_NONE, 13332cd27853SHisping Lin TEEC_NONE, 13342cd27853SHisping Lin TEEC_NONE); 13352cd27853SHisping Lin 13362cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 13372cd27853SHisping Lin 3, 13382cd27853SHisping Lin &TeecOperation, 13392cd27853SHisping Lin &ErrorOrigin); 13402cd27853SHisping Lin 13412cd27853SHisping Lin if (TeecResult == TEEC_SUCCESS) 13422cd27853SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 1343f4e1db95SHisping Lin exit: 13442cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 13452cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 13462cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 13472cd27853SHisping Lin 13482cd27853SHisping Lin return TeecResult; 13492cd27853SHisping Lin } 13502cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 13512cd27853SHisping Lin { 13522cd27853SHisping Lin TEEC_Result TeecResult; 13532cd27853SHisping Lin TEEC_Context TeecContext; 13542cd27853SHisping Lin TEEC_Session TeecSession; 13552cd27853SHisping Lin uint32_t ErrorOrigin; 13562cd27853SHisping Lin 13572cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 13582cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 13592cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13602cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 13612cd27853SHisping Lin 1362f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1363f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1364f4e1db95SHisping Lin return TeecResult; 13652cd27853SHisping Lin 13662cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1367f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1368f4e1db95SHisping Lin return TeecResult; 13692cd27853SHisping Lin 13702cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13712cd27853SHisping Lin &TeecSession, 13722cd27853SHisping Lin TeecUuid, 13732cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 13742cd27853SHisping Lin NULL, 13752cd27853SHisping Lin NULL, 13762cd27853SHisping Lin &ErrorOrigin); 1377f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1378f4e1db95SHisping Lin return TeecResult; 13792cd27853SHisping Lin 13802cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13812cd27853SHisping Lin 13822cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 13832cd27853SHisping Lin SharedMem0.flags = 0; 13842cd27853SHisping Lin 13852cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1386f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1387f4e1db95SHisping Lin goto exit; 13882cd27853SHisping Lin 13892cd27853SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 13902cd27853SHisping Lin 13912cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13922cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 13932cd27853SHisping Lin 13942cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 13952cd27853SHisping Lin TEEC_NONE, 13962cd27853SHisping Lin TEEC_NONE, 13972cd27853SHisping Lin TEEC_NONE); 13982cd27853SHisping Lin 13992cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 14002cd27853SHisping Lin 4, 14012cd27853SHisping Lin &TeecOperation, 14022cd27853SHisping Lin &ErrorOrigin); 1403f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1404f4e1db95SHisping Lin goto exit; 1405f4e1db95SHisping Lin exit: 14062cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 14072cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 14082cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 14092cd27853SHisping Lin 14102cd27853SHisping Lin return TeecResult; 14112cd27853SHisping Lin } 1412095e2a82SHisping Lin 1413468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 1414468df3b2SHisping Lin { 1415468df3b2SHisping Lin TEEC_Result TeecResult; 1416468df3b2SHisping Lin TEEC_Context TeecContext; 1417468df3b2SHisping Lin TEEC_Session TeecSession; 1418468df3b2SHisping Lin uint32_t ErrorOrigin; 1419468df3b2SHisping Lin uint32_t bootflag; 1420468df3b2SHisping Lin 1421468df3b2SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 1422468df3b2SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1423468df3b2SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1424468df3b2SHisping Lin TEEC_Operation TeecOperation = {0}; 1425468df3b2SHisping Lin 1426f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1427f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1428f4e1db95SHisping Lin return TeecResult; 1429468df3b2SHisping Lin 1430468df3b2SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1431f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1432f4e1db95SHisping Lin return TeecResult; 1433468df3b2SHisping Lin 1434468df3b2SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1435468df3b2SHisping Lin &TeecSession, 1436468df3b2SHisping Lin TeecUuid, 1437468df3b2SHisping Lin TEEC_LOGIN_PUBLIC, 1438468df3b2SHisping Lin NULL, 1439468df3b2SHisping Lin NULL, 1440468df3b2SHisping Lin &ErrorOrigin); 1441f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1442f4e1db95SHisping Lin return TeecResult; 1443468df3b2SHisping Lin 1444468df3b2SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1445468df3b2SHisping Lin 1446468df3b2SHisping Lin SharedMem0.size = 1 * sizeof(uint32_t); 1447468df3b2SHisping Lin SharedMem0.flags = 0; 1448468df3b2SHisping Lin 1449468df3b2SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1450f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1451f4e1db95SHisping Lin goto exit; 1452468df3b2SHisping Lin 1453468df3b2SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1454468df3b2SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1455468df3b2SHisping Lin 1456468df3b2SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 1457468df3b2SHisping Lin TEEC_NONE, 1458468df3b2SHisping Lin TEEC_NONE, 1459468df3b2SHisping Lin TEEC_NONE); 1460468df3b2SHisping Lin 1461468df3b2SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1462468df3b2SHisping Lin 5, 1463468df3b2SHisping Lin &TeecOperation, 1464468df3b2SHisping Lin &ErrorOrigin); 1465468df3b2SHisping Lin 1466468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 1467468df3b2SHisping Lin memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size); 1468*0202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 1469*0202ee8aSHisping Lin if (bootflag == 0x00000001) 1470*0202ee8aSHisping Lin *flag = 1; 1471*0202ee8aSHisping Lin #else 1472468df3b2SHisping Lin if (bootflag == 0x000000FF) 1473468df3b2SHisping Lin *flag = 1; 1474*0202ee8aSHisping Lin #endif 1475468df3b2SHisping Lin } 1476f4e1db95SHisping Lin exit: 1477468df3b2SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1478468df3b2SHisping Lin TEEC_CloseSession(&TeecSession); 1479468df3b2SHisping Lin TEEC_FinalizeContext(&TeecContext); 1480468df3b2SHisping Lin 1481468df3b2SHisping Lin return TeecResult; 1482468df3b2SHisping Lin } 1483468df3b2SHisping Lin 1484095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 1485095e2a82SHisping Lin { 1486095e2a82SHisping Lin TEEC_Result TeecResult; 1487095e2a82SHisping Lin TEEC_Context TeecContext; 1488095e2a82SHisping Lin TEEC_Session TeecSession; 1489095e2a82SHisping Lin uint32_t ErrorOrigin; 149099830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 149199830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1492095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1493095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 14943251364cSHisping Lin struct blk_desc *dev_desc; 14953251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 14966651d4c0SJason Zhu if (!dev_desc) { 14976651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 14986651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 14996651d4c0SJason Zhu } 1500095e2a82SHisping Lin 1501f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1502f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1503f4e1db95SHisping Lin return TeecResult; 1504095e2a82SHisping Lin 1505095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1506f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1507f4e1db95SHisping Lin return TeecResult; 1508095e2a82SHisping Lin 15093251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15103251364cSHisping Lin TEEC_NONE, 15113251364cSHisping Lin TEEC_NONE, 15123251364cSHisping Lin TEEC_NONE); 15133251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 15143251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 15153251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15163251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15173251364cSHisping Lin #endif 15183251364cSHisping Lin 1519095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1520095e2a82SHisping Lin &TeecSession, 1521095e2a82SHisping Lin TeecUuid, 1522095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1523095e2a82SHisping Lin NULL, 15243251364cSHisping Lin &TeecOperation, 1525095e2a82SHisping Lin &ErrorOrigin); 1526f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1527f4e1db95SHisping Lin return TeecResult; 1528095e2a82SHisping Lin 1529095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1530095e2a82SHisping Lin 1531095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1532095e2a82SHisping Lin SharedMem0.flags = 0; 1533095e2a82SHisping Lin 1534095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1535f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1536f4e1db95SHisping Lin goto exit; 1537095e2a82SHisping Lin 1538095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1539095e2a82SHisping Lin 1540095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1541095e2a82SHisping Lin 1542095e2a82SHisping Lin SharedMem1.size = 1; 1543095e2a82SHisping Lin SharedMem1.flags = 0; 1544095e2a82SHisping Lin 1545095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1546f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1547f4e1db95SHisping Lin goto exit; 1548095e2a82SHisping Lin 1549095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1550095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1551095e2a82SHisping Lin 1552095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1553095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1554095e2a82SHisping Lin 1555095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1556095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1557095e2a82SHisping Lin TEEC_NONE, 1558095e2a82SHisping Lin TEEC_NONE); 1559095e2a82SHisping Lin 1560095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 156199830019SHisping Lin 0, 1562095e2a82SHisping Lin &TeecOperation, 1563095e2a82SHisping Lin &ErrorOrigin); 1564095e2a82SHisping Lin if (TeecResult == TEEC_SUCCESS) 1565095e2a82SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 1566f4e1db95SHisping Lin exit: 1567095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1568095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1569095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1570095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1571095e2a82SHisping Lin 1572095e2a82SHisping Lin return TeecResult; 1573095e2a82SHisping Lin } 1574095e2a82SHisping Lin 1575095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 1576095e2a82SHisping Lin { 1577095e2a82SHisping Lin TEEC_Result TeecResult; 1578095e2a82SHisping Lin TEEC_Context TeecContext; 1579095e2a82SHisping Lin TEEC_Session TeecSession; 1580095e2a82SHisping Lin uint32_t ErrorOrigin; 158199830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 158299830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1583095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1584095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 15853251364cSHisping Lin struct blk_desc *dev_desc; 15863251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15876651d4c0SJason Zhu if (!dev_desc) { 15886651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15896651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15906651d4c0SJason Zhu } 1591095e2a82SHisping Lin 1592f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1593f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1594f4e1db95SHisping Lin return TeecResult; 1595095e2a82SHisping Lin 1596095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1597f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1598f4e1db95SHisping Lin return TeecResult; 1599095e2a82SHisping Lin 16003251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16013251364cSHisping Lin TEEC_NONE, 16023251364cSHisping Lin TEEC_NONE, 16033251364cSHisping Lin TEEC_NONE); 16043251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16053251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16063251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16073251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16083251364cSHisping Lin #endif 16093251364cSHisping Lin 1610095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1611095e2a82SHisping Lin &TeecSession, 1612095e2a82SHisping Lin TeecUuid, 1613095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1614095e2a82SHisping Lin NULL, 16153251364cSHisping Lin &TeecOperation, 1616095e2a82SHisping Lin &ErrorOrigin); 1617f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1618f4e1db95SHisping Lin return TeecResult; 1619095e2a82SHisping Lin 1620095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1621095e2a82SHisping Lin 1622095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1623095e2a82SHisping Lin SharedMem0.flags = 0; 1624095e2a82SHisping Lin 1625095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1626f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1627f4e1db95SHisping Lin goto exit; 1628095e2a82SHisping Lin 1629095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1630095e2a82SHisping Lin 1631095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1632095e2a82SHisping Lin 1633095e2a82SHisping Lin SharedMem1.size = 1; 1634095e2a82SHisping Lin SharedMem1.flags = 0; 1635095e2a82SHisping Lin 1636095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1637f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1638f4e1db95SHisping Lin goto exit; 1639095e2a82SHisping Lin 1640095e2a82SHisping Lin memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size); 1641095e2a82SHisping Lin 1642095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1643095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1644095e2a82SHisping Lin 1645095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1646095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1647095e2a82SHisping Lin 1648095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1649095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1650095e2a82SHisping Lin TEEC_NONE, 1651095e2a82SHisping Lin TEEC_NONE); 1652095e2a82SHisping Lin 1653095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 165499830019SHisping Lin 1, 1655095e2a82SHisping Lin &TeecOperation, 1656095e2a82SHisping Lin &ErrorOrigin); 1657f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1658f4e1db95SHisping Lin goto exit; 1659f4e1db95SHisping Lin exit: 1660095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1661095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1662095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1663095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1664095e2a82SHisping Lin 1665095e2a82SHisping Lin return TeecResult; 1666095e2a82SHisping Lin } 16674aa61755SAndy Ye 16684aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 16694aa61755SAndy Ye { 16704aa61755SAndy Ye TEEC_Result TeecResult; 16714aa61755SAndy Ye TEEC_Context TeecContext; 16724aa61755SAndy Ye TEEC_Session TeecSession; 16734aa61755SAndy Ye uint32_t ErrorOrigin; 16744aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16754aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16764aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 16774aa61755SAndy Ye } 16784aa61755SAndy Ye }; 16794aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16804aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16813251364cSHisping Lin struct blk_desc *dev_desc; 16823251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16836651d4c0SJason Zhu if (!dev_desc) { 16846651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16856651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16866651d4c0SJason Zhu } 16874aa61755SAndy Ye 1688f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1689f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1690f4e1db95SHisping Lin return TeecResult; 16914aa61755SAndy Ye 16924aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1693f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1694f4e1db95SHisping Lin return TeecResult; 16954aa61755SAndy Ye 16963251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16973251364cSHisping Lin TEEC_NONE, 16983251364cSHisping Lin TEEC_NONE, 16993251364cSHisping Lin TEEC_NONE); 17003251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 17013251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 17023251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17033251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17043251364cSHisping Lin #endif 17053251364cSHisping Lin 17064aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17074aa61755SAndy Ye &TeecSession, 17084aa61755SAndy Ye TeecUuid, 17094aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17104aa61755SAndy Ye NULL, 17113251364cSHisping Lin &TeecOperation, 17124aa61755SAndy Ye &ErrorOrigin); 1713f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1714f4e1db95SHisping Lin return TeecResult; 17154aa61755SAndy Ye 17164aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17174aa61755SAndy Ye 17184aa61755SAndy Ye SharedMem0.size = *dh_size; 17194aa61755SAndy Ye SharedMem0.flags = 0; 17204aa61755SAndy Ye 17214aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1722f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1723f4e1db95SHisping Lin goto exit; 17244aa61755SAndy Ye 17254aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17264aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17274aa61755SAndy Ye 17284aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17294aa61755SAndy Ye TEEC_NONE, 17304aa61755SAndy Ye TEEC_NONE, 17314aa61755SAndy Ye TEEC_NONE); 17324aa61755SAndy Ye 17334aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17344aa61755SAndy Ye 143, 17354aa61755SAndy Ye &TeecOperation, 17364aa61755SAndy Ye &ErrorOrigin); 1737f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1738f4e1db95SHisping Lin goto exit; 17394aa61755SAndy Ye 17404aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 17414aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1742f4e1db95SHisping Lin exit: 17434aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17444aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1745f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 17464aa61755SAndy Ye 17474aa61755SAndy Ye return TeecResult; 17484aa61755SAndy Ye } 17494aa61755SAndy Ye 17504aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 17514aa61755SAndy Ye { 17524aa61755SAndy Ye TEEC_Result TeecResult; 17534aa61755SAndy Ye TEEC_Context TeecContext; 17544aa61755SAndy Ye TEEC_Session TeecSession; 17554aa61755SAndy Ye uint32_t ErrorOrigin; 17564aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17574aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17584aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17594aa61755SAndy Ye } 17604aa61755SAndy Ye }; 17614aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17624aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17633251364cSHisping Lin struct blk_desc *dev_desc; 17643251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17656651d4c0SJason Zhu if (!dev_desc) { 17666651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17676651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17686651d4c0SJason Zhu } 17694aa61755SAndy Ye 1770f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1771f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1772f4e1db95SHisping Lin return TeecResult; 17734aa61755SAndy Ye 17744aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1775f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1776f4e1db95SHisping Lin return TeecResult; 17774aa61755SAndy Ye 17783251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17793251364cSHisping Lin TEEC_NONE, 17803251364cSHisping Lin TEEC_NONE, 17813251364cSHisping Lin TEEC_NONE); 17823251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 17833251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 17843251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17853251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17863251364cSHisping Lin #endif 17873251364cSHisping Lin 17884aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17894aa61755SAndy Ye &TeecSession, 17904aa61755SAndy Ye TeecUuid, 17914aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17924aa61755SAndy Ye NULL, 17933251364cSHisping Lin &TeecOperation, 17944aa61755SAndy Ye &ErrorOrigin); 1795f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1796f4e1db95SHisping Lin return TeecResult; 17974aa61755SAndy Ye 17984aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17994aa61755SAndy Ye 18004aa61755SAndy Ye SharedMem0.size = *uuid_size; 18014aa61755SAndy Ye SharedMem0.flags = 0; 18024aa61755SAndy Ye 18034aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1804f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1805f4e1db95SHisping Lin goto exit; 18064aa61755SAndy Ye 18074aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18084aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18094aa61755SAndy Ye 18104aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 18114aa61755SAndy Ye TEEC_NONE, 18124aa61755SAndy Ye TEEC_NONE, 18134aa61755SAndy Ye TEEC_NONE); 18144aa61755SAndy Ye 18154aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 18164aa61755SAndy Ye 144, 18174aa61755SAndy Ye &TeecOperation, 18184aa61755SAndy Ye &ErrorOrigin); 1819f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1820f4e1db95SHisping Lin goto exit; 18214aa61755SAndy Ye 18224aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 18234aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1824f4e1db95SHisping Lin exit: 18254aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18264aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1827f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 18284aa61755SAndy Ye 18294aa61755SAndy Ye return TeecResult; 18304aa61755SAndy Ye } 18314aa61755SAndy Ye 18324aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 18334aa61755SAndy Ye uint32_t *operation_size, 18344aa61755SAndy Ye uint8_t *out, 18354aa61755SAndy Ye uint32_t *out_len) 18364aa61755SAndy Ye { 18374aa61755SAndy Ye TEEC_Result TeecResult; 18384aa61755SAndy Ye TEEC_Context TeecContext; 18394aa61755SAndy Ye TEEC_Session TeecSession; 18404aa61755SAndy Ye uint32_t ErrorOrigin; 18414aa61755SAndy Ye 18424aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18434aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18444aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18454aa61755SAndy Ye } 18464aa61755SAndy Ye }; 18474aa61755SAndy Ye 18484aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18494aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18503251364cSHisping Lin struct blk_desc *dev_desc; 18513251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18526651d4c0SJason Zhu if (!dev_desc) { 18536651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18546651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18556651d4c0SJason Zhu } 18564aa61755SAndy Ye 1857f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1858f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1859f4e1db95SHisping Lin return TeecResult; 18604aa61755SAndy Ye 18614aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1862f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1863f4e1db95SHisping Lin return TeecResult; 18644aa61755SAndy Ye 18653251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 18663251364cSHisping Lin TEEC_NONE, 18673251364cSHisping Lin TEEC_NONE, 18683251364cSHisping Lin TEEC_NONE); 18693251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 18703251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 18713251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 18723251364cSHisping Lin TeecOperation.params[0].value.a = 0; 18733251364cSHisping Lin #endif 18743251364cSHisping Lin 18754aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 18764aa61755SAndy Ye &TeecSession, 18774aa61755SAndy Ye TeecUuid, 18784aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 18794aa61755SAndy Ye NULL, 18803251364cSHisping Lin &TeecOperation, 18814aa61755SAndy Ye &ErrorOrigin); 1882f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1883f4e1db95SHisping Lin return TeecResult; 18844aa61755SAndy Ye 18854aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18864aa61755SAndy Ye 18874aa61755SAndy Ye SharedMem0.size = *operation_size; 18884aa61755SAndy Ye SharedMem0.flags = 0; 18894aa61755SAndy Ye 18904aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1891f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1892f4e1db95SHisping Lin goto exit; 18934aa61755SAndy Ye 18944aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 18954aa61755SAndy Ye 18964aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18974aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18984aa61755SAndy Ye 18994aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 19004aa61755SAndy Ye 19014aa61755SAndy Ye SharedMem1.size = *out_len; 19024aa61755SAndy Ye SharedMem1.flags = 0; 19034aa61755SAndy Ye 19044aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1905f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1906f4e1db95SHisping Lin goto exit; 19074aa61755SAndy Ye 19084aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 19094aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 19104aa61755SAndy Ye 19114aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19124aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 19134aa61755SAndy Ye TEEC_NONE, 19144aa61755SAndy Ye TEEC_NONE); 19154aa61755SAndy Ye 19164aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19174aa61755SAndy Ye 145, 19184aa61755SAndy Ye &TeecOperation, 19194aa61755SAndy Ye &ErrorOrigin); 1920f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1921f4e1db95SHisping Lin goto exit; 19224aa61755SAndy Ye 19234aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 19244aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1925f4e1db95SHisping Lin exit: 19264aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19274aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1928f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1929f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 19304aa61755SAndy Ye 19314aa61755SAndy Ye return TeecResult; 19324aa61755SAndy Ye } 19334aa61755SAndy Ye 19344aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 19354aa61755SAndy Ye { 19364aa61755SAndy Ye TEEC_Result TeecResult; 19374aa61755SAndy Ye TEEC_Context TeecContext; 19384aa61755SAndy Ye TEEC_Session TeecSession; 19394aa61755SAndy Ye uint32_t ErrorOrigin; 19404aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 19414aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 19424aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 19434aa61755SAndy Ye } 19444aa61755SAndy Ye }; 19454aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 19464aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 19473251364cSHisping Lin struct blk_desc *dev_desc; 19483251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 19496651d4c0SJason Zhu if (!dev_desc) { 19506651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 19516651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 19526651d4c0SJason Zhu } 1953f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1954f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1955f4e1db95SHisping Lin return TeecResult; 19564aa61755SAndy Ye 19574aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1958f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1959f4e1db95SHisping Lin return TeecResult; 19604aa61755SAndy Ye 19613251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19623251364cSHisping Lin TEEC_NONE, 19633251364cSHisping Lin TEEC_NONE, 19643251364cSHisping Lin TEEC_NONE); 19653251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 19663251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 19673251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19683251364cSHisping Lin TeecOperation.params[0].value.a = 0; 19693251364cSHisping Lin #endif 19703251364cSHisping Lin 19714aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 19724aa61755SAndy Ye &TeecSession, 19734aa61755SAndy Ye TeecUuid, 19744aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 19754aa61755SAndy Ye NULL, 19763251364cSHisping Lin &TeecOperation, 19774aa61755SAndy Ye &ErrorOrigin); 1978f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1979f4e1db95SHisping Lin return TeecResult; 19804aa61755SAndy Ye 19814aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 19824aa61755SAndy Ye 19834aa61755SAndy Ye SharedMem0.size = *ca_response_size; 19844aa61755SAndy Ye SharedMem0.flags = 0; 19854aa61755SAndy Ye 19864aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1987f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1988f4e1db95SHisping Lin goto exit; 19894aa61755SAndy Ye 19904aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 19914aa61755SAndy Ye 19924aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 19934aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 19944aa61755SAndy Ye 19954aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19964aa61755SAndy Ye TEEC_NONE, 19974aa61755SAndy Ye TEEC_NONE, 19984aa61755SAndy Ye TEEC_NONE); 19994aa61755SAndy Ye 20004aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 20014aa61755SAndy Ye 146, 20024aa61755SAndy Ye &TeecOperation, 20034aa61755SAndy Ye &ErrorOrigin); 2004f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2005f4e1db95SHisping Lin goto exit; 2006f4e1db95SHisping Lin exit: 20074aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 20084aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 2009f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 20104aa61755SAndy Ye 20114aa61755SAndy Ye return TeecResult; 20124aa61755SAndy Ye } 2013