1*300b1161Sriastradh /* $NetBSD: efi.h,v 1.3 2023/05/22 16:27:49 riastradh Exp $ */ 2b04c9abfSriastradh 3b04c9abfSriastradh /*- 4b04c9abfSriastradh * Copyright (c) 2004 Marcel Moolenaar 5b04c9abfSriastradh * All rights reserved. 6b04c9abfSriastradh * 7b04c9abfSriastradh * Redistribution and use in source and binary forms, with or without 8b04c9abfSriastradh * modification, are permitted provided that the following conditions 9b04c9abfSriastradh * are met: 10b04c9abfSriastradh * 11b04c9abfSriastradh * 1. Redistributions of source code must retain the above copyright 12b04c9abfSriastradh * notice, this list of conditions and the following disclaimer. 13b04c9abfSriastradh * 2. Redistributions in binary form must reproduce the above copyright 14b04c9abfSriastradh * notice, this list of conditions and the following disclaimer in the 15b04c9abfSriastradh * documentation and/or other materials provided with the distribution. 16b04c9abfSriastradh * 17b04c9abfSriastradh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18b04c9abfSriastradh * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19b04c9abfSriastradh * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20b04c9abfSriastradh * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21b04c9abfSriastradh * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22b04c9abfSriastradh * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b04c9abfSriastradh * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b04c9abfSriastradh * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b04c9abfSriastradh * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26b04c9abfSriastradh * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b04c9abfSriastradh */ 28b04c9abfSriastradh 29b04c9abfSriastradh #ifndef _DEV_EFI_EFI_H_ 30b04c9abfSriastradh #define _DEV_EFI_EFI_H_ 31b04c9abfSriastradh 32b04c9abfSriastradh /* 33b04c9abfSriastradh * Machine-independent UEFI protocol definitions. Based on: 34b04c9abfSriastradh * 35b04c9abfSriastradh * Unified Extensible Firmware Interface (UEFI) Specification, 36b04c9abfSriastradh * Version 2.9, UEFI Forum, Inc., March 2021. 37b04c9abfSriastradh * 38b04c9abfSriastradh * https://uefi.org/sites/default/files/resources/UEFI_Spec_2_9_2021_03_18.pdf 39b04c9abfSriastradh */ 40b04c9abfSriastradh 41aabebb4cSriastradh #if defined(__i386__) || defined(__x86_64__) 42aabebb4cSriastradh #define EFIAPI __attribute__((__ms_abi__)) 43aabebb4cSriastradh #else 44aabebb4cSriastradh #define EFIAPI /* empty */ 45aabebb4cSriastradh #endif 46aabebb4cSriastradh 47*300b1161Sriastradh #ifdef _LP64 48*300b1161Sriastradh #define EFIERR(x) (0x8000000000000000 | (x)) 49*300b1161Sriastradh #else 50*300b1161Sriastradh #define EFIERR(x) (0x80000000 | (x)) 51*300b1161Sriastradh #endif 52*300b1161Sriastradh 53*300b1161Sriastradh #define EFI_SUCCESS 0 54*300b1161Sriastradh #define EFI_INVALID_PARAMETER EFIERR(2) 55*300b1161Sriastradh #define EFI_UNSUPPORTED EFIERR(3) 56*300b1161Sriastradh #define EFI_BUFFER_TOO_SMALL EFIERR(5) 57*300b1161Sriastradh #define EFI_DEVICE_ERROR EFIERR(7) 58*300b1161Sriastradh #define EFI_WRITE_PROTECTED EFIERR(8) 59*300b1161Sriastradh #define EFI_OUT_OF_RESOURCES EFIERR(9) 60*300b1161Sriastradh #define EFI_NOT_FOUND EFIERR(14) 61*300b1161Sriastradh #define EFI_SECURITY_VIOLATION EFIERR(26) 62*300b1161Sriastradh 63b04c9abfSriastradh enum efi_reset { 64b04c9abfSriastradh EFI_RESET_COLD, 65b04c9abfSriastradh EFI_RESET_WARM, 66b04c9abfSriastradh EFI_RESET_SHUTDOWN, 67b04c9abfSriastradh EFI_RESET_PLATFORM_SPECIFIC, 68b04c9abfSriastradh }; 69b04c9abfSriastradh 70b04c9abfSriastradh typedef uint16_t efi_char; 71b04c9abfSriastradh typedef unsigned long efi_status; 72b04c9abfSriastradh 73b04c9abfSriastradh struct efi_cfgtbl { 74b04c9abfSriastradh struct uuid ct_uuid; 75b04c9abfSriastradh void *ct_data; 76b04c9abfSriastradh }; 77b04c9abfSriastradh 78b04c9abfSriastradh struct efi_md { 79b04c9abfSriastradh uint32_t md_type; 80b04c9abfSriastradh #define EFI_MD_TYPE_NULL 0 81b04c9abfSriastradh #define EFI_MD_TYPE_CODE 1 /* Loader text. */ 82b04c9abfSriastradh #define EFI_MD_TYPE_DATA 2 /* Loader data. */ 83b04c9abfSriastradh #define EFI_MD_TYPE_BS_CODE 3 /* Boot services text. */ 84b04c9abfSriastradh #define EFI_MD_TYPE_BS_DATA 4 /* Boot services data. */ 85b04c9abfSriastradh #define EFI_MD_TYPE_RT_CODE 5 /* Runtime services text. */ 86b04c9abfSriastradh #define EFI_MD_TYPE_RT_DATA 6 /* Runtime services data. */ 87b04c9abfSriastradh #define EFI_MD_TYPE_FREE 7 /* Unused/free memory. */ 88b04c9abfSriastradh #define EFI_MD_TYPE_BAD 8 /* Bad memory */ 89b04c9abfSriastradh #define EFI_MD_TYPE_RECLAIM 9 /* ACPI reclaimable memory. */ 90b04c9abfSriastradh #define EFI_MD_TYPE_FIRMWARE 10 /* ACPI NV memory */ 91b04c9abfSriastradh #define EFI_MD_TYPE_IOMEM 11 /* Memory-mapped I/O. */ 92b04c9abfSriastradh #define EFI_MD_TYPE_IOPORT 12 /* I/O port space. */ 93b04c9abfSriastradh #define EFI_MD_TYPE_PALCODE 13 /* PAL */ 94b04c9abfSriastradh #define EFI_MD_TYPE_PMEM 14 /* Persistent memory. */ 95b04c9abfSriastradh uint32_t __pad; 96b04c9abfSriastradh uint64_t md_phys; 97b04c9abfSriastradh uint64_t md_virt; 98b04c9abfSriastradh uint64_t md_pages; 99b04c9abfSriastradh uint64_t md_attr; 100b04c9abfSriastradh #define EFI_MD_ATTR_UC 0x0000000000000001UL 101b04c9abfSriastradh #define EFI_MD_ATTR_WC 0x0000000000000002UL 102b04c9abfSriastradh #define EFI_MD_ATTR_WT 0x0000000000000004UL 103b04c9abfSriastradh #define EFI_MD_ATTR_WB 0x0000000000000008UL 104b04c9abfSriastradh #define EFI_MD_ATTR_UCE 0x0000000000000010UL 105b04c9abfSriastradh #define EFI_MD_ATTR_WP 0x0000000000001000UL 106b04c9abfSriastradh #define EFI_MD_ATTR_RP 0x0000000000002000UL 107b04c9abfSriastradh #define EFI_MD_ATTR_XP 0x0000000000004000UL 108b04c9abfSriastradh #define EFI_MD_ATTR_NV 0x0000000000008000UL 109b04c9abfSriastradh #define EFI_MD_ATTR_MORE_RELIABLE 0x0000000000010000UL 110b04c9abfSriastradh #define EFI_MD_ATTR_RO 0x0000000000020000UL 111b04c9abfSriastradh #define EFI_MD_ATTR_SP 0x0000000000040000UL 112b04c9abfSriastradh #define EFI_MD_ATTR_CPU_CRYPTO 0x0000000000080000UL 113b04c9abfSriastradh #define EFI_MD_ATTR_RT 0x8000000000000000UL 114b04c9abfSriastradh }; 115b04c9abfSriastradh 116b04c9abfSriastradh struct efi_tm { 117b04c9abfSriastradh uint16_t tm_year; /* 1998 - 20XX */ 118b04c9abfSriastradh uint8_t tm_mon; /* 1 - 12 */ 119b04c9abfSriastradh uint8_t tm_mday; /* 1 - 31 */ 120b04c9abfSriastradh uint8_t tm_hour; /* 0 - 23 */ 121b04c9abfSriastradh uint8_t tm_min; /* 0 - 59 */ 122b04c9abfSriastradh uint8_t tm_sec; /* 0 - 59 */ 123b04c9abfSriastradh uint8_t __pad1; 124b04c9abfSriastradh uint32_t tm_nsec; /* 0 - 999,999,999 */ 125b04c9abfSriastradh int16_t tm_tz; /* -1440 to 1440 or 2047 */ 126b04c9abfSriastradh uint8_t tm_dst; 127b04c9abfSriastradh uint8_t __pad2; 128b04c9abfSriastradh }; 129b04c9abfSriastradh 130b04c9abfSriastradh struct efi_tmcap { 131b04c9abfSriastradh uint32_t tc_res; /* 1e-6 parts per million */ 132b04c9abfSriastradh uint32_t tc_prec; /* hertz */ 133b04c9abfSriastradh uint8_t tc_stz; /* Set clears sub-second time */ 134b04c9abfSriastradh }; 135b04c9abfSriastradh 136b04c9abfSriastradh struct efi_tblhdr { 137b04c9abfSriastradh uint64_t th_sig; 138b04c9abfSriastradh uint32_t th_rev; 139b04c9abfSriastradh uint32_t th_hdrsz; 140b04c9abfSriastradh uint32_t th_crc32; 141b04c9abfSriastradh uint32_t __res; 142b04c9abfSriastradh }; 143b04c9abfSriastradh 144b04c9abfSriastradh struct efi_rt { 145b04c9abfSriastradh struct efi_tblhdr rt_hdr; 146aabebb4cSriastradh efi_status (*rt_gettime)(struct efi_tm *, struct efi_tmcap *) 147aabebb4cSriastradh EFIAPI; 148aabebb4cSriastradh efi_status (*rt_settime)(struct efi_tm *) EFIAPI; 149b04c9abfSriastradh efi_status (*rt_getwaketime)(uint8_t *, uint8_t *, 150aabebb4cSriastradh struct efi_tm *) EFIAPI; 151aabebb4cSriastradh efi_status (*rt_setwaketime)(uint8_t, struct efi_tm *) EFIAPI; 152b04c9abfSriastradh efi_status (*rt_setvirtual)(u_long, u_long, uint32_t, 153aabebb4cSriastradh struct efi_md *) EFIAPI; 154aabebb4cSriastradh efi_status (*rt_cvtptr)(u_long, void **) EFIAPI; 155b04c9abfSriastradh efi_status (*rt_getvar)(efi_char *, struct uuid *, uint32_t *, 156aabebb4cSriastradh u_long *, void *) EFIAPI; 157aabebb4cSriastradh efi_status (*rt_scanvar)(u_long *, efi_char *, struct uuid *) 158aabebb4cSriastradh EFIAPI; 159b04c9abfSriastradh efi_status (*rt_setvar)(efi_char *, struct uuid *, uint32_t, 160aabebb4cSriastradh u_long, void *) EFIAPI; 161aabebb4cSriastradh efi_status (*rt_gethicnt)(uint32_t *) EFIAPI; 162b04c9abfSriastradh efi_status (*rt_reset)(enum efi_reset, efi_status, u_long, 163aabebb4cSriastradh efi_char *) EFIAPI; 164b04c9abfSriastradh }; 165b04c9abfSriastradh 166b04c9abfSriastradh struct efi_systbl { 167b04c9abfSriastradh struct efi_tblhdr st_hdr; 168b04c9abfSriastradh #define EFI_SYSTBL_SIG 0x5453595320494249UL 169b04c9abfSriastradh efi_char *st_fwvendor; 170b04c9abfSriastradh uint32_t st_fwrev; 171b04c9abfSriastradh #ifdef _LP64 172b04c9abfSriastradh uint32_t __pad; 173b04c9abfSriastradh #endif 174b04c9abfSriastradh void *st_cin; 175b04c9abfSriastradh void *st_cinif; 176b04c9abfSriastradh void *st_cout; 177b04c9abfSriastradh void *st_coutif; 178b04c9abfSriastradh void *st_cerr; 179b04c9abfSriastradh void *st_cerrif; 180b04c9abfSriastradh struct efi_rt *st_rt; 181b04c9abfSriastradh void *st_bs; 182b04c9abfSriastradh u_long st_entries; 183b04c9abfSriastradh struct efi_cfgtbl *st_cfgtbl; 184b04c9abfSriastradh }; 185b04c9abfSriastradh #ifdef _LP64 186b04c9abfSriastradh __CTASSERT(sizeof(struct efi_systbl) == 120); 187b04c9abfSriastradh #else 188b04c9abfSriastradh __CTASSERT(sizeof(struct efi_systbl) == 72); 189b04c9abfSriastradh #endif 190b04c9abfSriastradh 191b04c9abfSriastradh #endif /* _DEV_EFI_EFI_H_ */ 192