blob: 3be997c970746878edac141f81c2576262e98101 [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_BIN_DRIVER_HOST_DEVFS_VNODE_H_
#define SRC_DEVICES_BIN_DRIVER_HOST_DEVFS_VNODE_H_
#include <fidl/fuchsia.device/cpp/wire.h>
#include <lib/fidl/llcpp/transaction.h>
#include <variant>
#include <ddktl/fidl.h>
#include "src/lib/storage/vfs/cpp/vnode.h"
#include "zx_device.h"
class DevfsVnode : public fs::Vnode, public fidl::WireServer<fuchsia_device::Controller> {
public:
explicit DevfsVnode(fbl::RefPtr<zx_device> dev) : dev_(std::move(dev)) {}
// fs::Vnode methods
zx_status_t Read(void* data, size_t len, size_t off, size_t* out_actual) override;
zx_status_t Write(const void* data, size_t len, size_t off, size_t* out_actual) override;
zx_status_t GetAttributes(fs::VnodeAttributes* a) override;
fs::VnodeProtocolSet GetProtocols() const override;
zx_status_t GetNodeInfoForProtocol(fs::VnodeProtocol protocol, fs::Rights rights,
fs::VnodeRepresentation* info) override;
void HandleFsSpecificMessage(fidl::IncomingMessage& msg, fidl::Transaction* txn) override;
// fidl::WireServer<fuchsia_device::Controller> methods
void Bind(BindRequestView request, BindCompleter::Sync& _completer) override;
void Rebind(RebindRequestView request, RebindCompleter::Sync& _completer) override;
void UnbindChildren(UnbindChildrenRequestView request,
UnbindChildrenCompleter::Sync& completer) override;
void ScheduleUnbind(ScheduleUnbindRequestView request,
ScheduleUnbindCompleter::Sync& _completer) override;
void GetTopologicalPath(GetTopologicalPathRequestView request,
GetTopologicalPathCompleter::Sync& _completer) override;
void GetMinDriverLogSeverity(GetMinDriverLogSeverityRequestView request,
GetMinDriverLogSeverityCompleter::Sync& _completer) override;
void GetCurrentPerformanceState(GetCurrentPerformanceStateRequestView request,
GetCurrentPerformanceStateCompleter::Sync& completer) override;
void SetMinDriverLogSeverity(SetMinDriverLogSeverityRequestView request,
SetMinDriverLogSeverityCompleter::Sync& _completer) override;
void SetPerformanceState(SetPerformanceStateRequestView request,
SetPerformanceStateCompleter::Sync& _completer) override;
private:
// Vnode protected implementation:
zx_status_t OpenNode(fs::Vnode::ValidatedOptions options,
fbl::RefPtr<Vnode>* out_redirect) override;
zx_status_t CloseNode() override;
fbl::RefPtr<zx_device> dev_;
};
// Utilties for converting our fidl::Transactions to something usable by the driver C ABI
ddk::internal::Transaction MakeDdkInternalTransaction(fidl::Transaction* txn);
ddk::internal::Transaction MakeDdkInternalTransaction(std::unique_ptr<fidl::Transaction> txn);
// This returns a variant because, as an optimization, we skip performing allocations when
// synchronously processing requests. If a request has ownership taken over using
// device_fidl_transaction_take_ownership, we will perform an allocation to extend the lifetime
// of the transaction. In that case, we'll have a unique_ptr.
//
// This operation will modify its input, invalidating it.
std::variant<fidl::Transaction*, std::unique_ptr<fidl::Transaction>> FromDdkInternalTransaction(
ddk::internal::Transaction* txn);
#endif // SRC_DEVICES_BIN_DRIVER_HOST_DEVFS_VNODE_H_