| // 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); |
| |
| 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 MappedPageSize(); |
| uint32_t MappedOobSize(); |
| |
| uint32_t block_offset_; |
| uint32_t page_multiplier_; |
| uint32_t max_bad_blocks_; |
| std::unique_ptr<mtd::NandInterface> interface_; |
| }; |
| |
| } // namespace ftl_mtd |