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 #include "hw/qdev-core.h"
7
8 #define TYPE_ACPI_DEV_AML_IF "acpi-dev-aml-interface"
9 typedef struct AcpiDevAmlIfClass AcpiDevAmlIfClass;
10 DECLARE_CLASS_CHECKERS(AcpiDevAmlIfClass, ACPI_DEV_AML_IF, TYPE_ACPI_DEV_AML_IF)
11 #define ACPI_DEV_AML_IF(obj) \
12 INTERFACE_CHECK(AcpiDevAmlIf, (obj), TYPE_ACPI_DEV_AML_IF)
13
14 typedef struct AcpiDevAmlIf AcpiDevAmlIf;
15 typedef void (*dev_aml_fn)(AcpiDevAmlIf *adev, Aml *scope);
16
17 /**
18 * AcpiDevAmlIfClass:
19 *
20 * build_dev_aml: adds device specific AML blob to provided scope
21 *
22 * Interface is designed for providing generic callback that builds device
23 * specific AML blob.
24 */
25 struct AcpiDevAmlIfClass {
26 /* <private> */
27 InterfaceClass parent_class;
28
29 /* <public> */
30 dev_aml_fn build_dev_aml;
31 };
32
get_dev_aml_func(DeviceState * dev)33 static inline dev_aml_fn get_dev_aml_func(DeviceState *dev)
34 {
35 if (object_dynamic_cast(OBJECT(dev), TYPE_ACPI_DEV_AML_IF)) {
36 AcpiDevAmlIfClass *klass = ACPI_DEV_AML_IF_GET_CLASS(dev);
37 return klass->build_dev_aml;
38 }
39 return NULL;
40 }
41
call_dev_aml_func(DeviceState * dev,Aml * scope)42 static inline void call_dev_aml_func(DeviceState *dev, Aml *scope)
43 {
44 dev_aml_fn fn = get_dev_aml_func(dev);
45 if (fn) {
46 fn(ACPI_DEV_AML_IF(dev), scope);
47 }
48 }
49
50 void qbus_build_aml(BusState *bus, Aml *scope);
51
52 #endif
53