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