xref: /openbmc/linux/drivers/virt/vboxguest/vmmdev.h (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1579db9d4SHans de Goede /* SPDX-License-Identifier: (GPL-2.0 OR CDDL-1.0) */
2579db9d4SHans de Goede /*
3579db9d4SHans de Goede  * Virtual Device for Guest <-> VMM/Host communication interface
4579db9d4SHans de Goede  *
5579db9d4SHans de Goede  * Copyright (C) 2006-2016 Oracle Corporation
6579db9d4SHans de Goede  */
7579db9d4SHans de Goede 
8579db9d4SHans de Goede #ifndef __VBOX_VMMDEV_H__
9579db9d4SHans de Goede #define __VBOX_VMMDEV_H__
10579db9d4SHans de Goede 
11579db9d4SHans de Goede #include <asm/bitsperlong.h>
12579db9d4SHans de Goede #include <linux/sizes.h>
13579db9d4SHans de Goede #include <linux/types.h>
14579db9d4SHans de Goede #include <linux/vbox_vmmdev_types.h>
15579db9d4SHans de Goede 
16579db9d4SHans de Goede /* Port for generic request interface (relative offset). */
17579db9d4SHans de Goede #define VMMDEV_PORT_OFF_REQUEST                             0
18579db9d4SHans de Goede 
19579db9d4SHans de Goede /** Layout of VMMDEV RAM region that contains information for guest. */
20579db9d4SHans de Goede struct vmmdev_memory {
21579db9d4SHans de Goede 	/** The size of this structure. */
22579db9d4SHans de Goede 	u32 size;
23579db9d4SHans de Goede 	/** The structure version. (VMMDEV_MEMORY_VERSION) */
24579db9d4SHans de Goede 	u32 version;
25579db9d4SHans de Goede 
26579db9d4SHans de Goede 	union {
27579db9d4SHans de Goede 		struct {
28579db9d4SHans de Goede 			/** Flag telling that VMMDev has events pending. */
29579db9d4SHans de Goede 			u8 have_events;
30579db9d4SHans de Goede 			/** Explicit padding, MBZ. */
31579db9d4SHans de Goede 			u8 padding[3];
32579db9d4SHans de Goede 		} V1_04;
33579db9d4SHans de Goede 
34579db9d4SHans de Goede 		struct {
35579db9d4SHans de Goede 			/** Pending events flags, set by host. */
36579db9d4SHans de Goede 			u32 host_events;
37579db9d4SHans de Goede 			/** Mask of events the guest wants, set by guest. */
38579db9d4SHans de Goede 			u32 guest_event_mask;
39579db9d4SHans de Goede 		} V1_03;
40579db9d4SHans de Goede 	} V;
41579db9d4SHans de Goede 
42579db9d4SHans de Goede 	/* struct vbva_memory, not used */
43579db9d4SHans de Goede };
44579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_memory, 8 + 8);
45579db9d4SHans de Goede 
46579db9d4SHans de Goede /** Version of vmmdev_memory structure (vmmdev_memory::version). */
47579db9d4SHans de Goede #define VMMDEV_MEMORY_VERSION   (1)
48579db9d4SHans de Goede 
49579db9d4SHans de Goede /* Host mouse capabilities has been changed. */
50579db9d4SHans de Goede #define VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED             BIT(0)
51579db9d4SHans de Goede /* HGCM event. */
52579db9d4SHans de Goede #define VMMDEV_EVENT_HGCM                                   BIT(1)
53579db9d4SHans de Goede /* A display change request has been issued. */
54579db9d4SHans de Goede #define VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST                 BIT(2)
55579db9d4SHans de Goede /* Credentials are available for judgement. */
56579db9d4SHans de Goede #define VMMDEV_EVENT_JUDGE_CREDENTIALS                      BIT(3)
57579db9d4SHans de Goede /* The guest has been restored. */
58579db9d4SHans de Goede #define VMMDEV_EVENT_RESTORED                               BIT(4)
59579db9d4SHans de Goede /* Seamless mode state changed. */
60579db9d4SHans de Goede #define VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST           BIT(5)
61579db9d4SHans de Goede /* Memory balloon size changed. */
62579db9d4SHans de Goede #define VMMDEV_EVENT_BALLOON_CHANGE_REQUEST                 BIT(6)
63579db9d4SHans de Goede /* Statistics interval changed. */
64579db9d4SHans de Goede #define VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST     BIT(7)
65579db9d4SHans de Goede /* VRDP status changed. */
66579db9d4SHans de Goede #define VMMDEV_EVENT_VRDP                                   BIT(8)
67579db9d4SHans de Goede /* New mouse position data available. */
68579db9d4SHans de Goede #define VMMDEV_EVENT_MOUSE_POSITION_CHANGED                 BIT(9)
69579db9d4SHans de Goede /* CPU hotplug event occurred. */
70579db9d4SHans de Goede #define VMMDEV_EVENT_CPU_HOTPLUG                            BIT(10)
71579db9d4SHans de Goede /* The mask of valid events, for sanity checking. */
72579db9d4SHans de Goede #define VMMDEV_EVENT_VALID_EVENT_MASK                       0x000007ffU
73579db9d4SHans de Goede 
74579db9d4SHans de Goede /*
75579db9d4SHans de Goede  * Additions are allowed to work only if additions_major == vmmdev_current &&
76579db9d4SHans de Goede  * additions_minor <= vmmdev_current. Additions version is reported to host
77579db9d4SHans de Goede  * (VMMDev) by VMMDEVREQ_REPORT_GUEST_INFO.
78579db9d4SHans de Goede  */
79579db9d4SHans de Goede #define VMMDEV_VERSION                      0x00010004
80579db9d4SHans de Goede #define VMMDEV_VERSION_MAJOR                (VMMDEV_VERSION >> 16)
81579db9d4SHans de Goede #define VMMDEV_VERSION_MINOR                (VMMDEV_VERSION & 0xffff)
82579db9d4SHans de Goede 
83579db9d4SHans de Goede /* Maximum request packet size. */
84579db9d4SHans de Goede #define VMMDEV_MAX_VMMDEVREQ_SIZE           1048576
85579db9d4SHans de Goede 
86579db9d4SHans de Goede /* Version of vmmdev_request_header structure. */
87579db9d4SHans de Goede #define VMMDEV_REQUEST_HEADER_VERSION       0x10001
88579db9d4SHans de Goede 
89579db9d4SHans de Goede /** struct vmmdev_request_header - Generic VMMDev request header. */
90579db9d4SHans de Goede struct vmmdev_request_header {
91579db9d4SHans de Goede 	/** IN: Size of the structure in bytes (including body). */
92579db9d4SHans de Goede 	u32 size;
93579db9d4SHans de Goede 	/** IN: Version of the structure.  */
94579db9d4SHans de Goede 	u32 version;
95579db9d4SHans de Goede 	/** IN: Type of the request. */
96579db9d4SHans de Goede 	enum vmmdev_request_type request_type;
97579db9d4SHans de Goede 	/** OUT: Return code. */
98579db9d4SHans de Goede 	s32 rc;
99579db9d4SHans de Goede 	/** Reserved field no.1. MBZ. */
100579db9d4SHans de Goede 	u32 reserved1;
1010532a1b0SHans de Goede 	/** IN: Requestor information (VMMDEV_REQUESTOR_*) */
1020532a1b0SHans de Goede 	u32 requestor;
103579db9d4SHans de Goede };
104579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_request_header, 24);
105579db9d4SHans de Goede 
106579db9d4SHans de Goede /**
107579db9d4SHans de Goede  * struct vmmdev_mouse_status - Mouse status request structure.
108579db9d4SHans de Goede  *
109579db9d4SHans de Goede  * Used by VMMDEVREQ_GET_MOUSE_STATUS and VMMDEVREQ_SET_MOUSE_STATUS.
110579db9d4SHans de Goede  */
111579db9d4SHans de Goede struct vmmdev_mouse_status {
112579db9d4SHans de Goede 	/** header */
113579db9d4SHans de Goede 	struct vmmdev_request_header header;
114579db9d4SHans de Goede 	/** Mouse feature mask. See VMMDEV_MOUSE_*. */
115579db9d4SHans de Goede 	u32 mouse_features;
116579db9d4SHans de Goede 	/** Mouse x position. */
117579db9d4SHans de Goede 	s32 pointer_pos_x;
118579db9d4SHans de Goede 	/** Mouse y position. */
119579db9d4SHans de Goede 	s32 pointer_pos_y;
120579db9d4SHans de Goede };
121579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_mouse_status, 24 + 12);
122579db9d4SHans de Goede 
123579db9d4SHans de Goede /* The guest can (== wants to) handle absolute coordinates.  */
124579db9d4SHans de Goede #define VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE                     BIT(0)
125579db9d4SHans de Goede /*
126579db9d4SHans de Goede  * The host can (== wants to) send absolute coordinates.
127579db9d4SHans de Goede  * (Input not captured.)
128579db9d4SHans de Goede  */
129579db9d4SHans de Goede #define VMMDEV_MOUSE_HOST_WANTS_ABSOLUTE                    BIT(1)
130579db9d4SHans de Goede /*
131579db9d4SHans de Goede  * The guest can *NOT* switch to software cursor and therefore depends on the
132579db9d4SHans de Goede  * host cursor.
133579db9d4SHans de Goede  *
134579db9d4SHans de Goede  * When guest additions are installed and the host has promised to display the
135579db9d4SHans de Goede  * cursor itself, the guest installs a hardware mouse driver. Don't ask the
136579db9d4SHans de Goede  * guest to switch to a software cursor then.
137579db9d4SHans de Goede  */
138579db9d4SHans de Goede #define VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR                BIT(2)
139579db9d4SHans de Goede /* The host does NOT provide support for drawing the cursor itself. */
140579db9d4SHans de Goede #define VMMDEV_MOUSE_HOST_CANNOT_HWPOINTER                  BIT(3)
141579db9d4SHans de Goede /* The guest can read VMMDev events to find out about pointer movement */
142579db9d4SHans de Goede #define VMMDEV_MOUSE_NEW_PROTOCOL                           BIT(4)
143579db9d4SHans de Goede /*
144579db9d4SHans de Goede  * If the guest changes the status of the VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR
145579db9d4SHans de Goede  * bit, the host will honour this.
146579db9d4SHans de Goede  */
147579db9d4SHans de Goede #define VMMDEV_MOUSE_HOST_RECHECKS_NEEDS_HOST_CURSOR        BIT(5)
148579db9d4SHans de Goede /*
149579db9d4SHans de Goede  * The host supplies an absolute pointing device.  The Guest Additions may
150579db9d4SHans de Goede  * wish to use this to decide whether to install their own driver.
151579db9d4SHans de Goede  */
152579db9d4SHans de Goede #define VMMDEV_MOUSE_HOST_HAS_ABS_DEV                       BIT(6)
153579db9d4SHans de Goede 
154579db9d4SHans de Goede /* The minimum value our pointing device can return. */
155579db9d4SHans de Goede #define VMMDEV_MOUSE_RANGE_MIN 0
156579db9d4SHans de Goede /* The maximum value our pointing device can return. */
157579db9d4SHans de Goede #define VMMDEV_MOUSE_RANGE_MAX 0xFFFF
158579db9d4SHans de Goede 
159579db9d4SHans de Goede /**
160579db9d4SHans de Goede  * struct vmmdev_host_version - VirtualBox host version request structure.
161579db9d4SHans de Goede  *
162579db9d4SHans de Goede  * VBG uses this to detect the precense of new features in the interface.
163579db9d4SHans de Goede  */
164579db9d4SHans de Goede struct vmmdev_host_version {
165579db9d4SHans de Goede 	/** Header. */
166579db9d4SHans de Goede 	struct vmmdev_request_header header;
167579db9d4SHans de Goede 	/** Major version. */
168579db9d4SHans de Goede 	u16 major;
169579db9d4SHans de Goede 	/** Minor version. */
170579db9d4SHans de Goede 	u16 minor;
171579db9d4SHans de Goede 	/** Build number. */
172579db9d4SHans de Goede 	u32 build;
173579db9d4SHans de Goede 	/** SVN revision. */
174579db9d4SHans de Goede 	u32 revision;
175579db9d4SHans de Goede 	/** Feature mask. */
176579db9d4SHans de Goede 	u32 features;
177579db9d4SHans de Goede };
178579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_host_version, 24 + 16);
179579db9d4SHans de Goede 
180579db9d4SHans de Goede /* Physical page lists are supported by HGCM. */
181579db9d4SHans de Goede #define VMMDEV_HVF_HGCM_PHYS_PAGE_LIST  BIT(0)
182579db9d4SHans de Goede 
183579db9d4SHans de Goede /**
184579db9d4SHans de Goede  * struct vmmdev_mask - Structure to set / clear bits in a mask used for
185579db9d4SHans de Goede  * VMMDEVREQ_SET_GUEST_CAPABILITIES and VMMDEVREQ_CTL_GUEST_FILTER_MASK.
186579db9d4SHans de Goede  */
187579db9d4SHans de Goede struct vmmdev_mask {
188579db9d4SHans de Goede 	/** Header. */
189579db9d4SHans de Goede 	struct vmmdev_request_header header;
190579db9d4SHans de Goede 	/** Mask of bits to be set. */
191579db9d4SHans de Goede 	u32 or_mask;
192579db9d4SHans de Goede 	/** Mask of bits to be cleared. */
193579db9d4SHans de Goede 	u32 not_mask;
194579db9d4SHans de Goede };
195579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_mask, 24 + 8);
196579db9d4SHans de Goede 
197579db9d4SHans de Goede /* The guest supports seamless display rendering. */
198579db9d4SHans de Goede #define VMMDEV_GUEST_SUPPORTS_SEAMLESS                      BIT(0)
199579db9d4SHans de Goede /* The guest supports mapping guest to host windows. */
200579db9d4SHans de Goede #define VMMDEV_GUEST_SUPPORTS_GUEST_HOST_WINDOW_MAPPING     BIT(1)
201579db9d4SHans de Goede /*
202579db9d4SHans de Goede  * The guest graphical additions are active.
203579db9d4SHans de Goede  * Used for fast activation and deactivation of certain graphical operations
204579db9d4SHans de Goede  * (e.g. resizing & seamless). The legacy VMMDEVREQ_REPORT_GUEST_CAPABILITIES
205579db9d4SHans de Goede  * request sets this automatically, but VMMDEVREQ_SET_GUEST_CAPABILITIES does
206579db9d4SHans de Goede  * not.
207579db9d4SHans de Goede  */
208579db9d4SHans de Goede #define VMMDEV_GUEST_SUPPORTS_GRAPHICS                      BIT(2)
209*59d1d2e8SHans de Goede /* The mask of valid capabilities, for sanity checking. */
210*59d1d2e8SHans de Goede #define VMMDEV_GUEST_CAPABILITIES_MASK                      0x00000007U
211579db9d4SHans de Goede 
212579db9d4SHans de Goede /** struct vmmdev_hypervisorinfo - Hypervisor info structure. */
213579db9d4SHans de Goede struct vmmdev_hypervisorinfo {
214579db9d4SHans de Goede 	/** Header. */
215579db9d4SHans de Goede 	struct vmmdev_request_header header;
216579db9d4SHans de Goede 	/**
217579db9d4SHans de Goede 	 * Guest virtual address of proposed hypervisor start.
218579db9d4SHans de Goede 	 * Not used by VMMDEVREQ_GET_HYPERVISOR_INFO.
219579db9d4SHans de Goede 	 */
220579db9d4SHans de Goede 	u32 hypervisor_start;
221579db9d4SHans de Goede 	/** Hypervisor size in bytes. */
222579db9d4SHans de Goede 	u32 hypervisor_size;
223579db9d4SHans de Goede };
224579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hypervisorinfo, 24 + 8);
225579db9d4SHans de Goede 
226579db9d4SHans de Goede /** struct vmmdev_events - Pending events structure. */
227579db9d4SHans de Goede struct vmmdev_events {
228579db9d4SHans de Goede 	/** Header. */
229579db9d4SHans de Goede 	struct vmmdev_request_header header;
230579db9d4SHans de Goede 	/** OUT: Pending event mask. */
231579db9d4SHans de Goede 	u32 events;
232579db9d4SHans de Goede };
233579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_events, 24 + 4);
234579db9d4SHans de Goede 
235579db9d4SHans de Goede #define VMMDEV_OSTYPE_LINUX26		0x53000
236579db9d4SHans de Goede #define VMMDEV_OSTYPE_X64		BIT(8)
237579db9d4SHans de Goede 
238579db9d4SHans de Goede /** struct vmmdev_guestinfo - Guest information report. */
239579db9d4SHans de Goede struct vmmdev_guest_info {
240579db9d4SHans de Goede 	/** Header. */
241579db9d4SHans de Goede 	struct vmmdev_request_header header;
242579db9d4SHans de Goede 	/**
243579db9d4SHans de Goede 	 * The VMMDev interface version expected by additions.
244579db9d4SHans de Goede 	 * *Deprecated*, do not use anymore! Will be removed.
245579db9d4SHans de Goede 	 */
246579db9d4SHans de Goede 	u32 interface_version;
247579db9d4SHans de Goede 	/** Guest OS type. */
248579db9d4SHans de Goede 	u32 os_type;
249579db9d4SHans de Goede };
250579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_guest_info, 24 + 8);
251579db9d4SHans de Goede 
2520532a1b0SHans de Goede #define VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO	BIT(0)
2530532a1b0SHans de Goede 
254579db9d4SHans de Goede /** struct vmmdev_guestinfo2 - Guest information report, version 2. */
255579db9d4SHans de Goede struct vmmdev_guest_info2 {
256579db9d4SHans de Goede 	/** Header. */
257579db9d4SHans de Goede 	struct vmmdev_request_header header;
258579db9d4SHans de Goede 	/** Major version. */
259579db9d4SHans de Goede 	u16 additions_major;
260579db9d4SHans de Goede 	/** Minor version. */
261579db9d4SHans de Goede 	u16 additions_minor;
262579db9d4SHans de Goede 	/** Build number. */
263579db9d4SHans de Goede 	u32 additions_build;
264579db9d4SHans de Goede 	/** SVN revision. */
265579db9d4SHans de Goede 	u32 additions_revision;
2660532a1b0SHans de Goede 	/** Feature mask. */
267579db9d4SHans de Goede 	u32 additions_features;
268579db9d4SHans de Goede 	/**
269579db9d4SHans de Goede 	 * The intentional meaning of this field was:
270579db9d4SHans de Goede 	 * Some additional information, for example 'Beta 1' or something like
271579db9d4SHans de Goede 	 * that.
272579db9d4SHans de Goede 	 *
273579db9d4SHans de Goede 	 * The way it was implemented was implemented: VBG_VERSION_STRING.
274579db9d4SHans de Goede 	 *
275579db9d4SHans de Goede 	 * This means the first three members are duplicated in this field (if
276579db9d4SHans de Goede 	 * the guest build config is sane). So, the user must check this and
277579db9d4SHans de Goede 	 * chop it off before usage. There is, because of the Main code's blind
278579db9d4SHans de Goede 	 * trust in the field's content, no way back.
279579db9d4SHans de Goede 	 */
280579db9d4SHans de Goede 	char name[128];
281579db9d4SHans de Goede };
282579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_guest_info2, 24 + 144);
283579db9d4SHans de Goede 
284579db9d4SHans de Goede enum vmmdev_guest_facility_type {
285579db9d4SHans de Goede 	VBOXGUEST_FACILITY_TYPE_UNKNOWN          = 0,
286579db9d4SHans de Goede 	VBOXGUEST_FACILITY_TYPE_VBOXGUEST_DRIVER = 20,
287579db9d4SHans de Goede 	/* VBoxGINA / VBoxCredProv / pam_vbox. */
288579db9d4SHans de Goede 	VBOXGUEST_FACILITY_TYPE_AUTO_LOGON       = 90,
289579db9d4SHans de Goede 	VBOXGUEST_FACILITY_TYPE_VBOX_SERVICE     = 100,
290579db9d4SHans de Goede 	/* VBoxTray (Windows), VBoxClient (Linux, Unix). */
291579db9d4SHans de Goede 	VBOXGUEST_FACILITY_TYPE_VBOX_TRAY_CLIENT = 101,
292579db9d4SHans de Goede 	VBOXGUEST_FACILITY_TYPE_SEAMLESS         = 1000,
293579db9d4SHans de Goede 	VBOXGUEST_FACILITY_TYPE_GRAPHICS         = 1100,
294579db9d4SHans de Goede 	VBOXGUEST_FACILITY_TYPE_ALL              = 0x7ffffffe,
295579db9d4SHans de Goede 	/* Ensure the enum is a 32 bit data-type */
296579db9d4SHans de Goede 	VBOXGUEST_FACILITY_TYPE_SIZEHACK         = 0x7fffffff
297579db9d4SHans de Goede };
298579db9d4SHans de Goede 
299579db9d4SHans de Goede enum vmmdev_guest_facility_status {
300579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_INACTIVE    = 0,
301579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_PAUSED      = 1,
302579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_PRE_INIT    = 20,
303579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_INIT        = 30,
304579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_ACTIVE      = 50,
305579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_TERMINATING = 100,
306579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_TERMINATED  = 101,
307579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_FAILED      = 800,
308579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_UNKNOWN     = 999,
309579db9d4SHans de Goede 	/* Ensure the enum is a 32 bit data-type */
310579db9d4SHans de Goede 	VBOXGUEST_FACILITY_STATUS_SIZEHACK    = 0x7fffffff
311579db9d4SHans de Goede };
312579db9d4SHans de Goede 
313579db9d4SHans de Goede /** struct vmmdev_guest_status - Guest Additions status structure. */
314579db9d4SHans de Goede struct vmmdev_guest_status {
315579db9d4SHans de Goede 	/** Header. */
316579db9d4SHans de Goede 	struct vmmdev_request_header header;
317579db9d4SHans de Goede 	/** Facility the status is indicated for. */
318579db9d4SHans de Goede 	enum vmmdev_guest_facility_type facility;
319579db9d4SHans de Goede 	/** Current guest status. */
320579db9d4SHans de Goede 	enum vmmdev_guest_facility_status status;
321579db9d4SHans de Goede 	/** Flags, not used at the moment. */
322579db9d4SHans de Goede 	u32 flags;
323579db9d4SHans de Goede };
324579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_guest_status, 24 + 12);
325579db9d4SHans de Goede 
326579db9d4SHans de Goede #define VMMDEV_MEMORY_BALLOON_CHUNK_SIZE             (1048576)
327579db9d4SHans de Goede #define VMMDEV_MEMORY_BALLOON_CHUNK_PAGES            (1048576 / 4096)
328579db9d4SHans de Goede 
329579db9d4SHans de Goede /** struct vmmdev_memballoon_info - Memory-balloon info structure. */
330579db9d4SHans de Goede struct vmmdev_memballoon_info {
331579db9d4SHans de Goede 	/** Header. */
332579db9d4SHans de Goede 	struct vmmdev_request_header header;
333579db9d4SHans de Goede 	/** Balloon size in megabytes. */
334579db9d4SHans de Goede 	u32 balloon_chunks;
335579db9d4SHans de Goede 	/** Guest ram size in megabytes. */
336579db9d4SHans de Goede 	u32 phys_mem_chunks;
337579db9d4SHans de Goede 	/**
338579db9d4SHans de Goede 	 * Setting this to VMMDEV_EVENT_BALLOON_CHANGE_REQUEST indicates that
339579db9d4SHans de Goede 	 * the request is a response to that event.
340579db9d4SHans de Goede 	 * (Don't confuse this with VMMDEVREQ_ACKNOWLEDGE_EVENTS.)
341579db9d4SHans de Goede 	 */
342579db9d4SHans de Goede 	u32 event_ack;
343579db9d4SHans de Goede };
344579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_memballoon_info, 24 + 12);
345579db9d4SHans de Goede 
346579db9d4SHans de Goede /** struct vmmdev_memballoon_change - Change the size of the balloon. */
347579db9d4SHans de Goede struct vmmdev_memballoon_change {
348579db9d4SHans de Goede 	/** Header. */
349579db9d4SHans de Goede 	struct vmmdev_request_header header;
350579db9d4SHans de Goede 	/** The number of pages in the array. */
351579db9d4SHans de Goede 	u32 pages;
352579db9d4SHans de Goede 	/** true = inflate, false = deflate.  */
353579db9d4SHans de Goede 	u32 inflate;
354579db9d4SHans de Goede 	/** Physical address (u64) of each page. */
355579db9d4SHans de Goede 	u64 phys_page[VMMDEV_MEMORY_BALLOON_CHUNK_PAGES];
356579db9d4SHans de Goede };
357579db9d4SHans de Goede 
358579db9d4SHans de Goede /** struct vmmdev_write_core_dump - Write Core Dump request data. */
359579db9d4SHans de Goede struct vmmdev_write_core_dump {
360579db9d4SHans de Goede 	/** Header. */
361579db9d4SHans de Goede 	struct vmmdev_request_header header;
362579db9d4SHans de Goede 	/** Flags (reserved, MBZ). */
363579db9d4SHans de Goede 	u32 flags;
364579db9d4SHans de Goede };
365579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_write_core_dump, 24 + 4);
366579db9d4SHans de Goede 
367579db9d4SHans de Goede /** struct vmmdev_heartbeat - Heart beat check state structure. */
368579db9d4SHans de Goede struct vmmdev_heartbeat {
369579db9d4SHans de Goede 	/** Header. */
370579db9d4SHans de Goede 	struct vmmdev_request_header header;
371579db9d4SHans de Goede 	/** OUT: Guest heartbeat interval in nanosec. */
372579db9d4SHans de Goede 	u64 interval_ns;
373579db9d4SHans de Goede 	/** Heartbeat check flag. */
374579db9d4SHans de Goede 	u8 enabled;
375579db9d4SHans de Goede 	/** Explicit padding, MBZ. */
376579db9d4SHans de Goede 	u8 padding[3];
377579db9d4SHans de Goede } __packed;
378579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_heartbeat, 24 + 12);
379579db9d4SHans de Goede 
380579db9d4SHans de Goede #define VMMDEV_HGCM_REQ_DONE      BIT(0)
381579db9d4SHans de Goede #define VMMDEV_HGCM_REQ_CANCELLED BIT(1)
382579db9d4SHans de Goede 
383579db9d4SHans de Goede /** struct vmmdev_hgcmreq_header - vmmdev HGCM requests header. */
384579db9d4SHans de Goede struct vmmdev_hgcmreq_header {
385579db9d4SHans de Goede 	/** Request header. */
386579db9d4SHans de Goede 	struct vmmdev_request_header header;
387579db9d4SHans de Goede 
388579db9d4SHans de Goede 	/** HGCM flags. */
389579db9d4SHans de Goede 	u32 flags;
390579db9d4SHans de Goede 
391579db9d4SHans de Goede 	/** Result code. */
392579db9d4SHans de Goede 	s32 result;
393579db9d4SHans de Goede };
394579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcmreq_header, 24 + 8);
395579db9d4SHans de Goede 
396579db9d4SHans de Goede /** struct vmmdev_hgcm_connect - HGCM connect request structure. */
397579db9d4SHans de Goede struct vmmdev_hgcm_connect {
398579db9d4SHans de Goede 	/** HGCM request header. */
399579db9d4SHans de Goede 	struct vmmdev_hgcmreq_header header;
400579db9d4SHans de Goede 
401579db9d4SHans de Goede 	/** IN: Description of service to connect to. */
402579db9d4SHans de Goede 	struct vmmdev_hgcm_service_location loc;
403579db9d4SHans de Goede 
404579db9d4SHans de Goede 	/** OUT: Client identifier assigned by local instance of HGCM. */
405579db9d4SHans de Goede 	u32 client_id;
406579db9d4SHans de Goede };
407579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcm_connect, 32 + 132 + 4);
408579db9d4SHans de Goede 
409579db9d4SHans de Goede /** struct vmmdev_hgcm_disconnect - HGCM disconnect request structure. */
410579db9d4SHans de Goede struct vmmdev_hgcm_disconnect {
411579db9d4SHans de Goede 	/** HGCM request header. */
412579db9d4SHans de Goede 	struct vmmdev_hgcmreq_header header;
413579db9d4SHans de Goede 
414579db9d4SHans de Goede 	/** IN: Client identifier. */
415579db9d4SHans de Goede 	u32 client_id;
416579db9d4SHans de Goede };
417579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcm_disconnect, 32 + 4);
418579db9d4SHans de Goede 
419579db9d4SHans de Goede #define VMMDEV_HGCM_MAX_PARMS 32
420579db9d4SHans de Goede 
421579db9d4SHans de Goede /** struct vmmdev_hgcm_call - HGCM call request structure. */
422579db9d4SHans de Goede struct vmmdev_hgcm_call {
423579db9d4SHans de Goede 	/* request header */
424579db9d4SHans de Goede 	struct vmmdev_hgcmreq_header header;
425579db9d4SHans de Goede 
426579db9d4SHans de Goede 	/** IN: Client identifier. */
427579db9d4SHans de Goede 	u32 client_id;
428579db9d4SHans de Goede 	/** IN: Service function number. */
429579db9d4SHans de Goede 	u32 function;
430579db9d4SHans de Goede 	/** IN: Number of parameters. */
431579db9d4SHans de Goede 	u32 parm_count;
432579db9d4SHans de Goede 	/** Parameters follow in form: HGCMFunctionParameter32|64 parms[X]; */
433579db9d4SHans de Goede };
434579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcm_call, 32 + 12);
435579db9d4SHans de Goede 
436579db9d4SHans de Goede /**
437579db9d4SHans de Goede  * struct vmmdev_hgcm_cancel2 - HGCM cancel request structure, version 2.
438579db9d4SHans de Goede  *
439579db9d4SHans de Goede  * After the request header.rc will be:
440579db9d4SHans de Goede  *
441579db9d4SHans de Goede  * VINF_SUCCESS when cancelled.
442579db9d4SHans de Goede  * VERR_NOT_FOUND if the specified request cannot be found.
443579db9d4SHans de Goede  * VERR_INVALID_PARAMETER if the address is invalid valid.
444579db9d4SHans de Goede  */
445579db9d4SHans de Goede struct vmmdev_hgcm_cancel2 {
446579db9d4SHans de Goede 	/** Header. */
447579db9d4SHans de Goede 	struct vmmdev_request_header header;
448579db9d4SHans de Goede 	/** The physical address of the request to cancel. */
449579db9d4SHans de Goede 	u32 phys_req_to_cancel;
450579db9d4SHans de Goede };
451579db9d4SHans de Goede VMMDEV_ASSERT_SIZE(vmmdev_hgcm_cancel2, 24 + 4);
452579db9d4SHans de Goede 
453579db9d4SHans de Goede #endif
454