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 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 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