| // Copyright 2017 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_BUS_DRIVERS_PLATFORM_PLATFORM_PROXY_H_ |
| #define SRC_DEVICES_BUS_DRIVERS_PLATFORM_PLATFORM_PROXY_H_ |
| |
| #include <lib/zx/channel.h> |
| |
| #include <ddktl/device.h> |
| #include <ddktl/protocol/platform/device.h> |
| #include <fbl/vector.h> |
| |
| #include "proxy-protocol.h" |
| |
| namespace platform_bus { |
| |
| class PlatformProxy; |
| |
| using PlatformProxyType = ddk::Device<PlatformProxy>; |
| |
| // This is the main class for the proxy side platform bus driver. |
| // It handles RPC communication with the main platform bus driver in the root devhost. |
| |
| class PlatformProxy : public PlatformProxyType, |
| public ddk::PDevProtocol<PlatformProxy, ddk::base_protocol> { |
| public: |
| explicit PlatformProxy(zx_device_t* parent, zx_handle_t rpc_channel) |
| : PlatformProxyType(parent), rpc_channel_(rpc_channel) {} |
| |
| static zx_status_t Create(void* ctx, zx_device_t* parent, const char* name, const char* args, |
| zx_handle_t rpc_channel); |
| |
| // Device protocol implementation. |
| void DdkRelease(); |
| |
| // Platform device protocol implementation. |
| zx_status_t PDevGetMmio(uint32_t index, pdev_mmio_t* out_mmio); |
| zx_status_t PDevGetInterrupt(uint32_t index, uint32_t flags, zx::interrupt* out_irq); |
| zx_status_t PDevGetBti(uint32_t index, zx::bti* out_bti); |
| zx_status_t PDevGetSmc(uint32_t index, zx::resource* out_resource); |
| zx_status_t PDevGetDeviceInfo(pdev_device_info_t* out_info); |
| zx_status_t PDevGetBoardInfo(pdev_board_info_t* out_info); |
| |
| zx_status_t Rpc(const platform_proxy_req_t* req, size_t req_length, platform_proxy_rsp_t* resp, |
| size_t resp_length, const zx_handle_t* in_handles, size_t in_handle_count, |
| zx_handle_t* out_handles, size_t out_handle_count, size_t* out_actual); |
| |
| inline zx_status_t Rpc(const platform_proxy_req_t* req, size_t req_length, |
| platform_proxy_rsp_t* resp, size_t resp_length) { |
| return Rpc(req, req_length, resp, resp_length, nullptr, 0, nullptr, 0, nullptr); |
| } |
| |
| private: |
| struct Mmio { |
| zx_paddr_t base; |
| size_t length; |
| zx::resource resource; |
| }; |
| struct Irq { |
| uint32_t irq; |
| // ZX_INTERRUPT_MODE_* flags |
| uint32_t mode; |
| zx::resource resource; |
| }; |
| |
| DISALLOW_COPY_ASSIGN_AND_MOVE(PlatformProxy); |
| |
| zx_status_t Init(zx_device_t* parent); |
| |
| const zx::channel rpc_channel_; |
| |
| char name_[ZX_MAX_NAME_LEN]; |
| uint32_t metadata_count_; |
| |
| fbl::Vector<Mmio> mmios_; |
| fbl::Vector<Irq> irqs_; |
| }; |
| |
| } // namespace platform_bus |
| |
| #endif // SRC_DEVICES_BUS_DRIVERS_PLATFORM_PLATFORM_PROXY_H_ |