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 18:03:47 +0100 On Mon, 23 Dec 2024 17:14:57 +0100, Marcus Glocker wrote: > > > ... one ask; Is it really required to add two quirks for that? > The consequence of skipping the reset is that we are also skipping the > power on, because it's contained in ihidev_reset(). > > Would it also work for the device if we do the power on at the same > place where we skip the reset, so before the I2C_HID_REPORT_DESCR > command? See what I mean with the following diff. > Unfortently no, it read as (here with debug output): ihidev1 at iic3 addr 0x5dihidev1: HID command I2C_HID_CMD_DESCR at 0x1 ihidev1: HID descriptor: 1e 00 00 01 df 02 02 00 03 00 2a 00 04 00 20 00 05 00 06 00 cc 35 04 01 01 01 00 00 00 00 ihidev1: resetting ihidev1: HID command I2C_HID_CMD_SET_POWER(0) ihidev1: HID command I2C_HID_REPORT_DESCR at 0x2 with size 735 ihidev1: HID report descriptor: 05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 c0 c0 05 0c 09 01 a1 01 85 08 19 00 2a ff 02 15 00 26 ff 7f 75 10 95 01 81 00 c0 05 0d 09 05 a1 01 85 04 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 05 0d 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 06 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 0e 09 01 19 00 29 ff 15 00 25 ff 95 08 75 08 91 02 09 01 19 00 29 ff 15 00 25 ff 95 08 75 08 81 02 c0 gpio 896, vendor 0x35cc product 0x104, QTEC0002 ihidev1: 14 report ids ihidev1: repid 1 size 4 ihidev1: repid 4 size 39 ihidev1: repid 8 size 2 ihidev1: repid 14 size 8 imt0 at ihidev1ihidev1: HID command I2C_HID_CMD_GET_REPORT 2 (type 3, len 1) ihidev1: response size 65535 != expected length 4 ihidev1: response report id 255 != 2 ihidev1: 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 ihidev1: HID command I2C_HID_CMD_SET_POWER(1) qciic4 at acpi0 I2C9 addr 0xa80000/0x4000 and for refernce my last version of patch: ihidev1 at iic3 addr 0x5dihidev1: HID command I2C_HID_CMD_DESCR at 0x1 ihidev1: HID descriptor: 1e 00 00 01 df 02 02 00 03 00 2a 00 04 00 20 00 05 00 06 00 cc 35 04 01 01 01 00 00 00 00 ihidev1: HID command I2C_HID_REPORT_DESCR at 0x2 with size 735 ihidev1: HID report descriptor: 05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 c0 c0 05 0c 09 01 a1 01 85 08 19 00 2a ff 02 15 00 26 ff 7f 75 10 95 01 81 00 c0 05 0d 09 05 a1 01 85 04 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 05 0d 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 06 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 0e 09 01 19 00 29 ff 15 00 25 ff 95 08 75 08 91 02 09 01 19 00 29 ff 15 00 25 ff 95 08 75 08 81 02 c0 ihidev1: resetting ihidev1: HID command I2C_HID_CMD_SET_POWER(0) gpio 896, vendor 0x35cc product 0x104, QTEC0002 ihidev1: 14 report ids ihidev1: repid 1 size 4 ihidev1: repid 4 size 39 ihidev1: repid 8 size 2 ihidev1: repid 14 size 8 imt0 at ihidev1ihidev1: HID command I2C_HID_CMD_GET_REPORT 2 (type 3, len 1) ihidev1: response: 04 00 02 15 ihidev1: HID command I2C_HID_CMD_SET_REPORT 3 (type 3, len 2): 03 00 : 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 ihidev1: HID command I2C_HID_CMD_SET_POWER(1) qciic4 at acpi0 I2C9 addr 0xa80000/0x4000 and without quirks, but with https://marc.info/?l=openbsd-tech&m=173496939319744&w=2: iic3 at qciic3 ihidev1 at iic3 addr 0x5dihidev1: HID command I2C_HID_CMD_DESCR at 0x1 ihidev1: HID descriptor: 1e 00 00 01 df 02 02 00 03 00 2a 00 04 00 20 00 05 00 06 00 cc 35 04 01 01 01 00 00 00 00 ihidev1: resetting ihidev1: HID command I2C_HID_CMD_SET_POWER(0) ihidev1: HID command I2C_HID_CMD_RESET ihidev1: HID command I2C_HID_REPORT_DESCR at 0x2 with size 735 ihidev1: HID report descriptor: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff gpio 896, vendor 0x35cc product 0x104, QTEC0002 qciic4 at acpi0 I2C9 addr 0xa80000/0x4000 > > Index: sys/dev/i2c/ihidev.c > =================================================================== > RCS file: /cvs/src/sys/dev/i2c/ihidev.c,v > diff -u -p -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 16:04:22 -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,17 @@ 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 > + > +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 }, > +}; > + > const struct cfattach ihidev_ca = { > sizeof(struct ihidev_softc), > ihidev_match, > @@ -98,6 +110,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 +603,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 +630,12 @@ ihidev_hid_desc_parse(struct ihidev_soft > return (1); > } > > + if (sc->sc_quirks & IHIDEV_QUIRK_SKIP_RESET) { > + if (ihidev_poweron(sc)) > + return (1); > + goto skip_reset; > + } > + > while (retries-- > 0) { > if (ihidev_reset(sc)) { > if (retries == 0) > @@ -608,6 +647,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); > > Index: sys/dev/i2c/ihidev.h > =================================================================== > RCS file: /cvs/src/sys/dev/i2c/ihidev.h,v > diff -u -p -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 16:04:22 -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