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