#ifndef _EFI_DEF_H
#define _EFI_DEF_H

/*++

Copyright (c) 1998  Intel Corporation

Module Name:

    efidef.h

Abstract:

    EFI definitions




Revision History

--*/

typedef UINT16          CHAR16;
typedef UINT8           CHAR8;
typedef UINT8           BOOLEAN;

#ifndef TRUE
    #define TRUE    ((BOOLEAN) 1)
    #define FALSE   ((BOOLEAN) 0)
#endif

#ifndef NULL
    #define NULL    ((VOID *) 0)
#endif

typedef UINTN           EFI_STATUS;
typedef UINT64          EFI_LBA;
typedef UINTN           EFI_TPL;
typedef VOID            *EFI_HANDLE;
typedef VOID            *EFI_EVENT;


/* 
 *  Prototype argument decoration for EFI parameters to indicate
 *  their direction
 * 
 *  IN - argument is passed into the function
 *  OUT - argument (pointer) is returned from the function
 *  OPTIONAL - argument is optional
 */

#ifndef IN
    #define IN
    #define OUT
    #define OPTIONAL
#endif


/* 
 *  A GUID
 */

typedef struct {          
    UINT32  Data1;
    UINT16  Data2;
    UINT16  Data3;
    UINT8   Data4[8]; 
} EFI_GUID;


/* 
 *  Time
 */

typedef struct {          
    UINT16      Year;       /*  1998 - 20XX */
    UINT8       Month;      /*  1 - 12 */
    UINT8       Day;        /*  1 - 31 */
    UINT8       Hour;       /*  0 - 23 */
    UINT8       Minute;     /*  0 - 59 */
    UINT8       Second;     /*  0 - 59 */
    UINT8       Pad1;
    UINT32      Nanosecond; /*  0 - 999,999,999 */
    INT16       TimeZone;   /*  -1440 to 1440 or 2047 */
    UINT8       Daylight;
    UINT8       Pad2;
} EFI_TIME;

/*  Bit definitions for EFI_TIME.Daylight */
#define EFI_TIME_ADJUST_DAYLIGHT    0x01
#define EFI_TIME_IN_DAYLIGHT        0x02

/*  Value definition for EFI_TIME.TimeZone */
#define EFI_UNSPECIFIED_TIMEZONE    0x07FF



/* 
 *  Networking
 */

typedef struct {
    UINT8                   Addr[4];
} EFI_IPv4_ADDRESS;

typedef struct {
    UINT8                   Addr[16];
} EFI_IPv6_ADDRESS;

typedef struct {
    UINT8                   Addr[32];
} EFI_MAC_ADDRESS;

/* 
 *  Memory
 */

typedef UINT64          EFI_PHYSICAL_ADDRESS;
typedef UINT64          EFI_VIRTUAL_ADDRESS;

typedef enum {
    AllocateAnyPages,
    AllocateMaxAddress,
    AllocateAddress,
    MaxAllocateType
} EFI_ALLOCATE_TYPE;

/* Preseve the attr on any range supplied.
 * ConventialMemory must have WB,SR,SW when supplied.
 * When allocating from ConventialMemory always make it WB,SR,SW
 * When returning to ConventialMemory always make it WB,SR,SW
 * When getting the memory map, or on RT for runtime types */


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

/*  possible caching types for the memory range */
#define EFI_MEMORY_UC           0x0000000000000001
#define EFI_MEMORY_WC           0x0000000000000002
#define EFI_MEMORY_WT           0x0000000000000004
#define EFI_MEMORY_WB           0x0000000000000008
#define EFI_MEMORY_UCE          0x0000000000000010  

/*  physical memory protection on range  */
#define EFI_MEMORY_WP           0x0000000000001000
#define EFI_MEMORY_RP           0x0000000000002000
#define EFI_MEMORY_XP           0x0000000000004000

/*  range requires a runtime mapping */
#define EFI_MEMORY_RUNTIME      0x8000000000000000

#define EFI_MEMORY_DESCRIPTOR_VERSION  1
typedef struct {
    UINT32                          Type;           /*  Field size is 32 bits followed by 32 bit pad */
    EFI_PHYSICAL_ADDRESS            PhysicalStart;  /*  Field size is 64 bits */
    EFI_VIRTUAL_ADDRESS             VirtualStart;   /*  Field size is 64 bits */
    UINT64                          NumberOfPages;  /*  Field size is 64 bits */
    UINT64                          Attribute;      /*  Field size is 64 bits */
} EFI_MEMORY_DESCRIPTOR;

/* 
 *  International Language
 */

typedef UINT8   ISO_639_2;
#define ISO_639_2_ENTRY_SIZE    3

/* 
 * 
 */

#define PAGE_SIZE   4096
#define PAGE_MASK   0xFFF
#define PAGE_SHIFT  12

#define SIZE_TO_PAGES(a)  \
    ( ((a) >> PAGE_SHIFT) + ((a) & PAGE_MASK ? 1 : 0) )

#endif