19fff0425STomas Winkler /* SPDX-License-Identifier: GPL-2.0 */ 2ffc2825cSGreg Kroah-Hartman /* 392ca3dd4STomas Winkler * Copyright (c) 2003-2020, Intel Corporation. All rights reserved 4ffc2825cSGreg Kroah-Hartman * Intel Management Engine Interface (Intel MEI) Linux driver 5ffc2825cSGreg Kroah-Hartman */ 6ffc2825cSGreg Kroah-Hartman 7ffc2825cSGreg Kroah-Hartman #ifndef _MEI_HW_TYPES_H_ 8ffc2825cSGreg Kroah-Hartman #define _MEI_HW_TYPES_H_ 9ffc2825cSGreg Kroah-Hartman 10ffc2825cSGreg Kroah-Hartman #include <linux/uuid.h> 11ffc2825cSGreg Kroah-Hartman 12ffc2825cSGreg Kroah-Hartman /* 133870c320STomas Winkler * Timeouts in Seconds 14ffc2825cSGreg Kroah-Hartman */ 157d93e58dSTomas Winkler #define MEI_HW_READY_TIMEOUT 2 /* Timeout on ready message */ 163870c320STomas Winkler #define MEI_CONNECT_TIMEOUT 3 /* HPS: at least 2 seconds */ 17ffc2825cSGreg Kroah-Hartman 183870c320STomas Winkler #define MEI_CL_CONNECT_TIMEOUT 15 /* HPS: Client Connect Timeout */ 193870c320STomas Winkler #define MEI_CLIENTS_INIT_TIMEOUT 15 /* HPS: Clients Enumeration Timeout */ 20ffc2825cSGreg Kroah-Hartman 21ba9cdd0eSTomas Winkler #define MEI_PGI_TIMEOUT 1 /* PG Isolation time response 1 sec */ 22859ef2ffSAlexander Usyskin #define MEI_D0I3_TIMEOUT 5 /* D0i3 set/unset max response time */ 237d93e58dSTomas Winkler #define MEI_HBM_TIMEOUT 1 /* 1 second */ 24ffc2825cSGreg Kroah-Hartman 25ffc2825cSGreg Kroah-Hartman /* 26ffc2825cSGreg Kroah-Hartman * MEI Version 27ffc2825cSGreg Kroah-Hartman */ 28d2227583SAlexander Usyskin #define HBM_MINOR_VERSION 1 29155718cfSTomas Winkler #define HBM_MAJOR_VERSION 2 30ffc2825cSGreg Kroah-Hartman 31ee7e5afdSTomas Winkler /* 32ee7e5afdSTomas Winkler * MEI version with PGI support 33ee7e5afdSTomas Winkler */ 34ee7e5afdSTomas Winkler #define HBM_MINOR_VERSION_PGI 1 35ee7e5afdSTomas Winkler #define HBM_MAJOR_VERSION_PGI 1 36ee7e5afdSTomas Winkler 3770ef835cSTomas Winkler /* 3870ef835cSTomas Winkler * MEI version with Dynamic clients support 3970ef835cSTomas Winkler */ 4070ef835cSTomas Winkler #define HBM_MINOR_VERSION_DC 0 4170ef835cSTomas Winkler #define HBM_MAJOR_VERSION_DC 2 4270ef835cSTomas Winkler 4318901357SAlexander Usyskin /* 4427f476eaSAlexander Usyskin * MEI version with immediate reply to enum request support 4527f476eaSAlexander Usyskin */ 4627f476eaSAlexander Usyskin #define HBM_MINOR_VERSION_IE 0 4727f476eaSAlexander Usyskin #define HBM_MAJOR_VERSION_IE 2 4827f476eaSAlexander Usyskin 4927f476eaSAlexander Usyskin /* 5018901357SAlexander Usyskin * MEI version with disconnect on connection timeout support 5118901357SAlexander Usyskin */ 5218901357SAlexander Usyskin #define HBM_MINOR_VERSION_DOT 0 5318901357SAlexander Usyskin #define HBM_MAJOR_VERSION_DOT 2 5418901357SAlexander Usyskin 554d99877dSTomas Winkler /* 56b6a38565STomas Winkler * MEI version with notification support 574d99877dSTomas Winkler */ 584d99877dSTomas Winkler #define HBM_MINOR_VERSION_EV 0 594d99877dSTomas Winkler #define HBM_MAJOR_VERSION_EV 2 604d99877dSTomas Winkler 61f4e06246SAlexander Usyskin /* 62f4e06246SAlexander Usyskin * MEI version with fixed address client support 63f4e06246SAlexander Usyskin */ 64f4e06246SAlexander Usyskin #define HBM_MINOR_VERSION_FA 0 65f4e06246SAlexander Usyskin #define HBM_MAJOR_VERSION_FA 2 66f4e06246SAlexander Usyskin 677ee7f45aSAlexander Usyskin /* 687ee7f45aSAlexander Usyskin * MEI version with OS ver message support 697ee7f45aSAlexander Usyskin */ 707ee7f45aSAlexander Usyskin #define HBM_MINOR_VERSION_OS 0 717ee7f45aSAlexander Usyskin #define HBM_MAJOR_VERSION_OS 2 727ee7f45aSAlexander Usyskin 73c2bd9fc1STomas Winkler /* 74c2bd9fc1STomas Winkler * MEI version with dma ring support 75c2bd9fc1STomas Winkler */ 76c2bd9fc1STomas Winkler #define HBM_MINOR_VERSION_DR 1 77c2bd9fc1STomas Winkler #define HBM_MAJOR_VERSION_DR 2 78c2bd9fc1STomas Winkler 79e5cab1f9SAlexander Usyskin /* 80beb4e1e5SAlexander Usyskin * MEI version with vm tag support 81beb4e1e5SAlexander Usyskin */ 82beb4e1e5SAlexander Usyskin #define HBM_MINOR_VERSION_VT 2 83beb4e1e5SAlexander Usyskin #define HBM_MAJOR_VERSION_VT 2 84beb4e1e5SAlexander Usyskin 85beb4e1e5SAlexander Usyskin /* 86e5cab1f9SAlexander Usyskin * MEI version with capabilities message support 87e5cab1f9SAlexander Usyskin */ 88e5cab1f9SAlexander Usyskin #define HBM_MINOR_VERSION_CAP 2 89e5cab1f9SAlexander Usyskin #define HBM_MAJOR_VERSION_CAP 2 90e5cab1f9SAlexander Usyskin 91ffc2825cSGreg Kroah-Hartman /* Host bus message command opcode */ 92ffc2825cSGreg Kroah-Hartman #define MEI_HBM_CMD_OP_MSK 0x7f 93ffc2825cSGreg Kroah-Hartman /* Host bus message command RESPONSE */ 94ffc2825cSGreg Kroah-Hartman #define MEI_HBM_CMD_RES_MSK 0x80 95ffc2825cSGreg Kroah-Hartman 96ffc2825cSGreg Kroah-Hartman /* 97ffc2825cSGreg Kroah-Hartman * MEI Bus Message Command IDs 98ffc2825cSGreg Kroah-Hartman */ 99ffc2825cSGreg Kroah-Hartman #define HOST_START_REQ_CMD 0x01 100ffc2825cSGreg Kroah-Hartman #define HOST_START_RES_CMD 0x81 101ffc2825cSGreg Kroah-Hartman 102ffc2825cSGreg Kroah-Hartman #define HOST_STOP_REQ_CMD 0x02 103ffc2825cSGreg Kroah-Hartman #define HOST_STOP_RES_CMD 0x82 104ffc2825cSGreg Kroah-Hartman 105ffc2825cSGreg Kroah-Hartman #define ME_STOP_REQ_CMD 0x03 106ffc2825cSGreg Kroah-Hartman 107ffc2825cSGreg Kroah-Hartman #define HOST_ENUM_REQ_CMD 0x04 108ffc2825cSGreg Kroah-Hartman #define HOST_ENUM_RES_CMD 0x84 109ffc2825cSGreg Kroah-Hartman 110ffc2825cSGreg Kroah-Hartman #define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05 111ffc2825cSGreg Kroah-Hartman #define HOST_CLIENT_PROPERTIES_RES_CMD 0x85 112ffc2825cSGreg Kroah-Hartman 113ffc2825cSGreg Kroah-Hartman #define CLIENT_CONNECT_REQ_CMD 0x06 114ffc2825cSGreg Kroah-Hartman #define CLIENT_CONNECT_RES_CMD 0x86 115ffc2825cSGreg Kroah-Hartman 116ffc2825cSGreg Kroah-Hartman #define CLIENT_DISCONNECT_REQ_CMD 0x07 117ffc2825cSGreg Kroah-Hartman #define CLIENT_DISCONNECT_RES_CMD 0x87 118ffc2825cSGreg Kroah-Hartman 119ffc2825cSGreg Kroah-Hartman #define MEI_FLOW_CONTROL_CMD 0x08 120ffc2825cSGreg Kroah-Hartman 1214fcbc99bSTomas Winkler #define MEI_PG_ISOLATION_ENTRY_REQ_CMD 0x0a 1224fcbc99bSTomas Winkler #define MEI_PG_ISOLATION_ENTRY_RES_CMD 0x8a 1234fcbc99bSTomas Winkler #define MEI_PG_ISOLATION_EXIT_REQ_CMD 0x0b 1244fcbc99bSTomas Winkler #define MEI_PG_ISOLATION_EXIT_RES_CMD 0x8b 1254fcbc99bSTomas Winkler 12670ef835cSTomas Winkler #define MEI_HBM_ADD_CLIENT_REQ_CMD 0x0f 12770ef835cSTomas Winkler #define MEI_HBM_ADD_CLIENT_RES_CMD 0x8f 128d3c1c809STomas Winkler 129d3c1c809STomas Winkler #define MEI_HBM_NOTIFY_REQ_CMD 0x10 130d3c1c809STomas Winkler #define MEI_HBM_NOTIFY_RES_CMD 0x90 131d3c1c809STomas Winkler #define MEI_HBM_NOTIFICATION_CMD 0x11 132d3c1c809STomas Winkler 133ee7aba5aSTomas Winkler #define MEI_HBM_DMA_SETUP_REQ_CMD 0x12 134ee7aba5aSTomas Winkler #define MEI_HBM_DMA_SETUP_RES_CMD 0x92 135ee7aba5aSTomas Winkler 136e5cab1f9SAlexander Usyskin #define MEI_HBM_CAPABILITIES_REQ_CMD 0x13 137e5cab1f9SAlexander Usyskin #define MEI_HBM_CAPABILITIES_RES_CMD 0x93 138e5cab1f9SAlexander Usyskin 139ffc2825cSGreg Kroah-Hartman /* 140ffc2825cSGreg Kroah-Hartman * MEI Stop Reason 141ffc2825cSGreg Kroah-Hartman * used by hbm_host_stop_request.reason 142ffc2825cSGreg Kroah-Hartman */ 143ffc2825cSGreg Kroah-Hartman enum mei_stop_reason_types { 144ffc2825cSGreg Kroah-Hartman DRIVER_STOP_REQUEST = 0x00, 145ffc2825cSGreg Kroah-Hartman DEVICE_D1_ENTRY = 0x01, 146ffc2825cSGreg Kroah-Hartman DEVICE_D2_ENTRY = 0x02, 147ffc2825cSGreg Kroah-Hartman DEVICE_D3_ENTRY = 0x03, 148ffc2825cSGreg Kroah-Hartman SYSTEM_S1_ENTRY = 0x04, 149ffc2825cSGreg Kroah-Hartman SYSTEM_S2_ENTRY = 0x05, 150ffc2825cSGreg Kroah-Hartman SYSTEM_S3_ENTRY = 0x06, 151ffc2825cSGreg Kroah-Hartman SYSTEM_S4_ENTRY = 0x07, 152ffc2825cSGreg Kroah-Hartman SYSTEM_S5_ENTRY = 0x08 153ffc2825cSGreg Kroah-Hartman }; 154ffc2825cSGreg Kroah-Hartman 15589778d6eSTomas Winkler 15689778d6eSTomas Winkler /** 157a8605ea2SAlexander Usyskin * enum mei_hbm_status - mei host bus messages return values 15889778d6eSTomas Winkler * 159a8605ea2SAlexander Usyskin * @MEI_HBMS_SUCCESS : status success 160a8605ea2SAlexander Usyskin * @MEI_HBMS_CLIENT_NOT_FOUND : client not found 161a8605ea2SAlexander Usyskin * @MEI_HBMS_ALREADY_EXISTS : connection already established 162a8605ea2SAlexander Usyskin * @MEI_HBMS_REJECTED : connection is rejected 163a8605ea2SAlexander Usyskin * @MEI_HBMS_INVALID_PARAMETER : invalid parameter 164a8605ea2SAlexander Usyskin * @MEI_HBMS_NOT_ALLOWED : operation not allowed 165a8605ea2SAlexander Usyskin * @MEI_HBMS_ALREADY_STARTED : system is already started 166a8605ea2SAlexander Usyskin * @MEI_HBMS_NOT_STARTED : system not started 167ce23139cSAlexander Usyskin * 168ce23139cSAlexander Usyskin * @MEI_HBMS_MAX : sentinel 16989778d6eSTomas Winkler */ 17089778d6eSTomas Winkler enum mei_hbm_status { 17189778d6eSTomas Winkler MEI_HBMS_SUCCESS = 0, 17289778d6eSTomas Winkler MEI_HBMS_CLIENT_NOT_FOUND = 1, 17389778d6eSTomas Winkler MEI_HBMS_ALREADY_EXISTS = 2, 17489778d6eSTomas Winkler MEI_HBMS_REJECTED = 3, 17589778d6eSTomas Winkler MEI_HBMS_INVALID_PARAMETER = 4, 17689778d6eSTomas Winkler MEI_HBMS_NOT_ALLOWED = 5, 17789778d6eSTomas Winkler MEI_HBMS_ALREADY_STARTED = 6, 17889778d6eSTomas Winkler MEI_HBMS_NOT_STARTED = 7, 17989778d6eSTomas Winkler 18089778d6eSTomas Winkler MEI_HBMS_MAX 18189778d6eSTomas Winkler }; 18289778d6eSTomas Winkler 18389778d6eSTomas Winkler 184ffc2825cSGreg Kroah-Hartman /* 185ffc2825cSGreg Kroah-Hartman * Client Connect Status 186ffc2825cSGreg Kroah-Hartman * used by hbm_client_connect_response.status 187ffc2825cSGreg Kroah-Hartman */ 188285e2996SAlexander Usyskin enum mei_cl_connect_status { 18989778d6eSTomas Winkler MEI_CL_CONN_SUCCESS = MEI_HBMS_SUCCESS, 19089778d6eSTomas Winkler MEI_CL_CONN_NOT_FOUND = MEI_HBMS_CLIENT_NOT_FOUND, 19189778d6eSTomas Winkler MEI_CL_CONN_ALREADY_STARTED = MEI_HBMS_ALREADY_EXISTS, 19289778d6eSTomas Winkler MEI_CL_CONN_OUT_OF_RESOURCES = MEI_HBMS_REJECTED, 19389778d6eSTomas Winkler MEI_CL_CONN_MESSAGE_SMALL = MEI_HBMS_INVALID_PARAMETER, 19471e117f2SAlexander Usyskin MEI_CL_CONN_NOT_ALLOWED = MEI_HBMS_NOT_ALLOWED, 195ffc2825cSGreg Kroah-Hartman }; 196ffc2825cSGreg Kroah-Hartman 197ffc2825cSGreg Kroah-Hartman /* 198ffc2825cSGreg Kroah-Hartman * Client Disconnect Status 199ffc2825cSGreg Kroah-Hartman */ 200285e2996SAlexander Usyskin enum mei_cl_disconnect_status { 20189778d6eSTomas Winkler MEI_CL_DISCONN_SUCCESS = MEI_HBMS_SUCCESS 202ffc2825cSGreg Kroah-Hartman }; 203ffc2825cSGreg Kroah-Hartman 2049d89ddfcSTomas Winkler /** 2050cd7c01aSTomas Winkler * enum mei_ext_hdr_type - extended header type used in 2060cd7c01aSTomas Winkler * extended header TLV 2070cd7c01aSTomas Winkler * 2080cd7c01aSTomas Winkler * @MEI_EXT_HDR_NONE: sentinel 2090cd7c01aSTomas Winkler * @MEI_EXT_HDR_VTAG: vtag header 2100cd7c01aSTomas Winkler */ 2110cd7c01aSTomas Winkler enum mei_ext_hdr_type { 2120cd7c01aSTomas Winkler MEI_EXT_HDR_NONE = 0, 2130cd7c01aSTomas Winkler MEI_EXT_HDR_VTAG = 1, 2140cd7c01aSTomas Winkler }; 2150cd7c01aSTomas Winkler 2160cd7c01aSTomas Winkler /** 2170cd7c01aSTomas Winkler * struct mei_ext_hdr - extend header descriptor (TLV) 2180cd7c01aSTomas Winkler * @type: enum mei_ext_hdr_type 2190cd7c01aSTomas Winkler * @length: length excluding descriptor 2200cd7c01aSTomas Winkler * @ext_payload: payload of the specific extended header 2210cd7c01aSTomas Winkler * @hdr: place holder for actual header 2220cd7c01aSTomas Winkler */ 2230cd7c01aSTomas Winkler struct mei_ext_hdr { 2240cd7c01aSTomas Winkler u8 type; 2250cd7c01aSTomas Winkler u8 length; 2260cd7c01aSTomas Winkler u8 ext_payload[2]; 2270cd7c01aSTomas Winkler u8 hdr[0]; 2280cd7c01aSTomas Winkler }; 2290cd7c01aSTomas Winkler 2300cd7c01aSTomas Winkler /** 2310cd7c01aSTomas Winkler * struct mei_ext_meta_hdr - extend header meta data 2320cd7c01aSTomas Winkler * @count: number of headers 2330cd7c01aSTomas Winkler * @size: total size of the extended header list excluding meta header 2340cd7c01aSTomas Winkler * @reserved: reserved 2350cd7c01aSTomas Winkler * @hdrs: extended headers TLV list 2360cd7c01aSTomas Winkler */ 2370cd7c01aSTomas Winkler struct mei_ext_meta_hdr { 2380cd7c01aSTomas Winkler u8 count; 2390cd7c01aSTomas Winkler u8 size; 2400cd7c01aSTomas Winkler u8 reserved[2]; 2410cd7c01aSTomas Winkler struct mei_ext_hdr hdrs[0]; 2420cd7c01aSTomas Winkler }; 2430cd7c01aSTomas Winkler 2440cd7c01aSTomas Winkler /* 2450cd7c01aSTomas Winkler * Extended header iterator functions 2460cd7c01aSTomas Winkler */ 2470cd7c01aSTomas Winkler /** 2480cd7c01aSTomas Winkler * mei_ext_hdr - extended header iterator begin 2490cd7c01aSTomas Winkler * 2500cd7c01aSTomas Winkler * @meta: meta header of the extended header list 2510cd7c01aSTomas Winkler * 2520cd7c01aSTomas Winkler * Return: 2530cd7c01aSTomas Winkler * The first extended header 2540cd7c01aSTomas Winkler */ 2550cd7c01aSTomas Winkler static inline struct mei_ext_hdr *mei_ext_begin(struct mei_ext_meta_hdr *meta) 2560cd7c01aSTomas Winkler { 2570cd7c01aSTomas Winkler return meta->hdrs; 2580cd7c01aSTomas Winkler } 2590cd7c01aSTomas Winkler 2600cd7c01aSTomas Winkler /** 2610cd7c01aSTomas Winkler * mei_ext_last - check if the ext is the last one in the TLV list 2620cd7c01aSTomas Winkler * 2630cd7c01aSTomas Winkler * @meta: meta header of the extended header list 2640cd7c01aSTomas Winkler * @ext: a meta header on the list 2650cd7c01aSTomas Winkler * 2660cd7c01aSTomas Winkler * Return: true if ext is the last header on the list 2670cd7c01aSTomas Winkler */ 2680cd7c01aSTomas Winkler static inline bool mei_ext_last(struct mei_ext_meta_hdr *meta, 2690cd7c01aSTomas Winkler struct mei_ext_hdr *ext) 2700cd7c01aSTomas Winkler { 2710cd7c01aSTomas Winkler return (u8 *)ext >= (u8 *)meta + sizeof(*meta) + (meta->size * 4); 2720cd7c01aSTomas Winkler } 2730cd7c01aSTomas Winkler 2740cd7c01aSTomas Winkler /** 2750cd7c01aSTomas Winkler *mei_ext_next - following extended header on the TLV list 2760cd7c01aSTomas Winkler * 2770cd7c01aSTomas Winkler * @ext: current extend header 2780cd7c01aSTomas Winkler * 2790cd7c01aSTomas Winkler * Context: The function does not check for the overflows, 2800cd7c01aSTomas Winkler * one should call mei_ext_last before. 2810cd7c01aSTomas Winkler * 2820cd7c01aSTomas Winkler * Return: The following extend header after @ext 2830cd7c01aSTomas Winkler */ 2840cd7c01aSTomas Winkler static inline struct mei_ext_hdr *mei_ext_next(struct mei_ext_hdr *ext) 2850cd7c01aSTomas Winkler { 2860cd7c01aSTomas Winkler return (struct mei_ext_hdr *)(ext->hdr + (ext->length * 4)); 2870cd7c01aSTomas Winkler } 2880cd7c01aSTomas Winkler 2890cd7c01aSTomas Winkler /** 2909d89ddfcSTomas Winkler * struct mei_msg_hdr - MEI BUS Interface Section 2919d89ddfcSTomas Winkler * 2929d89ddfcSTomas Winkler * @me_addr: device address 2939d89ddfcSTomas Winkler * @host_addr: host address 2949d89ddfcSTomas Winkler * @length: message length 2959d89ddfcSTomas Winkler * @reserved: reserved 2960cd7c01aSTomas Winkler * @extended: message has extended header 2979d89ddfcSTomas Winkler * @dma_ring: message is on dma ring 2989d89ddfcSTomas Winkler * @internal: message is internal 2999d89ddfcSTomas Winkler * @msg_complete: last packet of the message 3006316321fSTomas Winkler * @extension: extension of the header 301ffc2825cSGreg Kroah-Hartman */ 302ffc2825cSGreg Kroah-Hartman struct mei_msg_hdr { 303ffc2825cSGreg Kroah-Hartman u32 me_addr:8; 304ffc2825cSGreg Kroah-Hartman u32 host_addr:8; 305ffc2825cSGreg Kroah-Hartman u32 length:9; 3060cd7c01aSTomas Winkler u32 reserved:3; 3070cd7c01aSTomas Winkler u32 extended:1; 3089d89ddfcSTomas Winkler u32 dma_ring:1; 309479327fcSTomas Winkler u32 internal:1; 310ffc2825cSGreg Kroah-Hartman u32 msg_complete:1; 3116316321fSTomas Winkler u32 extension[0]; 312ffc2825cSGreg Kroah-Hartman } __packed; 313ffc2825cSGreg Kroah-Hartman 3143aef021bSTomas Winkler /* The length is up to 9 bits */ 3153aef021bSTomas Winkler #define MEI_MSG_MAX_LEN_MASK GENMASK(9, 0) 3163aef021bSTomas Winkler 317ffc2825cSGreg Kroah-Hartman struct mei_bus_message { 318ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 319f490e8aeSGustavo A. R. Silva u8 data[]; 320ffc2825cSGreg Kroah-Hartman } __packed; 321ffc2825cSGreg Kroah-Hartman 322cd51ed64STomas Winkler /** 323cd51ed64STomas Winkler * struct hbm_cl_cmd - client specific host bus command 324cd51ed64STomas Winkler * CONNECT, DISCONNECT, and FlOW CONTROL 325cd51ed64STomas Winkler * 326a8605ea2SAlexander Usyskin * @hbm_cmd: bus message command header 327a8605ea2SAlexander Usyskin * @me_addr: address of the client in ME 328a8605ea2SAlexander Usyskin * @host_addr: address of the client in the driver 329a8605ea2SAlexander Usyskin * @data: generic data 330cd51ed64STomas Winkler */ 331cd51ed64STomas Winkler struct mei_hbm_cl_cmd { 332cd51ed64STomas Winkler u8 hbm_cmd; 333cd51ed64STomas Winkler u8 me_addr; 334cd51ed64STomas Winkler u8 host_addr; 335cd51ed64STomas Winkler u8 data; 336cd51ed64STomas Winkler }; 337cd51ed64STomas Winkler 338ffc2825cSGreg Kroah-Hartman struct hbm_version { 339ffc2825cSGreg Kroah-Hartman u8 minor_version; 340ffc2825cSGreg Kroah-Hartman u8 major_version; 341ffc2825cSGreg Kroah-Hartman } __packed; 342ffc2825cSGreg Kroah-Hartman 343ffc2825cSGreg Kroah-Hartman struct hbm_host_version_request { 344ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 345ffc2825cSGreg Kroah-Hartman u8 reserved; 346ffc2825cSGreg Kroah-Hartman struct hbm_version host_version; 347ffc2825cSGreg Kroah-Hartman } __packed; 348ffc2825cSGreg Kroah-Hartman 349ffc2825cSGreg Kroah-Hartman struct hbm_host_version_response { 350ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 351ffc2825cSGreg Kroah-Hartman u8 host_version_supported; 352ffc2825cSGreg Kroah-Hartman struct hbm_version me_max_version; 353ffc2825cSGreg Kroah-Hartman } __packed; 354ffc2825cSGreg Kroah-Hartman 355ffc2825cSGreg Kroah-Hartman struct hbm_host_stop_request { 356ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 357ffc2825cSGreg Kroah-Hartman u8 reason; 358ffc2825cSGreg Kroah-Hartman u8 reserved[2]; 359ffc2825cSGreg Kroah-Hartman } __packed; 360ffc2825cSGreg Kroah-Hartman 361ffc2825cSGreg Kroah-Hartman struct hbm_host_stop_response { 362ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 363ffc2825cSGreg Kroah-Hartman u8 reserved[3]; 364ffc2825cSGreg Kroah-Hartman } __packed; 365ffc2825cSGreg Kroah-Hartman 366ffc2825cSGreg Kroah-Hartman struct hbm_me_stop_request { 367ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 368ffc2825cSGreg Kroah-Hartman u8 reason; 369ffc2825cSGreg Kroah-Hartman u8 reserved[2]; 370ffc2825cSGreg Kroah-Hartman } __packed; 371ffc2825cSGreg Kroah-Hartman 37270ef835cSTomas Winkler /** 37327f476eaSAlexander Usyskin * enum hbm_host_enum_flags - enumeration request flags (HBM version >= 2.0) 37427f476eaSAlexander Usyskin * 37527f476eaSAlexander Usyskin * @MEI_HBM_ENUM_F_ALLOW_ADD: allow dynamic clients add 37627f476eaSAlexander Usyskin * @MEI_HBM_ENUM_F_IMMEDIATE_ENUM: allow FW to send answer immediately 37727f476eaSAlexander Usyskin */ 37827f476eaSAlexander Usyskin enum hbm_host_enum_flags { 37927f476eaSAlexander Usyskin MEI_HBM_ENUM_F_ALLOW_ADD = BIT(0), 38027f476eaSAlexander Usyskin MEI_HBM_ENUM_F_IMMEDIATE_ENUM = BIT(1), 38127f476eaSAlexander Usyskin }; 38227f476eaSAlexander Usyskin 38327f476eaSAlexander Usyskin /** 38470ef835cSTomas Winkler * struct hbm_host_enum_request - enumeration request from host to fw 38570ef835cSTomas Winkler * 38670ef835cSTomas Winkler * @hbm_cmd : bus message command header 38727f476eaSAlexander Usyskin * @flags : request flags 38870ef835cSTomas Winkler * @reserved: reserved 38970ef835cSTomas Winkler */ 390ffc2825cSGreg Kroah-Hartman struct hbm_host_enum_request { 391ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 39227f476eaSAlexander Usyskin u8 flags; 39370ef835cSTomas Winkler u8 reserved[2]; 394ffc2825cSGreg Kroah-Hartman } __packed; 395ffc2825cSGreg Kroah-Hartman 396ffc2825cSGreg Kroah-Hartman struct hbm_host_enum_response { 397ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 398ffc2825cSGreg Kroah-Hartman u8 reserved[3]; 399ffc2825cSGreg Kroah-Hartman u8 valid_addresses[32]; 400ffc2825cSGreg Kroah-Hartman } __packed; 401ffc2825cSGreg Kroah-Hartman 4022dd1e5aeSAlexander Usyskin /** 4032dd1e5aeSAlexander Usyskin * struct mei_client_properties - mei client properties 4042dd1e5aeSAlexander Usyskin * 4052dd1e5aeSAlexander Usyskin * @protocol_name: guid of the client 4062dd1e5aeSAlexander Usyskin * @protocol_version: client protocol version 4072dd1e5aeSAlexander Usyskin * @max_number_of_connections: number of possible connections. 4082dd1e5aeSAlexander Usyskin * @fixed_address: fixed me address (0 if the client is dynamic) 4092dd1e5aeSAlexander Usyskin * @single_recv_buf: 1 if all connections share a single receive buffer. 4102dd1e5aeSAlexander Usyskin * @vt_supported: the client support vtag 4112dd1e5aeSAlexander Usyskin * @reserved: reserved 4122dd1e5aeSAlexander Usyskin * @max_msg_length: MTU of the client 4132dd1e5aeSAlexander Usyskin */ 414ffc2825cSGreg Kroah-Hartman struct mei_client_properties { 415ffc2825cSGreg Kroah-Hartman uuid_le protocol_name; 416ffc2825cSGreg Kroah-Hartman u8 protocol_version; 417ffc2825cSGreg Kroah-Hartman u8 max_number_of_connections; 418ffc2825cSGreg Kroah-Hartman u8 fixed_address; 4194ad84cb5SAlexander Usyskin u8 single_recv_buf:1; 4202dd1e5aeSAlexander Usyskin u8 vt_supported:1; 4212dd1e5aeSAlexander Usyskin u8 reserved:6; 422ffc2825cSGreg Kroah-Hartman u32 max_msg_length; 423ffc2825cSGreg Kroah-Hartman } __packed; 424ffc2825cSGreg Kroah-Hartman 425ffc2825cSGreg Kroah-Hartman struct hbm_props_request { 426ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 4273438c1f3STomas Winkler u8 me_addr; 428ffc2825cSGreg Kroah-Hartman u8 reserved[2]; 429ffc2825cSGreg Kroah-Hartman } __packed; 430ffc2825cSGreg Kroah-Hartman 431ffc2825cSGreg Kroah-Hartman struct hbm_props_response { 432ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 4333438c1f3STomas Winkler u8 me_addr; 434ffc2825cSGreg Kroah-Hartman u8 status; 43592ca3dd4STomas Winkler u8 reserved; 436ffc2825cSGreg Kroah-Hartman struct mei_client_properties client_properties; 437ffc2825cSGreg Kroah-Hartman } __packed; 438ffc2825cSGreg Kroah-Hartman 439aeba4a06STomas Winkler /** 44070ef835cSTomas Winkler * struct hbm_add_client_request - request to add a client 44170ef835cSTomas Winkler * might be sent by fw after enumeration has already completed 44270ef835cSTomas Winkler * 44370ef835cSTomas Winkler * @hbm_cmd: bus message command header 44470ef835cSTomas Winkler * @me_addr: address of the client in ME 44570ef835cSTomas Winkler * @reserved: reserved 44670ef835cSTomas Winkler * @client_properties: client properties 44770ef835cSTomas Winkler */ 44870ef835cSTomas Winkler struct hbm_add_client_request { 44970ef835cSTomas Winkler u8 hbm_cmd; 45070ef835cSTomas Winkler u8 me_addr; 45170ef835cSTomas Winkler u8 reserved[2]; 45270ef835cSTomas Winkler struct mei_client_properties client_properties; 45370ef835cSTomas Winkler } __packed; 45470ef835cSTomas Winkler 45570ef835cSTomas Winkler /** 45670ef835cSTomas Winkler * struct hbm_add_client_response - response to add a client 45770ef835cSTomas Winkler * sent by the host to report client addition status to fw 45870ef835cSTomas Winkler * 45970ef835cSTomas Winkler * @hbm_cmd: bus message command header 46070ef835cSTomas Winkler * @me_addr: address of the client in ME 46170ef835cSTomas Winkler * @status: if HBMS_SUCCESS then the client can now accept connections. 462e24ca925SGreg Kroah-Hartman * @reserved: reserved 46370ef835cSTomas Winkler */ 46470ef835cSTomas Winkler struct hbm_add_client_response { 46570ef835cSTomas Winkler u8 hbm_cmd; 46670ef835cSTomas Winkler u8 me_addr; 46770ef835cSTomas Winkler u8 status; 46892ca3dd4STomas Winkler u8 reserved; 46970ef835cSTomas Winkler } __packed; 47070ef835cSTomas Winkler 47170ef835cSTomas Winkler /** 4724fcbc99bSTomas Winkler * struct hbm_power_gate - power gate request/response 4734fcbc99bSTomas Winkler * 474a8605ea2SAlexander Usyskin * @hbm_cmd: bus message command header 475a8605ea2SAlexander Usyskin * @reserved: reserved 4764fcbc99bSTomas Winkler */ 4774fcbc99bSTomas Winkler struct hbm_power_gate { 4784fcbc99bSTomas Winkler u8 hbm_cmd; 4794fcbc99bSTomas Winkler u8 reserved[3]; 4804fcbc99bSTomas Winkler } __packed; 4814fcbc99bSTomas Winkler 4824fcbc99bSTomas Winkler /** 483aeba4a06STomas Winkler * struct hbm_client_connect_request - connect/disconnect request 484aeba4a06STomas Winkler * 485a8605ea2SAlexander Usyskin * @hbm_cmd: bus message command header 486a8605ea2SAlexander Usyskin * @me_addr: address of the client in ME 487a8605ea2SAlexander Usyskin * @host_addr: address of the client in the driver 488a8605ea2SAlexander Usyskin * @reserved: reserved 489aeba4a06STomas Winkler */ 490ffc2825cSGreg Kroah-Hartman struct hbm_client_connect_request { 491ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 492ffc2825cSGreg Kroah-Hartman u8 me_addr; 493ffc2825cSGreg Kroah-Hartman u8 host_addr; 494ffc2825cSGreg Kroah-Hartman u8 reserved; 495ffc2825cSGreg Kroah-Hartman } __packed; 496ffc2825cSGreg Kroah-Hartman 497aeba4a06STomas Winkler /** 498aeba4a06STomas Winkler * struct hbm_client_connect_response - connect/disconnect response 499aeba4a06STomas Winkler * 500a8605ea2SAlexander Usyskin * @hbm_cmd: bus message command header 501a8605ea2SAlexander Usyskin * @me_addr: address of the client in ME 502a8605ea2SAlexander Usyskin * @host_addr: address of the client in the driver 503a8605ea2SAlexander Usyskin * @status: status of the request 504aeba4a06STomas Winkler */ 505ffc2825cSGreg Kroah-Hartman struct hbm_client_connect_response { 506ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 507ffc2825cSGreg Kroah-Hartman u8 me_addr; 508ffc2825cSGreg Kroah-Hartman u8 host_addr; 509ffc2825cSGreg Kroah-Hartman u8 status; 510ffc2825cSGreg Kroah-Hartman } __packed; 511ffc2825cSGreg Kroah-Hartman 512ffc2825cSGreg Kroah-Hartman 513ffc2825cSGreg Kroah-Hartman #define MEI_FC_MESSAGE_RESERVED_LENGTH 5 514ffc2825cSGreg Kroah-Hartman 515ffc2825cSGreg Kroah-Hartman struct hbm_flow_control { 516ffc2825cSGreg Kroah-Hartman u8 hbm_cmd; 517ffc2825cSGreg Kroah-Hartman u8 me_addr; 518ffc2825cSGreg Kroah-Hartman u8 host_addr; 519ffc2825cSGreg Kroah-Hartman u8 reserved[MEI_FC_MESSAGE_RESERVED_LENGTH]; 520ffc2825cSGreg Kroah-Hartman } __packed; 521ffc2825cSGreg Kroah-Hartman 522d3c1c809STomas Winkler #define MEI_HBM_NOTIFICATION_START 1 523d3c1c809STomas Winkler #define MEI_HBM_NOTIFICATION_STOP 0 524d3c1c809STomas Winkler /** 525d3c1c809STomas Winkler * struct hbm_notification_request - start/stop notification request 526d3c1c809STomas Winkler * 527d3c1c809STomas Winkler * @hbm_cmd: bus message command header 528d3c1c809STomas Winkler * @me_addr: address of the client in ME 529d3c1c809STomas Winkler * @host_addr: address of the client in the driver 530d3c1c809STomas Winkler * @start: start = 1 or stop = 0 asynchronous notifications 531d3c1c809STomas Winkler */ 532d3c1c809STomas Winkler struct hbm_notification_request { 533d3c1c809STomas Winkler u8 hbm_cmd; 534d3c1c809STomas Winkler u8 me_addr; 535d3c1c809STomas Winkler u8 host_addr; 536d3c1c809STomas Winkler u8 start; 537d3c1c809STomas Winkler } __packed; 538d3c1c809STomas Winkler 539d3c1c809STomas Winkler /** 540d3c1c809STomas Winkler * struct hbm_notification_response - start/stop notification response 541d3c1c809STomas Winkler * 542d3c1c809STomas Winkler * @hbm_cmd: bus message command header 543d3c1c809STomas Winkler * @me_addr: address of the client in ME 544d3c1c809STomas Winkler * @host_addr: - address of the client in the driver 545d3c1c809STomas Winkler * @status: (mei_hbm_status) response status for the request 546d3c1c809STomas Winkler * - MEI_HBMS_SUCCESS: successful stop/start 547d3c1c809STomas Winkler * - MEI_HBMS_CLIENT_NOT_FOUND: if the connection could not be found. 548d3c1c809STomas Winkler * - MEI_HBMS_ALREADY_STARTED: for start requests for a previously 549d3c1c809STomas Winkler * started notification. 550d3c1c809STomas Winkler * - MEI_HBMS_NOT_STARTED: for stop request for a connected client for whom 551d3c1c809STomas Winkler * asynchronous notifications are currently disabled. 552d3c1c809STomas Winkler * 553d3c1c809STomas Winkler * @start: start = 1 or stop = 0 asynchronous notifications 554d3c1c809STomas Winkler * @reserved: reserved 555d3c1c809STomas Winkler */ 556d3c1c809STomas Winkler struct hbm_notification_response { 557d3c1c809STomas Winkler u8 hbm_cmd; 558d3c1c809STomas Winkler u8 me_addr; 559d3c1c809STomas Winkler u8 host_addr; 560d3c1c809STomas Winkler u8 status; 561d3c1c809STomas Winkler u8 start; 562d3c1c809STomas Winkler u8 reserved[3]; 563d3c1c809STomas Winkler } __packed; 564d3c1c809STomas Winkler 565d3c1c809STomas Winkler /** 566d3c1c809STomas Winkler * struct hbm_notification - notification event 567d3c1c809STomas Winkler * 568d3c1c809STomas Winkler * @hbm_cmd: bus message command header 569d3c1c809STomas Winkler * @me_addr: address of the client in ME 570d3c1c809STomas Winkler * @host_addr: address of the client in the driver 571d3c1c809STomas Winkler * @reserved: reserved for alignment 572d3c1c809STomas Winkler */ 573d3c1c809STomas Winkler struct hbm_notification { 574d3c1c809STomas Winkler u8 hbm_cmd; 575d3c1c809STomas Winkler u8 me_addr; 576d3c1c809STomas Winkler u8 host_addr; 57792ca3dd4STomas Winkler u8 reserved; 578d3c1c809STomas Winkler } __packed; 579ffc2825cSGreg Kroah-Hartman 580ee7aba5aSTomas Winkler /** 581ee7aba5aSTomas Winkler * struct hbm_dma_mem_dscr - dma ring 582ee7aba5aSTomas Winkler * 583ee7aba5aSTomas Winkler * @addr_hi: the high 32bits of 64 bit address 584ee7aba5aSTomas Winkler * @addr_lo: the low 32bits of 64 bit address 585ee7aba5aSTomas Winkler * @size : size in bytes (must be power of 2) 586ee7aba5aSTomas Winkler */ 587ee7aba5aSTomas Winkler struct hbm_dma_mem_dscr { 588ee7aba5aSTomas Winkler u32 addr_hi; 589ee7aba5aSTomas Winkler u32 addr_lo; 590ee7aba5aSTomas Winkler u32 size; 591ee7aba5aSTomas Winkler } __packed; 592ee7aba5aSTomas Winkler 593ee7aba5aSTomas Winkler enum { 594ee7aba5aSTomas Winkler DMA_DSCR_HOST = 0, 595ee7aba5aSTomas Winkler DMA_DSCR_DEVICE = 1, 596ee7aba5aSTomas Winkler DMA_DSCR_CTRL = 2, 597ee7aba5aSTomas Winkler DMA_DSCR_NUM, 598ee7aba5aSTomas Winkler }; 599ee7aba5aSTomas Winkler 600ee7aba5aSTomas Winkler /** 601ee7aba5aSTomas Winkler * struct hbm_dma_setup_request - dma setup request 602ee7aba5aSTomas Winkler * 603ee7aba5aSTomas Winkler * @hbm_cmd: bus message command header 604ee7aba5aSTomas Winkler * @reserved: reserved for alignment 605ee7aba5aSTomas Winkler * @dma_dscr: dma descriptor for HOST, DEVICE, and CTRL 606ee7aba5aSTomas Winkler */ 607ee7aba5aSTomas Winkler struct hbm_dma_setup_request { 608ee7aba5aSTomas Winkler u8 hbm_cmd; 609ee7aba5aSTomas Winkler u8 reserved[3]; 610ee7aba5aSTomas Winkler struct hbm_dma_mem_dscr dma_dscr[DMA_DSCR_NUM]; 611ee7aba5aSTomas Winkler } __packed; 612ee7aba5aSTomas Winkler 613ee7aba5aSTomas Winkler /** 614ee7aba5aSTomas Winkler * struct hbm_dma_setup_response - dma setup response 615ee7aba5aSTomas Winkler * 616ee7aba5aSTomas Winkler * @hbm_cmd: bus message command header 617ee7aba5aSTomas Winkler * @status: 0 on success; otherwise DMA setup failed. 618ee7aba5aSTomas Winkler * @reserved: reserved for alignment 619ee7aba5aSTomas Winkler */ 620ee7aba5aSTomas Winkler struct hbm_dma_setup_response { 621ee7aba5aSTomas Winkler u8 hbm_cmd; 622ee7aba5aSTomas Winkler u8 status; 623ee7aba5aSTomas Winkler u8 reserved[2]; 624ee7aba5aSTomas Winkler } __packed; 625ee7aba5aSTomas Winkler 6262513eb0dSTomas Winkler /** 6272513eb0dSTomas Winkler * struct mei_dma_ring_ctrl - dma ring control block 6282513eb0dSTomas Winkler * 6292513eb0dSTomas Winkler * @hbuf_wr_idx: host circular buffer write index in slots 6302513eb0dSTomas Winkler * @reserved1: reserved for alignment 6312513eb0dSTomas Winkler * @hbuf_rd_idx: host circular buffer read index in slots 6322513eb0dSTomas Winkler * @reserved2: reserved for alignment 6332513eb0dSTomas Winkler * @dbuf_wr_idx: device circular buffer write index in slots 6342513eb0dSTomas Winkler * @reserved3: reserved for alignment 6352513eb0dSTomas Winkler * @dbuf_rd_idx: device circular buffer read index in slots 6362513eb0dSTomas Winkler * @reserved4: reserved for alignment 6372513eb0dSTomas Winkler */ 6382513eb0dSTomas Winkler struct hbm_dma_ring_ctrl { 6392513eb0dSTomas Winkler u32 hbuf_wr_idx; 6402513eb0dSTomas Winkler u32 reserved1; 6412513eb0dSTomas Winkler u32 hbuf_rd_idx; 6422513eb0dSTomas Winkler u32 reserved2; 6432513eb0dSTomas Winkler u32 dbuf_wr_idx; 6442513eb0dSTomas Winkler u32 reserved3; 6452513eb0dSTomas Winkler u32 dbuf_rd_idx; 6462513eb0dSTomas Winkler u32 reserved4; 6472513eb0dSTomas Winkler } __packed; 6482513eb0dSTomas Winkler 649beb4e1e5SAlexander Usyskin /* virtual tag supported */ 650beb4e1e5SAlexander Usyskin #define HBM_CAP_VT BIT(0) 651beb4e1e5SAlexander Usyskin 652e5cab1f9SAlexander Usyskin /** 653e5cab1f9SAlexander Usyskin * struct hbm_capability_request - capability request from host to fw 654e5cab1f9SAlexander Usyskin * 655e5cab1f9SAlexander Usyskin * @hbm_cmd : bus message command header 656e5cab1f9SAlexander Usyskin * @capability_requested: bitmask of capabilities requested by host 657e5cab1f9SAlexander Usyskin */ 658e5cab1f9SAlexander Usyskin struct hbm_capability_request { 659e5cab1f9SAlexander Usyskin u8 hbm_cmd; 660e5cab1f9SAlexander Usyskin u8 capability_requested[3]; 661e5cab1f9SAlexander Usyskin } __packed; 662e5cab1f9SAlexander Usyskin 663e5cab1f9SAlexander Usyskin /** 664e5cab1f9SAlexander Usyskin * struct hbm_capability_response - capability response from fw to host 665e5cab1f9SAlexander Usyskin * 666e5cab1f9SAlexander Usyskin * @hbm_cmd : bus message command header 667e5cab1f9SAlexander Usyskin * @capability_granted: bitmask of capabilities granted by FW 668e5cab1f9SAlexander Usyskin */ 669e5cab1f9SAlexander Usyskin struct hbm_capability_response { 670e5cab1f9SAlexander Usyskin u8 hbm_cmd; 671e5cab1f9SAlexander Usyskin u8 capability_granted[3]; 672e5cab1f9SAlexander Usyskin } __packed; 673e5cab1f9SAlexander Usyskin 674ffc2825cSGreg Kroah-Hartman #endif 675