/* SPDX-License-Identifier: (GPL-2.0 OR CDDL-1.0) */
/*
 * Virtual Device for Guest <-> VMM/Host communication interface
 *
 * Copyright (C) 2006-2016 Oracle Corporation
 */

#ifndef __VBOX_VMMDEV_H__
#define __VBOX_VMMDEV_H__

#include <asm/bitsperlong.h>
#include <linux/sizes.h>
#include <linux/types.h>
#include <linux/vbox_vmmdev_types.h>

/* Port for generic request interface (relative offset). */
#define VMMDEV_PORT_OFF_REQUEST                             0

/** Layout of VMMDEV RAM region that contains information for guest. */
struct vmmdev_memory {
	/** The size of this structure. */
	u32 size;
	/** The structure version. (VMMDEV_MEMORY_VERSION) */
	u32 version;

	union {
		struct {
			/** Flag telling that VMMDev has events pending. */
			u8 have_events;
			/** Explicit padding, MBZ. */
			u8 padding[3];
		} V1_04;

		struct {
			/** Pending events flags, set by host. */
			u32 host_events;
			/** Mask of events the guest wants, set by guest. */
			u32 guest_event_mask;
		} V1_03;
	} V;

	/* struct vbva_memory, not used */
};
VMMDEV_ASSERT_SIZE(vmmdev_memory, 8 + 8);

/** Version of vmmdev_memory structure (vmmdev_memory::version). */
#define VMMDEV_MEMORY_VERSION   (1)

/* Host mouse capabilities has been changed. */
#define VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED             BIT(0)
/* HGCM event. */
#define VMMDEV_EVENT_HGCM                                   BIT(1)
/* A display change request has been issued. */
#define VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST                 BIT(2)
/* Credentials are available for judgement. */
#define VMMDEV_EVENT_JUDGE_CREDENTIALS                      BIT(3)
/* The guest has been restored. */
#define VMMDEV_EVENT_RESTORED                               BIT(4)
/* Seamless mode state changed. */
#define VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST           BIT(5)
/* Memory balloon size changed. */
#define VMMDEV_EVENT_BALLOON_CHANGE_REQUEST                 BIT(6)
/* Statistics interval changed. */
#define VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST     BIT(7)
/* VRDP status changed. */
#define VMMDEV_EVENT_VRDP                                   BIT(8)
/* New mouse position data available. */
#define VMMDEV_EVENT_MOUSE_POSITION_CHANGED                 BIT(9)
/* CPU hotplug event occurred. */
#define VMMDEV_EVENT_CPU_HOTPLUG                            BIT(10)
/* The mask of valid events, for sanity checking. */
#define VMMDEV_EVENT_VALID_EVENT_MASK                       0x000007ffU

/*
 * Additions are allowed to work only if additions_major == vmmdev_current &&
 * additions_minor <= vmmdev_current. Additions version is reported to host
 * (VMMDev) by VMMDEVREQ_REPORT_GUEST_INFO.
 */
#define VMMDEV_VERSION                      0x00010004
#define VMMDEV_VERSION_MAJOR                (VMMDEV_VERSION >> 16)
#define VMMDEV_VERSION_MINOR                (VMMDEV_VERSION & 0xffff)

/* Maximum request packet size. */
#define VMMDEV_MAX_VMMDEVREQ_SIZE           1048576

/* Version of vmmdev_request_header structure. */
#define VMMDEV_REQUEST_HEADER_VERSION       0x10001

/** struct vmmdev_request_header - Generic VMMDev request header. */
struct vmmdev_request_header {
	/** IN: Size of the structure in bytes (including body). */
	u32 size;
	/** IN: Version of the structure.  */
	u32 version;
	/** IN: Type of the request. */
	enum vmmdev_request_type request_type;
	/** OUT: Return code. */
	s32 rc;
	/** Reserved field no.1. MBZ. */
	u32 reserved1;
	/** IN: Requestor information (VMMDEV_REQUESTOR_*) */
	u32 requestor;
};
VMMDEV_ASSERT_SIZE(vmmdev_request_header, 24);

/**
 * struct vmmdev_mouse_status - Mouse status request structure.
 *
 * Used by VMMDEVREQ_GET_MOUSE_STATUS and VMMDEVREQ_SET_MOUSE_STATUS.
 */
struct vmmdev_mouse_status {
	/** header */
	struct vmmdev_request_header header;
	/** Mouse feature mask. See VMMDEV_MOUSE_*. */
	u32 mouse_features;
	/** Mouse x position. */
	s32 pointer_pos_x;
	/** Mouse y position. */
	s32 pointer_pos_y;
};
VMMDEV_ASSERT_SIZE(vmmdev_mouse_status, 24 + 12);

