bhyve: build SPCR ACPI table

OVMF ships some static ACPI tables. This worked in the past but won't
work in the future when we support devices like tpms. They require a TPM
ACPI table. So, we have to dynamically create ACPI tables depending on
the bhyve configuration.

Bhyve has much more information about the system than OVMF. Therefore,
it's easier for bhyve to build up some ACPI tables. For that reason, it
would be much better to use the ACPI tables provided by bhyve instead of
building some tables by OVMF.

At the moment, OVMF always creates a SPCR table. Maybe someone depends
on it. So, we have to build it by bhyve too before we can patch OVMF to
install the tables provided by bhyve.

Reviewed by:		markj
MFC after:		1 week
Sponsored by:		Beckhoff Automation GmbH & Co. KG
Differential Revision:	https://reviews.freebsd.org/D37591
This commit is contained in:
Corvin Köhne 2022-11-30 15:46:19 +01:00
parent 6e36cfadbc
commit b972e7cbb4
No known key found for this signature in database
GPG Key ID: D854DA56315E026A
2 changed files with 55 additions and 0 deletions

View File

@ -692,6 +692,37 @@ build_rsdt(struct vmctx *const ctx)
return (0);
}
static int
build_spcr(struct vmctx *const ctx)
{
ACPI_TABLE_SPCR spcr;
struct basl_table *table;
BASL_EXEC(basl_table_create(&table, ctx, ACPI_SIG_SPCR,
BASL_TABLE_ALIGNMENT));
memset(&spcr, 0, sizeof(spcr));
BASL_EXEC(basl_table_append_header(table, ACPI_SIG_SPCR, 1, 1));
spcr.InterfaceType = ACPI_DBG2_16550_COMPATIBLE;
basl_fill_gas(&spcr.SerialPort, ACPI_ADR_SPACE_SYSTEM_IO, 8, 0,
ACPI_GAS_ACCESS_WIDTH_LEGACY, 0x3F8);
spcr.InterruptType = ACPI_SPCR_INTERRUPT_TYPE_8259;
spcr.PcInterrupt = 4;
spcr.BaudRate = ACPI_SPCR_BAUD_RATE_115200;
spcr.Parity = ACPI_SPCR_PARITY_NO_PARITY;
spcr.StopBits = ACPI_SPCR_STOP_BITS_1;
spcr.FlowControl = 3; /* RTS/CTS | DCD */
spcr.TerminalType = ACPI_SPCR_TERMINAL_TYPE_VT_UTF8;
BASL_EXEC(basl_table_append_content(table, &spcr, sizeof(spcr)));
BASL_EXEC(basl_table_append_pointer(rsdt, ACPI_SIG_SPCR,
ACPI_RSDT_ENTRY_SIZE));
BASL_EXEC(basl_table_append_pointer(xsdt, ACPI_SIG_SPCR,
ACPI_XSDT_ENTRY_SIZE));
return (0);
}
static int
build_xsdt(struct vmctx *const ctx)
{
@ -749,6 +780,7 @@ acpi_build(struct vmctx *ctx, int ncpu)
BASL_EXEC(build_hpet(ctx));
BASL_EXEC(build_mcfg(ctx));
BASL_EXEC(build_facs(ctx));
BASL_EXEC(build_spcr(ctx));
BASL_EXEC(build_dsdt(ctx));
BASL_EXEC(basl_finish());

View File

@ -18,6 +18,29 @@
#define ACPI_GAS_ACCESS_WIDTH_DWORD 3
#define ACPI_GAS_ACCESS_WIDTH_QWORD 4
#define ACPI_SPCR_INTERRUPT_TYPE_8259 0x1
#define ACPI_SPCR_INTERRUPT_TYPE_APIC 0x2
#define ACPI_SPCR_INTERRUPT_TYPE_SAPIC 0x4
#define ACPI_SPCR_INTERRUPT_TYPE_GIC 0x8
#define ACPI_SPCR_BAUD_RATE_9600 3
#define ACPI_SPCR_BAUD_RATE_19200 4
#define ACPI_SPCR_BAUD_RATE_57600 6
#define ACPI_SPCR_BAUD_RATE_115200 7
#define ACPI_SPCR_PARITY_NO_PARITY 0
#define ACPI_SPCR_STOP_BITS_1 1
#define ACPI_SPCR_FLOW_CONTROL_DCD 0x1
#define ACPI_SPCR_FLOW_CONTROL_RTS_CTS 0x2
#define ACPI_SPCR_FLOW_CONTROL_XON_XOFF 0x4
#define ACPI_SPCR_TERMINAL_TYPE_VT100 0
#define ACPI_SPCR_TERMINAL_TYPE_VT100_PLUS 1
#define ACPI_SPCR_TERMINAL_TYPE_VT_UTF8 2
#define ACPI_SPCR_TERMINAL_TYPE_ANSI 3
#define BHYVE_ACPI_BASE 0xf2400
#define BASL_TABLE_ALIGNMENT 0x10