blob: 45d81dd877e22e4e5cfa9baf38e530af58a5cb9f [file] [log] [blame]
// 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.
#pragma once
#include <fbl/type_support.h>
namespace ddk {
namespace internal {
DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_pdev_map_mmio, MapMmio,
zx_status_t (C::*)(uint32_t, uint32_t, void**, size_t*, zx_paddr_t*, zx_handle_t*));
DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_pdev_map_interrupt, MapInterrupt,
zx_status_t (C::*)(uint32_t, uint32_t, zx_handle_t*));
DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_pdev_get_bti, GetBti,
zx_status_t (C::*)(uint32_t, zx_handle_t*));
DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_pdev_get_device_info, GetDeviceInfo,
zx_status_t (C::*)(pdev_device_info_t*));
DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_pdev_get_board_info, GetBoardInfo,
zx_status_t (C::*)(pdev_board_info_t*));
DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_pdev_device_add, DeviceAdd,
zx_status_t (C::*)(uint32_t, device_add_args_t*, zx_device_t**));
DECLARE_HAS_MEMBER_FN_WITH_SIGNATURE(has_pdev_get_protocol, GetProtocol,
zx_status_t (C::*)(uint32_t, uint32_t, void*));
template <typename D>
constexpr void CheckPlatformDevProtocolSubclass() {
static_assert(internal::has_pdev_map_mmio<D>::value,
"PlatformDevProtocol subclasses must implement "
"MapMmio(uint32_t index, uint32_t cache_policy, void** out_vaddr, "
"size_t* out_size, zx_paddr_t* out_paddr, zx_handle_t* out_handle)");
static_assert(internal::has_pdev_map_interrupt<D>::value,
"PlatformDevProtocol subclasses must implement "
"MapInterrupt(uint32_t index, uint32_t flags, zx_handle_t* out_handle)");
static_assert(internal::has_pdev_get_bti<D>::value,
"PlatformDevProtocol subclasses must implement "
"GetBti(uint32_t index, zx_handle_t* out_handle)");
static_assert(internal::has_pdev_get_device_info<D>::value,
"PlatformDevProtocol subclasses must implement "
"GetDeviceInfo(pdev_device_info_t* out_info)");
static_assert(internal::has_pdev_get_board_info<D>::value,
"PlatformDevProtocol subclasses must implement "
"GetBoardInfo(pdev_board_info_t* out_info)");
static_assert(internal::has_pdev_device_add<D>::value,
"PlatformDevProtocol subclasses must implement "
"DeviceAdd(uint32_t index, device_add_args_t* args, zx_device_t** out)");
static_assert(internal::has_pdev_get_protocol<D>::value,
"PlatformDevProtocol subclasses must implement "
"GetProtocol(uint32_t proto_id, uint32_t index, void* out_protocol)");
}
} // namespace internal
} // namespace ddk