# Copyright 2021 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
# Autogenerated by sys2syz

include <fcntl.h>
include <dev/evdev/uinput.h>
include <dev/evdev/input.h>

resource fd_evdev[fd]

openat$evdev(fd const[AT_FDCWD], file ptr[in, string["/dev/input/eventN"]], flags flags[open_flags], mode const[0]) fd_evdev

define EVIOCGABS_MIN	EVIOCGABS(0)
define EVIOCGABS_MAX	EVIOCGABS(ABS_MAX)
define EVIOCSABS_MIN	EVIOCGABS(0)
define EVIOCSABS_MAX	EVIOCGABS(ABS_MAX)
define EVIOCGNAME_CONST	EVIOCGNAME(0)
define EVIOCGPHYS_CONST	EVIOCGPHYS(0)
define EVIOCGUNIQ_CONST	EVIOCGUNIQ(0)
define EVIOCGPROP_CONST	EVIOCGPROP(0)
define EVIOCGMTSLOTS_CONST	EVIOCGMTSLOTS(0)
define EVIOCGLED_CONST	EVIOCGLED(0)
define EVIOCGKEY_CONST	EVIOCGKEY(0)
define EVIOCGSND_CONST	EVIOCGSND(0)
define EVIOCGSW_CONST	EVIOCGSW(0)
define EVIOCGBIT_MIN	EVIOCGBIT(0, 0)
define EVIOCGBIT_MAX	EVIOCGBIT(EV_MAX, 0)

ioctl$EVIOCGVERSION(fd fd_evdev, cmd const[EVIOCGVERSION], arg int32)
ioctl$EVIOCGID(fd fd_evdev, cmd const[EVIOCGID], arg ptr[out, input_id])
ioctl$EVIOCGREP(fd fd_evdev, cmd const[EVIOCGREP], arg int32)
ioctl$EVIOCSREP(fd fd_evdev, cmd const[EVIOCSREP], arg int32)
ioctl$EVIOCGKEYCODE(fd fd_evdev, cmd const[EVIOCGKEYCODE], arg int32)
ioctl$EVIOCGKEYCODE_V2(fd fd_evdev, cmd const[EVIOCGKEYCODE_V2], arg ptr[inout, input_keymap_entry])
ioctl$EVIOCSKEYCODE(fd fd_evdev, cmd const[EVIOCSKEYCODE], arg int32)
ioctl$EVIOCSKEYCODE_V2(fd fd_evdev, cmd const[EVIOCSKEYCODE_V2], arg ptr[in, input_keymap_entry])
ioctl$EVIOCGABS(fd fd_evdev, cmd intptr[EVIOCGABS_MIN:EVIOCGABS_MAX], arg ptr[out, input_absinfo])
ioctl$EVIOCSABS(fd fd_evdev, cmd intptr[EVIOCSABS_MIN:EVIOCSABS_MAX], arg ptr[in, input_absinfo])
ioctl$EVIOCSFF(fd fd_evdev, cmd const[EVIOCSFF], arg ptr[in, ff_effect])
ioctl$EVIOCRMFF(fd fd_evdev, cmd const[EVIOCRMFF])
ioctl$EVIOCGEFFECTS(fd fd_evdev, cmd const[EVIOCGEFFECTS], arg int32)
ioctl$EVIOCGRAB(fd fd_evdev, cmd const[EVIOCGRAB])
ioctl$EVIOCREVOKE(fd fd_evdev, cmd const[EVIOCREVOKE])
ioctl$EVIOCSCLOCKID(fd fd_evdev, cmd const[EVIOCSCLOCKID], arg int32)
ioctl$UI_DEV_CREATE(fd fd_evdev, cmd const[UI_DEV_CREATE])
ioctl$UI_DEV_DESTROY(fd fd_evdev, cmd const[UI_DEV_DESTROY])
ioctl$UI_DEV_SETUP(fd fd_evdev, cmd const[UI_DEV_SETUP], arg ptr[in, uinput_setup])
ioctl$UI_ABS_SETUP(fd fd_evdev, cmd const[UI_ABS_SETUP], arg ptr[in, uinput_abs_setup])
ioctl$UI_GET_VERSION(fd fd_evdev, cmd const[UI_GET_VERSION], arg int32)
ioctl$UI_SET_EVBIT(fd fd_evdev, cmd const[UI_SET_EVBIT])
ioctl$UI_SET_KEYBIT(fd fd_evdev, cmd const[UI_SET_KEYBIT])
ioctl$UI_SET_RELBIT(fd fd_evdev, cmd const[UI_SET_RELBIT])
ioctl$UI_SET_ABSBIT(fd fd_evdev, cmd const[UI_SET_ABSBIT])
ioctl$UI_SET_MSCBIT(fd fd_evdev, cmd const[UI_SET_MSCBIT])
ioctl$UI_SET_LEDBIT(fd fd_evdev, cmd const[UI_SET_LEDBIT])
ioctl$UI_SET_SNDBIT(fd fd_evdev, cmd const[UI_SET_SNDBIT])
ioctl$UI_SET_FFBIT(fd fd_evdev, cmd const[UI_SET_FFBIT])
ioctl$UI_SET_PHYS(fd fd_evdev, cmd const[UI_SET_PHYS])
ioctl$UI_SET_SWBIT(fd fd_evdev, cmd const[UI_SET_SWBIT])
ioctl$UI_SET_PROPBIT(fd fd_evdev, cmd const[UI_SET_PROPBIT])
ioctl$UI_BEGIN_FF_UPLOAD(fd fd_evdev, cmd const[UI_BEGIN_FF_UPLOAD], arg ptr[inout, uinput_ff_upload])
ioctl$UI_END_FF_UPLOAD(fd fd_evdev, cmd const[UI_END_FF_UPLOAD], arg ptr[in, uinput_ff_upload])
ioctl$UI_BEGIN_FF_ERASE(fd fd_evdev, cmd const[UI_BEGIN_FF_ERASE], arg ptr[inout, uinput_ff_erase])
ioctl$UI_END_FF_ERASE(fd fd_evdev, cmd const[UI_END_FF_ERASE], arg ptr[in, uinput_ff_erase])
ioctl$UI_SET_BSDUNIQ(fd fd_evdev, cmd const[UI_SET_BSDUNIQ])
ioctl$EVIOCGNAME(fd fd_evdev, cmd const[EVIOCGNAME_CONST])
ioctl$EVIOCGPHYS(fd fd_evdev, cmd const[EVIOCGPHYS_CONST])
ioctl$EVIOCGUNIQ(fd fd_evdev, cmd const[EVIOCGUNIQ_CONST])
ioctl$EVIOCGPROP(fd fd_evdev, cmd const[EVIOCGPROP_CONST])
ioctl$EVIOCGMTSLOTS(fd fd_evdev, cmd const[EVIOCGMTSLOTS_CONST])
ioctl$EVIOCGLED(fd fd_evdev, cmd const[EVIOCGLED_CONST])
ioctl$EVIOCGKEY(fd fd_evdev, cmd const[EVIOCGKEY_CONST])
ioctl$EVIOCGSND(fd fd_evdev, cmd const[EVIOCGSND_CONST])
ioctl$EVIOCGSW(fd fd_evdev, cmd const[EVIOCGSW_CONST])
ioctl$EVIOCGBIT(fd fd_evdev, cmd intptr[EVIOCGBIT_MIN:EVIOCGBIT_MAX])

