#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
