106 lines
2.0 KiB
C
106 lines
2.0 KiB
C
/*
|
|
* Copyright 2018-2021 NXP
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*
|
|
*/
|
|
|
|
#include <assert.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
#include <common/debug.h>
|
|
#include <lib/cassert.h>
|
|
#include <sfp.h>
|
|
#include <tools_share/tbbr_oid.h>
|
|
|
|
#include <plat/common/platform.h>
|
|
#include "plat_common.h"
|
|
|
|
extern char nxp_rotpk_hash[], nxp_rotpk_hash_end[];
|
|
|
|
int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
|
|
unsigned int *flags)
|
|
{
|
|
*key_ptr = nxp_rotpk_hash;
|
|
*key_len = nxp_rotpk_hash_end - nxp_rotpk_hash;
|
|
*flags = ROTPK_IS_HASH;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr)
|
|
{
|
|
const char *oid;
|
|
uint32_t uid_num;
|
|
uint32_t val = 0U;
|
|
|
|
assert(cookie != NULL);
|
|
assert(nv_ctr != NULL);
|
|
|
|
oid = (const char *)cookie;
|
|
if (strcmp(oid, TRUSTED_FW_NVCOUNTER_OID) == 0) {
|
|
uid_num = 3U;
|
|
} else if (strcmp(oid, NON_TRUSTED_FW_NVCOUNTER_OID) == 0) {
|
|
uid_num = 4U;
|
|
} else {
|
|
return 1;
|
|
}
|
|
|
|
val = sfp_read_oem_uid(uid_num);
|
|
|
|
INFO("SFP Value read is %x from UID %d\n", val, uid_num);
|
|
if (val == 0U) {
|
|
*nv_ctr = 0U;
|
|
} else {
|
|
*nv_ctr = (32U - __builtin_clz(val));
|
|
}
|
|
|
|
INFO("NV Counter value for UID %d is %d\n", uid_num, *nv_ctr);
|
|
return 0;
|
|
|
|
}
|
|
|
|
int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
|
|
{
|
|
const char *oid;
|
|
uint32_t uid_num, sfp_val;
|
|
|
|
assert(cookie != NULL);
|
|
|
|
/* Counter values upto 32 are supported */
|
|
if (nv_ctr > 32U) {
|
|
return 1;
|
|
}
|
|
|
|
oid = (const char *)cookie;
|
|
if (strcmp(oid, TRUSTED_FW_NVCOUNTER_OID) == 0) {
|
|
uid_num = 3U;
|
|
} else if (strcmp(oid, NON_TRUSTED_FW_NVCOUNTER_OID) == 0) {
|
|
uid_num = 4U;
|
|
} else {
|
|
return 1;
|
|
}
|
|
sfp_val = (1U << (nv_ctr - 1));
|
|
|
|
if (sfp_write_oem_uid(uid_num, sfp_val) == 1) {
|
|
/* Enable POVDD on board */
|
|
if (board_enable_povdd()) {
|
|
sfp_program_fuses();
|
|
}
|
|
|
|
/* Disable POVDD on board */
|
|
board_disable_povdd();
|
|
} else {
|
|
ERROR("Invalid OEM UID sent.\n");
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
|
|
{
|
|
return get_mbedtls_heap_helper(heap_addr, heap_size);
|
|
}
|