> Date: Tue, 23 Mar 2021 17:39:45 +0100 > From: Theo Buehler <t...@theobuehler.org> > > On Tue, Mar 23, 2021 at 05:28:37PM +0100, Mark Kettenis wrote: > > > Date: Tue, 23 Mar 2021 16:56:33 +0100 > > > From: Theo Buehler <t...@theobuehler.org> > > > > > > On Tue, Mar 23, 2021 at 04:13:53PM +0100, Mark Kettenis wrote: > > > > > Date: Tue, 23 Mar 2021 14:14:40 +0100 > > > > > From: Theo Buehler <t...@theobuehler.org> > > > > > > > > It would help if you could try and boot a kernel that adds some debug > > > > prints instead of calling aml_die(). Probably need to know the values > > > > of alen, bpos, blen, mode and flag for starters. > > > > > > Thanks. > > > > > > alen 0x00, bpos 0x278, blen 0x10, mode 0x00, flag 0x605 > > > > > > So: AML_FIELD_ACCESS(flag) == AML_FIELD_BUFFER_ACC, bpos & 0x03 == 0 > > > and the aml_die("Invalid GenericSerialBus access") is hit because blen > > > is twice as long as it should be according to the conditional preceding > > > it: > > > > > > if (AML_FIELD_ACCESS(flag) != AML_FIELD_BUFFERACC || > > > bpos & 0x3 || blen != 8) > > > > Right, we need to figure out what this actually means. The ACPI > > standard isn't exactly clear on this... > > > > > If I skip the aml_die("Invalid GenericSerialBus access"), it hits the > > > next aml_die("Could not find GenericSerialBus controller"); because > > > node->i2c == NULL. > > > > If I'm reading the AML and FreeBSD dmesg correctly this is an i2c > > controller that attaches to PCI. I suspect that it is dwiic(4). D > > you see dwiic(4) attach? > > Two of them: > > dwiic0 at pci0 dev 21 function 0 "Intel 400 Series I2C" rev 0x00: apic 2 int > 22 > iic0 at dwiic0 > dwiic1 at pci0 dev 21 function 1 "Intel 400 Series I2C" rev 0x00: apic 2 int > 23 > iic1 at dwiic1 > > > If so, the problem is that we dont't call acpi_register_gsb() for > > dwiic(4) instances that attach to PCI. I'll see if I can come up with > > a diff for that. > > Thanks a lot!
Can you try the diff below? Index: dev/acpi/dsdt.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/dsdt.c,v retrieving revision 1.261 diff -u -p -r1.261 dsdt.c --- dev/acpi/dsdt.c 18 Mar 2021 00:17:26 -0000 1.261 +++ dev/acpi/dsdt.c 23 Mar 2021 19:27:34 -0000 @@ -2535,17 +2535,17 @@ aml_rwgsb(struct aml_value *conn, int al i2c_tag_t tag; i2c_op_t op; i2c_addr_t addr; - int cmdlen, buflen; + int cmdlen, buflen, acclen; uint8_t cmd; uint8_t *buf; - int err; + int pos, err; if (conn->type != AML_OBJTYPE_BUFFER || conn->length < 5 || AML_CRSTYPE(crs) != LR_SERBUS || AML_CRSLEN(crs) > conn->length || crs->lr_i2cbus.revid != 1 || crs->lr_i2cbus.type != LR_SERBUS_I2C) aml_die("Invalid GenericSerialBus"); if (AML_FIELD_ACCESS(flag) != AML_FIELD_BUFFERACC || - bpos & 0x3 || blen != 8) + bpos & 0x3 || (blen % 8) != 0) aml_die("Invalid GenericSerialBus access"); node = aml_searchname(conn->node, @@ -2559,27 +2559,32 @@ aml_rwgsb(struct aml_value *conn, int al switch (AML_FIELD_ATTR(flag)) { case 0x02: /* AttribQuick */ cmdlen = 0; - buflen = 0; + buflen = acclen = 0; break; case 0x04: /* AttribSendReceive */ cmdlen = 0; - buflen = 1; + acclen = 1; + buflen = blen / 8; break; case 0x06: /* AttribByte */ cmdlen = 1; - buflen = 1; + acclen = 1; + buflen = blen / 8; break; case 0x08: /* AttribWord */ cmdlen = 1; - buflen = 2; + acclen = 2; + buflen = blen / 8; break; case 0x0b: /* AttribBytes */ cmdlen = 1; - buflen = alen; + acclen = alen; + buflen = blen / 8; break; case 0x0e: /* AttribRawBytes */ cmdlen = 0; - buflen = alen; + acclen = alen; + buflen = blen / 8; break; default: aml_die("unsupported access type 0x%x", flag); @@ -2588,11 +2593,11 @@ aml_rwgsb(struct aml_value *conn, int al break; case 1: /* AttribBytes */ cmdlen = 1; - buflen = AML_FIELD_ATTR(flag); + acclen = buflen = AML_FIELD_ATTR(flag); break; case 2: /* AttribRawBytes */ cmdlen = 0; - buflen = AML_FIELD_ATTR(flag); + acclen = buflen = AML_FIELD_ATTR(flag); break; default: aml_die("unsupported access type 0x%x", flag); @@ -2612,7 +2617,13 @@ aml_rwgsb(struct aml_value *conn, int al buf = val->v_buffer; iic_acquire_bus(tag, 0); - err = iic_exec(tag, op, addr, &cmd, cmdlen, &buf[2], buflen, 0); + for (pos = 0; pos < buflen; pos += acclen) { + err = iic_exec(tag, op, addr, &cmd, cmdlen, + &buf[pos + 2], acclen, 0); + if (err) + break; + cmd++; + } iic_release_bus(tag, 0); /* Index: dev/pci/dwiic_pci.c =================================================================== RCS file: /cvs/src/sys/dev/pci/dwiic_pci.c,v retrieving revision 1.15 diff -u -p -r1.15 dwiic_pci.c --- dev/pci/dwiic_pci.c 25 Dec 2020 21:48:27 -0000 1.15 +++ dev/pci/dwiic_pci.c 23 Mar 2021 19:27:34 -0000 @@ -225,7 +225,12 @@ dwiic_pci_attach(struct device *parent, config_found((struct device *)sc, &sc->sc_iba, iicbus_print); - return; +#if NACPI > 0 && !defined(SMALL_KERNEL) + if (sc->sc_devnode) { + sc->sc_devnode->i2c = &sc->sc_i2c_tag; + acpi_register_gsb(acpi_softc, sc->sc_devnode); + } +#endif } int