> 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

Reply via email to