Message ID | 20181123115040.13725-1-sean@mess.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] media: bpf: add bpf function to report mouse movement | expand |
Hi Sean, On 11/23/2018 12:50 PM, Sean Young wrote: > 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: Sean Young <sean@mess.org> Is this patch targeted at bpf-next tree? > --- > drivers/media/rc/bpf-lirc.c | 24 +++++++++++++++++++++++ > include/uapi/linux/bpf.h | 17 +++++++++++++++- > tools/testing/selftests/bpf/bpf_helpers.h | 2 ++ > 3 files changed, 42 insertions(+), 1 deletion(-) > > diff --git a/drivers/media/rc/bpf-lirc.c b/drivers/media/rc/bpf-lirc.c > index 8b97fd1f0cea..390a722e6211 100644 > --- a/drivers/media/rc/bpf-lirc.c > +++ b/drivers/media/rc/bpf-lirc.c > @@ -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: > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index 23e2031a43d4..3499a1555bbf 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -2268,6 +2268,20 @@ union bpf_attr { > * > * 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), \ > @@ -2360,7 +2374,8 @@ union bpf_attr { > FN(map_push_elem), \ > FN(map_pop_elem), \ > FN(map_peek_elem), \ > - FN(msg_push_data), > + FN(msg_push_data), \ > + FN(rc_pointer_rel), > > /* integer value in 'imm' field of BPF_CALL instruction selects which helper > * function eBPF program intends to call > diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h > index 686e57ce40f4..5c900a917fa4 100644 > --- a/tools/testing/selftests/bpf/bpf_helpers.h > +++ b/tools/testing/selftests/bpf/bpf_helpers.h > @@ -168,6 +168,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 > tools/include/uapi/linux/bpf.h would have to be synced as well here. Probably would be good to extend the lirc2 BPF kselftest as well? Thanks, Daniel
Hi Daniel, On Mon, Nov 26, 2018 at 01:55:36AM +0100, Daniel Borkmann wrote: > Hi Sean, > > On 11/23/2018 12:50 PM, Sean Young wrote: > > 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: Sean Young <sean@mess.org> > > Is this patch targeted at bpf-next tree? You're right, I missed the bpf-next tag. > > --- > > drivers/media/rc/bpf-lirc.c | 24 +++++++++++++++++++++++ > > include/uapi/linux/bpf.h | 17 +++++++++++++++- > > tools/testing/selftests/bpf/bpf_helpers.h | 2 ++ > > 3 files changed, 42 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/media/rc/bpf-lirc.c b/drivers/media/rc/bpf-lirc.c > > index 8b97fd1f0cea..390a722e6211 100644 > > --- a/drivers/media/rc/bpf-lirc.c > > +++ b/drivers/media/rc/bpf-lirc.c > > @@ -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: > > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > > index 23e2031a43d4..3499a1555bbf 100644 > > --- a/include/uapi/linux/bpf.h > > +++ b/include/uapi/linux/bpf.h > > @@ -2268,6 +2268,20 @@ union bpf_attr { > > * > > * 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), \ > > @@ -2360,7 +2374,8 @@ union bpf_attr { > > FN(map_push_elem), \ > > FN(map_pop_elem), \ > > FN(map_peek_elem), \ > > - FN(msg_push_data), > > + FN(msg_push_data), \ > > + FN(rc_pointer_rel), > > > > /* integer value in 'imm' field of BPF_CALL instruction selects which helper > > * function eBPF program intends to call > > diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h > > index 686e57ce40f4..5c900a917fa4 100644 > > --- a/tools/testing/selftests/bpf/bpf_helpers.h > > +++ b/tools/testing/selftests/bpf/bpf_helpers.h > > @@ -168,6 +168,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 > > > > tools/include/uapi/linux/bpf.h would have to be synced as well here. That's true. > Probably would be good to extend the lirc2 BPF kselftest as well? Again, good point. Thank you for review! I'll post a new version when it is ready. Sean
diff --git a/drivers/media/rc/bpf-lirc.c b/drivers/media/rc/bpf-lirc.c index 8b97fd1f0cea..390a722e6211 100644 --- a/drivers/media/rc/bpf-lirc.c +++ b/drivers/media/rc/bpf-lirc.c @@ -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: diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 23e2031a43d4..3499a1555bbf 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -2268,6 +2268,20 @@ union bpf_attr { * * 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), \ @@ -2360,7 +2374,8 @@ union bpf_attr { FN(map_push_elem), \ FN(map_pop_elem), \ FN(map_peek_elem), \ - FN(msg_push_data), + FN(msg_push_data), \ + FN(rc_pointer_rel), /* integer value in 'imm' field of BPF_CALL instruction selects which helper * function eBPF program intends to call diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h index 686e57ce40f4..5c900a917fa4 100644 --- a/tools/testing/selftests/bpf/bpf_helpers.h +++ b/tools/testing/selftests/bpf/bpf_helpers.h @@ -168,6 +168,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
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: Sean Young <sean@mess.org> --- drivers/media/rc/bpf-lirc.c | 24 +++++++++++++++++++++++ include/uapi/linux/bpf.h | 17 +++++++++++++++- tools/testing/selftests/bpf/bpf_helpers.h | 2 ++ 3 files changed, 42 insertions(+), 1 deletion(-)