xref: /qemu/include/hw/acpi/acpi_aml_interface.h (revision 5dbad0af10ff7d4f83db7f4ddd872d85332ebecc)
123609e47SIgor Mammedov #ifndef ACPI_AML_INTERFACE_H
223609e47SIgor Mammedov #define ACPI_AML_INTERFACE_H
323609e47SIgor Mammedov 
423609e47SIgor Mammedov #include "qom/object.h"
523609e47SIgor Mammedov #include "hw/acpi/aml-build.h"
623609e47SIgor Mammedov 
723609e47SIgor Mammedov #define TYPE_ACPI_DEV_AML_IF "acpi-dev-aml-interface"
823609e47SIgor Mammedov typedef struct AcpiDevAmlIfClass AcpiDevAmlIfClass;
923609e47SIgor Mammedov DECLARE_CLASS_CHECKERS(AcpiDevAmlIfClass, ACPI_DEV_AML_IF, TYPE_ACPI_DEV_AML_IF)
1023609e47SIgor Mammedov #define ACPI_DEV_AML_IF(obj) \
1123609e47SIgor Mammedov      INTERFACE_CHECK(AcpiDevAmlIf, (obj), TYPE_ACPI_DEV_AML_IF)
1223609e47SIgor Mammedov 
1323609e47SIgor Mammedov typedef struct AcpiDevAmlIf AcpiDevAmlIf;
1423609e47SIgor Mammedov typedef void (*dev_aml_fn)(AcpiDevAmlIf *adev, Aml *scope);
1523609e47SIgor Mammedov 
1623609e47SIgor Mammedov /**
1723609e47SIgor Mammedov  * AcpiDevAmlIfClass:
1823609e47SIgor Mammedov  *
1923609e47SIgor Mammedov  * build_dev_aml: adds device specific AML blob to provided scope
2023609e47SIgor Mammedov  *
2123609e47SIgor Mammedov  * Interface is designed for providing generic callback that builds device
2223609e47SIgor Mammedov  * specific AML blob.
2323609e47SIgor Mammedov  */
2423609e47SIgor Mammedov struct AcpiDevAmlIfClass {
2523609e47SIgor Mammedov     /* <private> */
2623609e47SIgor Mammedov     InterfaceClass parent_class;
2723609e47SIgor Mammedov 
2823609e47SIgor Mammedov     /* <public> */
2923609e47SIgor Mammedov     dev_aml_fn build_dev_aml;
3023609e47SIgor Mammedov };
3123609e47SIgor Mammedov 
32*5dbad0afSIgor Mammedov static inline dev_aml_fn get_dev_aml_func(DeviceState *dev)
3323609e47SIgor Mammedov {
3423609e47SIgor Mammedov     if (object_dynamic_cast(OBJECT(dev), TYPE_ACPI_DEV_AML_IF)) {
3523609e47SIgor Mammedov         AcpiDevAmlIfClass *klass = ACPI_DEV_AML_IF_GET_CLASS(dev);
36*5dbad0afSIgor Mammedov         return klass->build_dev_aml;
37*5dbad0afSIgor Mammedov     }
38*5dbad0afSIgor Mammedov     return NULL;
39*5dbad0afSIgor Mammedov }
40*5dbad0afSIgor Mammedov 
41*5dbad0afSIgor Mammedov static inline void call_dev_aml_func(DeviceState *dev, Aml *scope)
42*5dbad0afSIgor Mammedov {
43*5dbad0afSIgor Mammedov     dev_aml_fn fn = get_dev_aml_func(dev);
44*5dbad0afSIgor Mammedov     if (fn) {
45*5dbad0afSIgor Mammedov         fn(ACPI_DEV_AML_IF(dev), scope);
4623609e47SIgor Mammedov     }
4723609e47SIgor Mammedov }
4823609e47SIgor Mammedov 
4923609e47SIgor Mammedov #endif
50