blob: e961be392fae0f1a956358c505b8ba347f89acfc [file] [log] [blame]
Oren Weil5a6003f2011-05-15 13:43:45 +03001/*
2 *
3 * Intel Management Engine Interface (Intel MEI) Linux driver
Tomas Winkler733ba912012-02-09 19:25:53 +02004 * Copyright (c) 2003-2012, Intel Corporation.
Oren Weil5a6003f2011-05-15 13:43:45 +03005 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 */
16
17#ifndef _MEI_HW_TYPES_H_
18#define _MEI_HW_TYPES_H_
19
20#include <linux/uuid.h>
21
22/*
Tomas Winkler3870c322012-11-01 21:17:14 +020023 * Timeouts in Seconds
Oren Weil5a6003f2011-05-15 13:43:45 +030024 */
Tomas Winkler7d93e582014-01-14 23:10:10 +020025#define MEI_HW_READY_TIMEOUT 2 /* Timeout on ready message */
Tomas Winkler3870c322012-11-01 21:17:14 +020026#define MEI_CONNECT_TIMEOUT 3 /* HPS: at least 2 seconds */
Oren Weil5a6003f2011-05-15 13:43:45 +030027
Tomas Winkler3870c322012-11-01 21:17:14 +020028#define MEI_CL_CONNECT_TIMEOUT 15 /* HPS: Client Connect Timeout */
29#define MEI_CLIENTS_INIT_TIMEOUT 15 /* HPS: Clients Enumeration Timeout */
Oren Weil5a6003f2011-05-15 13:43:45 +030030
Tomas Winkler3870c322012-11-01 21:17:14 +020031#define MEI_IAMTHIF_STALL_TIMER 12 /* HPS */
32#define MEI_IAMTHIF_READ_TIMER 10 /* HPS */
Oren Weil5a6003f2011-05-15 13:43:45 +030033
Tomas Winklerba9cdd02014-03-18 22:52:00 +020034#define MEI_PGI_TIMEOUT 1 /* PG Isolation time response 1 sec */
Tomas Winkler7d93e582014-01-14 23:10:10 +020035#define MEI_HBM_TIMEOUT 1 /* 1 second */
Oren Weil5a6003f2011-05-15 13:43:45 +030036
37/*
Oren Weil5a6003f2011-05-15 13:43:45 +030038 * MEI Version
39 */
Tomas Winkler61a1aea72014-03-18 22:52:07 +020040#define HBM_MINOR_VERSION 1
Oren Weil5a6003f2011-05-15 13:43:45 +030041#define HBM_MAJOR_VERSION 1
Oren Weil5a6003f2011-05-15 13:43:45 +030042
Tomas Winkleree7e5af2014-03-18 22:51:58 +020043/*
44 * MEI version with PGI support
45 */
46#define HBM_MINOR_VERSION_PGI 1
47#define HBM_MAJOR_VERSION_PGI 1
48
Tomas Winkler70ef8352015-07-23 21:37:12 +030049/*
50 * MEI version with Dynamic clients support
51 */
52#define HBM_MINOR_VERSION_DC 0
53#define HBM_MAJOR_VERSION_DC 2
54
Alexander Usyskin18901352015-07-23 21:37:13 +030055/*
56 * MEI version with disconnect on connection timeout support
57 */
58#define HBM_MINOR_VERSION_DOT 0
59#define HBM_MAJOR_VERSION_DOT 2
60
Tomas Winkler1ca7e782012-02-26 23:18:57 +020061/* Host bus message command opcode */
62#define MEI_HBM_CMD_OP_MSK 0x7f
63/* Host bus message command RESPONSE */
64#define MEI_HBM_CMD_RES_MSK 0x80
65
Oren Weil5a6003f2011-05-15 13:43:45 +030066/*
67 * MEI Bus Message Command IDs
68 */
69#define HOST_START_REQ_CMD 0x01
70#define HOST_START_RES_CMD 0x81
71
72#define HOST_STOP_REQ_CMD 0x02
73#define HOST_STOP_RES_CMD 0x82
74
75#define ME_STOP_REQ_CMD 0x03
76
77#define HOST_ENUM_REQ_CMD 0x04
78#define HOST_ENUM_RES_CMD 0x84
79
80#define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05
81#define HOST_CLIENT_PROPERTIES_RES_CMD 0x85
82
83#define CLIENT_CONNECT_REQ_CMD 0x06
84#define CLIENT_CONNECT_RES_CMD 0x86
85
86#define CLIENT_DISCONNECT_REQ_CMD 0x07
87#define CLIENT_DISCONNECT_RES_CMD 0x87
88
Tomas Winkler1ca7e782012-02-26 23:18:57 +020089#define MEI_FLOW_CONTROL_CMD 0x08
Oren Weil5a6003f2011-05-15 13:43:45 +030090
Tomas Winkler4fcbc992014-03-18 22:51:55 +020091#define MEI_PG_ISOLATION_ENTRY_REQ_CMD 0x0a
92#define MEI_PG_ISOLATION_ENTRY_RES_CMD 0x8a
93#define MEI_PG_ISOLATION_EXIT_REQ_CMD 0x0b
94#define MEI_PG_ISOLATION_EXIT_RES_CMD 0x8b
95
Tomas Winkler70ef8352015-07-23 21:37:12 +030096#define MEI_HBM_ADD_CLIENT_REQ_CMD 0x0f
97#define MEI_HBM_ADD_CLIENT_RES_CMD 0x8f
Oren Weil5a6003f2011-05-15 13:43:45 +030098/*
99 * MEI Stop Reason
100 * used by hbm_host_stop_request.reason
101 */
102enum mei_stop_reason_types {
103 DRIVER_STOP_REQUEST = 0x00,
104 DEVICE_D1_ENTRY = 0x01,
105 DEVICE_D2_ENTRY = 0x02,
106 DEVICE_D3_ENTRY = 0x03,
107 SYSTEM_S1_ENTRY = 0x04,
108 SYSTEM_S2_ENTRY = 0x05,
109 SYSTEM_S3_ENTRY = 0x06,
110 SYSTEM_S4_ENTRY = 0x07,
111 SYSTEM_S5_ENTRY = 0x08
112};
113
Tomas Winkler89778d62014-08-21 14:29:16 +0300114
115/**
Alexander Usyskina8605ea2014-09-29 16:31:49 +0300116 * enum mei_hbm_status - mei host bus messages return values
Tomas Winkler89778d62014-08-21 14:29:16 +0300117 *
Alexander Usyskina8605ea2014-09-29 16:31:49 +0300118 * @MEI_HBMS_SUCCESS : status success
119 * @MEI_HBMS_CLIENT_NOT_FOUND : client not found
120 * @MEI_HBMS_ALREADY_EXISTS : connection already established
121 * @MEI_HBMS_REJECTED : connection is rejected
122 * @MEI_HBMS_INVALID_PARAMETER : invalid parameter
123 * @MEI_HBMS_NOT_ALLOWED : operation not allowed
124 * @MEI_HBMS_ALREADY_STARTED : system is already started
125 * @MEI_HBMS_NOT_STARTED : system not started
Alexander Usyskince231392014-09-29 16:31:50 +0300126 *
127 * @MEI_HBMS_MAX : sentinel
Tomas Winkler89778d62014-08-21 14:29:16 +0300128 */
129enum mei_hbm_status {
130 MEI_HBMS_SUCCESS = 0,
131 MEI_HBMS_CLIENT_NOT_FOUND = 1,
132 MEI_HBMS_ALREADY_EXISTS = 2,
133 MEI_HBMS_REJECTED = 3,
134 MEI_HBMS_INVALID_PARAMETER = 4,
135 MEI_HBMS_NOT_ALLOWED = 5,
136 MEI_HBMS_ALREADY_STARTED = 6,
137 MEI_HBMS_NOT_STARTED = 7,
138
139 MEI_HBMS_MAX
140};
141
142
Oren Weil5a6003f2011-05-15 13:43:45 +0300143/*
144 * Client Connect Status
145 * used by hbm_client_connect_response.status
146 */
Alexander Usyskin285e2992014-02-17 15:13:20 +0200147enum mei_cl_connect_status {
Tomas Winkler89778d62014-08-21 14:29:16 +0300148 MEI_CL_CONN_SUCCESS = MEI_HBMS_SUCCESS,
149 MEI_CL_CONN_NOT_FOUND = MEI_HBMS_CLIENT_NOT_FOUND,
150 MEI_CL_CONN_ALREADY_STARTED = MEI_HBMS_ALREADY_EXISTS,
151 MEI_CL_CONN_OUT_OF_RESOURCES = MEI_HBMS_REJECTED,
152 MEI_CL_CONN_MESSAGE_SMALL = MEI_HBMS_INVALID_PARAMETER,
Oren Weil5a6003f2011-05-15 13:43:45 +0300153};
154
155/*
156 * Client Disconnect Status
157 */
Alexander Usyskin285e2992014-02-17 15:13:20 +0200158enum mei_cl_disconnect_status {
Tomas Winkler89778d62014-08-21 14:29:16 +0300159 MEI_CL_DISCONN_SUCCESS = MEI_HBMS_SUCCESS
Oren Weil5a6003f2011-05-15 13:43:45 +0300160};
161
162/*
163 * MEI BUS Interface Section
164 */
165struct mei_msg_hdr {
166 u32 me_addr:8;
167 u32 host_addr:8;
168 u32 length:9;
Tomas Winkler479327f2013-12-17 15:56:56 +0200169 u32 reserved:5;
170 u32 internal:1;
Oren Weil5a6003f2011-05-15 13:43:45 +0300171 u32 msg_complete:1;
172} __packed;
173
174
Oren Weil5a6003f2011-05-15 13:43:45 +0300175struct mei_bus_message {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200176 u8 hbm_cmd;
177 u8 data[0];
Oren Weil5a6003f2011-05-15 13:43:45 +0300178} __packed;
179
Tomas Winklercd51ed62012-12-25 19:06:09 +0200180/**
181 * struct hbm_cl_cmd - client specific host bus command
182 * CONNECT, DISCONNECT, and FlOW CONTROL
183 *
Alexander Usyskina8605ea2014-09-29 16:31:49 +0300184 * @hbm_cmd: bus message command header
185 * @me_addr: address of the client in ME
186 * @host_addr: address of the client in the driver
187 * @data: generic data
Tomas Winklercd51ed62012-12-25 19:06:09 +0200188 */
189struct mei_hbm_cl_cmd {
190 u8 hbm_cmd;
191 u8 me_addr;
192 u8 host_addr;
193 u8 data;
194};
195
Oren Weil5a6003f2011-05-15 13:43:45 +0300196struct hbm_version {
197 u8 minor_version;
198 u8 major_version;
199} __packed;
200
201struct hbm_host_version_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200202 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300203 u8 reserved;
204 struct hbm_version host_version;
205} __packed;
206
207struct hbm_host_version_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200208 u8 hbm_cmd;
Tomas Winkler4b007062012-02-23 21:52:55 +0200209 u8 host_version_supported;
Oren Weil5a6003f2011-05-15 13:43:45 +0300210 struct hbm_version me_max_version;
211} __packed;
212
213struct hbm_host_stop_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200214 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300215 u8 reason;
216 u8 reserved[2];
217} __packed;
218
219struct hbm_host_stop_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200220 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300221 u8 reserved[3];
222} __packed;
223
224struct hbm_me_stop_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200225 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300226 u8 reason;
227 u8 reserved[2];
228} __packed;
229
Tomas Winkler70ef8352015-07-23 21:37:12 +0300230/**
231 * struct hbm_host_enum_request - enumeration request from host to fw
232 *
233 * @hbm_cmd: bus message command header
234 * @allow_add: allow dynamic clients add HBM version >= 2.0
235 * @reserved: reserved
236 */
Oren Weil5a6003f2011-05-15 13:43:45 +0300237struct hbm_host_enum_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200238 u8 hbm_cmd;
Tomas Winkler70ef8352015-07-23 21:37:12 +0300239 u8 allow_add;
240 u8 reserved[2];
Oren Weil5a6003f2011-05-15 13:43:45 +0300241} __packed;
242
243struct hbm_host_enum_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200244 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300245 u8 reserved[3];
246 u8 valid_addresses[32];
247} __packed;
248
249struct mei_client_properties {
250 uuid_le protocol_name;
251 u8 protocol_version;
252 u8 max_number_of_connections;
253 u8 fixed_address;
254 u8 single_recv_buf;
255 u32 max_msg_length;
256} __packed;
257
258struct hbm_props_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200259 u8 hbm_cmd;
Tomas Winkler3438c1f2014-08-21 14:29:10 +0300260 u8 me_addr;
Oren Weil5a6003f2011-05-15 13:43:45 +0300261 u8 reserved[2];
262} __packed;
263
Oren Weil5a6003f2011-05-15 13:43:45 +0300264struct hbm_props_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200265 u8 hbm_cmd;
Tomas Winkler3438c1f2014-08-21 14:29:10 +0300266 u8 me_addr;
Oren Weil5a6003f2011-05-15 13:43:45 +0300267 u8 status;
268 u8 reserved[1];
269 struct mei_client_properties client_properties;
270} __packed;
271
Tomas Winkleraeba4a02012-11-11 17:38:04 +0200272/**
Tomas Winkler70ef8352015-07-23 21:37:12 +0300273 * struct hbm_add_client_request - request to add a client
274 * might be sent by fw after enumeration has already completed
275 *
276 * @hbm_cmd: bus message command header
277 * @me_addr: address of the client in ME
278 * @reserved: reserved
279 * @client_properties: client properties
280 */
281struct hbm_add_client_request {
282 u8 hbm_cmd;
283 u8 me_addr;
284 u8 reserved[2];
285 struct mei_client_properties client_properties;
286} __packed;
287
288/**
289 * struct hbm_add_client_response - response to add a client
290 * sent by the host to report client addition status to fw
291 *
292 * @hbm_cmd: bus message command header
293 * @me_addr: address of the client in ME
294 * @status: if HBMS_SUCCESS then the client can now accept connections.
295 * @reserved: reserved
296 */
297struct hbm_add_client_response {
298 u8 hbm_cmd;
299 u8 me_addr;
300 u8 status;
301 u8 reserved[1];
302} __packed;
303
304/**
Tomas Winkler4fcbc992014-03-18 22:51:55 +0200305 * struct hbm_power_gate - power gate request/response
306 *
Alexander Usyskina8605ea2014-09-29 16:31:49 +0300307 * @hbm_cmd: bus message command header
308 * @reserved: reserved
Tomas Winkler4fcbc992014-03-18 22:51:55 +0200309 */
310struct hbm_power_gate {
311 u8 hbm_cmd;
312 u8 reserved[3];
313} __packed;
314
315/**
Tomas Winkleraeba4a02012-11-11 17:38:04 +0200316 * struct hbm_client_connect_request - connect/disconnect request
317 *
Alexander Usyskina8605ea2014-09-29 16:31:49 +0300318 * @hbm_cmd: bus message command header
319 * @me_addr: address of the client in ME
320 * @host_addr: address of the client in the driver
321 * @reserved: reserved
Tomas Winkleraeba4a02012-11-11 17:38:04 +0200322 */
Oren Weil5a6003f2011-05-15 13:43:45 +0300323struct hbm_client_connect_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200324 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300325 u8 me_addr;
326 u8 host_addr;
327 u8 reserved;
328} __packed;
329
Tomas Winkleraeba4a02012-11-11 17:38:04 +0200330/**
331 * struct hbm_client_connect_response - connect/disconnect response
332 *
Alexander Usyskina8605ea2014-09-29 16:31:49 +0300333 * @hbm_cmd: bus message command header
334 * @me_addr: address of the client in ME
335 * @host_addr: address of the client in the driver
336 * @status: status of the request
Tomas Winkleraeba4a02012-11-11 17:38:04 +0200337 */
Oren Weil5a6003f2011-05-15 13:43:45 +0300338struct hbm_client_connect_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200339 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300340 u8 me_addr;
341 u8 host_addr;
342 u8 status;
343} __packed;
344
Oren Weil5a6003f2011-05-15 13:43:45 +0300345
346#define MEI_FC_MESSAGE_RESERVED_LENGTH 5
347
348struct hbm_flow_control {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200349 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300350 u8 me_addr;
351 u8 host_addr;
352 u8 reserved[MEI_FC_MESSAGE_RESERVED_LENGTH];
353} __packed;
354
Oren Weil5a6003f2011-05-15 13:43:45 +0300355
356#endif