/*
 * 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 testing_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 = 0; 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(testing_qspi_flash));
	ztest_run_test_suite(nios2_qspi_test_suite);
}
