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 18*f4e1db95SHisping 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__); 32*f4e1db95SHisping Lin return -TEEC_ERROR_GENERIC; 336651d4c0SJason Zhu } 34ae8ec5e1SHisping Lin 35*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 36*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 37*f4e1db95SHisping Lin return TeecResult; 38ae8ec5e1SHisping Lin 39ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 40*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 41*f4e1db95SHisping 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); 60*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 61*f4e1db95SHisping 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); 69*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 70*f4e1db95SHisping 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); 80*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 81*f4e1db95SHisping 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); 101*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 102*f4e1db95SHisping Lin goto exit; 103*f4e1db95SHisping Lin exit: 104ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 105ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 106ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 10746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 108*f4e1db95SHisping 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); 156*f4e1db95SHisping Lin 157*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 158*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 159*f4e1db95SHisping Lin return TeecResult; 160ae8ec5e1SHisping Lin 161ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 162*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 163*f4e1db95SHisping 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); 182*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 183*f4e1db95SHisping 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); 191*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 192*f4e1db95SHisping 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); 202*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 203*f4e1db95SHisping 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); 222*f4e1db95SHisping 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); 250*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 251*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 252*f4e1db95SHisping Lin return TeecResult; 253ae8ec5e1SHisping Lin 254ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 255*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 256*f4e1db95SHisping 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); 275*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 276*f4e1db95SHisping 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); 284*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 285*f4e1db95SHisping 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); 295*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 296*f4e1db95SHisping 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); 316*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 317*f4e1db95SHisping Lin goto exit; 318*f4e1db95SHisping 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 344*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 345*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 346*f4e1db95SHisping Lin return TeecResult; 347ae8ec5e1SHisping Lin 348ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 349*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 350*f4e1db95SHisping 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); 369*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 370*f4e1db95SHisping 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); 378*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 379*f4e1db95SHisping 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); 389*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 390*f4e1db95SHisping 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); 410*f4e1db95SHisping 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 436*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 437*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 438*f4e1db95SHisping Lin return TeecResult; 439ae8ec5e1SHisping Lin 440ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 441*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 442*f4e1db95SHisping 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); 461*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 462*f4e1db95SHisping 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); 470*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 471*f4e1db95SHisping 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); 481*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 482*f4e1db95SHisping 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); 502*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 503*f4e1db95SHisping Lin goto exit; 504*f4e1db95SHisping 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 532*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 533*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 534*f4e1db95SHisping Lin return TeecResult; 535*f4e1db95SHisping Lin 536564654ebSJason Zhu TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 537*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 538*f4e1db95SHisping Lin return TeecResult; 539*f4e1db95SHisping 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); 558*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 559*f4e1db95SHisping 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); 566*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 567*f4e1db95SHisping 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); 574*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 575*f4e1db95SHisping 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); 591*f4e1db95SHisping 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 619*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 620*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 621*f4e1db95SHisping Lin return TeecResult; 622*f4e1db95SHisping Lin 623564654ebSJason Zhu TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 624*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 625*f4e1db95SHisping Lin return TeecResult; 626*f4e1db95SHisping 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); 645*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 646*f4e1db95SHisping 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); 653*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 654*f4e1db95SHisping 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); 661*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 662*f4e1db95SHisping 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); 677*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 678*f4e1db95SHisping Lin goto exit; 679*f4e1db95SHisping 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 705*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 706*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 707*f4e1db95SHisping Lin return TeecResult; 708ae8ec5e1SHisping Lin 709ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 710*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 711*f4e1db95SHisping 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); 730*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 731*f4e1db95SHisping 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); 739*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 740*f4e1db95SHisping 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); 750*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 751*f4e1db95SHisping 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); 771*f4e1db95SHisping 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 797*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 798*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 799*f4e1db95SHisping Lin return TeecResult; 800ae8ec5e1SHisping Lin 801ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 802*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 803*f4e1db95SHisping 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); 822*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 823*f4e1db95SHisping 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); 831*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 832*f4e1db95SHisping 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); 842*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 843*f4e1db95SHisping 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); 863*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 864*f4e1db95SHisping Lin goto exit; 865*f4e1db95SHisping 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 891*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 892*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 893*f4e1db95SHisping Lin return TeecResult; 894ae8ec5e1SHisping Lin 895ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 896*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 897*f4e1db95SHisping 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); 916*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 917*f4e1db95SHisping 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); 925*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 926*f4e1db95SHisping 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); 936*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 937*f4e1db95SHisping 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); 957*f4e1db95SHisping 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 984*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 985*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 986*f4e1db95SHisping Lin return TeecResult; 987ae8ec5e1SHisping Lin 988ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 989*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 990*f4e1db95SHisping 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); 1009*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1010*f4e1db95SHisping 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); 1018*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1019*f4e1db95SHisping 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); 1029*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1030*f4e1db95SHisping 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); 1050*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1051*f4e1db95SHisping Lin goto exit; 1052*f4e1db95SHisping Lin exit: 1053ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1054ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1055ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 105646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 1057ae8ec5e1SHisping Lin debug("testmm end\n"); 1058ae8ec5e1SHisping Lin 1059ae8ec5e1SHisping Lin return TeecResult; 1060ae8ec5e1SHisping Lin } 1061ae8ec5e1SHisping Lin 10626ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 10636ef445a4SHisping Lin { 10646ef445a4SHisping Lin TEEC_Result TeecResult; 10656ef445a4SHisping Lin TEEC_Context TeecContext; 10666ef445a4SHisping Lin TEEC_Session TeecSession; 10676ef445a4SHisping Lin uint32_t ErrorOrigin; 10686ef445a4SHisping Lin 10696ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 10706ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 10716ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 10726ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 10736ef445a4SHisping Lin 1074*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1075*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1076*f4e1db95SHisping Lin return TeecResult; 10776ef445a4SHisping Lin 10786ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1079*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1080*f4e1db95SHisping Lin return TeecResult; 10816ef445a4SHisping Lin 10826ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 10836ef445a4SHisping Lin &TeecSession, 10846ef445a4SHisping Lin TeecUuid, 10856ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 10866ef445a4SHisping Lin NULL, 10876ef445a4SHisping Lin NULL, 10886ef445a4SHisping Lin &ErrorOrigin); 1089*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1090*f4e1db95SHisping Lin return TeecResult; 10916ef445a4SHisping Lin 10926ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 10936ef445a4SHisping Lin 10946ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 10956ef445a4SHisping Lin SharedMem0.flags = 0; 10966ef445a4SHisping Lin 10976ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1098*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1099*f4e1db95SHisping Lin goto exit; 11006ef445a4SHisping Lin 11016ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11026ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 11036ef445a4SHisping Lin 11046ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 11056ef445a4SHisping Lin TEEC_NONE, 11066ef445a4SHisping Lin TEEC_NONE, 11076ef445a4SHisping Lin TEEC_NONE); 11086ef445a4SHisping Lin 11096ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 11106ef445a4SHisping Lin 0, 11116ef445a4SHisping Lin &TeecOperation, 11126ef445a4SHisping Lin &ErrorOrigin); 11136ef445a4SHisping Lin 11146ef445a4SHisping Lin if (TeecResult == TEEC_SUCCESS) 11156ef445a4SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 1116*f4e1db95SHisping Lin exit: 11176ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 11186ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 11196ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 11206ef445a4SHisping Lin 11216ef445a4SHisping Lin return TeecResult; 11226ef445a4SHisping Lin } 11236ef445a4SHisping Lin 11246ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 11256ef445a4SHisping Lin { 11266ef445a4SHisping Lin TEEC_Result TeecResult; 11276ef445a4SHisping Lin TEEC_Context TeecContext; 11286ef445a4SHisping Lin TEEC_Session TeecSession; 11296ef445a4SHisping Lin uint32_t ErrorOrigin; 11306ef445a4SHisping Lin 11316ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 11326ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 11336ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 11346ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 11356ef445a4SHisping Lin 1136*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1137*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1138*f4e1db95SHisping Lin return TeecResult; 11396ef445a4SHisping Lin 11406ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1141*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1142*f4e1db95SHisping Lin return TeecResult; 11436ef445a4SHisping Lin 11446ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 11456ef445a4SHisping Lin &TeecSession, 11466ef445a4SHisping Lin TeecUuid, 11476ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 11486ef445a4SHisping Lin NULL, 11496ef445a4SHisping Lin NULL, 11506ef445a4SHisping Lin &ErrorOrigin); 1151*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1152*f4e1db95SHisping Lin return TeecResult; 11536ef445a4SHisping Lin 11546ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 11556ef445a4SHisping Lin 11566ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 11576ef445a4SHisping Lin SharedMem0.flags = 0; 11586ef445a4SHisping Lin 11596ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1160*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1161*f4e1db95SHisping Lin goto exit; 11626ef445a4SHisping Lin 11636ef445a4SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 11646ef445a4SHisping Lin 11656ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11666ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 11676ef445a4SHisping Lin 11686ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 11696ef445a4SHisping Lin TEEC_NONE, 11706ef445a4SHisping Lin TEEC_NONE, 11716ef445a4SHisping Lin TEEC_NONE); 11726ef445a4SHisping Lin 11736ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 11746ef445a4SHisping Lin 1, 11756ef445a4SHisping Lin &TeecOperation, 11766ef445a4SHisping Lin &ErrorOrigin); 1177*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1178*f4e1db95SHisping Lin goto exit; 1179*f4e1db95SHisping Lin exit: 11806ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 11816ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 11826ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 11836ef445a4SHisping Lin 11846ef445a4SHisping Lin return TeecResult; 11856ef445a4SHisping Lin } 118616539616SHisping Lin 118716539616SHisping Lin uint32_t notify_optee_rpmb_ta(void) 118816539616SHisping Lin { 118916539616SHisping Lin TEEC_Result TeecResult; 119016539616SHisping Lin TEEC_Context TeecContext; 119116539616SHisping Lin TEEC_Session TeecSession; 119216539616SHisping Lin uint32_t ErrorOrigin; 119316539616SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 119416539616SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 119516539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 119616539616SHisping Lin TEEC_Operation TeecOperation = {0}; 119716539616SHisping Lin 1198*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1199*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1200*f4e1db95SHisping Lin return TeecResult; 120116539616SHisping Lin 120216539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1203*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1204*f4e1db95SHisping Lin return TeecResult; 120516539616SHisping Lin 120616539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 120716539616SHisping Lin &TeecSession, 120816539616SHisping Lin TeecUuid, 120916539616SHisping Lin TEEC_LOGIN_PUBLIC, 121016539616SHisping Lin NULL, 121116539616SHisping Lin NULL, 121216539616SHisping Lin &ErrorOrigin); 1213*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1214*f4e1db95SHisping Lin return TeecResult; 121516539616SHisping Lin 121616539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 121716539616SHisping Lin TEEC_NONE, 121816539616SHisping Lin TEEC_NONE, 121916539616SHisping Lin TEEC_NONE); 122016539616SHisping Lin 122116539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 122216539616SHisping Lin 2, 122316539616SHisping Lin &TeecOperation, 122416539616SHisping Lin &ErrorOrigin); 1225*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1226*f4e1db95SHisping Lin goto exit; 1227*f4e1db95SHisping Lin exit: 122816539616SHisping Lin TEEC_CloseSession(&TeecSession); 122916539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 123016539616SHisping Lin 123116539616SHisping Lin return TeecResult; 123216539616SHisping Lin } 123316539616SHisping Lin 123416539616SHisping Lin uint32_t notify_optee_efuse_ta(void) 123516539616SHisping Lin { 123616539616SHisping Lin TEEC_Result TeecResult; 123716539616SHisping Lin TEEC_Context TeecContext; 123816539616SHisping Lin TEEC_Session TeecSession; 123916539616SHisping Lin uint32_t ErrorOrigin; 124016539616SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 124116539616SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 124216539616SHisping Lin 124316539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 124416539616SHisping Lin TEEC_Operation TeecOperation = {0}; 124516539616SHisping Lin 1246*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1247*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1248*f4e1db95SHisping Lin return TeecResult; 124916539616SHisping Lin 125016539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1251*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1252*f4e1db95SHisping Lin return TeecResult; 125316539616SHisping Lin 125416539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 125516539616SHisping Lin &TeecSession, 125616539616SHisping Lin TeecUuid, 125716539616SHisping Lin TEEC_LOGIN_PUBLIC, 125816539616SHisping Lin NULL, 125916539616SHisping Lin NULL, 126016539616SHisping Lin &ErrorOrigin); 1261*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1262*f4e1db95SHisping Lin return TeecResult; 126316539616SHisping Lin 126416539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 126516539616SHisping Lin TEEC_NONE, 126616539616SHisping Lin TEEC_NONE, 126716539616SHisping Lin TEEC_NONE); 126816539616SHisping Lin 126916539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 127016539616SHisping Lin 2, 127116539616SHisping Lin &TeecOperation, 127216539616SHisping Lin &ErrorOrigin); 1273*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1274*f4e1db95SHisping Lin goto exit; 1275*f4e1db95SHisping Lin exit: 127616539616SHisping Lin TEEC_CloseSession(&TeecSession); 127716539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 127816539616SHisping Lin 127916539616SHisping Lin return TeecResult; 128016539616SHisping Lin } 128116539616SHisping Lin 128216539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 128316539616SHisping Lin { 128416539616SHisping Lin TEEC_Result res; 128516539616SHisping Lin res = notify_optee_rpmb_ta(); 128616539616SHisping Lin res |= notify_optee_efuse_ta(); 128716539616SHisping Lin return res; 128816539616SHisping Lin } 12892cd27853SHisping Lin 12902cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 12912cd27853SHisping Lin { 12922cd27853SHisping Lin TEEC_Result TeecResult; 12932cd27853SHisping Lin TEEC_Context TeecContext; 12942cd27853SHisping Lin TEEC_Session TeecSession; 12952cd27853SHisping Lin uint32_t ErrorOrigin; 12962cd27853SHisping Lin 12972cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 12982cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 12992cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13002cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 13012cd27853SHisping Lin 1302*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1303*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1304*f4e1db95SHisping Lin return TeecResult; 13052cd27853SHisping Lin 13062cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1307*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1308*f4e1db95SHisping Lin return TeecResult; 13092cd27853SHisping Lin 13102cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13112cd27853SHisping Lin &TeecSession, 13122cd27853SHisping Lin TeecUuid, 13132cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 13142cd27853SHisping Lin NULL, 13152cd27853SHisping Lin NULL, 13162cd27853SHisping Lin &ErrorOrigin); 1317*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1318*f4e1db95SHisping Lin return TeecResult; 13192cd27853SHisping Lin 13202cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13212cd27853SHisping Lin 13222cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 13232cd27853SHisping Lin SharedMem0.flags = 0; 13242cd27853SHisping Lin 13252cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1326*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1327*f4e1db95SHisping Lin goto exit; 13282cd27853SHisping Lin 13292cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13302cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 13312cd27853SHisping Lin 13322cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 13332cd27853SHisping Lin TEEC_NONE, 13342cd27853SHisping Lin TEEC_NONE, 13352cd27853SHisping Lin TEEC_NONE); 13362cd27853SHisping Lin 13372cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 13382cd27853SHisping Lin 3, 13392cd27853SHisping Lin &TeecOperation, 13402cd27853SHisping Lin &ErrorOrigin); 13412cd27853SHisping Lin 13422cd27853SHisping Lin if (TeecResult == TEEC_SUCCESS) 13432cd27853SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 1344*f4e1db95SHisping Lin exit: 13452cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 13462cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 13472cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 13482cd27853SHisping Lin 13492cd27853SHisping Lin return TeecResult; 13502cd27853SHisping Lin } 13512cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 13522cd27853SHisping Lin { 13532cd27853SHisping Lin TEEC_Result TeecResult; 13542cd27853SHisping Lin TEEC_Context TeecContext; 13552cd27853SHisping Lin TEEC_Session TeecSession; 13562cd27853SHisping Lin uint32_t ErrorOrigin; 13572cd27853SHisping Lin 13582cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 13592cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 13602cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13612cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 13622cd27853SHisping Lin 1363*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1364*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1365*f4e1db95SHisping Lin return TeecResult; 13662cd27853SHisping Lin 13672cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1368*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1369*f4e1db95SHisping Lin return TeecResult; 13702cd27853SHisping Lin 13712cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13722cd27853SHisping Lin &TeecSession, 13732cd27853SHisping Lin TeecUuid, 13742cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 13752cd27853SHisping Lin NULL, 13762cd27853SHisping Lin NULL, 13772cd27853SHisping Lin &ErrorOrigin); 1378*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1379*f4e1db95SHisping Lin return TeecResult; 13802cd27853SHisping Lin 13812cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13822cd27853SHisping Lin 13832cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 13842cd27853SHisping Lin SharedMem0.flags = 0; 13852cd27853SHisping Lin 13862cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1387*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1388*f4e1db95SHisping Lin goto exit; 13892cd27853SHisping Lin 13902cd27853SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 13912cd27853SHisping Lin 13922cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13932cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 13942cd27853SHisping Lin 13952cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 13962cd27853SHisping Lin TEEC_NONE, 13972cd27853SHisping Lin TEEC_NONE, 13982cd27853SHisping Lin TEEC_NONE); 13992cd27853SHisping Lin 14002cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 14012cd27853SHisping Lin 4, 14022cd27853SHisping Lin &TeecOperation, 14032cd27853SHisping Lin &ErrorOrigin); 1404*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1405*f4e1db95SHisping Lin goto exit; 1406*f4e1db95SHisping Lin exit: 14072cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 14082cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 14092cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 14102cd27853SHisping Lin 14112cd27853SHisping Lin return TeecResult; 14122cd27853SHisping Lin } 1413095e2a82SHisping Lin 1414468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 1415468df3b2SHisping Lin { 1416468df3b2SHisping Lin TEEC_Result TeecResult; 1417468df3b2SHisping Lin TEEC_Context TeecContext; 1418468df3b2SHisping Lin TEEC_Session TeecSession; 1419468df3b2SHisping Lin uint32_t ErrorOrigin; 1420468df3b2SHisping Lin uint32_t bootflag; 1421468df3b2SHisping Lin 1422468df3b2SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 1423468df3b2SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1424468df3b2SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1425468df3b2SHisping Lin TEEC_Operation TeecOperation = {0}; 1426468df3b2SHisping Lin 1427*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1428*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1429*f4e1db95SHisping Lin return TeecResult; 1430468df3b2SHisping Lin 1431468df3b2SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1432*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1433*f4e1db95SHisping Lin return TeecResult; 1434468df3b2SHisping Lin 1435468df3b2SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1436468df3b2SHisping Lin &TeecSession, 1437468df3b2SHisping Lin TeecUuid, 1438468df3b2SHisping Lin TEEC_LOGIN_PUBLIC, 1439468df3b2SHisping Lin NULL, 1440468df3b2SHisping Lin NULL, 1441468df3b2SHisping Lin &ErrorOrigin); 1442*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1443*f4e1db95SHisping Lin return TeecResult; 1444468df3b2SHisping Lin 1445468df3b2SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1446468df3b2SHisping Lin 1447468df3b2SHisping Lin SharedMem0.size = 1 * sizeof(uint32_t); 1448468df3b2SHisping Lin SharedMem0.flags = 0; 1449468df3b2SHisping Lin 1450468df3b2SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1451*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1452*f4e1db95SHisping Lin goto exit; 1453468df3b2SHisping Lin 1454468df3b2SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1455468df3b2SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1456468df3b2SHisping Lin 1457468df3b2SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 1458468df3b2SHisping Lin TEEC_NONE, 1459468df3b2SHisping Lin TEEC_NONE, 1460468df3b2SHisping Lin TEEC_NONE); 1461468df3b2SHisping Lin 1462468df3b2SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1463468df3b2SHisping Lin 5, 1464468df3b2SHisping Lin &TeecOperation, 1465468df3b2SHisping Lin &ErrorOrigin); 1466468df3b2SHisping Lin 1467468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 1468468df3b2SHisping Lin memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size); 1469468df3b2SHisping Lin if (bootflag == 0x000000FF) 1470468df3b2SHisping Lin *flag = 1; 1471468df3b2SHisping Lin } 1472*f4e1db95SHisping Lin exit: 1473468df3b2SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1474468df3b2SHisping Lin TEEC_CloseSession(&TeecSession); 1475468df3b2SHisping Lin TEEC_FinalizeContext(&TeecContext); 1476468df3b2SHisping Lin 1477468df3b2SHisping Lin return TeecResult; 1478468df3b2SHisping Lin } 1479468df3b2SHisping Lin 1480095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 1481095e2a82SHisping Lin { 1482095e2a82SHisping Lin TEEC_Result TeecResult; 1483095e2a82SHisping Lin TEEC_Context TeecContext; 1484095e2a82SHisping Lin TEEC_Session TeecSession; 1485095e2a82SHisping Lin uint32_t ErrorOrigin; 148699830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 148799830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1488095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1489095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 14903251364cSHisping Lin struct blk_desc *dev_desc; 14913251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 14926651d4c0SJason Zhu if (!dev_desc) { 14936651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 14946651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 14956651d4c0SJason Zhu } 1496095e2a82SHisping Lin 1497*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1498*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1499*f4e1db95SHisping Lin return TeecResult; 1500095e2a82SHisping Lin 1501095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1502*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1503*f4e1db95SHisping Lin return TeecResult; 1504095e2a82SHisping Lin 15053251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15063251364cSHisping Lin TEEC_NONE, 15073251364cSHisping Lin TEEC_NONE, 15083251364cSHisping Lin TEEC_NONE); 15093251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 15103251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 15113251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15123251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15133251364cSHisping Lin #endif 15143251364cSHisping Lin 1515095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1516095e2a82SHisping Lin &TeecSession, 1517095e2a82SHisping Lin TeecUuid, 1518095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1519095e2a82SHisping Lin NULL, 15203251364cSHisping Lin &TeecOperation, 1521095e2a82SHisping Lin &ErrorOrigin); 1522*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1523*f4e1db95SHisping Lin return TeecResult; 1524095e2a82SHisping Lin 1525095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1526095e2a82SHisping Lin 1527095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1528095e2a82SHisping Lin SharedMem0.flags = 0; 1529095e2a82SHisping Lin 1530095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1531*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1532*f4e1db95SHisping Lin goto exit; 1533095e2a82SHisping Lin 1534095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1535095e2a82SHisping Lin 1536095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1537095e2a82SHisping Lin 1538095e2a82SHisping Lin SharedMem1.size = 1; 1539095e2a82SHisping Lin SharedMem1.flags = 0; 1540095e2a82SHisping Lin 1541095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1542*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1543*f4e1db95SHisping Lin goto exit; 1544095e2a82SHisping Lin 1545095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1546095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1547095e2a82SHisping Lin 1548095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1549095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1550095e2a82SHisping Lin 1551095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1552095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1553095e2a82SHisping Lin TEEC_NONE, 1554095e2a82SHisping Lin TEEC_NONE); 1555095e2a82SHisping Lin 1556095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 155799830019SHisping Lin 0, 1558095e2a82SHisping Lin &TeecOperation, 1559095e2a82SHisping Lin &ErrorOrigin); 1560095e2a82SHisping Lin if (TeecResult == TEEC_SUCCESS) 1561095e2a82SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 1562*f4e1db95SHisping Lin exit: 1563095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1564095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1565095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1566095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1567095e2a82SHisping Lin 1568095e2a82SHisping Lin return TeecResult; 1569095e2a82SHisping Lin } 1570095e2a82SHisping Lin 1571095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 1572095e2a82SHisping Lin { 1573095e2a82SHisping Lin TEEC_Result TeecResult; 1574095e2a82SHisping Lin TEEC_Context TeecContext; 1575095e2a82SHisping Lin TEEC_Session TeecSession; 1576095e2a82SHisping Lin uint32_t ErrorOrigin; 157799830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 157899830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1579095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1580095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 15813251364cSHisping Lin struct blk_desc *dev_desc; 15823251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15836651d4c0SJason Zhu if (!dev_desc) { 15846651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15856651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15866651d4c0SJason Zhu } 1587095e2a82SHisping Lin 1588*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1589*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1590*f4e1db95SHisping Lin return TeecResult; 1591095e2a82SHisping Lin 1592095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1593*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1594*f4e1db95SHisping Lin return TeecResult; 1595095e2a82SHisping Lin 15963251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15973251364cSHisping Lin TEEC_NONE, 15983251364cSHisping Lin TEEC_NONE, 15993251364cSHisping Lin TEEC_NONE); 16003251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16013251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16023251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16033251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16043251364cSHisping Lin #endif 16053251364cSHisping Lin 1606095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1607095e2a82SHisping Lin &TeecSession, 1608095e2a82SHisping Lin TeecUuid, 1609095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1610095e2a82SHisping Lin NULL, 16113251364cSHisping Lin &TeecOperation, 1612095e2a82SHisping Lin &ErrorOrigin); 1613*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1614*f4e1db95SHisping Lin return TeecResult; 1615095e2a82SHisping Lin 1616095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1617095e2a82SHisping Lin 1618095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1619095e2a82SHisping Lin SharedMem0.flags = 0; 1620095e2a82SHisping Lin 1621095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1622*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1623*f4e1db95SHisping Lin goto exit; 1624095e2a82SHisping Lin 1625095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1626095e2a82SHisping Lin 1627095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1628095e2a82SHisping Lin 1629095e2a82SHisping Lin SharedMem1.size = 1; 1630095e2a82SHisping Lin SharedMem1.flags = 0; 1631095e2a82SHisping Lin 1632095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1633*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1634*f4e1db95SHisping Lin goto exit; 1635095e2a82SHisping Lin 1636095e2a82SHisping Lin memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size); 1637095e2a82SHisping Lin 1638095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1639095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1640095e2a82SHisping Lin 1641095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1642095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1643095e2a82SHisping Lin 1644095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1645095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1646095e2a82SHisping Lin TEEC_NONE, 1647095e2a82SHisping Lin TEEC_NONE); 1648095e2a82SHisping Lin 1649095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 165099830019SHisping Lin 1, 1651095e2a82SHisping Lin &TeecOperation, 1652095e2a82SHisping Lin &ErrorOrigin); 1653*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1654*f4e1db95SHisping Lin goto exit; 1655*f4e1db95SHisping Lin exit: 1656095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1657095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1658095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1659095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1660095e2a82SHisping Lin 1661095e2a82SHisping Lin return TeecResult; 1662095e2a82SHisping Lin } 16634aa61755SAndy Ye 16644aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 16654aa61755SAndy Ye { 16664aa61755SAndy Ye TEEC_Result TeecResult; 16674aa61755SAndy Ye TEEC_Context TeecContext; 16684aa61755SAndy Ye TEEC_Session TeecSession; 16694aa61755SAndy Ye uint32_t ErrorOrigin; 16704aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16714aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16724aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 16734aa61755SAndy Ye } 16744aa61755SAndy Ye }; 16754aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16764aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16773251364cSHisping Lin struct blk_desc *dev_desc; 16783251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16796651d4c0SJason Zhu if (!dev_desc) { 16806651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16816651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16826651d4c0SJason Zhu } 16834aa61755SAndy Ye 1684*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1685*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1686*f4e1db95SHisping Lin return TeecResult; 16874aa61755SAndy Ye 16884aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1689*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1690*f4e1db95SHisping Lin return TeecResult; 16914aa61755SAndy Ye 16923251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16933251364cSHisping Lin TEEC_NONE, 16943251364cSHisping Lin TEEC_NONE, 16953251364cSHisping Lin TEEC_NONE); 16963251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16973251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16983251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16993251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17003251364cSHisping Lin #endif 17013251364cSHisping Lin 17024aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17034aa61755SAndy Ye &TeecSession, 17044aa61755SAndy Ye TeecUuid, 17054aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17064aa61755SAndy Ye NULL, 17073251364cSHisping Lin &TeecOperation, 17084aa61755SAndy Ye &ErrorOrigin); 1709*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1710*f4e1db95SHisping Lin return TeecResult; 17114aa61755SAndy Ye 17124aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17134aa61755SAndy Ye 17144aa61755SAndy Ye SharedMem0.size = *dh_size; 17154aa61755SAndy Ye SharedMem0.flags = 0; 17164aa61755SAndy Ye 17174aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1718*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1719*f4e1db95SHisping Lin goto exit; 17204aa61755SAndy Ye 17214aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17224aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17234aa61755SAndy Ye 17244aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17254aa61755SAndy Ye TEEC_NONE, 17264aa61755SAndy Ye TEEC_NONE, 17274aa61755SAndy Ye TEEC_NONE); 17284aa61755SAndy Ye 17294aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17304aa61755SAndy Ye 143, 17314aa61755SAndy Ye &TeecOperation, 17324aa61755SAndy Ye &ErrorOrigin); 1733*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1734*f4e1db95SHisping Lin goto exit; 17354aa61755SAndy Ye 17364aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 17374aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1738*f4e1db95SHisping Lin exit: 17394aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17404aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1741*f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 17424aa61755SAndy Ye 17434aa61755SAndy Ye return TeecResult; 17444aa61755SAndy Ye } 17454aa61755SAndy Ye 17464aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 17474aa61755SAndy Ye { 17484aa61755SAndy Ye TEEC_Result TeecResult; 17494aa61755SAndy Ye TEEC_Context TeecContext; 17504aa61755SAndy Ye TEEC_Session TeecSession; 17514aa61755SAndy Ye uint32_t ErrorOrigin; 17524aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17534aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17544aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17554aa61755SAndy Ye } 17564aa61755SAndy Ye }; 17574aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17584aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17593251364cSHisping Lin struct blk_desc *dev_desc; 17603251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17616651d4c0SJason Zhu if (!dev_desc) { 17626651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17636651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17646651d4c0SJason Zhu } 17654aa61755SAndy Ye 1766*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1767*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1768*f4e1db95SHisping Lin return TeecResult; 17694aa61755SAndy Ye 17704aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1771*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1772*f4e1db95SHisping Lin return TeecResult; 17734aa61755SAndy Ye 17743251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17753251364cSHisping Lin TEEC_NONE, 17763251364cSHisping Lin TEEC_NONE, 17773251364cSHisping Lin TEEC_NONE); 17783251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 17793251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 17803251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17813251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17823251364cSHisping Lin #endif 17833251364cSHisping Lin 17844aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17854aa61755SAndy Ye &TeecSession, 17864aa61755SAndy Ye TeecUuid, 17874aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17884aa61755SAndy Ye NULL, 17893251364cSHisping Lin &TeecOperation, 17904aa61755SAndy Ye &ErrorOrigin); 1791*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1792*f4e1db95SHisping Lin return TeecResult; 17934aa61755SAndy Ye 17944aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17954aa61755SAndy Ye 17964aa61755SAndy Ye SharedMem0.size = *uuid_size; 17974aa61755SAndy Ye SharedMem0.flags = 0; 17984aa61755SAndy Ye 17994aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1800*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1801*f4e1db95SHisping Lin goto exit; 18024aa61755SAndy Ye 18034aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18044aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18054aa61755SAndy Ye 18064aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 18074aa61755SAndy Ye TEEC_NONE, 18084aa61755SAndy Ye TEEC_NONE, 18094aa61755SAndy Ye TEEC_NONE); 18104aa61755SAndy Ye 18114aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 18124aa61755SAndy Ye 144, 18134aa61755SAndy Ye &TeecOperation, 18144aa61755SAndy Ye &ErrorOrigin); 1815*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1816*f4e1db95SHisping Lin goto exit; 18174aa61755SAndy Ye 18184aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 18194aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1820*f4e1db95SHisping Lin exit: 18214aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18224aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1823*f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 18244aa61755SAndy Ye 18254aa61755SAndy Ye return TeecResult; 18264aa61755SAndy Ye } 18274aa61755SAndy Ye 18284aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 18294aa61755SAndy Ye uint32_t *operation_size, 18304aa61755SAndy Ye uint8_t *out, 18314aa61755SAndy Ye uint32_t *out_len) 18324aa61755SAndy Ye { 18334aa61755SAndy Ye TEEC_Result TeecResult; 18344aa61755SAndy Ye TEEC_Context TeecContext; 18354aa61755SAndy Ye TEEC_Session TeecSession; 18364aa61755SAndy Ye uint32_t ErrorOrigin; 18374aa61755SAndy Ye 18384aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18394aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18404aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18414aa61755SAndy Ye } 18424aa61755SAndy Ye }; 18434aa61755SAndy Ye 18444aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18454aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18463251364cSHisping Lin struct blk_desc *dev_desc; 18473251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18486651d4c0SJason Zhu if (!dev_desc) { 18496651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18506651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18516651d4c0SJason Zhu } 18524aa61755SAndy Ye 1853*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1854*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1855*f4e1db95SHisping Lin return TeecResult; 18564aa61755SAndy Ye 18574aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1858*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1859*f4e1db95SHisping Lin return TeecResult; 18604aa61755SAndy Ye 18613251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 18623251364cSHisping Lin TEEC_NONE, 18633251364cSHisping Lin TEEC_NONE, 18643251364cSHisping Lin TEEC_NONE); 18653251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 18663251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 18673251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 18683251364cSHisping Lin TeecOperation.params[0].value.a = 0; 18693251364cSHisping Lin #endif 18703251364cSHisping Lin 18714aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 18724aa61755SAndy Ye &TeecSession, 18734aa61755SAndy Ye TeecUuid, 18744aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 18754aa61755SAndy Ye NULL, 18763251364cSHisping Lin &TeecOperation, 18774aa61755SAndy Ye &ErrorOrigin); 1878*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1879*f4e1db95SHisping Lin return TeecResult; 18804aa61755SAndy Ye 18814aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18824aa61755SAndy Ye 18834aa61755SAndy Ye SharedMem0.size = *operation_size; 18844aa61755SAndy Ye SharedMem0.flags = 0; 18854aa61755SAndy Ye 18864aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1887*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1888*f4e1db95SHisping Lin goto exit; 18894aa61755SAndy Ye 18904aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 18914aa61755SAndy Ye 18924aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18934aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18944aa61755SAndy Ye 18954aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 18964aa61755SAndy Ye 18974aa61755SAndy Ye SharedMem1.size = *out_len; 18984aa61755SAndy Ye SharedMem1.flags = 0; 18994aa61755SAndy Ye 19004aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1901*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1902*f4e1db95SHisping Lin goto exit; 19034aa61755SAndy Ye 19044aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 19054aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 19064aa61755SAndy Ye 19074aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19084aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 19094aa61755SAndy Ye TEEC_NONE, 19104aa61755SAndy Ye TEEC_NONE); 19114aa61755SAndy Ye 19124aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19134aa61755SAndy Ye 145, 19144aa61755SAndy Ye &TeecOperation, 19154aa61755SAndy Ye &ErrorOrigin); 1916*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1917*f4e1db95SHisping Lin goto exit; 19184aa61755SAndy Ye 19194aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 19204aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1921*f4e1db95SHisping Lin exit: 19224aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19234aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1924*f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1925*f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 19264aa61755SAndy Ye 19274aa61755SAndy Ye return TeecResult; 19284aa61755SAndy Ye } 19294aa61755SAndy Ye 19304aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 19314aa61755SAndy Ye { 19324aa61755SAndy Ye TEEC_Result TeecResult; 19334aa61755SAndy Ye TEEC_Context TeecContext; 19344aa61755SAndy Ye TEEC_Session TeecSession; 19354aa61755SAndy Ye uint32_t ErrorOrigin; 19364aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 19374aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 19384aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 19394aa61755SAndy Ye } 19404aa61755SAndy Ye }; 19414aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 19424aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 19433251364cSHisping Lin struct blk_desc *dev_desc; 19443251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 19456651d4c0SJason Zhu if (!dev_desc) { 19466651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 19476651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 19486651d4c0SJason Zhu } 1949*f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1950*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1951*f4e1db95SHisping Lin return TeecResult; 19524aa61755SAndy Ye 19534aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1954*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1955*f4e1db95SHisping Lin return TeecResult; 19564aa61755SAndy Ye 19573251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19583251364cSHisping Lin TEEC_NONE, 19593251364cSHisping Lin TEEC_NONE, 19603251364cSHisping Lin TEEC_NONE); 19613251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 19623251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 19633251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19643251364cSHisping Lin TeecOperation.params[0].value.a = 0; 19653251364cSHisping Lin #endif 19663251364cSHisping Lin 19674aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 19684aa61755SAndy Ye &TeecSession, 19694aa61755SAndy Ye TeecUuid, 19704aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 19714aa61755SAndy Ye NULL, 19723251364cSHisping Lin &TeecOperation, 19734aa61755SAndy Ye &ErrorOrigin); 1974*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1975*f4e1db95SHisping Lin return TeecResult; 19764aa61755SAndy Ye 19774aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 19784aa61755SAndy Ye 19794aa61755SAndy Ye SharedMem0.size = *ca_response_size; 19804aa61755SAndy Ye SharedMem0.flags = 0; 19814aa61755SAndy Ye 19824aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1983*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1984*f4e1db95SHisping Lin goto exit; 19854aa61755SAndy Ye 19864aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 19874aa61755SAndy Ye 19884aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 19894aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 19904aa61755SAndy Ye 19914aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19924aa61755SAndy Ye TEEC_NONE, 19934aa61755SAndy Ye TEEC_NONE, 19944aa61755SAndy Ye TEEC_NONE); 19954aa61755SAndy Ye 19964aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19974aa61755SAndy Ye 146, 19984aa61755SAndy Ye &TeecOperation, 19994aa61755SAndy Ye &ErrorOrigin); 2000*f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2001*f4e1db95SHisping Lin goto exit; 2002*f4e1db95SHisping Lin exit: 20034aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 20044aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 2005*f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 20064aa61755SAndy Ye 20074aa61755SAndy Ye return TeecResult; 20084aa61755SAndy Ye } 2009