blob: 65a139ef2b4a4b822ae2af95b0a24edf5d515fe9 [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.
#ifndef ZIRCON_SYSTEM_DEV_MISC_GOLDFISH_INSTANCE_H_
#define ZIRCON_SYSTEM_DEV_MISC_GOLDFISH_INSTANCE_H_
#include <ddk/device.h>
#include <ddk/io-buffer.h>
#include <ddktl/device.h>
#include <ddktl/protocol/goldfish/pipe.h>
#include <lib/zx/event.h>
#include <lib/zx/pmt.h>
#include <zircon/types.h>
namespace goldfish {
class Instance;
using InstanceType = ddk::Device<Instance, ddk::Readable, ddk::Writable,
ddk::Messageable, ddk::Closable>;
// This class implements a pipe instance device. By opening the pipe device,
// an instance of this class will be created to service a new channel
// to the virtual device.
class Instance : public InstanceType {
public:
explicit Instance(zx_device_t* parent);
~Instance();
zx_status_t Bind();
// FIDL interface
zx_status_t FidlSetBufferSize(uint64_t size, fidl_txn_t* txn);
zx_status_t FidlSetEvent(zx_handle_t event_handle);
zx_status_t FidlGetBuffer(fidl_txn_t* txn);
zx_status_t FidlRead(size_t count, zx_off_t offset, fidl_txn_t* txn);
zx_status_t FidlWrite(size_t count, zx_off_t offset, fidl_txn_t* txn);
// Device protocol implementation.
zx_status_t DdkRead(void* buf, size_t len, zx_off_t off, size_t* actual);
zx_status_t DdkWrite(const void* buf, size_t buf_len, zx_off_t off,
size_t* actual);
zx_status_t DdkMessage(fidl_msg_t* msg, fidl_txn_t* txn);
zx_status_t DdkClose(uint32_t flags);
void DdkRelease();
private:
static void OnSignal(void* ctx, int32_t flags);
zx_status_t SetBufferSize(size_t size);
zx_status_t Read(zx_paddr_t paddr, size_t count, size_t* actual);
zx_status_t Write(zx_paddr_t paddr, size_t count, size_t* actual);
zx_status_t Transfer(int32_t cmd, int32_t wake_cmd, zx_signals_t state_clr,
zx_signals_t dev_state_clr, zx_paddr_t paddr,
size_t count, size_t* actual);
ddk::GoldfishPipeProtocolClient pipe_;
int32_t id_ = 0;
zx::bti bti_;
ddk::IoBuffer cmd_buffer_;
struct {
zx::vmo vmo;
zx::pmt pmt;
size_t size;
zx_paddr_t phys;
zx::event event;
} buffer_ = {};
DISALLOW_COPY_ASSIGN_AND_MOVE(Instance);
};
} // namespace goldfish
#endif // ZIRCON_SYSTEM_DEV_MISC_GOLDFISH_INSTANCE_H_