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