blob: 6e31113b63df43afc20728c25c2b21c0b32417e7 [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 Winkler1ca7e782012-02-26 23:18:57 +020049/* Host bus message command opcode */
50#define MEI_HBM_CMD_OP_MSK 0x7f
51/* Host bus message command RESPONSE */
52#define MEI_HBM_CMD_RES_MSK 0x80
53
Oren Weil5a6003f2011-05-15 13:43:45 +030054/*
55 * MEI Bus Message Command IDs
56 */
57#define HOST_START_REQ_CMD 0x01
58#define HOST_START_RES_CMD 0x81
59
60#define HOST_STOP_REQ_CMD 0x02
61#define HOST_STOP_RES_CMD 0x82
62
63#define ME_STOP_REQ_CMD 0x03
64
65#define HOST_ENUM_REQ_CMD 0x04
66#define HOST_ENUM_RES_CMD 0x84
67
68#define HOST_CLIENT_PROPERTIES_REQ_CMD 0x05
69#define HOST_CLIENT_PROPERTIES_RES_CMD 0x85
70
71#define CLIENT_CONNECT_REQ_CMD 0x06
72#define CLIENT_CONNECT_RES_CMD 0x86
73
74#define CLIENT_DISCONNECT_REQ_CMD 0x07
75#define CLIENT_DISCONNECT_RES_CMD 0x87
76
Tomas Winkler1ca7e782012-02-26 23:18:57 +020077#define MEI_FLOW_CONTROL_CMD 0x08
Oren Weil5a6003f2011-05-15 13:43:45 +030078
Tomas Winkler4fcbc992014-03-18 22:51:55 +020079#define MEI_PG_ISOLATION_ENTRY_REQ_CMD 0x0a
80#define MEI_PG_ISOLATION_ENTRY_RES_CMD 0x8a
81#define MEI_PG_ISOLATION_EXIT_REQ_CMD 0x0b
82#define MEI_PG_ISOLATION_EXIT_RES_CMD 0x8b
83
Oren Weil5a6003f2011-05-15 13:43:45 +030084/*
85 * MEI Stop Reason
86 * used by hbm_host_stop_request.reason
87 */
88enum mei_stop_reason_types {
89 DRIVER_STOP_REQUEST = 0x00,
90 DEVICE_D1_ENTRY = 0x01,
91 DEVICE_D2_ENTRY = 0x02,
92 DEVICE_D3_ENTRY = 0x03,
93 SYSTEM_S1_ENTRY = 0x04,
94 SYSTEM_S2_ENTRY = 0x05,
95 SYSTEM_S3_ENTRY = 0x06,
96 SYSTEM_S4_ENTRY = 0x07,
97 SYSTEM_S5_ENTRY = 0x08
98};
99
Tomas Winkler89778d62014-08-21 14:29:16 +0300100
101/**
102 * mei_hbm_status - mei host bus messages return values
103 *
104 * @MEI_HBMS_SUCCESS - status success
105 * @MEI_HBMS_CLIENT_NOT_FOUND - client not found
106 * @MEI_HBMS_ALREADY_EXISTS - connection already established
107 * @MEI_HBMS_REJECTED - connection is rejected
108 * @MEI_HBMS_INVALID_PARAMETER - invalid parameter
109 * @MEI_HBMS_NOT_ALLOWED - operation not allowed
110 * @MEI_HBMS_ALREADY_STARTED - system is already started
111 * @MEI_HBMS_NOT_STARTED - system not started
112 */
113enum mei_hbm_status {
114 MEI_HBMS_SUCCESS = 0,
115 MEI_HBMS_CLIENT_NOT_FOUND = 1,
116 MEI_HBMS_ALREADY_EXISTS = 2,
117 MEI_HBMS_REJECTED = 3,
118 MEI_HBMS_INVALID_PARAMETER = 4,
119 MEI_HBMS_NOT_ALLOWED = 5,
120 MEI_HBMS_ALREADY_STARTED = 6,
121 MEI_HBMS_NOT_STARTED = 7,
122
123 MEI_HBMS_MAX
124};
125
126
Oren Weil5a6003f2011-05-15 13:43:45 +0300127/*
128 * Client Connect Status
129 * used by hbm_client_connect_response.status
130 */
Alexander Usyskin285e2992014-02-17 15:13:20 +0200131enum mei_cl_connect_status {
Tomas Winkler89778d62014-08-21 14:29:16 +0300132 MEI_CL_CONN_SUCCESS = MEI_HBMS_SUCCESS,
133 MEI_CL_CONN_NOT_FOUND = MEI_HBMS_CLIENT_NOT_FOUND,
134 MEI_CL_CONN_ALREADY_STARTED = MEI_HBMS_ALREADY_EXISTS,
135 MEI_CL_CONN_OUT_OF_RESOURCES = MEI_HBMS_REJECTED,
136 MEI_CL_CONN_MESSAGE_SMALL = MEI_HBMS_INVALID_PARAMETER,
Oren Weil5a6003f2011-05-15 13:43:45 +0300137};
138
139/*
140 * Client Disconnect Status
141 */
Alexander Usyskin285e2992014-02-17 15:13:20 +0200142enum mei_cl_disconnect_status {
Tomas Winkler89778d62014-08-21 14:29:16 +0300143 MEI_CL_DISCONN_SUCCESS = MEI_HBMS_SUCCESS
Oren Weil5a6003f2011-05-15 13:43:45 +0300144};
145
146/*
147 * MEI BUS Interface Section
148 */
149struct mei_msg_hdr {
150 u32 me_addr:8;
151 u32 host_addr:8;
152 u32 length:9;
Tomas Winkler479327f2013-12-17 15:56:56 +0200153 u32 reserved:5;
154 u32 internal:1;
Oren Weil5a6003f2011-05-15 13:43:45 +0300155 u32 msg_complete:1;
156} __packed;
157
158
Oren Weil5a6003f2011-05-15 13:43:45 +0300159struct mei_bus_message {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200160 u8 hbm_cmd;
161 u8 data[0];
Oren Weil5a6003f2011-05-15 13:43:45 +0300162} __packed;
163
Tomas Winklercd51ed62012-12-25 19:06:09 +0200164/**
165 * struct hbm_cl_cmd - client specific host bus command
166 * CONNECT, DISCONNECT, and FlOW CONTROL
167 *
168 * @hbm_cmd - bus message command header
169 * @me_addr - address of the client in ME
170 * @host_addr - address of the client in the driver
171 * @data
172 */
173struct mei_hbm_cl_cmd {
174 u8 hbm_cmd;
175 u8 me_addr;
176 u8 host_addr;
177 u8 data;
178};
179
Oren Weil5a6003f2011-05-15 13:43:45 +0300180struct hbm_version {
181 u8 minor_version;
182 u8 major_version;
183} __packed;
184
185struct hbm_host_version_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200186 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300187 u8 reserved;
188 struct hbm_version host_version;
189} __packed;
190
191struct hbm_host_version_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200192 u8 hbm_cmd;
Tomas Winkler4b007062012-02-23 21:52:55 +0200193 u8 host_version_supported;
Oren Weil5a6003f2011-05-15 13:43:45 +0300194 struct hbm_version me_max_version;
195} __packed;
196
197struct hbm_host_stop_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200198 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300199 u8 reason;
200 u8 reserved[2];
201} __packed;
202
203struct hbm_host_stop_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200204 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300205 u8 reserved[3];
206} __packed;
207
208struct hbm_me_stop_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200209 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300210 u8 reason;
211 u8 reserved[2];
212} __packed;
213
214struct hbm_host_enum_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200215 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300216 u8 reserved[3];
217} __packed;
218
219struct hbm_host_enum_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200220 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300221 u8 reserved[3];
222 u8 valid_addresses[32];
223} __packed;
224
225struct mei_client_properties {
226 uuid_le protocol_name;
227 u8 protocol_version;
228 u8 max_number_of_connections;
229 u8 fixed_address;
230 u8 single_recv_buf;
231 u32 max_msg_length;
232} __packed;
233
234struct hbm_props_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200235 u8 hbm_cmd;
Tomas Winkler3438c1f2014-08-21 14:29:10 +0300236 u8 me_addr;
Oren Weil5a6003f2011-05-15 13:43:45 +0300237 u8 reserved[2];
238} __packed;
239
Oren Weil5a6003f2011-05-15 13:43:45 +0300240struct hbm_props_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200241 u8 hbm_cmd;
Tomas Winkler3438c1f2014-08-21 14:29:10 +0300242 u8 me_addr;
Oren Weil5a6003f2011-05-15 13:43:45 +0300243 u8 status;
244 u8 reserved[1];
245 struct mei_client_properties client_properties;
246} __packed;
247
Tomas Winkleraeba4a02012-11-11 17:38:04 +0200248/**
Tomas Winkler4fcbc992014-03-18 22:51:55 +0200249 * struct hbm_power_gate - power gate request/response
250 *
251 * @hbm_cmd - bus message command header
252 * @reserved[3]
253 */
254struct hbm_power_gate {
255 u8 hbm_cmd;
256 u8 reserved[3];
257} __packed;
258
259/**
Tomas Winkleraeba4a02012-11-11 17:38:04 +0200260 * struct hbm_client_connect_request - connect/disconnect request
261 *
262 * @hbm_cmd - bus message command header
263 * @me_addr - address of the client in ME
264 * @host_addr - address of the client in the driver
265 * @reserved
266 */
Oren Weil5a6003f2011-05-15 13:43:45 +0300267struct hbm_client_connect_request {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200268 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300269 u8 me_addr;
270 u8 host_addr;
271 u8 reserved;
272} __packed;
273
Tomas Winkleraeba4a02012-11-11 17:38:04 +0200274/**
275 * struct hbm_client_connect_response - connect/disconnect response
276 *
277 * @hbm_cmd - bus message command header
278 * @me_addr - address of the client in ME
279 * @host_addr - address of the client in the driver
280 * @status - status of the request
281 */
Oren Weil5a6003f2011-05-15 13:43:45 +0300282struct hbm_client_connect_response {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200283 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300284 u8 me_addr;
285 u8 host_addr;
286 u8 status;
287} __packed;
288
Oren Weil5a6003f2011-05-15 13:43:45 +0300289
290#define MEI_FC_MESSAGE_RESERVED_LENGTH 5
291
292struct hbm_flow_control {
Tomas Winkler1ca7e782012-02-26 23:18:57 +0200293 u8 hbm_cmd;
Oren Weil5a6003f2011-05-15 13:43:45 +0300294 u8 me_addr;
295 u8 host_addr;
296 u8 reserved[MEI_FC_MESSAGE_RESERVED_LENGTH];
297} __packed;
298
Oren Weil5a6003f2011-05-15 13:43:45 +0300299
300#endif