blob: 28850ae42ff4d4897ecf155b0443fd6e2aa7063c [file] [log] [blame]
// Copyright 2019 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_INTERNAL_DRIVERS_FRAGMENT_PROXY_PROTOCOL_H_
#define SRC_DEVICES_INTERNAL_DRIVERS_FRAGMENT_PROXY_PROTOCOL_H_
namespace fragment {
// Maximum transfer size we can proxy.
static constexpr size_t kProxyMaxTransferSize = 4096;
/// Header for RPC requests.
struct ProxyRequest {
uint32_t txid;
uint32_t proto_id;
};
/// Header for RPC responses.
struct ProxyResponse {
uint32_t txid;
zx_status_t status;
};
// ZX_PROTOCOL_PDEV proxy support.
enum class PdevOp {
GET_MMIO,
GET_INTERRUPT,
GET_BTI,
GET_SMC,
GET_DEVICE_INFO,
GET_BOARD_INFO,
};
struct PdevProxyRequest {
ProxyRequest header;
PdevOp op;
uint32_t index;
uint32_t flags;
};
struct PdevProxyResponse {
ProxyResponse header;
zx_off_t offset;
size_t size;
uint32_t flags;
pdev_device_info_t device_info;
pdev_board_info_t board_info;
};
// Maximum metadata size that can be returned via PDEV_DEVICE_GET_METADATA.
static constexpr uint32_t PROXY_MAX_METADATA_SIZE =
(kProxyMaxTransferSize - sizeof(PdevProxyResponse));
struct rpc_pdev_metadata_rsp_t {
PdevProxyResponse pdev;
uint8_t metadata[PROXY_MAX_METADATA_SIZE];
};
// ZX_PROTOCOL_GPIO proxy support.
enum class GpioOp {
CONFIG_IN,
CONFIG_OUT,
SET_ALT_FUNCTION,
READ,
WRITE,
GET_INTERRUPT,
RELEASE_INTERRUPT,
SET_POLARITY,
SET_DRIVE_STRENGTH,
};
struct GpioProxyRequest {
ProxyRequest header;
GpioOp op;
uint32_t flags;
uint32_t polarity;
uint64_t alt_function;
uint8_t value;
uint64_t ds_ua;
};
struct GpioProxyResponse {
ProxyResponse header;
uint8_t value;
uint64_t out_actual_ds_ua;
};
// ZX_PROTOCOL_BUTTONS proxy support.
enum class ButtonsOp {
GET_NOTIFY_CHANNEL,
};
struct ButtonsProxyRequest {
ProxyRequest header;
ButtonsOp op;
};
struct ButtonsProxyResponse {
ProxyResponse header;
};
// ZX_PROTOCOL_CODEC proxy support.
enum class CodecOp {
GET_CHANNEL,
};
struct CodecProxyRequest {
ProxyRequest header;
CodecOp op;
};
struct CodecProxyResponse {
ProxyResponse header;
};
// ZX_PROTOCOL_DAI proxy support.
enum class DaiOp {
GET_CHANNEL,
};
struct DaiProxyRequest {
ProxyRequest header;
DaiOp op;
};
struct DaiProxyResponse {
ProxyResponse header;
};
// ZX_PROTOCOL_CLOCK proxy support.
enum class ClockOp {
ENABLE,
DISABLE,
IS_ENABLED,
SET_RATE,
QUERY_SUPPORTED_RATE,
GET_RATE,
SET_INPUT,
GET_NUM_INPUTS,
GET_INPUT,
};
struct ClockProxyRequest {
ProxyRequest header;
ClockOp op;
uint64_t rate;
uint32_t input_idx;
};
struct ClockProxyResponse {
ProxyResponse header;
bool is_enabled;
uint64_t rate;
uint32_t num_inputs;
uint32_t current_input;
};
// ZX_PROTOCOL_POWER proxy support.
enum class PowerOp {
REGISTER,
UNREGISTER,
GET_STATUS,
GET_SUPPORTED_VOLTAGE_RANGE,
REQUEST_VOLTAGE,
GET_CURRENT_VOLTAGE,
WRITE_PMIC_CTRL_REG,
READ_PMIC_CTRL_REG,
};
struct PowerProxyRequest {
ProxyRequest header;
PowerOp op;
uint32_t set_voltage;
uint32_t reg_addr;
uint32_t reg_value;
uint32_t min_voltage;
uint32_t max_voltage;
};
struct PowerProxyResponse {
ProxyResponse header;
power_domain_status_t status;
uint32_t min_voltage;
uint32_t max_voltage;
uint32_t actual_voltage;
uint32_t current_voltage;
uint32_t reg_value;
};
// ZX_PROTOCOL_PWM proxy support.
enum class PwmOp {
GET_CONFIG,
SET_CONFIG,
ENABLE,
DISABLE,
};
constexpr uint32_t kPwmProxyRequestPadding = 12;
static constexpr uint32_t MAX_MODE_CFG_SIZE = kProxyMaxTransferSize - sizeof(pwm_config_t) -
sizeof(ProxyRequest) - sizeof(PwmOp) -
kPwmProxyRequestPadding;
struct PwmProxyRequest {
ProxyRequest header;
PwmOp op;
pwm_config_t config;
uint8_t mode_cfg[MAX_MODE_CFG_SIZE];
};
static_assert(sizeof(PwmProxyRequest) < kProxyMaxTransferSize);
struct PwmProxyResponse {
ProxyResponse header;
pwm_config_t config;
uint8_t mode_cfg[MAX_MODE_CFG_SIZE];
};
static_assert(sizeof(PwmProxyResponse) < kProxyMaxTransferSize);
// ZX_PROTOCOL_SYSMEM proxy support.
enum class SysmemOp {
CONNECT,
REGISTER_HEAP,
REGISTER_SECURE_MEM,
UNREGISTER_SECURE_MEM,
};
struct SysmemProxyRequest {
ProxyRequest header;
SysmemOp op;
uint64_t heap;
};
// ZX_PROTOCOL_TEE proxy support.
enum class TeeOp {
CONNECT,
};
struct TeeProxyRequest {
ProxyRequest header;
TeeOp op;
};
// ZX_PROTOCOL_VREG proxy support.
enum class VregOp {
SET_VOLTAGE_STEP,
GET_VOLTAGE_STEP,
GET_REGULATOR_PARAMS,
};
struct VregProxyRequest {
ProxyRequest header;
VregOp op;
uint32_t step;
};
struct VregProxyResponse {
ProxyResponse header;
vreg_params_t params;
uint32_t step;
};
// ZX_PROTOCOL_AMLOGIC_CANVAS proxy support.
enum class AmlogicCanvasOp {
CONFIG,
FREE,
};
struct AmlogicCanvasProxyRequest {
ProxyRequest header;
AmlogicCanvasOp op;
size_t offset;
canvas_info_t info;
uint8_t canvas_idx;
};
struct AmlogicCanvasProxyResponse {
ProxyResponse header;
uint8_t canvas_idx;
};
// ZX_PROTOCOL_ETH_BOARD proxy support.
enum class EthBoardOp {
RESET_PHY,
};
struct EthBoardProxyRequest {
ProxyRequest header;
EthBoardOp op;
};
// ZX_PROTOCOL_I2C proxy support.
enum class I2cOp {
TRANSACT,
GET_MAX_TRANSFER_SIZE,
GET_INTERRUPT,
};
struct I2cProxyRequest {
ProxyRequest header;
I2cOp op;
size_t op_count;
uint32_t flags;
uint64_t trace_id;
};
struct I2cProxyResponse {
ProxyResponse header;
size_t size;
};
struct I2cProxyOp {
size_t length;
bool is_read;
bool stop;
};
enum class SpiOp {
TRANSMIT,
RECEIVE,
EXCHANGE,
};
struct SpiProxyRequest {
ProxyRequest header;
SpiOp op;
size_t length;
};
struct SpiProxyResponse {
ProxyResponse header;
};
// ZX_PROTOCOL_USB_MODE_SWITCH proxy support.
enum class UsbModeSwitchOp {
SET_MODE,
};
struct UsbModeSwitchProxyRequest {
ProxyRequest header;
UsbModeSwitchOp op;
usb_mode_t mode;
};
// ZX_PROTOCOL_RPMB proxy supprot.
enum class RpmbOp {
CONNECT_SERVER,
};
struct RpmbProxyRequest {
ProxyRequest header;
RpmbOp op;
};
struct RpmbProxyResponse {
ProxyResponse header;
};
// ZX_PROTOCOL_REGISTERS proxy supprot.
enum class RegistersOp {
CONNECT,
};
struct RegistersProxyRequest {
ProxyRequest header;
RegistersOp op;
};
struct RegistersProxyResponse {
ProxyResponse header;
};
// ZX_PROTOCOL_GOLDFISH_PIPE proxy support.
enum class GoldfishPipeOp {
CREATE,
DESTROY,
SET_EVENT,
OPEN,
EXEC,
GET_BTI,
CONNECT_SYSMEM,
REGISTER_SYSMEM_HEAP,
};
struct GoldfishPipeProxyRequest {
ProxyRequest header;
GoldfishPipeOp op;
int32_t id;
uint64_t heap;
};
struct GoldfishPipeProxyResponse {
ProxyResponse header;
int32_t id;
};
// ZX_PROTOCOL_GOLDFISH_ADDRESS_SPACE proxy support.
enum class GoldfishAddressSpaceOp {
OPEN_CHILD_DRIVER,
};
struct GoldfishAddressSpaceProxyRequest {
ProxyRequest header;
GoldfishAddressSpaceOp op;
uint32_t type;
};
struct GoldfishAddressSpaceProxyResponse {
ProxyResponse header;
};
enum class DsiOp {
CONNECT,
};
struct DsiProxyRequest {
ProxyRequest header;
DsiOp op;
};
} // namespace fragment
#endif // SRC_DEVICES_INTERNAL_DRIVERS_FRAGMENT_PROXY_PROTOCOL_H_