]> git.proxmox.com Git - mirror_qemu.git/blob - include/hw/acpi/acpi_aml_interface.h
qemu-img: Change info key names for protocol nodes
[mirror_qemu.git] / include / hw / acpi / acpi_aml_interface.h
1 #ifndef ACPI_AML_INTERFACE_H
2 #define ACPI_AML_INTERFACE_H
3
4 #include "qom/object.h"
5 #include "hw/acpi/aml-build.h"
6
7 #define TYPE_ACPI_DEV_AML_IF "acpi-dev-aml-interface"
8 typedef struct AcpiDevAmlIfClass AcpiDevAmlIfClass;
9 DECLARE_CLASS_CHECKERS(AcpiDevAmlIfClass, ACPI_DEV_AML_IF, TYPE_ACPI_DEV_AML_IF)
10 #define ACPI_DEV_AML_IF(obj) \
11 INTERFACE_CHECK(AcpiDevAmlIf, (obj), TYPE_ACPI_DEV_AML_IF)
12
13 typedef struct AcpiDevAmlIf AcpiDevAmlIf;
14 typedef void (*dev_aml_fn)(AcpiDevAmlIf *adev, Aml *scope);
15
16 /**
17 * AcpiDevAmlIfClass:
18 *
19 * build_dev_aml: adds device specific AML blob to provided scope
20 *
21 * Interface is designed for providing generic callback that builds device
22 * specific AML blob.
23 */
24 struct AcpiDevAmlIfClass {
25 /* <private> */
26 InterfaceClass parent_class;
27
28 /* <public> */
29 dev_aml_fn build_dev_aml;
30 };
31
32 static inline dev_aml_fn get_dev_aml_func(DeviceState *dev)
33 {
34 if (object_dynamic_cast(OBJECT(dev), TYPE_ACPI_DEV_AML_IF)) {
35 AcpiDevAmlIfClass *klass = ACPI_DEV_AML_IF_GET_CLASS(dev);
36 return klass->build_dev_aml;
37 }
38 return NULL;
39 }
40
41 static inline void call_dev_aml_func(DeviceState *dev, Aml *scope)
42 {
43 dev_aml_fn fn = get_dev_aml_func(dev);
44 if (fn) {
45 fn(ACPI_DEV_AML_IF(dev), scope);
46 }
47 }
48
49 #endif