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