// 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() {}

    zx_status_t Init(const pbus_dev_t* pdev);

    // 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_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 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(); }

private:
    // 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_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_;
};

} // namespace platform_bus
