// Copyright 2022 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.bus;

using zx;
using fuchsia.driver.framework;
using fuchsia.hardware.power;

type Mmio = table {
    /// Physical address of MMIO region.
    /// Does not need to be page aligned.
    1: base uint64;
    /// Length of MMIO region in bytes.
    /// Does not need to be page aligned.
    2: length uint64;
    /// Name that can be used to retrieve the Mmio using
    /// [`fuchsia.hardware.platform.device/GetMmioByName`].
    /// It is valid for this to be empty, however the resource will only be able
    /// to be retrieved using [`fuchsia.hardware.platform.device/GetMmioById`].
    3: name string:fuchsia.driver.framework.MAX_RESOURCE_NAME_LENGTH;
};

type Irq = table {
    1: irq uint32;
    /// `ZX_INTERRUPT_MODE_*` flags
    2: mode uint32;

    /// Properties for this interrupt's fragment. Only used in DFv2.
    3: properties
            vector<fuchsia.driver.framework.NodeProperty>:fuchsia.driver.framework.MAX_PROPERTY_COUNT;
    /// Name that can be used to retrieve the irq using
    /// [`fuchsia.hardware.platform.device/GetInterruptByName`].
    /// It is valid for this to be empty, however the resource will only be able
    /// to be retrieved using [`fuchsia.hardware.platform.device/GetInterruptById`].
    4: name string:fuchsia.driver.framework.MAX_RESOURCE_NAME_LENGTH;
};

type Bti = table {
    1: iommu_index uint32;
    2: bti_id uint32;
    /// Name that can be used to retrieve the bti using
    /// [`fuchsia.hardware.platform.device/GetBtiByName`].
    /// It is valid for this to be empty, however the resource will only be able
    /// to be retrieved using [`fuchsia.hardware.platform.device/GetBtiById`].
    3: name string:fuchsia.driver.framework.MAX_RESOURCE_NAME_LENGTH;
};

type Smc = table {
    /// The device is granted the ability to make SMC calls with service call numbers ranging from
    /// service_call_num_base to service_call_num_base + count - 1.
    1: service_call_num_base uint32;
    2: count uint32;
    /// The device has exclusive access to this smc range.
    3: exclusive bool;
    /// Name that can be used to retrieve the smc using
    /// [`fuchsia.hardware.platform.device/GetSmcByName`].
    /// It is valid for this to be empty, however the resource will only be able
    /// to be retrieved using [`fuchsia.hardware.platform.device/GetSmcById`].
    4: name string:fuchsia.driver.framework.MAX_RESOURCE_NAME_LENGTH;
};

/// Device metadata.
type Metadata = table {
    /// Metadata type.
    1: type uint32;
    /// Metadata.
    2: data vector<uint8>:MAX;
};

/// Device metadata to be passed from bootloader via a ZBI record.
type BootMetadata = table {
    /// Metadata type (matches `zbi_header_t.type` for bootloader metadata).
    1: zbi_type uint32;
    /// Matches `zbi_header_t.extra` for bootloader metadata.
    /// Used in cases where bootloader provides multiple metadata records of the same type.
    2: zbi_extra uint32;
};

const MAX_INFO_STRING_LENGTH uint32 = 32;

/// Subset of pdev_board_info_t to be set by the board driver.
type BoardInfo = table {
    /// Board name from the boot image platform ID record,
    /// (or from the BIOS on x86 platforms).
    1: board_name string:MAX_INFO_STRING_LENGTH;
    /// Board specific revision number.
    2: board_revision uint32;
};

type BootloaderInfo = table {
    1: vendor string:MAX_INFO_STRING_LENGTH;
};

const MAX_POWER_CONFIGS uint32 = 32;

