// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.hardware.acpi;
using zx;

const MAX_ACPI_TABLE_ENTRIES uint32 = 512;

/// An ACPI table name signature. This consists of four ASCII characters.
alias AcpiTableSignature = array<uint8, 4>;

/// Metadata about an ACPI table entry.
type TableInfo = struct {
    /// Name of the table. There may be multiple tables with the same name.
    name AcpiTableSignature;

    /// The size of the table, in bytes.
    size uint32;
};

/// Defines access to raw system ACPI data.
///
/// This interface is intended only for low-level debugging tools.
protocol Acpi {
    /// Return the list of ACPI tables present in the system.
    ListTableEntries() -> (struct {
        entries vector<TableInfo>:MAX_ACPI_TABLE_ENTRIES;
    }) error zx.status;

    /// Write the raw content of the named ACPI table into the given VMO.
    ///
    /// Some systems may have multiple ACPI tables with the same name ("SSDT" is
    /// a commonly repeated table, for example). |instance| is used to specify
    /// which instance of the named table to return. A value of |n| returns the
    /// |n|'th occurence. If only one table with the given name is present,
    /// |instance| should be 0.
    ///
    /// On success, returns the number of bytes written into result.
    ReadNamedTable(resource struct {
        name AcpiTableSignature;
        instance uint32;
        result zx.handle:VMO;
    }) -> (struct {
        size uint32;
    }) error zx.status;
};
