xref: /linux/drivers/hid/bpf/progs/README (revision 621cde16e49b3ecf7d59a8106a20aaebfb4a59a9)
1*04b3e5abSBenjamin Tissoires# HID-BPF programs
2*04b3e5abSBenjamin Tissoires
3*04b3e5abSBenjamin TissoiresThis directory contains various fixes for devices. They add new features or
4*04b3e5abSBenjamin Tissoiresfix some behaviors without being entirely mandatory. It is better to load them
5*04b3e5abSBenjamin Tissoireswhen you have such a device, but they should not be a requirement for a device
6*04b3e5abSBenjamin Tissoiresto be working during the boot stage.
7*04b3e5abSBenjamin Tissoires
8*04b3e5abSBenjamin TissoiresThe .bpf.c files provided here are not automatically compiled in the kernel.
9*04b3e5abSBenjamin TissoiresThey should be loaded in the kernel by `udev-hid-bpf`:
10*04b3e5abSBenjamin Tissoires
11*04b3e5abSBenjamin Tissoireshttps://gitlab.freedesktop.org/libevdev/udev-hid-bpf
12*04b3e5abSBenjamin Tissoires
13*04b3e5abSBenjamin TissoiresThe main reasons for these fixes to be here is to have a central place to
14*04b3e5abSBenjamin Tissoires"upstream" them, but also this way we can test them thanks to the HID
15*04b3e5abSBenjamin Tissoiresselftests.
16*04b3e5abSBenjamin Tissoires
17*04b3e5abSBenjamin TissoiresOnce a .bpf.c file is accepted here, it is duplicated in `udev-hid-bpf`
18*04b3e5abSBenjamin Tissoiresin the `src/bpf/stable` directory, and distributions are encouraged to
19*04b3e5abSBenjamin Tissoiresonly ship those bpf objects. So adding a file here should eventually
20*04b3e5abSBenjamin Tissoiresland in distributions when they update `udev-hid-bpf`
21*04b3e5abSBenjamin Tissoires
22*04b3e5abSBenjamin Tissoires## Compilation
23*04b3e5abSBenjamin Tissoires
24*04b3e5abSBenjamin TissoiresJust run `make`
25*04b3e5abSBenjamin Tissoires
26*04b3e5abSBenjamin Tissoires## Installation
27*04b3e5abSBenjamin Tissoires
28*04b3e5abSBenjamin Tissoires### Automated way
29*04b3e5abSBenjamin Tissoires
30*04b3e5abSBenjamin TissoiresJust run `sudo udev-hid-bpf install ./my-awesome-fix.bpf.o`
31*04b3e5abSBenjamin Tissoires
32*04b3e5abSBenjamin Tissoires### Manual way
33*04b3e5abSBenjamin Tissoires
34*04b3e5abSBenjamin Tissoires- copy the `.bpf.o` you want in `/etc/udev-hid-bpf/`
35*04b3e5abSBenjamin Tissoires- create a new udev rule to automatically load it
36*04b3e5abSBenjamin Tissoires
37*04b3e5abSBenjamin TissoiresThe following should do the trick (assuming udev-hid-bpf is available in
38*04b3e5abSBenjamin Tissoires/usr/bin):
39*04b3e5abSBenjamin Tissoires
40*04b3e5abSBenjamin Tissoires```
41*04b3e5abSBenjamin Tissoires$> cp xppen-ArtistPro16Gen2.bpf.o /etc/udev-hid-bpf/
42*04b3e5abSBenjamin Tissoires$> udev-hid-bpf inspect xppen-ArtistPro16Gen2.bpf.o
43*04b3e5abSBenjamin Tissoires[
44*04b3e5abSBenjamin Tissoires  {
45*04b3e5abSBenjamin Tissoires    "name": "xppen-ArtistPro16Gen2.bpf.o",
46*04b3e5abSBenjamin Tissoires    "devices": [
47*04b3e5abSBenjamin Tissoires      {
48*04b3e5abSBenjamin Tissoires        "bus": "0x0003",
49*04b3e5abSBenjamin Tissoires        "group": "0x0001",
50*04b3e5abSBenjamin Tissoires        "vid": "0x28BD",
51*04b3e5abSBenjamin Tissoires        "pid": "0x095A"
52*04b3e5abSBenjamin Tissoires      },
53*04b3e5abSBenjamin Tissoires      {
54*04b3e5abSBenjamin Tissoires        "bus": "0x0003",
55*04b3e5abSBenjamin Tissoires        "group": "0x0001",
56*04b3e5abSBenjamin Tissoires        "vid": "0x28BD",
57*04b3e5abSBenjamin Tissoires        "pid": "0x095B"
58*04b3e5abSBenjamin Tissoires      }
59*04b3e5abSBenjamin Tissoires    ],
60*04b3e5abSBenjamin Tissoires...
61*04b3e5abSBenjamin Tissoires$> cat <EOF > /etc/udev/rules.d/99-load-hid-bpf-xppen-ArtistPro16Gen2.rules
62*04b3e5abSBenjamin TissoiresACTION!="add|remove", GOTO="hid_bpf_end"
63*04b3e5abSBenjamin TissoiresSUBSYSTEM!="hid", GOTO="hid_bpf_end"
64*04b3e5abSBenjamin Tissoires
65*04b3e5abSBenjamin Tissoires# xppen-ArtistPro16Gen2.bpf.o
66*04b3e5abSBenjamin TissoiresACTION=="add",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095A", RUN{program}+="/usr/local/bin/udev-hid-bpf add $sys$devpath /etc/udev-hid-bpf/xppen-ArtistPro16Gen2.bpf.o"
67*04b3e5abSBenjamin TissoiresACTION=="remove",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095A", RUN{program}+="/usr/local/bin/udev-hid-bpf remove $sys$devpath "
68*04b3e5abSBenjamin Tissoires# xppen-ArtistPro16Gen2.bpf.o
69*04b3e5abSBenjamin TissoiresACTION=="add",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095B", RUN{program}+="/usr/local/bin/udev-hid-bpf add $sys$devpath /etc/udev-hid-bpf/xppen-ArtistPro16Gen2.bpf.o"
70*04b3e5abSBenjamin TissoiresACTION=="remove",ENV{MODALIAS}=="hid:b0003g0001v000028BDp0000095B", RUN{program}+="/usr/local/bin/udev-hid-bpf remove $sys$devpath "
71*04b3e5abSBenjamin Tissoires
72*04b3e5abSBenjamin TissoiresLABEL="hid_bpf_end"
73*04b3e5abSBenjamin TissoiresEOF
74*04b3e5abSBenjamin Tissoires$> udevadm control --reload
75*04b3e5abSBenjamin Tissoires```
76*04b3e5abSBenjamin Tissoires
77*04b3e5abSBenjamin TissoiresThen unplug and replug the device.
78*04b3e5abSBenjamin Tissoires
79*04b3e5abSBenjamin Tissoires## Checks
80*04b3e5abSBenjamin Tissoires
81*04b3e5abSBenjamin Tissoires### udev rule
82*04b3e5abSBenjamin Tissoires
83*04b3e5abSBenjamin TissoiresYou can check that the udev rule is correctly working by issuing
84*04b3e5abSBenjamin Tissoires
85*04b3e5abSBenjamin Tissoires```
86*04b3e5abSBenjamin Tissoires$> udevadm test /sys/bus/hid/devices/0003:28BD:095B*
87*04b3e5abSBenjamin Tissoires...
88*04b3e5abSBenjamin Tissoiresrun: '/usr/local/bin/udev-hid-bpf add /sys/devices/virtual/misc/uhid/0003:28BD:095B.0E57 /etc/udev-hid-bpf/xppen-ArtistPro16Gen2.bpf.o'
89*04b3e5abSBenjamin Tissoires```
90*04b3e5abSBenjamin Tissoires
91*04b3e5abSBenjamin Tissoires### program loaded
92*04b3e5abSBenjamin Tissoires
93*04b3e5abSBenjamin TissoiresYou can check that the program has been properly loaded with `bpftool`
94*04b3e5abSBenjamin Tissoires
95*04b3e5abSBenjamin Tissoires```
96*04b3e5abSBenjamin Tissoires$> bpftool prog
97*04b3e5abSBenjamin Tissoires...
98*04b3e5abSBenjamin Tissoires247: tracing  name xppen_16_fix_eraser tag 18d389353ed2ef07  gpl
99*04b3e5abSBenjamin Tissoires	loaded_at 2024-03-28T16:02:28+0100  uid 0
100*04b3e5abSBenjamin Tissoires	xlated 120B  jited 77B  memlock 4096B
101*04b3e5abSBenjamin Tissoires	btf_id 487
102*04b3e5abSBenjamin Tissoires```
103