/* The guest can (== wants to) handle absolute coordinates.  */
#define VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE                     BIT(0)
/*
 * The host can (== wants to) send absolute coordinates.
 * (Input not captured.)
 */
#define VMMDEV_MOUSE_HOST_WANTS_ABSOLUTE                    BIT(1)
/*
 * The guest can *NOT* switch to software cursor and therefore depends on the
 * host cursor.
 *
 * When guest additions are installed and the host has promised to display the
 * cursor itself, the guest installs a hardware mouse driver. Don't ask the
 * guest to switch to a software cursor then.
 */
#define VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR                BIT(2)
/* The host does NOT provide support for drawing the cursor itself. */
#define VMMDEV_MOUSE_HOST_CANNOT_HWPOINTER                  BIT(3)
/* The guest can read VMMDev events to find out about pointer movement */
#define VMMDEV_MOUSE_NEW_PROTOCOL                           BIT(4)
/*
 * If the guest changes the status of the VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR
 * bit, the host will honour this.
 */
#define VMMDEV_MOUSE_HOST_RECHECKS_NEEDS_HOST_CURSOR        BIT(5)
/*
 * The host supplies an absolute pointing device.  The Guest Additions may
 * wish to use this to decide whether to install their own driver.
 */
#define VMMDEV_MOUSE_HOST_HAS_ABS_DEV                       BIT(6)

/* The minimum value our pointing device can return. */
#define VMMDEV_MOUSE_RANGE_MIN 0
/* The maximum value our pointing device can return. */
#define VMMDEV_MOUSE_RANGE_MAX 0xFFFF

/**
 * struct vmmdev_host_version - VirtualBox host version request structure.
 *
 * VBG uses this to detect the precense of new features in the interface.
 */
struct vmmdev_host_version {
	/** Header. */
	struct vmmdev_request_header header;
	/** Major version. */
	u16 major;
	/** Minor version. */
	u16 minor;
	/** Build number. */
	u32 build;
	/** SVN revision. */
	u32 revision;
	/** Feature mask. */
	u32 features;
};
VMMDEV_ASSERT_SIZE(vmmdev_host_version, 24 + 16);

/* Physical page lists are supported by HGCM. */
#define VMMDEV_HVF_HGCM_PHYS_PAGE_LIST  BIT(0)

/**
 * struct vmmdev_mask - Structure to set / clear bits in a mask used for
 * VMMDEVREQ_SET_GUEST_CAPABILITIES and VMMDEVREQ_CTL_GUEST_FILTER_MASK.
 */
struct vmmdev_mask {
	/** Header. */
	struct vmmdev_request_header header;
	/** Mask of bits to be set. */
	u32 or_mask;
	/** Mask of bits to be cleared. */
	u32 not_mask;
};
VMMDEV_ASSERT_SIZE(vmmdev_mask, 24 + 8);

/* The guest supports seamless display rendering. */
#define VMMDEV_GUEST_SUPPORTS_SEAMLESS                      BIT(0)
/* The guest supports mapping guest to host windows. */
#define VMMDEV_GUEST_SUPPORTS_GUEST_HOST_WINDOW_MAPPING     BIT(1)
/*
 * The guest graphical additions are active.
 * Used for fast activation and deactivation of certain graphical operations
 * (e.g. resizing & seamless). The legacy VMMDEVREQ_REPORT_GUEST_CAPABILITIES
 * request sets this automatically, but VMMDEVREQ_SET_GUEST_CAPABILITIES does
 * not.
 */
#define VMMDEV_GUEST_SUPPORTS_GRAPHICS                      BIT(2)
/* The mask of valid capabilities, for sanity checking. */
#define VMMDEV_GUEST_CAPABILITIES_MASK                      0x00000007U

/** struct vmmdev_hypervisorinfo - Hypervisor info structure. */
struct vmmdev_hypervisorinfo {
	/** Header. */
	struct vmmdev_request_header header;
	/**
	 * Guest virtual address of proposed hypervisor start.
	 * Not used by VMMDEVREQ_GET_HYPERVISOR_INFO.
	 */
	u32 hypervisor_start;
	/** Hypervisor size in bytes. */
	u32 hypervisor_size;
};
VMMDEV_ASSERT_SIZE(vmmdev_hypervisorinfo, 24 + 8);

/** struct vmmdev_events - Pending events structure. */
struct vmmdev_events {
	/** Header. */
	struct vmmdev_request_header header;
	/** OUT: Pending event mask. */
	u32 events;
};
VMMDEV_ASSERT_SIZE(vmmdev_events, 24 + 4);

