Trusted Firmware-A Tests, version 2.0

This is the first public version of the tests for the Trusted
Firmware-A project. Please see the documentation provided in the
source tree for more details.

Change-Id: I6f3452046a1351ac94a71b3525c30a4ca8db7867
Signed-off-by: Sandrine Bailleux <sandrine.bailleux@arm.com>
Co-authored-by: amobal01 <amol.balasokamble@arm.com>
Co-authored-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
Co-authored-by: Asha R <asha.r@arm.com>
Co-authored-by: Chandni Cherukuri <chandni.cherukuri@arm.com>
Co-authored-by: David Cunado <david.cunado@arm.com>
Co-authored-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Co-authored-by: Douglas Raillard <douglas.raillard@arm.com>
Co-authored-by: dp-arm <dimitris.papastamos@arm.com>
Co-authored-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
Co-authored-by: Jonathan Wright <jonathan.wright@arm.com>
Co-authored-by: Kévin Petit <kevin.petit@arm.com>
Co-authored-by: Roberto Vargas <roberto.vargas@arm.com>
Co-authored-by: Sathees Balya <sathees.balya@arm.com>
Co-authored-by: Shawon Roy <Shawon.Roy@arm.com>
Co-authored-by: Soby Mathew <soby.mathew@arm.com>
Co-authored-by: Thomas Abraham <thomas.abraham@arm.com>
Co-authored-by: Vikram Kanigiri <vikram.kanigiri@arm.com>
Co-authored-by: Yatharth Kochar <yatharth.kochar@arm.com>
diff --git a/plat/common/tftf_nvm_accessors.c b/plat/common/tftf_nvm_accessors.c
new file mode 100644
index 0000000..f6d0031
--- /dev/null
+++ b/plat/common/tftf_nvm_accessors.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2018, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <assert.h>
+#include <io_storage.h>
+#include <platform.h>
+#include <platform_def.h>
+#include <spinlock.h>
+#include <status.h>
+#include <string.h>
+#include <tftf_lib.h>
+
+#if USE_NVM
+/* Used to serialize write operations from different CPU's */
+static spinlock_t flash_access_lock;
+#endif
+
+STATUS tftf_nvm_write(unsigned long long offset, const void *buffer, size_t size)
+{
+#if USE_NVM
+	int ret;
+	uintptr_t nvm_handle;
+	size_t length_written;
+#endif
+
+	if (offset + size > TFTF_NVM_SIZE)
+		return STATUS_OUT_OF_RESOURCES;
+
+#if USE_NVM
+	/* Obtain a handle to the NVM by querying the platfom layer */
+	plat_get_nvm_handle(&nvm_handle);
+
+	spin_lock(&flash_access_lock);
+
+	ret = io_seek(nvm_handle, IO_SEEK_SET,
+					offset + TFTF_NVM_OFFSET);
+	if (ret != IO_SUCCESS)
+		goto fail;
+
+	ret = io_write(nvm_handle, (const uintptr_t)buffer, size,
+							 &length_written);
+	if (ret != IO_SUCCESS)
+		goto fail;
+
+	assert(length_written == size);
+fail:
+	spin_unlock(&flash_access_lock);
+
+	if (ret != IO_SUCCESS)
+		return STATUS_FAIL;
+
+#else
+	uintptr_t addr = DRAM_BASE + TFTF_NVM_OFFSET + offset;
+	memcpy((void *)addr, buffer, size);
+#endif
+
+	return STATUS_SUCCESS;
+}
+
+STATUS tftf_nvm_read(unsigned long long offset, void *buffer, size_t size)
+{
+#if USE_NVM
+	int ret;
+	uintptr_t nvm_handle;
+	size_t length_read;
+#endif
+
+	if (offset + size > TFTF_NVM_SIZE)
+		return STATUS_OUT_OF_RESOURCES;
+
+#if USE_NVM
+	/* Obtain a handle to the NVM by querying the platfom layer */
+	plat_get_nvm_handle(&nvm_handle);
+
+	spin_lock(&flash_access_lock);
+
+	ret = io_seek(nvm_handle, IO_SEEK_SET, TFTF_NVM_OFFSET + offset);
+	if (ret != IO_SUCCESS)
+		goto fail;
+
+	ret = io_read(nvm_handle, (uintptr_t)buffer, size, &length_read);
+	if (ret != IO_SUCCESS)
+		goto fail;
+
+	assert(length_read == size);
+fail:
+	spin_unlock(&flash_access_lock);
+
+	if (ret != IO_SUCCESS)
+		return STATUS_FAIL;
+#else
+	uintptr_t addr = DRAM_BASE + TFTF_NVM_OFFSET + offset;
+	memcpy(buffer, (void *)addr, size);
+#endif
+
+	return STATUS_SUCCESS;
+}
+