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

#ifndef ZEPHYR_ARCH_X86_EFI_H_
#define ZEPHYR_ARCH_X86_EFI_H_

#ifndef _ASMLANGUAGE

#include <stdbool.h>
#include <sys/util.h>

#define __abi __attribute__((ms_abi))

/*
 * This is a quick installment of EFI structures and functions.
 * Only a very minimal subset will be used and documented, thus the
 * lack of documentation at the moment.
 * See the UEFI 2.8b specifications for more information
 * at https://www.uefi.org/specifications
 */

/* Note: all specified attributes/parameters of type char16_t have been
 * translated to uint16_t as, for now, we don't have char16_t and we don't
 * care being pedantic, plus we do not use it yet.
 * This will need to be changed if required.
 */

typedef uintptr_t efi_status_t;

#define EFI_STATUS(_status)		(_status | BIT((BITS_PER_LONG-1)))

#define EFI_SUCCESS			0
#define EFI_LOAD_ERROR			EFI_STATUS(1)
#define EFI_INVALID_PARAMETER		EFI_STATUS(2)
#define EFI_UNSUPPORTED			EFI_STATUS(3)
#define EFI_BAD_BUFFER_SIZE		EFI_STATUS(4)
#define EFI_BUFFER_TOO_SMALL		EFI_STATUS(5)
#define EFI_NOT_READY			EFI_STATUS(6)
#define EFI_DEVICE_ERROR		EFI_STATUS(7)
#define EFI_WRITE_PROTECTED		EFI_STATUS(8)
#define EFI_OUT_OF_RESOURCES		EFI_STATUS(9)
#define EFI_VOLUME_CORRUPTED		EFI_STATUS(10)
#define EFI_VOLUME_FULL			EFI_STATUS(11)
#define EFI_NO_MEDIA			EFI_STATUS(12)
#define EFI_MEDIA_CHANGED		EFI_STATUS(13)
#define EFI_NOT_FOUND			EFI_STATUS(14)
#define EFI_ACCESS_DENIED		EFI_STATUS(15)
#define EFI_NO_RESPONSE			EFI_STATUS(16)
#define EFI_NO_MAPPING			EFI_STATUS(17)
#define EFI_TIMEOUT			EFI_STATUS(18)
#define EFI_NOT_STARTED			EFI_STATUS(19)
#define EFI_ALREADY_STARTED		EFI_STATUS(20)
#define EFI_ABORTED			EFI_STATUS(21)
#define EFI_ICMP_ERROR			EFI_STATUS(22)
#define EFI_TFTP_ERROR			EFI_STATUS(23)
#define EFI_PROTOCOL_ERROR		EFI_STATUS(24)
#define EFI_INCOMPATIBLE_VERSION	EFI_STATUS(25)
#define EFI_SECURITY_VIOLATION		EFI_STATUS(26)
#define EFI_CRC_ERROR			EFI_STATUS(27)
#define EFI_END_OF_MEDIA		EFI_STATUS(28)
#define EFI_END_OF_FILE			EFI_STATUS(31)
#define EFI_INVALID_LANGUAGE		EFI_STATUS(32)
#define EFI_COMPROMISED_DATA		EFI_STATUS(33)
#define EFI_IP_ADDRESS_CONFLICT		EFI_STATUS(34)
#define EFI_HTTP_ERROR			EFI_STATUS(35)

typedef struct {
	union {
		struct {
			uint32_t Data1;
			uint16_t Data2;
			uint16_t Data3;
			uint8_t Data4[8];
		};

		/* Easier for comparison */
		struct {
			uint64_t Part1;
			uint64_t Part2;
		};
	};
} efi_guid_t;

struct efi_input_key {
	uint16_t ScanCode;
	uint16_t UnicodeChar;
};

struct efi_table_header {
	uint64_t Signature;
	uint32_t Revision;
	uint32_t HeaderSize;
	uint32_t CRC32;
	uint32_t Reserved;
};

struct efi_simple_text_input;

typedef efi_status_t __abi (*efi_input_reset_t)(
	struct efi_simple_text_input *This,
	bool ExtendedVerification);
typedef efi_status_t __abi (*efi_input_read_key_t)(
	struct efi_simple_text_input *This,
	struct efi_input_key *Key);

struct efi_simple_text_input {
	efi_input_reset_t Reset;
	efi_input_read_key_t ReadKeyStroke;
	void *WaitForKey;
};

struct efi_simple_text_output_mode {
	int32_t MaxMode;
	int32_t Mode;
	int32_t Attribute;
	int32_t CursorColumn;
	int32_t CursorRow;
	bool CursorVisible;
};

