Index | Thread | Search

From:
Kirill A. Korinsky <kirill@korins.ky>
Subject:
Re: Fix boot on HONOR MagicBook Art 14 Snapdragon
To:
Marcus Glocker <marcus@nazgul.ch>
Cc:
tech@openbsd.org
Date:
Mon, 23 Dec 2024 18:03:47 +0100

Download raw body.

Thread
On Mon, 23 Dec 2024 17:14:57 +0100,
Marcus Glocker <marcus@nazgul.ch> 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