blob: 2251f73e486118b4d3f59b62f992b26ed4d9be2a [file] [log] [blame]
// 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.
#ifndef SRC_DEVICES_BLOCK_DRIVERS_BLOCK_VERITY_DEVICE_H_
#define SRC_DEVICES_BLOCK_DRIVERS_BLOCK_VERITY_DEVICE_H_
#include <fuchsia/hardware/block/cpp/banjo.h>
#include <lib/ddk/device.h>
#include <ddktl/device.h>
#include <fbl/mutex.h>
#include "src/devices/block/drivers/block-verity/device-info.h"
namespace block_verity {
// See ddk::Device in ddktl/device.h
class Device;
using DeviceType = ddk::Device<Device, ddk::GetProtocolable, ddk::GetSizable, ddk::Unbindable>;
class Device : public DeviceType, public ddk::BlockImplProtocol<Device, ddk::base_protocol> {
public:
Device(zx_device_t* parent, DeviceInfo&& info);
// Disallow copy, assign, and move.
Device(const Device&) = delete;
Device(Device&&) = delete;
Device& operator=(const Device&) = delete;
Device& operator=(Device&&) = delete;
~Device() = default;
uint64_t op_size() { return info_.op_size; }
// ddk::Device methods; see ddktl/device.h
zx_status_t DdkGetProtocol(uint32_t proto_id, void* out);
zx_off_t DdkGetSize();
void DdkUnbind(ddk::UnbindTxn txn);
void DdkRelease();
// ddk::BlockProtocol methods; see fuchsia/hardware/block/cpp/banjo.h
void BlockImplQuery(block_info_t* out_info, size_t* out_op_size);
void BlockImplQueue(block_op_t* block_op, block_impl_queue_callback completion_cb, void* cookie)
__TA_EXCLUDES(mtx_);
// The callback that we give to the underlying block device when we queue
// operations against it. It simply translates block offsets back and completes the
// matched block requests.
static void BlockCallback(void* cookie, zx_status_t status, block_op_t* block);
// Completes the block operation by calling the appropriate callback with the
// appropriate status.
void BlockComplete(block_op_t* block, zx_status_t status);
private:
fbl::Mutex mtx_;
// Device configuration, as provided by the DeviceManager at creation. Its
// constness allows it to be used without holding the lock.
const DeviceInfo info_;
};
} // namespace block_verity
#endif // SRC_DEVICES_BLOCK_DRIVERS_BLOCK_VERITY_DEVICE_H_