struct efi_simple_text_output;

typedef efi_status_t __abi (*efi_text_reset_t)(
	struct efi_simple_text_output *This,
	bool ExtendedVerification);

typedef efi_status_t __abi (*efi_text_string_t)(
	struct efi_simple_text_output *This,
	uint16_t *String);

typedef efi_status_t __abi (*efi_text_test_string_t)(
	struct efi_simple_text_output *This,
	uint16_t *String);

typedef efi_status_t __abi (*efi_text_query_mode_t)(
	struct efi_simple_text_output *This,
	uintptr_t ModeNumber,
	uintptr_t *Columns,
	uintptr_t *Rows);

typedef efi_status_t __abi (*efi_text_set_mode_t)(
	struct efi_simple_text_output *This,
	uintptr_t ModeNumber);

typedef efi_status_t __abi (*efi_text_set_attribute_t)(
	struct efi_simple_text_output *This,
	uintptr_t Attribute);

typedef efi_status_t __abi (*efi_text_clear_screen_t)(
	struct efi_simple_text_output *This);

typedef efi_status_t __abi (*efi_text_cursor_position_t)(
	struct efi_simple_text_output *This,
	uintptr_t Column,
	uintptr_t Row);

typedef efi_status_t __abi (*efi_text_enable_cursor_t)(
	struct efi_simple_text_output *This,
	bool Visible);

struct efi_simple_text_output {
	efi_text_reset_t Reset;
	efi_text_string_t OutputString;
	efi_text_test_string_t TestString;
	efi_text_query_mode_t QueryMode;
	efi_text_set_mode_t SetMode;
	efi_text_set_attribute_t SetAttribute;
	efi_text_clear_screen_t ClearScreen;
	efi_text_cursor_position_t SetCursorPosition;
	efi_text_enable_cursor_t EnableCursor;
	struct efi_simple_text_output_mode *Mode;
};

struct efi_time {
	uint16_t Year;
	uint8_t Month;
	uint8_t Day;
	uint8_t Hour;
	uint8_t Minute;
	uint8_t Second;
	uint8_t Pad1;
	uint32_t NanoSecond;
	int16_t TimeZone;
	uint8_t DayLight;
	uint8_t Pad2;
};

struct efi_time_capabilities {
	uint32_t Resolution;
	uint32_t Accuracy;
	bool SetsToZero;
};

struct efi_memory_descriptor {
	uint32_t Type;
	uint64_t PhysicalStart;
	uint64_t VirtualStart;
	uint64_t NumberOfPages;
	uint64_t Attribute;
};

typedef efi_status_t __abi (*efi_get_time_t)(
	struct efi_time *Time,
	struct efi_time_capabilities *Capabilities);

typedef efi_status_t __abi (*efi_set_time_t)(struct efi_time *Time);

typedef efi_status_t __abi (*efi_get_wakeup_time_t)(bool *Enabled,
						    bool *Pending,
						    struct efi_time *Time);

typedef efi_status_t __abi (*efi_set_wakeup_time_t)(bool Enabled,
						    struct efi_time *Time);

typedef efi_status_t __abi (*efi_set_virtual_address_map_t)(
	uintptr_t MemoryMapSize,
	uintptr_t DescriptorSize,
	uint32_t DescriptorVersion,
	struct efi_memory_descriptor *VirtualMap);

typedef efi_status_t __abi (*efi_convert_pointer_t)(uintptr_t DebugDisposition,
						    void **Address);

typedef efi_status_t __abi (*efi_get_variable_t)(uint16_t *VariableName,
					      efi_guid_t *VendorGuid,
					      uint32_t *Attributes,
					      uintptr_t *DataSize,
					      void *Data);

typedef efi_status_t __abi (*efi_get_next_variable_name_t)(
	uintptr_t *VariableNameSize,
	uint16_t *VariableName,
	efi_guid_t *VendorGuid);

typedef efi_status_t __abi (*efi_set_variable_t)(uint16_t *VariableName,
						 efi_guid_t *VendorGuid,
						 uint32_t *Attributes,
						 uintptr_t *DataSize,
						 void *Data);

typedef efi_status_t __abi (*efi_get_next_high_monotonic_count_t)(
	uint32_t *HighCount);

enum efi_reset_type {
	EfiResetCold,
	EfiResetWarm,
	EfiResetShutdown,
	EfiResetPlatformSpecific
};

