/*
 * Copyright (c) 2018, Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef __TFTF_H__
#define __TFTF_H__

#ifndef __ASSEMBLY__
#include <status.h>
#include <stddef.h>
#include <tftf_lib.h>

#define TFTF_WELCOME_STR	"Booting trusted firmware test framework"

/* Maximum size of test output (in bytes) */
#define TESTCASE_OUTPUT_MAX_SIZE	512

/* Size of build message used to differentiate different TFTF binaries */
#define BUILD_MESSAGE_SIZE 		0x20

extern const char build_message[];

typedef test_result_t (*test_function_t)(void);

typedef struct {
	/* Test result (success, crashed, failed, ...). */
	test_result_t		result;
	unsigned long long	duration;
	/*
	 * Offset of test output string from TEST_NVM_RESULT_BUFFER_OFFSET.
	 * Only relevant if test has an output, i.e. if \a output_size is not
	 * zero.
	 */
	unsigned		output_offset;
	/* Size of test output string, excluding final \0. */
	unsigned		output_size;
} TESTCASE_RESULT;

typedef struct {
	unsigned		index;
	const char		*name;
	const char		*description;
	test_function_t		test;
} test_case_t;

typedef struct {
	const char		*name;
	const char		*description;
	const test_case_t	*testcases;
} test_suite_t;

/*
 * Reference to a specific test.
 */
typedef struct {
	unsigned int		testsuite_idx;
	unsigned int		testcase_idx;
} test_ref_t;

/*
 * The progress in the execution of a test.
 * This is used to implement the following state machine.
 *
 *  +-> TEST_READY (initial state of the test)                  <--------------+
 *  |        |                                                                 |
 *  |        |  Test framework prepares the test environment.                  |
 *  |        |                                                                 |
 *  |        v                                                                 |
 *  |   TEST_IN_PROGRESS                                                       |
 *  |        |                                                                 |
 *  |        |  Hand over to the test function.                                |
 *  |        |  If the test wants to reboot the platform  ---> TEST_REBOOTING  |
 *  |        |  Test function returns into framework.                |         |
 *  |        |                                                       | Reboot  |
 *  |        |                                                       |         |
 *  |        |                                                       +---------+
 *  |        v
 *  |   TEST_COMPLETE
 *  |        |
 *  |        |  Do some framework management.
 *  |        |  Move to next test.
 *  +--------+
 */
typedef enum {
	TEST_PROGRESS_MIN = 0,
	TEST_READY = TEST_PROGRESS_MIN,
	TEST_IN_PROGRESS,
	TEST_COMPLETE,
	TEST_REBOOTING,

	TEST_PROGRESS_MAX,
} test_progress_t;

#define TEST_PROGRESS_IS_VALID(_progress)	\
	((_progress >= TEST_PROGRESS_MIN) && (_progress < TEST_PROGRESS_MAX))

/*
 * The definition of this global variable is generated by the script
 * 'tftf_generate_test_list' during the build process
 */
extern const test_suite_t testsuites[];

extern TESTCASE_RESULT testcase_results[];

/* Set/Get the test to run in NVM */
STATUS tftf_set_test_to_run(const test_ref_t test_to_run);
STATUS tftf_get_test_to_run(test_ref_t *test_to_run);
/* Set/Get the progress of the current test in NVM */
STATUS tftf_set_test_progress(test_progress_t test_progress);
STATUS tftf_get_test_progress(test_progress_t *test_progress);

/**
** Save test result into NVM.
*/
STATUS tftf_testcase_set_result(const test_case_t *testcase,
				test_result_t result,
				unsigned long long duration);
/**
** Get a testcase result from NVM.
**
** @param[in]  testcase The targeted testcase.
** @param[out] result Testcase result. Only \a result.result and
**   \a result.duration are of interest for the caller and the 2 other fields
**   should be ignored (they correspond to a location in NVM).
** @param[out] test_output Buffer to store the test output, if any.
**   \a test_output must be big enough to hold the whole test output.
**   Test output will be \a TESTCASE_OUTPUT_MAX_SIZE bytes maximum.
*/
STATUS tftf_testcase_get_result(const test_case_t *testcase, TESTCASE_RESULT *result, char *test_output);

void tftf_report_generate(void);

/*
 * Exit the TFTF.
 * This function can be used when a fatal error is encountered or as part of the
 * normal termination process. It does the necessary cleanups then put the
 * core in a low-power state.
 */
void __dead2 tftf_exit(void);

void tftf_arch_setup(void);

/*
 * This function detects the power state format used by PSCI which can
 * be either extended or original format. For the Original format,
 * the State-ID can either be NULL or can be using the recommended encoding.
 * This function needs to be invoked once during cold boot prior to the
 * invocation of any PSCI power state helper functions.
 */
void tftf_detect_psci_pstate_format(void);

/*
 * Run the next test on the calling CPU.
 * Once the test is complete, if the calling CPU is the last one to exit the
 * test then do the necessary bookkeeping, report the overall test result and
 * move on to the next test. Otherwise, shut down the calling CPU.
 *
 * This function never returns.
 */
void __dead2 run_tests(void);

/* Entry point for a CPU that has just been powered up */
void tftf_hotplug_entry(void);

#endif /*__ASSEMBLY__*/

#endif
