blob: 71a61a0d4e8e9fdaac7a39f3c1d1e6a65913c268 [file] [log] [blame]
// Copyright 2022 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 FUCHSIA_SDK_EXAMPLES_CC_QEMU_EDU_H_
#define FUCHSIA_SDK_EXAMPLES_CC_QEMU_EDU_H_
#include <fidl/fuchsia.device.fs/cpp/wire.h>
#include <fidl/fuchsia.driver.framework/cpp/wire.h>
#include <fidl/fuchsia.hardware.pci/cpp/wire.h>
#include <fidl/fuchsia.hardware.qemuedu/cpp/wire.h>
#include <lib/async/dispatcher.h>
#include <lib/driver2/namespace.h>
#include <lib/driver2/record_cpp.h>
#include <lib/driver2/structured_logger.h>
#include <lib/fdf/cpp/dispatcher.h>
#include <lib/mmio/mmio.h>
#include <lib/sys/component/llcpp/outgoing_directory.h>
#include <lib/zx/interrupt.h>
#include <lib/zx/status.h>
#include <memory>
#include <optional>
namespace qemu_edu {
class QemuEduDriver
: public fidl::WireServer<fuchsia_hardware_qemuedu::Device> {
public:
QemuEduDriver(async_dispatcher_t* dispatcher,
fidl::WireSharedClient<fuchsia_driver_framework::Node> node,
driver::Namespace ns, driver::Logger logger)
: outgoing_(component::OutgoingDirectory::Create(dispatcher)),
node_(std::move(node)),
ns_(std::move(ns)),
logger_(std::move(logger)) {}
virtual ~QemuEduDriver() = default;
static constexpr const char* Name() { return "qemu-edu"; }
static zx::status<std::unique_ptr<QemuEduDriver>> Start(
fuchsia_driver_framework::wire::DriverStartArgs& start_args,
fdf::UnownedDispatcher dispatcher,
fidl::WireSharedClient<fuchsia_driver_framework::Node> node,
driver::Namespace ns, driver::Logger logger);
// fuchsia.hardware.qemuedu/Device implementation.
void ComputeFactorial(ComputeFactorialRequestView request,
ComputeFactorialCompleter::Sync& completer);
void LivenessCheck(LivenessCheckRequestView request,
LivenessCheckCompleter::Sync& completer);
private:
zx::status<> MapInterruptAndMmio(
fidl::ClientEnd<fuchsia_hardware_pci::Device> pci);
zx::status<> Run(async_dispatcher* dispatcher,
fidl::ServerEnd<fuchsia_io::Directory> outgoing_dir);
component::OutgoingDirectory outgoing_;
fidl::WireSharedClient<fuchsia_driver_framework::Node> node_;
driver::Namespace ns_;
driver::Logger logger_;
fidl::WireClient<fuchsia_device_fs::Exporter> exporter_;
std::optional<fdf::MmioBuffer> mmio_;
zx::interrupt irq_;
uint32_t major_version_ = 0;
uint32_t minor_version_ = 0;
};
} // namespace qemu_edu
#endif // FUCHSIA_SDK_EXAMPLES_CC_QEMU_EDU_H_