1ae8ec5e1SHisping Lin /* 2ae8ec5e1SHisping Lin * Copyright 2017, Rockchip Electronics Co., Ltd 3ae8ec5e1SHisping Lin * hisping lin, <hisping.lin@rock-chips.com> 4ae8ec5e1SHisping Lin * 5ae8ec5e1SHisping Lin * SPDX-License-Identifier: GPL-2.0+ 6ae8ec5e1SHisping Lin */ 7ae8ec5e1SHisping Lin 8ae8ec5e1SHisping Lin #include <common.h> 9ae8ec5e1SHisping Lin #include <optee_include/OpteeClientApiLib.h> 10ae8ec5e1SHisping Lin #include <optee_include/tee_client_api.h> 1178ef5fbdSqiujian #include <optee_include/tee_api_defines.h> 123251364cSHisping Lin #include <boot_rkimg.h> 13a7df4868Stony.xu #include <stdlib.h> 141e8c0e44STony Xu #include <attestation_key.h> 15a7df4868Stony.xu 16a7df4868Stony.xu #define BOOT_FROM_EMMC (1 << 1) 17ae8ec5e1SHisping Lin 18f4e1db95SHisping Lin uint32_t test_optee(void) 19ae8ec5e1SHisping Lin { 20ae8ec5e1SHisping Lin TEEC_Result TeecResult; 21ae8ec5e1SHisping Lin TEEC_Context TeecContext; 22ae8ec5e1SHisping Lin TEEC_Session TeecSession; 23ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 24a7df4868Stony.xu TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, \ 25ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 26ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 27ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 283251364cSHisping Lin struct blk_desc *dev_desc; 293251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 306651d4c0SJason Zhu if (!dev_desc) { 316651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 32f4e1db95SHisping Lin return -TEEC_ERROR_GENERIC; 336651d4c0SJason Zhu } 34ae8ec5e1SHisping Lin 35f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 36f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 37f4e1db95SHisping Lin return TeecResult; 38ae8ec5e1SHisping Lin 39ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 40f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 41f4e1db95SHisping Lin return TeecResult; 42ae8ec5e1SHisping Lin 433251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 443251364cSHisping Lin TEEC_NONE, 453251364cSHisping Lin TEEC_NONE, 463251364cSHisping Lin TEEC_NONE); 473251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 48*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 49*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 50*b9a7e756SHisping Lin else 51*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 523251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 533251364cSHisping Lin TeecOperation.params[0].value.a = 0; 543251364cSHisping Lin #endif 553251364cSHisping Lin 56ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 57ae8ec5e1SHisping Lin &TeecSession, 58ae8ec5e1SHisping Lin TeecUuid, 59ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 60ae8ec5e1SHisping Lin NULL, 613251364cSHisping Lin &TeecOperation, 62ae8ec5e1SHisping Lin &ErrorOrigin); 63f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 64f4e1db95SHisping Lin return TeecResult; 65ae8ec5e1SHisping Lin 66ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 67ae8ec5e1SHisping Lin 68ae8ec5e1SHisping Lin SharedMem0.size = sizeof("filename_test"); 69ae8ec5e1SHisping Lin SharedMem0.flags = 0; 70ae8ec5e1SHisping Lin 71ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 72f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 73f4e1db95SHisping Lin goto exit; 74ae8ec5e1SHisping Lin 75ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size); 76ae8ec5e1SHisping Lin 77ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 78ae8ec5e1SHisping Lin 79ae8ec5e1SHisping Lin SharedMem1.size = 32; 80ae8ec5e1SHisping Lin SharedMem1.flags = 0; 81ae8ec5e1SHisping Lin 82ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 83f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 84f4e1db95SHisping Lin goto exit; 85ae8ec5e1SHisping Lin 86ae8ec5e1SHisping Lin memset(SharedMem1.buffer, 'a', SharedMem1.size); 87ae8ec5e1SHisping Lin 88ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 89ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 90ae8ec5e1SHisping Lin 91ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 92ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 93ae8ec5e1SHisping Lin 94ae8ec5e1SHisping Lin 95ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 96ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 97ae8ec5e1SHisping Lin TEEC_NONE, 98ae8ec5e1SHisping Lin TEEC_NONE); 99ae8ec5e1SHisping Lin 100ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 101ae8ec5e1SHisping Lin 1, 102ae8ec5e1SHisping Lin &TeecOperation, 103ae8ec5e1SHisping Lin &ErrorOrigin); 104f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 105f4e1db95SHisping Lin goto exit; 106f4e1db95SHisping Lin exit: 107ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 108ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 109ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 11046b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 111f4e1db95SHisping Lin return TeecResult; 112ae8ec5e1SHisping Lin } 113ae8ec5e1SHisping Lin 114ae8ec5e1SHisping Lin static uint8_t b2hs_add_base(uint8_t in) 115ae8ec5e1SHisping Lin { 116ae8ec5e1SHisping Lin if (in > 9) 117ae8ec5e1SHisping Lin return in + 55; 118ae8ec5e1SHisping Lin else 119ae8ec5e1SHisping Lin return in + 48; 120ae8ec5e1SHisping Lin } 121ae8ec5e1SHisping Lin 122ae8ec5e1SHisping Lin uint32_t b2hs(uint8_t *b, uint8_t *hs, uint32_t blen, uint32_t hslen) 123ae8ec5e1SHisping Lin { 124ae8ec5e1SHisping Lin uint32_t i = 0; 125ae8ec5e1SHisping Lin 126ae8ec5e1SHisping Lin if (blen * 2 + 1 > hslen) 127ae8ec5e1SHisping Lin return 0; 128ae8ec5e1SHisping Lin 129ae8ec5e1SHisping Lin for (; i < blen; i++) { 130ae8ec5e1SHisping Lin hs[i * 2 + 1] = b2hs_add_base(b[i] & 0xf); 131ae8ec5e1SHisping Lin hs[i * 2] = b2hs_add_base(b[i] >> 4); 132ae8ec5e1SHisping Lin } 133ae8ec5e1SHisping Lin hs[blen * 2] = 0; 134ae8ec5e1SHisping Lin 135ae8ec5e1SHisping Lin return blen * 2; 136ae8ec5e1SHisping Lin } 137ae8ec5e1SHisping Lin 138ae8ec5e1SHisping Lin 139ae8ec5e1SHisping Lin uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value) 140ae8ec5e1SHisping Lin { 141ae8ec5e1SHisping Lin TEEC_Result TeecResult; 142ae8ec5e1SHisping Lin TEEC_Context TeecContext; 143ae8ec5e1SHisping Lin TEEC_Session TeecSession; 144ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 145ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 146ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 147ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 148ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 149ae8ec5e1SHisping Lin uint8_t hs[9]; 150ae8ec5e1SHisping Lin 1513251364cSHisping Lin struct blk_desc *dev_desc; 1523251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 1536651d4c0SJason Zhu if (!dev_desc) { 1546651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 1556651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 1566651d4c0SJason Zhu } 1573251364cSHisping Lin 158ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 159f4e1db95SHisping Lin 160f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 161f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 162f4e1db95SHisping Lin return TeecResult; 163ae8ec5e1SHisping Lin 164ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 165f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 166f4e1db95SHisping Lin return TeecResult; 167ae8ec5e1SHisping Lin 1683251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 1693251364cSHisping Lin TEEC_NONE, 1703251364cSHisping Lin TEEC_NONE, 1713251364cSHisping Lin TEEC_NONE); 1723251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 173*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 174*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 175*b9a7e756SHisping Lin else 176*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1773251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 1783251364cSHisping Lin TeecOperation.params[0].value.a = 0; 1793251364cSHisping Lin #endif 1803251364cSHisping Lin 181ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 182ae8ec5e1SHisping Lin &TeecSession, 183ae8ec5e1SHisping Lin TeecUuid, 184ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 185ae8ec5e1SHisping Lin NULL, 1863251364cSHisping Lin &TeecOperation, 187ae8ec5e1SHisping Lin &ErrorOrigin); 188f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 189f4e1db95SHisping Lin return TeecResult; 190ae8ec5e1SHisping Lin 191ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 192ae8ec5e1SHisping Lin 193ae8ec5e1SHisping Lin SharedMem0.size = 8; 194ae8ec5e1SHisping Lin SharedMem0.flags = 0; 195ae8ec5e1SHisping Lin 196ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 197f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 198f4e1db95SHisping Lin goto exit; 199ae8ec5e1SHisping Lin 200ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 201ae8ec5e1SHisping Lin 202ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 203ae8ec5e1SHisping Lin 204ae8ec5e1SHisping Lin SharedMem1.size = 8; 205ae8ec5e1SHisping Lin SharedMem1.flags = 0; 206ae8ec5e1SHisping Lin 207ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 208f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 209f4e1db95SHisping Lin goto exit; 210ae8ec5e1SHisping Lin 211ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 212ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 213ae8ec5e1SHisping Lin 214ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 215ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 216ae8ec5e1SHisping Lin 217ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 218ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 219ae8ec5e1SHisping Lin TEEC_NONE, 220ae8ec5e1SHisping Lin TEEC_NONE); 221ae8ec5e1SHisping Lin 222ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 223ae8ec5e1SHisping Lin 0, 224ae8ec5e1SHisping Lin &TeecOperation, 225ae8ec5e1SHisping Lin &ErrorOrigin); 22646b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 227ae8ec5e1SHisping Lin memcpy((char *)value, SharedMem1.buffer, SharedMem1.size); 228f4e1db95SHisping Lin exit: 229ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 230ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 231ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 23246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 233ae8ec5e1SHisping Lin 234ae8ec5e1SHisping Lin return TeecResult; 235ae8ec5e1SHisping Lin } 236ae8ec5e1SHisping Lin 237ae8ec5e1SHisping Lin uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value) 238ae8ec5e1SHisping Lin { 239ae8ec5e1SHisping Lin TEEC_Result TeecResult; 240ae8ec5e1SHisping Lin TEEC_Context TeecContext; 241ae8ec5e1SHisping Lin TEEC_Session TeecSession; 242ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 243ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 244ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 245ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 246ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 247ae8ec5e1SHisping Lin uint8_t hs[9]; 2483251364cSHisping Lin struct blk_desc *dev_desc; 2493251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 2506651d4c0SJason Zhu if (!dev_desc) { 2516651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 2526651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 2536651d4c0SJason Zhu } 2543251364cSHisping Lin 255ae8ec5e1SHisping Lin b2hs((uint8_t *)&slot, hs, 4, 9); 256f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 257f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 258f4e1db95SHisping Lin return TeecResult; 259ae8ec5e1SHisping Lin 260ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 261f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 262f4e1db95SHisping Lin return TeecResult; 263ae8ec5e1SHisping Lin 2643251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 2653251364cSHisping Lin TEEC_NONE, 2663251364cSHisping Lin TEEC_NONE, 2673251364cSHisping Lin TEEC_NONE); 2683251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 269*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 270*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 271*b9a7e756SHisping Lin else 272*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 2733251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 2743251364cSHisping Lin TeecOperation.params[0].value.a = 0; 2753251364cSHisping Lin #endif 2763251364cSHisping Lin 277ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 278ae8ec5e1SHisping Lin &TeecSession, 279ae8ec5e1SHisping Lin TeecUuid, 280ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 281ae8ec5e1SHisping Lin NULL, 2823251364cSHisping Lin &TeecOperation, 283ae8ec5e1SHisping Lin &ErrorOrigin); 284f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 285f4e1db95SHisping Lin return TeecResult; 286ae8ec5e1SHisping Lin 287ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 288ae8ec5e1SHisping Lin 289ae8ec5e1SHisping Lin SharedMem0.size = 8; 290ae8ec5e1SHisping Lin SharedMem0.flags = 0; 291ae8ec5e1SHisping Lin 292ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 293f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 294f4e1db95SHisping Lin goto exit; 295ae8ec5e1SHisping Lin 296ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, hs, SharedMem0.size); 297ae8ec5e1SHisping Lin 298ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 299ae8ec5e1SHisping Lin 300ae8ec5e1SHisping Lin SharedMem1.size = 8; 301ae8ec5e1SHisping Lin SharedMem1.flags = 0; 302ae8ec5e1SHisping Lin 303ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 304f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 305f4e1db95SHisping Lin goto exit; 306ae8ec5e1SHisping Lin 307ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size); 308ae8ec5e1SHisping Lin 309ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 310ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 311ae8ec5e1SHisping Lin 312ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 313ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 314ae8ec5e1SHisping Lin 315ae8ec5e1SHisping Lin 316ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 317ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 318ae8ec5e1SHisping Lin TEEC_NONE, 319ae8ec5e1SHisping Lin TEEC_NONE); 320ae8ec5e1SHisping Lin 321ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 322ae8ec5e1SHisping Lin 1, 323ae8ec5e1SHisping Lin &TeecOperation, 324ae8ec5e1SHisping Lin &ErrorOrigin); 325f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 326f4e1db95SHisping Lin goto exit; 327f4e1db95SHisping Lin exit: 328ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 329ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 330ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 33146b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 332ae8ec5e1SHisping Lin 333ae8ec5e1SHisping Lin return TeecResult; 334ae8ec5e1SHisping Lin } 335ae8ec5e1SHisping Lin 336ae8ec5e1SHisping Lin uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size) 337ae8ec5e1SHisping Lin { 338ae8ec5e1SHisping Lin TEEC_Result TeecResult; 339ae8ec5e1SHisping Lin TEEC_Context TeecContext; 340ae8ec5e1SHisping Lin TEEC_Session TeecSession; 341ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 34299830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 34399830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 344ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 345ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 3463251364cSHisping Lin struct blk_desc *dev_desc; 3473251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 3486651d4c0SJason Zhu if (!dev_desc) { 3496651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 3506651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 3516651d4c0SJason Zhu } 352ae8ec5e1SHisping Lin 353f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 354f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 355f4e1db95SHisping Lin return TeecResult; 356ae8ec5e1SHisping Lin 357ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 358f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 359f4e1db95SHisping Lin return TeecResult; 360ae8ec5e1SHisping Lin 3613251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 3623251364cSHisping Lin TEEC_NONE, 3633251364cSHisping Lin TEEC_NONE, 3643251364cSHisping Lin TEEC_NONE); 3653251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 366*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 367*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 368*b9a7e756SHisping Lin else 369*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 370*b9a7e756SHisping Lin 3713251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 3723251364cSHisping Lin TeecOperation.params[0].value.a = 0; 3733251364cSHisping Lin #endif 3743251364cSHisping Lin 375ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 376ae8ec5e1SHisping Lin &TeecSession, 377ae8ec5e1SHisping Lin TeecUuid, 378ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 379ae8ec5e1SHisping Lin NULL, 3803251364cSHisping Lin &TeecOperation, 381ae8ec5e1SHisping Lin &ErrorOrigin); 382f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 383f4e1db95SHisping Lin return TeecResult; 384ae8ec5e1SHisping Lin 385ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 386ae8ec5e1SHisping Lin 387ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 388ae8ec5e1SHisping Lin SharedMem0.flags = 0; 389ae8ec5e1SHisping Lin 390ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 391f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 392f4e1db95SHisping Lin goto exit; 393ae8ec5e1SHisping Lin 394ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 395ae8ec5e1SHisping Lin 396ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 397ae8ec5e1SHisping Lin 398ae8ec5e1SHisping Lin SharedMem1.size = size; 399ae8ec5e1SHisping Lin SharedMem1.flags = 0; 400ae8ec5e1SHisping Lin 401ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 402f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 403f4e1db95SHisping Lin goto exit; 404ae8ec5e1SHisping Lin 405ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 406ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 407ae8ec5e1SHisping Lin 408ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 409ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 410ae8ec5e1SHisping Lin 411ae8ec5e1SHisping Lin 412ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 413ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 414ae8ec5e1SHisping Lin TEEC_NONE, 415ae8ec5e1SHisping Lin TEEC_NONE); 416ae8ec5e1SHisping Lin 417ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 41899830019SHisping Lin 0, 419ae8ec5e1SHisping Lin &TeecOperation, 420ae8ec5e1SHisping Lin &ErrorOrigin); 42146b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 422ae8ec5e1SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 423f4e1db95SHisping Lin exit: 424ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 425ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 426ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 42746b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 428ae8ec5e1SHisping Lin 429ae8ec5e1SHisping Lin return TeecResult; 430ae8ec5e1SHisping Lin } 431ae8ec5e1SHisping Lin 432ae8ec5e1SHisping Lin uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size) 433ae8ec5e1SHisping Lin { 434ae8ec5e1SHisping Lin TEEC_Result TeecResult; 435ae8ec5e1SHisping Lin TEEC_Context TeecContext; 436ae8ec5e1SHisping Lin TEEC_Session TeecSession; 437ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 43899830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 43999830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 440ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 441ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 4423251364cSHisping Lin struct blk_desc *dev_desc; 4433251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 4446651d4c0SJason Zhu if (!dev_desc) { 4456651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 4466651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 4476651d4c0SJason Zhu } 448ae8ec5e1SHisping Lin 449f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 450f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 451f4e1db95SHisping Lin return TeecResult; 452ae8ec5e1SHisping Lin 453ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 454f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 455f4e1db95SHisping Lin return TeecResult; 456ae8ec5e1SHisping Lin 4573251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 4583251364cSHisping Lin TEEC_NONE, 4593251364cSHisping Lin TEEC_NONE, 4603251364cSHisping Lin TEEC_NONE); 4613251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 462*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 463*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 464*b9a7e756SHisping Lin else 465*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 466*b9a7e756SHisping Lin 4673251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 4683251364cSHisping Lin TeecOperation.params[0].value.a = 0; 4693251364cSHisping Lin #endif 4703251364cSHisping Lin 471ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 472ae8ec5e1SHisping Lin &TeecSession, 473ae8ec5e1SHisping Lin TeecUuid, 474ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 475ae8ec5e1SHisping Lin NULL, 4763251364cSHisping Lin &TeecOperation, 477ae8ec5e1SHisping Lin &ErrorOrigin); 478f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 479f4e1db95SHisping Lin return TeecResult; 480ae8ec5e1SHisping Lin 481ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 482ae8ec5e1SHisping Lin 483ae8ec5e1SHisping Lin SharedMem0.size = sizeof("attributes"); 484ae8ec5e1SHisping Lin SharedMem0.flags = 0; 485ae8ec5e1SHisping Lin 486ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 487f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 488f4e1db95SHisping Lin goto exit; 489ae8ec5e1SHisping Lin 490ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "attributes", SharedMem0.size); 491ae8ec5e1SHisping Lin 492ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 493ae8ec5e1SHisping Lin 494ae8ec5e1SHisping Lin SharedMem1.size = size; 495ae8ec5e1SHisping Lin SharedMem1.flags = 0; 496ae8ec5e1SHisping Lin 497ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 498f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 499f4e1db95SHisping Lin goto exit; 500ae8ec5e1SHisping Lin 501ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, attributes, SharedMem1.size); 502ae8ec5e1SHisping Lin 503ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 504ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 505ae8ec5e1SHisping Lin 506ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 507ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 508ae8ec5e1SHisping Lin 509ae8ec5e1SHisping Lin 510ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 511ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 512ae8ec5e1SHisping Lin TEEC_NONE, 513ae8ec5e1SHisping Lin TEEC_NONE); 514ae8ec5e1SHisping Lin 515ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 51699830019SHisping Lin 1, 517ae8ec5e1SHisping Lin &TeecOperation, 518ae8ec5e1SHisping Lin &ErrorOrigin); 519f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 520f4e1db95SHisping Lin goto exit; 521f4e1db95SHisping Lin exit: 522ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 523ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 524ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 52546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 526ae8ec5e1SHisping Lin 527ae8ec5e1SHisping Lin return TeecResult; 528ae8ec5e1SHisping Lin } 529ae8ec5e1SHisping Lin 530564654ebSJason Zhu uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes, 531564654ebSJason Zhu uint32_t size) 532564654ebSJason Zhu { 533564654ebSJason Zhu TEEC_Result TeecResult; 534564654ebSJason Zhu TEEC_Context TeecContext; 535564654ebSJason Zhu TEEC_Session TeecSession; 536564654ebSJason Zhu uint32_t ErrorOrigin; 537564654ebSJason Zhu TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 538564654ebSJason Zhu { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 539564654ebSJason Zhu TEEC_UUID *TeecUuid = &tempuuid; 540564654ebSJason Zhu TEEC_Operation TeecOperation = {0}; 541564654ebSJason Zhu struct blk_desc *dev_desc; 542564654ebSJason Zhu 543564654ebSJason Zhu dev_desc = rockchip_get_bootdev(); 544564654ebSJason Zhu if (!dev_desc) { 545564654ebSJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 546564654ebSJason Zhu return -TEEC_ERROR_GENERIC; 547564654ebSJason Zhu } 548564654ebSJason Zhu 549f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 550f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 551f4e1db95SHisping Lin return TeecResult; 552f4e1db95SHisping Lin 553564654ebSJason Zhu TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 554f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 555f4e1db95SHisping Lin return TeecResult; 556f4e1db95SHisping Lin 557564654ebSJason Zhu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 558564654ebSJason Zhu TEEC_NONE, 559564654ebSJason Zhu TEEC_NONE, 560564654ebSJason Zhu TEEC_NONE); 561564654ebSJason Zhu /*0 nand or emmc "security" partition , 1 rpmb*/ 562*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 563*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 564*b9a7e756SHisping Lin else 565*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 566*b9a7e756SHisping Lin 567564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 568564654ebSJason Zhu TeecOperation.params[0].value.a = 0; 569564654ebSJason Zhu #endif 570564654ebSJason Zhu 571564654ebSJason Zhu TeecResult = TEEC_OpenSession(&TeecContext, 572564654ebSJason Zhu &TeecSession, 573564654ebSJason Zhu TeecUuid, 574564654ebSJason Zhu TEEC_LOGIN_PUBLIC, 575564654ebSJason Zhu NULL, 576564654ebSJason Zhu &TeecOperation, 577564654ebSJason Zhu &ErrorOrigin); 578f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 579f4e1db95SHisping Lin return TeecResult; 580564654ebSJason Zhu 581564654ebSJason Zhu TEEC_SharedMemory SharedMem0 = {0}; 582564654ebSJason Zhu 583564654ebSJason Zhu SharedMem0.size = sizeof("rsacer"); 584564654ebSJason Zhu SharedMem0.flags = 0; 585564654ebSJason Zhu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 586f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 587f4e1db95SHisping Lin goto exit; 588564654ebSJason Zhu memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size); 589564654ebSJason Zhu TEEC_SharedMemory SharedMem1 = {0}; 590564654ebSJason Zhu 591564654ebSJason Zhu SharedMem1.size = size; 592564654ebSJason Zhu SharedMem1.flags = 0; 593564654ebSJason Zhu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 594f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 595f4e1db95SHisping Lin goto exit; 596564654ebSJason Zhu TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 597564654ebSJason Zhu TeecOperation.params[0].tmpref.size = SharedMem0.size; 598564654ebSJason Zhu TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 599564654ebSJason Zhu TeecOperation.params[1].tmpref.size = SharedMem1.size; 600564654ebSJason Zhu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 601564654ebSJason Zhu TEEC_MEMREF_TEMP_INOUT, 602564654ebSJason Zhu TEEC_NONE, 603564654ebSJason Zhu TEEC_NONE); 604564654ebSJason Zhu 605564654ebSJason Zhu TeecResult = TEEC_InvokeCommand(&TeecSession, 606564654ebSJason Zhu 0, 607564654ebSJason Zhu &TeecOperation, 608564654ebSJason Zhu &ErrorOrigin); 609564654ebSJason Zhu if (TeecResult == TEEC_SUCCESS) 610564654ebSJason Zhu memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 611f4e1db95SHisping Lin exit: 612564654ebSJason Zhu TEEC_ReleaseSharedMemory(&SharedMem0); 613564654ebSJason Zhu TEEC_ReleaseSharedMemory(&SharedMem1); 614564654ebSJason Zhu TEEC_CloseSession(&TeecSession); 615564654ebSJason Zhu TEEC_FinalizeContext(&TeecContext); 616564654ebSJason Zhu 617564654ebSJason Zhu return TeecResult; 618564654ebSJason Zhu } 619564654ebSJason Zhu 620564654ebSJason Zhu uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes, 621564654ebSJason Zhu uint32_t size) 622564654ebSJason Zhu { 623564654ebSJason Zhu TEEC_Result TeecResult; 624564654ebSJason Zhu TEEC_Context TeecContext; 625564654ebSJason Zhu TEEC_Session TeecSession; 626564654ebSJason Zhu uint32_t ErrorOrigin; 627564654ebSJason Zhu TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 628564654ebSJason Zhu { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 629564654ebSJason Zhu TEEC_UUID *TeecUuid = &tempuuid; 630564654ebSJason Zhu TEEC_Operation TeecOperation = {0}; 631564654ebSJason Zhu struct blk_desc *dev_desc; 632564654ebSJason Zhu 633564654ebSJason Zhu dev_desc = rockchip_get_bootdev(); 634564654ebSJason Zhu if (!dev_desc) { 635564654ebSJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 636564654ebSJason Zhu return -TEEC_ERROR_GENERIC; 637564654ebSJason Zhu } 638564654ebSJason Zhu 639f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 640f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 641f4e1db95SHisping Lin return TeecResult; 642f4e1db95SHisping Lin 643564654ebSJason Zhu TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 644f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 645f4e1db95SHisping Lin return TeecResult; 646f4e1db95SHisping Lin 647564654ebSJason Zhu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 648564654ebSJason Zhu TEEC_NONE, 649564654ebSJason Zhu TEEC_NONE, 650564654ebSJason Zhu TEEC_NONE); 651564654ebSJason Zhu /*0 nand or emmc "security" partition , 1 rpmb*/ 652*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 653*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 654*b9a7e756SHisping Lin else 655*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 656*b9a7e756SHisping Lin 657564654ebSJason Zhu #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 658564654ebSJason Zhu TeecOperation.params[0].value.a = 0; 659564654ebSJason Zhu #endif 660564654ebSJason Zhu 661564654ebSJason Zhu TeecResult = TEEC_OpenSession(&TeecContext, 662564654ebSJason Zhu &TeecSession, 663564654ebSJason Zhu TeecUuid, 664564654ebSJason Zhu TEEC_LOGIN_PUBLIC, 665564654ebSJason Zhu NULL, 666564654ebSJason Zhu &TeecOperation, 667564654ebSJason Zhu &ErrorOrigin); 668f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 669f4e1db95SHisping Lin return TeecResult; 670564654ebSJason Zhu 671564654ebSJason Zhu TEEC_SharedMemory SharedMem0 = {0}; 672564654ebSJason Zhu 673564654ebSJason Zhu SharedMem0.size = sizeof("rsacer"); 674564654ebSJason Zhu SharedMem0.flags = 0; 675564654ebSJason Zhu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 676f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 677f4e1db95SHisping Lin goto exit; 678564654ebSJason Zhu memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size); 679564654ebSJason Zhu TEEC_SharedMemory SharedMem1 = {0}; 680564654ebSJason Zhu 681564654ebSJason Zhu SharedMem1.size = size; 682564654ebSJason Zhu SharedMem1.flags = 0; 683564654ebSJason Zhu TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 684f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 685f4e1db95SHisping Lin goto exit; 686564654ebSJason Zhu memcpy(SharedMem1.buffer, attributes, SharedMem1.size); 687564654ebSJason Zhu TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 688564654ebSJason Zhu TeecOperation.params[0].tmpref.size = SharedMem0.size; 689564654ebSJason Zhu TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 690564654ebSJason Zhu TeecOperation.params[1].tmpref.size = SharedMem1.size; 691564654ebSJason Zhu TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 692564654ebSJason Zhu TEEC_MEMREF_TEMP_INOUT, 693564654ebSJason Zhu TEEC_NONE, 694564654ebSJason Zhu TEEC_NONE); 695564654ebSJason Zhu 696564654ebSJason Zhu TeecResult = TEEC_InvokeCommand(&TeecSession, 697564654ebSJason Zhu 1, 698564654ebSJason Zhu &TeecOperation, 699564654ebSJason Zhu &ErrorOrigin); 700f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 701f4e1db95SHisping Lin goto exit; 702f4e1db95SHisping Lin exit: 703564654ebSJason Zhu TEEC_ReleaseSharedMemory(&SharedMem0); 704564654ebSJason Zhu TEEC_ReleaseSharedMemory(&SharedMem1); 705564654ebSJason Zhu TEEC_CloseSession(&TeecSession); 706564654ebSJason Zhu TEEC_FinalizeContext(&TeecContext); 707564654ebSJason Zhu 708564654ebSJason Zhu return TeecResult; 709564654ebSJason Zhu } 710564654ebSJason Zhu 711ae8ec5e1SHisping Lin uint32_t trusty_read_lock_state(uint8_t *lock_state) 712ae8ec5e1SHisping Lin { 713ae8ec5e1SHisping Lin TEEC_Result TeecResult; 714ae8ec5e1SHisping Lin TEEC_Context TeecContext; 715ae8ec5e1SHisping Lin TEEC_Session TeecSession; 716ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 717ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 718ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 719ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 720ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 7213251364cSHisping Lin struct blk_desc *dev_desc; 7223251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 7236651d4c0SJason Zhu if (!dev_desc) { 7246651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 7256651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 7266651d4c0SJason Zhu } 727ae8ec5e1SHisping Lin 728f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 729f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 730f4e1db95SHisping Lin return TeecResult; 731ae8ec5e1SHisping Lin 732ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 733f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 734f4e1db95SHisping Lin return TeecResult; 735ae8ec5e1SHisping Lin 7363251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 7373251364cSHisping Lin TEEC_NONE, 7383251364cSHisping Lin TEEC_NONE, 7393251364cSHisping Lin TEEC_NONE); 7403251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 741*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 742*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 743*b9a7e756SHisping Lin else 744*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 745*b9a7e756SHisping Lin 7463251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 7473251364cSHisping Lin TeecOperation.params[0].value.a = 0; 7483251364cSHisping Lin #endif 749ae8ec5e1SHisping Lin 750ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 751ae8ec5e1SHisping Lin &TeecSession, 752ae8ec5e1SHisping Lin TeecUuid, 753ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 754ae8ec5e1SHisping Lin NULL, 7553251364cSHisping Lin &TeecOperation, 756ae8ec5e1SHisping Lin &ErrorOrigin); 757f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 758f4e1db95SHisping Lin return TeecResult; 759ae8ec5e1SHisping Lin 760ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 761ae8ec5e1SHisping Lin 762ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 763ae8ec5e1SHisping Lin SharedMem0.flags = 0; 764ae8ec5e1SHisping Lin 765ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 766f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 767f4e1db95SHisping Lin goto exit; 768ae8ec5e1SHisping Lin 769ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 770ae8ec5e1SHisping Lin 771ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 772ae8ec5e1SHisping Lin 773ae8ec5e1SHisping Lin SharedMem1.size = 1; 774ae8ec5e1SHisping Lin SharedMem1.flags = 0; 775ae8ec5e1SHisping Lin 776ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 777f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 778f4e1db95SHisping Lin goto exit; 779ae8ec5e1SHisping Lin 780ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 781ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 782ae8ec5e1SHisping Lin 783ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 784ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 785ae8ec5e1SHisping Lin 786ae8ec5e1SHisping Lin 787ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 788ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 789ae8ec5e1SHisping Lin TEEC_NONE, 790ae8ec5e1SHisping Lin TEEC_NONE); 791ae8ec5e1SHisping Lin 792ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 793ae8ec5e1SHisping Lin 0, 794ae8ec5e1SHisping Lin &TeecOperation, 795ae8ec5e1SHisping Lin &ErrorOrigin); 79646b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 797ae8ec5e1SHisping Lin memcpy(lock_state, SharedMem1.buffer, SharedMem1.size); 798f4e1db95SHisping Lin exit: 799ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 800ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 801ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 80246b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 803ae8ec5e1SHisping Lin 804ae8ec5e1SHisping Lin return TeecResult; 805ae8ec5e1SHisping Lin } 806ae8ec5e1SHisping Lin 807ae8ec5e1SHisping Lin uint32_t trusty_write_lock_state(uint8_t lock_state) 808ae8ec5e1SHisping Lin { 809ae8ec5e1SHisping Lin TEEC_Result TeecResult; 810ae8ec5e1SHisping Lin TEEC_Context TeecContext; 811ae8ec5e1SHisping Lin TEEC_Session TeecSession; 812ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 813ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 814ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 815ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 816ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 8173251364cSHisping Lin struct blk_desc *dev_desc; 8183251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 8196651d4c0SJason Zhu if (!dev_desc) { 8206651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 8216651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 8226651d4c0SJason Zhu } 823ae8ec5e1SHisping Lin 824f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 825f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 826f4e1db95SHisping Lin return TeecResult; 827ae8ec5e1SHisping Lin 828ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 829f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 830f4e1db95SHisping Lin return TeecResult; 831ae8ec5e1SHisping Lin 8323251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 8333251364cSHisping Lin TEEC_NONE, 8343251364cSHisping Lin TEEC_NONE, 8353251364cSHisping Lin TEEC_NONE); 8363251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 837*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 838*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 839*b9a7e756SHisping Lin else 840*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 841*b9a7e756SHisping Lin 8423251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 8433251364cSHisping Lin TeecOperation.params[0].value.a = 0; 8443251364cSHisping Lin #endif 8453251364cSHisping Lin 846ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 847ae8ec5e1SHisping Lin &TeecSession, 848ae8ec5e1SHisping Lin TeecUuid, 849ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 850ae8ec5e1SHisping Lin NULL, 8513251364cSHisping Lin &TeecOperation, 852ae8ec5e1SHisping Lin &ErrorOrigin); 853f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 854f4e1db95SHisping Lin return TeecResult; 855ae8ec5e1SHisping Lin 856ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 857ae8ec5e1SHisping Lin 858ae8ec5e1SHisping Lin SharedMem0.size = sizeof("lock_state"); 859ae8ec5e1SHisping Lin SharedMem0.flags = 0; 860ae8ec5e1SHisping Lin 861ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 862f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 863f4e1db95SHisping Lin goto exit; 864ae8ec5e1SHisping Lin 865ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size); 866ae8ec5e1SHisping Lin 867ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 868ae8ec5e1SHisping Lin 869ae8ec5e1SHisping Lin SharedMem1.size = 1; 870ae8ec5e1SHisping Lin SharedMem1.flags = 0; 871ae8ec5e1SHisping Lin 872ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 873f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 874f4e1db95SHisping Lin goto exit; 875ae8ec5e1SHisping Lin 876ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size); 877ae8ec5e1SHisping Lin 878ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 879ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 880ae8ec5e1SHisping Lin 881ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 882ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 883ae8ec5e1SHisping Lin 884ae8ec5e1SHisping Lin 885ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 886ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 887ae8ec5e1SHisping Lin TEEC_NONE, 888ae8ec5e1SHisping Lin TEEC_NONE); 889ae8ec5e1SHisping Lin 890ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 891ae8ec5e1SHisping Lin 1, 892ae8ec5e1SHisping Lin &TeecOperation, 893ae8ec5e1SHisping Lin &ErrorOrigin); 894f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 895f4e1db95SHisping Lin goto exit; 896f4e1db95SHisping Lin exit: 897ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 898ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 899ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 90046b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 901ae8ec5e1SHisping Lin 902ae8ec5e1SHisping Lin return TeecResult; 903ae8ec5e1SHisping Lin } 904ae8ec5e1SHisping Lin 905ae8ec5e1SHisping Lin uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state) 906ae8ec5e1SHisping Lin { 907ae8ec5e1SHisping Lin TEEC_Result TeecResult; 908ae8ec5e1SHisping Lin TEEC_Context TeecContext; 909ae8ec5e1SHisping Lin TEEC_Session TeecSession; 910ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 911ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 912ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 913ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 914ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 9153251364cSHisping Lin struct blk_desc *dev_desc; 9163251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 9176651d4c0SJason Zhu if (!dev_desc) { 9186651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 9196651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 9206651d4c0SJason Zhu } 921ae8ec5e1SHisping Lin 922f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 923f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 924f4e1db95SHisping Lin return TeecResult; 925ae8ec5e1SHisping Lin 926ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 927f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 928f4e1db95SHisping Lin return TeecResult; 929ae8ec5e1SHisping Lin 9303251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 9313251364cSHisping Lin TEEC_NONE, 9323251364cSHisping Lin TEEC_NONE, 9333251364cSHisping Lin TEEC_NONE); 9343251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 935*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 936*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 937*b9a7e756SHisping Lin else 938*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 939*b9a7e756SHisping Lin 9403251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 9413251364cSHisping Lin TeecOperation.params[0].value.a = 0; 9423251364cSHisping Lin #endif 943ae8ec5e1SHisping Lin 944ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 945ae8ec5e1SHisping Lin &TeecSession, 946ae8ec5e1SHisping Lin TeecUuid, 947ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 948ae8ec5e1SHisping Lin NULL, 9493251364cSHisping Lin &TeecOperation, 950ae8ec5e1SHisping Lin &ErrorOrigin); 951f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 952f4e1db95SHisping Lin return TeecResult; 953ae8ec5e1SHisping Lin 954ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 955ae8ec5e1SHisping Lin 956ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 957ae8ec5e1SHisping Lin SharedMem0.flags = 0; 958ae8ec5e1SHisping Lin 959ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 960f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 961f4e1db95SHisping Lin goto exit; 962ae8ec5e1SHisping Lin 963ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 964ae8ec5e1SHisping Lin 965ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 966ae8ec5e1SHisping Lin 967ae8ec5e1SHisping Lin SharedMem1.size = 1; 968ae8ec5e1SHisping Lin SharedMem1.flags = 0; 969ae8ec5e1SHisping Lin 970ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 971f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 972f4e1db95SHisping Lin goto exit; 973ae8ec5e1SHisping Lin 974ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 975ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 976ae8ec5e1SHisping Lin 977ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 978ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 979ae8ec5e1SHisping Lin 980ae8ec5e1SHisping Lin 981ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 982ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 983ae8ec5e1SHisping Lin TEEC_NONE, 984ae8ec5e1SHisping Lin TEEC_NONE); 985ae8ec5e1SHisping Lin 986ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 987ae8ec5e1SHisping Lin 0, 988ae8ec5e1SHisping Lin &TeecOperation, 989ae8ec5e1SHisping Lin &ErrorOrigin); 99046b2a054SHisping Lin if (TeecResult == TEEC_SUCCESS) 991ae8ec5e1SHisping Lin memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size); 992f4e1db95SHisping Lin exit: 993ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 994ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 995ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 99646b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 997ae8ec5e1SHisping Lin 998ae8ec5e1SHisping Lin return TeecResult; 999ae8ec5e1SHisping Lin } 1000ae8ec5e1SHisping Lin 1001ae8ec5e1SHisping Lin 1002ae8ec5e1SHisping Lin uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state) 1003ae8ec5e1SHisping Lin { 1004ae8ec5e1SHisping Lin TEEC_Result TeecResult; 1005ae8ec5e1SHisping Lin TEEC_Context TeecContext; 1006ae8ec5e1SHisping Lin TEEC_Session TeecSession; 1007ae8ec5e1SHisping Lin uint32_t ErrorOrigin; 1008ae8ec5e1SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 1009ae8ec5e1SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1010ae8ec5e1SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1011ae8ec5e1SHisping Lin TEEC_Operation TeecOperation = {0}; 10123251364cSHisping Lin struct blk_desc *dev_desc; 10133251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 10146651d4c0SJason Zhu if (!dev_desc) { 10156651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 10166651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 10176651d4c0SJason Zhu } 1018ae8ec5e1SHisping Lin 1019f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1020f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1021f4e1db95SHisping Lin return TeecResult; 1022ae8ec5e1SHisping Lin 1023ae8ec5e1SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1024f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1025f4e1db95SHisping Lin return TeecResult; 1026ae8ec5e1SHisping Lin 10273251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 10283251364cSHisping Lin TEEC_NONE, 10293251364cSHisping Lin TEEC_NONE, 10303251364cSHisping Lin TEEC_NONE); 10313251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1032*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1033*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1034*b9a7e756SHisping Lin else 1035*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1036*b9a7e756SHisping Lin 10373251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 10383251364cSHisping Lin TeecOperation.params[0].value.a = 0; 10393251364cSHisping Lin #endif 10403251364cSHisping Lin 1041ae8ec5e1SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1042ae8ec5e1SHisping Lin &TeecSession, 1043ae8ec5e1SHisping Lin TeecUuid, 1044ae8ec5e1SHisping Lin TEEC_LOGIN_PUBLIC, 1045ae8ec5e1SHisping Lin NULL, 10463251364cSHisping Lin &TeecOperation, 1047ae8ec5e1SHisping Lin &ErrorOrigin); 1048f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1049f4e1db95SHisping Lin return TeecResult; 1050ae8ec5e1SHisping Lin 1051ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1052ae8ec5e1SHisping Lin 1053ae8ec5e1SHisping Lin SharedMem0.size = sizeof("flash_lock_state"); 1054ae8ec5e1SHisping Lin SharedMem0.flags = 0; 1055ae8ec5e1SHisping Lin 1056ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1057f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1058f4e1db95SHisping Lin goto exit; 1059ae8ec5e1SHisping Lin 1060ae8ec5e1SHisping Lin memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size); 1061ae8ec5e1SHisping Lin 1062ae8ec5e1SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1063ae8ec5e1SHisping Lin 1064ae8ec5e1SHisping Lin SharedMem1.size = 1; 1065ae8ec5e1SHisping Lin SharedMem1.flags = 0; 1066ae8ec5e1SHisping Lin 1067ae8ec5e1SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1068f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1069f4e1db95SHisping Lin goto exit; 1070ae8ec5e1SHisping Lin 1071ae8ec5e1SHisping Lin memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size); 1072ae8ec5e1SHisping Lin 1073ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1074ae8ec5e1SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1075ae8ec5e1SHisping Lin 1076ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1077ae8ec5e1SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1078ae8ec5e1SHisping Lin 1079ae8ec5e1SHisping Lin 1080ae8ec5e1SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1081ae8ec5e1SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1082ae8ec5e1SHisping Lin TEEC_NONE, 1083ae8ec5e1SHisping Lin TEEC_NONE); 1084ae8ec5e1SHisping Lin 1085ae8ec5e1SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1086ae8ec5e1SHisping Lin 1, 1087ae8ec5e1SHisping Lin &TeecOperation, 1088ae8ec5e1SHisping Lin &ErrorOrigin); 1089f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1090f4e1db95SHisping Lin goto exit; 1091f4e1db95SHisping Lin exit: 1092ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1093ae8ec5e1SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1094ae8ec5e1SHisping Lin TEEC_CloseSession(&TeecSession); 109546b2a054SHisping Lin TEEC_FinalizeContext(&TeecContext); 1096ae8ec5e1SHisping Lin 1097ae8ec5e1SHisping Lin return TeecResult; 1098ae8ec5e1SHisping Lin } 1099ae8ec5e1SHisping Lin 11006ef445a4SHisping Lin uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length) 11016ef445a4SHisping Lin { 11026ef445a4SHisping Lin TEEC_Result TeecResult; 11036ef445a4SHisping Lin TEEC_Context TeecContext; 11046ef445a4SHisping Lin TEEC_Session TeecSession; 11056ef445a4SHisping Lin uint32_t ErrorOrigin; 11066ef445a4SHisping Lin 11076ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 11086ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 11096ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 11106ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 11116ef445a4SHisping Lin 1112f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1113f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1114f4e1db95SHisping Lin return TeecResult; 11156ef445a4SHisping Lin 11166ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1117f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1118f4e1db95SHisping Lin return TeecResult; 11196ef445a4SHisping Lin 11206ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 11216ef445a4SHisping Lin &TeecSession, 11226ef445a4SHisping Lin TeecUuid, 11236ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 11246ef445a4SHisping Lin NULL, 11256ef445a4SHisping Lin NULL, 11266ef445a4SHisping Lin &ErrorOrigin); 1127f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1128f4e1db95SHisping Lin return TeecResult; 11296ef445a4SHisping Lin 11306ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 11316ef445a4SHisping Lin 11326ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 11336ef445a4SHisping Lin SharedMem0.flags = 0; 11346ef445a4SHisping Lin 11356ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1136f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1137f4e1db95SHisping Lin goto exit; 11386ef445a4SHisping Lin 11396ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 11406ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 11416ef445a4SHisping Lin 11426ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 11436ef445a4SHisping Lin TEEC_NONE, 11446ef445a4SHisping Lin TEEC_NONE, 11456ef445a4SHisping Lin TEEC_NONE); 11466ef445a4SHisping Lin 11476ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 11486ef445a4SHisping Lin 0, 11496ef445a4SHisping Lin &TeecOperation, 11506ef445a4SHisping Lin &ErrorOrigin); 11516ef445a4SHisping Lin 11526ef445a4SHisping Lin if (TeecResult == TEEC_SUCCESS) 11536ef445a4SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 1154f4e1db95SHisping Lin exit: 11556ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 11566ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 11576ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 11586ef445a4SHisping Lin 11596ef445a4SHisping Lin return TeecResult; 11606ef445a4SHisping Lin } 11616ef445a4SHisping Lin 11626ef445a4SHisping Lin uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length) 11636ef445a4SHisping Lin { 11646ef445a4SHisping Lin TEEC_Result TeecResult; 11656ef445a4SHisping Lin TEEC_Context TeecContext; 11666ef445a4SHisping Lin TEEC_Session TeecSession; 11676ef445a4SHisping Lin uint32_t ErrorOrigin; 11686ef445a4SHisping Lin 11696ef445a4SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 11706ef445a4SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 11716ef445a4SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 11726ef445a4SHisping Lin TEEC_Operation TeecOperation = {0}; 11736ef445a4SHisping Lin 1174f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1175f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1176f4e1db95SHisping Lin return TeecResult; 11776ef445a4SHisping Lin 11786ef445a4SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1179f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1180f4e1db95SHisping Lin return TeecResult; 11816ef445a4SHisping Lin 11826ef445a4SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 11836ef445a4SHisping Lin &TeecSession, 11846ef445a4SHisping Lin TeecUuid, 11856ef445a4SHisping Lin TEEC_LOGIN_PUBLIC, 11866ef445a4SHisping Lin NULL, 11876ef445a4SHisping Lin NULL, 11886ef445a4SHisping Lin &ErrorOrigin); 1189f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1190f4e1db95SHisping Lin return TeecResult; 11916ef445a4SHisping Lin 11926ef445a4SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 11936ef445a4SHisping Lin 11946ef445a4SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 11956ef445a4SHisping Lin SharedMem0.flags = 0; 11966ef445a4SHisping Lin 11976ef445a4SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1198f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1199f4e1db95SHisping Lin goto exit; 12006ef445a4SHisping Lin 12016ef445a4SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 12026ef445a4SHisping Lin 12036ef445a4SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 12046ef445a4SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 12056ef445a4SHisping Lin 12066ef445a4SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 12076ef445a4SHisping Lin TEEC_NONE, 12086ef445a4SHisping Lin TEEC_NONE, 12096ef445a4SHisping Lin TEEC_NONE); 12106ef445a4SHisping Lin 12116ef445a4SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 12126ef445a4SHisping Lin 1, 12136ef445a4SHisping Lin &TeecOperation, 12146ef445a4SHisping Lin &ErrorOrigin); 1215f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1216f4e1db95SHisping Lin goto exit; 1217f4e1db95SHisping Lin exit: 12186ef445a4SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 12196ef445a4SHisping Lin TEEC_CloseSession(&TeecSession); 12206ef445a4SHisping Lin TEEC_FinalizeContext(&TeecContext); 12216ef445a4SHisping Lin 12226ef445a4SHisping Lin return TeecResult; 12236ef445a4SHisping Lin } 122416539616SHisping Lin 122516539616SHisping Lin uint32_t notify_optee_rpmb_ta(void) 122616539616SHisping Lin { 122716539616SHisping Lin TEEC_Result TeecResult; 122816539616SHisping Lin TEEC_Context TeecContext; 122916539616SHisping Lin TEEC_Session TeecSession; 123016539616SHisping Lin uint32_t ErrorOrigin; 123116539616SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 123216539616SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 123316539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 123416539616SHisping Lin TEEC_Operation TeecOperation = {0}; 123516539616SHisping Lin 1236f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1237f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1238f4e1db95SHisping Lin return TeecResult; 123916539616SHisping Lin 124016539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1241f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1242f4e1db95SHisping Lin return TeecResult; 124316539616SHisping Lin 124416539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 124516539616SHisping Lin &TeecSession, 124616539616SHisping Lin TeecUuid, 124716539616SHisping Lin TEEC_LOGIN_PUBLIC, 124816539616SHisping Lin NULL, 124916539616SHisping Lin NULL, 125016539616SHisping Lin &ErrorOrigin); 1251f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1252f4e1db95SHisping Lin return TeecResult; 125316539616SHisping Lin 125416539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 125516539616SHisping Lin TEEC_NONE, 125616539616SHisping Lin TEEC_NONE, 125716539616SHisping Lin TEEC_NONE); 125816539616SHisping Lin 125916539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 126016539616SHisping Lin 2, 126116539616SHisping Lin &TeecOperation, 126216539616SHisping Lin &ErrorOrigin); 1263f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1264f4e1db95SHisping Lin goto exit; 1265f4e1db95SHisping Lin exit: 126616539616SHisping Lin TEEC_CloseSession(&TeecSession); 126716539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 126816539616SHisping Lin 126916539616SHisping Lin return TeecResult; 127016539616SHisping Lin } 127116539616SHisping Lin 127216539616SHisping Lin uint32_t notify_optee_efuse_ta(void) 127316539616SHisping Lin { 127416539616SHisping Lin TEEC_Result TeecResult; 127516539616SHisping Lin TEEC_Context TeecContext; 127616539616SHisping Lin TEEC_Session TeecSession; 127716539616SHisping Lin uint32_t ErrorOrigin; 127816539616SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 127916539616SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 128016539616SHisping Lin 128116539616SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 128216539616SHisping Lin TEEC_Operation TeecOperation = {0}; 128316539616SHisping Lin 1284f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1285f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1286f4e1db95SHisping Lin return TeecResult; 128716539616SHisping Lin 128816539616SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1289f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1290f4e1db95SHisping Lin return TeecResult; 129116539616SHisping Lin 129216539616SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 129316539616SHisping Lin &TeecSession, 129416539616SHisping Lin TeecUuid, 129516539616SHisping Lin TEEC_LOGIN_PUBLIC, 129616539616SHisping Lin NULL, 129716539616SHisping Lin NULL, 129816539616SHisping Lin &ErrorOrigin); 1299f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1300f4e1db95SHisping Lin return TeecResult; 130116539616SHisping Lin 130216539616SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, 130316539616SHisping Lin TEEC_NONE, 130416539616SHisping Lin TEEC_NONE, 130516539616SHisping Lin TEEC_NONE); 130616539616SHisping Lin 130716539616SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 130816539616SHisping Lin 2, 130916539616SHisping Lin &TeecOperation, 131016539616SHisping Lin &ErrorOrigin); 1311f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1312f4e1db95SHisping Lin goto exit; 1313f4e1db95SHisping Lin exit: 131416539616SHisping Lin TEEC_CloseSession(&TeecSession); 131516539616SHisping Lin TEEC_FinalizeContext(&TeecContext); 131616539616SHisping Lin 131716539616SHisping Lin return TeecResult; 131816539616SHisping Lin } 131916539616SHisping Lin 132016539616SHisping Lin uint32_t trusty_notify_optee_uboot_end(void) 132116539616SHisping Lin { 132216539616SHisping Lin TEEC_Result res; 132316539616SHisping Lin res = notify_optee_rpmb_ta(); 132416539616SHisping Lin res |= notify_optee_efuse_ta(); 132516539616SHisping Lin return res; 132616539616SHisping Lin } 13272cd27853SHisping Lin 13282cd27853SHisping Lin uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length) 13292cd27853SHisping Lin { 13302cd27853SHisping Lin TEEC_Result TeecResult; 13312cd27853SHisping Lin TEEC_Context TeecContext; 13322cd27853SHisping Lin TEEC_Session TeecSession; 13332cd27853SHisping Lin uint32_t ErrorOrigin; 13342cd27853SHisping Lin 13352cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 13362cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 13372cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13382cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 13392cd27853SHisping Lin 1340f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1341f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1342f4e1db95SHisping Lin return TeecResult; 13432cd27853SHisping Lin 13442cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1345f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1346f4e1db95SHisping Lin return TeecResult; 13472cd27853SHisping Lin 13482cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 13492cd27853SHisping Lin &TeecSession, 13502cd27853SHisping Lin TeecUuid, 13512cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 13522cd27853SHisping Lin NULL, 13532cd27853SHisping Lin NULL, 13542cd27853SHisping Lin &ErrorOrigin); 1355f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1356f4e1db95SHisping Lin return TeecResult; 13572cd27853SHisping Lin 13582cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 13592cd27853SHisping Lin 13602cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 13612cd27853SHisping Lin SharedMem0.flags = 0; 13622cd27853SHisping Lin 13632cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1364f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1365f4e1db95SHisping Lin goto exit; 13662cd27853SHisping Lin 13672cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 13682cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 13692cd27853SHisping Lin 13702cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 13712cd27853SHisping Lin TEEC_NONE, 13722cd27853SHisping Lin TEEC_NONE, 13732cd27853SHisping Lin TEEC_NONE); 13742cd27853SHisping Lin 13752cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 13762cd27853SHisping Lin 3, 13772cd27853SHisping Lin &TeecOperation, 13782cd27853SHisping Lin &ErrorOrigin); 13792cd27853SHisping Lin 13802cd27853SHisping Lin if (TeecResult == TEEC_SUCCESS) 13812cd27853SHisping Lin memcpy(buf, SharedMem0.buffer, SharedMem0.size); 1382f4e1db95SHisping Lin exit: 13832cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 13842cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 13852cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 13862cd27853SHisping Lin 13872cd27853SHisping Lin return TeecResult; 13882cd27853SHisping Lin } 13892cd27853SHisping Lin uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length) 13902cd27853SHisping Lin { 13912cd27853SHisping Lin TEEC_Result TeecResult; 13922cd27853SHisping Lin TEEC_Context TeecContext; 13932cd27853SHisping Lin TEEC_Session TeecSession; 13942cd27853SHisping Lin uint32_t ErrorOrigin; 13952cd27853SHisping Lin 13962cd27853SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 13972cd27853SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 13982cd27853SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 13992cd27853SHisping Lin TEEC_Operation TeecOperation = {0}; 14002cd27853SHisping Lin 1401f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1402f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1403f4e1db95SHisping Lin return TeecResult; 14042cd27853SHisping Lin 14052cd27853SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1406f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1407f4e1db95SHisping Lin return TeecResult; 14082cd27853SHisping Lin 14092cd27853SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 14102cd27853SHisping Lin &TeecSession, 14112cd27853SHisping Lin TeecUuid, 14122cd27853SHisping Lin TEEC_LOGIN_PUBLIC, 14132cd27853SHisping Lin NULL, 14142cd27853SHisping Lin NULL, 14152cd27853SHisping Lin &ErrorOrigin); 1416f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1417f4e1db95SHisping Lin return TeecResult; 14182cd27853SHisping Lin 14192cd27853SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 14202cd27853SHisping Lin 14212cd27853SHisping Lin SharedMem0.size = length * sizeof(uint32_t); 14222cd27853SHisping Lin SharedMem0.flags = 0; 14232cd27853SHisping Lin 14242cd27853SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1425f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1426f4e1db95SHisping Lin goto exit; 14272cd27853SHisping Lin 14282cd27853SHisping Lin memcpy(SharedMem0.buffer, buf, SharedMem0.size); 14292cd27853SHisping Lin 14302cd27853SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 14312cd27853SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 14322cd27853SHisping Lin 14332cd27853SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 14342cd27853SHisping Lin TEEC_NONE, 14352cd27853SHisping Lin TEEC_NONE, 14362cd27853SHisping Lin TEEC_NONE); 14372cd27853SHisping Lin 14382cd27853SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 14392cd27853SHisping Lin 4, 14402cd27853SHisping Lin &TeecOperation, 14412cd27853SHisping Lin &ErrorOrigin); 1442f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1443f4e1db95SHisping Lin goto exit; 1444f4e1db95SHisping Lin exit: 14452cd27853SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 14462cd27853SHisping Lin TEEC_CloseSession(&TeecSession); 14472cd27853SHisping Lin TEEC_FinalizeContext(&TeecContext); 14482cd27853SHisping Lin 14492cd27853SHisping Lin return TeecResult; 14502cd27853SHisping Lin } 1451095e2a82SHisping Lin 1452468df3b2SHisping Lin uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag) 1453468df3b2SHisping Lin { 1454468df3b2SHisping Lin TEEC_Result TeecResult; 1455468df3b2SHisping Lin TEEC_Context TeecContext; 1456468df3b2SHisping Lin TEEC_Session TeecSession; 1457468df3b2SHisping Lin uint32_t ErrorOrigin; 1458468df3b2SHisping Lin uint32_t bootflag; 1459468df3b2SHisping Lin 1460468df3b2SHisping Lin TEEC_UUID tempuuid = { 0x2d26d8a8, 0x5134, 0x4dd8, \ 1461468df3b2SHisping Lin { 0xb3, 0x2f, 0xb3, 0x4b, 0xce, 0xeb, 0xc4, 0x71 } }; 1462468df3b2SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1463468df3b2SHisping Lin TEEC_Operation TeecOperation = {0}; 1464468df3b2SHisping Lin 1465f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1466f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1467f4e1db95SHisping Lin return TeecResult; 1468468df3b2SHisping Lin 1469468df3b2SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1470f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1471f4e1db95SHisping Lin return TeecResult; 1472468df3b2SHisping Lin 1473468df3b2SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1474468df3b2SHisping Lin &TeecSession, 1475468df3b2SHisping Lin TeecUuid, 1476468df3b2SHisping Lin TEEC_LOGIN_PUBLIC, 1477468df3b2SHisping Lin NULL, 1478468df3b2SHisping Lin NULL, 1479468df3b2SHisping Lin &ErrorOrigin); 1480f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1481f4e1db95SHisping Lin return TeecResult; 1482468df3b2SHisping Lin 1483468df3b2SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1484468df3b2SHisping Lin 1485468df3b2SHisping Lin SharedMem0.size = 1 * sizeof(uint32_t); 1486468df3b2SHisping Lin SharedMem0.flags = 0; 1487468df3b2SHisping Lin 1488468df3b2SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1489f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1490f4e1db95SHisping Lin goto exit; 1491468df3b2SHisping Lin 1492468df3b2SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1493468df3b2SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1494468df3b2SHisping Lin 1495468df3b2SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, 1496468df3b2SHisping Lin TEEC_NONE, 1497468df3b2SHisping Lin TEEC_NONE, 1498468df3b2SHisping Lin TEEC_NONE); 1499468df3b2SHisping Lin 1500468df3b2SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 1501468df3b2SHisping Lin 5, 1502468df3b2SHisping Lin &TeecOperation, 1503468df3b2SHisping Lin &ErrorOrigin); 1504468df3b2SHisping Lin 1505468df3b2SHisping Lin if (TeecResult == TEEC_SUCCESS) { 1506468df3b2SHisping Lin memcpy(&bootflag, SharedMem0.buffer, SharedMem0.size); 15070202ee8aSHisping Lin #if defined(CONFIG_ROCKCHIP_RK3288) 15080202ee8aSHisping Lin if (bootflag == 0x00000001) 15090202ee8aSHisping Lin *flag = 1; 15100202ee8aSHisping Lin #else 1511468df3b2SHisping Lin if (bootflag == 0x000000FF) 1512468df3b2SHisping Lin *flag = 1; 15130202ee8aSHisping Lin #endif 1514468df3b2SHisping Lin } 1515f4e1db95SHisping Lin exit: 1516468df3b2SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1517468df3b2SHisping Lin TEEC_CloseSession(&TeecSession); 1518468df3b2SHisping Lin TEEC_FinalizeContext(&TeecContext); 1519468df3b2SHisping Lin 1520468df3b2SHisping Lin return TeecResult; 1521468df3b2SHisping Lin } 1522468df3b2SHisping Lin 1523095e2a82SHisping Lin uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes) 1524095e2a82SHisping Lin { 1525095e2a82SHisping Lin TEEC_Result TeecResult; 1526095e2a82SHisping Lin TEEC_Context TeecContext; 1527095e2a82SHisping Lin TEEC_Session TeecSession; 1528095e2a82SHisping Lin uint32_t ErrorOrigin; 152999830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 153099830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1531095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1532095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 15333251364cSHisping Lin struct blk_desc *dev_desc; 15343251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 15356651d4c0SJason Zhu if (!dev_desc) { 15366651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 15376651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 15386651d4c0SJason Zhu } 1539095e2a82SHisping Lin 1540f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1541f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1542f4e1db95SHisping Lin return TeecResult; 1543095e2a82SHisping Lin 1544095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1545f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1546f4e1db95SHisping Lin return TeecResult; 1547095e2a82SHisping Lin 15483251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 15493251364cSHisping Lin TEEC_NONE, 15503251364cSHisping Lin TEEC_NONE, 15513251364cSHisping Lin TEEC_NONE); 15523251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1553*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1554*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1555*b9a7e756SHisping Lin else 1556*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1557*b9a7e756SHisping Lin 15583251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 15593251364cSHisping Lin TeecOperation.params[0].value.a = 0; 15603251364cSHisping Lin #endif 15613251364cSHisping Lin 1562095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1563095e2a82SHisping Lin &TeecSession, 1564095e2a82SHisping Lin TeecUuid, 1565095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1566095e2a82SHisping Lin NULL, 15673251364cSHisping Lin &TeecOperation, 1568095e2a82SHisping Lin &ErrorOrigin); 1569f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1570f4e1db95SHisping Lin return TeecResult; 1571095e2a82SHisping Lin 1572095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1573095e2a82SHisping Lin 1574095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1575095e2a82SHisping Lin SharedMem0.flags = 0; 1576095e2a82SHisping Lin 1577095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1578f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1579f4e1db95SHisping Lin goto exit; 1580095e2a82SHisping Lin 1581095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1582095e2a82SHisping Lin 1583095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1584095e2a82SHisping Lin 1585095e2a82SHisping Lin SharedMem1.size = 1; 1586095e2a82SHisping Lin SharedMem1.flags = 0; 1587095e2a82SHisping Lin 1588095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1589f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1590f4e1db95SHisping Lin goto exit; 1591095e2a82SHisping Lin 1592095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1593095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1594095e2a82SHisping Lin 1595095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1596095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1597095e2a82SHisping Lin 1598095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1599095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1600095e2a82SHisping Lin TEEC_NONE, 1601095e2a82SHisping Lin TEEC_NONE); 1602095e2a82SHisping Lin 1603095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 160499830019SHisping Lin 0, 1605095e2a82SHisping Lin &TeecOperation, 1606095e2a82SHisping Lin &ErrorOrigin); 1607095e2a82SHisping Lin if (TeecResult == TEEC_SUCCESS) 1608095e2a82SHisping Lin memcpy(attributes, SharedMem1.buffer, SharedMem1.size); 1609f4e1db95SHisping Lin exit: 1610095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1611095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1612095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1613095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1614095e2a82SHisping Lin 1615095e2a82SHisping Lin return TeecResult; 1616095e2a82SHisping Lin } 1617095e2a82SHisping Lin 1618095e2a82SHisping Lin uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes) 1619095e2a82SHisping Lin { 1620095e2a82SHisping Lin TEEC_Result TeecResult; 1621095e2a82SHisping Lin TEEC_Context TeecContext; 1622095e2a82SHisping Lin TEEC_Session TeecSession; 1623095e2a82SHisping Lin uint32_t ErrorOrigin; 162499830019SHisping Lin TEEC_UUID tempuuid = { 0x1b484ea5, 0x698b, 0x4142, 162599830019SHisping Lin { 0x82, 0xb8, 0x3a, 0xcf, 0x16, 0xe9, 0x9e, 0x2a } }; 1626095e2a82SHisping Lin TEEC_UUID *TeecUuid = &tempuuid; 1627095e2a82SHisping Lin TEEC_Operation TeecOperation = {0}; 16283251364cSHisping Lin struct blk_desc *dev_desc; 16293251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 16306651d4c0SJason Zhu if (!dev_desc) { 16316651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 16326651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 16336651d4c0SJason Zhu } 1634095e2a82SHisping Lin 1635f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1636f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1637f4e1db95SHisping Lin return TeecResult; 1638095e2a82SHisping Lin 1639095e2a82SHisping Lin TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1640f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1641f4e1db95SHisping Lin return TeecResult; 1642095e2a82SHisping Lin 16433251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 16443251364cSHisping Lin TEEC_NONE, 16453251364cSHisping Lin TEEC_NONE, 16463251364cSHisping Lin TEEC_NONE); 16473251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1648*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1649*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1650*b9a7e756SHisping Lin else 1651*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1652*b9a7e756SHisping Lin 16533251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 16543251364cSHisping Lin TeecOperation.params[0].value.a = 0; 16553251364cSHisping Lin #endif 16563251364cSHisping Lin 1657095e2a82SHisping Lin TeecResult = TEEC_OpenSession(&TeecContext, 1658095e2a82SHisping Lin &TeecSession, 1659095e2a82SHisping Lin TeecUuid, 1660095e2a82SHisping Lin TEEC_LOGIN_PUBLIC, 1661095e2a82SHisping Lin NULL, 16623251364cSHisping Lin &TeecOperation, 1663095e2a82SHisping Lin &ErrorOrigin); 1664f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1665f4e1db95SHisping Lin return TeecResult; 1666095e2a82SHisping Lin 1667095e2a82SHisping Lin TEEC_SharedMemory SharedMem0 = {0}; 1668095e2a82SHisping Lin 1669095e2a82SHisping Lin SharedMem0.size = sizeof("attributes_flag"); 1670095e2a82SHisping Lin SharedMem0.flags = 0; 1671095e2a82SHisping Lin 1672095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1673f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1674f4e1db95SHisping Lin goto exit; 1675095e2a82SHisping Lin 1676095e2a82SHisping Lin memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size); 1677095e2a82SHisping Lin 1678095e2a82SHisping Lin TEEC_SharedMemory SharedMem1 = {0}; 1679095e2a82SHisping Lin 1680095e2a82SHisping Lin SharedMem1.size = 1; 1681095e2a82SHisping Lin SharedMem1.flags = 0; 1682095e2a82SHisping Lin 1683095e2a82SHisping Lin TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1684f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1685f4e1db95SHisping Lin goto exit; 1686095e2a82SHisping Lin 1687095e2a82SHisping Lin memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size); 1688095e2a82SHisping Lin 1689095e2a82SHisping Lin TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 1690095e2a82SHisping Lin TeecOperation.params[0].tmpref.size = SharedMem0.size; 1691095e2a82SHisping Lin 1692095e2a82SHisping Lin TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 1693095e2a82SHisping Lin TeecOperation.params[1].tmpref.size = SharedMem1.size; 1694095e2a82SHisping Lin 1695095e2a82SHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, 1696095e2a82SHisping Lin TEEC_MEMREF_TEMP_INOUT, 1697095e2a82SHisping Lin TEEC_NONE, 1698095e2a82SHisping Lin TEEC_NONE); 1699095e2a82SHisping Lin 1700095e2a82SHisping Lin TeecResult = TEEC_InvokeCommand(&TeecSession, 170199830019SHisping Lin 1, 1702095e2a82SHisping Lin &TeecOperation, 1703095e2a82SHisping Lin &ErrorOrigin); 1704f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1705f4e1db95SHisping Lin goto exit; 1706f4e1db95SHisping Lin exit: 1707095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem0); 1708095e2a82SHisping Lin TEEC_ReleaseSharedMemory(&SharedMem1); 1709095e2a82SHisping Lin TEEC_CloseSession(&TeecSession); 1710095e2a82SHisping Lin TEEC_FinalizeContext(&TeecContext); 1711095e2a82SHisping Lin 1712095e2a82SHisping Lin return TeecResult; 1713095e2a82SHisping Lin } 17144aa61755SAndy Ye 17154aa61755SAndy Ye uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size) 17164aa61755SAndy Ye { 17174aa61755SAndy Ye TEEC_Result TeecResult; 17184aa61755SAndy Ye TEEC_Context TeecContext; 17194aa61755SAndy Ye TEEC_Session TeecSession; 17204aa61755SAndy Ye uint32_t ErrorOrigin; 17214aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 17224aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 17234aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 17244aa61755SAndy Ye } 17254aa61755SAndy Ye }; 17264aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 17274aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 17283251364cSHisping Lin struct blk_desc *dev_desc; 17293251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 17306651d4c0SJason Zhu if (!dev_desc) { 17316651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 17326651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 17336651d4c0SJason Zhu } 17344aa61755SAndy Ye 1735f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1736f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1737f4e1db95SHisping Lin return TeecResult; 17384aa61755SAndy Ye 17394aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1740f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1741f4e1db95SHisping Lin return TeecResult; 17424aa61755SAndy Ye 17433251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 17443251364cSHisping Lin TEEC_NONE, 17453251364cSHisping Lin TEEC_NONE, 17463251364cSHisping Lin TEEC_NONE); 17473251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1748*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1749*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1750*b9a7e756SHisping Lin else 1751*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1752*b9a7e756SHisping Lin 17533251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 17543251364cSHisping Lin TeecOperation.params[0].value.a = 0; 17553251364cSHisping Lin #endif 17563251364cSHisping Lin 17574aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 17584aa61755SAndy Ye &TeecSession, 17594aa61755SAndy Ye TeecUuid, 17604aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 17614aa61755SAndy Ye NULL, 17623251364cSHisping Lin &TeecOperation, 17634aa61755SAndy Ye &ErrorOrigin); 1764f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1765f4e1db95SHisping Lin return TeecResult; 17664aa61755SAndy Ye 17674aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 17684aa61755SAndy Ye 17694aa61755SAndy Ye SharedMem0.size = *dh_size; 17704aa61755SAndy Ye SharedMem0.flags = 0; 17714aa61755SAndy Ye 17724aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1773f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1774f4e1db95SHisping Lin goto exit; 17754aa61755SAndy Ye 17764aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 17774aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 17784aa61755SAndy Ye 17794aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 17804aa61755SAndy Ye TEEC_NONE, 17814aa61755SAndy Ye TEEC_NONE, 17824aa61755SAndy Ye TEEC_NONE); 17834aa61755SAndy Ye 17844aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 17854aa61755SAndy Ye 143, 17864aa61755SAndy Ye &TeecOperation, 17874aa61755SAndy Ye &ErrorOrigin); 1788f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1789f4e1db95SHisping Lin goto exit; 17904aa61755SAndy Ye 17914aa61755SAndy Ye *dh_size = TeecOperation.params[0].tmpref.size; 17924aa61755SAndy Ye memcpy(dh, SharedMem0.buffer, SharedMem0.size); 1793f4e1db95SHisping Lin exit: 17944aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 17954aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1796f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 17974aa61755SAndy Ye 17984aa61755SAndy Ye return TeecResult; 17994aa61755SAndy Ye } 18004aa61755SAndy Ye 18014aa61755SAndy Ye uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size) 18024aa61755SAndy Ye { 18034aa61755SAndy Ye TEEC_Result TeecResult; 18044aa61755SAndy Ye TEEC_Context TeecContext; 18054aa61755SAndy Ye TEEC_Session TeecSession; 18064aa61755SAndy Ye uint32_t ErrorOrigin; 18074aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18084aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18094aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 18104aa61755SAndy Ye } 18114aa61755SAndy Ye }; 18124aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 18134aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 18143251364cSHisping Lin struct blk_desc *dev_desc; 18153251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 18166651d4c0SJason Zhu if (!dev_desc) { 18176651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 18186651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 18196651d4c0SJason Zhu } 18204aa61755SAndy Ye 1821f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1822f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1823f4e1db95SHisping Lin return TeecResult; 18244aa61755SAndy Ye 18254aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1826f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1827f4e1db95SHisping Lin return TeecResult; 18284aa61755SAndy Ye 18293251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 18303251364cSHisping Lin TEEC_NONE, 18313251364cSHisping Lin TEEC_NONE, 18323251364cSHisping Lin TEEC_NONE); 18333251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1834*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1835*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1836*b9a7e756SHisping Lin else 1837*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1838*b9a7e756SHisping Lin 18393251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 18403251364cSHisping Lin TeecOperation.params[0].value.a = 0; 18413251364cSHisping Lin #endif 18423251364cSHisping Lin 18434aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 18444aa61755SAndy Ye &TeecSession, 18454aa61755SAndy Ye TeecUuid, 18464aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 18474aa61755SAndy Ye NULL, 18483251364cSHisping Lin &TeecOperation, 18494aa61755SAndy Ye &ErrorOrigin); 1850f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1851f4e1db95SHisping Lin return TeecResult; 18524aa61755SAndy Ye 18534aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 18544aa61755SAndy Ye 18554aa61755SAndy Ye SharedMem0.size = *uuid_size; 18564aa61755SAndy Ye SharedMem0.flags = 0; 18574aa61755SAndy Ye 18584aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1859f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1860f4e1db95SHisping Lin goto exit; 18614aa61755SAndy Ye 18624aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 18634aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 18644aa61755SAndy Ye 18654aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 18664aa61755SAndy Ye TEEC_NONE, 18674aa61755SAndy Ye TEEC_NONE, 18684aa61755SAndy Ye TEEC_NONE); 18694aa61755SAndy Ye 18704aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 18714aa61755SAndy Ye 144, 18724aa61755SAndy Ye &TeecOperation, 18734aa61755SAndy Ye &ErrorOrigin); 1874f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1875f4e1db95SHisping Lin goto exit; 18764aa61755SAndy Ye 18774aa61755SAndy Ye *uuid_size = TeecOperation.params[0].tmpref.size; 18784aa61755SAndy Ye memcpy(uuid, SharedMem0.buffer, SharedMem0.size); 1879f4e1db95SHisping Lin exit: 18804aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 18814aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 1882f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 18834aa61755SAndy Ye 18844aa61755SAndy Ye return TeecResult; 18854aa61755SAndy Ye } 18864aa61755SAndy Ye 18874aa61755SAndy Ye uint32_t trusty_attest_get_ca(uint8_t *operation_start, 18884aa61755SAndy Ye uint32_t *operation_size, 18894aa61755SAndy Ye uint8_t *out, 18904aa61755SAndy Ye uint32_t *out_len) 18914aa61755SAndy Ye { 18924aa61755SAndy Ye TEEC_Result TeecResult; 18934aa61755SAndy Ye TEEC_Context TeecContext; 18944aa61755SAndy Ye TEEC_Session TeecSession; 18954aa61755SAndy Ye uint32_t ErrorOrigin; 18964aa61755SAndy Ye 18974aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 18984aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 18994aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 19004aa61755SAndy Ye } 19014aa61755SAndy Ye }; 19024aa61755SAndy Ye 19034aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 19044aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 19053251364cSHisping Lin struct blk_desc *dev_desc; 19063251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 19076651d4c0SJason Zhu if (!dev_desc) { 19086651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 19096651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 19106651d4c0SJason Zhu } 19114aa61755SAndy Ye 1912f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 1913f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1914f4e1db95SHisping Lin return TeecResult; 19154aa61755SAndy Ye 19164aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 1917f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1918f4e1db95SHisping Lin return TeecResult; 19194aa61755SAndy Ye 19203251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 19213251364cSHisping Lin TEEC_NONE, 19223251364cSHisping Lin TEEC_NONE, 19233251364cSHisping Lin TEEC_NONE); 19243251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 1925*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 1926*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 1927*b9a7e756SHisping Lin else 1928*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 1929*b9a7e756SHisping Lin 19303251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 19313251364cSHisping Lin TeecOperation.params[0].value.a = 0; 19323251364cSHisping Lin #endif 19333251364cSHisping Lin 19344aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 19354aa61755SAndy Ye &TeecSession, 19364aa61755SAndy Ye TeecUuid, 19374aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 19384aa61755SAndy Ye NULL, 19393251364cSHisping Lin &TeecOperation, 19404aa61755SAndy Ye &ErrorOrigin); 1941f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1942f4e1db95SHisping Lin return TeecResult; 19434aa61755SAndy Ye 19444aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 19454aa61755SAndy Ye 19464aa61755SAndy Ye SharedMem0.size = *operation_size; 19474aa61755SAndy Ye SharedMem0.flags = 0; 19484aa61755SAndy Ye 19494aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 1950f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1951f4e1db95SHisping Lin goto exit; 19524aa61755SAndy Ye 19534aa61755SAndy Ye memcpy(SharedMem0.buffer, operation_start, SharedMem0.size); 19544aa61755SAndy Ye 19554aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 19564aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 19574aa61755SAndy Ye 19584aa61755SAndy Ye TEEC_SharedMemory SharedMem1 = {0}; 19594aa61755SAndy Ye 19604aa61755SAndy Ye SharedMem1.size = *out_len; 19614aa61755SAndy Ye SharedMem1.flags = 0; 19624aa61755SAndy Ye 19634aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1); 1964f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1965f4e1db95SHisping Lin goto exit; 19664aa61755SAndy Ye 19674aa61755SAndy Ye TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer; 19684aa61755SAndy Ye TeecOperation.params[1].tmpref.size = SharedMem1.size; 19694aa61755SAndy Ye 19704aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 19714aa61755SAndy Ye TEEC_MEMREF_TEMP_INOUT, 19724aa61755SAndy Ye TEEC_NONE, 19734aa61755SAndy Ye TEEC_NONE); 19744aa61755SAndy Ye 19754aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 19764aa61755SAndy Ye 145, 19774aa61755SAndy Ye &TeecOperation, 19784aa61755SAndy Ye &ErrorOrigin); 1979f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 1980f4e1db95SHisping Lin goto exit; 19814aa61755SAndy Ye 19824aa61755SAndy Ye *out_len = TeecOperation.params[1].tmpref.size; 19834aa61755SAndy Ye memcpy(out, SharedMem1.buffer, SharedMem1.size); 1984f4e1db95SHisping Lin exit: 19854aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 19864aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem1); 1987f4e1db95SHisping Lin TEEC_CloseSession(&TeecSession); 1988f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 19894aa61755SAndy Ye 19904aa61755SAndy Ye return TeecResult; 19914aa61755SAndy Ye } 19924aa61755SAndy Ye 19934aa61755SAndy Ye uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size) 19944aa61755SAndy Ye { 19954aa61755SAndy Ye TEEC_Result TeecResult; 19964aa61755SAndy Ye TEEC_Context TeecContext; 19974aa61755SAndy Ye TEEC_Session TeecSession; 19984aa61755SAndy Ye uint32_t ErrorOrigin; 19994aa61755SAndy Ye TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6, 20004aa61755SAndy Ye { 0xa8, 0x69, 0x9c, 0xe6, 20014aa61755SAndy Ye 0x88, 0x6c, 0x5d, 0x5d 20024aa61755SAndy Ye } 20034aa61755SAndy Ye }; 20044aa61755SAndy Ye TEEC_UUID *TeecUuid = &tempuuid; 20054aa61755SAndy Ye TEEC_Operation TeecOperation = {0}; 20063251364cSHisping Lin struct blk_desc *dev_desc; 20073251364cSHisping Lin dev_desc = rockchip_get_bootdev(); 20086651d4c0SJason Zhu if (!dev_desc) { 20096651d4c0SJason Zhu printf("%s: dev_desc is NULL!\n", __func__); 20106651d4c0SJason Zhu return -TEEC_ERROR_GENERIC; 20116651d4c0SJason Zhu } 2012f4e1db95SHisping Lin TeecResult = OpteeClientApiLibInitialize(); 2013f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2014f4e1db95SHisping Lin return TeecResult; 20154aa61755SAndy Ye 20164aa61755SAndy Ye TeecResult = TEEC_InitializeContext(NULL, &TeecContext); 2017f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2018f4e1db95SHisping Lin return TeecResult; 20194aa61755SAndy Ye 20203251364cSHisping Lin TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, 20213251364cSHisping Lin TEEC_NONE, 20223251364cSHisping Lin TEEC_NONE, 20233251364cSHisping Lin TEEC_NONE); 20243251364cSHisping Lin /*0 nand or emmc "security" partition , 1 rpmb*/ 2025*b9a7e756SHisping Lin if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 0) 2026*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 1; 2027*b9a7e756SHisping Lin else 2028*b9a7e756SHisping Lin TeecOperation.params[0].value.a = 0; 2029*b9a7e756SHisping Lin 20303251364cSHisping Lin #ifdef CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION 20313251364cSHisping Lin TeecOperation.params[0].value.a = 0; 20323251364cSHisping Lin #endif 20333251364cSHisping Lin 20344aa61755SAndy Ye TeecResult = TEEC_OpenSession(&TeecContext, 20354aa61755SAndy Ye &TeecSession, 20364aa61755SAndy Ye TeecUuid, 20374aa61755SAndy Ye TEEC_LOGIN_PUBLIC, 20384aa61755SAndy Ye NULL, 20393251364cSHisping Lin &TeecOperation, 20404aa61755SAndy Ye &ErrorOrigin); 2041f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2042f4e1db95SHisping Lin return TeecResult; 20434aa61755SAndy Ye 20444aa61755SAndy Ye TEEC_SharedMemory SharedMem0 = {0}; 20454aa61755SAndy Ye 20464aa61755SAndy Ye SharedMem0.size = *ca_response_size; 20474aa61755SAndy Ye SharedMem0.flags = 0; 20484aa61755SAndy Ye 20494aa61755SAndy Ye TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0); 2050f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2051f4e1db95SHisping Lin goto exit; 20524aa61755SAndy Ye 20534aa61755SAndy Ye memcpy(SharedMem0.buffer, ca_response, SharedMem0.size); 20544aa61755SAndy Ye 20554aa61755SAndy Ye TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer; 20564aa61755SAndy Ye TeecOperation.params[0].tmpref.size = SharedMem0.size; 20574aa61755SAndy Ye 20584aa61755SAndy Ye TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INOUT, 20594aa61755SAndy Ye TEEC_NONE, 20604aa61755SAndy Ye TEEC_NONE, 20614aa61755SAndy Ye TEEC_NONE); 20624aa61755SAndy Ye 20634aa61755SAndy Ye TeecResult = TEEC_InvokeCommand(&TeecSession, 20644aa61755SAndy Ye 146, 20654aa61755SAndy Ye &TeecOperation, 20664aa61755SAndy Ye &ErrorOrigin); 2067f4e1db95SHisping Lin if (TeecResult != TEEC_SUCCESS) 2068f4e1db95SHisping Lin goto exit; 2069f4e1db95SHisping Lin exit: 20704aa61755SAndy Ye TEEC_ReleaseSharedMemory(&SharedMem0); 20714aa61755SAndy Ye TEEC_CloseSession(&TeecSession); 2072f4e1db95SHisping Lin TEEC_FinalizeContext(&TeecContext); 20734aa61755SAndy Ye 20744aa61755SAndy Ye return TeecResult; 20754aa61755SAndy Ye } 2076