blob: 0ff25e2a3bc90cf9f7672c8129d02413d38495c9 [file]
// Copyright 2018 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.
// WARNING: THIS FILE IS MACHINE GENERATED. DO NOT EDIT.
// Generated from the banjo.examples.api banjo file
#pragma once
#include <banjo/examples/api/c/banjo.h>
#include <ddktl/device-internal.h>
#include <lib/ddk/device.h>
#include <lib/ddk/driver.h>
#include <lib/zx/handle.h>
#include <zircon/assert.h>
#include <zircon/compiler.h>
#include <zircon/types.h>
#include "banjo-internal.h"
// DDK api-protocol support
//
// :: Proxies ::
//
// ddk::ApiProtocolClient is a simple wrapper around
// api_protocol_t. It does not own the pointers passed to it.
//
// :: Mixins ::
//
// ddk::ApiProtocol is a mixin class that simplifies writing DDK drivers
// that implement the api protocol. It doesn't set the base protocol.
//
// :: Examples ::
//
// // A driver that implements a ZX_PROTOCOL_API device.
// class ApiDevice;
// using ApiDeviceType = ddk::Device<ApiDevice, /* ddk mixins */>;
//
// class ApiDevice : public ApiDeviceType,
// public ddk::ApiProtocol<ApiDevice> {
// public:
// ApiDevice(zx_device_t* parent)
// : ApiDeviceType(parent) {}
//
// zx_status_t Apibool(zx::handle handle, bool data);
//
// zx_status_t Apiint8(zx::handle handle, int8_t data);
//
// zx_status_t Apiint16(zx::handle handle, int16_t data);
//
// zx_status_t Apiint32(zx::handle handle, int32_t data);
//
// zx_status_t Apiint64(zx::handle handle, int64_t data);
//
// zx_status_t Apiuint8(zx::handle handle, uint8_t data);
//
// zx_status_t Apiuint16(zx::handle handle, uint16_t data);
//
// zx_status_t Apiuint32(zx::handle handle, uint32_t data);
//
// zx_status_t Apiuint64(zx::handle handle, uint64_t data);
//
// zx_status_t Apifloat32(zx::handle handle, float data);
//
// zx_status_t Apifloat64(zx::handle handle, double data);
//
// zx_status_t Apiduration(zx::handle handle, zx_duration_t data);
//
// zx_status_t Apikoid(zx::handle handle, zx_koid_t data);
//
// zx_status_t Apipaddr(zx::handle handle, zx_paddr_t data);
//
// zx_status_t Apisignals(zx::handle handle, zx_signals_t data);
//
// zx_status_t Apitime(zx::handle handle, zx_time_t data);
//
// zx_status_t Apivaddr(zx::handle handle, zx_vaddr_t data);
//
// zx_status_t Apioutput_bool(zx::handle handle, bool* out_result);
//
// zx_status_t Apioutput_int8(zx::handle handle, int8_t* out_result);
//
// zx_status_t Apioutput_int16(zx::handle handle, int16_t* out_result);
//
// zx_status_t Apioutput_int32(zx::handle handle, int32_t* out_result);
//
// zx_status_t Apioutput_int64(zx::handle handle, int64_t* out_result);
//
// zx_status_t Apioutput_uint8(zx::handle handle, uint8_t* out_result);
//
// zx_status_t Apioutput_uint16(zx::handle handle, uint16_t* out_result);
//
// zx_status_t Apioutput_uint32(zx::handle handle, uint32_t* out_result);
//
// zx_status_t Apioutput_uint64(zx::handle handle, uint64_t* out_result);
//
// zx_status_t Apioutput_float32(zx::handle handle, float* out_result);
//
// zx_status_t Apioutput_float64(zx::handle handle, double* out_result);
//
// zx_status_t Apioutput_duration(zx::handle handle, zx_duration_t* out_result);
//
// zx_status_t Apioutput_koid(zx::handle handle, zx_koid_t* out_result);
//
// zx_status_t Apioutput_paddr(zx::handle handle, zx_paddr_t* out_result);
//
// zx_status_t Apioutput_signals(zx::handle handle, zx_signals_t* out_result);
//
// zx_status_t Apioutput_time(zx::handle handle, zx_time_t* out_result);
//
// zx_status_t Apioutput_vaddr(zx::handle handle, zx_vaddr_t* out_result);
//
// void Apireturn_void(zx::handle handle);
//
// zx_status_t Apireturn_status(zx::handle handle);
//
// zx_ticks_t Apireturn_ticks(zx::handle handle);
//
// zx_time_t Apireturn_time(zx::handle handle);
//
// uint32_t Apireturn_uint32(zx::handle handle);
//
// uint64_t Apireturn_uint64(zx::handle handle);
//
// ...
// };
namespace ddk {
template <typename D, typename Base = internal::base_mixin>
class ApiProtocol : public Base {
public:
ApiProtocol() {
internal::CheckApiProtocolSubclass<D>();
api_protocol_ops_.bool = Apibool;
api_protocol_ops_.int8 = Apiint8;
api_protocol_ops_.int16 = Apiint16;
api_protocol_ops_.int32 = Apiint32;
api_protocol_ops_.int64 = Apiint64;
api_protocol_ops_.uint8 = Apiuint8;
api_protocol_ops_.uint16 = Apiuint16;
api_protocol_ops_.uint32 = Apiuint32;
api_protocol_ops_.uint64 = Apiuint64;
api_protocol_ops_.float32 = Apifloat32;
api_protocol_ops_.float64 = Apifloat64;
api_protocol_ops_.duration = Apiduration;
api_protocol_ops_.koid = Apikoid;
api_protocol_ops_.paddr = Apipaddr;
api_protocol_ops_.signals = Apisignals;
api_protocol_ops_.time = Apitime;
api_protocol_ops_.vaddr = Apivaddr;
api_protocol_ops_.output_bool = Apioutput_bool;
api_protocol_ops_.output_int8 = Apioutput_int8;
api_protocol_ops_.output_int16 = Apioutput_int16;
api_protocol_ops_.output_int32 = Apioutput_int32;
api_protocol_ops_.output_int64 = Apioutput_int64;
api_protocol_ops_.output_uint8 = Apioutput_uint8;
api_protocol_ops_.output_uint16 = Apioutput_uint16;
api_protocol_ops_.output_uint32 = Apioutput_uint32;
api_protocol_ops_.output_uint64 = Apioutput_uint64;
api_protocol_ops_.output_float32 = Apioutput_float32;
api_protocol_ops_.output_float64 = Apioutput_float64;
api_protocol_ops_.output_duration = Apioutput_duration;
api_protocol_ops_.output_koid = Apioutput_koid;
api_protocol_ops_.output_paddr = Apioutput_paddr;
api_protocol_ops_.output_signals = Apioutput_signals;
api_protocol_ops_.output_time = Apioutput_time;
api_protocol_ops_.output_vaddr = Apioutput_vaddr;
api_protocol_ops_.return_void = Apireturn_void;
api_protocol_ops_.return_status = Apireturn_status;
api_protocol_ops_.return_ticks = Apireturn_ticks;
api_protocol_ops_.return_time = Apireturn_time;
api_protocol_ops_.return_uint32 = Apireturn_uint32;
api_protocol_ops_.return_uint64 = Apireturn_uint64;
if constexpr (internal::is_base_proto<Base>::value) {
auto dev = static_cast<D*>(this);
// Can only inherit from one base_protocol implementation.
ZX_ASSERT(dev->ddk_proto_id_ == 0);
dev->ddk_proto_id_ = ZX_PROTOCOL_API;
dev->ddk_proto_ops_ = &api_protocol_ops_;
}
}
protected:
api_protocol_ops_t api_protocol_ops_ = {};
private:
static zx_status_t Apibool(void* ctx, zx_handle_t handle, bool data) {
auto ret = static_cast<D*>(ctx)->Apibool(zx::handle(handle), data);
return ret;
}
static zx_status_t Apiint8(void* ctx, zx_handle_t handle, int8_t data) {
auto ret = static_cast<D*>(ctx)->Apiint8(zx::handle(handle), data);
return ret;
}
static zx_status_t Apiint16(void* ctx, zx_handle_t handle, int16_t data) {
auto ret = static_cast<D*>(ctx)->Apiint16(zx::handle(handle), data);
return ret;
}
static zx_status_t Apiint32(void* ctx, zx_handle_t handle, int32_t data) {
auto ret = static_cast<D*>(ctx)->Apiint32(zx::handle(handle), data);
return ret;
}
static zx_status_t Apiint64(void* ctx, zx_handle_t handle, int64_t data) {
auto ret = static_cast<D*>(ctx)->Apiint64(zx::handle(handle), data);
return ret;
}
static zx_status_t Apiuint8(void* ctx, zx_handle_t handle, uint8_t data) {
auto ret = static_cast<D*>(ctx)->Apiuint8(zx::handle(handle), data);
return ret;
}
static zx_status_t Apiuint16(void* ctx, zx_handle_t handle, uint16_t data) {
auto ret = static_cast<D*>(ctx)->Apiuint16(zx::handle(handle), data);
return ret;
}
static zx_status_t Apiuint32(void* ctx, zx_handle_t handle, uint32_t data) {
auto ret = static_cast<D*>(ctx)->Apiuint32(zx::handle(handle), data);
return ret;
}
static zx_status_t Apiuint64(void* ctx, zx_handle_t handle, uint64_t data) {
auto ret = static_cast<D*>(ctx)->Apiuint64(zx::handle(handle), data);
return ret;
}
static zx_status_t Apifloat32(void* ctx, zx_handle_t handle, float data) {
auto ret = static_cast<D*>(ctx)->Apifloat32(zx::handle(handle), data);
return ret;
}
static zx_status_t Apifloat64(void* ctx, zx_handle_t handle, double data) {
auto ret = static_cast<D*>(ctx)->Apifloat64(zx::handle(handle), data);
return ret;
}
static zx_status_t Apiduration(void* ctx, zx_handle_t handle, zx_duration_t data) {
auto ret = static_cast<D*>(ctx)->Apiduration(zx::handle(handle), data);
return ret;
}
static zx_status_t Apikoid(void* ctx, zx_handle_t handle, zx_koid_t data) {
auto ret = static_cast<D*>(ctx)->Apikoid(zx::handle(handle), data);
return ret;
}
static zx_status_t Apipaddr(void* ctx, zx_handle_t handle, zx_paddr_t data) {
auto ret = static_cast<D*>(ctx)->Apipaddr(zx::handle(handle), data);
return ret;
}
static zx_status_t Apisignals(void* ctx, zx_handle_t handle, zx_signals_t data) {
auto ret = static_cast<D*>(ctx)->Apisignals(zx::handle(handle), data);
return ret;
}
static zx_status_t Apitime(void* ctx, zx_handle_t handle, zx_time_t data) {
auto ret = static_cast<D*>(ctx)->Apitime(zx::handle(handle), data);
return ret;
}
static zx_status_t Apivaddr(void* ctx, zx_handle_t handle, zx_vaddr_t data) {
auto ret = static_cast<D*>(ctx)->Apivaddr(zx::handle(handle), data);
return ret;
}
static zx_status_t Apioutput_bool(void* ctx, zx_handle_t handle, bool* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_bool(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_int8(void* ctx, zx_handle_t handle, int8_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_int8(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_int16(void* ctx, zx_handle_t handle, int16_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_int16(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_int32(void* ctx, zx_handle_t handle, int32_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_int32(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_int64(void* ctx, zx_handle_t handle, int64_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_int64(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_uint8(void* ctx, zx_handle_t handle, uint8_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_uint8(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_uint16(void* ctx, zx_handle_t handle, uint16_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_uint16(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_uint32(void* ctx, zx_handle_t handle, uint32_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_uint32(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_uint64(void* ctx, zx_handle_t handle, uint64_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_uint64(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_float32(void* ctx, zx_handle_t handle, float* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_float32(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_float64(void* ctx, zx_handle_t handle, double* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_float64(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_duration(void* ctx, zx_handle_t handle, zx_duration_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_duration(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_koid(void* ctx, zx_handle_t handle, zx_koid_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_koid(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_paddr(void* ctx, zx_handle_t handle, zx_paddr_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_paddr(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_signals(void* ctx, zx_handle_t handle, zx_signals_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_signals(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_time(void* ctx, zx_handle_t handle, zx_time_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_time(zx::handle(handle), out_result);
return ret;
}
static zx_status_t Apioutput_vaddr(void* ctx, zx_handle_t handle, zx_vaddr_t* out_result) {
auto ret = static_cast<D*>(ctx)->Apioutput_vaddr(zx::handle(handle), out_result);
return ret;
}
static void Apireturn_void(void* ctx, zx_handle_t handle) {
static_cast<D*>(ctx)->Apireturn_void(zx::handle(handle));
}
static zx_status_t Apireturn_status(void* ctx, zx_handle_t handle) {
auto ret = static_cast<D*>(ctx)->Apireturn_status(zx::handle(handle));
return ret;
}
static zx_ticks_t Apireturn_ticks(void* ctx, zx_handle_t handle) {
auto ret = static_cast<D*>(ctx)->Apireturn_ticks(zx::handle(handle));
return ret;
}
static zx_time_t Apireturn_time(void* ctx, zx_handle_t handle) {
auto ret = static_cast<D*>(ctx)->Apireturn_time(zx::handle(handle));
return ret;
}
static uint32_t Apireturn_uint32(void* ctx, zx_handle_t handle) {
auto ret = static_cast<D*>(ctx)->Apireturn_uint32(zx::handle(handle));
return ret;
}
static uint64_t Apireturn_uint64(void* ctx, zx_handle_t handle) {
auto ret = static_cast<D*>(ctx)->Apireturn_uint64(zx::handle(handle));
return ret;
}
};
class ApiProtocolClient {
public:
ApiProtocolClient()
: ops_(nullptr), ctx_(nullptr) {}
ApiProtocolClient(const api_protocol_t* proto)
: ops_(proto->ops), ctx_(proto->ctx) {}
ApiProtocolClient(zx_device_t* parent) {
api_protocol_t proto;
if (device_get_protocol(parent, ZX_PROTOCOL_API, &proto) == ZX_OK) {
ops_ = proto.ops;
ctx_ = proto.ctx;
} else {
ops_ = nullptr;
ctx_ = nullptr;
}
}
ApiProtocolClient(zx_device_t* parent, const char* fragment_name) {
api_protocol_t proto;
if (device_get_fragment_protocol(parent, fragment_name, ZX_PROTOCOL_API, &proto) == ZX_OK) {
ops_ = proto.ops;
ctx_ = proto.ctx;
} else {
ops_ = nullptr;
ctx_ = nullptr;
}
}
// Create a ApiProtocolClient from the given parent device + "fragment".
//
// If ZX_OK is returned, the created object will be initialized in |result|.
static zx_status_t CreateFromDevice(zx_device_t* parent,
ApiProtocolClient* result) {
api_protocol_t proto;
zx_status_t status = device_get_protocol(
parent, ZX_PROTOCOL_API, &proto);
if (status != ZX_OK) {
return status;
}
*result = ApiProtocolClient(&proto);
return ZX_OK;
}
// Create a ApiProtocolClient from the given parent device.
//
// If ZX_OK is returned, the created object will be initialized in |result|.
static zx_status_t CreateFromDevice(zx_device_t* parent, const char* fragment_name,
ApiProtocolClient* result) {
api_protocol_t proto;
zx_status_t status = device_get_fragment_protocol(parent, fragment_name,
ZX_PROTOCOL_API, &proto);
if (status != ZX_OK) {
return status;
}
*result = ApiProtocolClient(&proto);
return ZX_OK;
}
void GetProto(api_protocol_t* proto) const {
proto->ctx = ctx_;
proto->ops = ops_;
}
bool is_valid() const {
return ops_ != nullptr;
}
void clear() {
ctx_ = nullptr;
ops_ = nullptr;
}
zx_status_t bool(zx::handle handle, bool data) const {
return ops_->bool(ctx_, handle.release(), data);
}
zx_status_t int8(zx::handle handle, int8_t data) const {
return ops_->int8(ctx_, handle.release(), data);
}
zx_status_t int16(zx::handle handle, int16_t data) const {
return ops_->int16(ctx_, handle.release(), data);
}
zx_status_t int32(zx::handle handle, int32_t data) const {
return ops_->int32(ctx_, handle.release(), data);
}
zx_status_t int64(zx::handle handle, int64_t data) const {
return ops_->int64(ctx_, handle.release(), data);
}
zx_status_t uint8(zx::handle handle, uint8_t data) const {
return ops_->uint8(ctx_, handle.release(), data);
}
zx_status_t uint16(zx::handle handle, uint16_t data) const {
return ops_->uint16(ctx_, handle.release(), data);
}
zx_status_t uint32(zx::handle handle, uint32_t data) const {
return ops_->uint32(ctx_, handle.release(), data);
}
zx_status_t uint64(zx::handle handle, uint64_t data) const {
return ops_->uint64(ctx_, handle.release(), data);
}
zx_status_t float32(zx::handle handle, float data) const {
return ops_->float32(ctx_, handle.release(), data);
}
zx_status_t float64(zx::handle handle, double data) const {
return ops_->float64(ctx_, handle.release(), data);
}
zx_status_t duration(zx::handle handle, zx_duration_t data) const {
return ops_->duration(ctx_, handle.release(), data);
}
zx_status_t koid(zx::handle handle, zx_koid_t data) const {
return ops_->koid(ctx_, handle.release(), data);
}
zx_status_t paddr(zx::handle handle, zx_paddr_t data) const {
return ops_->paddr(ctx_, handle.release(), data);
}
zx_status_t signals(zx::handle handle, zx_signals_t data) const {
return ops_->signals(ctx_, handle.release(), data);
}
zx_status_t time(zx::handle handle, zx_time_t data) const {
return ops_->time(ctx_, handle.release(), data);
}
zx_status_t vaddr(zx::handle handle, zx_vaddr_t data) const {
return ops_->vaddr(ctx_, handle.release(), data);
}
zx_status_t output_bool(zx::handle handle, bool* out_result) const {
return ops_->output_bool(ctx_, handle.release(), out_result);
}
zx_status_t output_int8(zx::handle handle, int8_t* out_result) const {
return ops_->output_int8(ctx_, handle.release(), out_result);
}
zx_status_t output_int16(zx::handle handle, int16_t* out_result) const {
return ops_->output_int16(ctx_, handle.release(), out_result);
}
zx_status_t output_int32(zx::handle handle, int32_t* out_result) const {
return ops_->output_int32(ctx_, handle.release(), out_result);
}
zx_status_t output_int64(zx::handle handle, int64_t* out_result) const {
return ops_->output_int64(ctx_, handle.release(), out_result);
}
zx_status_t output_uint8(zx::handle handle, uint8_t* out_result) const {
return ops_->output_uint8(ctx_, handle.release(), out_result);
}
zx_status_t output_uint16(zx::handle handle, uint16_t* out_result) const {
return ops_->output_uint16(ctx_, handle.release(), out_result);
}
zx_status_t output_uint32(zx::handle handle, uint32_t* out_result) const {
return ops_->output_uint32(ctx_, handle.release(), out_result);
}
zx_status_t output_uint64(zx::handle handle, uint64_t* out_result) const {
return ops_->output_uint64(ctx_, handle.release(), out_result);
}
zx_status_t output_float32(zx::handle handle, float* out_result) const {
return ops_->output_float32(ctx_, handle.release(), out_result);
}
zx_status_t output_float64(zx::handle handle, double* out_result) const {
return ops_->output_float64(ctx_, handle.release(), out_result);
}
zx_status_t output_duration(zx::handle handle, zx_duration_t* out_result) const {
return ops_->output_duration(ctx_, handle.release(), out_result);
}
zx_status_t output_koid(zx::handle handle, zx_koid_t* out_result) const {
return ops_->output_koid(ctx_, handle.release(), out_result);
}
zx_status_t output_paddr(zx::handle handle, zx_paddr_t* out_result) const {
return ops_->output_paddr(ctx_, handle.release(), out_result);
}
zx_status_t output_signals(zx::handle handle, zx_signals_t* out_result) const {
return ops_->output_signals(ctx_, handle.release(), out_result);
}
zx_status_t output_time(zx::handle handle, zx_time_t* out_result) const {
return ops_->output_time(ctx_, handle.release(), out_result);
}
zx_status_t output_vaddr(zx::handle handle, zx_vaddr_t* out_result) const {
return ops_->output_vaddr(ctx_, handle.release(), out_result);
}
void return_void(zx::handle handle) const {
ops_->return_void(ctx_, handle.release());
}
zx_status_t return_status(zx::handle handle) const {
return ops_->return_status(ctx_, handle.release());
}
zx_ticks_t return_ticks(zx::handle handle) const {
return ops_->return_ticks(ctx_, handle.release());
}
zx_time_t return_time(zx::handle handle) const {
return ops_->return_time(ctx_, handle.release());
}
uint32_t return_uint32(zx::handle handle) const {
return ops_->return_uint32(ctx_, handle.release());
}
uint64_t return_uint64(zx::handle handle) const {
return ops_->return_uint64(ctx_, handle.release());
}
private:
api_protocol_ops_t* ops_;
void* ctx_;
};
} // namespace ddk