typedef efi_status_t __abi (*efi_reset_system_t)(
	enum efi_reset_type ResetType,
	uintptr_t ResetStatus,
	uintptr_t DataSize,
	void *ResetData);

struct efi_capsule_header {
	efi_guid_t CapsuleGuid;
	uint32_t HeaderSize;
	uint32_t Flags;
	uint32_t CapsuleImageSize;
};

typedef efi_status_t __abi (*efi_update_capsule_t)(
	struct efi_capsule_header **CapsuleHeaderArray,
	uintptr_t CapsuleCount,
	uint64_t ScatterGatherList);

typedef efi_status_t __abi (*efi_query_capsule_capabilities_t)(
	struct efi_capsule_header **CapsuleHeaderArray,
	uintptr_t CapsuleCount,
	uint64_t *MaximumCapsuleSize,
	enum efi_reset_type ResetType);

typedef efi_status_t __abi (*efi_query_variable_info_t)(
	uint32_t Attributes,
	uint64_t *MaximumVariableStorageSize,
	uint64_t *RemainingVariableStorageSize,
	uint64_t *MaximumVariableSize);

struct efi_runtime_services {
	struct efi_table_header Hdr;
	efi_get_time_t GetTime;
	efi_set_time_t SetTime;
	efi_get_wakeup_time_t GetWakeupTime;
	efi_set_wakeup_time_t SetWakeupTime;
	efi_set_virtual_address_map_t SetVirtualAddressMap;
	efi_convert_pointer_t ConvertPointer;
	efi_get_variable_t GetVariable;
	efi_get_next_variable_name_t GetNextVariableName;
	efi_set_variable_t SetVariable;
	efi_get_next_high_monotonic_count_t GetNextHighMonotonicCount;
	efi_reset_system_t ResetSystem;
	efi_update_capsule_t UpdateCapsule;
	efi_query_capsule_capabilities_t QueryCapsuleCapabilities;
	efi_query_variable_info_t QueryVariableInfo;
};

typedef uintptr_t __abi (*efi_raise_tpl_t)(uintptr_t NewTpl);

typedef void __abi (*efi_restore_tpl_t)(uintptr_t OldTpl);

enum efi_allocate_type {
	AllocateAnyPages,
	AllocateMaxAddress,
	AllocateAddress,
	MaxAllocateType
};

enum efi_memory_type {
	EfiReservedMemoryType,
	EfiLoaderCode,
	EfiLoaderData,
	EfiBootServicesCode,
	EfiBootServicesData,
	EfiRuntimeServicesCode,
	EfiRuntimeServicesData,
	EfiConventionalMemory,
	EfiUnusableMemory,
	EfiACPIReclaimMemory,
	EfiACPIMemoryNVS,
	EfiMemoryMappedIO,
	EfiMemoryMappedIOPortSpace,
	EfiPalCode,
	EfiPersistentMemory,
	EfiMaxMemoryType
};

typedef efi_status_t __abi (*efi_allocate_pages_t)(
	enum efi_allocate_type Type,
	enum efi_memory_type MemoryType,
	uintptr_t Pages,
	uint64_t *Memory);

typedef efi_status_t __abi (*efi_free_pages_t)(uint64_t Memory,
					       uintptr_t Pages);

typedef efi_status_t __abi (*efi_get_memory_map_t)(
	uintptr_t *MemoryMapSize,
	struct efi_memory_descriptor *MemoryMap,
	uintptr_t *MapKey,
	uintptr_t *DescriptorSize,
	uint32_t *DescriptorVersion);

typedef efi_status_t __abi (*efi_allocate_pool_t)(
	enum efi_memory_type PoolType,
	uintptr_t Size,
	void **Buffer);

typedef efi_status_t __abi (*efi_free_pool_t)(void *Buffer);

typedef void __abi (*efi_notify_function_t)(void *Event,
					    void *context);

typedef efi_status_t __abi (*efi_create_event_t)(
	uint32_t Type,
	uintptr_t NotifyTpl,
	efi_notify_function_t NotifyFunction,
	void *NotifyContext,
	void **Event);

enum efi_timer_delay {
	TimerCancel,
	TimerPeriodic,
	TimerRelative
};

typedef efi_status_t __abi (*efi_set_timer_t)(void *Event,
					      enum efi_timer_delay Type,
					      uint64_t TriggerTime);

typedef efi_status_t __abi (*efi_wait_for_event_t)(uintptr_t NumberOfEvents,
						   void **Event,
						   uintptr_t *Index);

typedef efi_status_t __abi (*efi_signal_event_t)(void *Event);

typedef efi_status_t __abi (*efi_close_event_t)(void *Event);

