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
50