1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2003-2018, Intel Corporation. All rights reserved 4 * Intel Management Engine Interface (Intel MEI) Linux driver 5 */ 6 7 #ifndef _MEI_HW_TYPES_H_ 8 #define _MEI_HW_TYPES_H_ 9 10 #include <linux/uuid.h> 11 12 /* 13 * Timeouts in Seconds 14 */ 15 #define MEI_HW_READY_TIMEOUT 2 /* Timeout on ready message */ 16 #define MEI_CONNECT_TIMEOUT 3 /* HPS: at least 2 seconds */ 17 18 #define MEI_CL_CONNECT_TIMEOUT 15 /* HPS: Client Connect Timeout */ 19 #define MEI_CLIENTS_INIT_TIMEOUT 15 /* HPS: Clients Enumeration Timeout */ 20 21 #define MEI_PGI_TIMEOUT 1 /* PG Isolation time response 1 sec */ 22 #define MEI_D0I3_TIMEOUT 5 /* D0i3 set/unset max response time */ 23 #define MEI_HBM_TIMEOUT 1 /* 1 second */ 24 25 /* 26 * MEI Version 27 */ 28 #define HBM_MINOR_VERSION 1 29 #define HBM_MAJOR_VERSION 2 30 31 /* 32 * MEI version with PGI support 33 */ 34 #define HBM_MINOR_VERSION_PGI 1 35 #define HBM_MAJOR_VERSION_PGI 1 36 37 /* 38 * MEI version with Dynamic clients support 39 */ 40 #define HBM_MINOR_VERSION_DC 0 41 #define HBM_MAJOR_VERSION_DC 2 42 43 /* 44 * MEI version with immediate reply to enum request support 45 */ 46 #define HBM_MINOR_VERSION_IE 0 47 #define HBM_MAJOR_VERSION_IE 2 48 49 /* 50 * MEI version with disconnect on connection timeout support 51 */ 52 #define HBM_MINOR_VERSION_DOT 0 53 #define HBM_MAJOR_VERSION_DOT 2 54 55 /* 56 * MEI version with notification support 57 */ 58 #define HBM_MINOR_VERSION_EV 0 59 #define HBM_MAJOR_VERSION_EV 2 60 61 /* 62 * MEI version with fixed address client support 63 */ 64 #define HBM_MINOR_VERSION_FA 0 65 #define HBM_MAJOR_VERSION_FA 2 66 67 /* 68 * MEI version with OS ver message support 69 */ 70 #define HBM_MINOR_VERSION_OS 0 71 #define HBM_MAJOR_VERSION_OS 2 72 73 /* 74 * MEI version with dma ring support 75 */ 76 #define HBM_MINOR_VERSION_DR 1 77 #define HBM_MAJOR_VERSION_DR 2 78 79 /* Host bus message command opcode */ 80 #define MEI_HBM_CMD_OP_MSK 0x7f 81 /* Host bus message command RESPONSE */ 82 #define MEI_HBM_CMD_RES_MSK 0x80 83 84 /* 85 * MEI Bus Message Command IDs 86 */ 87 #define HOST_START_REQ_CMD 0x01 88 #define HOST_START_RES_CMD 0x81 89 90 #define HOST_STOP_REQ_CMD 0x02 91 #define HOST_STOP_RES_CMD 0x82 92 93 #define ME_STOP_REQ_CMD 0x03 94 95 #define HOST_ENUM_REQ_CMD 0x04 96 #define HOST_ENUM_RES_CMD 0x84 97 98 #define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05 99 #define HOST_CLIENT_PROPERTIES_RES_CMD 0x85 100 101 #define CLIENT_CONNECT_REQ_CMD 0x06 102 #define CLIENT_CONNECT_RES_CMD 0x86 103 104 #define CLIENT_DISCONNECT_REQ_CMD 0x07 105 #define CLIENT_DISCONNECT_RES_CMD 0x87 106 107 #define MEI_FLOW_CONTROL_CMD 0x08 108 109 #define MEI_PG_ISOLATION_ENTRY_REQ_CMD 0x0a 110 #define MEI_PG_ISOLATION_ENTRY_RES_CMD 0x8a 111 #define MEI_PG_ISOLATION_EXIT_REQ_CMD 0x0b 112 #define MEI_PG_ISOLATION_EXIT_RES_CMD 0x8b 113 114 #define MEI_HBM_ADD_CLIENT_REQ_CMD 0x0f 115 #define MEI_HBM_ADD_CLIENT_RES_CMD 0x8f 116 117 #define MEI_HBM_NOTIFY_REQ_CMD 0x10 118 #define MEI_HBM_NOTIFY_RES_CMD 0x90 119 #define MEI_HBM_NOTIFICATION_CMD 0x11 120 121 #define MEI_HBM_DMA_SETUP_REQ_CMD 0x12 122 #define MEI_HBM_DMA_SETUP_RES_CMD 0x92 123 124 /* 125 * MEI Stop Reason 126 * used by hbm_host_stop_request.reason 127 */ 128 enum mei_stop_reason_types { 129 DRIVER_STOP_REQUEST = 0x00, 130 DEVICE_D1_ENTRY = 0x01, 131 DEVICE_D2_ENTRY = 0x02, 132 DEVICE_D3_ENTRY = 0x03, 133 SYSTEM_S1_ENTRY = 0x04, 134 SYSTEM_S2_ENTRY = 0x05, 135 SYSTEM_S3_ENTRY = 0x06, 136 SYSTEM_S4_ENTRY = 0x07, 137 SYSTEM_S5_ENTRY = 0x08 138 }; 139 140 141 /** 142 * enum mei_hbm_status - mei host bus messages return values 143 * 144 * @MEI_HBMS_SUCCESS : status success 145 * @MEI_HBMS_CLIENT_NOT_FOUND : client not found 146 * @MEI_HBMS_ALREADY_EXISTS : connection already established 147 * @MEI_HBMS_REJECTED : connection is rejected 148 * @MEI_HBMS_INVALID_PARAMETER : invalid parameter 149 * @MEI_HBMS_NOT_ALLOWED : operation not allowed 150 * @MEI_HBMS_ALREADY_STARTED : system is already started 151 * @MEI_HBMS_NOT_STARTED : system not started 152 * 153 * @MEI_HBMS_MAX : sentinel 154 */ 155 enum mei_hbm_status { 156 MEI_HBMS_SUCCESS = 0, 157 MEI_HBMS_CLIENT_NOT_FOUND = 1, 158 MEI_HBMS_ALREADY_EXISTS = 2, 159 MEI_HBMS_REJECTED = 3, 160 MEI_HBMS_INVALID_PARAMETER = 4, 161 MEI_HBMS_NOT_ALLOWED = 5, 162 MEI_HBMS_ALREADY_STARTED = 6, 163 MEI_HBMS_NOT_STARTED = 7, 164 165 MEI_HBMS_MAX 166 }; 167 168 169 /* 170 * Client Connect Status 171 * used by hbm_client_connect_response.status 172 */ 173 enum mei_cl_connect_status { 174 MEI_CL_CONN_SUCCESS = MEI_HBMS_SUCCESS, 175 MEI_CL_CONN_NOT_FOUND = MEI_HBMS_CLIENT_NOT_FOUND, 176 MEI_CL_CONN_ALREADY_STARTED = MEI_HBMS_ALREADY_EXISTS, 177 MEI_CL_CONN_OUT_OF_RESOURCES = MEI_HBMS_REJECTED, 178 MEI_CL_CONN_MESSAGE_SMALL = MEI_HBMS_INVALID_PARAMETER, 179 MEI_CL_CONN_NOT_ALLOWED = MEI_HBMS_NOT_ALLOWED, 180 }; 181 182 /* 183 * Client Disconnect Status 184 */ 185 enum mei_cl_disconnect_status { 186 MEI_CL_DISCONN_SUCCESS = MEI_HBMS_SUCCESS 187 }; 188 189 /** 190 * struct mei_msg_hdr - MEI BUS Interface Section 191 * 192 * @me_addr: device address 193 * @host_addr: host address 194 * @length: message length 195 * @reserved: reserved 196 * @dma_ring: message is on dma ring 197 * @internal: message is internal 198 * @msg_complete: last packet of the message 199 * @extension: extension of the header 200 */ 201 struct mei_msg_hdr { 202 u32 me_addr:8; 203 u32 host_addr:8; 204 u32 length:9; 205 u32 reserved:4; 206 u32 dma_ring:1; 207 u32 internal:1; 208 u32 msg_complete:1; 209 u32 extension[0]; 210 } __packed; 211 212 #define MEI_MSG_HDR_MAX 2 213 214 struct mei_bus_message { 215 u8 hbm_cmd; 216 u8 data[0]; 217 } __packed; 218 219 /** 220 * struct hbm_cl_cmd - client specific host bus command 221 * CONNECT, DISCONNECT, and FlOW CONTROL 222 * 223 * @hbm_cmd: bus message command header 224 * @me_addr: address of the client in ME 225 * @host_addr: address of the client in the driver 226 * @data: generic data 227 */ 228 struct mei_hbm_cl_cmd { 229 u8 hbm_cmd; 230 u8 me_addr; 231 u8 host_addr; 232 u8 data; 233 }; 234 235 struct hbm_version { 236 u8 minor_version; 237 u8 major_version; 238 } __packed; 239 240 struct hbm_host_version_request { 241 u8 hbm_cmd; 242 u8 reserved; 243 struct hbm_version host_version; 244 } __packed; 245 246 struct hbm_host_version_response { 247 u8 hbm_cmd; 248 u8 host_version_supported; 249 struct hbm_version me_max_version; 250 } __packed; 251 252 struct hbm_host_stop_request { 253 u8 hbm_cmd; 254 u8 reason; 255 u8 reserved[2]; 256 } __packed; 257 258 struct hbm_host_stop_response { 259 u8 hbm_cmd; 260 u8 reserved[3]; 261 } __packed; 262 263 struct hbm_me_stop_request { 264 u8 hbm_cmd; 265 u8 reason; 266 u8 reserved[2]; 267 } __packed; 268 269 /** 270 * enum hbm_host_enum_flags - enumeration request flags (HBM version >= 2.0) 271 * 272 * @MEI_HBM_ENUM_F_ALLOW_ADD: allow dynamic clients add 273 * @MEI_HBM_ENUM_F_IMMEDIATE_ENUM: allow FW to send answer immediately 274 */ 275 enum hbm_host_enum_flags { 276 MEI_HBM_ENUM_F_ALLOW_ADD = BIT(0), 277 MEI_HBM_ENUM_F_IMMEDIATE_ENUM = BIT(1), 278 }; 279 280 /** 281 * struct hbm_host_enum_request - enumeration request from host to fw 282 * 283 * @hbm_cmd : bus message command header 284 * @flags : request flags 285 * @reserved: reserved 286 */ 287 struct hbm_host_enum_request { 288 u8 hbm_cmd; 289 u8 flags; 290 u8 reserved[2]; 291 } __packed; 292 293 struct hbm_host_enum_response { 294 u8 hbm_cmd; 295 u8 reserved[3]; 296 u8 valid_addresses[32]; 297 } __packed; 298 299 struct mei_client_properties { 300 uuid_le protocol_name; 301 u8 protocol_version; 302 u8 max_number_of_connections; 303 u8 fixed_address; 304 u8 single_recv_buf:1; 305 u8 reserved:7; 306 u32 max_msg_length; 307 } __packed; 308 309 struct hbm_props_request { 310 u8 hbm_cmd; 311 u8 me_addr; 312 u8 reserved[2]; 313 } __packed; 314 315 struct hbm_props_response { 316 u8 hbm_cmd; 317 u8 me_addr; 318 u8 status; 319 u8 reserved[1]; 320 struct mei_client_properties client_properties; 321 } __packed; 322 323 /** 324 * struct hbm_add_client_request - request to add a client 325 * might be sent by fw after enumeration has already completed 326 * 327 * @hbm_cmd: bus message command header 328 * @me_addr: address of the client in ME 329 * @reserved: reserved 330 * @client_properties: client properties 331 */ 332 struct hbm_add_client_request { 333 u8 hbm_cmd; 334 u8 me_addr; 335 u8 reserved[2]; 336 struct mei_client_properties client_properties; 337 } __packed; 338 339 /** 340 * struct hbm_add_client_response - response to add a client 341 * sent by the host to report client addition status to fw 342 * 343 * @hbm_cmd: bus message command header 344 * @me_addr: address of the client in ME 345 * @status: if HBMS_SUCCESS then the client can now accept connections. 346 * @reserved: reserved 347 */ 348 struct hbm_add_client_response { 349 u8 hbm_cmd; 350 u8 me_addr; 351 u8 status; 352 u8 reserved[1]; 353 } __packed; 354 355 /** 356 * struct hbm_power_gate - power gate request/response 357 * 358 * @hbm_cmd: bus message command header 359 * @reserved: reserved 360 */ 361 struct hbm_power_gate { 362 u8 hbm_cmd; 363 u8 reserved[3]; 364 } __packed; 365 366 /** 367 * struct hbm_client_connect_request - connect/disconnect request 368 * 369 * @hbm_cmd: bus message command header 370 * @me_addr: address of the client in ME 371 * @host_addr: address of the client in the driver 372 * @reserved: reserved 373 */ 374 struct hbm_client_connect_request { 375 u8 hbm_cmd; 376 u8 me_addr; 377 u8 host_addr; 378 u8 reserved; 379 } __packed; 380 381 /** 382 * struct hbm_client_connect_response - connect/disconnect response 383 * 384 * @hbm_cmd: bus message command header 385 * @me_addr: address of the client in ME 386 * @host_addr: address of the client in the driver 387 * @status: status of the request 388 */ 389 struct hbm_client_connect_response { 390 u8 hbm_cmd; 391 u8 me_addr; 392 u8 host_addr; 393 u8 status; 394 } __packed; 395 396 397 #define MEI_FC_MESSAGE_RESERVED_LENGTH 5 398 399 struct hbm_flow_control { 400 u8 hbm_cmd; 401 u8 me_addr; 402 u8 host_addr; 403 u8 reserved[MEI_FC_MESSAGE_RESERVED_LENGTH]; 404 } __packed; 405 406 #define MEI_HBM_NOTIFICATION_START 1 407 #define MEI_HBM_NOTIFICATION_STOP 0 408 /** 409 * struct hbm_notification_request - start/stop notification request 410 * 411 * @hbm_cmd: bus message command header 412 * @me_addr: address of the client in ME 413 * @host_addr: address of the client in the driver 414 * @start: start = 1 or stop = 0 asynchronous notifications 415 */ 416 struct hbm_notification_request { 417 u8 hbm_cmd; 418 u8 me_addr; 419 u8 host_addr; 420 u8 start; 421 } __packed; 422 423 /** 424 * struct hbm_notification_response - start/stop notification response 425 * 426 * @hbm_cmd: bus message command header 427 * @me_addr: address of the client in ME 428 * @host_addr: - address of the client in the driver 429 * @status: (mei_hbm_status) response status for the request 430 * - MEI_HBMS_SUCCESS: successful stop/start 431 * - MEI_HBMS_CLIENT_NOT_FOUND: if the connection could not be found. 432 * - MEI_HBMS_ALREADY_STARTED: for start requests for a previously 433 * started notification. 434 * - MEI_HBMS_NOT_STARTED: for stop request for a connected client for whom 435 * asynchronous notifications are currently disabled. 436 * 437 * @start: start = 1 or stop = 0 asynchronous notifications 438 * @reserved: reserved 439 */ 440 struct hbm_notification_response { 441 u8 hbm_cmd; 442 u8 me_addr; 443 u8 host_addr; 444 u8 status; 445 u8 start; 446 u8 reserved[3]; 447 } __packed; 448 449 /** 450 * struct hbm_notification - notification event 451 * 452 * @hbm_cmd: bus message command header 453 * @me_addr: address of the client in ME 454 * @host_addr: address of the client in the driver 455 * @reserved: reserved for alignment 456 */ 457 struct hbm_notification { 458 u8 hbm_cmd; 459 u8 me_addr; 460 u8 host_addr; 461 u8 reserved[1]; 462 } __packed; 463 464 /** 465 * struct hbm_dma_mem_dscr - dma ring 466 * 467 * @addr_hi: the high 32bits of 64 bit address 468 * @addr_lo: the low 32bits of 64 bit address 469 * @size : size in bytes (must be power of 2) 470 */ 471 struct hbm_dma_mem_dscr { 472 u32 addr_hi; 473 u32 addr_lo; 474 u32 size; 475 } __packed; 476 477 enum { 478 DMA_DSCR_HOST = 0, 479 DMA_DSCR_DEVICE = 1, 480 DMA_DSCR_CTRL = 2, 481 DMA_DSCR_NUM, 482 }; 483 484 /** 485 * struct hbm_dma_setup_request - dma setup request 486 * 487 * @hbm_cmd: bus message command header 488 * @reserved: reserved for alignment 489 * @dma_dscr: dma descriptor for HOST, DEVICE, and CTRL 490 */ 491 struct hbm_dma_setup_request { 492 u8 hbm_cmd; 493 u8 reserved[3]; 494 struct hbm_dma_mem_dscr dma_dscr[DMA_DSCR_NUM]; 495 } __packed; 496 497 /** 498 * struct hbm_dma_setup_response - dma setup response 499 * 500 * @hbm_cmd: bus message command header 501 * @status: 0 on success; otherwise DMA setup failed. 502 * @reserved: reserved for alignment 503 */ 504 struct hbm_dma_setup_response { 505 u8 hbm_cmd; 506 u8 status; 507 u8 reserved[2]; 508 } __packed; 509 510 /** 511 * struct mei_dma_ring_ctrl - dma ring control block 512 * 513 * @hbuf_wr_idx: host circular buffer write index in slots 514 * @reserved1: reserved for alignment 515 * @hbuf_rd_idx: host circular buffer read index in slots 516 * @reserved2: reserved for alignment 517 * @dbuf_wr_idx: device circular buffer write index in slots 518 * @reserved3: reserved for alignment 519 * @dbuf_rd_idx: device circular buffer read index in slots 520 * @reserved4: reserved for alignment 521 */ 522 struct hbm_dma_ring_ctrl { 523 u32 hbuf_wr_idx; 524 u32 reserved1; 525 u32 hbuf_rd_idx; 526 u32 reserved2; 527 u32 dbuf_wr_idx; 528 u32 reserved3; 529 u32 dbuf_rd_idx; 530 u32 reserved4; 531 } __packed; 532 533 #endif 534