blob: c53259473a77136a6ca67eec60b52d58e93c4a4c [file] [log] [blame]
// Copyright 2020 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 "src/storage/lib/paver/as370.h"
#include <gpt/gpt.h>
#include "src/storage/lib/paver/pave-logging.h"
#include "src/storage/lib/paver/utils.h"
namespace paver {
zx::status<std::unique_ptr<DevicePartitioner>> As370Partitioner::Initialize(
fbl::unique_fd devfs_root) {
zx::status<> status = IsBoard(devfs_root, "visalia");
if (status.is_error() && (status = IsBoard(devfs_root, "as370")).is_error()) {
return status.take_error();
}
LOG("Successfully initialized As370Partitioner Device Partitioner\n");
std::unique_ptr<SkipBlockDevicePartitioner> skip_block(
new SkipBlockDevicePartitioner(std::move(devfs_root)));
return zx::ok(new As370Partitioner(std::move(skip_block)));
}
bool As370Partitioner::SupportsPartition(const PartitionSpec& spec) const {
const PartitionSpec supported_specs[] = {
PartitionSpec(paver::Partition::kBootloaderA), PartitionSpec(paver::Partition::kZirconA),
PartitionSpec(paver::Partition::kZirconB), PartitionSpec(paver::Partition::kZirconR),
PartitionSpec(paver::Partition::kFuchsiaVolumeManager)};
for (const auto& supported : supported_specs) {
if (SpecMatches(spec, supported)) {
return true;
}
}
return false;
}
zx::status<std::unique_ptr<PartitionClient>> As370Partitioner::AddPartition(
const PartitionSpec& spec) const {
ERROR("Cannot add partitions to an as370.\n");
return zx::error(ZX_ERR_NOT_SUPPORTED);
}
zx::status<std::unique_ptr<PartitionClient>> As370Partitioner::FindPartition(
const PartitionSpec& spec) const {
if (!SupportsPartition(spec)) {
ERROR("Unsupported partition %s\n", spec.ToString().c_str());
return zx::error(ZX_ERR_NOT_SUPPORTED);
}
switch (spec.partition) {
case Partition::kBootloaderA:
return skip_block_->FindPartition(GUID_BOOTLOADER_VALUE);
case Partition::kZirconA:
return skip_block_->FindPartition(GUID_ZIRCON_A_VALUE);
case Partition::kZirconB:
return skip_block_->FindPartition(GUID_ZIRCON_B_VALUE);
case Partition::kZirconR:
return skip_block_->FindPartition(GUID_ZIRCON_R_VALUE);
case Partition::kFuchsiaVolumeManager:
return skip_block_->FindFvmPartition();
default:
ERROR("partition_type is invalid!\n");
return zx::error(ZX_ERR_NOT_SUPPORTED);
}
}
zx::status<> As370Partitioner::WipeFvm() const { return skip_block_->WipeFvm(); }
zx::status<> As370Partitioner::InitPartitionTables() const {
return zx::error(ZX_ERR_NOT_SUPPORTED);
}
zx::status<> As370Partitioner::WipePartitionTables() const {
return zx::error(ZX_ERR_NOT_SUPPORTED);
}
zx::status<> As370Partitioner::ValidatePayload(const PartitionSpec& spec,
fbl::Span<const uint8_t> data) const {
if (!SupportsPartition(spec)) {
ERROR("Unsupported partition %s\n", spec.ToString().c_str());
return zx::error(ZX_ERR_NOT_SUPPORTED);
}
return zx::ok();
}
zx::status<std::unique_ptr<DevicePartitioner>> As370PartitionerFactory::New(
fbl::unique_fd devfs_root, const zx::channel& svc_root, Arch arch,
std::shared_ptr<Context> context, const fbl::unique_fd& block_device) {
return As370Partitioner::Initialize(std::move(devfs_root));
}
} // namespace paver