blob: 18b417a3e180b5da9e0517edd4e9e6e9e863ce1f [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.
#ifndef SRC_STORAGE_NAND_DRIVERS_SKIP_BLOCK_LOGICAL_TO_PHYSICAL_MAP_H_
#define SRC_STORAGE_NAND_DRIVERS_SKIP_BLOCK_LOGICAL_TO_PHYSICAL_MAP_H_
#include <zircon/types.h>
#include <utility>
#include <fbl/array.h>
#include <fbl/macros.h>
namespace nand {
// Logical block to physical block mapping. Provides bad block skip
// functionality. If more than one copy is required, the logical space for each
// copy begins at the physical block |block_count_| / |copy|, and bad blocks are
// skipped from there.
class LogicalToPhysicalMap {
public:
LogicalToPhysicalMap() : copies_(0), block_count_(0) {}
// Constructor.
LogicalToPhysicalMap(uint32_t copies, uint32_t block_count, fbl::Array<uint32_t> bad_blocks);
// Move constructor.
LogicalToPhysicalMap(LogicalToPhysicalMap&& other)
: copies_(other.copies_),
block_count_(other.block_count_),
bad_blocks_(std::move(other.bad_blocks_)) {}
// Move assignment operator.
LogicalToPhysicalMap& operator=(LogicalToPhysicalMap&& other) {
if (this != &other) {
copies_ = other.copies_;
block_count_ = other.block_count_;
bad_blocks_ = std::move(other.bad_blocks_);
}
return *this;
}
zx_status_t GetPhysical(uint32_t copy, uint32_t block, uint32_t* physical_block) const;
uint32_t AvailableBlockCount(uint32_t copy) const;
private:
DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(LogicalToPhysicalMap);
uint32_t copies_;
uint32_t block_count_;
fbl::Array<uint32_t> bad_blocks_;
};
} // namespace nand
#endif // SRC_STORAGE_NAND_DRIVERS_SKIP_BLOCK_LOGICAL_TO_PHYSICAL_MAP_H_