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