1fe7de035SAntonio Nino Diaz /* 2fe7de035SAntonio Nino Diaz * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3fe7de035SAntonio Nino Diaz * 4*82cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5fe7de035SAntonio Nino Diaz */ 6fe7de035SAntonio Nino Diaz 7fe7de035SAntonio Nino Diaz #include <assert.h> 8fe7de035SAntonio Nino Diaz #include <platform_oid.h> 9fe7de035SAntonio Nino Diaz #include <stdint.h> 10fe7de035SAntonio Nino Diaz #include <string.h> 11fe7de035SAntonio Nino Diaz #include "fvp_def.h" 12fe7de035SAntonio Nino Diaz 13fe7de035SAntonio Nino Diaz /* 14fe7de035SAntonio Nino Diaz * Store a new non-volatile counter value. On some FVP versions, the 15fe7de035SAntonio Nino Diaz * non-volatile counters are RO. On these versions we expect the values in the 16fe7de035SAntonio Nino Diaz * certificates to always match the RO values so that this function is never 17fe7de035SAntonio Nino Diaz * called. 18fe7de035SAntonio Nino Diaz * 19fe7de035SAntonio Nino Diaz * Return: 0 = success, Otherwise = error 20fe7de035SAntonio Nino Diaz */ 21fe7de035SAntonio Nino Diaz int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr) 22fe7de035SAntonio Nino Diaz { 23fe7de035SAntonio Nino Diaz const char *oid; 24fe7de035SAntonio Nino Diaz uint32_t *nv_ctr_addr; 25fe7de035SAntonio Nino Diaz 26fe7de035SAntonio Nino Diaz assert(cookie != NULL); 27fe7de035SAntonio Nino Diaz 28fe7de035SAntonio Nino Diaz oid = (const char *)cookie; 29fe7de035SAntonio Nino Diaz if (strcmp(oid, TRUSTED_FW_NVCOUNTER_OID) == 0) { 30fe7de035SAntonio Nino Diaz nv_ctr_addr = (uint32_t *)TFW_NVCTR_BASE; 31fe7de035SAntonio Nino Diaz } else if (strcmp(oid, NON_TRUSTED_FW_NVCOUNTER_OID) == 0) { 32fe7de035SAntonio Nino Diaz nv_ctr_addr = (uint32_t *)NTFW_CTR_BASE; 33fe7de035SAntonio Nino Diaz } else { 34fe7de035SAntonio Nino Diaz return 1; 35fe7de035SAntonio Nino Diaz } 36fe7de035SAntonio Nino Diaz 37fe7de035SAntonio Nino Diaz *(unsigned int *)nv_ctr_addr = nv_ctr; 38fe7de035SAntonio Nino Diaz 39fe7de035SAntonio Nino Diaz /* Verify that the current value is the one we just wrote. */ 40fe7de035SAntonio Nino Diaz if (nv_ctr != (unsigned int)(*nv_ctr_addr)) 41fe7de035SAntonio Nino Diaz return 1; 42fe7de035SAntonio Nino Diaz 43fe7de035SAntonio Nino Diaz return 0; 44fe7de035SAntonio Nino Diaz } 45