// 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.

#pragma once

#include <ddk/protocol/platform/bus.h>
#include <fbl/array.h>
#include <fbl/vector.h>

#include "proxy-protocol.h"

namespace platform_bus {

class DeviceResources {
public:
    DeviceResources(uint32_t index)
        : index_(index) {}

    // Initializes this instance from the resources in the provided pbus_dev_t.
    // next_index keeps track of the index to be assigned to the children while inflating the tree.
    zx_status_t Init(const pbus_dev_t* pdev, uint32_t* next_index);
    // Variant of Init() used for initializing the root of the tree.
    zx_status_t Init(const pbus_dev_t* pdev);

    // Returns the total number of devices, including this device and all children.
    size_t DeviceCount() const;
    // Builds a flattened list of all DeviceResources.
    void BuildDeviceIndex(fbl::Vector<const DeviceResources*>* index) const;

    // Returns device ID for this device.
    inline uint32_t index() const { return index_; }

    // Returns the index of the ith child of this device.
    inline uint32_t child_index(uint32_t i) const { return children_[i].index_; }

    // Platform bus resources copied from the pbus_dev_t struct from the board driver.
    inline const pbus_mmio_t& mmio(size_t i) const { return mmios_[i]; }
    inline const pbus_irq_t& irq(size_t i) const { return irqs_[i]; }
    inline const pbus_gpio_t& gpio(size_t i) const { return gpios_[i]; }
    inline const pbus_i2c_channel_t& i2c_channel(size_t i) const { return i2c_channels_[i]; }
    inline const pbus_clk_t& clk(size_t i) const { return clks_[i]; }
    inline const pbus_bti_t& bti(size_t i) const { return btis_[i]; }
    inline const pbus_smc_t& smc(size_t i) const { return smcs_[i]; }
    inline const pbus_metadata_t& metadata(size_t i) const { return metadata_[i]; }
    inline const pbus_boot_metadata_t& boot_metadata(size_t i) const { return boot_metadata_[i]; }

    // Counts for the above resource lists.
    inline size_t mmio_count() const { return mmios_.size(); }
    inline size_t irq_count() const { return irqs_.size(); }
    inline size_t gpio_count() const { return gpios_.size(); }
    inline size_t i2c_channel_count() const { return i2c_channels_.size(); }
    inline size_t clk_count() const { return clks_.size(); }
    inline size_t bti_count() const { return btis_.size(); }
    inline size_t smc_count() const { return smcs_.size(); }
    inline size_t metadata_count() const { return metadata_.size(); }
    inline size_t boot_metadata_count() const { return boot_metadata_.size(); }
    inline size_t child_count() const { return children_.size(); }

private:
    // Index of this DeviceResources instance in PlatformDevice::device_index_.
    const uint32_t index_;

    // Platform bus resources copied from the pbus_dev_t struct from the board driver.
    fbl::Array<pbus_mmio_t> mmios_;
    fbl::Array<pbus_irq_t> irqs_;
    fbl::Array<pbus_gpio_t> gpios_;
    fbl::Array<pbus_i2c_channel_t> i2c_channels_;
    fbl::Array<pbus_clk_t> clks_;
    fbl::Array<pbus_bti_t> btis_;
    fbl::Array<pbus_smc_t> smcs_;
    fbl::Array<pbus_metadata_t> metadata_;
    fbl::Array<pbus_boot_metadata_t> boot_metadata_;

    // Resources for children of this device.
    fbl::Vector<DeviceResources> children_;
};

} // namespace platform_bus
