Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01d3240a authored by Sean Young's avatar Sean Young Committed by Alexei Starovoitov
Browse files

media: bpf: add bpf function to report mouse movement



Some IR remotes have a directional pad or other pointer-like thing that
can be used as a mouse. Make it possible to decode these types of IR
protocols in BPF.

Cc: netdev@vger.kernel.org
Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent ca5d1a7f
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -59,6 +59,28 @@ static const struct bpf_func_proto rc_keydown_proto = {
	.arg4_type = ARG_ANYTHING,
};

BPF_CALL_3(bpf_rc_pointer_rel, u32*, sample, s32, rel_x, s32, rel_y)
{
	struct ir_raw_event_ctrl *ctrl;

	ctrl = container_of(sample, struct ir_raw_event_ctrl, bpf_sample);

	input_report_rel(ctrl->dev->input_dev, REL_X, rel_x);
	input_report_rel(ctrl->dev->input_dev, REL_Y, rel_y);
	input_sync(ctrl->dev->input_dev);

	return 0;
}

static const struct bpf_func_proto rc_pointer_rel_proto = {
	.func	   = bpf_rc_pointer_rel,
	.gpl_only  = true,
	.ret_type  = RET_INTEGER,
	.arg1_type = ARG_PTR_TO_CTX,
	.arg2_type = ARG_ANYTHING,
	.arg3_type = ARG_ANYTHING,
};

static const struct bpf_func_proto *
lirc_mode2_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
{
@@ -67,6 +89,8 @@ lirc_mode2_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
		return &rc_repeat_proto;
	case BPF_FUNC_rc_keydown:
		return &rc_keydown_proto;
	case BPF_FUNC_rc_pointer_rel:
		return &rc_pointer_rel_proto;
	case BPF_FUNC_map_lookup_elem:
		return &bpf_map_lookup_elem_proto;
	case BPF_FUNC_map_update_elem:
+16 −1
Original line number Diff line number Diff line
@@ -2301,6 +2301,20 @@ union bpf_attr {
 *		payload and/or *pop* value being to large.
 *	Return
 *		0 on success, or a negative error in case of failure.
 *
 * int bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y)
 *	Description
 *		This helper is used in programs implementing IR decoding, to
 *		report a successfully decoded pointer movement.
 *
 *		The *ctx* should point to the lirc sample as passed into
 *		the program.
 *
 *		This helper is only available is the kernel was compiled with
 *		the **CONFIG_BPF_LIRC_MODE2** configuration option set to
 *		"**y**".
 *	Return
 *		0
 */
#define __BPF_FUNC_MAPPER(FN)		\
	FN(unspec),			\
@@ -2394,7 +2408,8 @@ union bpf_attr {
	FN(map_pop_elem),		\
	FN(map_peek_elem),		\
	FN(msg_push_data),		\
	FN(msg_pop_data),
	FN(msg_pop_data),		\
	FN(rc_pointer_rel),

/* integer value in 'imm' field of BPF_CALL instruction selects which helper
 * function eBPF program intends to call
+16 −2
Original line number Diff line number Diff line
@@ -2298,9 +2298,22 @@ union bpf_attr {
 *		if possible. Other errors can occur if input parameters are
 *		invalid either due to *start* byte not being valid part of msg
 *		payload and/or *pop* value being to large.
 *	Return
 *		0 on success, or a negative error in case of failure.
 *
 * int bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y)
 *	Description
 *		This helper is used in programs implementing IR decoding, to
 *		report a successfully decoded pointer movement.
 *
 *		The *ctx* should point to the lirc sample as passed into
 *		the program.
 *
 *		This helper is only available is the kernel was compiled with
 *		the **CONFIG_BPF_LIRC_MODE2** configuration option set to
 *		"**y**".
 *	Return
 *		0 on success, or a negative erro in case of failure.
 *		0
 */
#define __BPF_FUNC_MAPPER(FN)		\
	FN(unspec),			\
@@ -2394,7 +2407,8 @@ union bpf_attr {
	FN(map_pop_elem),		\
	FN(map_peek_elem),		\
	FN(msg_push_data),		\
	FN(msg_pop_data),
	FN(msg_pop_data),		\
	FN(rc_pointer_rel),

/* integer value in 'imm' field of BPF_CALL instruction selects which helper
 * function eBPF program intends to call
+2 −0
Original line number Diff line number Diff line
@@ -170,6 +170,8 @@ static int (*bpf_skb_vlan_push)(void *ctx, __be16 vlan_proto, __u16 vlan_tci) =
	(void *) BPF_FUNC_skb_vlan_push;
static int (*bpf_skb_vlan_pop)(void *ctx) =
	(void *) BPF_FUNC_skb_vlan_pop;
static int (*bpf_rc_pointer_rel)(void *ctx, int rel_x, int rel_y) =
	(void *) BPF_FUNC_rc_pointer_rel;

/* llvm builtin functions that eBPF C program may use to
 * emit BPF_LD_ABS and BPF_LD_IND instructions
+2 −1
Original line number Diff line number Diff line
@@ -21,13 +21,14 @@ do
	if grep -q DRV_NAME=rc-loopback $i/uevent
	then
		LIRCDEV=$(grep DEVNAME= $i/lirc*/uevent | sed sQDEVNAME=Q/dev/Q)
		INPUTDEV=$(grep DEVNAME= $i/input*/event*/uevent | sed sQDEVNAME=Q/dev/Q)
	fi
done

if [ -n $LIRCDEV ];
then
	TYPE=lirc_mode2
	./test_lirc_mode2_user $LIRCDEV
	./test_lirc_mode2_user $LIRCDEV $INPUTDEV
	ret=$?
	if [ $ret -ne 0 ]; then
		echo -e ${RED}"FAIL: $TYPE"${NC}
Loading