xref: /rk3399_ARM-atf/plat/arm/board/fvp/fvp_trusted_boot.c (revision 14d095c3446e2fd7316f696b8391df7d9520b514)
1fe7de035SAntonio Nino Diaz /*
2a6ffddecSMax Shvetsov  * Copyright (c) 2016-2020, ARM Limited and Contributors. All rights reserved.
3fe7de035SAntonio Nino Diaz  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
5fe7de035SAntonio Nino Diaz  */
6fe7de035SAntonio Nino Diaz 
7fe7de035SAntonio Nino Diaz #include <assert.h>
8fe7de035SAntonio Nino Diaz #include <stdint.h>
9fe7de035SAntonio Nino Diaz #include <string.h>
1009d40e0eSAntonio Nino Diaz 
11bd363d35SSandrine Bailleux #include <lib/mmio.h>
12*14d095c3SManish V Badarkhe #include <lib/fconf/fconf.h>
13a6ffddecSMax Shvetsov #include <plat/arm/common/plat_arm.h>
14*14d095c3SManish V Badarkhe #include <plat/arm/common/fconf_nv_cntr_getter.h>
1509d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
16234bc7f8SAntonio Nino Diaz #include <platform_def.h>
1709d40e0eSAntonio Nino Diaz #include <tools_share/tbbr_oid.h>
18232c6b34SMasahiro Yamada 
19fe7de035SAntonio Nino Diaz /*
20a6ffddecSMax Shvetsov  * Return the ROTPK hash in the following ASN.1 structure in DER format:
21a6ffddecSMax Shvetsov  *
22a6ffddecSMax Shvetsov  * AlgorithmIdentifier  ::=  SEQUENCE  {
23a6ffddecSMax Shvetsov  *     algorithm         OBJECT IDENTIFIER,
24a6ffddecSMax Shvetsov  *     parameters        ANY DEFINED BY algorithm OPTIONAL
25a6ffddecSMax Shvetsov  * }
26a6ffddecSMax Shvetsov  *
27a6ffddecSMax Shvetsov  * DigestInfo ::= SEQUENCE {
28a6ffddecSMax Shvetsov  *     digestAlgorithm   AlgorithmIdentifier,
29a6ffddecSMax Shvetsov  *     digest            OCTET STRING
30a6ffddecSMax Shvetsov  * }
31a6ffddecSMax Shvetsov  */
32a6ffddecSMax Shvetsov int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
33a6ffddecSMax Shvetsov 			unsigned int *flags)
34a6ffddecSMax Shvetsov {
3588005701SSandrine Bailleux 	return arm_get_rotpk_info(cookie, key_ptr, key_len, flags);
36a6ffddecSMax Shvetsov }
37a6ffddecSMax Shvetsov 
38a6ffddecSMax Shvetsov /*
39bd363d35SSandrine Bailleux  * Store a new non-volatile counter value.
40bd363d35SSandrine Bailleux  *
41bd363d35SSandrine Bailleux  * On some FVP versions, the non-volatile counters are read-only so this
42bd363d35SSandrine Bailleux  * function will always fail.
43fe7de035SAntonio Nino Diaz  *
44fe7de035SAntonio Nino Diaz  * Return: 0 = success, Otherwise = error
45fe7de035SAntonio Nino Diaz  */
46fe7de035SAntonio Nino Diaz int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
47fe7de035SAntonio Nino Diaz {
48fe7de035SAntonio Nino Diaz 	const char *oid;
49bd363d35SSandrine Bailleux 	uintptr_t nv_ctr_addr;
50fe7de035SAntonio Nino Diaz 
51fe7de035SAntonio Nino Diaz 	assert(cookie != NULL);
52fe7de035SAntonio Nino Diaz 
53fe7de035SAntonio Nino Diaz 	oid = (const char *)cookie;
54fe7de035SAntonio Nino Diaz 	if (strcmp(oid, TRUSTED_FW_NVCOUNTER_OID) == 0) {
55*14d095c3SManish V Badarkhe 		nv_ctr_addr = FCONF_GET_PROPERTY(cot, nv_cntr_addr,
56*14d095c3SManish V Badarkhe 						TRUSTED_NV_CTR_ID);
57fe7de035SAntonio Nino Diaz 	} else if (strcmp(oid, NON_TRUSTED_FW_NVCOUNTER_OID) == 0) {
58*14d095c3SManish V Badarkhe 		nv_ctr_addr = FCONF_GET_PROPERTY(cot, nv_cntr_addr,
59*14d095c3SManish V Badarkhe 						NON_TRUSTED_NV_CTR_ID);
60fe7de035SAntonio Nino Diaz 	} else {
61fe7de035SAntonio Nino Diaz 		return 1;
62fe7de035SAntonio Nino Diaz 	}
63fe7de035SAntonio Nino Diaz 
64bd363d35SSandrine Bailleux 	mmio_write_32(nv_ctr_addr, nv_ctr);
65fe7de035SAntonio Nino Diaz 
66bd363d35SSandrine Bailleux 	/*
67bd363d35SSandrine Bailleux 	 * If the FVP models a locked counter then its value cannot be updated
68bd363d35SSandrine Bailleux 	 * and the above write operation has been silently ignored.
69bd363d35SSandrine Bailleux 	 */
70bd363d35SSandrine Bailleux 	return (mmio_read_32(nv_ctr_addr) == nv_ctr) ? 0 : 1;
71fe7de035SAntonio Nino Diaz }
72