Commit eb79100f authored by Xavier Deguillard's avatar Xavier Deguillard Committed by Greg Kroah-Hartman
Browse files

VMware balloon: Add support for balloon capabilities.



In order to extend the balloon protocol, the hypervisor and the guest
driver need to agree on a set of supported functionality to use.

Signed-off-by: default avatarXavier Deguillard <xdeguillard@vmware.com>
Acked-by: default avatarDmitry Torokhov <dtor@vmware.com>
Signed-off-by: default avatarPhilip P. Moltmann <moltmann@vmware.com>
Acked-by: default avatarAndy King <acking@vmware.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ef0f8f11
Loading
Loading
Loading
Loading
+44 −30
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@

MODULE_AUTHOR("VMware, Inc.");
MODULE_DESCRIPTION("VMware Memory Control (Balloon) Driver");
MODULE_VERSION("1.2.2.0-k");
MODULE_VERSION("1.3.0.0-k");
MODULE_ALIAS("dmi:*:svnVMware*:*");
MODULE_ALIAS("vmware_vmmemctl");
MODULE_LICENSE("GPL");
@@ -110,9 +110,18 @@ MODULE_LICENSE("GPL");
 */
#define VMW_BALLOON_HV_PORT		0x5670
#define VMW_BALLOON_HV_MAGIC		0x456c6d6f
#define VMW_BALLOON_PROTOCOL_VERSION	2
#define VMW_BALLOON_GUEST_ID		1	/* Linux */

enum vmwballoon_capabilities {
	/*
	 * Bit 0 is reserved and not associated to any capability.
	 */
	VMW_BALLOON_BASIC_CMDS		= (1 << 1),
	VMW_BALLOON_BATCHED_CMDS	= (1 << 2)
};

#define VMW_BALLOON_CAPABILITIES	(VMW_BALLOON_BASIC_CMDS)

#define VMW_BALLOON_CMD_START		0
#define VMW_BALLOON_CMD_GET_TARGET	1
#define VMW_BALLOON_CMD_LOCK		2
@@ -131,11 +140,13 @@ MODULE_LICENSE("GPL");
#define VMW_BALLOON_ERROR_RESET		        7
#define VMW_BALLOON_ERROR_BUSY		        8

#define VMW_BALLOON_SUCCESS_WITH_CAPABILITIES	(0x03000000)

#define VMWARE_BALLOON_CMD(cmd, data, result)			\
({								\
	unsigned long __stat, __dummy1, __dummy2;	\
	unsigned long __status, __dummy1, __dummy2;		\
	__asm__ __volatile__ ("inl %%dx" :			\
		"=a"(__stat),				\
		"=a"(__status),					\
		"=c"(__dummy1),					\
		"=d"(__dummy2),					\
		"=b"(result) :					\
@@ -144,8 +155,10 @@ MODULE_LICENSE("GPL");
		"2"(VMW_BALLOON_HV_PORT),			\
		"3"(data) :					\
		"memory");					\
	if (VMW_BALLOON_CMD_##cmd == VMW_BALLOON_CMD_START)	\
		result = __dummy1;				\
	result &= -1UL;						\
	__stat & -1UL;					\
	__status & -1UL;					\
})

#ifdef CONFIG_DEBUG_FS
@@ -223,11 +236,12 @@ static struct vmballoon balloon;
 */
static bool vmballoon_send_start(struct vmballoon *b)
{
	unsigned long status, dummy;
	unsigned long status, capabilities;

	STATS_INC(b->stats.start);

	status = VMWARE_BALLOON_CMD(START, VMW_BALLOON_PROTOCOL_VERSION, dummy);
	status = VMWARE_BALLOON_CMD(START, VMW_BALLOON_CAPABILITIES,
				capabilities);
	if (status == VMW_BALLOON_SUCCESS)
		return true;