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