| #ifndef ACPI_AML_INTERFACE_H |
| #define ACPI_AML_INTERFACE_H |
| |
| #include "qom/object.h" |
| #include "hw/acpi/aml-build.h" |
| #include "hw/qdev-core.h" |
| |
| #define TYPE_ACPI_DEV_AML_IF "acpi-dev-aml-interface" |
| typedef struct AcpiDevAmlIfClass AcpiDevAmlIfClass; |
| DECLARE_CLASS_CHECKERS(AcpiDevAmlIfClass, ACPI_DEV_AML_IF, TYPE_ACPI_DEV_AML_IF) |
| #define ACPI_DEV_AML_IF(obj) \ |
| INTERFACE_CHECK(AcpiDevAmlIf, (obj), TYPE_ACPI_DEV_AML_IF) |
| |
| typedef struct AcpiDevAmlIf AcpiDevAmlIf; |
| typedef void (*dev_aml_fn)(AcpiDevAmlIf *adev, Aml *scope); |
| |
| /** |
| * AcpiDevAmlIfClass: |
| * |
| * build_dev_aml: adds device specific AML blob to provided scope |
| * |
| * Interface is designed for providing generic callback that builds device |
| * specific AML blob. |
| */ |
| struct AcpiDevAmlIfClass { |
| /* <private> */ |
| InterfaceClass parent_class; |
| |
| /* <public> */ |
| dev_aml_fn build_dev_aml; |
| }; |
| |
| static inline dev_aml_fn get_dev_aml_func(DeviceState *dev) |
| { |
| if (object_dynamic_cast(OBJECT(dev), TYPE_ACPI_DEV_AML_IF)) { |
| AcpiDevAmlIfClass *klass = ACPI_DEV_AML_IF_GET_CLASS(dev); |
| return klass->build_dev_aml; |
| } |
| return NULL; |
| } |
| |
| static inline void call_dev_aml_func(DeviceState *dev, Aml *scope) |
| { |
| dev_aml_fn fn = get_dev_aml_func(dev); |
| if (fn) { |
| fn(ACPI_DEV_AML_IF(dev), scope); |
| } |
| } |
| |
| void qbus_build_aml(BusState *bus, Aml *scope); |
| |
| #endif |