1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2021 Beckhoff Automation GmbH & Co. KG
5 * Author: Corvin K��hne <c.koehne@beckhoff.com>
6 */
7
8#pragma once
9
10#pragma GCC diagnostic push
11#pragma GCC diagnostic ignored "-Wunused-parameter"
12#include <contrib/dev/acpica/include/acpi.h>
13#pragma GCC diagnostic pop
14
15struct vmctx;
16
17struct acpi_device;
18
19/**
20 * Device specific information and emulation.
21 *
22 * @param name        Used as device name in the DSDT.
23 * @param hid         Used as _HID in the DSDT.
24 * @param build_table Called to build a device specific ACPI table like the TPM2
25 *                    table.
26 * @param write_dsdt  Called to append the DSDT with device specific
27 *                    information.
28 */
29struct acpi_device_emul {
30	const char *name;
31	const char *hid;
32
33	int (*build_table)(const struct acpi_device *dev);
34	int (*write_dsdt)(const struct acpi_device *dev);
35};
36
37/**
38 * Creates an ACPI device.
39 *
40 * @param[out] new_dev Returns the newly create ACPI device.
41 * @param[in]  softc   Pointer to the software context of the ACPI device.
42 * @param[in]  vm_ctx  VM context the ACPI device is created in.
43 * @param[in]  emul    Device emulation struct. It contains some information
44 *                     like the name of the ACPI device and some device specific
45 *                     functions.
46 */
47int acpi_device_create(struct acpi_device **new_dev, void *softc,
48    struct vmctx *vm_ctx, const struct acpi_device_emul *emul);
49void acpi_device_destroy(struct acpi_device *dev);
50
51int acpi_device_add_res_fixed_ioport(struct acpi_device *dev, UINT16 port,
52    UINT8 length);
53int acpi_device_add_res_fixed_memory32(struct acpi_device *dev,
54    UINT8 write_protected, UINT32 address, UINT32 length);
55
56void *acpi_device_get_softc(const struct acpi_device *dev);
57
58int acpi_device_build_table(const struct acpi_device *dev);
59int acpi_device_write_dsdt(const struct acpi_device *dev);
60