1139790Simp/*- 2135453Smarcel * Copyright (c) 2004 Marcel Moolenaar 366458Sdfr * All rights reserved. 466458Sdfr * 566458Sdfr * Redistribution and use in source and binary forms, with or without 666458Sdfr * modification, are permitted provided that the following conditions 766458Sdfr * are met: 8135453Smarcel * 966458Sdfr * 1. Redistributions of source code must retain the above copyright 1066458Sdfr * notice, this list of conditions and the following disclaimer. 1166458Sdfr * 2. Redistributions in binary form must reproduce the above copyright 1266458Sdfr * notice, this list of conditions and the following disclaimer in the 1366458Sdfr * documentation and/or other materials provided with the distribution. 1466458Sdfr * 15135453Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16135453Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17135453Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18135453Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19135453Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20135453Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21135453Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22135453Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23135453Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24135453Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2566458Sdfr * 26135453Smarcel * $FreeBSD$ 2766458Sdfr */ 2866458Sdfr 29263815Semaste#ifndef _SYS_EFI_H_ 30263815Semaste#define _SYS_EFI_H_ 3166458Sdfr 32135453Smarcel#include <sys/uuid.h> 3371803Sdfr 34135453Smarcel#define EFI_PAGE_SHIFT 12 35135453Smarcel#define EFI_PAGE_SIZE (1 << EFI_PAGE_SHIFT) 36135453Smarcel#define EFI_PAGE_MASK (EFI_PAGE_SIZE - 1) 3771803Sdfr 38135453Smarcel#define EFI_TABLE_ACPI20 \ 39135453Smarcel {0x8868e871,0xe4f1,0x11d3,0xbc,0x22,{0x00,0x80,0xc7,0x3c,0x88,0x81}} 40135453Smarcel#define EFI_TABLE_SAL \ 41135453Smarcel {0xeb9d2d32,0x2d88,0x11d3,0x9a,0x16,{0x00,0x90,0x27,0x3f,0xc1,0x4d}} 4271803Sdfr 43135453Smarcelenum efi_reset { 44135453Smarcel EFI_RESET_COLD, 45135453Smarcel EFI_RESET_WARM 46135453Smarcel}; 47135453Smarcel 48135453Smarceltypedef uint16_t efi_char; 49135453Smarceltypedef unsigned long efi_status; 50135453Smarcel 51135453Smarcelstruct efi_cfgtbl { 52135453Smarcel struct uuid ct_uuid; 53135453Smarcel uint64_t ct_data; 54135453Smarcel}; 55135453Smarcel 56135453Smarcelstruct efi_md { 57135453Smarcel uint32_t md_type; 58135453Smarcel#define EFI_MD_TYPE_NULL 0 59135453Smarcel#define EFI_MD_TYPE_CODE 1 /* Loader text. */ 60135453Smarcel#define EFI_MD_TYPE_DATA 2 /* Loader data. */ 61135453Smarcel#define EFI_MD_TYPE_BS_CODE 3 /* Boot services text. */ 62135453Smarcel#define EFI_MD_TYPE_BS_DATA 4 /* Boot services data. */ 63135453Smarcel#define EFI_MD_TYPE_RT_CODE 5 /* Runtime services text. */ 64135453Smarcel#define EFI_MD_TYPE_RT_DATA 6 /* Runtime services data. */ 65135453Smarcel#define EFI_MD_TYPE_FREE 7 /* Unused/free memory. */ 66135453Smarcel#define EFI_MD_TYPE_BAD 8 /* Bad memory */ 67135453Smarcel#define EFI_MD_TYPE_RECLAIM 9 /* ACPI reclaimable memory. */ 68135453Smarcel#define EFI_MD_TYPE_FIRMWARE 10 /* ACPI NV memory */ 69135453Smarcel#define EFI_MD_TYPE_IOMEM 11 /* Memory-mapped I/O. */ 70135453Smarcel#define EFI_MD_TYPE_IOPORT 12 /* I/O port space. */ 71135453Smarcel#define EFI_MD_TYPE_PALCODE 13 /* PAL */ 72135453Smarcel uint32_t __pad; 73135453Smarcel uint64_t md_phys; 74135453Smarcel void *md_virt; 75135453Smarcel uint64_t md_pages; 76135453Smarcel uint64_t md_attr; 77135453Smarcel#define EFI_MD_ATTR_UC 0x0000000000000001UL 78135453Smarcel#define EFI_MD_ATTR_WC 0x0000000000000002UL 79135453Smarcel#define EFI_MD_ATTR_WT 0x0000000000000004UL 80135453Smarcel#define EFI_MD_ATTR_WB 0x0000000000000008UL 81135453Smarcel#define EFI_MD_ATTR_UCE 0x0000000000000010UL 82135453Smarcel#define EFI_MD_ATTR_WP 0x0000000000001000UL 83135453Smarcel#define EFI_MD_ATTR_RP 0x0000000000002000UL 84135453Smarcel#define EFI_MD_ATTR_XP 0x0000000000004000UL 85135453Smarcel#define EFI_MD_ATTR_RT 0x8000000000000000UL 86135453Smarcel}; 87135453Smarcel 88135453Smarcelstruct efi_tm { 89135453Smarcel uint16_t tm_year; /* 1998 - 20XX */ 90135453Smarcel uint8_t tm_mon; /* 1 - 12 */ 91135453Smarcel uint8_t tm_mday; /* 1 - 31 */ 92135453Smarcel uint8_t tm_hour; /* 0 - 23 */ 93135453Smarcel uint8_t tm_min; /* 0 - 59 */ 94135453Smarcel uint8_t tm_sec; /* 0 - 59 */ 95135453Smarcel uint8_t __pad1; 96135453Smarcel uint32_t tm_nsec; /* 0 - 999,999,999 */ 97135453Smarcel int16_t tm_tz; /* -1440 to 1440 or 2047 */ 98135453Smarcel uint8_t tm_dst; 99135453Smarcel uint8_t __pad2; 100135453Smarcel}; 101135453Smarcel 102135453Smarcelstruct efi_tmcap { 103135453Smarcel uint32_t tc_res; /* 1e-6 parts per million */ 104135453Smarcel uint32_t tc_prec; /* hertz */ 105135453Smarcel uint8_t tc_stz; /* Set clears sub-second time */ 106135453Smarcel}; 107135453Smarcel 108135453Smarcelstruct efi_tblhdr { 109135453Smarcel uint64_t th_sig; 110135453Smarcel uint32_t th_rev; 111135453Smarcel uint32_t th_hdrsz; 112135453Smarcel uint32_t th_crc32; 113135453Smarcel uint32_t __res; 114135453Smarcel}; 115135453Smarcel 116135453Smarcelstruct efi_rt { 117135453Smarcel struct efi_tblhdr rt_hdr; 118135453Smarcel efi_status (*rt_gettime)(struct efi_tm *, struct efi_tmcap *); 119135453Smarcel efi_status (*rt_settime)(struct efi_tm *); 120135453Smarcel efi_status (*rt_getwaketime)(uint8_t *, uint8_t *, 121135453Smarcel struct efi_tm *); 122135453Smarcel efi_status (*rt_setwaketime)(uint8_t, struct efi_tm *); 123135453Smarcel efi_status (*rt_setvirtual)(u_long, u_long, uint32_t, 124135453Smarcel struct efi_md *); 125135453Smarcel efi_status (*rt_cvtptr)(u_long, void **); 126135453Smarcel efi_status (*rt_getvar)(efi_char *, struct uuid *, uint32_t *, 127135453Smarcel u_long *, void *); 128135453Smarcel efi_status (*rt_scanvar)(u_long *, efi_char *, struct uuid *); 129135453Smarcel efi_status (*rt_setvar)(efi_char *, struct uuid *, uint32_t, 130135453Smarcel u_long, void *); 131135453Smarcel efi_status (*rt_gethicnt)(uint32_t *); 132135453Smarcel efi_status (*rt_reset)(enum efi_reset, efi_status, u_long, 133135453Smarcel efi_char *); 134135453Smarcel}; 135135453Smarcel 136135453Smarcelstruct efi_systbl { 137135453Smarcel struct efi_tblhdr st_hdr; 138135453Smarcel#define EFI_SYSTBL_SIG 0x5453595320494249UL 139135453Smarcel efi_char *st_fwvendor; 140135453Smarcel uint32_t st_fwrev; 141135453Smarcel uint32_t __pad; 142135453Smarcel void *st_cin; 143135453Smarcel void *st_cinif; 144135453Smarcel void *st_cout; 145135453Smarcel void *st_coutif; 146135453Smarcel void *st_cerr; 147135453Smarcel void *st_cerrif; 148135453Smarcel uint64_t st_rt; 149135453Smarcel void *st_bs; 150135453Smarcel u_long st_entries; 151135453Smarcel uint64_t st_cfgtbl; 152135453Smarcel}; 153135453Smarcel 154263815Semaste#if defined(_KERNEL) && defined(__ia64__) 155219841Smarcel 156219841Smarceltypedef u_long (*ia64_efi_f)(u_long, u_long, u_long, u_long); 157219841Smarcel 158219841Smarcelu_long ia64_efi_physical(ia64_efi_f, u_long, u_long, u_long, u_long); 159219841Smarcel 160135453Smarcelvoid efi_boot_finish(void); 161135453Smarcelint efi_boot_minimal(uint64_t); 162135453Smarcelvoid *efi_get_table(struct uuid *); 163135453Smarcelvoid efi_get_time(struct efi_tm *); 164224112Smarcelstruct efi_md *efi_md_find(vm_paddr_t); 165135453Smarcelstruct efi_md *efi_md_first(void); 166224112Smarcelstruct efi_md *efi_md_last(void); 167135453Smarcelstruct efi_md *efi_md_next(struct efi_md *); 168224112Smarcelstruct efi_md *efi_md_prev(struct efi_md *); 169135453Smarcelvoid efi_reset_system(void); 170202271Smarcelint efi_set_time(struct efi_tm *); 171202271Smarcelint efi_var_get(efi_char *, struct uuid *, uint32_t *, size_t *, void *); 172202271Smarcelint efi_var_nextname(size_t *, efi_char *, struct uuid *); 173202272Smarcelint efi_var_set(efi_char *, struct uuid *, uint32_t, size_t, void *); 174135453Smarcel 175263815Semaste#endif /* _KERNEL && __ia64__ */ 176219841Smarcel 177263815Semaste#endif /* _SYS_EFI_H_ */ 178