cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

psmouse.h (7428B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _PSMOUSE_H
      3#define _PSMOUSE_H
      4
      5#define PSMOUSE_OOB_NONE	0x00
      6#define PSMOUSE_OOB_EXTRA_BTNS	0x01
      7
      8#define PSMOUSE_CMD_SETSCALE11	0x00e6
      9#define PSMOUSE_CMD_SETSCALE21	0x00e7
     10#define PSMOUSE_CMD_SETRES	0x10e8
     11#define PSMOUSE_CMD_GETINFO	0x03e9
     12#define PSMOUSE_CMD_SETSTREAM	0x00ea
     13#define PSMOUSE_CMD_SETPOLL	0x00f0
     14#define PSMOUSE_CMD_POLL	0x00eb	/* caller sets number of bytes to receive */
     15#define PSMOUSE_CMD_RESET_WRAP	0x00ec
     16#define PSMOUSE_CMD_GETID	0x02f2
     17#define PSMOUSE_CMD_SETRATE	0x10f3
     18#define PSMOUSE_CMD_ENABLE	0x00f4
     19#define PSMOUSE_CMD_DISABLE	0x00f5
     20#define PSMOUSE_CMD_RESET_DIS	0x00f6
     21#define PSMOUSE_CMD_RESET_BAT	0x02ff
     22
     23#define PSMOUSE_RET_BAT		0xaa
     24#define PSMOUSE_RET_ID		0x00
     25#define PSMOUSE_RET_ACK		0xfa
     26#define PSMOUSE_RET_NAK		0xfe
     27
     28enum psmouse_state {
     29	PSMOUSE_IGNORE,
     30	PSMOUSE_INITIALIZING,
     31	PSMOUSE_RESYNCING,
     32	PSMOUSE_CMD_MODE,
     33	PSMOUSE_ACTIVATED,
     34};
     35
     36/* psmouse protocol handler return codes */
     37typedef enum {
     38	PSMOUSE_BAD_DATA,
     39	PSMOUSE_GOOD_DATA,
     40	PSMOUSE_FULL_PACKET
     41} psmouse_ret_t;
     42
     43enum psmouse_scale {
     44	PSMOUSE_SCALE11,
     45	PSMOUSE_SCALE21
     46};
     47
     48enum psmouse_type {
     49	PSMOUSE_NONE,
     50	PSMOUSE_PS2,
     51	PSMOUSE_PS2PP,
     52	PSMOUSE_THINKPS,
     53	PSMOUSE_GENPS,
     54	PSMOUSE_IMPS,
     55	PSMOUSE_IMEX,
     56	PSMOUSE_SYNAPTICS,
     57	PSMOUSE_ALPS,
     58	PSMOUSE_LIFEBOOK,
     59	PSMOUSE_TRACKPOINT,
     60	PSMOUSE_TOUCHKIT_PS2,
     61	PSMOUSE_CORTRON,
     62	PSMOUSE_HGPK,
     63	PSMOUSE_ELANTECH,
     64	PSMOUSE_FSP,
     65	PSMOUSE_SYNAPTICS_RELATIVE,
     66	PSMOUSE_CYPRESS,
     67	PSMOUSE_FOCALTECH,
     68	PSMOUSE_VMMOUSE,
     69	PSMOUSE_BYD,
     70	PSMOUSE_SYNAPTICS_SMBUS,
     71	PSMOUSE_ELANTECH_SMBUS,
     72	PSMOUSE_AUTO		/* This one should always be last */
     73};
     74
     75struct psmouse;
     76
     77struct psmouse_protocol {
     78	enum psmouse_type type;
     79	bool maxproto;
     80	bool ignore_parity; /* Protocol should ignore parity errors from KBC */
     81	bool try_passthru; /* Try protocol also on passthrough ports */
     82	bool smbus_companion; /* "Protocol" is a stub, device is on SMBus */
     83	const char *name;
     84	const char *alias;
     85	int (*detect)(struct psmouse *, bool);
     86	int (*init)(struct psmouse *);
     87};
     88
     89struct psmouse {
     90	void *private;
     91	struct input_dev *dev;
     92	struct ps2dev ps2dev;
     93	struct delayed_work resync_work;
     94	const char *vendor;
     95	const char *name;
     96	const struct psmouse_protocol *protocol;
     97	unsigned char packet[8];
     98	unsigned char badbyte;
     99	unsigned char pktcnt;
    100	unsigned char pktsize;
    101	unsigned char oob_data_type;
    102	unsigned char extra_buttons;
    103	bool acks_disable_command;
    104	unsigned int model;
    105	unsigned long last;
    106	unsigned long out_of_sync_cnt;
    107	unsigned long num_resyncs;
    108	enum psmouse_state state;
    109	char devname[64];
    110	char phys[32];
    111
    112	unsigned int rate;
    113	unsigned int resolution;
    114	unsigned int resetafter;
    115	unsigned int resync_time;
    116	bool smartscroll;	/* Logitech only */
    117
    118	psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse);
    119	void (*set_rate)(struct psmouse *psmouse, unsigned int rate);
    120	void (*set_resolution)(struct psmouse *psmouse, unsigned int resolution);
    121	void (*set_scale)(struct psmouse *psmouse, enum psmouse_scale scale);
    122
    123	int (*reconnect)(struct psmouse *psmouse);
    124	int (*fast_reconnect)(struct psmouse *psmouse);
    125	void (*disconnect)(struct psmouse *psmouse);
    126	void (*cleanup)(struct psmouse *psmouse);
    127	int (*poll)(struct psmouse *psmouse);
    128
    129	void (*pt_activate)(struct psmouse *psmouse);
    130	void (*pt_deactivate)(struct psmouse *psmouse);
    131};
    132
    133void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work,
    134		unsigned long delay);
    135int psmouse_reset(struct psmouse *psmouse);
    136void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state);
    137void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution);
    138psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse);
    139int psmouse_activate(struct psmouse *psmouse);
    140int psmouse_deactivate(struct psmouse *psmouse);
    141bool psmouse_matches_pnp_id(struct psmouse *psmouse, const char * const ids[]);
    142
    143void psmouse_report_standard_buttons(struct input_dev *, u8 buttons);
    144void psmouse_report_standard_motion(struct input_dev *, u8 *packet);
    145void psmouse_report_standard_packet(struct input_dev *, u8 *packet);
    146
    147struct psmouse_attribute {
    148	struct device_attribute dattr;
    149	void *data;
    150	ssize_t (*show)(struct psmouse *psmouse, void *data, char *buf);
    151	ssize_t (*set)(struct psmouse *psmouse, void *data,
    152			const char *buf, size_t count);
    153	bool protect;
    154};
    155#define to_psmouse_attr(a)	container_of((a), struct psmouse_attribute, dattr)
    156
    157ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *attr,
    158				 char *buf);
    159ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *attr,
    160				const char *buf, size_t count);
    161
    162#define __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, _set, _protect)	\
    163static struct psmouse_attribute psmouse_attr_##_name = {			\
    164	.dattr	= {								\
    165		.attr	= {							\
    166			.name	= __stringify(_name),				\
    167			.mode	= _mode,					\
    168		},								\
    169		.show	= psmouse_attr_show_helper,				\
    170		.store	= psmouse_attr_set_helper,				\
    171	},									\
    172	.data	= _data,							\
    173	.show	= _show,							\
    174	.set	= _set,								\
    175	.protect = _protect,							\
    176}
    177
    178#define __PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set, _protect)	\
    179	static ssize_t _show(struct psmouse *, void *, char *);			\
    180	static ssize_t _set(struct psmouse *, void *, const char *, size_t);	\
    181	__PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, _set, _protect)
    182
    183#define PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set)			\
    184	__PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set, true)
    185
    186#define PSMOUSE_DEFINE_RO_ATTR(_name, _mode, _data, _show)			\
    187	static ssize_t _show(struct psmouse *, void *, char *);			\
    188	__PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, NULL, true)
    189
    190#define PSMOUSE_DEFINE_WO_ATTR(_name, _mode, _data, _set)			\
    191	static ssize_t _set(struct psmouse *, void *, const char *, size_t);	\
    192	__PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, NULL, _set, true)
    193
    194#ifndef psmouse_fmt
    195#define psmouse_fmt(fmt)	KBUILD_BASENAME ": " fmt
    196#endif
    197
    198#define psmouse_dbg(psmouse, format, ...)		\
    199	dev_dbg(&(psmouse)->ps2dev.serio->dev,		\
    200		psmouse_fmt(format), ##__VA_ARGS__)
    201#define psmouse_info(psmouse, format, ...)		\
    202	dev_info(&(psmouse)->ps2dev.serio->dev,		\
    203		 psmouse_fmt(format), ##__VA_ARGS__)
    204#define psmouse_warn(psmouse, format, ...)		\
    205	dev_warn(&(psmouse)->ps2dev.serio->dev,		\
    206		 psmouse_fmt(format), ##__VA_ARGS__)
    207#define psmouse_err(psmouse, format, ...)		\
    208	dev_err(&(psmouse)->ps2dev.serio->dev,		\
    209		psmouse_fmt(format), ##__VA_ARGS__)
    210#define psmouse_notice(psmouse, format, ...)		\
    211	dev_notice(&(psmouse)->ps2dev.serio->dev,	\
    212		   psmouse_fmt(format), ##__VA_ARGS__)
    213#define psmouse_printk(level, psmouse, format, ...)	\
    214	dev_printk(level,				\
    215		   &(psmouse)->ps2dev.serio->dev,	\
    216		   psmouse_fmt(format), ##__VA_ARGS__)
    217
    218#ifdef CONFIG_MOUSE_PS2_SMBUS
    219
    220int psmouse_smbus_module_init(void);
    221void psmouse_smbus_module_exit(void);
    222
    223struct i2c_board_info;
    224
    225int psmouse_smbus_init(struct psmouse *psmouse,
    226		       const struct i2c_board_info *board,
    227		       const void *pdata, size_t pdata_size,
    228		       bool need_deactivate,
    229		       bool leave_breadcrumbs);
    230void psmouse_smbus_cleanup(struct psmouse *psmouse);
    231
    232#else /* !CONFIG_MOUSE_PS2_SMBUS */
    233
    234static inline int psmouse_smbus_module_init(void)
    235{
    236	return 0;
    237}
    238
    239static inline void psmouse_smbus_module_exit(void)
    240{
    241}
    242
    243static inline void psmouse_smbus_cleanup(struct psmouse *psmouse)
    244{
    245}
    246
    247#endif /* CONFIG_MOUSE_PS2_SMBUS */
    248
    249#endif /* _PSMOUSE_H */