blob: 850af0faf30ebba55aa8a4bd95be256d79199f29 [file] [log] [blame]
// Copyright 2019 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 <memory>
#include <set>
#include <string>
#include <vector>
#include <fbl/macros.h>
#include <lib/ftl/ndm-driver.h>
#include <zircon/types.h>
#include <lib/mtd/nand-interface.h>
namespace ftl_mtd {
constexpr uint32_t kMinimumOobSize = 16;
class NandVolumeDriver : public ftl::NdmBaseDriver {
public:
// Creates an instance of NandVolumeDriver.
// |max_bad_blocks| should be less than the number of blocks exposed by |interface|.
static zx_status_t Create(uint32_t block_offset, uint32_t max_bad_blocks,
std::unique_ptr<mtd::NandInterface> interface,
std::unique_ptr<NandVolumeDriver>* out);
virtual ~NandVolumeDriver() {}
// NdmBaseDriver interface:
const char* Init();
const char* Attach(const ftl::Volume* ftl_volume);
bool Detach();
int NandWrite(uint32_t start_page, uint32_t page_count, const void* page_buffer,
const void* oob_buffer);
int NandRead(uint32_t start_page, uint32_t page_count, void* page_buffer, void* oob_buffer);
int NandErase(uint32_t page_num);
int IsBadBlock(uint32_t page_num);
bool IsEmptyPage(uint32_t page_num, const uint8_t* page_buffer, const uint8_t* oob_buffer);
uint32_t PageSize() final;
uint8_t SpareSize() final;
DISALLOW_COPY_ASSIGN_AND_MOVE(NandVolumeDriver);
private:
NandVolumeDriver(uint32_t byte_offset, uint32_t max_bad_blocks, uint32_t page_multiplier,
std::unique_ptr<mtd::NandInterface> interface);
zx_status_t ReadPageAndOob(uint32_t byte_offset, void* page_buffer, void* oob_buffer);
zx_status_t GetPageIndices(uint32_t mapped_page, uint32_t mapped_page_count, uint32_t* start_page,
uint32_t* end_page);
uint32_t GetBlockOffsetForPage(uint32_t real_page);
uint32_t GetByteOffsetForPage(uint32_t real_page);
uint32_t ByteOffset();
uint32_t block_offset_;
uint32_t page_multiplier_;
uint32_t max_bad_blocks_;
std::unique_ptr<mtd::NandInterface> interface_;
};
} // namespace ftl_mtd