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