blob: 85afd5f3d5f7de5206d4f6a69174eaa66d73f72d [file] [log] [blame]
/* Copyright 2018 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef __HBM_H
#define __HBM_H
#include <stdint.h>
#include <stddef.h>
#include "heci_client.h"
#define HBM_MAJOR_VERSION 1
#ifdef HECI_ENABLE_DMA
#define HBM_MINOR_VERSION 2
#else
#define HBM_MINOR_VERSION 0
#endif
#define __packed __attribute__((packed))
#define HECI_MSG_REPONSE_FLAG 0x80
enum HECI_BUS_MSG {
/* requests */
HECI_BUS_MSG_VERSION_REQ = 1,
HECI_BUS_MSG_HOST_STOP_REQ = 2,
HECI_BUS_MSG_ME_STOP_REQ = 3,
HECI_BUS_MSG_HOST_ENUM_REQ = 4,
HECI_BUS_MSG_HOST_CLIENT_PROP_REQ = 5,
HECI_BUS_MSG_CLIENT_CONNECT_REQ = 6,
HECI_BUS_MSG_CLIENT_DISCONNECT_REQ = 7,
HECI_BUS_MSG_FLOW_CONTROL = 8,
HECI_BUS_MSG_RESET_REQ = 9,
HECI_BUS_MSG_ADD_CLIENT_REQ = 0x0A,
HECI_BUS_MSG_DMA_REQ = 0x10,
HECI_BUS_MSG_DMA_ALLOC_NOTIFY = 0x11,
HECI_BUS_MSG_DMA_XFER_REQ = 0x12,
/* responses */
HECI_BUS_MSG_VERSION_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_VERSION_REQ),
HECI_BUS_MSG_HOST_STOP_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_HOST_STOP_REQ),
HECI_BUS_MSG_HOST_ENUM_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_HOST_ENUM_REQ),
HECI_BUS_MSG_HOST_CLIENT_PROP_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_HOST_CLIENT_PROP_REQ),
HECI_BUS_MSG_CLIENT_CONNECT_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_CLIENT_CONNECT_REQ),
HECI_BUS_MSG_CLIENT_DISCONNECT_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_CLIENT_DISCONNECT_REQ),
HECI_BUS_MSG_RESET_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_RESET_REQ),
HECI_BUS_MSG_ADD_CLIENT_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_ADD_CLIENT_REQ),
HECI_BUS_MSG_DMA_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_DMA_REQ),
HECI_BUS_MSG_DMA_ALLOC_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_DMA_ALLOC_NOTIFY),
HECI_BUS_MSG_DMA_XFER_RESP =
(HECI_MSG_REPONSE_FLAG | HECI_BUS_MSG_DMA_XFER_REQ)
};
enum {
HECI_CONNECT_STATUS_SUCCESS = 0,
HECI_CONNECT_STATUS_CLIENT_NOT_FOUND = 1,
HECI_CONNECT_STATUS_ALREADY_EXISTS = 2,
HECI_CONNECT_STATUS_REJECTED = 3,
HECI_CONNECT_STATUS_INVALID_PARAMETER = 4,
HECI_CONNECT_STATUS_INACTIVE_CLIENT = 5,
};
struct hbm_version {
uint8_t minor;
uint8_t major;
} __packed;
struct hbm_version_req {
uint8_t reserved;
struct hbm_version version;
} __packed;
struct hbm_version_res {
uint8_t supported;
struct hbm_version version;
} __packed;
struct hbm_enum_req {
uint8_t reserved[3];
} __packed;
struct hbm_enum_res {
uint8_t reserved[3];
uint8_t valid_addresses[32];
} __packed;
struct hbm_client_prop_req {
uint8_t address;
uint8_t reserved[2];
} __packed;
#define CLIENT_DMA_ENABLE 0x80
struct hbm_client_properties {
struct heci_guid protocol_name; /* heci client protocol ID */
uint8_t protocol_version; /* protocol version */
/* max connection from host to client. currently only 1 is allowed */
uint8_t max_number_of_connections;
uint8_t fixed_address; /* not yet supported */
uint8_t single_recv_buf; /* not yet supported */
uint32_t max_msg_length; /* max payload size */
/* not yet supported. [7] enable/disable, [6:0] dma length */
uint8_t dma_hdr_len;
uint8_t reserved4;
uint8_t reserved5;
uint8_t reserved6;
} __packed;
struct hbm_client_prop_res {
uint8_t address;
uint8_t status;
uint8_t reserved[1];
struct hbm_client_properties client_prop;
} __packed;
struct hbm_client_connect_req {
uint8_t fw_addr;
uint8_t host_addr;
uint8_t reserved;
} __packed;
struct hbm_client_connect_res {
uint8_t fw_addr;
uint8_t host_addr;
uint8_t status;
} __packed;
struct hbm_flow_control {
uint8_t fw_addr;
uint8_t host_addr;
uint8_t reserved[5];
} __packed;
struct hbm_client_disconnect_req {
uint8_t fw_addr;
uint8_t host_addr;
uint8_t reserved;
} __packed;
struct hbm_client_disconnect_res {
uint8_t fw_addr;
uint8_t host_addr;
uint8_t status;
} __packed;
struct hbm_host_stop_req {
uint8_t reason;
uint8_t reserved[2];
};
struct hbm_host_stop_res {
uint8_t reserved[3];
};
/* host bus message : host -> ish */
struct hbm_h2i {
uint8_t cmd;
union {
struct hbm_version_req ver_req;
struct hbm_enum_req enum_req;
struct hbm_client_prop_req client_prop_req;
struct hbm_client_connect_req client_connect_req;
struct hbm_flow_control flow_ctrl;
struct hbm_client_disconnect_req client_disconnect_req;
struct hbm_host_stop_req host_stop_req;
} data;
} __packed;
/* host bus message : i2h -> host */
struct hbm_i2h {
uint8_t cmd;
union {
struct hbm_version_res ver_res;
struct hbm_enum_res enum_res;
struct hbm_client_prop_res client_prop_res;
struct hbm_client_connect_res client_connect_res;
struct hbm_flow_control flow_ctrl;
struct hbm_client_disconnect_res client_disconnect_res;
struct hbm_host_stop_res host_stop_res;
} data;
} __packed;
#endif /* __HBM_H */