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