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> 13ae8ec5e1SHisping Lin 14ae8ec5e1SHisping Lin void test_optee(void) 15ae8ec5e1SHisping Lin { 16ae8ec5e1SHisping Lin TEEC_Result TeecResult; 17ae8ec5e1SHisping Lin TEEC_Context TeecContext; 18ae8ec5e1SHisping Lin TEEC_Session TeecSession; 19ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 20ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 21ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 22ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 23ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 243251364cSHisping Lin struct blk_desc *dev_desc; 253251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 26*6651d4c0SJason Zhu if (!dev_desc) { 27*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 28*6651d4c0SJason Zhu return; 29*6651d4c0SJason Zhu } 30ae8ec5e1SHisping Lin 31ae8ec5e1SHisping Lin debug("testmm start\n"); 32ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 33ae8ec5e1SHisping Lin 34ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 35ae8ec5e1SHisping Lin 363251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 373251364cSHisping Lin TEEC_NONE, 383251364cSHisping Lin TEEC_NONE, 393251364cSHisping Lin TEEC_NONE); 403251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 413251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 423251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 433251364cSHisping Lin TeecOperation.params[0].value.a = 0; 443251364cSHisping Lin #endif 453251364cSHisping Lin 46ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 47ae8ec5e1SHisping Lin &TeecSession, 48ae8ec5e1SHisping Lin TeecUuid, 49ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 50ae8ec5e1SHisping Lin NULL, 513251364cSHisping Lin &TeecOperation, 52ae8ec5e1SHisping Lin &ErrorOrigin); 53ae8ec5e1SHisping Lin 54ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 55ae8ec5e1SHisping Lin 56ae8ec5e1SHisping Lin SharedMem0.size = sizeof("filename_test"); 57ae8ec5e1SHisping Lin SharedMem0.flags = 0; 58ae8ec5e1SHisping Lin 59ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 60ae8ec5e1SHisping Lin 61ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size); 62ae8ec5e1SHisping Lin 63ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 64ae8ec5e1SHisping Lin 65ae8ec5e1SHisping Lin SharedMem1.size = 32; 66ae8ec5e1SHisping Lin SharedMem1.flags = 0; 67ae8ec5e1SHisping Lin 68ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 69ae8ec5e1SHisping Lin 70ae8ec5e1SHisping Lin memset(SharedMem1.buffer, 'a', SharedMem1.size); 71ae8ec5e1SHisping Lin 72ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 73ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 74ae8ec5e1SHisping Lin 75ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 76ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 77ae8ec5e1SHisping Lin 78ae8ec5e1SHisping Lin 79ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 80ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 81ae8ec5e1SHisping Lin TEEC_NONE, 82ae8ec5e1SHisping Lin TEEC_NONE); 83ae8ec5e1SHisping Lin 84ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 85ae8ec5e1SHisping Lin 1, 86ae8ec5e1SHisping Lin &TeecOperation, 87ae8ec5e1SHisping Lin &ErrorOrigin); 88ae8ec5e1SHisping Lin 89ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 90ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 91ae8ec5e1SHisping Lin 92ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 93ae8ec5e1SHisping Lin 9446b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 95ae8ec5e1SHisping Lin 96ae8ec5e1SHisping Lin debug("testmm end\n"); 97ae8ec5e1SHisping Lin debug("TeecResult %x\n", TeecResult); 98ae8ec5e1SHisping Lin } 99ae8ec5e1SHisping Lin 100ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 101ae8ec5e1SHisping Lin { 102ae8ec5e1SHisping Lin if (in > 9) 103ae8ec5e1SHisping Lin return in + 55; 104ae8ec5e1SHisping Lin else 105ae8ec5e1SHisping Lin return in + 48; 106ae8ec5e1SHisping Lin } 107ae8ec5e1SHisping Lin 108ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 109ae8ec5e1SHisping Lin { 110ae8ec5e1SHisping Lin uint32_t i = 0; 111ae8ec5e1SHisping Lin 112ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 113ae8ec5e1SHisping Lin return 0; 114ae8ec5e1SHisping Lin 115ae8ec5e1SHisping Lin for (; i < blen; i++) { 116ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 117ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 118ae8ec5e1SHisping Lin } 119ae8ec5e1SHisping Lin hs[blen * 2] = 0; 120ae8ec5e1SHisping Lin 121ae8ec5e1SHisping Lin return blen * 2; 122ae8ec5e1SHisping Lin } 123ae8ec5e1SHisping Lin 124ae8ec5e1SHisping Lin 125ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 126ae8ec5e1SHisping Lin { 127ae8ec5e1SHisping Lin TEEC_Result TeecResult; 128ae8ec5e1SHisping Lin TEEC_Context TeecContext; 129ae8ec5e1SHisping Lin TEEC_Session TeecSession; 130ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 131ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 132ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 133ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 134ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 135ae8ec5e1SHisping Lin uint8_t hs[9]; 136ae8ec5e1SHisping Lin 1373251364cSHisping Lin struct blk_desc *dev_desc; 1383251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 139*6651d4c0SJason Zhu if (!dev_desc) { 140*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 141*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 142*6651d4c0SJason Zhu } 1433251364cSHisping Lin 144ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 145ae8ec5e1SHisping Lin debug("testmm start\n"); 146ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 147ae8ec5e1SHisping Lin 148ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 149ae8ec5e1SHisping Lin 1503251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1513251364cSHisping Lin TEEC_NONE, 1523251364cSHisping Lin TEEC_NONE, 1533251364cSHisping Lin TEEC_NONE); 1543251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1553251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 1563251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1573251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1583251364cSHisping Lin #endif 1593251364cSHisping Lin 160ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 161ae8ec5e1SHisping Lin &TeecSession, 162ae8ec5e1SHisping Lin TeecUuid, 163ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 164ae8ec5e1SHisping Lin NULL, 1653251364cSHisping Lin &TeecOperation, 166f303baf0SHisping Lin 167ae8ec5e1SHisping Lin &ErrorOrigin); 168ae8ec5e1SHisping Lin 169ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 170ae8ec5e1SHisping Lin 171ae8ec5e1SHisping Lin SharedMem0.size = 8; 172ae8ec5e1SHisping Lin SharedMem0.flags = 0; 173ae8ec5e1SHisping Lin 174ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 175ae8ec5e1SHisping Lin 176ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 177ae8ec5e1SHisping Lin 178ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 179ae8ec5e1SHisping Lin 180ae8ec5e1SHisping Lin SharedMem1.size = 8; 181ae8ec5e1SHisping Lin SharedMem1.flags = 0; 182ae8ec5e1SHisping Lin 183ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 184ae8ec5e1SHisping Lin 185ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 186ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 187ae8ec5e1SHisping Lin 188ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 189ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 190ae8ec5e1SHisping Lin 191ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 192ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 193ae8ec5e1SHisping Lin TEEC_NONE, 194ae8ec5e1SHisping Lin TEEC_NONE); 195ae8ec5e1SHisping Lin 196ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 197ae8ec5e1SHisping Lin 0, 198ae8ec5e1SHisping Lin &TeecOperation, 199ae8ec5e1SHisping Lin &ErrorOrigin); 20046b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 201ae8ec5e1SHisping Lin memcpy((char *)value, SharedMem1.buffer, SharedMem1.size); 202ae8ec5e1SHisping Lin 203ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 204ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 205ae8ec5e1SHisping Lin 206ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 207ae8ec5e1SHisping Lin 20846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 209ae8ec5e1SHisping Lin 210ae8ec5e1SHisping Lin debug("testmm end\n"); 211ae8ec5e1SHisping Lin return TeecResult; 212ae8ec5e1SHisping Lin } 213ae8ec5e1SHisping Lin 214ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 215ae8ec5e1SHisping Lin { 216ae8ec5e1SHisping Lin TEEC_Result TeecResult; 217ae8ec5e1SHisping Lin TEEC_Context TeecContext; 218ae8ec5e1SHisping Lin TEEC_Session TeecSession; 219ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 220ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 221ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 222ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 223ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 224ae8ec5e1SHisping Lin uint8_t hs[9]; 2253251364cSHisping Lin struct blk_desc *dev_desc; 2263251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 227*6651d4c0SJason Zhu if (!dev_desc) { 228*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 229*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 230*6651d4c0SJason Zhu } 2313251364cSHisping Lin 232ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 233ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 234ae8ec5e1SHisping Lin 235ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 236ae8ec5e1SHisping Lin 2373251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 2383251364cSHisping Lin TEEC_NONE, 2393251364cSHisping Lin TEEC_NONE, 2403251364cSHisping Lin TEEC_NONE); 2413251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2423251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 2433251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 2443251364cSHisping Lin TeecOperation.params[0].value.a = 0; 2453251364cSHisping Lin #endif 2463251364cSHisping Lin 247ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 248ae8ec5e1SHisping Lin &TeecSession, 249ae8ec5e1SHisping Lin TeecUuid, 250ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 251ae8ec5e1SHisping Lin NULL, 2523251364cSHisping Lin &TeecOperation, 253ae8ec5e1SHisping Lin &ErrorOrigin); 254ae8ec5e1SHisping Lin 255ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 256ae8ec5e1SHisping Lin 257ae8ec5e1SHisping Lin SharedMem0.size = 8; 258ae8ec5e1SHisping Lin SharedMem0.flags = 0; 259ae8ec5e1SHisping Lin 260ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 261ae8ec5e1SHisping Lin 262ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 263ae8ec5e1SHisping Lin 264ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 265ae8ec5e1SHisping Lin 266ae8ec5e1SHisping Lin SharedMem1.size = 8; 267ae8ec5e1SHisping Lin SharedMem1.flags = 0; 268ae8ec5e1SHisping Lin 269ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 270ae8ec5e1SHisping Lin 271ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size); 272ae8ec5e1SHisping Lin 273ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 274ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 275ae8ec5e1SHisping Lin 276ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 277ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 278ae8ec5e1SHisping Lin 279ae8ec5e1SHisping Lin 280ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 281ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 282ae8ec5e1SHisping Lin TEEC_NONE, 283ae8ec5e1SHisping Lin TEEC_NONE); 284ae8ec5e1SHisping Lin 285ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 286ae8ec5e1SHisping Lin 1, 287ae8ec5e1SHisping Lin &TeecOperation, 288ae8ec5e1SHisping Lin &ErrorOrigin); 289ae8ec5e1SHisping Lin 290ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 291ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 292ae8ec5e1SHisping Lin 293ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 294ae8ec5e1SHisping Lin 29546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 296ae8ec5e1SHisping Lin 297ae8ec5e1SHisping Lin debug("testmm end\n"); 298ae8ec5e1SHisping Lin 299ae8ec5e1SHisping Lin return TeecResult; 300ae8ec5e1SHisping Lin } 301ae8ec5e1SHisping Lin 302ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 303ae8ec5e1SHisping Lin { 304ae8ec5e1SHisping Lin TEEC_Result TeecResult; 305ae8ec5e1SHisping Lin TEEC_Context TeecContext; 306ae8ec5e1SHisping Lin TEEC_Session TeecSession; 307ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 30846b2a054SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 30946b2a054SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 310ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 311ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 3123251364cSHisping Lin struct blk_desc *dev_desc; 3133251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 314*6651d4c0SJason Zhu if (!dev_desc) { 315*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 316*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 317*6651d4c0SJason Zhu } 318ae8ec5e1SHisping Lin 319ae8ec5e1SHisping Lin debug("testmm start\n"); 320ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 321ae8ec5e1SHisping Lin 322ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 323ae8ec5e1SHisping Lin 3243251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 3253251364cSHisping Lin TEEC_NONE, 3263251364cSHisping Lin TEEC_NONE, 3273251364cSHisping Lin TEEC_NONE); 3283251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 3293251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 3303251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 3313251364cSHisping Lin TeecOperation.params[0].value.a = 0; 3323251364cSHisping Lin #endif 3333251364cSHisping Lin 334ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 335ae8ec5e1SHisping Lin &TeecSession, 336ae8ec5e1SHisping Lin TeecUuid, 337ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 338ae8ec5e1SHisping Lin NULL, 3393251364cSHisping Lin &TeecOperation, 340ae8ec5e1SHisping Lin &ErrorOrigin); 341ae8ec5e1SHisping Lin 342ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 343ae8ec5e1SHisping Lin 344ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 345ae8ec5e1SHisping Lin SharedMem0.flags = 0; 346ae8ec5e1SHisping Lin 347ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 348ae8ec5e1SHisping Lin 349ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 350ae8ec5e1SHisping Lin 351ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 352ae8ec5e1SHisping Lin 353ae8ec5e1SHisping Lin SharedMem1.size = size; 354ae8ec5e1SHisping Lin SharedMem1.flags = 0; 355ae8ec5e1SHisping Lin 356ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 357ae8ec5e1SHisping Lin 358ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 359ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 360ae8ec5e1SHisping Lin 361ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 362ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 363ae8ec5e1SHisping Lin 364ae8ec5e1SHisping Lin 365ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 366ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 367ae8ec5e1SHisping Lin TEEC_NONE, 368ae8ec5e1SHisping Lin TEEC_NONE); 369ae8ec5e1SHisping Lin 370ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 37146b2a054SHisping Lin 142, 372ae8ec5e1SHisping Lin &TeecOperation, 373ae8ec5e1SHisping Lin &ErrorOrigin); 37446b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 375ae8ec5e1SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 376ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 377ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 378ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 37946b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 380ae8ec5e1SHisping Lin debug("testmm end\n"); 381ae8ec5e1SHisping Lin 382ae8ec5e1SHisping Lin return TeecResult; 383ae8ec5e1SHisping Lin } 384ae8ec5e1SHisping Lin 385ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 386ae8ec5e1SHisping Lin { 387ae8ec5e1SHisping Lin TEEC_Result TeecResult; 388ae8ec5e1SHisping Lin TEEC_Context TeecContext; 389ae8ec5e1SHisping Lin TEEC_Session TeecSession; 390ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 39146b2a054SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 39246b2a054SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 393ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 394ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 3953251364cSHisping Lin struct blk_desc *dev_desc; 3963251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 397*6651d4c0SJason Zhu if (!dev_desc) { 398*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 399*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 400*6651d4c0SJason Zhu } 401ae8ec5e1SHisping Lin 402ae8ec5e1SHisping Lin debug("testmm start\n"); 403ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 404ae8ec5e1SHisping Lin 405ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 406ae8ec5e1SHisping Lin 4073251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 4083251364cSHisping Lin TEEC_NONE, 4093251364cSHisping Lin TEEC_NONE, 4103251364cSHisping Lin TEEC_NONE); 4113251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 4123251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 4133251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 4143251364cSHisping Lin TeecOperation.params[0].value.a = 0; 4153251364cSHisping Lin #endif 4163251364cSHisping Lin 417ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 418ae8ec5e1SHisping Lin &TeecSession, 419ae8ec5e1SHisping Lin TeecUuid, 420ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 421ae8ec5e1SHisping Lin NULL, 4223251364cSHisping Lin &TeecOperation, 423ae8ec5e1SHisping Lin &ErrorOrigin); 424ae8ec5e1SHisping Lin 425ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 426ae8ec5e1SHisping Lin 427ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 428ae8ec5e1SHisping Lin SharedMem0.flags = 0; 429ae8ec5e1SHisping Lin 430ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 431ae8ec5e1SHisping Lin 432ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 433ae8ec5e1SHisping Lin 434ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 435ae8ec5e1SHisping Lin 436ae8ec5e1SHisping Lin SharedMem1.size = size; 437ae8ec5e1SHisping Lin SharedMem1.flags = 0; 438ae8ec5e1SHisping Lin 439ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 440ae8ec5e1SHisping Lin 441ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, attributes, SharedMem1.size); 442ae8ec5e1SHisping Lin 443ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 444ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 445ae8ec5e1SHisping Lin 446ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 447ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 448ae8ec5e1SHisping Lin 449ae8ec5e1SHisping Lin 450ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 451ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 452ae8ec5e1SHisping Lin TEEC_NONE, 453ae8ec5e1SHisping Lin TEEC_NONE); 454ae8ec5e1SHisping Lin 455ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 45646b2a054SHisping Lin 141, 457ae8ec5e1SHisping Lin &TeecOperation, 458ae8ec5e1SHisping Lin &ErrorOrigin); 459ae8ec5e1SHisping Lin 460ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 461ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 462ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 46346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 464ae8ec5e1SHisping Lin debug("testmm end\n"); 465ae8ec5e1SHisping Lin 466ae8ec5e1SHisping Lin return TeecResult; 467ae8ec5e1SHisping Lin } 468ae8ec5e1SHisping Lin 469ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 470ae8ec5e1SHisping Lin { 471ae8ec5e1SHisping Lin TEEC_Result TeecResult; 472ae8ec5e1SHisping Lin TEEC_Context TeecContext; 473ae8ec5e1SHisping Lin TEEC_Session TeecSession; 474ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 475ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 476ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 477ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 478ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 4793251364cSHisping Lin struct blk_desc *dev_desc; 4803251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 481*6651d4c0SJason Zhu if (!dev_desc) { 482*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 483*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 484*6651d4c0SJason Zhu } 485ae8ec5e1SHisping Lin 486ae8ec5e1SHisping Lin debug("testmm start\n"); 487ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 488ae8ec5e1SHisping Lin 489ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 490ae8ec5e1SHisping Lin 4913251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 4923251364cSHisping Lin TEEC_NONE, 4933251364cSHisping Lin TEEC_NONE, 4943251364cSHisping Lin TEEC_NONE); 4953251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 4963251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 4973251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 4983251364cSHisping Lin TeecOperation.params[0].value.a = 0; 4993251364cSHisping Lin #endif 500ae8ec5e1SHisping Lin 501ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 502ae8ec5e1SHisping Lin &TeecSession, 503ae8ec5e1SHisping Lin TeecUuid, 504ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 505ae8ec5e1SHisping Lin NULL, 5063251364cSHisping Lin &TeecOperation, 507ae8ec5e1SHisping Lin &ErrorOrigin); 508ae8ec5e1SHisping Lin 509ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 510ae8ec5e1SHisping Lin 511ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 512ae8ec5e1SHisping Lin SharedMem0.flags = 0; 513ae8ec5e1SHisping Lin 514ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 515ae8ec5e1SHisping Lin 516ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 517ae8ec5e1SHisping Lin 518ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 519ae8ec5e1SHisping Lin 520ae8ec5e1SHisping Lin SharedMem1.size = 1; 521ae8ec5e1SHisping Lin SharedMem1.flags = 0; 522ae8ec5e1SHisping Lin 523ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 524ae8ec5e1SHisping Lin 525ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 526ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 527ae8ec5e1SHisping Lin 528ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 529ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 530ae8ec5e1SHisping Lin 531ae8ec5e1SHisping Lin 532ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 533ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 534ae8ec5e1SHisping Lin TEEC_NONE, 535ae8ec5e1SHisping Lin TEEC_NONE); 536ae8ec5e1SHisping Lin 537ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 538ae8ec5e1SHisping Lin 0, 539ae8ec5e1SHisping Lin &TeecOperation, 540ae8ec5e1SHisping Lin &ErrorOrigin); 54146b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 542ae8ec5e1SHisping Lin memcpy(lock_state, SharedMem1.buffer, SharedMem1.size); 543ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 544ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 545ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 54646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 547ae8ec5e1SHisping Lin debug("testmm end\n"); 548ae8ec5e1SHisping Lin 549ae8ec5e1SHisping Lin return TeecResult; 550ae8ec5e1SHisping Lin } 551ae8ec5e1SHisping Lin 552ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 553ae8ec5e1SHisping Lin { 554ae8ec5e1SHisping Lin TEEC_Result TeecResult; 555ae8ec5e1SHisping Lin TEEC_Context TeecContext; 556ae8ec5e1SHisping Lin TEEC_Session TeecSession; 557ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 558ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 559ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 560ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 561ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 5623251364cSHisping Lin struct blk_desc *dev_desc; 5633251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 564*6651d4c0SJason Zhu if (!dev_desc) { 565*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 566*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 567*6651d4c0SJason Zhu } 568ae8ec5e1SHisping Lin 569ae8ec5e1SHisping Lin debug("testmm start\n"); 570ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 571ae8ec5e1SHisping Lin 572ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 573ae8ec5e1SHisping Lin 5743251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 5753251364cSHisping Lin TEEC_NONE, 5763251364cSHisping Lin TEEC_NONE, 5773251364cSHisping Lin TEEC_NONE); 5783251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 5793251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 5803251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 5813251364cSHisping Lin TeecOperation.params[0].value.a = 0; 5823251364cSHisping Lin #endif 5833251364cSHisping Lin 584ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 585ae8ec5e1SHisping Lin &TeecSession, 586ae8ec5e1SHisping Lin TeecUuid, 587ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 588ae8ec5e1SHisping Lin NULL, 5893251364cSHisping Lin &TeecOperation, 590ae8ec5e1SHisping Lin &ErrorOrigin); 591ae8ec5e1SHisping Lin 592ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 593ae8ec5e1SHisping Lin 594ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 595ae8ec5e1SHisping Lin SharedMem0.flags = 0; 596ae8ec5e1SHisping Lin 597ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 598ae8ec5e1SHisping Lin 599ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 600ae8ec5e1SHisping Lin 601ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 602ae8ec5e1SHisping Lin 603ae8ec5e1SHisping Lin SharedMem1.size = 1; 604ae8ec5e1SHisping Lin SharedMem1.flags = 0; 605ae8ec5e1SHisping Lin 606ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 607ae8ec5e1SHisping Lin 608ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size); 609ae8ec5e1SHisping Lin 610ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 611ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 612ae8ec5e1SHisping Lin 613ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 614ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 615ae8ec5e1SHisping Lin 616ae8ec5e1SHisping Lin 617ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 618ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 619ae8ec5e1SHisping Lin TEEC_NONE, 620ae8ec5e1SHisping Lin TEEC_NONE); 621ae8ec5e1SHisping Lin 622ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 623ae8ec5e1SHisping Lin 1, 624ae8ec5e1SHisping Lin &TeecOperation, 625ae8ec5e1SHisping Lin &ErrorOrigin); 626ae8ec5e1SHisping Lin 627ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 628ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 629ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 63046b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 631ae8ec5e1SHisping Lin debug("testmm end\n"); 632ae8ec5e1SHisping Lin 633ae8ec5e1SHisping Lin return TeecResult; 634ae8ec5e1SHisping Lin } 635ae8ec5e1SHisping Lin 636ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 637ae8ec5e1SHisping Lin { 638ae8ec5e1SHisping Lin TEEC_Result TeecResult; 639ae8ec5e1SHisping Lin TEEC_Context TeecContext; 640ae8ec5e1SHisping Lin TEEC_Session TeecSession; 641ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 642ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 643ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 644ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 645ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 6463251364cSHisping Lin struct blk_desc *dev_desc; 6473251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 648*6651d4c0SJason Zhu if (!dev_desc) { 649*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 650*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 651*6651d4c0SJason Zhu } 652ae8ec5e1SHisping Lin 653ae8ec5e1SHisping Lin debug("testmm start\n"); 654ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 655ae8ec5e1SHisping Lin 656ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 657ae8ec5e1SHisping Lin 6583251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 6593251364cSHisping Lin TEEC_NONE, 6603251364cSHisping Lin TEEC_NONE, 6613251364cSHisping Lin TEEC_NONE); 6623251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 6633251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 6643251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 6653251364cSHisping Lin TeecOperation.params[0].value.a = 0; 6663251364cSHisping Lin #endif 667ae8ec5e1SHisping Lin 668ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 669ae8ec5e1SHisping Lin &TeecSession, 670ae8ec5e1SHisping Lin TeecUuid, 671ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 672ae8ec5e1SHisping Lin NULL, 6733251364cSHisping Lin &TeecOperation, 674ae8ec5e1SHisping Lin &ErrorOrigin); 675ae8ec5e1SHisping Lin 676ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 677ae8ec5e1SHisping Lin 678ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 679ae8ec5e1SHisping Lin SharedMem0.flags = 0; 680ae8ec5e1SHisping Lin 681ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 682ae8ec5e1SHisping Lin 683ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 684ae8ec5e1SHisping Lin 685ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 686ae8ec5e1SHisping Lin 687ae8ec5e1SHisping Lin SharedMem1.size = 1; 688ae8ec5e1SHisping Lin SharedMem1.flags = 0; 689ae8ec5e1SHisping Lin 690ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 691ae8ec5e1SHisping Lin 692ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 693ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 694ae8ec5e1SHisping Lin 695ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 696ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 697ae8ec5e1SHisping Lin 698ae8ec5e1SHisping Lin 699ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 700ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 701ae8ec5e1SHisping Lin TEEC_NONE, 702ae8ec5e1SHisping Lin TEEC_NONE); 703ae8ec5e1SHisping Lin 704ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 705ae8ec5e1SHisping Lin 0, 706ae8ec5e1SHisping Lin &TeecOperation, 707ae8ec5e1SHisping Lin &ErrorOrigin); 70846b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 709ae8ec5e1SHisping Lin memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size); 710ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 711ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 712ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 71346b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 714ae8ec5e1SHisping Lin debug("testmm end\n"); 715ae8ec5e1SHisping Lin 716ae8ec5e1SHisping Lin return TeecResult; 717ae8ec5e1SHisping Lin } 718ae8ec5e1SHisping Lin 719ae8ec5e1SHisping Lin 720ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 721ae8ec5e1SHisping Lin { 722ae8ec5e1SHisping Lin TEEC_Result TeecResult; 723ae8ec5e1SHisping Lin TEEC_Context TeecContext; 724ae8ec5e1SHisping Lin TEEC_Session TeecSession; 725ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 726ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 727ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 728ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 729ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 7303251364cSHisping Lin struct blk_desc *dev_desc; 7313251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 732*6651d4c0SJason Zhu if (!dev_desc) { 733*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 734*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 735*6651d4c0SJason Zhu } 736ae8ec5e1SHisping Lin 737ae8ec5e1SHisping Lin debug("testmm start\n"); 738ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 739ae8ec5e1SHisping Lin 740ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 741ae8ec5e1SHisping Lin 7423251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7433251364cSHisping Lin TEEC_NONE, 7443251364cSHisping Lin TEEC_NONE, 7453251364cSHisping Lin TEEC_NONE); 7463251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 7473251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 7483251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7493251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7503251364cSHisping Lin #endif 7513251364cSHisping Lin 752ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 753ae8ec5e1SHisping Lin &TeecSession, 754ae8ec5e1SHisping Lin TeecUuid, 755ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 756ae8ec5e1SHisping Lin NULL, 7573251364cSHisping Lin &TeecOperation, 758ae8ec5e1SHisping Lin &ErrorOrigin); 759ae8ec5e1SHisping Lin 760ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 761ae8ec5e1SHisping Lin 762ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 763ae8ec5e1SHisping Lin SharedMem0.flags = 0; 764ae8ec5e1SHisping Lin 765ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 766ae8ec5e1SHisping Lin 767ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 768ae8ec5e1SHisping Lin 769ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 770ae8ec5e1SHisping Lin 771ae8ec5e1SHisping Lin SharedMem1.size = 1; 772ae8ec5e1SHisping Lin SharedMem1.flags = 0; 773ae8ec5e1SHisping Lin 774ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 775ae8ec5e1SHisping Lin 776ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size); 777ae8ec5e1SHisping Lin 778ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 779ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 780ae8ec5e1SHisping Lin 781ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 782ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 783ae8ec5e1SHisping Lin 784ae8ec5e1SHisping Lin 785ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 786ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 787ae8ec5e1SHisping Lin TEEC_NONE, 788ae8ec5e1SHisping Lin TEEC_NONE); 789ae8ec5e1SHisping Lin 790ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 791ae8ec5e1SHisping Lin 1, 792ae8ec5e1SHisping Lin &TeecOperation, 793ae8ec5e1SHisping Lin &ErrorOrigin); 794ae8ec5e1SHisping Lin 795ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 796ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 797ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 79846b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 799ae8ec5e1SHisping Lin debug("testmm end\n"); 800ae8ec5e1SHisping Lin 801ae8ec5e1SHisping Lin return TeecResult; 802ae8ec5e1SHisping Lin } 803ae8ec5e1SHisping Lin 80478ef5fbdSqiujian TEEC_Result read_from_keymaster(uint8_t *filename, 80578ef5fbdSqiujian uint32_t filename_size, 80678ef5fbdSqiujian uint8_t *data, 80778ef5fbdSqiujian uint32_t size) 80878ef5fbdSqiujian { 80978ef5fbdSqiujian TEEC_Result TeecResult; 81078ef5fbdSqiujian TEEC_Context TeecContext; 81178ef5fbdSqiujian TEEC_Session TeecSession; 81278ef5fbdSqiujian uint32_t ErrorOrigin; 81378ef5fbdSqiujian TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 81478ef5fbdSqiujian { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 81578ef5fbdSqiujian TEEC_UUID *TeecUuid = &tempuuid; 81678ef5fbdSqiujian TEEC_Operation TeecOperation = {0}; 81778ef5fbdSqiujian struct blk_desc *dev_desc; 81878ef5fbdSqiujian dev_desc = rockchip_get_bootdev(); 819*6651d4c0SJason Zhu if (!dev_desc) { 820*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 821*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 822*6651d4c0SJason Zhu } 82378ef5fbdSqiujian 82478ef5fbdSqiujian debug("read_from_keymaster start\n"); 82578ef5fbdSqiujian OpteeClientApiLibInitialize(); 82678ef5fbdSqiujian 82778ef5fbdSqiujian TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 82878ef5fbdSqiujian 82978ef5fbdSqiujian TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 83078ef5fbdSqiujian TEEC_NONE, 83178ef5fbdSqiujian TEEC_NONE, 83278ef5fbdSqiujian TEEC_NONE); 83378ef5fbdSqiujian /*0 nand or emmc "security" partition , 1 rpmb*/ 83478ef5fbdSqiujian TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 83578ef5fbdSqiujian #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 83678ef5fbdSqiujian TeecOperation.params[0].value.a = 0; 83778ef5fbdSqiujian #endif 83878ef5fbdSqiujian 83978ef5fbdSqiujian TeecResult = TEEC_OpenSession(&TeecContext, 84078ef5fbdSqiujian &TeecSession, 84178ef5fbdSqiujian TeecUuid, 84278ef5fbdSqiujian TEEC_LOGIN_PUBLIC, 84378ef5fbdSqiujian NULL, 84478ef5fbdSqiujian &TeecOperation, 84578ef5fbdSqiujian &ErrorOrigin); 84678ef5fbdSqiujian 84778ef5fbdSqiujian TEEC_SharedMemory SharedMem0 = {0}; 84878ef5fbdSqiujian 84978ef5fbdSqiujian SharedMem0.size = filename_size; 85078ef5fbdSqiujian SharedMem0.flags = 0; 85178ef5fbdSqiujian 85278ef5fbdSqiujian TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 85378ef5fbdSqiujian 85478ef5fbdSqiujian memcpy(SharedMem0.buffer, filename, SharedMem0.size); 85578ef5fbdSqiujian 85678ef5fbdSqiujian TEEC_SharedMemory SharedMem1 = {0}; 85778ef5fbdSqiujian 85878ef5fbdSqiujian SharedMem1.size = size; 85978ef5fbdSqiujian SharedMem1.flags = 0; 86078ef5fbdSqiujian 86178ef5fbdSqiujian TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 86278ef5fbdSqiujian 86378ef5fbdSqiujian TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 86478ef5fbdSqiujian TeecOperation.params[0].tmpref.size = SharedMem0.size; 86578ef5fbdSqiujian 86678ef5fbdSqiujian TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 86778ef5fbdSqiujian TeecOperation.params[1].tmpref.size = SharedMem1.size; 86878ef5fbdSqiujian 86978ef5fbdSqiujian 87078ef5fbdSqiujian TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 87178ef5fbdSqiujian TEEC_MEMREF_TEMP_INOUT, 87278ef5fbdSqiujian TEEC_NONE, 87378ef5fbdSqiujian TEEC_NONE); 87478ef5fbdSqiujian 87578ef5fbdSqiujian TeecResult = TEEC_InvokeCommand(&TeecSession, 87678ef5fbdSqiujian 142, 87778ef5fbdSqiujian &TeecOperation, 87878ef5fbdSqiujian &ErrorOrigin); 87978ef5fbdSqiujian if (TeecResult == TEEC_SUCCESS) 88078ef5fbdSqiujian memcpy(data, SharedMem1.buffer, SharedMem1.size); 88178ef5fbdSqiujian TEEC_ReleaseSharedMemory(&SharedMem0); 88278ef5fbdSqiujian TEEC_ReleaseSharedMemory(&SharedMem1); 88378ef5fbdSqiujian TEEC_CloseSession(&TeecSession); 88478ef5fbdSqiujian TEEC_FinalizeContext(&TeecContext); 88578ef5fbdSqiujian debug("read_from_keymaster end\n"); 88678ef5fbdSqiujian 88778ef5fbdSqiujian return TeecResult; 88878ef5fbdSqiujian } 88978ef5fbdSqiujian 890ae8ec5e1SHisping Lin uint32_t write_to_keymaster(uint8_t *filename, 891ae8ec5e1SHisping Lin uint32_t filename_size, 892ae8ec5e1SHisping Lin uint8_t *data, 893ae8ec5e1SHisping Lin uint32_t data_size) 894ae8ec5e1SHisping Lin { 895ae8ec5e1SHisping Lin TEEC_Result TeecResult; 896ae8ec5e1SHisping Lin TEEC_Context TeecContext; 897ae8ec5e1SHisping Lin TEEC_Session TeecSession; 898ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 899ae8ec5e1SHisping Lin 900ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 901ae8ec5e1SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 902ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 903ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 9043251364cSHisping Lin struct blk_desc *dev_desc; 9053251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 906*6651d4c0SJason Zhu if (!dev_desc) { 907*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 908*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 909*6651d4c0SJason Zhu } 910ae8ec5e1SHisping Lin 911ae8ec5e1SHisping Lin debug("write_to_keymaster\n"); 912ae8ec5e1SHisping Lin OpteeClientApiLibInitialize(); 913ae8ec5e1SHisping Lin 914ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 915ae8ec5e1SHisping Lin 9163251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9173251364cSHisping Lin TEEC_NONE, 9183251364cSHisping Lin TEEC_NONE, 9193251364cSHisping Lin TEEC_NONE); 9203251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 9213251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 9223251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9233251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9243251364cSHisping Lin #endif 9253251364cSHisping Lin 926ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 927ae8ec5e1SHisping Lin &TeecSession, 928ae8ec5e1SHisping Lin TeecUuid, 929ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 930ae8ec5e1SHisping Lin NULL, 9313251364cSHisping Lin &TeecOperation, 932ae8ec5e1SHisping Lin &ErrorOrigin); 933ae8ec5e1SHisping Lin 934ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 935ae8ec5e1SHisping Lin 936ae8ec5e1SHisping Lin SharedMem0.size = filename_size; 937ae8ec5e1SHisping Lin SharedMem0.flags = 0; 938ae8ec5e1SHisping Lin 939ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 940ae8ec5e1SHisping Lin 941ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, filename, SharedMem0.size); 942ae8ec5e1SHisping Lin 943ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 944ae8ec5e1SHisping Lin 945ae8ec5e1SHisping Lin SharedMem1.size = data_size; 946ae8ec5e1SHisping Lin SharedMem1.flags = 0; 947ae8ec5e1SHisping Lin 948ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 949ae8ec5e1SHisping Lin 950ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, data, SharedMem1.size); 951ae8ec5e1SHisping Lin 952ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 953ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 954ae8ec5e1SHisping Lin 955ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 956ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 957ae8ec5e1SHisping Lin 958ae8ec5e1SHisping Lin 959ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 960ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 961ae8ec5e1SHisping Lin TEEC_NONE, 962ae8ec5e1SHisping Lin TEEC_NONE); 963ae8ec5e1SHisping Lin 964ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 9651f25ada2SHisping Lin 141, 966ae8ec5e1SHisping Lin &TeecOperation, 967ae8ec5e1SHisping Lin &ErrorOrigin); 968ae8ec5e1SHisping Lin 969ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 970ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 971ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 97246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 97378ef5fbdSqiujian debug("write_to_keymaster end\n"); 974ae8ec5e1SHisping Lin debug("TeecResult %x\n", TeecResult); 975ae8ec5e1SHisping Lin 976ae8ec5e1SHisping Lin return TeecResult; 977ae8ec5e1SHisping Lin } 9786ef445a4SHisping Lin 9796ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 9806ef445a4SHisping Lin { 9816ef445a4SHisping Lin TEEC_Result TeecResult; 9826ef445a4SHisping Lin TEEC_Context TeecContext; 9836ef445a4SHisping Lin TEEC_Session TeecSession; 9846ef445a4SHisping Lin uint32_t ErrorOrigin; 9856ef445a4SHisping Lin 9866ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 9876ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 9886ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 9896ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 9906ef445a4SHisping Lin 9916ef445a4SHisping Lin OpteeClientApiLibInitialize(); 9926ef445a4SHisping Lin 9936ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 9946ef445a4SHisping Lin 9956ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 9966ef445a4SHisping Lin &TeecSession, 9976ef445a4SHisping Lin TeecUuid, 9986ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 9996ef445a4SHisping Lin NULL, 10006ef445a4SHisping Lin NULL, 10016ef445a4SHisping Lin &ErrorOrigin); 10026ef445a4SHisping Lin 10036ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 10046ef445a4SHisping Lin 10056ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 10066ef445a4SHisping Lin SharedMem0.flags = 0; 10076ef445a4SHisping Lin 10086ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 10096ef445a4SHisping Lin 10106ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 10116ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 10126ef445a4SHisping Lin 10136ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 10146ef445a4SHisping Lin TEEC_NONE, 10156ef445a4SHisping Lin TEEC_NONE, 10166ef445a4SHisping Lin TEEC_NONE); 10176ef445a4SHisping Lin 10186ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 10196ef445a4SHisping Lin 0, 10206ef445a4SHisping Lin &TeecOperation, 10216ef445a4SHisping Lin &ErrorOrigin); 10226ef445a4SHisping Lin 10236ef445a4SHisping Lin if (TeecResult == TEEC_SUCCESS) 10246ef445a4SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 10256ef445a4SHisping Lin 10266ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 10276ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 10286ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 10296ef445a4SHisping Lin 10306ef445a4SHisping Lin return TeecResult; 10316ef445a4SHisping Lin } 10326ef445a4SHisping Lin 10336ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 10346ef445a4SHisping Lin { 10356ef445a4SHisping Lin TEEC_Result TeecResult; 10366ef445a4SHisping Lin TEEC_Context TeecContext; 10376ef445a4SHisping Lin TEEC_Session TeecSession; 10386ef445a4SHisping Lin uint32_t ErrorOrigin; 10396ef445a4SHisping Lin 10406ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 10416ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 10426ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 10436ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 10446ef445a4SHisping Lin 10456ef445a4SHisping Lin OpteeClientApiLibInitialize(); 10466ef445a4SHisping Lin 10476ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 10486ef445a4SHisping Lin 10496ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 10506ef445a4SHisping Lin &TeecSession, 10516ef445a4SHisping Lin TeecUuid, 10526ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 10536ef445a4SHisping Lin NULL, 10546ef445a4SHisping Lin NULL, 10556ef445a4SHisping Lin &ErrorOrigin); 10566ef445a4SHisping Lin 10576ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 10586ef445a4SHisping Lin 10596ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 10606ef445a4SHisping Lin SharedMem0.flags = 0; 10616ef445a4SHisping Lin 10626ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 10636ef445a4SHisping Lin 10646ef445a4SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 10656ef445a4SHisping Lin 10666ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 10676ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 10686ef445a4SHisping Lin 10696ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 10706ef445a4SHisping Lin TEEC_NONE, 10716ef445a4SHisping Lin TEEC_NONE, 10726ef445a4SHisping Lin TEEC_NONE); 10736ef445a4SHisping Lin 10746ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 10756ef445a4SHisping Lin 1, 10766ef445a4SHisping Lin &TeecOperation, 10776ef445a4SHisping Lin &ErrorOrigin); 10786ef445a4SHisping Lin 10796ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 10806ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 10816ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 10826ef445a4SHisping Lin 10836ef445a4SHisping Lin return TeecResult; 10846ef445a4SHisping Lin } 108516539616SHisping Lin 108616539616SHisping Lin uint32_t notify_optee_rpmb_ta(void) 108716539616SHisping Lin { 108816539616SHisping Lin TEEC_Result TeecResult; 108916539616SHisping Lin TEEC_Context TeecContext; 109016539616SHisping Lin TEEC_Session TeecSession; 109116539616SHisping Lin uint32_t ErrorOrigin; 109216539616SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 109316539616SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 109416539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 109516539616SHisping Lin TEEC_Operation TeecOperation = {0}; 109616539616SHisping Lin 109716539616SHisping Lin OpteeClientApiLibInitialize(); 109816539616SHisping Lin 109916539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 110016539616SHisping Lin 110116539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 110216539616SHisping Lin &TeecSession, 110316539616SHisping Lin TeecUuid, 110416539616SHisping Lin TEEC_LOGIN_PUBLIC, 110516539616SHisping Lin NULL, 110616539616SHisping Lin NULL, 110716539616SHisping Lin &ErrorOrigin); 110816539616SHisping Lin 110916539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 111016539616SHisping Lin TEEC_NONE, 111116539616SHisping Lin TEEC_NONE, 111216539616SHisping Lin TEEC_NONE); 111316539616SHisping Lin 111416539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 111516539616SHisping Lin 2, 111616539616SHisping Lin &TeecOperation, 111716539616SHisping Lin &ErrorOrigin); 111816539616SHisping Lin 111916539616SHisping Lin TEEC_CloseSession(&TeecSession); 112016539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 112116539616SHisping Lin 112216539616SHisping Lin return TeecResult; 112316539616SHisping Lin } 112416539616SHisping Lin 112516539616SHisping Lin uint32_t notify_optee_efuse_ta(void) 112616539616SHisping Lin { 112716539616SHisping Lin TEEC_Result TeecResult; 112816539616SHisping Lin TEEC_Context TeecContext; 112916539616SHisping Lin TEEC_Session TeecSession; 113016539616SHisping Lin uint32_t ErrorOrigin; 113116539616SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 113216539616SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 113316539616SHisping Lin 113416539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 113516539616SHisping Lin TEEC_Operation TeecOperation = {0}; 113616539616SHisping Lin 113716539616SHisping Lin OpteeClientApiLibInitialize(); 113816539616SHisping Lin 113916539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 114016539616SHisping Lin 114116539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 114216539616SHisping Lin &TeecSession, 114316539616SHisping Lin TeecUuid, 114416539616SHisping Lin TEEC_LOGIN_PUBLIC, 114516539616SHisping Lin NULL, 114616539616SHisping Lin NULL, 114716539616SHisping Lin &ErrorOrigin); 114816539616SHisping Lin 114916539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 115016539616SHisping Lin TEEC_NONE, 115116539616SHisping Lin TEEC_NONE, 115216539616SHisping Lin TEEC_NONE); 115316539616SHisping Lin 115416539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 115516539616SHisping Lin 2, 115616539616SHisping Lin &TeecOperation, 115716539616SHisping Lin &ErrorOrigin); 115816539616SHisping Lin 115916539616SHisping Lin TEEC_CloseSession(&TeecSession); 116016539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 116116539616SHisping Lin 116216539616SHisping Lin return TeecResult; 116316539616SHisping Lin } 116416539616SHisping Lin 116516539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 116616539616SHisping Lin { 116716539616SHisping Lin TEEC_Result res; 116816539616SHisping Lin res = notify_optee_rpmb_ta(); 116916539616SHisping Lin res |= notify_optee_efuse_ta(); 117016539616SHisping Lin return res; 117116539616SHisping Lin } 11722cd27853SHisping Lin 11732cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 11742cd27853SHisping Lin { 11752cd27853SHisping Lin TEEC_Result TeecResult; 11762cd27853SHisping Lin TEEC_Context TeecContext; 11772cd27853SHisping Lin TEEC_Session TeecSession; 11782cd27853SHisping Lin uint32_t ErrorOrigin; 11792cd27853SHisping Lin 11802cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 11812cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 11822cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 11832cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 11842cd27853SHisping Lin 11852cd27853SHisping Lin OpteeClientApiLibInitialize(); 11862cd27853SHisping Lin 11872cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 11882cd27853SHisping Lin 11892cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 11902cd27853SHisping Lin &TeecSession, 11912cd27853SHisping Lin TeecUuid, 11922cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 11932cd27853SHisping Lin NULL, 11942cd27853SHisping Lin NULL, 11952cd27853SHisping Lin &ErrorOrigin); 11962cd27853SHisping Lin 11972cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 11982cd27853SHisping Lin 11992cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 12002cd27853SHisping Lin SharedMem0.flags = 0; 12012cd27853SHisping Lin 12022cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 12032cd27853SHisping Lin 12042cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12052cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 12062cd27853SHisping Lin 12072cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 12082cd27853SHisping Lin TEEC_NONE, 12092cd27853SHisping Lin TEEC_NONE, 12102cd27853SHisping Lin TEEC_NONE); 12112cd27853SHisping Lin 12122cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 12132cd27853SHisping Lin 3, 12142cd27853SHisping Lin &TeecOperation, 12152cd27853SHisping Lin &ErrorOrigin); 12162cd27853SHisping Lin 12172cd27853SHisping Lin if (TeecResult == TEEC_SUCCESS) 12182cd27853SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 12192cd27853SHisping Lin 12202cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 12212cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 12222cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 12232cd27853SHisping Lin 12242cd27853SHisping Lin return TeecResult; 12252cd27853SHisping Lin } 12262cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 12272cd27853SHisping Lin { 12282cd27853SHisping Lin TEEC_Result TeecResult; 12292cd27853SHisping Lin TEEC_Context TeecContext; 12302cd27853SHisping Lin TEEC_Session TeecSession; 12312cd27853SHisping Lin uint32_t ErrorOrigin; 12322cd27853SHisping Lin 12332cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 12342cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 12352cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 12362cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 12372cd27853SHisping Lin 12382cd27853SHisping Lin OpteeClientApiLibInitialize(); 12392cd27853SHisping Lin 12402cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 12412cd27853SHisping Lin 12422cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 12432cd27853SHisping Lin &TeecSession, 12442cd27853SHisping Lin TeecUuid, 12452cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 12462cd27853SHisping Lin NULL, 12472cd27853SHisping Lin NULL, 12482cd27853SHisping Lin &ErrorOrigin); 12492cd27853SHisping Lin 12502cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 12512cd27853SHisping Lin 12522cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 12532cd27853SHisping Lin SharedMem0.flags = 0; 12542cd27853SHisping Lin 12552cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 12562cd27853SHisping Lin 12572cd27853SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 12582cd27853SHisping Lin 12592cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12602cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 12612cd27853SHisping Lin 12622cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 12632cd27853SHisping Lin TEEC_NONE, 12642cd27853SHisping Lin TEEC_NONE, 12652cd27853SHisping Lin TEEC_NONE); 12662cd27853SHisping Lin 12672cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 12682cd27853SHisping Lin 4, 12692cd27853SHisping Lin &TeecOperation, 12702cd27853SHisping Lin &ErrorOrigin); 12712cd27853SHisping Lin 12722cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 12732cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 12742cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 12752cd27853SHisping Lin 12762cd27853SHisping Lin return TeecResult; 12772cd27853SHisping Lin } 1278095e2a82SHisping Lin 1279468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 1280468df3b2SHisping Lin { 1281468df3b2SHisping Lin TEEC_Result TeecResult; 1282468df3b2SHisping Lin TEEC_Context TeecContext; 1283468df3b2SHisping Lin TEEC_Session TeecSession; 1284468df3b2SHisping Lin uint32_t ErrorOrigin; 1285468df3b2SHisping Lin uint32_t bootflag; 1286468df3b2SHisping Lin 1287468df3b2SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 1288468df3b2SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1289468df3b2SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1290468df3b2SHisping Lin TEEC_Operation TeecOperation = {0}; 1291468df3b2SHisping Lin 1292468df3b2SHisping Lin OpteeClientApiLibInitialize(); 1293468df3b2SHisping Lin 1294468df3b2SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1295468df3b2SHisping Lin 1296468df3b2SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1297468df3b2SHisping Lin &TeecSession, 1298468df3b2SHisping Lin TeecUuid, 1299468df3b2SHisping Lin TEEC_LOGIN_PUBLIC, 1300468df3b2SHisping Lin NULL, 1301468df3b2SHisping Lin NULL, 1302468df3b2SHisping Lin &ErrorOrigin); 1303468df3b2SHisping Lin 1304468df3b2SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1305468df3b2SHisping Lin 1306468df3b2SHisping Lin SharedMem0.size = 1 * sizeof(uint32_t); 1307468df3b2SHisping Lin SharedMem0.flags = 0; 1308468df3b2SHisping Lin 1309468df3b2SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1310468df3b2SHisping Lin 1311468df3b2SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1312468df3b2SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1313468df3b2SHisping Lin 1314468df3b2SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 1315468df3b2SHisping Lin TEEC_NONE, 1316468df3b2SHisping Lin TEEC_NONE, 1317468df3b2SHisping Lin TEEC_NONE); 1318468df3b2SHisping Lin 1319468df3b2SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1320468df3b2SHisping Lin 5, 1321468df3b2SHisping Lin &TeecOperation, 1322468df3b2SHisping Lin &ErrorOrigin); 1323468df3b2SHisping Lin 1324468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 1325468df3b2SHisping Lin memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size); 1326468df3b2SHisping Lin if (bootflag == 0x000000FF) 1327468df3b2SHisping Lin *flag = 1; 1328468df3b2SHisping Lin } 1329468df3b2SHisping Lin 1330468df3b2SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1331468df3b2SHisping Lin TEEC_CloseSession(&TeecSession); 1332468df3b2SHisping Lin TEEC_FinalizeContext(&TeecContext); 1333468df3b2SHisping Lin 1334468df3b2SHisping Lin return TeecResult; 1335468df3b2SHisping Lin } 1336468df3b2SHisping Lin 1337095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 1338095e2a82SHisping Lin { 1339095e2a82SHisping Lin TEEC_Result TeecResult; 1340095e2a82SHisping Lin TEEC_Context TeecContext; 1341095e2a82SHisping Lin TEEC_Session TeecSession; 1342095e2a82SHisping Lin uint32_t ErrorOrigin; 1343095e2a82SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 1344095e2a82SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 1345095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1346095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 13473251364cSHisping Lin struct blk_desc *dev_desc; 13483251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1349*6651d4c0SJason Zhu if (!dev_desc) { 1350*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1351*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1352*6651d4c0SJason Zhu } 1353095e2a82SHisping Lin 1354095e2a82SHisping Lin debug("testmm start\n"); 1355095e2a82SHisping Lin OpteeClientApiLibInitialize(); 1356095e2a82SHisping Lin 1357095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1358095e2a82SHisping Lin 13593251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 13603251364cSHisping Lin TEEC_NONE, 13613251364cSHisping Lin TEEC_NONE, 13623251364cSHisping Lin TEEC_NONE); 13633251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 13643251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 13653251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 13663251364cSHisping Lin TeecOperation.params[0].value.a = 0; 13673251364cSHisping Lin #endif 13683251364cSHisping Lin 1369095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1370095e2a82SHisping Lin &TeecSession, 1371095e2a82SHisping Lin TeecUuid, 1372095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1373095e2a82SHisping Lin NULL, 13743251364cSHisping Lin &TeecOperation, 1375095e2a82SHisping Lin &ErrorOrigin); 1376095e2a82SHisping Lin 1377095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1378095e2a82SHisping Lin 1379095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1380095e2a82SHisping Lin SharedMem0.flags = 0; 1381095e2a82SHisping Lin 1382095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1383095e2a82SHisping Lin 1384095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1385095e2a82SHisping Lin 1386095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1387095e2a82SHisping Lin 1388095e2a82SHisping Lin SharedMem1.size = 1; 1389095e2a82SHisping Lin SharedMem1.flags = 0; 1390095e2a82SHisping Lin 1391095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1392095e2a82SHisping Lin 1393095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1394095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1395095e2a82SHisping Lin 1396095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1397095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1398095e2a82SHisping Lin 1399095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1400095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1401095e2a82SHisping Lin TEEC_NONE, 1402095e2a82SHisping Lin TEEC_NONE); 1403095e2a82SHisping Lin 1404095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1405095e2a82SHisping Lin 142, 1406095e2a82SHisping Lin &TeecOperation, 1407095e2a82SHisping Lin &ErrorOrigin); 1408095e2a82SHisping Lin if (TeecResult == TEEC_SUCCESS) 1409095e2a82SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 1410095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1411095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1412095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1413095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1414095e2a82SHisping Lin debug("testmm end\n"); 1415095e2a82SHisping Lin 1416095e2a82SHisping Lin return TeecResult; 1417095e2a82SHisping Lin } 1418095e2a82SHisping Lin 1419095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 1420095e2a82SHisping Lin { 1421095e2a82SHisping Lin TEEC_Result TeecResult; 1422095e2a82SHisping Lin TEEC_Context TeecContext; 1423095e2a82SHisping Lin TEEC_Session TeecSession; 1424095e2a82SHisping Lin uint32_t ErrorOrigin; 1425095e2a82SHisping Lin TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 1426095e2a82SHisping Lin { 0xa8, 0x69, 0x9c, 0xe6, 0x88, 0x6c, 0x5d, 0x5d } }; 1427095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1428095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 14293251364cSHisping Lin struct blk_desc *dev_desc; 14303251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1431*6651d4c0SJason Zhu if (!dev_desc) { 1432*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1433*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1434*6651d4c0SJason Zhu } 1435095e2a82SHisping Lin 1436095e2a82SHisping Lin debug("testmm start\n"); 1437095e2a82SHisping Lin OpteeClientApiLibInitialize(); 1438095e2a82SHisping Lin 1439095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1440095e2a82SHisping Lin 14413251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 14423251364cSHisping Lin TEEC_NONE, 14433251364cSHisping Lin TEEC_NONE, 14443251364cSHisping Lin TEEC_NONE); 14453251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 14463251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 14473251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 14483251364cSHisping Lin TeecOperation.params[0].value.a = 0; 14493251364cSHisping Lin #endif 14503251364cSHisping Lin 1451095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1452095e2a82SHisping Lin &TeecSession, 1453095e2a82SHisping Lin TeecUuid, 1454095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1455095e2a82SHisping Lin NULL, 14563251364cSHisping Lin &TeecOperation, 1457095e2a82SHisping Lin &ErrorOrigin); 1458095e2a82SHisping Lin 1459095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1460095e2a82SHisping Lin 1461095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1462095e2a82SHisping Lin SharedMem0.flags = 0; 1463095e2a82SHisping Lin 1464095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1465095e2a82SHisping Lin 1466095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1467095e2a82SHisping Lin 1468095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1469095e2a82SHisping Lin 1470095e2a82SHisping Lin SharedMem1.size = 1; 1471095e2a82SHisping Lin SharedMem1.flags = 0; 1472095e2a82SHisping Lin 1473095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1474095e2a82SHisping Lin 1475095e2a82SHisping Lin memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size); 1476095e2a82SHisping Lin 1477095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1478095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1479095e2a82SHisping Lin 1480095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1481095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1482095e2a82SHisping Lin 1483095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1484095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1485095e2a82SHisping Lin TEEC_NONE, 1486095e2a82SHisping Lin TEEC_NONE); 1487095e2a82SHisping Lin 1488095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1489095e2a82SHisping Lin 141, 1490095e2a82SHisping Lin &TeecOperation, 1491095e2a82SHisping Lin &ErrorOrigin); 1492095e2a82SHisping Lin 1493095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1494095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1495095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1496095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1497095e2a82SHisping Lin debug("testmm end\n"); 1498095e2a82SHisping Lin 1499095e2a82SHisping Lin return TeecResult; 1500095e2a82SHisping Lin } 15014aa61755SAndy Ye 15024aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 15034aa61755SAndy Ye { 15044aa61755SAndy Ye TEEC_Result TeecResult; 15054aa61755SAndy Ye TEEC_Context TeecContext; 15064aa61755SAndy Ye TEEC_Session TeecSession; 15074aa61755SAndy Ye uint32_t ErrorOrigin; 15084aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 15094aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 15104aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 15114aa61755SAndy Ye } 15124aa61755SAndy Ye }; 15134aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 15144aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 15153251364cSHisping Lin struct blk_desc *dev_desc; 15163251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1517*6651d4c0SJason Zhu if (!dev_desc) { 1518*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1519*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1520*6651d4c0SJason Zhu } 15214aa61755SAndy Ye 15224aa61755SAndy Ye OpteeClientApiLibInitialize(); 15234aa61755SAndy Ye 15244aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 15254aa61755SAndy Ye 15263251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15273251364cSHisping Lin TEEC_NONE, 15283251364cSHisping Lin TEEC_NONE, 15293251364cSHisping Lin TEEC_NONE); 15303251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 15313251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 15323251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15333251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15343251364cSHisping Lin #endif 15353251364cSHisping Lin 15364aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 15374aa61755SAndy Ye &TeecSession, 15384aa61755SAndy Ye TeecUuid, 15394aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 15404aa61755SAndy Ye NULL, 15413251364cSHisping Lin &TeecOperation, 15424aa61755SAndy Ye &ErrorOrigin); 15434aa61755SAndy Ye 15444aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 15454aa61755SAndy Ye 15464aa61755SAndy Ye SharedMem0.size = *dh_size; 15474aa61755SAndy Ye SharedMem0.flags = 0; 15484aa61755SAndy Ye 15494aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 15504aa61755SAndy Ye 15514aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 15524aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 15534aa61755SAndy Ye 15544aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 15554aa61755SAndy Ye TEEC_NONE, 15564aa61755SAndy Ye TEEC_NONE, 15574aa61755SAndy Ye TEEC_NONE); 15584aa61755SAndy Ye 15594aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 15604aa61755SAndy Ye 143, 15614aa61755SAndy Ye &TeecOperation, 15624aa61755SAndy Ye &ErrorOrigin); 15634aa61755SAndy Ye 15644aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 15654aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 15664aa61755SAndy Ye 15674aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 15684aa61755SAndy Ye 15694aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 15704aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 15714aa61755SAndy Ye 15724aa61755SAndy Ye return TeecResult; 15734aa61755SAndy Ye } 15744aa61755SAndy Ye 15754aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 15764aa61755SAndy Ye { 15774aa61755SAndy Ye TEEC_Result TeecResult; 15784aa61755SAndy Ye TEEC_Context TeecContext; 15794aa61755SAndy Ye TEEC_Session TeecSession; 15804aa61755SAndy Ye uint32_t ErrorOrigin; 15814aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 15824aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 15834aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 15844aa61755SAndy Ye } 15854aa61755SAndy Ye }; 15864aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 15874aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 15883251364cSHisping Lin struct blk_desc *dev_desc; 15893251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1590*6651d4c0SJason Zhu if (!dev_desc) { 1591*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1592*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1593*6651d4c0SJason Zhu } 15944aa61755SAndy Ye 15954aa61755SAndy Ye OpteeClientApiLibInitialize(); 15964aa61755SAndy Ye 15974aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 15984aa61755SAndy Ye 15993251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16003251364cSHisping Lin TEEC_NONE, 16013251364cSHisping Lin TEEC_NONE, 16023251364cSHisping Lin TEEC_NONE); 16033251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16043251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16053251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16063251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16073251364cSHisping Lin #endif 16083251364cSHisping Lin 16094aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 16104aa61755SAndy Ye &TeecSession, 16114aa61755SAndy Ye TeecUuid, 16124aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 16134aa61755SAndy Ye NULL, 16143251364cSHisping Lin &TeecOperation, 16154aa61755SAndy Ye &ErrorOrigin); 16164aa61755SAndy Ye 16174aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 16184aa61755SAndy Ye 16194aa61755SAndy Ye SharedMem0.size = *uuid_size; 16204aa61755SAndy Ye SharedMem0.flags = 0; 16214aa61755SAndy Ye 16224aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 16234aa61755SAndy Ye 16244aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 16254aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 16264aa61755SAndy Ye 16274aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 16284aa61755SAndy Ye TEEC_NONE, 16294aa61755SAndy Ye TEEC_NONE, 16304aa61755SAndy Ye TEEC_NONE); 16314aa61755SAndy Ye 16324aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 16334aa61755SAndy Ye 144, 16344aa61755SAndy Ye &TeecOperation, 16354aa61755SAndy Ye &ErrorOrigin); 16364aa61755SAndy Ye 16374aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 16384aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 16394aa61755SAndy Ye 16404aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 16414aa61755SAndy Ye 16424aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 16434aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 16444aa61755SAndy Ye 16454aa61755SAndy Ye return TeecResult; 16464aa61755SAndy Ye } 16474aa61755SAndy Ye 16484aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 16494aa61755SAndy Ye uint32_t *operation_size, 16504aa61755SAndy Ye uint8_t *out, 16514aa61755SAndy Ye uint32_t *out_len) 16524aa61755SAndy Ye { 16534aa61755SAndy Ye TEEC_Result TeecResult; 16544aa61755SAndy Ye TEEC_Context TeecContext; 16554aa61755SAndy Ye TEEC_Session TeecSession; 16564aa61755SAndy Ye uint32_t ErrorOrigin; 16574aa61755SAndy Ye 16584aa61755SAndy Ye OpteeClientApiLibInitialize(); 16594aa61755SAndy Ye 16604aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 16614aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 16624aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 16634aa61755SAndy Ye } 16644aa61755SAndy Ye }; 16654aa61755SAndy Ye 16664aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 16674aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 16683251364cSHisping Lin struct blk_desc *dev_desc; 16693251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1670*6651d4c0SJason Zhu if (!dev_desc) { 1671*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1672*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1673*6651d4c0SJason Zhu } 16744aa61755SAndy Ye 16754aa61755SAndy Ye OpteeClientApiLibInitialize(); 16764aa61755SAndy Ye 16774aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 16784aa61755SAndy Ye 16793251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16803251364cSHisping Lin TEEC_NONE, 16813251364cSHisping Lin TEEC_NONE, 16823251364cSHisping Lin TEEC_NONE); 16833251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 16843251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 16853251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16863251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16873251364cSHisping Lin #endif 16883251364cSHisping Lin 16894aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 16904aa61755SAndy Ye &TeecSession, 16914aa61755SAndy Ye TeecUuid, 16924aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 16934aa61755SAndy Ye NULL, 16943251364cSHisping Lin &TeecOperation, 16954aa61755SAndy Ye &ErrorOrigin); 16964aa61755SAndy Ye 16974aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 16984aa61755SAndy Ye 16994aa61755SAndy Ye SharedMem0.size = *operation_size; 17004aa61755SAndy Ye SharedMem0.flags = 0; 17014aa61755SAndy Ye 17024aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 17034aa61755SAndy Ye 17044aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 17054aa61755SAndy Ye 17064aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17074aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17084aa61755SAndy Ye 17094aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 17104aa61755SAndy Ye 17114aa61755SAndy Ye SharedMem1.size = *out_len; 17124aa61755SAndy Ye SharedMem1.flags = 0; 17134aa61755SAndy Ye 17144aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 17154aa61755SAndy Ye 17164aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 17174aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 17184aa61755SAndy Ye 17194aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17204aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 17214aa61755SAndy Ye TEEC_NONE, 17224aa61755SAndy Ye TEEC_NONE); 17234aa61755SAndy Ye 17244aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17254aa61755SAndy Ye 145, 17264aa61755SAndy Ye &TeecOperation, 17274aa61755SAndy Ye &ErrorOrigin); 17284aa61755SAndy Ye 17294aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 17304aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 17314aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17324aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 17334aa61755SAndy Ye 17344aa61755SAndy Ye return TeecResult; 17354aa61755SAndy Ye } 17364aa61755SAndy Ye 17374aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 17384aa61755SAndy Ye { 17394aa61755SAndy Ye TEEC_Result TeecResult; 17404aa61755SAndy Ye TEEC_Context TeecContext; 17414aa61755SAndy Ye TEEC_Session TeecSession; 17424aa61755SAndy Ye uint32_t ErrorOrigin; 17434aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17444aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17454aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17464aa61755SAndy Ye } 17474aa61755SAndy Ye }; 17484aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17494aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17503251364cSHisping Lin struct blk_desc *dev_desc; 17513251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1752*6651d4c0SJason Zhu if (!dev_desc) { 1753*6651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1754*6651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1755*6651d4c0SJason Zhu } 17564aa61755SAndy Ye 17574aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 17584aa61755SAndy Ye 17593251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17603251364cSHisping Lin TEEC_NONE, 17613251364cSHisping Lin TEEC_NONE, 17623251364cSHisping Lin TEEC_NONE); 17633251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 17643251364cSHisping Lin TeecOperation.params[0].value.a = (dev_desc->if_type == IF_TYPE_MMC) ? 1 : 0; 17653251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17663251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17673251364cSHisping Lin #endif 17683251364cSHisping Lin 17694aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17704aa61755SAndy Ye &TeecSession, 17714aa61755SAndy Ye TeecUuid, 17724aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17734aa61755SAndy Ye NULL, 17743251364cSHisping Lin &TeecOperation, 17754aa61755SAndy Ye &ErrorOrigin); 17764aa61755SAndy Ye 17774aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17784aa61755SAndy Ye 17794aa61755SAndy Ye SharedMem0.size = *ca_response_size; 17804aa61755SAndy Ye SharedMem0.flags = 0; 17814aa61755SAndy Ye 17824aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 17834aa61755SAndy Ye 17844aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 17854aa61755SAndy Ye 17864aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17874aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17884aa61755SAndy Ye 17894aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17904aa61755SAndy Ye TEEC_NONE, 17914aa61755SAndy Ye TEEC_NONE, 17924aa61755SAndy Ye TEEC_NONE); 17934aa61755SAndy Ye 17944aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17954aa61755SAndy Ye 146, 17964aa61755SAndy Ye &TeecOperation, 17974aa61755SAndy Ye &ErrorOrigin); 17984aa61755SAndy Ye 17994aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18004aa61755SAndy Ye 18014aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 18024aa61755SAndy Ye TeecResult = TEEC_FinalizeContext(&TeecContext); 18034aa61755SAndy Ye 18044aa61755SAndy Ye return TeecResult; 18054aa61755SAndy Ye } 180678ef5fbdSqiujian 180778ef5fbdSqiujian TEEC_Result trusty_write_oem_unlock(uint8_t unlock) 180878ef5fbdSqiujian { 180978ef5fbdSqiujian char *file = "oem.unlock"; 181078ef5fbdSqiujian TEEC_Result ret; 181178ef5fbdSqiujian 181278ef5fbdSqiujian ret = write_to_keymaster((uint8_t *)file, strlen(file), 181378ef5fbdSqiujian (uint8_t *)&unlock, 1); 181478ef5fbdSqiujian return ret; 181578ef5fbdSqiujian } 181678ef5fbdSqiujian 181778ef5fbdSqiujian TEEC_Result trusty_read_oem_unlock(uint8_t *unlock) 181878ef5fbdSqiujian { 181978ef5fbdSqiujian char *file = "oem.unlock"; 182078ef5fbdSqiujian TEEC_Result ret; 182178ef5fbdSqiujian 182278ef5fbdSqiujian ret = read_from_keymaster((uint8_t *)file, strlen(file), 182378ef5fbdSqiujian unlock, 1); 182478ef5fbdSqiujian 182578ef5fbdSqiujian if (ret == TEE_ERROR_ITEM_NOT_FOUND) { 182678ef5fbdSqiujian debug("init oem unlock status 0"); 182778ef5fbdSqiujian ret = trusty_write_oem_unlock(0); 182878ef5fbdSqiujian } 182978ef5fbdSqiujian 183078ef5fbdSqiujian return ret; 183178ef5fbdSqiujian }