From: Kirill A. Korinsky Subject: Re: Fix boot on HONOR MagicBook Art 14 Snapdragon To: Marcus Glocker Cc: tech@openbsd.org Date: Mon, 23 Dec 2024 11:45:17 +0100 Greetings, thanks for review! On Mon, 23 Dec 2024 10:42:59 +0100, Marcus Glocker wrote: > > On Sun, Dec 22, 2024 at 10:23:30PM GMT, Kirill A. Korinsky wrote: > > > After mglocker@ commit to qcgpio.c(v 1.12) with updated mapping, touchpad > > started worked. > > > > The only quirks that I need to boot it is skip reset before get HID report. > > If skipping the reset entirely fixes your touch-pad, I'm fine to > introduce the quirk. Though, a few re-marks inline ... > After some future diging with it, I had discovered that ihidev_poweron(sc) after I2C_HID_REPORT_DESCR allows system to read this as multitouch touchpad. With only IHIDEV_QUIRK_SKIP_RESET it reads as: ihidev1 at iic3 addr 0x5d gpio 896, vendor 0x35cc product 0x104, QTEC0002 ihidev1: 14 report ids imt0 at ihidev1ihidev1: failed fetching report imt0: failed getting capability report ims0 at ihidev1 reportid 1: 3 buttons, Z dir wsmouse0 at ims0 mux 0 hid at ihidev1 reportid 5 not configured hid at ihidev1 reportid 6 not configured hid at ihidev1 reportid 7 not configured icc1 at ihidev1 reportid 8: 768 usages, 20 keys, array wskbd2 at icc1 mux 1 hid at ihidev1 reportid 14 not configured and with IHIDEV_QUIRK_SKIP_RESET | IHIDEV_QUIRK_RE_POWER_ON as: ihidev1 at iic3 addr 0x5d gpio 896, vendor 0x35cc product 0x104, QTEC0002 ihidev1: 14 report ids imt0 at ihidev1: touchpad, 5 contacts wsmouse0 at imt0 mux 0 ims0 at ihidev1 reportid 1: 3 buttons, Z dir wsmouse1 at ims0 mux 0 hid at ihidev1 reportid 5 not configured hid at ihidev1 reportid 6 not configured hid at ihidev1 reportid 7 not configured icc1 at ihidev1 reportid 8: 768 usages, 20 keys, array wskbd2 at icc1 mux 1 hid at ihidev1 reportid 14 not configured > > + > > + if (sc->sc_quirks & IHIDEV_QUIRK_SKIP_RESET) > > + goto skip_rest; > > I think "skip_reset" would be more clear. > Yay, what a typo! Thanks to catching it. Here a diff which address all remarks and introduced the second quirk. Index: sys/dev/i2c/ihidev.c =================================================================== RCS file: /home/cvs/src/sys/dev/i2c/ihidev.c,v diff -u -p -r1.33 ihidev.c --- sys/dev/i2c/ihidev.c 18 Oct 2024 12:53:49 -0000 1.33 +++ sys/dev/i2c/ihidev.c 23 Dec 2024 10:34:05 -0000 @@ -61,6 +61,7 @@ static int I2C_HID_POWER_ON = 0x0; static int I2C_HID_POWER_OFF = 0x1; int ihidev_match(struct device *, void *, void *); +int ihidev_quirks(struct ihidev_softc *); void ihidev_attach(struct device *, struct device *, void *); int ihidev_detach(struct device *, int); int ihidev_activate(struct device *, int); @@ -75,6 +76,19 @@ int ihidev_maxrepid(void *buf, int len); int ihidev_print(void *aux, const char *pnp); int ihidev_submatch(struct device *parent, void *cf, void *aux); +#define IHIDEV_QUIRK_SKIP_RESET 0x1 +#define IHIDEV_QUIRK_RE_POWER_ON 0x2 + +const struct ihidev_quirks { + uint16_t ihq_vid; + uint16_t ihq_pid; + int ihq_quirks; +} ihidev_devs[] = { + /* HONOR MagicBook Art 14 Touchpad (QTEC0002) */ + { 0x35cc, 0x0104, + IHIDEV_QUIRK_SKIP_RESET | IHIDEV_QUIRK_RE_POWER_ON }, +}; + const struct cfattach ihidev_ca = { sizeof(struct ihidev_softc), ihidev_match, @@ -98,6 +112,25 @@ ihidev_match(struct device *parent, void return (0); } +int +ihidev_quirks(struct ihidev_softc *sc) +{ + const struct ihidev_quirks *q; + uint16_t vid, pid; + int i, nent; + + nent = nitems(ihidev_devs); + + vid = letoh16(sc->hid_desc.wVendorID); + pid = letoh16(sc->hid_desc.wProductID); + + for (i = 0, q = ihidev_devs; i < nent; i++, q++) + if (vid == q->ihq_vid && pid == q->ihq_pid) + return (q->ihq_quirks); + + return (0); +} + void ihidev_attach(struct device *parent, struct device *self, void *aux) { @@ -572,6 +605,8 @@ ihidev_hid_desc_parse(struct ihidev_soft { int retries = 3; + sc->sc_quirks = ihidev_quirks(sc); + /* must be v01.00 */ if (letoh16(sc->hid_desc.bcdVersion) != 0x0100) { printf("%s: bad HID descriptor bcdVersion (0x%x)\n", @@ -597,6 +632,9 @@ ihidev_hid_desc_parse(struct ihidev_soft return (1); } + if (sc->sc_quirks & IHIDEV_QUIRK_SKIP_RESET) + goto skip_reset; + while (retries-- > 0) { if (ihidev_reset(sc)) { if (retries == 0) @@ -608,6 +646,7 @@ ihidev_hid_desc_parse(struct ihidev_soft break; } +skip_reset: sc->sc_reportlen = letoh16(sc->hid_desc.wReportDescLength); sc->sc_report = malloc(sc->sc_reportlen, M_DEVBUF, M_WAITOK | M_ZERO); @@ -616,6 +655,10 @@ ihidev_hid_desc_parse(struct ihidev_soft sc->sc_dev.dv_xname); return (1); } + + if (sc->sc_quirks & IHIDEV_QUIRK_RE_POWER_ON) + if (ihidev_poweron(sc)) + return (1); return (0); } Index: sys/dev/i2c/ihidev.h =================================================================== RCS file: /home/cvs/src/sys/dev/i2c/ihidev.h,v diff -u -p -r1.9 ihidev.h --- sys/dev/i2c/ihidev.h 3 Sep 2022 15:48:16 -0000 1.9 +++ sys/dev/i2c/ihidev.h 23 Dec 2024 10:33:34 -0000 @@ -93,6 +93,8 @@ struct ihidev_softc { int sc_fastpoll; struct timeout sc_timer; int sc_dying; + + int sc_quirks; }; struct ihidev { -- wbr, Kirill