1/*******************************************************************************
2 * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 *  - Redistributions of source code must retain the above copyright notice,
8 *    this list of conditions and the following disclaimer.
9 *
10 *  - Redistributions in binary form must reproduce the above copyright notice,
11 *    this list of conditions and the following disclaimer in the documentation
12 *    and/or other materials provided with the distribution.
13 *
14 *  - Neither the name of Intel Corp. nor the names of its
15 *    contributors may be used to endorse or promote products derived from this
16 *    software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
22 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 *******************************************************************************/
30
31#ifndef __FWUL_COMMAND_H__
32#define __FWUL_COMMAND_H__
33
34#include "HECIUnix.h"
35#include "StatusCodeDefinitions.h"
36
37#pragma pack(1)
38
39typedef struct _FWU_VERSION
40{
41	UINT16      Major;
42	UINT16      Minor;
43	UINT16      Hotfix;
44	UINT16      Build;
45} FWU_VERSION;
46
47typedef enum
48{
49	FWU_GET_VERSION = 0,
50	FWU_GET_VERSION_REPLY,
51	FWU_START,
52	FWU_START_REPLY,
53	FWU_DATA,
54	FWU_DATA_REPLY,
55	FWU_END,
56	FWU_END_REPLY,
57	FWU_GET_INFO,
58	FWU_GET_INFO_REPLY
59} FWU_HECI_MESSAGE_TYPE;
60
61typedef struct _ME_GET_FW_UPDATE_INFO_REQUEST
62{
63	UINT32      MessageID;
64} ME_GET_FW_UPDATE_INFO_REQUEST;
65
66typedef struct _FWU_MSG_REPLY_HEADER
67{
68	UINT32      MessageType;
69	UINT32      Status;
70} FWU_MSG_REPLY_HEADER;
71
72typedef struct _FWU_MSG_REPLY_HEADER_V3
73{
74	UINT8       MessageType;
75	UINT32      Status;
76} FWU_MSG_REPLY_HEADER_V3;
77
78typedef struct _FWU_GET_VERSION_MSG_REPLY
79{
80	UINT32      MessageType;
81	UINT32      Status;
82	UINT32      Sku;
83	UINT32      ICHVer;
84	UINT32      MCHVer;
85	UINT32      Vendor;
86	UINT32      LastFwUpdateStatus;
87	UINT32      HwSku;
88	FWU_VERSION CodeVersion;
89	FWU_VERSION AMTVersion;
90	UINT16      EnabledUpdateInterfaces;
91	UINT16      Reserved;
92} FWU_GET_VERSION_MSG_REPLY;
93
94typedef struct _FWU_GET_VERSION_MSG_REPLY_V3
95{
96	UINT8       MessageType;
97	UINT32      Status;
98	UINT32      Sku;
99	UINT32      ICHVer;
100	UINT32      MCHVer;
101	UINT32      Vendor;
102	FWU_VERSION CodeVersion;
103	FWU_VERSION RcvyVersion;
104	UINT16      EnabledUpdateInterfaces;
105	UINT32      LastFwUpdateStatus;
106	UINT32      Reserved;
107} FWU_GET_VERSION_MSG_REPLY_V3;
108
109typedef struct _FWU_GET_INFO_MSG_REPLY
110{
111	UINT32      MessageType;
112	UINT32      Status;
113	FWU_VERSION MEBxVersion;
114	UINT32      FlashOverridePolicy;
115	UINT32      ManageabilityMode;
116	UINT32      BiosBootState;
117	struct {
118		UINT32          CryptoFuse   :1;
119		UINT32          FlashProtection:1;
120		UINT32          FwOverrideQualifier:2;
121		UINT32          MeResetReason:2;
122		UINT32          FwOverrideCounter:8;
123		UINT32          reserved:18;
124	} Fields;
125	UINT8       BiosVersion[20];
126} FWU_GET_INFO_MSG_REPLY;
127
128#pragma pack(0)
129
130class FWULCommand
131{
132public:
133	FWULCommand(bool verbose = false);
134	~FWULCommand();
135
136	HECI_STATUS GetFWUVersionAndInfo(FWU_GET_VERSION_MSG_REPLY &verMsg, FWU_GET_INFO_MSG_REPLY &infoMsg);
137
138	HECILinux FWULClient;
139
140private:
141	HECI_STATUS _call(const unsigned char *command, UINT32 command_size, UINT8 **readBuffer, UINT32 *outBuffSize);
142
143	bool _verbose;
144};
145
146#endif //__FWUL_COMMAND_H__
147
148