blob: b3028a60a5fb65770344f590ab9f0f5e412d464b [file] [log] [blame]
// 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.
#include "device-resources.h"
#include <utility>
namespace {
template <typename T>
bool CopyResources(size_t in_count, const T* in_list, fbl::Array<T>* out) {
if (!in_count) {
return true;
}
fbl::AllocChecker ac;
out->reset(new (&ac) T[in_count], in_count);
if (!ac.check()) {
return false;
}
memcpy(out->begin(), in_list, in_count * sizeof(T));
return true;
}
} // namespace
namespace platform_bus {
zx_status_t DeviceResources::Init(const pbus_dev_t* pdev) {
if (!CopyResources(pdev->mmio_count, pdev->mmio_list, &mmios_) ||
!CopyResources(pdev->irq_count, pdev->irq_list, &irqs_) ||
!CopyResources(pdev->gpio_count, pdev->gpio_list, &gpios_) ||
!CopyResources(pdev->clk_count, pdev->clk_list, &clks_) ||
!CopyResources(pdev->bti_count, pdev->bti_list, &btis_) ||
!CopyResources(pdev->smc_count, pdev->smc_list, &smcs_) ||
!CopyResources(pdev->metadata_count, pdev->metadata_list, &metadata_) ||
!CopyResources(pdev->boot_metadata_count, pdev->boot_metadata_list, &boot_metadata_)) {
return ZX_ERR_NO_MEMORY;
}
return ZX_OK;
}
} // namespace platform_bus