xref: /rk3399_ARM-atf/plat/nxp/common/tbbr/x509_tbbr.c (revision 9719e19a977df3e8bf7567b3c0e1d6b2ebc5b46f)
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 
plat_get_rotpk_info(void * cookie,void ** key_ptr,unsigned int * key_len,unsigned int * flags)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 
plat_get_nv_ctr(void * cookie,unsigned int * nv_ctr)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 
plat_set_nv_ctr(void * cookie,unsigned int nv_ctr)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 
plat_get_mbedtls_heap(void ** heap_addr,size_t * heap_size)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