/** @file
 *
 * C99 common FSP definitions from
 * Intel Firmware Support Package External Architecture Specification v2.0
 *
 * These definitions come in a format that is usable outside an EFI environment.
 **/
#ifndef FSP_H_C99_H
#define FSP_H_C99_H

#include <stdint.h>

enum {
	FSP_STATUS_RESET_REQUIRED_COLD		= 0x40000001,
	FSP_STATUS_RESET_REQUIRED_WARM		= 0x40000002,
	FSP_STATUS_RESET_REQUIRED_3		= 0x40000003,
	FSP_STATUS_RESET_REQUIRED_4		= 0x40000004,
	FSP_STATUS_RESET_REQUIRED_5		= 0x40000005,
	FSP_STATUS_RESET_REQUIRED_6		= 0x40000006,
	FSP_STATUS_RESET_REQUIRED_7		= 0x40000007,
	FSP_STATUS_RESET_REQUIRED_8		= 0x40000008,
};

typedef enum {
	EnumInitPhaseAfterPciEnumeration	= 0x20,
	EnumInitPhaseReadyToBoot		= 0x40,
	EnumInitPhaseEndOfFirmware		= 0xF0
} FSP_INIT_PHASE;

typedef struct __packed {
	uint64_t	Signature;
	uint8_t		Revision;
	uint8_t		Reserved[23];
} FSP_UPD_HEADER;

_Static_assert(sizeof(FSP_UPD_HEADER) == 32, "FSP_UPD_HEADER not packed");

#if CONFIG(PLATFORM_USES_FSP2_X86_32)
typedef struct __packed {
	uint8_t		Revision;
	uint8_t		Reserved[3];
	/* Note: This ought to be void*, but that won't allow calling this binary on x86_64. */
	uint32_t	NvsBufferPtr;
	/* Note: This ought to be void*, but that won't allow calling this binary on x86_64. */
	uint32_t	StackBase;
	uint32_t	StackSize;
	uint32_t	BootLoaderTolumSize;
	uint32_t	BootMode;
	uint8_t		Reserved1[8];
} FSPM_ARCH_UPD;

_Static_assert(sizeof(FSPM_ARCH_UPD) == 32, "FSPM_ARCH_UPD not packed");
#else
#error You need to implement this struct for x86_64 FSP
#endif

#endif /* FSP_H_C99_H */