typedef efi_status_t __abi (*efi_check_event_t)(void *Event);

enum efi_interface_type {
	EFI_NATIVE_INTERFACE
};

typedef efi_status_t __abi (*efi_install_protocol_interface_t)(
	void **Handle,
	efi_guid_t *Protocol,
	enum efi_interface_type InterfaceType,
	void *Interface);

typedef efi_status_t __abi (*efi_reinstall_protocol_interface_t)(
	void **Handle,
	efi_guid_t *Protocol,
	void *OldInterface,
	void *NewInterface);

typedef efi_status_t __abi (*efi_uninstall_protocol_interface_t)(
	void **Handle,
	efi_guid_t *Protocol,
	void *Interface);

typedef efi_status_t __abi (*efi_handle_protocol_t)(
	void **Handle,
	efi_guid_t *Protocol,
	void **Interface);

typedef efi_status_t __abi (*efi_register_protocol_notify_t)(
	efi_guid_t *Protocol,
	void *Event,
	void **Registration);

enum efi_locate_search_type {
	AllHandles,
	ByRegisterNotify,
	ByProtocol
};

typedef efi_status_t __abi (*efi_locate_handle_t)(
	enum efi_locate_search_type SearchType,
	efi_guid_t *Protocol,
	void *SearchKey,
	uintptr_t *BufferSize,
	void **Buffer);

struct efi_device_path_protocol {
	uint8_t Type;
	uint8_t SubType;
	uint8_t Length[2];
};

typedef efi_status_t __abi (*efi_locate_device_path_t)(
	efi_guid_t *Protocol,
	struct efi_device_path_protocol **DevicePath,
	void **Handle);

typedef efi_status_t __abi (*efi_install_configuration_table_t)(
	efi_guid_t *Guid,
	void *Table);

typedef efi_status_t __abi (*efi_load_image_t)(
	bool BootPolicy,
	void *ParentImageHandle,
	struct efi_device_path_protocol *DevicePath,
	void *SourceBuffer,
	uintptr_t SourceSize,
	void **ImageHandle);

typedef efi_status_t __abi (*efi_start_image_t)(void *ImageHandle,
						uintptr_t *ExitDataSize,
						uint16_t **ExitData);

typedef efi_status_t __abi (*efi_exit_t)(void *ImageHandle,
					 uintptr_t ExitStatus,
					 uintptr_t ExitDataSize,
					 uint16_t *ExitData);

typedef efi_status_t __abi (*efi_unload_image_t)(void *ImageHandle);

typedef efi_status_t __abi (*efi_exit_boot_services_t)(void *ImageHandle,
						       uintptr_t MapKey);

typedef efi_status_t __abi (*efi_get_next_monotonic_count_t)(uint64_t *Count);

typedef efi_status_t __abi (*efi_stall_t)(uintptr_t Microseconds);

typedef efi_status_t __abi (*efi_set_watchdog_timer_t)(uintptr_t Timeout,
						       uint64_t WatchdogCode,
						       uintptr_t DataSize,
						       uint16_t *WatchdogData);

typedef efi_status_t __abi (*efi_connect_controller_t)(
	void *ControllerHandle,
	void **DriverImageHandle,
	struct efi_device_path_protocol *RemainingDevicePath,
	bool Recursive);

typedef efi_status_t __abi (*efi_disconnect_controller_t)(
	void *ControllerHandle,
	void *DriverImageHandle,
	void *ChildHandle);

typedef efi_status_t __abi (*efi_open_protocol_t)(void *Handle,
						  efi_guid_t *Protocol,
						  void **Interface,
						  void *AgentHandle,
						  void *ControllerHandle,
						  uint32_t Attributes);

typedef efi_status_t __abi (*efi_close_protocol_t)(void *Handle,
						   efi_guid_t *Protocol,
						   void *AgentHandle,
						   void *ControllerHandle);

struct efi_open_protocol_information_entry {
	void *AgentHandle;
	void *ControllerHandle;
	uint32_t Attributes;
	uint32_t OpenCount;
};

typedef efi_status_t __abi (*efi_open_protocol_information_t)(
	void *Handle,
	efi_guid_t *Protocol,
	struct efi_open_protocol_information_entry **EntryBuffer,
	uintptr_t *EntryCount);

typedef efi_status_t __abi (*efi_protocols_per_handle_t)(
	void *Handle,
	efi_guid_t ***ProtocolBuffer,
	uintptr_t *ProtocolBufferCount);

