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