1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2003-2020, 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 2 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 /* 80 * MEI version with vm tag support 81 */ 82 #define HBM_MINOR_VERSION_VT 2 83 #define HBM_MAJOR_VERSION_VT 2 84 85 /* 86 * MEI version with capabilities message support 87 */ 88 #define HBM_MINOR_VERSION_CAP 2 89 #define HBM_MAJOR_VERSION_CAP 2 90 91 /* 92 * MEI version with client DMA support 93 */ 94 #define HBM_MINOR_VERSION_CD 2 95 #define HBM_MAJOR_VERSION_CD 2 96 97 /* Host bus message command opcode */ 98 #define MEI_HBM_CMD_OP_MSK 0x7f 99 /* Host bus message command RESPONSE */ 100 #define MEI_HBM_CMD_RES_MSK 0x80 101 102 /* 103 * MEI Bus Message Command IDs 104 */ 105 #define HOST_START_REQ_CMD 0x01 106 #define HOST_START_RES_CMD 0x81 107 108 #define HOST_STOP_REQ_CMD 0x02 109 #define HOST_STOP_RES_CMD 0x82 110 111 #define ME_STOP_REQ_CMD 0x03 112 113 #define HOST_ENUM_REQ_CMD 0x04 114 #define HOST_ENUM_RES_CMD 0x84 115 116 #define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05 117 #define HOST_CLIENT_PROPERTIES_RES_CMD 0x85 118 119 #define CLIENT_CONNECT_REQ_CMD 0x06 120 #define CLIENT_CONNECT_RES_CMD 0x86 121 122 #define CLIENT_DISCONNECT_REQ_CMD 0x07 123 #define CLIENT_DISCONNECT_RES_CMD 0x87 124 125 #define MEI_FLOW_CONTROL_CMD 0x08 126 127 #define MEI_PG_ISOLATION_ENTRY_REQ_CMD 0x0a 128 #define MEI_PG_ISOLATION_ENTRY_RES_CMD 0x8a 129 #define MEI_PG_ISOLATION_EXIT_REQ_CMD 0x0b 130 #define MEI_PG_ISOLATION_EXIT_RES_CMD 0x8b 131 132 #define MEI_HBM_ADD_CLIENT_REQ_CMD 0x0f 133 #define MEI_HBM_ADD_CLIENT_RES_CMD 0x8f 134 135 #define MEI_HBM_NOTIFY_REQ_CMD 0x10 136 #define MEI_HBM_NOTIFY_RES_CMD 0x90 137 #define MEI_HBM_NOTIFICATION_CMD 0x11 138 139 #define MEI_HBM_DMA_SETUP_REQ_CMD 0x12 140 #define MEI_HBM_DMA_SETUP_RES_CMD 0x92 141 142 #define MEI_HBM_CAPABILITIES_REQ_CMD 0x13 143 #define MEI_HBM_CAPABILITIES_RES_CMD 0x93 144 145 #define MEI_HBM_CLIENT_DMA_MAP_REQ_CMD 0x14 146 #define MEI_HBM_CLIENT_DMA_MAP_RES_CMD 0x94 147 148 #define MEI_HBM_CLIENT_DMA_UNMAP_REQ_CMD 0x15 149 #define MEI_HBM_CLIENT_DMA_UNMAP_RES_CMD 0x95 150 151 /* 152 * MEI Stop Reason 153 * used by hbm_host_stop_request.reason 154 */ 155 enum mei_stop_reason_types { 156 DRIVER_STOP_REQUEST = 0x00, 157 DEVICE_D1_ENTRY = 0x01, 158 DEVICE_D2_ENTRY = 0x02, 159 DEVICE_D3_ENTRY = 0x03, 160 SYSTEM_S1_ENTRY = 0x04, 161 SYSTEM_S2_ENTRY = 0x05, 162 SYSTEM_S3_ENTRY = 0x06, 163 SYSTEM_S4_ENTRY = 0x07, 164 SYSTEM_S5_ENTRY = 0x08 165 }; 166 167 168 /** 169 * enum mei_hbm_status - mei host bus messages return values 170 * 171 * @MEI_HBMS_SUCCESS : status success 172 * @MEI_HBMS_CLIENT_NOT_FOUND : client not found 173 * @MEI_HBMS_ALREADY_EXISTS : connection already established 174 * @MEI_HBMS_REJECTED : connection is rejected 175 * @MEI_HBMS_INVALID_PARAMETER : invalid parameter 176 * @MEI_HBMS_NOT_ALLOWED : operation not allowed 177 * @MEI_HBMS_ALREADY_STARTED : system is already started 178 * @MEI_HBMS_NOT_STARTED : system not started 179 * 180 * @MEI_HBMS_MAX : sentinel 181 */ 182 enum mei_hbm_status { 183 MEI_HBMS_SUCCESS = 0, 184 MEI_HBMS_CLIENT_NOT_FOUND = 1, 185 MEI_HBMS_ALREADY_EXISTS = 2, 186 MEI_HBMS_REJECTED = 3, 187 MEI_HBMS_INVALID_PARAMETER = 4, 188 MEI_HBMS_NOT_ALLOWED = 5, 189 MEI_HBMS_ALREADY_STARTED = 6, 190 MEI_HBMS_NOT_STARTED = 7, 191 192 MEI_HBMS_MAX 193 }; 194 195 196 /* 197 * Client Connect Status 198 * used by hbm_client_connect_response.status 199 */ 200 enum mei_cl_connect_status { 201 MEI_CL_CONN_SUCCESS = MEI_HBMS_SUCCESS, 202 MEI_CL_CONN_NOT_FOUND = MEI_HBMS_CLIENT_NOT_FOUND, 203 MEI_CL_CONN_ALREADY_STARTED = MEI_HBMS_ALREADY_EXISTS, 204 MEI_CL_CONN_OUT_OF_RESOURCES = MEI_HBMS_REJECTED, 205 MEI_CL_CONN_MESSAGE_SMALL = MEI_HBMS_INVALID_PARAMETER, 206 MEI_CL_CONN_NOT_ALLOWED = MEI_HBMS_NOT_ALLOWED, 207 }; 208 209 /* 210 * Client Disconnect Status 211 */ 212 enum mei_cl_disconnect_status { 213 MEI_CL_DISCONN_SUCCESS = MEI_HBMS_SUCCESS 214 }; 215 216 /** 217 * enum mei_ext_hdr_type - extended header type used in 218 * extended header TLV 219 * 220 * @MEI_EXT_HDR_NONE: sentinel 221 * @MEI_EXT_HDR_VTAG: vtag header 222 */ 223 enum mei_ext_hdr_type { 224 MEI_EXT_HDR_NONE = 0, 225 MEI_EXT_HDR_VTAG = 1, 226 }; 227 228 /** 229 * struct mei_ext_hdr - extend header descriptor (TLV) 230 * @type: enum mei_ext_hdr_type 231 * @length: length excluding descriptor 232 * @ext_payload: payload of the specific extended header 233 * @hdr: place holder for actual header 234 */ 235 struct mei_ext_hdr { 236 u8 type; 237 u8 length; 238 u8 ext_payload[2]; 239 u8 hdr[]; 240 }; 241 242 /** 243 * struct mei_ext_meta_hdr - extend header meta data 244 * @count: number of headers 245 * @size: total size of the extended header list excluding meta header 246 * @reserved: reserved 247 * @hdrs: extended headers TLV list 248 */ 249 struct mei_ext_meta_hdr { 250 u8 count; 251 u8 size; 252 u8 reserved[2]; 253 struct mei_ext_hdr hdrs[]; 254 }; 255 256 /* 257 * Extended header iterator functions 258 */ 259 /** 260 * mei_ext_hdr - extended header iterator begin 261 * 262 * @meta: meta header of the extended header list 263 * 264 * Return: 265 * The first extended header 266 */ 267 static inline struct mei_ext_hdr *mei_ext_begin(struct mei_ext_meta_hdr *meta) 268 { 269 return meta->hdrs; 270 } 271 272 /** 273 * mei_ext_last - check if the ext is the last one in the TLV list 274 * 275 * @meta: meta header of the extended header list 276 * @ext: a meta header on the list 277 * 278 * Return: true if ext is the last header on the list 279 */ 280 static inline bool mei_ext_last(struct mei_ext_meta_hdr *meta, 281 struct mei_ext_hdr *ext) 282 { 283 return (u8 *)ext >= (u8 *)meta + sizeof(*meta) + (meta->size * 4); 284 } 285 286 /** 287 *mei_ext_next - following extended header on the TLV list 288 * 289 * @ext: current extend header 290 * 291 * Context: The function does not check for the overflows, 292 * one should call mei_ext_last before. 293 * 294 * Return: The following extend header after @ext 295 */ 296 static inline struct mei_ext_hdr *mei_ext_next(struct mei_ext_hdr *ext) 297 { 298 return (struct mei_ext_hdr *)(ext->hdr + (ext->length * 4)); 299 } 300 301 /** 302 * struct mei_msg_hdr - MEI BUS Interface Section 303 * 304 * @me_addr: device address 305 * @host_addr: host address 306 * @length: message length 307 * @reserved: reserved 308 * @extended: message has extended header 309 * @dma_ring: message is on dma ring 310 * @internal: message is internal 311 * @msg_complete: last packet of the message 312 * @extension: extension of the header 313 */ 314 struct mei_msg_hdr { 315 u32 me_addr:8; 316 u32 host_addr:8; 317 u32 length:9; 318 u32 reserved:3; 319 u32 extended:1; 320 u32 dma_ring:1; 321 u32 internal:1; 322 u32 msg_complete:1; 323 u32 extension[]; 324 } __packed; 325 326 /* The length is up to 9 bits */ 327 #define MEI_MSG_MAX_LEN_MASK GENMASK(9, 0) 328 329 struct mei_bus_message { 330 u8 hbm_cmd; 331 u8 data[]; 332 } __packed; 333 334 /** 335 * struct hbm_cl_cmd - client specific host bus command 336 * CONNECT, DISCONNECT, and FlOW CONTROL 337 * 338 * @hbm_cmd: bus message command header 339 * @me_addr: address of the client in ME 340 * @host_addr: address of the client in the driver 341 * @data: generic data 342 */ 343 struct mei_hbm_cl_cmd { 344 u8 hbm_cmd; 345 u8 me_addr; 346 u8 host_addr; 347 u8 data; 348 }; 349 350 struct hbm_version { 351 u8 minor_version; 352 u8 major_version; 353 } __packed; 354 355 struct hbm_host_version_request { 356 u8 hbm_cmd; 357 u8 reserved; 358 struct hbm_version host_version; 359 } __packed; 360 361 struct hbm_host_version_response { 362 u8 hbm_cmd; 363 u8 host_version_supported; 364 struct hbm_version me_max_version; 365 } __packed; 366 367 struct hbm_host_stop_request { 368 u8 hbm_cmd; 369 u8 reason; 370 u8 reserved[2]; 371 } __packed; 372 373 struct hbm_host_stop_response { 374 u8 hbm_cmd; 375 u8 reserved[3]; 376 } __packed; 377 378 struct hbm_me_stop_request { 379 u8 hbm_cmd; 380 u8 reason; 381 u8 reserved[2]; 382 } __packed; 383 384 /** 385 * enum hbm_host_enum_flags - enumeration request flags (HBM version >= 2.0) 386 * 387 * @MEI_HBM_ENUM_F_ALLOW_ADD: allow dynamic clients add 388 * @MEI_HBM_ENUM_F_IMMEDIATE_ENUM: allow FW to send answer immediately 389 */ 390 enum hbm_host_enum_flags { 391 MEI_HBM_ENUM_F_ALLOW_ADD = BIT(0), 392 MEI_HBM_ENUM_F_IMMEDIATE_ENUM = BIT(1), 393 }; 394 395 /** 396 * struct hbm_host_enum_request - enumeration request from host to fw 397 * 398 * @hbm_cmd : bus message command header 399 * @flags : request flags 400 * @reserved: reserved 401 */ 402 struct hbm_host_enum_request { 403 u8 hbm_cmd; 404 u8 flags; 405 u8 reserved[2]; 406 } __packed; 407 408 struct hbm_host_enum_response { 409 u8 hbm_cmd; 410 u8 reserved[3]; 411 u8 valid_addresses[32]; 412 } __packed; 413 414 /** 415 * struct mei_client_properties - mei client properties 416 * 417 * @protocol_name: guid of the client 418 * @protocol_version: client protocol version 419 * @max_number_of_connections: number of possible connections. 420 * @fixed_address: fixed me address (0 if the client is dynamic) 421 * @single_recv_buf: 1 if all connections share a single receive buffer. 422 * @vt_supported: the client support vtag 423 * @reserved: reserved 424 * @max_msg_length: MTU of the client 425 */ 426 struct mei_client_properties { 427 uuid_le protocol_name; 428 u8 protocol_version; 429 u8 max_number_of_connections; 430 u8 fixed_address; 431 u8 single_recv_buf:1; 432 u8 vt_supported:1; 433 u8 reserved:6; 434 u32 max_msg_length; 435 } __packed; 436 437 struct hbm_props_request { 438 u8 hbm_cmd; 439 u8 me_addr; 440 u8 reserved[2]; 441 } __packed; 442 443 struct hbm_props_response { 444 u8 hbm_cmd; 445 u8 me_addr; 446 u8 status; 447 u8 reserved; 448 struct mei_client_properties client_properties; 449 } __packed; 450 451 /** 452 * struct hbm_add_client_request - request to add a client 453 * might be sent by fw after enumeration has already completed 454 * 455 * @hbm_cmd: bus message command header 456 * @me_addr: address of the client in ME 457 * @reserved: reserved 458 * @client_properties: client properties 459 */ 460 struct hbm_add_client_request { 461 u8 hbm_cmd; 462 u8 me_addr; 463 u8 reserved[2]; 464 struct mei_client_properties client_properties; 465 } __packed; 466 467 /** 468 * struct hbm_add_client_response - response to add a client 469 * sent by the host to report client addition status to fw 470 * 471 * @hbm_cmd: bus message command header 472 * @me_addr: address of the client in ME 473 * @status: if HBMS_SUCCESS then the client can now accept connections. 474 * @reserved: reserved 475 */ 476 struct hbm_add_client_response { 477 u8 hbm_cmd; 478 u8 me_addr; 479 u8 status; 480 u8 reserved; 481 } __packed; 482 483 /** 484 * struct hbm_power_gate - power gate request/response 485 * 486 * @hbm_cmd: bus message command header 487 * @reserved: reserved 488 */ 489 struct hbm_power_gate { 490 u8 hbm_cmd; 491 u8 reserved[3]; 492 } __packed; 493 494 /** 495 * struct hbm_client_connect_request - connect/disconnect request 496 * 497 * @hbm_cmd: bus message command header 498 * @me_addr: address of the client in ME 499 * @host_addr: address of the client in the driver 500 * @reserved: reserved 501 */ 502 struct hbm_client_connect_request { 503 u8 hbm_cmd; 504 u8 me_addr; 505 u8 host_addr; 506 u8 reserved; 507 } __packed; 508 509 /** 510 * struct hbm_client_connect_response - connect/disconnect response 511 * 512 * @hbm_cmd: bus message command header 513 * @me_addr: address of the client in ME 514 * @host_addr: address of the client in the driver 515 * @status: status of the request 516 */ 517 struct hbm_client_connect_response { 518 u8 hbm_cmd; 519 u8 me_addr; 520 u8 host_addr; 521 u8 status; 522 } __packed; 523 524 525 #define MEI_FC_MESSAGE_RESERVED_LENGTH 5 526 527 struct hbm_flow_control { 528 u8 hbm_cmd; 529 u8 me_addr; 530 u8 host_addr; 531 u8 reserved[MEI_FC_MESSAGE_RESERVED_LENGTH]; 532 } __packed; 533 534 #define MEI_HBM_NOTIFICATION_START 1 535 #define MEI_HBM_NOTIFICATION_STOP 0 536 /** 537 * struct hbm_notification_request - start/stop notification request 538 * 539 * @hbm_cmd: bus message command header 540 * @me_addr: address of the client in ME 541 * @host_addr: address of the client in the driver 542 * @start: start = 1 or stop = 0 asynchronous notifications 543 */ 544 struct hbm_notification_request { 545 u8 hbm_cmd; 546 u8 me_addr; 547 u8 host_addr; 548 u8 start; 549 } __packed; 550 551 /** 552 * struct hbm_notification_response - start/stop notification response 553 * 554 * @hbm_cmd: bus message command header 555 * @me_addr: address of the client in ME 556 * @host_addr: - address of the client in the driver 557 * @status: (mei_hbm_status) response status for the request 558 * - MEI_HBMS_SUCCESS: successful stop/start 559 * - MEI_HBMS_CLIENT_NOT_FOUND: if the connection could not be found. 560 * - MEI_HBMS_ALREADY_STARTED: for start requests for a previously 561 * started notification. 562 * - MEI_HBMS_NOT_STARTED: for stop request for a connected client for whom 563 * asynchronous notifications are currently disabled. 564 * 565 * @start: start = 1 or stop = 0 asynchronous notifications 566 * @reserved: reserved 567 */ 568 struct hbm_notification_response { 569 u8 hbm_cmd; 570 u8 me_addr; 571 u8 host_addr; 572 u8 status; 573 u8 start; 574 u8 reserved[3]; 575 } __packed; 576 577 /** 578 * struct hbm_notification - notification event 579 * 580 * @hbm_cmd: bus message command header 581 * @me_addr: address of the client in ME 582 * @host_addr: address of the client in the driver 583 * @reserved: reserved for alignment 584 */ 585 struct hbm_notification { 586 u8 hbm_cmd; 587 u8 me_addr; 588 u8 host_addr; 589 u8 reserved; 590 } __packed; 591 592 /** 593 * struct hbm_dma_mem_dscr - dma ring 594 * 595 * @addr_hi: the high 32bits of 64 bit address 596 * @addr_lo: the low 32bits of 64 bit address 597 * @size : size in bytes (must be power of 2) 598 */ 599 struct hbm_dma_mem_dscr { 600 u32 addr_hi; 601 u32 addr_lo; 602 u32 size; 603 } __packed; 604 605 enum { 606 DMA_DSCR_HOST = 0, 607 DMA_DSCR_DEVICE = 1, 608 DMA_DSCR_CTRL = 2, 609 DMA_DSCR_NUM, 610 }; 611 612 /** 613 * struct hbm_dma_setup_request - dma setup request 614 * 615 * @hbm_cmd: bus message command header 616 * @reserved: reserved for alignment 617 * @dma_dscr: dma descriptor for HOST, DEVICE, and CTRL 618 */ 619 struct hbm_dma_setup_request { 620 u8 hbm_cmd; 621 u8 reserved[3]; 622 struct hbm_dma_mem_dscr dma_dscr[DMA_DSCR_NUM]; 623 } __packed; 624 625 /** 626 * struct hbm_dma_setup_response - dma setup response 627 * 628 * @hbm_cmd: bus message command header 629 * @status: 0 on success; otherwise DMA setup failed. 630 * @reserved: reserved for alignment 631 */ 632 struct hbm_dma_setup_response { 633 u8 hbm_cmd; 634 u8 status; 635 u8 reserved[2]; 636 } __packed; 637 638 /** 639 * struct mei_dma_ring_ctrl - dma ring control block 640 * 641 * @hbuf_wr_idx: host circular buffer write index in slots 642 * @reserved1: reserved for alignment 643 * @hbuf_rd_idx: host circular buffer read index in slots 644 * @reserved2: reserved for alignment 645 * @dbuf_wr_idx: device circular buffer write index in slots 646 * @reserved3: reserved for alignment 647 * @dbuf_rd_idx: device circular buffer read index in slots 648 * @reserved4: reserved for alignment 649 */ 650 struct hbm_dma_ring_ctrl { 651 u32 hbuf_wr_idx; 652 u32 reserved1; 653 u32 hbuf_rd_idx; 654 u32 reserved2; 655 u32 dbuf_wr_idx; 656 u32 reserved3; 657 u32 dbuf_rd_idx; 658 u32 reserved4; 659 } __packed; 660 661 /* virtual tag supported */ 662 #define HBM_CAP_VT BIT(0) 663 /* client dma supported */ 664 #define HBM_CAP_CD BIT(2) 665 666 /** 667 * struct hbm_capability_request - capability request from host to fw 668 * 669 * @hbm_cmd : bus message command header 670 * @capability_requested: bitmask of capabilities requested by host 671 */ 672 struct hbm_capability_request { 673 u8 hbm_cmd; 674 u8 capability_requested[3]; 675 } __packed; 676 677 /** 678 * struct hbm_capability_response - capability response from fw to host 679 * 680 * @hbm_cmd : bus message command header 681 * @capability_granted: bitmask of capabilities granted by FW 682 */ 683 struct hbm_capability_response { 684 u8 hbm_cmd; 685 u8 capability_granted[3]; 686 } __packed; 687 688 /** 689 * struct hbm_client_dma_map_request - client dma map request from host to fw 690 * 691 * @hbm_cmd: bus message command header 692 * @client_buffer_id: client buffer id 693 * @reserved: reserved 694 * @address_lsb: DMA address LSB 695 * @address_msb: DMA address MSB 696 * @size: DMA size 697 */ 698 struct hbm_client_dma_map_request { 699 u8 hbm_cmd; 700 u8 client_buffer_id; 701 u8 reserved[2]; 702 u32 address_lsb; 703 u32 address_msb; 704 u32 size; 705 } __packed; 706 707 /** 708 * struct hbm_client_dma_unmap_request 709 * client dma unmap request from the host to the firmware 710 * 711 * @hbm_cmd: bus message command header 712 * @status: unmap status 713 * @client_buffer_id: client buffer id 714 * @reserved: reserved 715 */ 716 struct hbm_client_dma_unmap_request { 717 u8 hbm_cmd; 718 u8 status; 719 u8 client_buffer_id; 720 u8 reserved; 721 } __packed; 722 723 /** 724 * struct hbm_client_dma_response 725 * client dma unmap response from the firmware to the host 726 * 727 * @hbm_cmd: bus message command header 728 * @status: command status 729 */ 730 struct hbm_client_dma_response { 731 u8 hbm_cmd; 732 u8 status; 733 } __packed; 734 735 #endif 736