xref: /freebsd/sys/dev/coreboot/corebootio.h (revision 5f74217c05a99f38a31a6e4950220964595d4ac8)
1*5f74217cSAbdelkader Boudih /*
2*5f74217cSAbdelkader Boudih  * Copyright (c) 2026 Abdelkader Boudih <freebsd@seuros.com>
3*5f74217cSAbdelkader Boudih  *
4*5f74217cSAbdelkader Boudih  * SPDX-License-Identifier: BSD-2-Clause
5*5f74217cSAbdelkader Boudih  */
6*5f74217cSAbdelkader Boudih 
7*5f74217cSAbdelkader Boudih /*
8*5f74217cSAbdelkader Boudih  * coreboot(4) userland-visible definitions.
9*5f74217cSAbdelkader Boudih  *
10*5f74217cSAbdelkader Boudih  * This header is safe to include from both kernel and userland code.
11*5f74217cSAbdelkader Boudih  * It contains the /dev/cbmem ioctl interface, CBMEM ID constants,
12*5f74217cSAbdelkader Boudih  * and timestamp structures needed by the cbmem(8) utility.
13*5f74217cSAbdelkader Boudih  */
14*5f74217cSAbdelkader Boudih 
15*5f74217cSAbdelkader Boudih #ifndef _DEV_COREBOOT_COREBOOT_IOCTL_H_
16*5f74217cSAbdelkader Boudih #define _DEV_COREBOOT_COREBOOT_IOCTL_H_
17*5f74217cSAbdelkader Boudih 
18*5f74217cSAbdelkader Boudih #include <sys/types.h>
19*5f74217cSAbdelkader Boudih #include <sys/ioccom.h>
20*5f74217cSAbdelkader Boudih 
21*5f74217cSAbdelkader Boudih /*
22*5f74217cSAbdelkader Boudih  * CBMEM ID constants (from coreboot's BSD-3-Clause cbmem_id.h).
23*5f74217cSAbdelkader Boudih  * Used for human-readable CBMEM entry names in sysctl and ioctl output.
24*5f74217cSAbdelkader Boudih  */
25*5f74217cSAbdelkader Boudih #define CBMEM_ID_ACPI			0x41435049
26*5f74217cSAbdelkader Boudih #define CBMEM_ID_ACPI_GNVS		0x474e5653
27*5f74217cSAbdelkader Boudih #define CBMEM_ID_AFTER_CAR		0xc4787a93
28*5f74217cSAbdelkader Boudih #define CBMEM_ID_CBTABLE		0x43425442
29*5f74217cSAbdelkader Boudih #define CBMEM_ID_CBTABLE_FWD		0x43425443
30*5f74217cSAbdelkader Boudih #define CBMEM_ID_CBFS_RO_MCACHE	0x524d5346
31*5f74217cSAbdelkader Boudih #define CBMEM_ID_CBFS_RW_MCACHE	0x574d5346
32*5f74217cSAbdelkader Boudih #define CBMEM_ID_CONSOLE		0x434f4e53
33*5f74217cSAbdelkader Boudih #define CBMEM_ID_ELOG			0x454c4f47
34*5f74217cSAbdelkader Boudih #define CBMEM_ID_FMAP			0x464d4150
35*5f74217cSAbdelkader Boudih #define CBMEM_ID_FREESPACE		0x46524545
36*5f74217cSAbdelkader Boudih #define CBMEM_ID_FSP_RESERVED_MEMORY	0x46535052
37*5f74217cSAbdelkader Boudih #define CBMEM_ID_FSP_RUNTIME		0x52505346
38*5f74217cSAbdelkader Boudih #define CBMEM_ID_FSPM_VERSION		0x56505346
39*5f74217cSAbdelkader Boudih #define CBMEM_ID_IGD_OPREGION		0x4f444749
40*5f74217cSAbdelkader Boudih #define CBMEM_ID_IMD_ROOT		0xff4017ff
41*5f74217cSAbdelkader Boudih #define CBMEM_ID_IMD_SMALL		0x53a11439
42*5f74217cSAbdelkader Boudih #define CBMEM_ID_MEMINFO		0x494d454d
43*5f74217cSAbdelkader Boudih #define CBMEM_ID_MPTABLE		0x534d5054
44*5f74217cSAbdelkader Boudih #define CBMEM_ID_MRCDATA		0x4d524344
45*5f74217cSAbdelkader Boudih #define CBMEM_ID_PIRQ			0x49525154
46*5f74217cSAbdelkader Boudih #define CBMEM_ID_POWER_STATE		0x50535454
47*5f74217cSAbdelkader Boudih #define CBMEM_ID_RAM_OOPS		0x05430095
48*5f74217cSAbdelkader Boudih #define CBMEM_ID_RAMSTAGE		0x9a357a9e
49*5f74217cSAbdelkader Boudih #define CBMEM_ID_REFCODE		0x04efc0de
50*5f74217cSAbdelkader Boudih #define CBMEM_ID_RESUME			0x5245534d
51*5f74217cSAbdelkader Boudih #define CBMEM_ID_ROMSTAGE_INFO		0x47545352
52*5f74217cSAbdelkader Boudih #define CBMEM_ID_ROMSTAGE_RAM_STACK	0x90357ac4
53*5f74217cSAbdelkader Boudih #define CBMEM_ID_ROOT			0xff4007ff
54*5f74217cSAbdelkader Boudih #define CBMEM_ID_SMBIOS			0x534d4254
55*5f74217cSAbdelkader Boudih #define CBMEM_ID_SMM_COMBUFFER		0x53534d32
56*5f74217cSAbdelkader Boudih #define CBMEM_ID_SMM_SAVE_SPACE		0x07e9acee
57*5f74217cSAbdelkader Boudih #define CBMEM_ID_TIMESTAMP		0x54494d45
58*5f74217cSAbdelkader Boudih #define CBMEM_ID_TPM_CB_LOG		0x54435041
59*5f74217cSAbdelkader Boudih #define CBMEM_ID_VBOOT_WORKBUF		0x78007343
60*5f74217cSAbdelkader Boudih #define CBMEM_ID_VPD			0x56504420
61*5f74217cSAbdelkader Boudih 
62*5f74217cSAbdelkader Boudih #define CB_MAX_CBMEM_ENTRIES	64
63*5f74217cSAbdelkader Boudih 
64*5f74217cSAbdelkader Boudih /*
65*5f74217cSAbdelkader Boudih  * /dev/cbmem ioctl interface
66*5f74217cSAbdelkader Boudih  */
67*5f74217cSAbdelkader Boudih struct cbmem_entry_info {
68*5f74217cSAbdelkader Boudih 	uint32_t	id;
69*5f74217cSAbdelkader Boudih 	uint64_t	address;
70*5f74217cSAbdelkader Boudih 	uint32_t	size;
71*5f74217cSAbdelkader Boudih 	char		name[16];
72*5f74217cSAbdelkader Boudih };
73*5f74217cSAbdelkader Boudih 
74*5f74217cSAbdelkader Boudih struct cbmem_list {
75*5f74217cSAbdelkader Boudih 	uint32_t	count;
76*5f74217cSAbdelkader Boudih 	struct cbmem_entry_info entries[CB_MAX_CBMEM_ENTRIES];
77*5f74217cSAbdelkader Boudih };
78*5f74217cSAbdelkader Boudih 
79*5f74217cSAbdelkader Boudih struct cbmem_read_req {
80*5f74217cSAbdelkader Boudih 	uint32_t	id;
81*5f74217cSAbdelkader Boudih 	uint64_t	offset;
82*5f74217cSAbdelkader Boudih 	uint32_t	size;
83*5f74217cSAbdelkader Boudih 	void		*buffer;
84*5f74217cSAbdelkader Boudih };
85*5f74217cSAbdelkader Boudih 
86*5f74217cSAbdelkader Boudih #define CBMEM_IOC_LIST	_IOR('C', 1, struct cbmem_list)
87*5f74217cSAbdelkader Boudih #define CBMEM_IOC_READ	_IOWR('C', 2, struct cbmem_read_req)
88*5f74217cSAbdelkader Boudih 
89*5f74217cSAbdelkader Boudih /*
90*5f74217cSAbdelkader Boudih  * Timestamp structures - stored in a CBMEM region.
91*5f74217cSAbdelkader Boudih  * Used by both the kernel driver and cbmem(8) utility.
92*5f74217cSAbdelkader Boudih  */
93*5f74217cSAbdelkader Boudih struct cb_timestamp_entry {
94*5f74217cSAbdelkader Boudih 	uint32_t	entry_id;
95*5f74217cSAbdelkader Boudih 	int64_t		entry_stamp;
96*5f74217cSAbdelkader Boudih } __packed;
97*5f74217cSAbdelkader Boudih 
98*5f74217cSAbdelkader Boudih struct cb_timestamp_table {
99*5f74217cSAbdelkader Boudih 	uint64_t	base_time;
100*5f74217cSAbdelkader Boudih 	uint16_t	max_entries;
101*5f74217cSAbdelkader Boudih 	uint16_t	tick_freq_mhz;
102*5f74217cSAbdelkader Boudih 	uint32_t	num_entries;
103*5f74217cSAbdelkader Boudih 	struct cb_timestamp_entry entries[];
104*5f74217cSAbdelkader Boudih } __packed;
105*5f74217cSAbdelkader Boudih 
106*5f74217cSAbdelkader Boudih /*
107*5f74217cSAbdelkader Boudih  * TPM CB log structures - stored in a CBMEM region.
108*5f74217cSAbdelkader Boudih  * Used by both the kernel driver and cbmem(8) utility.
109*5f74217cSAbdelkader Boudih  */
110*5f74217cSAbdelkader Boudih struct tpm_cb_log_entry {
111*5f74217cSAbdelkader Boudih 	uint32_t	pcr;
112*5f74217cSAbdelkader Boudih 	uint32_t	event_type;
113*5f74217cSAbdelkader Boudih 	uint8_t		digest[20];	/* SHA-1 */
114*5f74217cSAbdelkader Boudih 	uint32_t	data_len;
115*5f74217cSAbdelkader Boudih } __packed;
116*5f74217cSAbdelkader Boudih 
117*5f74217cSAbdelkader Boudih struct tpm_cb_log_table {
118*5f74217cSAbdelkader Boudih 	uint16_t	max_entries;
119*5f74217cSAbdelkader Boudih 	uint16_t	num_entries;
120*5f74217cSAbdelkader Boudih 	uint32_t	entry_size;
121*5f74217cSAbdelkader Boudih } __packed;
122*5f74217cSAbdelkader Boudih 
123*5f74217cSAbdelkader Boudih #endif /* _DEV_COREBOOT_COREBOOT_IOCTL_H_ */
124