1 /* 2 * ISHTP bus layer messages handling 3 * 4 * Copyright (c) 2003-2016, Intel Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms and conditions of the GNU General Public License, 8 * version 2, as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 * more details. 14 */ 15 16 #ifndef _ISHTP_HBM_H_ 17 #define _ISHTP_HBM_H_ 18 19 #include <linux/uuid.h> 20 21 struct ishtp_device; 22 struct ishtp_msg_hdr; 23 struct ishtp_cl; 24 25 /* 26 * Timeouts in Seconds 27 */ 28 #define ISHTP_INTEROP_TIMEOUT 7 /* Timeout on ready message */ 29 30 #define ISHTP_CL_CONNECT_TIMEOUT 15 /* HPS: Client Connect Timeout */ 31 32 /* 33 * ISHTP Version 34 */ 35 #define HBM_MINOR_VERSION 0 36 #define HBM_MAJOR_VERSION 1 37 38 /* Host bus message command opcode */ 39 #define ISHTP_HBM_CMD_OP_MSK 0x7f 40 /* Host bus message command RESPONSE */ 41 #define ISHTP_HBM_CMD_RES_MSK 0x80 42 43 /* 44 * ISHTP Bus Message Command IDs 45 */ 46 #define HOST_START_REQ_CMD 0x01 47 #define HOST_START_RES_CMD 0x81 48 49 #define HOST_STOP_REQ_CMD 0x02 50 #define HOST_STOP_RES_CMD 0x82 51 52 #define FW_STOP_REQ_CMD 0x03 53 54 #define HOST_ENUM_REQ_CMD 0x04 55 #define HOST_ENUM_RES_CMD 0x84 56 57 #define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05 58 #define HOST_CLIENT_PROPERTIES_RES_CMD 0x85 59 60 #define CLIENT_CONNECT_REQ_CMD 0x06 61 #define CLIENT_CONNECT_RES_CMD 0x86 62 63 #define CLIENT_DISCONNECT_REQ_CMD 0x07 64 #define CLIENT_DISCONNECT_RES_CMD 0x87 65 66 #define ISHTP_FLOW_CONTROL_CMD 0x08 67 68 #define DMA_BUFFER_ALLOC_NOTIFY 0x11 69 #define DMA_BUFFER_ALLOC_RESPONSE 0x91 70 71 #define DMA_XFER 0x12 72 #define DMA_XFER_ACK 0x92 73 74 /* 75 * ISHTP Stop Reason 76 * used by hbm_host_stop_request.reason 77 */ 78 #define DRIVER_STOP_REQUEST 0x00 79 80 /* 81 * ISHTP BUS Interface Section 82 */ 83 struct ishtp_msg_hdr { 84 uint32_t fw_addr:8; 85 uint32_t host_addr:8; 86 uint32_t length:9; 87 uint32_t reserved:6; 88 uint32_t msg_complete:1; 89 } __packed; 90 91 struct ishtp_bus_message { 92 uint8_t hbm_cmd; 93 uint8_t data[0]; 94 } __packed; 95 96 /** 97 * struct hbm_cl_cmd - client specific host bus command 98 * CONNECT, DISCONNECT, and FlOW CONTROL 99 * 100 * @hbm_cmd - bus message command header 101 * @fw_addr - address of the fw client 102 * @host_addr - address of the client in the driver 103 * @data 104 */ 105 struct ishtp_hbm_cl_cmd { 106 uint8_t hbm_cmd; 107 uint8_t fw_addr; 108 uint8_t host_addr; 109 uint8_t data; 110 }; 111 112 struct hbm_version { 113 uint8_t minor_version; 114 uint8_t major_version; 115 } __packed; 116 117 struct hbm_host_version_request { 118 uint8_t hbm_cmd; 119 uint8_t reserved; 120 struct hbm_version host_version; 121 } __packed; 122 123 struct hbm_host_version_response { 124 uint8_t hbm_cmd; 125 uint8_t host_version_supported; 126 struct hbm_version fw_max_version; 127 } __packed; 128 129 struct hbm_host_stop_request { 130 uint8_t hbm_cmd; 131 uint8_t reason; 132 uint8_t reserved[2]; 133 } __packed; 134 135 struct hbm_host_stop_response { 136 uint8_t hbm_cmd; 137 uint8_t reserved[3]; 138 } __packed; 139 140 struct hbm_host_enum_request { 141 uint8_t hbm_cmd; 142 uint8_t reserved[3]; 143 } __packed; 144 145 struct hbm_host_enum_response { 146 uint8_t hbm_cmd; 147 uint8_t reserved[3]; 148 uint8_t valid_addresses[32]; 149 } __packed; 150 151 struct ishtp_client_properties { 152 uuid_le protocol_name; 153 uint8_t protocol_version; 154 uint8_t max_number_of_connections; 155 uint8_t fixed_address; 156 uint8_t single_recv_buf; 157 uint32_t max_msg_length; 158 uint8_t dma_hdr_len; 159 #define ISHTP_CLIENT_DMA_ENABLED 0x80 160 uint8_t reserved4; 161 uint8_t reserved5; 162 uint8_t reserved6; 163 } __packed; 164 165 struct hbm_props_request { 166 uint8_t hbm_cmd; 167 uint8_t address; 168 uint8_t reserved[2]; 169 } __packed; 170 171 struct hbm_props_response { 172 uint8_t hbm_cmd; 173 uint8_t address; 174 uint8_t status; 175 uint8_t reserved[1]; 176 struct ishtp_client_properties client_properties; 177 } __packed; 178 179 /** 180 * struct hbm_client_connect_request - connect/disconnect request 181 * 182 * @hbm_cmd - bus message command header 183 * @fw_addr - address of the fw client 184 * @host_addr - address of the client in the driver 185 * @reserved 186 */ 187 struct hbm_client_connect_request { 188 uint8_t hbm_cmd; 189 uint8_t fw_addr; 190 uint8_t host_addr; 191 uint8_t reserved; 192 } __packed; 193 194 /** 195 * struct hbm_client_connect_response - connect/disconnect response 196 * 197 * @hbm_cmd - bus message command header 198 * @fw_addr - address of the fw client 199 * @host_addr - address of the client in the driver 200 * @status - status of the request 201 */ 202 struct hbm_client_connect_response { 203 uint8_t hbm_cmd; 204 uint8_t fw_addr; 205 uint8_t host_addr; 206 uint8_t status; 207 } __packed; 208 209 210 #define ISHTP_FC_MESSAGE_RESERVED_LENGTH 5 211 212 struct hbm_flow_control { 213 uint8_t hbm_cmd; 214 uint8_t fw_addr; 215 uint8_t host_addr; 216 uint8_t reserved[ISHTP_FC_MESSAGE_RESERVED_LENGTH]; 217 } __packed; 218 219 struct dma_alloc_notify { 220 uint8_t hbm; 221 uint8_t status; 222 uint8_t reserved[2]; 223 uint32_t buf_size; 224 uint64_t buf_address; 225 /* [...] May come more size/address pairs */ 226 } __packed; 227 228 struct dma_xfer_hbm { 229 uint8_t hbm; 230 uint8_t fw_client_id; 231 uint8_t host_client_id; 232 uint8_t reserved; 233 uint64_t msg_addr; 234 uint32_t msg_length; 235 uint32_t reserved2; 236 } __packed; 237 238 /* System state */ 239 #define ISHTP_SYSTEM_STATE_CLIENT_ADDR 13 240 241 #define SYSTEM_STATE_SUBSCRIBE 0x1 242 #define SYSTEM_STATE_STATUS 0x2 243 #define SYSTEM_STATE_QUERY_SUBSCRIBERS 0x3 244 #define SYSTEM_STATE_STATE_CHANGE_REQ 0x4 245 /*indicates suspend and resume states*/ 246 #define SUSPEND_STATE_BIT (1<<1) 247 248 struct ish_system_states_header { 249 uint32_t cmd; 250 uint32_t cmd_status; /*responses will have this set*/ 251 } __packed; 252 253 struct ish_system_states_subscribe { 254 struct ish_system_states_header hdr; 255 uint32_t states; 256 } __packed; 257 258 struct ish_system_states_status { 259 struct ish_system_states_header hdr; 260 uint32_t supported_states; 261 uint32_t states_status; 262 } __packed; 263 264 struct ish_system_states_query_subscribers { 265 struct ish_system_states_header hdr; 266 } __packed; 267 268 struct ish_system_states_state_change_req { 269 struct ish_system_states_header hdr; 270 uint32_t requested_states; 271 uint32_t states_status; 272 } __packed; 273 274 /** 275 * enum ishtp_hbm_state - host bus message protocol state 276 * 277 * @ISHTP_HBM_IDLE : protocol not started 278 * @ISHTP_HBM_START : start request message was sent 279 * @ISHTP_HBM_ENUM_CLIENTS : enumeration request was sent 280 * @ISHTP_HBM_CLIENT_PROPERTIES : acquiring clients properties 281 */ 282 enum ishtp_hbm_state { 283 ISHTP_HBM_IDLE = 0, 284 ISHTP_HBM_START, 285 ISHTP_HBM_STARTED, 286 ISHTP_HBM_ENUM_CLIENTS, 287 ISHTP_HBM_CLIENT_PROPERTIES, 288 ISHTP_HBM_WORKING, 289 ISHTP_HBM_STOPPED, 290 }; 291 292 static inline void ishtp_hbm_hdr(struct ishtp_msg_hdr *hdr, size_t length) 293 { 294 hdr->host_addr = 0; 295 hdr->fw_addr = 0; 296 hdr->length = length; 297 hdr->msg_complete = 1; 298 hdr->reserved = 0; 299 } 300 301 int ishtp_hbm_start_req(struct ishtp_device *dev); 302 int ishtp_hbm_start_wait(struct ishtp_device *dev); 303 int ishtp_hbm_cl_flow_control_req(struct ishtp_device *dev, 304 struct ishtp_cl *cl); 305 int ishtp_hbm_cl_disconnect_req(struct ishtp_device *dev, struct ishtp_cl *cl); 306 int ishtp_hbm_cl_connect_req(struct ishtp_device *dev, struct ishtp_cl *cl); 307 void ishtp_hbm_enum_clients_req(struct ishtp_device *dev); 308 void bh_hbm_work_fn(struct work_struct *work); 309 void recv_hbm(struct ishtp_device *dev, struct ishtp_msg_hdr *ishtp_hdr); 310 void recv_fixed_cl_msg(struct ishtp_device *dev, 311 struct ishtp_msg_hdr *ishtp_hdr); 312 void ishtp_hbm_dispatch(struct ishtp_device *dev, 313 struct ishtp_bus_message *hdr); 314 315 void ishtp_query_subscribers(struct ishtp_device *dev); 316 317 /* Exported I/F */ 318 void ishtp_send_suspend(struct ishtp_device *dev); 319 void ishtp_send_resume(struct ishtp_device *dev); 320 321 #endif /* _ISHTP_HBM_H_ */ 322