1/*
2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#pragma once
8
9#include <printf.h>
10#include <types.h>
11
12typedef union {
13    uint8_t b[16];
14    struct {
15        uint32_t timeLow;
16        uint16_t timeMid;
17        uint16_t timeHigh;
18        uint8_t clockSeqHighAndReserved;
19        uint8_t clockSeqLow;
20        uint8_t node[6];
21    } s;
22} efi_guid_t;
23
24/* See UEFI Spec v2.7 Appendix A "GUID and Time Formats". */
25static inline efi_guid_t make_efi_guid(uint32_t timeLow, uint16_t timeMid, uint16_t timeHighAndVersion,
26        uint8_t clockSeqHighAndReserved, uint8_t clockSeqLow, uint8_t n0,
27        uint8_t n1, uint8_t n2, uint8_t n3, uint8_t n4, uint8_t n5)
28{
29    efi_guid_t u;
30    u.s.timeLow = timeLow;
31    u.s.timeMid = timeMid;
32    u.s.timeHigh = timeHighAndVersion;
33    u.s.clockSeqHighAndReserved = clockSeqHighAndReserved;
34    u.s.clockSeqLow = clockSeqLow;
35    u.s.node[0] = n0;
36    u.s.node[1] = n1;
37    u.s.node[2] = n2;
38    u.s.node[3] = n3;
39    u.s.node[4] = n4;
40    u.s.node[5] = n5;
41    return u;
42}
43
44typedef struct {
45    efi_guid_t guid;
46    uintptr_t table;
47} efi_config_table_t;
48
49typedef struct {
50    uint64_t signature;
51    uint32_t revision;
52    uint32_t headersize;
53    uint32_t crc32;
54    uint32_t reserved;
55} efi_table_hdr_t;
56
57typedef struct {
58    efi_table_hdr_t hdr;
59    void *fw_vendor;
60    uint32_t fw_revision;
61    /* padding on 64-bit */
62    void *con_in_handle;
63    void *con_in;
64    void *con_out_handle;
65    void *con_out;
66    void *stderr_handle;
67    void *stderr;
68    void *runtime;
69    void *boottime;
70    uint32_t nr_tables;
71    /* padding on 64-bit */
72    void *tables;
73} efi_system_table_t;
74
75extern void *__application_handle;
76extern efi_system_table_t *__efi_system_table;
77
78#define EFI_SUCCESS                     0
79#define EFI_LOAD_ERROR                  (1 | (1UL << ((BYTE_PER_WORD * 8) - 1)))
80#define EFI_BUFFER_TOO_SMALL            (5 | (1UL << ((BYTE_PER_WORD * 8) - 1)))
81
82/* EFI Memory types: */
83#define EFI_RESERVED_TYPE                0
84#define EFI_LOADER_CODE                  1
85#define EFI_LOADER_DATA                  2
86#define EFI_BOOT_SERVICES_CODE           3
87#define EFI_BOOT_SERVICES_DATA           4
88#define EFI_RUNTIME_SERVICES_CODE        5
89#define EFI_RUNTIME_SERVICES_DATA        6
90#define EFI_CONVENTIONAL_MEMORY          7
91#define EFI_UNUSABLE_MEMORY              8
92#define EFI_ACPI_RECLAIM_MEMORY          9
93#define EFI_ACPI_MEMORY_NVS             10
94#define EFI_MEMORY_MAPPED_IO            11
95#define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12
96#define EFI_PAL_CODE                    13
97#define EFI_PERSISTENT_MEMORY           14
98#define EFI_MAX_MEMORY_TYPE             15
99
100/* Attribute values: */
101#define EFI_MEMORY_UC                   ((uint64_t)0x1ULL)                  /* uncached */
102#define EFI_MEMORY_WC                   ((uint64_t)0x2ULL)                  /* write-coalescing */
103#define EFI_MEMORY_WT                   ((uint64_t)0x4ULL)                  /* write-through */
104#define EFI_MEMORY_WB                   ((uint64_t)0x8ULL)                  /* write-back */
105#define EFI_MEMORY_UCE                  ((uint64_t)0x10ULL)                 /* uncached, exported */
106#define EFI_MEMORY_WP                   ((uint64_t)0x1000ULL)               /* write-protect */
107#define EFI_MEMORY_RP                   ((uint64_t)0x2000ULL)               /* read-protect */
108#define EFI_MEMORY_XP                   ((uint64_t)0x4000ULL)               /* execute-protect */
109#define EFI_MEMORY_MORE_RELIABLE        ((uint64_t)0x10000ULL)              /* higher reliability */
110#define EFI_MEMORY_RO                   ((uint64_t)0x20000ULL)              /* read-only */
111#define EFI_MEMORY_RUNTIME              ((uint64_t)0x8000000000000000ULL)   /* range requires runtime mapping */
112#define EFI_MEMORY_DESCRIPTOR_VERSION   1
113
114#define EFI_PAGE_BITS                   12
115#define EFI_PAGE_SIZE                   (1UL << EFI_PAGE_BITS)
116
117typedef struct {
118    uint32_t type;
119    uint32_t padding_1;
120    uint64_t phys_addr;
121    uint64_t virt_addr;
122    uint64_t num_pages;
123    uint64_t attribute;
124} efi_memory_desc_t;
125
126typedef struct {
127    efi_table_hdr_t hdr;
128    uintptr_t padding_1[4];
129    unsigned long (*get_memory_map)(unsigned long *, void *, unsigned long *, unsigned long *, uint32_t *);
130    unsigned long (*allocate_pool)(int, unsigned long, void **);
131    unsigned long (*free_pool)(void *);
132    uintptr_t padding_2[19];
133    unsigned long (*exit_boot_services)(void *, unsigned long);
134    uintptr_t padding_3[17];
135} efi_boot_services_t;
136
137int efi_guideq(efi_guid_t a, efi_guid_t b);
138efi_boot_services_t *get_efi_boot_services(void);
139
140void efi_early_init(uintptr_t application_handle, uintptr_t efi_system_table);
141unsigned long efi_exit_boot_services(void);
142void *efi_get_fdt(void);
143
144