xref: /openbmc/linux/drivers/misc/mei/hw.h (revision 0cd7c01a)
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