mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
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:
parent
54651bb4dc
commit
f0db90b412
@ -21,19 +21,16 @@
|
||||
#include "psmouse.h"
|
||||
#include "vmmouse.h"
|
||||
|
||||
#define VMMOUSE_PROTO_MAGIC 0x564D5868U
|
||||
|
||||
/*
|
||||
* Main commands supported by the vmmouse hypervisor port.
|
||||
*/
|
||||
#define VMMOUSE_PROTO_CMD_GETVERSION 10
|
||||
#define VMMOUSE_PROTO_CMD_ABSPOINTER_DATA 39
|
||||
#define VMMOUSE_PROTO_CMD_ABSPOINTER_STATUS 40
|
||||
#define VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND 41
|
||||
#define VMMOUSE_PROTO_CMD_ABSPOINTER_RESTRICT 86
|
||||
#define VMWARE_CMD_ABSPOINTER_DATA 39
|
||||
#define VMWARE_CMD_ABSPOINTER_STATUS 40
|
||||
#define VMWARE_CMD_ABSPOINTER_COMMAND 41
|
||||
#define VMWARE_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_DISABLE 0x000000f5U
|
||||
@ -76,28 +73,6 @@ struct vmmouse_data {
|
||||
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
|
||||
*
|
||||
@ -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 *pref_dev;
|
||||
u32 status, x, y, z;
|
||||
u32 dummy1, dummy2, dummy3;
|
||||
unsigned int queue_length;
|
||||
unsigned int count = 255;
|
||||
|
||||
while (count--) {
|
||||
/* See if we have motion data. */
|
||||
VMMOUSE_CMD(ABSPOINTER_STATUS, 0,
|
||||
status, dummy1, dummy2, dummy3);
|
||||
status = vmware_hypercall1(VMWARE_CMD_ABSPOINTER_STATUS, 0);
|
||||
if ((status & VMMOUSE_ERROR) == VMMOUSE_ERROR) {
|
||||
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 */
|
||||
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
|
||||
@ -247,14 +221,10 @@ static psmouse_ret_t vmmouse_process_byte(struct psmouse *psmouse)
|
||||
static void vmmouse_disable(struct psmouse *psmouse)
|
||||
{
|
||||
u32 status;
|
||||
u32 dummy1, dummy2, dummy3, dummy4;
|
||||
|
||||
VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_DISABLE,
|
||||
dummy1, dummy2, dummy3, dummy4);
|
||||
|
||||
VMMOUSE_CMD(ABSPOINTER_STATUS, 0,
|
||||
status, dummy1, dummy2, dummy3);
|
||||
vmware_hypercall1(VMWARE_CMD_ABSPOINTER_COMMAND, VMMOUSE_CMD_DISABLE);
|
||||
|
||||
status = vmware_hypercall1(VMWARE_CMD_ABSPOINTER_STATUS, 0);
|
||||
if ((status & VMMOUSE_ERROR) != VMMOUSE_ERROR)
|
||||
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)
|
||||
{
|
||||
u32 status, version;
|
||||
u32 dummy1, dummy2, dummy3, dummy4;
|
||||
|
||||
/*
|
||||
* Try enabling the device. If successful, we should be able to
|
||||
* read valid version ID back from it.
|
||||
*/
|
||||
VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_ENABLE,
|
||||
dummy1, dummy2, dummy3, dummy4);
|
||||
vmware_hypercall1(VMWARE_CMD_ABSPOINTER_COMMAND, VMMOUSE_CMD_ENABLE);
|
||||
|
||||
/*
|
||||
* 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) {
|
||||
psmouse_dbg(psmouse, "empty flags - assuming no device\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
VMMOUSE_CMD(ABSPOINTER_DATA, 1 /* single item */,
|
||||
version, dummy1, dummy2, dummy3);
|
||||
version = vmware_hypercall1(VMWARE_CMD_ABSPOINTER_DATA,
|
||||
1 /* single item */);
|
||||
if (version != VMMOUSE_VERSION_ID) {
|
||||
psmouse_dbg(psmouse, "Unexpected version value: %u vs %u\n",
|
||||
(unsigned) version, VMMOUSE_VERSION_ID);
|
||||
@ -301,11 +269,11 @@ static int vmmouse_enable(struct psmouse *psmouse)
|
||||
/*
|
||||
* Restrict ioport access, if possible.
|
||||
*/
|
||||
VMMOUSE_CMD(ABSPOINTER_RESTRICT, VMMOUSE_RESTRICT_CPL0,
|
||||
dummy1, dummy2, dummy3, dummy4);
|
||||
vmware_hypercall1(VMWARE_CMD_ABSPOINTER_RESTRICT,
|
||||
VMMOUSE_RESTRICT_CPL0);
|
||||
|
||||
VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_REQUEST_ABSOLUTE,
|
||||
dummy1, dummy2, dummy3, dummy4);
|
||||
vmware_hypercall1(VMWARE_CMD_ABSPOINTER_COMMAND,
|
||||
VMMOUSE_CMD_REQUEST_ABSOLUTE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -342,7 +310,7 @@ static bool vmmouse_check_hypervisor(void)
|
||||
*/
|
||||
int vmmouse_detect(struct psmouse *psmouse, bool set_properties)
|
||||
{
|
||||
u32 response, version, dummy1, dummy2;
|
||||
u32 response, version, type;
|
||||
|
||||
if (!vmmouse_check_hypervisor()) {
|
||||
psmouse_dbg(psmouse,
|
||||
@ -351,9 +319,9 @@ int vmmouse_detect(struct psmouse *psmouse, bool set_properties)
|
||||
}
|
||||
|
||||
/* Check if the device is present */
|
||||
response = ~VMMOUSE_PROTO_MAGIC;
|
||||
VMMOUSE_CMD(GETVERSION, 0, version, response, dummy1, dummy2);
|
||||
if (response != VMMOUSE_PROTO_MAGIC || version == 0xffffffffU)
|
||||
response = ~VMWARE_HYPERVISOR_MAGIC;
|
||||
version = vmware_hypercall3(VMWARE_CMD_GETVERSION, 0, &response, &type);
|
||||
if (response != VMWARE_HYPERVISOR_MAGIC || version == 0xffffffffU)
|
||||
return -ENXIO;
|
||||
|
||||
if (set_properties) {
|
||||
|
Loading…
Reference in New Issue
Block a user