/*
 * Copyright (c) 2018 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <kernel.h>
#include <flash.h>
#include <device.h>
#include <ztest.h>

#define MAX_NUM_OF_SECTORS		1024
#define NUM_OF_SECTORS_TO_TEST		4
#define FLASH_SECTOR_SIZE		65536
#define TEST_DATA_LEN			4

void test_qspi_flash(void)
{
	struct device *flash_dev;
	u32_t i, offset, rd_val, wr_val;

	flash_dev = device_get_binding(CONFIG_SOC_FLASH_NIOS2_QSPI_DEV_NAME);
	zassert_equal(!flash_dev, TC_PASS, "Flash device not found!");

	for (i = 0U; i < NUM_OF_SECTORS_TO_TEST; i++) {
		TC_PRINT("\nTesting: Flash Sector-%d\n", i);
		offset = FLASH_SECTOR_SIZE * i;

		/* Flash Erase Test */
		TC_PRINT("	Flash Erase Test...");
		zassert_equal(flash_erase(flash_dev,
				offset, FLASH_SECTOR_SIZE),
				TC_PASS, "Flash erase call failed!");
		zassert_equal(flash_read(flash_dev, offset,
				&rd_val, TEST_DATA_LEN),
				TC_PASS, "Flash read call failed!");
		/* In case of erase all bits will be set to 1 */
		wr_val = 0xffffffff;
		zassert_equal(rd_val != wr_val,	TC_PASS,
					"Flash Erase Test failed!!");
		TC_PRINT("PASS\n");


		/* Flash Write & Read Test */
		TC_PRINT("	Flash Write & Read Test...");
		wr_val = 0xAABBCCDD;
		zassert_equal(flash_write(flash_dev, offset,
				&wr_val, TEST_DATA_LEN),
				TC_PASS, "Flash write call failed!");
		zassert_equal(flash_read(flash_dev, offset,
				&rd_val, TEST_DATA_LEN),
				TC_PASS, "Flash read call failed!");
		zassert_equal(rd_val != wr_val,	TC_PASS,
					"Flash Write & Read Test failed!!");
		TC_PRINT("PASS\n");


		/* Flash Lock Test */
		TC_PRINT("	Flash Lock Test...");
		zassert_equal(flash_write_protection_set(flash_dev, true),
				TC_PASS, "Flash write protection call failed!");
		/* Ignore erase failure as it is expected */
		flash_erase(flash_dev, offset, FLASH_SECTOR_SIZE);
		zassert_equal(flash_read(flash_dev, offset,
				&rd_val, TEST_DATA_LEN),
				TC_PASS, "Flash read call failed!");
		/*
		 * we should read back the previous value (wr_val)
		 * as we have locked the flash which will block erase
		 * and write operations.
		 */
		zassert_equal(rd_val != wr_val, TC_PASS,
					"Flash Lock Test failed!!");
		TC_PRINT("PASS\n");


		/* Flash Unlock Test */
		TC_PRINT("	Flash Unlock Test...");
		zassert_equal(flash_write_protection_set(flash_dev, false),
				TC_PASS, "Flash write protection call failed!");
		zassert_equal(flash_erase(flash_dev,
				offset, FLASH_SECTOR_SIZE),
				TC_PASS, "Flash erase call failed!");
		zassert_equal(flash_read(flash_dev, offset,
				&rd_val, TEST_DATA_LEN),
				TC_PASS, "Flash read call failed!");
		/* In case of erase all bits will be set to 1 */
		wr_val = 0xffffffff;
		zassert_equal(rd_val != wr_val, TC_PASS,
					"Flash Unlock Test failed!!");
		TC_PRINT("PASS\n");
	}
}

void test_main(void)
{
	ztest_test_suite(nios2_qspi_test_suite,
			ztest_unit_test(test_qspi_flash));
	ztest_run_test_suite(nios2_qspi_test_suite);
}
