1 /*
2  * Copyright (c) 2009, Microsoft Corporation.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  *
13  * You should have received a copy of the GNU General Public License along with
14  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
15  * Place - Suite 330, Boston, MA 02111-1307 USA.
16  *
17  * Authors:
18  *   Haiyang Zhang <haiyangz@microsoft.com>
19  *   Hank Janssen  <hjanssen@microsoft.com>
20  */
21 #ifndef __HV_UTILS_H_
22 #define __HV_UTILS_H_
23 
24 /*
25  * Common header for Hyper-V ICs
26  */
27 #define ICMSGTYPE_NEGOTIATE		0
28 #define ICMSGTYPE_HEARTBEAT		1
29 #define ICMSGTYPE_KVPEXCHANGE		2
30 #define ICMSGTYPE_SHUTDOWN		3
31 #define ICMSGTYPE_TIMESYNC		4
32 #define ICMSGTYPE_VSS			5
33 
34 #define ICMSGHDRFLAG_TRANSACTION	1
35 #define ICMSGHDRFLAG_REQUEST		2
36 #define ICMSGHDRFLAG_RESPONSE		4
37 
38 #define HV_S_OK				0x00000000
39 #define HV_E_FAIL			0x80004005
40 #define HV_ERROR_NOT_SUPPORTED		0x80070032
41 #define HV_ERROR_MACHINE_LOCKED		0x800704F7
42 
43 struct vmbuspipe_hdr {
44 	u32 flags;
45 	u32 msgsize;
46 } __packed;
47 
48 struct ic_version {
49 	u16 major;
50 	u16 minor;
51 } __packed;
52 
53 struct icmsg_hdr {
54 	struct ic_version icverframe;
55 	u16 icmsgtype;
56 	struct ic_version icvermsg;
57 	u16 icmsgsize;
58 	u32 status;
59 	u8 ictransaction_id;
60 	u8 icflags;
61 	u8 reserved[2];
62 } __packed;
63 
64 struct icmsg_negotiate {
65 	u16 icframe_vercnt;
66 	u16 icmsg_vercnt;
67 	u32 reserved;
68 	struct ic_version icversion_data[1]; /* any size array */
69 } __packed;
70 
71 struct shutdown_msg_data {
72 	u32 reason_code;
73 	u32 timeout_seconds;
74 	u32 flags;
75 	u8  display_message[2048];
76 } __packed;
77 
78 struct heartbeat_msg_data {
79 	u64 seq_num;
80 	u32 reserved[8];
81 } __packed;
82 
83 /* Time Sync IC defs */
84 #define ICTIMESYNCFLAG_PROBE	0
85 #define ICTIMESYNCFLAG_SYNC	1
86 #define ICTIMESYNCFLAG_SAMPLE	2
87 
88 #ifdef __x86_64__
89 #define WLTIMEDELTA	116444736000000000L	/* in 100ns unit */
90 #else
91 #define WLTIMEDELTA	116444736000000000LL
92 #endif
93 
94 struct ictimesync_data{
95 	u64 parenttime;
96 	u64 childtime;
97 	u64 roundtriptime;
98 	u8 flags;
99 } __packed;
100 
101 /* Index for each IC struct in array hv_cb_utils[] */
102 #define HV_SHUTDOWN_MSG		0
103 #define HV_TIMESYNC_MSG		1
104 #define HV_HEARTBEAT_MSG	2
105 #define HV_KVP_MSG		3
106 
107 struct hyperv_service_callback {
108 	u8 msg_type;
109 	char *log_msg;
110 	unsigned char data[16];
111 	struct vmbus_channel *channel;
112 	void (*callback) (void *context);
113 };
114 
115 extern void prep_negotiate_resp(struct icmsg_hdr *,
116 				struct icmsg_negotiate *, u8 *);
117 extern void chn_cb_negotiate(void *);
118 extern struct hyperv_service_callback hv_cb_utils[];
119 
120 #endif /* __HV_UTILS_H_ */
121