type Node = table {
    /// Name of the node.
    1: name string:fuchsia.driver.framework.MAX_NODE_NAME_LENGTH;
    /// `BIND_PLATFORM_DEV_VID`
    2: vid uint32;
    /// `BIND_PLATFORM_DEV_PID`
    3: pid uint32;
    /// `BIND_PLATFORM_DEV_DID`
    4: did uint32;
    /// Instance ID. Contributes to device-name if non-zero.
    /// `BIND_PLATFORM_DEV_INSTANCE_ID`
    5: instance_id uint32;
    /// MMIO regions.
    6: mmio vector<Mmio>:MAX;
    /// Interrupts.
    7: irq vector<Irq>:MAX;
    /// BTIs.
    8: bti vector<Bti>:MAX;
    /// SMC calls.
    9: smc vector<Smc>:MAX;
    /// Metadata
   10: metadata vector<Metadata>:MAX;
    /// Boot metadata (from ZBI items)
   11: boot_metadata vector<BootMetadata>:MAX;

    /// Other node properties beyond BIND_PLATFORM_DEV_VID, BIND_PLATFORM_DEV_PID, and BIND_PLATFORM_DEV_DID.
   12: properties
            vector<fuchsia.driver.framework.NodeProperty>:fuchsia.driver.framework.MAX_PROPERTY_COUNT;
   13: power_config
            vector<fuchsia.hardware.power.PowerElementConfiguration>:MAX_INFO_STRING_LENGTH;
};

/// This is originally from the Banjo fuchsia.hardware.platform.device library,
/// but it is temporarily included here until that is migrated to FIDL.
type TemporaryBoardInfo = struct {
    /// Vendor ID for the board.
    vid uint32;
    /// Product ID for the board.
    pid uint32;
    /// Board name from the boot image platform ID record,
    /// (or from the BIOS on x86 platforms).
    board_name string:32;
    /// Board specific revision number.
    board_revision uint32;
};

closed protocol SysSuspend {
    strict Callback(struct {
        requested_state uint8;
        enable_wake bool;
        suspend_reason uint8;
    }) -> (struct {
        out_status zx.Status;
        out_state uint8;
    });
};

@discoverable
@transport("Driver")
closed protocol PlatformBus {
    /// Adds a new platform device node to the bus, using configuration provided
    /// by |node|. Platform device nodes are created in their own separate
    /// devhosts.
    strict NodeAdd(struct {
        node Node;
    }) -> () error zx.Status;

    /// Adds a device for binding a protocol implementation driver.
    /// These devices are added in the same devhost as the platform bus.
    /// After the driver binds to the device it calls `pbus_register_protocol()`
    /// to register its protocol with the platform bus.
    /// `pbus_protocol_device_add()` blocks until the protocol implementation driver
    /// registers its protocol (or times out).
    /// Extremely deprecated, please do not use this.
    strict ProtocolNodeAdd(struct {
        proto_id uint32;
        node Node;
    }) -> () error zx.Status;

    /// Called by protocol implementation drivers to register their protocol
    /// with the platform bus.
    /// Extremely deprecated, please do not use this.
    strict RegisterProtocol(struct {
        proto_id uint32;
        /// This is the *_protocol_t buffer. In the future we will probably pass
        /// a FIDL client end.
        protocol vector<uint8>:MAX;
    }) -> () error zx.Status;


    /// Board drivers may use this to get information about the board, and to
    /// differentiate between multiple boards that they support.
    strict GetBoardInfo() -> (struct {
        info TemporaryBoardInfo;
    }) error zx.Status;

    /// Board drivers may use this to set information about the board
    /// (like the board revision number).
    /// Platform device drivers can access this via `pdev_get_board_info()`.
    strict SetBoardInfo(struct {
        info BoardInfo;
    }) -> () error zx.Status;
    /// Board drivers may use this to set information about the bootloader.
    strict SetBootloaderInfo(struct {
        info BootloaderInfo;
    }) -> () error zx.Status;

    strict RegisterSysSuspendCallback(resource struct {
        suspend_cb client_end:SysSuspend;
    }) -> () error zx.Status;

    /// Adds a composite node specification that has |node| as one of the
    /// composite node's parents. To accomplish this, this method does a couple
    /// of things. The method adds a platform device node specified by |node| as
    /// a child of the platform bus. Also, a
    /// `fuchsia.driver.framework.ParentSpec` is added to |spec| which matches
    /// the newly added platform device node. Composite bind rules should include
    /// a stanza that matches the properites of |node| in order for the bind
    /// rules to match against the `CompositeNodeSpec`.
    strict AddCompositeNodeSpec(struct {
        node Node;
        spec fuchsia.driver.framework.CompositeNodeSpec;
    }) -> () error zx.Status;
};

service Service {
    platform_bus client_end:PlatformBus;
};
