1fe7de035SAntonio Nino Diaz /* 2*bd363d35SSandrine Bailleux * Copyright (c) 2016-2019, 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 11*bd363d35SSandrine Bailleux #include <lib/mmio.h> 12*bd363d35SSandrine Bailleux 1309d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 14234bc7f8SAntonio Nino Diaz #include <platform_def.h> 1509d40e0eSAntonio Nino Diaz #include <tools_share/tbbr_oid.h> 16232c6b34SMasahiro Yamada 17fe7de035SAntonio Nino Diaz /* 18*bd363d35SSandrine Bailleux * Store a new non-volatile counter value. 19*bd363d35SSandrine Bailleux * 20*bd363d35SSandrine Bailleux * On some FVP versions, the non-volatile counters are read-only so this 21*bd363d35SSandrine Bailleux * function will always fail. 22fe7de035SAntonio Nino Diaz * 23fe7de035SAntonio Nino Diaz * Return: 0 = success, Otherwise = error 24fe7de035SAntonio Nino Diaz */ 25fe7de035SAntonio Nino Diaz int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr) 26fe7de035SAntonio Nino Diaz { 27fe7de035SAntonio Nino Diaz const char *oid; 28*bd363d35SSandrine Bailleux uintptr_t nv_ctr_addr; 29fe7de035SAntonio Nino Diaz 30fe7de035SAntonio Nino Diaz assert(cookie != NULL); 31fe7de035SAntonio Nino Diaz 32fe7de035SAntonio Nino Diaz oid = (const char *)cookie; 33fe7de035SAntonio Nino Diaz if (strcmp(oid, TRUSTED_FW_NVCOUNTER_OID) == 0) { 34*bd363d35SSandrine Bailleux nv_ctr_addr = TFW_NVCTR_BASE; 35fe7de035SAntonio Nino Diaz } else if (strcmp(oid, NON_TRUSTED_FW_NVCOUNTER_OID) == 0) { 36*bd363d35SSandrine Bailleux nv_ctr_addr = NTFW_CTR_BASE; 37fe7de035SAntonio Nino Diaz } else { 38fe7de035SAntonio Nino Diaz return 1; 39fe7de035SAntonio Nino Diaz } 40fe7de035SAntonio Nino Diaz 41*bd363d35SSandrine Bailleux mmio_write_32(nv_ctr_addr, nv_ctr); 42fe7de035SAntonio Nino Diaz 43*bd363d35SSandrine Bailleux /* 44*bd363d35SSandrine Bailleux * If the FVP models a locked counter then its value cannot be updated 45*bd363d35SSandrine Bailleux * and the above write operation has been silently ignored. 46*bd363d35SSandrine Bailleux */ 47*bd363d35SSandrine Bailleux return (mmio_read_32(nv_ctr_addr) == nv_ctr) ? 0 : 1; 48fe7de035SAntonio Nino Diaz } 49