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