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"
6*9c6c0aeaSBernhard Beschow #include "hw/qdev-core.h"
723609e47SIgor Mammedov
823609e47SIgor Mammedov #define TYPE_ACPI_DEV_AML_IF "acpi-dev-aml-interface"
923609e47SIgor Mammedov typedef struct AcpiDevAmlIfClass AcpiDevAmlIfClass;
1023609e47SIgor Mammedov DECLARE_CLASS_CHECKERS(AcpiDevAmlIfClass, ACPI_DEV_AML_IF, TYPE_ACPI_DEV_AML_IF)
1123609e47SIgor Mammedov #define ACPI_DEV_AML_IF(obj) \
1223609e47SIgor Mammedov INTERFACE_CHECK(AcpiDevAmlIf, (obj), TYPE_ACPI_DEV_AML_IF)
1323609e47SIgor Mammedov
1423609e47SIgor Mammedov typedef struct AcpiDevAmlIf AcpiDevAmlIf;
1523609e47SIgor Mammedov typedef void (*dev_aml_fn)(AcpiDevAmlIf *adev, Aml *scope);
1623609e47SIgor Mammedov
1723609e47SIgor Mammedov /**
1823609e47SIgor Mammedov * AcpiDevAmlIfClass:
1923609e47SIgor Mammedov *
2023609e47SIgor Mammedov * build_dev_aml: adds device specific AML blob to provided scope
2123609e47SIgor Mammedov *
2223609e47SIgor Mammedov * Interface is designed for providing generic callback that builds device
2323609e47SIgor Mammedov * specific AML blob.
2423609e47SIgor Mammedov */
2523609e47SIgor Mammedov struct AcpiDevAmlIfClass {
2623609e47SIgor Mammedov /* <private> */
2723609e47SIgor Mammedov InterfaceClass parent_class;
2823609e47SIgor Mammedov
2923609e47SIgor Mammedov /* <public> */
3023609e47SIgor Mammedov dev_aml_fn build_dev_aml;
3123609e47SIgor Mammedov };
3223609e47SIgor Mammedov
get_dev_aml_func(DeviceState * dev)335dbad0afSIgor Mammedov static inline dev_aml_fn get_dev_aml_func(DeviceState *dev)
3423609e47SIgor Mammedov {
3523609e47SIgor Mammedov if (object_dynamic_cast(OBJECT(dev), TYPE_ACPI_DEV_AML_IF)) {
3623609e47SIgor Mammedov AcpiDevAmlIfClass *klass = ACPI_DEV_AML_IF_GET_CLASS(dev);
375dbad0afSIgor Mammedov return klass->build_dev_aml;
385dbad0afSIgor Mammedov }
395dbad0afSIgor Mammedov return NULL;
405dbad0afSIgor Mammedov }
415dbad0afSIgor Mammedov
call_dev_aml_func(DeviceState * dev,Aml * scope)425dbad0afSIgor Mammedov static inline void call_dev_aml_func(DeviceState *dev, Aml *scope)
435dbad0afSIgor Mammedov {
445dbad0afSIgor Mammedov dev_aml_fn fn = get_dev_aml_func(dev);
455dbad0afSIgor Mammedov if (fn) {
465dbad0afSIgor Mammedov fn(ACPI_DEV_AML_IF(dev), scope);
4723609e47SIgor Mammedov }
4823609e47SIgor Mammedov }
4923609e47SIgor Mammedov
50*9c6c0aeaSBernhard Beschow void qbus_build_aml(BusState *bus, Aml *scope);
51*9c6c0aeaSBernhard Beschow
5223609e47SIgor Mammedov #endif
53