blob: dd766084a78199e972ef3374d52f70fe76336c19 [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.
#pragma once
#include <memory>
#include <ddk/protocol/nand.h>
#include <fbl/macros.h>
#include <lib/sync/completion.h>
#include <lib/fzl/owned-vmo-mapper.h>
#include "oob_doubler.h"
namespace ftl {
// Wrapper for nand Queue() protocol operations.
class NandOperation {
public:
explicit NandOperation(size_t op_size) : op_size_(op_size) {}
~NandOperation() {}
// Creates a vmo and sets the handle on the nand_operation_t.
zx_status_t SetDataVmo(size_t num_bytes);
zx_status_t SetOobVmo(size_t num_bytes);
nand_operation_t* GetOperation();
// Executes the operation and returns the final operation status.
zx_status_t Execute(OobDoubler* parent);
// Accessors for the memory represented by the operation's vmo.
size_t buffer_size() const { return mapper_.size(); }
char* buffer() const { return reinterpret_cast<char*>(mapper_.start()); }
DISALLOW_COPY_ASSIGN_AND_MOVE(NandOperation);
private:
static void OnCompletion(void* cookie, zx_status_t status, nand_operation_t* op);
zx_status_t GetVmo(size_t num_bytes);
void CreateOperation();
sync_completion_t event_;
fzl::OwnedVmoMapper mapper_;
size_t op_size_;
zx_status_t status_ = ZX_ERR_INTERNAL;
std::unique_ptr<char[]> raw_buffer_;
};
} // namespace ftl.