input/vmmouse: Use VMware hypercall API

Switch from VMWARE_HYPERCALL macro to vmware_hypercall API.
Eliminate arch specific code. No functional changes intended.

Signed-off-by: Alexey Makhalov <alexey.makhalov@broadcom.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/r/20240613191650.9913-4-alexey.makhalov@broadcom.com
This commit is contained in:
Alexey Makhalov 2024-06-13 12:16:45 -07:00 committed by Borislav Petkov (AMD)
parent 54651bb4dc
commit f0db90b412

@ -21,19 +21,16 @@
#include "psmouse.h" #include "psmouse.h"
#include "vmmouse.h" #include "vmmouse.h"
#define VMMOUSE_PROTO_MAGIC 0x564D5868U
/* /*
* Main commands supported by the vmmouse hypervisor port. * Main commands supported by the vmmouse hypervisor port.
*/ */
#define VMMOUSE_PROTO_CMD_GETVERSION 10 #define VMWARE_CMD_ABSPOINTER_DATA 39
#define VMMOUSE_PROTO_CMD_ABSPOINTER_DATA 39 #define VMWARE_CMD_ABSPOINTER_STATUS 40
#define VMMOUSE_PROTO_CMD_ABSPOINTER_STATUS 40 #define VMWARE_CMD_ABSPOINTER_COMMAND 41
#define VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND 41 #define VMWARE_CMD_ABSPOINTER_RESTRICT 86
#define VMMOUSE_PROTO_CMD_ABSPOINTER_RESTRICT 86
/* /*
* Subcommands for VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND * Subcommands for VMWARE_CMD_ABSPOINTER_COMMAND
*/ */
#define VMMOUSE_CMD_ENABLE 0x45414552U #define VMMOUSE_CMD_ENABLE 0x45414552U
#define VMMOUSE_CMD_DISABLE 0x000000f5U #define VMMOUSE_CMD_DISABLE 0x000000f5U
@ -76,28 +73,6 @@ struct vmmouse_data {
char dev_name[128]; char dev_name[128];
}; };
/*
* Hypervisor-specific bi-directional communication channel
* implementing the vmmouse protocol. Should never execute on
* bare metal hardware.
*/
#define VMMOUSE_CMD(cmd, in1, out1, out2, out3, out4) \
({ \
unsigned long __dummy1, __dummy2; \
__asm__ __volatile__ (VMWARE_HYPERCALL : \
"=a"(out1), \
"=b"(out2), \
"=c"(out3), \
"=d"(out4), \
"=S"(__dummy1), \
"=D"(__dummy2) : \
"a"(VMMOUSE_PROTO_MAGIC), \
"b"(in1), \
"c"(VMMOUSE_PROTO_CMD_##cmd), \
"d"(0) : \
"memory"); \
})
/** /**
* vmmouse_report_button - report button state on the correct input device * vmmouse_report_button - report button state on the correct input device
* *
@ -145,14 +120,12 @@ static psmouse_ret_t vmmouse_report_events(struct psmouse *psmouse)
struct input_dev *abs_dev = priv->abs_dev; struct input_dev *abs_dev = priv->abs_dev;
struct input_dev *pref_dev; struct input_dev *pref_dev;
u32 status, x, y, z; u32 status, x, y, z;
u32 dummy1, dummy2, dummy3;
unsigned int queue_length; unsigned int queue_length;
unsigned int count = 255; unsigned int count = 255;
while (count--) { while (count--) {
/* See if we have motion data. */ /* See if we have motion data. */
VMMOUSE_CMD(ABSPOINTER_STATUS, 0, status = vmware_hypercall1(VMWARE_CMD_ABSPOINTER_STATUS, 0);
status, dummy1, dummy2, dummy3);
if ((status & VMMOUSE_ERROR) == VMMOUSE_ERROR) { if ((status & VMMOUSE_ERROR) == VMMOUSE_ERROR) {
psmouse_err(psmouse, "failed to fetch status data\n"); psmouse_err(psmouse, "failed to fetch status data\n");
/* /*
@ -172,7 +145,8 @@ static psmouse_ret_t vmmouse_report_events(struct psmouse *psmouse)
} }
/* Now get it */ /* Now get it */
VMMOUSE_CMD(ABSPOINTER_DATA, 4, status, x, y, z); status = vmware_hypercall4(VMWARE_CMD_ABSPOINTER_DATA, 4,
&x, &y, &z);
/* /*
* And report what we've got. Prefer to report button * And report what we've got. Prefer to report button
@ -247,14 +221,10 @@ static psmouse_ret_t vmmouse_process_byte(struct psmouse *psmouse)
static void vmmouse_disable(struct psmouse *psmouse) static void vmmouse_disable(struct psmouse *psmouse)
{ {
u32 status; u32 status;
u32 dummy1, dummy2, dummy3, dummy4;
VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_DISABLE, vmware_hypercall1(VMWARE_CMD_ABSPOINTER_COMMAND, VMMOUSE_CMD_DISABLE);
dummy1, dummy2, dummy3, dummy4);
VMMOUSE_CMD(ABSPOINTER_STATUS, 0,
status, dummy1, dummy2, dummy3);
status = vmware_hypercall1(VMWARE_CMD_ABSPOINTER_STATUS, 0);
if ((status & VMMOUSE_ERROR) != VMMOUSE_ERROR) if ((status & VMMOUSE_ERROR) != VMMOUSE_ERROR)
psmouse_warn(psmouse, "failed to disable vmmouse device\n"); psmouse_warn(psmouse, "failed to disable vmmouse device\n");
} }
@ -271,26 +241,24 @@ static void vmmouse_disable(struct psmouse *psmouse)
static int vmmouse_enable(struct psmouse *psmouse) static int vmmouse_enable(struct psmouse *psmouse)
{ {
u32 status, version; u32 status, version;
u32 dummy1, dummy2, dummy3, dummy4;
/* /*
* Try enabling the device. If successful, we should be able to * Try enabling the device. If successful, we should be able to
* read valid version ID back from it. * read valid version ID back from it.
*/ */
VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_ENABLE, vmware_hypercall1(VMWARE_CMD_ABSPOINTER_COMMAND, VMMOUSE_CMD_ENABLE);
dummy1, dummy2, dummy3, dummy4);
/* /*
* See if version ID can be retrieved. * See if version ID can be retrieved.
*/ */
VMMOUSE_CMD(ABSPOINTER_STATUS, 0, status, dummy1, dummy2, dummy3); status = vmware_hypercall1(VMWARE_CMD_ABSPOINTER_STATUS, 0);
if ((status & 0x0000ffff) == 0) { if ((status & 0x0000ffff) == 0) {
psmouse_dbg(psmouse, "empty flags - assuming no device\n"); psmouse_dbg(psmouse, "empty flags - assuming no device\n");
return -ENXIO; return -ENXIO;
} }
VMMOUSE_CMD(ABSPOINTER_DATA, 1 /* single item */, version = vmware_hypercall1(VMWARE_CMD_ABSPOINTER_DATA,
version, dummy1, dummy2, dummy3); 1 /* single item */);
if (version != VMMOUSE_VERSION_ID) { if (version != VMMOUSE_VERSION_ID) {
psmouse_dbg(psmouse, "Unexpected version value: %u vs %u\n", psmouse_dbg(psmouse, "Unexpected version value: %u vs %u\n",
(unsigned) version, VMMOUSE_VERSION_ID); (unsigned) version, VMMOUSE_VERSION_ID);
@ -301,11 +269,11 @@ static int vmmouse_enable(struct psmouse *psmouse)
/* /*
* Restrict ioport access, if possible. * Restrict ioport access, if possible.
*/ */
VMMOUSE_CMD(ABSPOINTER_RESTRICT, VMMOUSE_RESTRICT_CPL0, vmware_hypercall1(VMWARE_CMD_ABSPOINTER_RESTRICT,
dummy1, dummy2, dummy3, dummy4); VMMOUSE_RESTRICT_CPL0);
VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_REQUEST_ABSOLUTE, vmware_hypercall1(VMWARE_CMD_ABSPOINTER_COMMAND,
dummy1, dummy2, dummy3, dummy4); VMMOUSE_CMD_REQUEST_ABSOLUTE);
return 0; return 0;
} }
@ -342,7 +310,7 @@ static bool vmmouse_check_hypervisor(void)
*/ */
int vmmouse_detect(struct psmouse *psmouse, bool set_properties) int vmmouse_detect(struct psmouse *psmouse, bool set_properties)
{ {
u32 response, version, dummy1, dummy2; u32 response, version, type;
if (!vmmouse_check_hypervisor()) { if (!vmmouse_check_hypervisor()) {
psmouse_dbg(psmouse, psmouse_dbg(psmouse,
@ -351,9 +319,9 @@ int vmmouse_detect(struct psmouse *psmouse, bool set_properties)
} }
/* Check if the device is present */ /* Check if the device is present */
response = ~VMMOUSE_PROTO_MAGIC; response = ~VMWARE_HYPERVISOR_MAGIC;
VMMOUSE_CMD(GETVERSION, 0, version, response, dummy1, dummy2); version = vmware_hypercall3(VMWARE_CMD_GETVERSION, 0, &response, &type);
if (response != VMMOUSE_PROTO_MAGIC || version == 0xffffffffU) if (response != VMWARE_HYPERVISOR_MAGIC || version == 0xffffffffU)
return -ENXIO; return -ENXIO;
if (set_properties) { if (set_properties) {