acpi_aml_interface.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #ifndef ACPI_AML_INTERFACE_H
  2. #define ACPI_AML_INTERFACE_H
  3. #include "qom/object.h"
  4. #include "hw/acpi/aml-build.h"
  5. #include "hw/qdev-core.h"
  6. #define TYPE_ACPI_DEV_AML_IF "acpi-dev-aml-interface"
  7. typedef struct AcpiDevAmlIfClass AcpiDevAmlIfClass;
  8. DECLARE_CLASS_CHECKERS(AcpiDevAmlIfClass, ACPI_DEV_AML_IF, TYPE_ACPI_DEV_AML_IF)
  9. #define ACPI_DEV_AML_IF(obj) \
  10. INTERFACE_CHECK(AcpiDevAmlIf, (obj), TYPE_ACPI_DEV_AML_IF)
  11. typedef struct AcpiDevAmlIf AcpiDevAmlIf;
  12. typedef void (*dev_aml_fn)(AcpiDevAmlIf *adev, Aml *scope);
  13. /**
  14. * AcpiDevAmlIfClass:
  15. *
  16. * build_dev_aml: adds device specific AML blob to provided scope
  17. *
  18. * Interface is designed for providing generic callback that builds device
  19. * specific AML blob.
  20. */
  21. struct AcpiDevAmlIfClass {
  22. /* <private> */
  23. InterfaceClass parent_class;
  24. /* <public> */
  25. dev_aml_fn build_dev_aml;
  26. };
  27. static inline dev_aml_fn get_dev_aml_func(DeviceState *dev)
  28. {
  29. if (object_dynamic_cast(OBJECT(dev), TYPE_ACPI_DEV_AML_IF)) {
  30. AcpiDevAmlIfClass *klass = ACPI_DEV_AML_IF_GET_CLASS(dev);
  31. return klass->build_dev_aml;
  32. }
  33. return NULL;
  34. }
  35. static inline void call_dev_aml_func(DeviceState *dev, Aml *scope)
  36. {
  37. dev_aml_fn fn = get_dev_aml_func(dev);
  38. if (fn) {
  39. fn(ACPI_DEV_AML_IF(dev), scope);
  40. }
  41. }
  42. void qbus_build_aml(BusState *bus, Aml *scope);
  43. #endif