typedef efi_status_t __abi (*efi_locate_handle_buffer_t)(
	enum efi_locate_search_type SearchType,
	efi_guid_t *Protocol,
	void *SearchKey,
	uintptr_t *NoHandles,
	void ***Buffer);

typedef efi_status_t __abi (*efi_locate_protocol_t)(efi_guid_t *Protocol,
						    void *Registration,
						    void **Interface);

typedef efi_status_t __abi (*efi_multiple_protocol_interface_t)(
	void *Handle, ...);

typedef efi_status_t __abi (*efi_calculate_crc32_t)(void *Data,
						    uintptr_t DataSize,
						    uint32_t CRC32);

typedef efi_status_t __abi (*efi_copy_mem_t)(void *Destination,
					     void *Source,
					     uintptr_t Size);

typedef efi_status_t __abi (*efi_set_mem_t)(void *Buffer,
					    uintptr_t Size,
					    uint8_t Value);

typedef efi_status_t __abi (*efi_create_event_ex_t)(
	uint32_t Type,
	uintptr_t NotifyTpl,
	efi_notify_function_t NotifyFunction,
	const void *NotifyContext,
	const efi_guid_t *EventGroup,
	void **Event);

struct efi_boot_services {
	struct efi_table_header Hdr;
	efi_raise_tpl_t RaiseTPL;
	efi_restore_tpl_t RestoreTPL;
	efi_allocate_pages_t AllocatePages;
	efi_free_pages_t FreePages;
	efi_get_memory_map_t GetMemoryMap;
	efi_allocate_pool_t AllocatePool;
	efi_free_pool_t FreePool;
	efi_create_event_t CreateEvent;
	efi_set_timer_t SetTimer;
	efi_wait_for_event_t WaitForEvent;
	efi_signal_event_t SignalEvent;
	efi_close_event_t CloseEvent;
	efi_check_event_t CheckEvent;
	efi_install_protocol_interface_t InstallProtocolInterface;
	efi_reinstall_protocol_interface_t ReinstallProtocolInterface;
	efi_uninstall_protocol_interface_t UninstallProtocolInterface;
	efi_handle_protocol_t HandleProtocol;
	efi_register_protocol_notify_t RegisterProtocolNotify;
	efi_locate_handle_t LocateHandle;
	efi_locate_device_path_t LocateDevicePath;
	efi_install_configuration_table_t InstallConfigurationTable;
	efi_load_image_t LoadImage;
	efi_start_image_t StartImage;
	efi_exit_t Exit;
	efi_unload_image_t UnloadImage;
	efi_exit_boot_services_t ExitBootServices;
	efi_get_next_monotonic_count_t GetNextMonotonicCount;
	efi_stall_t Stall;
	efi_set_watchdog_timer_t SetWatchdogTimer;
	efi_connect_controller_t ConnectController;
	efi_disconnect_controller_t DisconnectController;
	efi_open_protocol_t OpenProtocol;
	efi_close_protocol_t CloseProtocol;
	efi_open_protocol_information_t OpenProtocolInformation;
	efi_protocols_per_handle_t ProtocolsPerHandle;
	efi_locate_handle_buffer_t LocateHandleBuffer;
	efi_locate_protocol_t LocateProtocol;
	efi_multiple_protocol_interface_t InstallMultipleProtocolInterfaces;
	efi_multiple_protocol_interface_t UninstallMultipleProtocolInterfaces;
	efi_calculate_crc32_t CalculateCrc32;
	efi_copy_mem_t CopyMem;
	efi_set_mem_t SetMem;
	efi_create_event_ex_t CreateEventEx;
};

struct efi_configuration_table {
	/** Vendor EFI GUID Identifier */
	efi_guid_t VendorGuid;
	/** Vendor table pointer */
	void *VendorTable;
};

struct efi_system_table {
	struct efi_table_header Hdr;
	uint16_t *FirmwareVendor;
	uint32_t FirmwareRevision;
	void *ConsoleInHandle;
	struct efi_simple_text_input *ConIn;
	void *ConsoleOutHandle;
	struct efi_simple_text_output *ConOut;
	void *StandardErrorHandle;
	struct efi_simple_text_output *StdErr;
	struct efi_runtime_services *RuntimeServices;
	struct efi_boot_services *BootServices;
	/** The amount of entries to expect in the next attribute */
	uint64_t NumberOfTableEntries;
	/** A pointer to the configuration table(s) */
	struct efi_configuration_table *ConfigurationTable;
};

#endif /* _ASMLANGUAGE */

#endif /* ZEPHYR_INCLUDE_ARCH_X86_EFI_H_ */