input_id {
	bustype	int16
	vendor	int16
	product	int16
	version	int16
}

input_keymap_entry {
	flags		int8
	len		int8
	index		int16
	keycode		int32
	scancode	array[int8, 32]
}

input_absinfo {
	value		int32
	minimum		int32
	maximum		int32
	fuzz		int32
	flat		int32
	resolution	int32
}

ff_effect {
	type		int16[FF_EFFECT_MIN:FF_EFFECT_MAX]
	id		int16
	direction	int16
	trigger		ff_trigger
	replay		ff_replay
	u		u
}

ff_trigger {
	button		int16
	interval	int16
}

ff_replay {
	length	int16
	delay	int16
}

ff_constant_effect {
	level		int16
	envelope	ff_envelope
}

ff_envelope {
	attack_length	len[attack_level, int16]
	attack_level	int16
	fade_length	len[fade_level, int16]
	fade_level	int16
}

ff_ramp_effect {
	start_level	int16
	end_level	int16
	envelope	ff_envelope
}

ff_periodic_effect {
	waveform	int16[FF_WAVEFORM_MIN:FF_WAVEFORM_MAX]
	period		int16
	magnitude	int16
	offset		int16
	phase		int16
	envelope	ff_envelope
	custom_len	len[custom_data, int32]
	custom_data	ptr[in, int16]
}

ff_condition_effect {
	right_saturation	int16
	left_saturation		int16
	right_coeff		int16
	left_coeff		int16
	deadband		int16
	center			int16
}

ff_rumble_effect {
	strong_magnitude	int16
	weak_magnitude		int16
}

uinput_setup {
	id		input_id
	name		array[int8, 80]
	ff_effects_max	int32
}

uinput_abs_setup {
	code	int16
	absinfo	input_absinfo
}

uinput_ff_upload {
	request_id	int32
	retval		int32
	effect		ff_effect
	old		ff_effect
}

uinput_ff_erase {
	request_id	int32
	retval		int32
	effect_id	int32
}

u [
	constant	ff_constant_effect
	ramp		ff_ramp_effect
	periodic	ff_periodic_effect
	condition	array[ff_condition_effect, 2]
	rumble		ff_rumble_effect
]
