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 "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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user