#define VMMDEV_OSTYPE_LINUX26		0x53000
#define VMMDEV_OSTYPE_X64		BIT(8)

/** struct vmmdev_guestinfo - Guest information report. */
struct vmmdev_guest_info {
	/** Header. */
	struct vmmdev_request_header header;
	/**
	 * The VMMDev interface version expected by additions.
	 * *Deprecated*, do not use anymore! Will be removed.
	 */
	u32 interface_version;
	/** Guest OS type. */
	u32 os_type;
};
VMMDEV_ASSERT_SIZE(vmmdev_guest_info, 24 + 8);

#define VMMDEV_GUEST_INFO2_ADDITIONS_FEATURES_REQUESTOR_INFO	BIT(0)

/** struct vmmdev_guestinfo2 - Guest information report, version 2. */
struct vmmdev_guest_info2 {
	/** Header. */
	struct vmmdev_request_header header;
	/** Major version. */
	u16 additions_major;
	/** Minor version. */
	u16 additions_minor;
	/** Build number. */
	u32 additions_build;
	/** SVN revision. */
	u32 additions_revision;
	/** Feature mask. */
	u32 additions_features;
	/**
	 * The intentional meaning of this field was:
	 * Some additional information, for example 'Beta 1' or something like
	 * that.
	 *
	 * The way it was implemented was implemented: VBG_VERSION_STRING.
	 *
	 * This means the first three members are duplicated in this field (if
	 * the guest build config is sane). So, the user must check this and
	 * chop it off before usage. There is, because of the Main code's blind
	 * trust in the field's content, no way back.
	 */
	char name[128];
};
VMMDEV_ASSERT_SIZE(vmmdev_guest_info2, 24 + 144);

enum vmmdev_guest_facility_type {
	VBOXGUEST_FACILITY_TYPE_UNKNOWN          = 0,
	VBOXGUEST_FACILITY_TYPE_VBOXGUEST_DRIVER = 20,
	/* VBoxGINA / VBoxCredProv / pam_vbox. */
	VBOXGUEST_FACILITY_TYPE_AUTO_LOGON       = 90,
	VBOXGUEST_FACILITY_TYPE_VBOX_SERVICE     = 100,
	/* VBoxTray (Windows), VBoxClient (Linux, Unix). */
	VBOXGUEST_FACILITY_TYPE_VBOX_TRAY_CLIENT = 101,
	VBOXGUEST_FACILITY_TYPE_SEAMLESS         = 1000,
	VBOXGUEST_FACILITY_TYPE_GRAPHICS         = 1100,
	VBOXGUEST_FACILITY_TYPE_ALL              = 0x7ffffffe,
	/* Ensure the enum is a 32 bit data-type */
	VBOXGUEST_FACILITY_TYPE_SIZEHACK         = 0x7fffffff
};

enum vmmdev_guest_facility_status {
	VBOXGUEST_FACILITY_STATUS_INACTIVE    = 0,
	VBOXGUEST_FACILITY_STATUS_PAUSED      = 1,
	VBOXGUEST_FACILITY_STATUS_PRE_INIT    = 20,
	VBOXGUEST_FACILITY_STATUS_INIT        = 30,
	VBOXGUEST_FACILITY_STATUS_ACTIVE      = 50,
	VBOXGUEST_FACILITY_STATUS_TERMINATING = 100,
	VBOXGUEST_FACILITY_STATUS_TERMINATED  = 101,
	VBOXGUEST_FACILITY_STATUS_FAILED      = 800,
	VBOXGUEST_FACILITY_STATUS_UNKNOWN     = 999,
	/* Ensure the enum is a 32 bit data-type */
	VBOXGUEST_FACILITY_STATUS_SIZEHACK    = 0x7fffffff
};

/** struct vmmdev_guest_status - Guest Additions status structure. */
struct vmmdev_guest_status {
	/** Header. */
	struct vmmdev_request_header header;
	/** Facility the status is indicated for. */
	enum vmmdev_guest_facility_type facility;
	/** Current guest status. */
	enum vmmdev_guest_facility_status status;
	/** Flags, not used at the moment. */
	u32 flags;
};
VMMDEV_ASSERT_SIZE(vmmdev_guest_status, 24 + 12);

#define VMMDEV_MEMORY_BALLOON_CHUNK_SIZE             (1048576)
#define VMMDEV_MEMORY_BALLOON_CHUNK_PAGES            (1048576 / 4096)

