xref: /netbsd-src/sys/dev/efi/efi.h (revision 300b1161525c54a85482eb8f6a3670f29d15d134)
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