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