/** struct vmmdev_memballoon_info - Memory-balloon info structure. */
struct vmmdev_memballoon_info {
	/** Header. */
	struct vmmdev_request_header header;
	/** Balloon size in megabytes. */
	u32 balloon_chunks;
	/** Guest ram size in megabytes. */
	u32 phys_mem_chunks;
	/**
	 * Setting this to VMMDEV_EVENT_BALLOON_CHANGE_REQUEST indicates that
	 * the request is a response to that event.
	 * (Don't confuse this with VMMDEVREQ_ACKNOWLEDGE_EVENTS.)
	 */
	u32 event_ack;
};
VMMDEV_ASSERT_SIZE(vmmdev_memballoon_info, 24 + 12);

/** struct vmmdev_memballoon_change - Change the size of the balloon. */
struct vmmdev_memballoon_change {
	/** Header. */
	struct vmmdev_request_header header;
	/** The number of pages in the array. */
	u32 pages;
	/** true = inflate, false = deflate.  */
	u32 inflate;
	/** Physical address (u64) of each page. */
	u64 phys_page[VMMDEV_MEMORY_BALLOON_CHUNK_PAGES];
};

/** struct vmmdev_write_core_dump - Write Core Dump request data. */
struct vmmdev_write_core_dump {
	/** Header. */
	struct vmmdev_request_header header;
	/** Flags (reserved, MBZ). */
	u32 flags;
};
VMMDEV_ASSERT_SIZE(vmmdev_write_core_dump, 24 + 4);

/** struct vmmdev_heartbeat - Heart beat check state structure. */
struct vmmdev_heartbeat {
	/** Header. */
	struct vmmdev_request_header header;
	/** OUT: Guest heartbeat interval in nanosec. */
	u64 interval_ns;
	/** Heartbeat check flag. */
	u8 enabled;
	/** Explicit padding, MBZ. */
	u8 padding[3];
} __packed;
VMMDEV_ASSERT_SIZE(vmmdev_heartbeat, 24 + 12);

#define VMMDEV_HGCM_REQ_DONE      BIT(0)
#define VMMDEV_HGCM_REQ_CANCELLED BIT(1)

/** struct vmmdev_hgcmreq_header - vmmdev HGCM requests header. */
struct vmmdev_hgcmreq_header {
	/** Request header. */
	struct vmmdev_request_header header;

	/** HGCM flags. */
	u32 flags;

	/** Result code. */
	s32 result;
};
VMMDEV_ASSERT_SIZE(vmmdev_hgcmreq_header, 24 + 8);

/** struct vmmdev_hgcm_connect - HGCM connect request structure. */
struct vmmdev_hgcm_connect {
	/** HGCM request header. */
	struct vmmdev_hgcmreq_header header;

	/** IN: Description of service to connect to. */
	struct vmmdev_hgcm_service_location loc;

	/** OUT: Client identifier assigned by local instance of HGCM. */
	u32 client_id;
};
VMMDEV_ASSERT_SIZE(vmmdev_hgcm_connect, 32 + 132 + 4);

/** struct vmmdev_hgcm_disconnect - HGCM disconnect request structure. */
struct vmmdev_hgcm_disconnect {
	/** HGCM request header. */
	struct vmmdev_hgcmreq_header header;

	/** IN: Client identifier. */
	u32 client_id;
};
VMMDEV_ASSERT_SIZE(vmmdev_hgcm_disconnect, 32 + 4);

#define VMMDEV_HGCM_MAX_PARMS 32

/** struct vmmdev_hgcm_call - HGCM call request structure. */
struct vmmdev_hgcm_call {
	/* request header */
	struct vmmdev_hgcmreq_header header;

	/** IN: Client identifier. */
	u32 client_id;
	/** IN: Service function number. */
	u32 function;
	/** IN: Number of parameters. */
	u32 parm_count;
	/** Parameters follow in form: HGCMFunctionParameter32|64 parms[X]; */
};
VMMDEV_ASSERT_SIZE(vmmdev_hgcm_call, 32 + 12);

/**
 * struct vmmdev_hgcm_cancel2 - HGCM cancel request structure, version 2.
 *
 * After the request header.rc will be:
 *
 * VINF_SUCCESS when cancelled.
 * VERR_NOT_FOUND if the specified request cannot be found.
 * VERR_INVALID_PARAMETER if the address is invalid valid.
 */
struct vmmdev_hgcm_cancel2 {
	/** Header. */
	struct vmmdev_request_header header;
	/** The physical address of the request to cancel. */
	u32 phys_req_to_cancel;
};
VMMDEV_ASSERT_SIZE(vmmdev_hgcm_cancel2, 24 + 4);

#endif
