blob: 8379019e0905404a2680a9d2ec3cfae537395a94 [file] [log] [blame]
// Copyright 2016 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_DRIVER_HOST_H_
#define SRC_DEVICES_BIN_DRIVER_HOST_DRIVER_HOST_H_
#include <fidl/fuchsia.device.manager/cpp/wire.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/ddk/binding.h>
#include <lib/ddk/device.h>
#include <lib/ddk/driver.h>
#include <lib/zircon-internal/thread_annotations.h>
#include <lib/zx/channel.h>
#include <lib/zx/status.h>
#include <stdint.h>
#include <threads.h>
#include <zircon/compiler.h>
#include <zircon/fidl.h>
#include <zircon/types.h>
#include <memory>
#include <ddktl/fidl.h>
#include <fbl/intrusive_double_list.h>
#include <fbl/ref_counted.h>
#include <fbl/ref_ptr.h>
#include <fbl/string.h>
#include "defaults.h"
#include "driver_host_context.h"
#include "lock.h"
#include "zx_device.h"
// Nothing outside of devmgr/{devmgr,driver_host,rpc-device}.c
// should be calling internal::*() APIs, as this could
// violate the internal locking design.
// Safe external APIs are in device.h and device_internal.h
namespace internal {
// Get the DriverHostContext that should be used by all external API methods
DriverHostContext* ContextForApi();
void RegisterContextForApi(DriverHostContext* context);
using StatusOrConn = zx::status<std::unique_ptr<DeviceControllerConnection>>;
class DriverHostControllerConnection
: public fidl::WireServer<fuchsia_device_manager::DriverHostController> {
public:
// |ctx| must outlive this connection
explicit DriverHostControllerConnection(DriverHostContext* ctx) : driver_host_context_(ctx) {}
static void Bind(std::unique_ptr<DriverHostControllerConnection> conn,
fidl::ServerEnd<fuchsia_device_manager::DriverHostController> request,
async_dispatcher_t* dispatcher);
private:
void CreateDevice(CreateDeviceRequestView request,
CreateDeviceCompleter::Sync& completer) override;
void Restart(RestartRequestView request, RestartCompleter::Sync& completer) override;
StatusOrConn CreateNewProxyDevice(CreateDeviceRequestView& request);
StatusOrConn CreateProxyDevice(CreateDeviceRequestView& request);
StatusOrConn CreateStubDevice(CreateDeviceRequestView& request);
StatusOrConn CreateCompositeDevice(CreateDeviceRequestView& request);
DriverHostContext* const driver_host_context_;
};
} // namespace internal
// Construct a string describing the path of |dev| relative to its most
// distant ancestor in this driver_host.
const char* mkdevpath(const zx_device_t& dev, char* path, size_t max);
#endif // SRC_DEVICES_BIN_DRIVER_HOST_DRIVER_HOST_H_