1*99cd54f3SPankaj Gupta /* 2*99cd54f3SPankaj Gupta * Copyright 2018-2021 NXP 3*99cd54f3SPankaj Gupta * 4*99cd54f3SPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 5*99cd54f3SPankaj Gupta * 6*99cd54f3SPankaj Gupta */ 7*99cd54f3SPankaj Gupta 8*99cd54f3SPankaj Gupta #include <assert.h> 9*99cd54f3SPankaj Gupta #include <stdint.h> 10*99cd54f3SPankaj Gupta #include <string.h> 11*99cd54f3SPankaj Gupta 12*99cd54f3SPankaj Gupta #include <common/debug.h> 13*99cd54f3SPankaj Gupta #include <lib/cassert.h> 14*99cd54f3SPankaj Gupta #include <sfp.h> 15*99cd54f3SPankaj Gupta #include <tools_share/tbbr_oid.h> 16*99cd54f3SPankaj Gupta 17*99cd54f3SPankaj Gupta #include <plat/common/platform.h> 18*99cd54f3SPankaj Gupta #include "plat_common.h" 19*99cd54f3SPankaj Gupta 20*99cd54f3SPankaj Gupta extern char nxp_rotpk_hash[], nxp_rotpk_hash_end[]; 21*99cd54f3SPankaj Gupta 22*99cd54f3SPankaj Gupta int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len, 23*99cd54f3SPankaj Gupta unsigned int *flags) 24*99cd54f3SPankaj Gupta { 25*99cd54f3SPankaj Gupta *key_ptr = nxp_rotpk_hash; 26*99cd54f3SPankaj Gupta *key_len = nxp_rotpk_hash_end - nxp_rotpk_hash; 27*99cd54f3SPankaj Gupta *flags = ROTPK_IS_HASH; 28*99cd54f3SPankaj Gupta 29*99cd54f3SPankaj Gupta return 0; 30*99cd54f3SPankaj Gupta } 31*99cd54f3SPankaj Gupta 32*99cd54f3SPankaj Gupta int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr) 33*99cd54f3SPankaj Gupta { 34*99cd54f3SPankaj Gupta const char *oid; 35*99cd54f3SPankaj Gupta uint32_t uid_num; 36*99cd54f3SPankaj Gupta uint32_t val = 0U; 37*99cd54f3SPankaj Gupta 38*99cd54f3SPankaj Gupta assert(cookie != NULL); 39*99cd54f3SPankaj Gupta assert(nv_ctr != NULL); 40*99cd54f3SPankaj Gupta 41*99cd54f3SPankaj Gupta oid = (const char *)cookie; 42*99cd54f3SPankaj Gupta if (strcmp(oid, TRUSTED_FW_NVCOUNTER_OID) == 0) { 43*99cd54f3SPankaj Gupta uid_num = 3U; 44*99cd54f3SPankaj Gupta } else if (strcmp(oid, NON_TRUSTED_FW_NVCOUNTER_OID) == 0) { 45*99cd54f3SPankaj Gupta uid_num = 4U; 46*99cd54f3SPankaj Gupta } else { 47*99cd54f3SPankaj Gupta return 1; 48*99cd54f3SPankaj Gupta } 49*99cd54f3SPankaj Gupta 50*99cd54f3SPankaj Gupta val = sfp_read_oem_uid(uid_num); 51*99cd54f3SPankaj Gupta 52*99cd54f3SPankaj Gupta INFO("SFP Value read is %x from UID %d\n", val, uid_num); 53*99cd54f3SPankaj Gupta if (val == 0U) { 54*99cd54f3SPankaj Gupta *nv_ctr = 0U; 55*99cd54f3SPankaj Gupta } else { 56*99cd54f3SPankaj Gupta *nv_ctr = (32U - __builtin_clz(val)); 57*99cd54f3SPankaj Gupta } 58*99cd54f3SPankaj Gupta 59*99cd54f3SPankaj Gupta INFO("NV Counter value for UID %d is %d\n", uid_num, *nv_ctr); 60*99cd54f3SPankaj Gupta return 0; 61*99cd54f3SPankaj Gupta 62*99cd54f3SPankaj Gupta } 63*99cd54f3SPankaj Gupta 64*99cd54f3SPankaj Gupta int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr) 65*99cd54f3SPankaj Gupta { 66*99cd54f3SPankaj Gupta const char *oid; 67*99cd54f3SPankaj Gupta uint32_t uid_num, sfp_val; 68*99cd54f3SPankaj Gupta 69*99cd54f3SPankaj Gupta assert(cookie != NULL); 70*99cd54f3SPankaj Gupta 71*99cd54f3SPankaj Gupta /* Counter values upto 32 are supported */ 72*99cd54f3SPankaj Gupta if (nv_ctr > 32U) { 73*99cd54f3SPankaj Gupta return 1; 74*99cd54f3SPankaj Gupta } 75*99cd54f3SPankaj Gupta 76*99cd54f3SPankaj Gupta oid = (const char *)cookie; 77*99cd54f3SPankaj Gupta if (strcmp(oid, TRUSTED_FW_NVCOUNTER_OID) == 0) { 78*99cd54f3SPankaj Gupta uid_num = 3U; 79*99cd54f3SPankaj Gupta } else if (strcmp(oid, NON_TRUSTED_FW_NVCOUNTER_OID) == 0) { 80*99cd54f3SPankaj Gupta uid_num = 4U; 81*99cd54f3SPankaj Gupta } else { 82*99cd54f3SPankaj Gupta return 1; 83*99cd54f3SPankaj Gupta } 84*99cd54f3SPankaj Gupta sfp_val = (1U << (nv_ctr - 1)); 85*99cd54f3SPankaj Gupta 86*99cd54f3SPankaj Gupta if (sfp_write_oem_uid(uid_num, sfp_val) == 1) { 87*99cd54f3SPankaj Gupta /* Enable POVDD on board */ 88*99cd54f3SPankaj Gupta if (board_enable_povdd()) { 89*99cd54f3SPankaj Gupta sfp_program_fuses(); 90*99cd54f3SPankaj Gupta } 91*99cd54f3SPankaj Gupta 92*99cd54f3SPankaj Gupta /* Disable POVDD on board */ 93*99cd54f3SPankaj Gupta board_disable_povdd(); 94*99cd54f3SPankaj Gupta } else { 95*99cd54f3SPankaj Gupta ERROR("Invalid OEM UID sent.\n"); 96*99cd54f3SPankaj Gupta return 1; 97*99cd54f3SPankaj Gupta } 98*99cd54f3SPankaj Gupta 99*99cd54f3SPankaj Gupta return 0; 100*99cd54f3SPankaj Gupta } 101*99cd54f3SPankaj Gupta 102*99cd54f3SPankaj Gupta int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 103*99cd54f3SPankaj Gupta { 104*99cd54f3SPankaj Gupta return get_mbedtls_heap_helper(heap_addr, heap_size); 105*99cd54f3SPankaj Gupta } 106