/* 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 #include #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 */