xref: /illumos-gate/usr/src/cmd/bhyve/basl.h (revision 32640292339b07090f10ce34d455f98711077343)
159d65d31SAndy Fiddaman /*-
259d65d31SAndy Fiddaman  * SPDX-License-Identifier: BSD-2-Clause
359d65d31SAndy Fiddaman  *
459d65d31SAndy Fiddaman  * Copyright (c) 2022 Beckhoff Automation GmbH & Co. KG
559d65d31SAndy Fiddaman  */
659d65d31SAndy Fiddaman 
759d65d31SAndy Fiddaman #pragma once
859d65d31SAndy Fiddaman 
959d65d31SAndy Fiddaman #pragma GCC diagnostic push
1059d65d31SAndy Fiddaman #pragma GCC diagnostic ignored "-Wunused-parameter"
1159d65d31SAndy Fiddaman #include <contrib/dev/acpica/include/acpi.h>
1259d65d31SAndy Fiddaman #pragma GCC diagnostic pop
1359d65d31SAndy Fiddaman 
1459d65d31SAndy Fiddaman #ifndef	__FreeBSD__
1559d65d31SAndy Fiddaman /* Until the in-gate ACPI is updated, map the new name to the old. */
1659d65d31SAndy Fiddaman #define	ACPI_NAMESEG_SIZE	ACPI_NAME_SIZE
1759d65d31SAndy Fiddaman /*
1859d65d31SAndy Fiddaman  * Also to avoid type conflicts without having to pepper the code with ifdefs,
1959d65d31SAndy Fiddaman  * redefine these constants to be uint8_t *
2059d65d31SAndy Fiddaman  */
2159d65d31SAndy Fiddaman #undef ACPI_SIG_FACS
2259d65d31SAndy Fiddaman #undef ACPI_SIG_MCFG
2359d65d31SAndy Fiddaman #undef ACPI_SIG_HPET
2459d65d31SAndy Fiddaman #undef ACPI_SIG_MADT
2559d65d31SAndy Fiddaman #undef ACPI_SIG_DSDT
2659d65d31SAndy Fiddaman #undef ACPI_SIG_FADT
2759d65d31SAndy Fiddaman #undef ACPI_SIG_XSDT
2859d65d31SAndy Fiddaman #undef ACPI_SIG_RSDT
2959d65d31SAndy Fiddaman #undef ACPI_RSDP_NAME
3059d65d31SAndy Fiddaman #undef ACPI_SIG_SPCR
31*32640292SAndy Fiddaman #undef ACPI_SIG_TPM2
3259d65d31SAndy Fiddaman #define	ACPI_SIG_FACS           (const uint8_t *)"FACS"
3359d65d31SAndy Fiddaman #define	ACPI_SIG_MCFG		(const uint8_t *)"MCFG"
3459d65d31SAndy Fiddaman #define	ACPI_SIG_HPET		(const uint8_t *)"HPET"
3559d65d31SAndy Fiddaman #define	ACPI_SIG_MADT		(const uint8_t *)"APIC"
3659d65d31SAndy Fiddaman #define	ACPI_SIG_DSDT		(const uint8_t *)"DSDT"
3759d65d31SAndy Fiddaman #define	ACPI_SIG_FADT		(const uint8_t *)"FACP"
3859d65d31SAndy Fiddaman #define	ACPI_SIG_XSDT		(const uint8_t *)"XSDT"
3959d65d31SAndy Fiddaman #define	ACPI_SIG_RSDT		(const uint8_t *)"RSDT"
4059d65d31SAndy Fiddaman #define	ACPI_RSDP_NAME		(const uint8_t *)"RSDP"
4159d65d31SAndy Fiddaman #define	ACPI_SIG_SPCR		(const uint8_t *)"SPCR"
42*32640292SAndy Fiddaman #define	ACPI_SIG_TPM2		(const uint8_t *)"TPM2"
4359d65d31SAndy Fiddaman #endif /* !__FreeBSD__ */
4459d65d31SAndy Fiddaman 
45*32640292SAndy Fiddaman #include "qemu_fwcfg.h"
46*32640292SAndy Fiddaman 
4759d65d31SAndy Fiddaman #define ACPI_GAS_ACCESS_WIDTH_LEGACY 0
4859d65d31SAndy Fiddaman #define ACPI_GAS_ACCESS_WIDTH_UNDEFINED 0
4959d65d31SAndy Fiddaman #define ACPI_GAS_ACCESS_WIDTH_BYTE 1
5059d65d31SAndy Fiddaman #define ACPI_GAS_ACCESS_WIDTH_WORD 2
5159d65d31SAndy Fiddaman #define ACPI_GAS_ACCESS_WIDTH_DWORD 3
5259d65d31SAndy Fiddaman #define ACPI_GAS_ACCESS_WIDTH_QWORD 4
5359d65d31SAndy Fiddaman 
5459d65d31SAndy Fiddaman #define ACPI_SPCR_INTERRUPT_TYPE_8259 0x1
5559d65d31SAndy Fiddaman #define ACPI_SPCR_INTERRUPT_TYPE_APIC 0x2
5659d65d31SAndy Fiddaman #define ACPI_SPCR_INTERRUPT_TYPE_SAPIC 0x4
5759d65d31SAndy Fiddaman #define ACPI_SPCR_INTERRUPT_TYPE_GIC 0x8
5859d65d31SAndy Fiddaman 
5959d65d31SAndy Fiddaman #define ACPI_SPCR_BAUD_RATE_9600 3
6059d65d31SAndy Fiddaman #define ACPI_SPCR_BAUD_RATE_19200 4
6159d65d31SAndy Fiddaman #define ACPI_SPCR_BAUD_RATE_57600 6
6259d65d31SAndy Fiddaman #define ACPI_SPCR_BAUD_RATE_115200 7
6359d65d31SAndy Fiddaman 
6459d65d31SAndy Fiddaman #define ACPI_SPCR_PARITY_NO_PARITY 0
6559d65d31SAndy Fiddaman 
6659d65d31SAndy Fiddaman #define ACPI_SPCR_STOP_BITS_1 1
6759d65d31SAndy Fiddaman 
6859d65d31SAndy Fiddaman #define ACPI_SPCR_FLOW_CONTROL_DCD 0x1
6959d65d31SAndy Fiddaman #define ACPI_SPCR_FLOW_CONTROL_RTS_CTS 0x2
7059d65d31SAndy Fiddaman #define ACPI_SPCR_FLOW_CONTROL_XON_XOFF 0x4
7159d65d31SAndy Fiddaman 
7259d65d31SAndy Fiddaman #define ACPI_SPCR_TERMINAL_TYPE_VT100 0
7359d65d31SAndy Fiddaman #define ACPI_SPCR_TERMINAL_TYPE_VT100_PLUS 1
7459d65d31SAndy Fiddaman #define ACPI_SPCR_TERMINAL_TYPE_VT_UTF8 2
7559d65d31SAndy Fiddaman #define ACPI_SPCR_TERMINAL_TYPE_ANSI 3
7659d65d31SAndy Fiddaman 
7759d65d31SAndy Fiddaman #define BHYVE_ACPI_BASE 0xf2400
7859d65d31SAndy Fiddaman 
7959d65d31SAndy Fiddaman #define BASL_TABLE_ALIGNMENT 0x10
8059d65d31SAndy Fiddaman #define BASL_TABLE_ALIGNMENT_FACS 0x40
8159d65d31SAndy Fiddaman 
8259d65d31SAndy Fiddaman #define BASL_TABLE_CHECKSUM_LEN_FULL_TABLE (-1U)
8359d65d31SAndy Fiddaman 
8459d65d31SAndy Fiddaman #define BASL_EXEC(x)                                                         \
8559d65d31SAndy Fiddaman 	do {                                                                 \
8659d65d31SAndy Fiddaman 		const int error = (x);                                       \
8759d65d31SAndy Fiddaman 		if (error) {                                                 \
8859d65d31SAndy Fiddaman 			warnc(error,                                         \
8959d65d31SAndy Fiddaman 			    "BASL failed @ %s:%d\n    Failed to execute %s", \
9059d65d31SAndy Fiddaman 			    __func__, __LINE__, #x);                         \
9159d65d31SAndy Fiddaman 			return (error);                                      \
9259d65d31SAndy Fiddaman 		}                                                            \
9359d65d31SAndy Fiddaman 	} while (0)
9459d65d31SAndy Fiddaman 
9559d65d31SAndy Fiddaman struct basl_table;
9659d65d31SAndy Fiddaman 
9759d65d31SAndy Fiddaman void basl_fill_gas(ACPI_GENERIC_ADDRESS *gas, uint8_t space_id,
9859d65d31SAndy Fiddaman     uint8_t bit_width, uint8_t bit_offset, uint8_t access_width,
9959d65d31SAndy Fiddaman     uint64_t address);
10059d65d31SAndy Fiddaman int basl_finish(void);
101*32640292SAndy Fiddaman int basl_init(struct vmctx *ctx);
10259d65d31SAndy Fiddaman int basl_table_add_checksum(struct basl_table *const table, const uint32_t off,
10359d65d31SAndy Fiddaman     const uint32_t start, const uint32_t len);
10459d65d31SAndy Fiddaman int basl_table_add_length(struct basl_table *const table, const uint32_t off,
10559d65d31SAndy Fiddaman     const uint8_t size);
10659d65d31SAndy Fiddaman int basl_table_add_pointer(struct basl_table *const table,
10759d65d31SAndy Fiddaman     const uint8_t src_signature[ACPI_NAMESEG_SIZE], const uint32_t off,
10859d65d31SAndy Fiddaman     const uint8_t size);
10959d65d31SAndy Fiddaman int basl_table_append_bytes(struct basl_table *table, const void *bytes,
11059d65d31SAndy Fiddaman     uint32_t len);
11159d65d31SAndy Fiddaman int basl_table_append_checksum(struct basl_table *table, uint32_t start,
11259d65d31SAndy Fiddaman     uint32_t len);
11359d65d31SAndy Fiddaman /* Add an ACPI_TABLE_* to basl without its header. */
11459d65d31SAndy Fiddaman int basl_table_append_content(struct basl_table *table, void *data,
11559d65d31SAndy Fiddaman     uint32_t len);
116*32640292SAndy Fiddaman int basl_table_append_fwcfg(struct basl_table *table,
117*32640292SAndy Fiddaman     const uint8_t *fwcfg_name, uint32_t alignment,
118*32640292SAndy Fiddaman     uint8_t size);
11959d65d31SAndy Fiddaman int basl_table_append_gas(struct basl_table *table, uint8_t space_id,
12059d65d31SAndy Fiddaman     uint8_t bit_width, uint8_t bit_offset, uint8_t access_width,
12159d65d31SAndy Fiddaman     uint64_t address);
12259d65d31SAndy Fiddaman int basl_table_append_header(struct basl_table *table,
12359d65d31SAndy Fiddaman     const uint8_t signature[ACPI_NAMESEG_SIZE], uint8_t revision,
12459d65d31SAndy Fiddaman     uint32_t oem_revision);
12559d65d31SAndy Fiddaman int basl_table_append_int(struct basl_table *table, uint64_t val, uint8_t size);
12659d65d31SAndy Fiddaman int basl_table_append_length(struct basl_table *table, uint8_t size);
12759d65d31SAndy Fiddaman int basl_table_append_pointer(struct basl_table *table,
12859d65d31SAndy Fiddaman     const uint8_t src_signature[ACPI_NAMESEG_SIZE], uint8_t size);
12959d65d31SAndy Fiddaman int basl_table_create(struct basl_table **table, struct vmctx *ctx,
13059d65d31SAndy Fiddaman     const uint8_t *name, uint32_t alignment);
131*32640292SAndy Fiddaman /* Adds the table to RSDT and XSDT */
132*32640292SAndy Fiddaman int basl_table_register_to_rsdt(struct basl_table *table);
133