xref: /openbsd-src/sys/arch/amd64/include/biosvar.h (revision 745c2f60e98fd1f418c104960a567e120624d705)
1*745c2f60Skn /*	$OpenBSD: biosvar.h,v 1.32 2023/09/08 20:47:22 kn Exp $	*/
2f5df1827Smickey 
3f5df1827Smickey /*
4f5df1827Smickey  * Copyright (c) 1997-1999 Michael Shalayeff
5f5df1827Smickey  * All rights reserved.
6f5df1827Smickey  *
7f5df1827Smickey  * Redistribution and use in source and binary forms, with or without
8f5df1827Smickey  * modification, are permitted provided that the following conditions
9f5df1827Smickey  * are met:
10f5df1827Smickey  * 1. Redistributions of source code must retain the above copyright
11f5df1827Smickey  *    notice, this list of conditions and the following disclaimer.
12f5df1827Smickey  * 2. Redistributions in binary form must reproduce the above copyright
13f5df1827Smickey  *    notice, this list of conditions and the following disclaimer in the
14f5df1827Smickey  *    documentation and/or other materials provided with the distribution.
153cfa2e62Smickey  * 3. The name of the author may not be used to endorse or promote products
16f5df1827Smickey  *    derived from this software without specific prior written permission.
17f5df1827Smickey  *
18f5df1827Smickey  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19f5df1827Smickey  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20f5df1827Smickey  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21f5df1827Smickey  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
22f5df1827Smickey  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23f5df1827Smickey  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24f5df1827Smickey  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25f5df1827Smickey  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26f5df1827Smickey  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27f5df1827Smickey  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28f5df1827Smickey  * THE POSSIBILITY OF SUCH DAMAGE.
29f5df1827Smickey  */
30f5df1827Smickey 
312fa72412Spirofti #ifndef _MACHINE_BIOSVAR_H_
322fa72412Spirofti #define _MACHINE_BIOSVAR_H_
33f5df1827Smickey 
34f5df1827Smickey 	/* some boxes put apm data seg in the 2nd page */
35184e2458Sderaadt #define	BOOTARG_OFF	(PAGE_SIZE * 2)
36184e2458Sderaadt #define	BOOTARG_LEN	(PAGE_SIZE * 1)
37f5df1827Smickey #define	BOOTBIOS_ADDR	(0x7c00)
389730fd37Skrw #define	BOOTBIOS_MAXSEC	((1 << 28) - 1)
39f5df1827Smickey 
40f5df1827Smickey 	/* BIOS configure flags */
41f5df1827Smickey #define	BIOSF_BIOS32	0x0001
42f5df1827Smickey #define	BIOSF_PCIBIOS	0x0002
43f5df1827Smickey #define	BIOSF_PROMSCAN	0x0004
44244633e7Sjsg #define	BIOSF_SMBIOS	0x0008
45f5df1827Smickey 
46f5df1827Smickey /* BIOS media ID */
47f5df1827Smickey #define BIOSM_F320K	0xff	/* floppy ds/sd  8 spt */
48f5df1827Smickey #define	BIOSM_F160K	0xfe	/* floppy ss/sd  8 spt */
49f5df1827Smickey #define	BIOSM_F360K	0xfd	/* floppy ds/sd  9 spt */
50f5df1827Smickey #define	BIOSM_F180K	0xfc	/* floppy ss/sd  9 spt */
51f5df1827Smickey #define	BIOSM_ROMD	0xfa	/* ROM disk */
52f5df1827Smickey #define	BIOSM_F120M	0xf9	/* floppy ds/hd 15 spt 5.25" */
53f5df1827Smickey #define	BIOSM_F720K	0xf9	/* floppy ds/dd  9 spt 3.50" */
54f5df1827Smickey #define	BIOSM_HD	0xf8	/* hard drive */
55f5df1827Smickey #define	BIOSM_F144K	0xf0	/* floppy ds/hd 18 spt 3.50" */
56f5df1827Smickey #define	BIOSM_OTHER	0xf0	/* any other */
57f5df1827Smickey 
58f5df1827Smickey /*
59f5df1827Smickey  * BIOS memory maps
60f5df1827Smickey  */
61f5df1827Smickey #define	BIOS_MAP_END	0x00	/* End of array XXX - special */
62f5df1827Smickey #define	BIOS_MAP_FREE	0x01	/* Usable memory */
63f5df1827Smickey #define	BIOS_MAP_RES	0x02	/* Reserved memory */
64f5df1827Smickey #define	BIOS_MAP_ACPI	0x03	/* ACPI Reclaim memory */
65f5df1827Smickey #define	BIOS_MAP_NVS	0x04	/* ACPI NVS memory */
66f5df1827Smickey 
67f5df1827Smickey /*
68f5df1827Smickey  * Optional ROM header
69f5df1827Smickey  */
70f5df1827Smickey typedef
71f5df1827Smickey struct bios_romheader {
72f721f560Skettenis 	uint16_t	signature;	/* 0xaa55 */
73f721f560Skettenis 	uint8_t		len;		/* length in pages (512 bytes) */
74f721f560Skettenis 	uint32_t	entry;		/* initialization entry point */
75f721f560Skettenis 	uint8_t		reserved[19];
76f721f560Skettenis 	uint16_t	pnpheader;	/* offset to PnP expansion header */
77e7940adfSderaadt } __packed *bios_romheader_t;
78f5df1827Smickey 
79f5df1827Smickey #define	BIOS32_MAKESIG(a, b, c, d) \
80f5df1827Smickey 	((a) | ((b) << 8) | ((c) << 16) | ((d) << 24))
81de8bfd7dSgwk #define	SMBIOS_SIGNATURE	BIOS32_MAKESIG('_', 'S', 'M', '_')
82f5df1827Smickey 
83f5df1827Smickey /*
84f5df1827Smickey  * CTL_BIOS definitions.
85f5df1827Smickey  */
86f5df1827Smickey #define	BIOS_DEV		1	/* int: BIOS boot device */
87f5df1827Smickey #define	BIOS_DISKINFO		2	/* struct: BIOS boot device info */
88f5df1827Smickey #define BIOS_CKSUMLEN		3	/* int: disk cksum block count */
89f5df1827Smickey #define	BIOS_MAXID		4	/* number of valid machdep ids */
90f5df1827Smickey 
91f5df1827Smickey #define	CTL_BIOS_NAMES { \
92f5df1827Smickey 	{ 0, 0 }, \
93f5df1827Smickey 	{ "biosdev", CTLTYPE_INT }, \
94f5df1827Smickey 	{ "diskinfo", CTLTYPE_STRUCT }, \
95f5df1827Smickey 	{ "cksumlen", CTLTYPE_INT }, \
96f5df1827Smickey }
97f5df1827Smickey 
98f5df1827Smickey #define	BOOTARG_MEMMAP 0
99f5df1827Smickey typedef struct _bios_memmap {
100f721f560Skettenis 	uint64_t addr;		/* Beginning of block */
101f721f560Skettenis 	uint64_t size;		/* Size of block */
102f721f560Skettenis 	uint32_t type;		/* Type of block */
103e7940adfSderaadt } __packed bios_memmap_t;
104f5df1827Smickey 
105f5df1827Smickey /* Info about disk from the bios, plus the mapping from
106f5df1827Smickey  * BIOS numbers to BSD major (driver?) number.
107f5df1827Smickey  *
108f5df1827Smickey  * Also, do not bother with BIOSN*() macros, just parcel
109f5df1827Smickey  * the info out, and use it like this.  This makes for less
110897c442bStom  * of a dependence on BIOSN*() macros having to be the same
111f5df1827Smickey  * across /boot, /bsd, and userland.
112f5df1827Smickey  */
113f5df1827Smickey #define	BOOTARG_DISKINFO 1
114f5df1827Smickey typedef struct _bios_diskinfo {
115f5df1827Smickey 	/* BIOS section */
116f5df1827Smickey 	int bios_number;	/* BIOS number of drive (or -1) */
117f5df1827Smickey 	u_int bios_cylinders;	/* BIOS cylinders */
118f5df1827Smickey 	u_int bios_heads;	/* BIOS heads */
119f5df1827Smickey 	u_int bios_sectors;	/* BIOS sectors */
120f5df1827Smickey 	int bios_edd;		/* EDD support */
121f5df1827Smickey 
122f5df1827Smickey 	/* BSD section */
123f5df1827Smickey 	dev_t bsd_dev;		/* BSD device */
124f5df1827Smickey 
125f5df1827Smickey 	/* Checksum section */
126f721f560Skettenis 	uint32_t checksum;	/* Checksum for drive */
127f5df1827Smickey 
128f5df1827Smickey 	/* Misc. flags */
129f721f560Skettenis 	uint32_t flags;
130f5df1827Smickey #define BDI_INVALID	0x00000001	/* I/O error during checksumming */
131f5df1827Smickey #define BDI_GOODLABEL	0x00000002	/* Had SCSI or ST506/ESDI disklabel */
132f5df1827Smickey #define BDI_BADLABEL	0x00000004	/* Had another disklabel */
133338feb3aStom #define BDI_EL_TORITO	0x00000008	/* 2,048-byte sectors */
134897c442bStom #define BDI_HIBVALID	0x00000010	/* hibernate signature valid */
135f5df1827Smickey #define BDI_PICKED	0x80000000	/* kernel-only: cksum matched */
136f5df1827Smickey 
137e7940adfSderaadt } __packed bios_diskinfo_t;
138f5df1827Smickey 
139f5df1827Smickey #define	BOOTARG_APMINFO 2
140f5df1827Smickey typedef struct _bios_apminfo {
141f5df1827Smickey 	/* APM_CONNECT returned values */
142f5df1827Smickey 	u_int	apm_detail;
143f5df1827Smickey 	u_int	apm_code32_base;
144f5df1827Smickey 	u_int	apm_code16_base;
145f5df1827Smickey 	u_int	apm_code_len;
146f5df1827Smickey 	u_int	apm_data_base;
147f5df1827Smickey 	u_int	apm_data_len;
148f5df1827Smickey 	u_int	apm_entry;
149f5df1827Smickey 	u_int	apm_code16_len;
150e7940adfSderaadt } __packed bios_apminfo_t;
151f5df1827Smickey 
152f721f560Skettenis #define	BOOTARG_CKSUMLEN 3		/* uint32_t */
153f5df1827Smickey 
154f5df1827Smickey #define	BOOTARG_PCIINFO 4
155f5df1827Smickey typedef struct _bios_pciinfo {
156f5df1827Smickey 	/* PCI BIOS v2.0+ - Installation check values */
157f721f560Skettenis 	uint32_t	pci_chars;	/* Characteristics (%eax) */
158f721f560Skettenis 	uint32_t	pci_rev;	/* BCD Revision (%ebx) */
159f721f560Skettenis 	uint32_t	pci_entry32;	/* PM entry point for PCI BIOS */
160f721f560Skettenis 	uint32_t	pci_lastbus;	/* Number of last PCI bus */
161e7940adfSderaadt } __packed bios_pciinfo_t;
162f5df1827Smickey 
163f5df1827Smickey #define	BOOTARG_CONSDEV	5
164f5df1827Smickey typedef struct _bios_consdev {
165f5df1827Smickey 	dev_t		consdev;
166f5df1827Smickey 	int		conspeed;
16709d240e0Skettenis 	uint64_t	consaddr;
16809d240e0Skettenis 	int		consfreq;
16909d240e0Skettenis 	uint32_t	flags;
17009d240e0Skettenis #define BCD_MMIO	0x00000001	/* Memory Mapped IO */
17109d240e0Skettenis 	int		reg_width;
17209d240e0Skettenis 	int		reg_shift;
17309d240e0Skettenis } __packed bios_consdev_t;
17409d240e0Skettenis 
1758847d4f8Sderaadt #define BOOTARG_BOOTMAC	7
1768847d4f8Sderaadt typedef struct _bios_bootmac {
1778847d4f8Sderaadt 	char	mac[6];
178e7940adfSderaadt } __packed bios_bootmac_t;
1798847d4f8Sderaadt 
180c350d4dcSdlg #define BOOTARG_DDB 8
181c350d4dcSdlg typedef struct _bios_ddb {
182c350d4dcSdlg 	int	db_console;
183c350d4dcSdlg } __packed bios_ddb_t;
184c350d4dcSdlg 
18558db950fSjsing #define BOOTARG_BOOTDUID 9
18658db950fSjsing typedef struct _bios_bootduid {
187331b9dcdSjsing 	u_char	duid[8];
18858db950fSjsing } __packed bios_bootduid_t;
189331b9dcdSjsing 
1907ddb4085Sjsing #define BOOTARG_BOOTSR 10
1917ddb4085Sjsing #define BOOTSR_UUID_MAX 16
1927ddb4085Sjsing #define BOOTSR_CRYPTO_MAXKEYBYTES 32
1937ddb4085Sjsing typedef struct _bios_bootsr {
194f721f560Skettenis 	uint8_t		uuid[BOOTSR_UUID_MAX];
195f721f560Skettenis 	uint8_t		maskkey[BOOTSR_CRYPTO_MAXKEYBYTES];
1967ddb4085Sjsing } __packed bios_bootsr_t;
1977ddb4085Sjsing 
19844026685Syasuoka #define	BOOTARG_EFIINFO 11
19944026685Syasuoka typedef struct _bios_efiinfo {
20044026685Syasuoka 	uint64_t	config_acpi;
20144026685Syasuoka 	uint64_t	config_smbios;
20244026685Syasuoka 	uint64_t	fb_addr;
20344026685Syasuoka 	uint64_t	fb_size;
20444026685Syasuoka 	uint32_t	fb_height;
20544026685Syasuoka 	uint32_t	fb_width;
20644026685Syasuoka 	uint32_t	fb_pixpsl;	/* pixels per scan line */
20744026685Syasuoka 	uint32_t	fb_red_mask;
20844026685Syasuoka 	uint32_t	fb_green_mask;
20944026685Syasuoka 	uint32_t	fb_blue_mask;
21044026685Syasuoka 	uint32_t	fb_reserved_mask;
211cdc0877dSkettenis 	uint32_t	flags;
212cdc0877dSkettenis #define BEI_64BIT	0x00000001	/* 64-bit EFI implementation */
2138584df4eSkettenis #define BEI_ESRT	0x00000002	/* ESRT table */
214cdc0877dSkettenis 	uint32_t	mmap_desc_ver;
215cdc0877dSkettenis 	uint32_t	mmap_desc_size;
216cdc0877dSkettenis 	uint32_t	mmap_size;
217cdc0877dSkettenis 	uint64_t	mmap_start;
218cdc0877dSkettenis 	uint64_t	system_table;
2198584df4eSkettenis 	uint64_t	config_esrt;
22044026685Syasuoka } __packed bios_efiinfo_t;
22144026685Syasuoka 
222b4ccf14aSpatrick #define	BOOTARG_UCODE 12
223b4ccf14aSpatrick typedef struct _bios_ucode {
224b4ccf14aSpatrick 	uint64_t	uc_addr;
225b4ccf14aSpatrick 	uint64_t	uc_size;
226b4ccf14aSpatrick } __packed bios_ucode_t;
227b4ccf14aSpatrick 
228f5df1827Smickey #if defined(_KERNEL) || defined (_STANDALONE)
229f5df1827Smickey 
230f5df1827Smickey #ifdef _LOCORE
231f5df1827Smickey #define	DOINT(n)	int	$0x20+(n)
232f5df1827Smickey #else
233f5df1827Smickey #define	DOINT(n)	"int $0x20+(" #n ")"
234f5df1827Smickey 
235a47f7207Smickey extern volatile struct BIOS_regs {
236f721f560Skettenis 	uint32_t	biosr_ax;
237f721f560Skettenis 	uint32_t	biosr_cx;
238f721f560Skettenis 	uint32_t	biosr_dx;
239f721f560Skettenis 	uint32_t	biosr_bx;
240f721f560Skettenis 	uint32_t	biosr_bp;
241f721f560Skettenis 	uint32_t	biosr_si;
242f721f560Skettenis 	uint32_t	biosr_di;
243f721f560Skettenis 	uint32_t	biosr_ds;
244f721f560Skettenis 	uint32_t	biosr_es;
245e7940adfSderaadt } __packed BIOS_regs;
246f5df1827Smickey 
247f5df1827Smickey #ifdef _KERNEL
248f5df1827Smickey #include <machine/bus.h>
249f5df1827Smickey 
250f5df1827Smickey struct bios_attach_args {
251f63689adSderaadt 	char		*ba_name;
252f721f560Skettenis 	u_int		ba_func;
253f63689adSderaadt 	bus_space_tag_t	ba_iot;
254f63689adSderaadt 	bus_space_tag_t	ba_memt;
255f5df1827Smickey 	union {
256f5df1827Smickey 		void		*_p;
257f63689adSderaadt 		bios_apminfo_t	*_ba_apmp;
258f63689adSderaadt 		paddr_t		_ba_acpipbase;
259f5df1827Smickey 	} _;
260f5df1827Smickey };
261f5df1827Smickey 
262f63689adSderaadt #define	ba_apmp		_._ba_apmp
263f63689adSderaadt #define ba_acpipbase	_._ba_acpipbase
264f5df1827Smickey 
265f5df1827Smickey struct consdev;
266f5df1827Smickey struct proc;
267f5df1827Smickey 
268f5df1827Smickey int bios_sysctl(int *, u_int, void *, size_t *, void *, size_t, struct proc *);
269f5df1827Smickey 
270f5df1827Smickey void bios_getopt(void);
27155988961Sderaadt bios_diskinfo_t *bios_getdiskinfo(dev_t);
272f5df1827Smickey 
27336d473f7Sguenther extern int biosbasemem;
274f5df1827Smickey extern u_int bootapiver;
275f5df1827Smickey extern bios_memmap_t *bios_memmap;
27644026685Syasuoka extern bios_efiinfo_t *bios_efiinfo;
277b4ccf14aSpatrick extern bios_ucode_t *bios_ucode;
278f5df1827Smickey 
279f5df1827Smickey #endif /* _KERNEL */
280f5df1827Smickey #endif /* _LOCORE */
281f5df1827Smickey #endif /* _KERNEL || _STANDALONE */
282f5df1827Smickey 
2832fa72412Spirofti #endif /* _MACHINE_BIOSVAR_H_ */
284