// Copyright 2018 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.platform.device;

using ddk.driver;
using zx;

struct PdevDeviceInfo {
    uint32 vid;
    uint32 pid;
    uint32 did;
    uint32 mmio_count;
    uint32 irq_count;
    uint32 bti_count;
    uint32 smc_count;
    uint32 metadata_count;
    array<uint32>:8 reserved;
    string:32 name;
};

struct PdevBoardInfo {
    /// Vendor ID for the board.
    uint32 vid;
    /// Product ID for the board.
    uint32 pid;
    /// Board name from the boot image platform ID record,
    /// (or from the BIOS on x86 platforms).
    string:32 board_name;
    /// Board specific revision number.
    uint32 board_revision;
};

struct PdevMmio {
    /// Offset from beginning of VMO where the mmio region begins.
    zx.off offset;
    /// Size of mmio region.
    usize size;
    handle<vmo> vmo;
};

[Layout = "ddk-protocol"]
protocol PDev {
    GetMmio(uint32 index) -> (zx.status s, PdevMmio mmio);
    GetInterrupt(uint32 index, uint32 flags) -> (zx.status s, handle<interrupt> irq);
    GetBti(uint32 index) -> (zx.status s, handle<bti> bti);
    GetSmc(uint32 index) -> (zx.status s, handle<resource> smc);
    GetDeviceInfo() -> (zx.status s, PdevDeviceInfo info);
    GetBoardInfo() -> (zx.status s, PdevBoardInfo info);
};
