Hi,

The 2015 Chromebook Pixel has a broken ACPI that doesn't support
burst mode and will hang on boot when it's tried.

Rev 1.54 of acpiec.c disabled it for single-byte reads and writes,
which fixed this machine, but broke others. So it got reverted, with
the note:

  "A machine/bios-dependent check could be added later to disable
  bursting on certain machines."

jcs later sent me such a diff, and I've been using it for several
months. I'm starting to tire of compiling my own kernels, so I'd
like to get it in if possible.

ok?


Index: sys/dev/acpi/acpidev.h
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpidev.h,v
retrieving revision 1.42
diff -u -p -r1.42 acpidev.h
--- sys/dev/acpi/acpidev.h      6 Sep 2017 13:01:48 -0000       1.42
+++ sys/dev/acpi/acpidev.h      16 Jan 2018 09:19:54 -0000
@@ -374,6 +374,7 @@ struct acpiec_softc {
        struct acpiec_event     sc_events[ACPIEC_MAX_EVENTS];
        int                     sc_gotsci;
        int                     sc_glk;
+       int                     sc_canburst;
 };
 
 void           acpibtn_disable_psw(void);
Index: sys/dev/acpi/acpiec.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpiec.c,v
retrieving revision 1.56
diff -u -p -r1.56 acpiec.c
--- sys/dev/acpi/acpiec.c       11 Mar 2017 21:46:32 -0000      1.56
+++ sys/dev/acpi/acpiec.c       16 Jan 2018 09:19:54 -0000
@@ -77,6 +77,8 @@ void          acpiec_unlock(struct acpiec_softc 
 
 int    acpiec_reg(struct acpiec_softc *);
 
+extern char    *hw_vendor, *hw_prod;
+
 struct cfattach acpiec_ca = {
        sizeof(struct acpiec_softc), acpiec_match, acpiec_attach
 };
@@ -195,6 +197,9 @@ acpiec_write_1(struct acpiec_softc *sc, 
 void
 acpiec_burst_enable(struct acpiec_softc *sc)
 {
+       if (!sc->sc_canburst)
+               return;
+
        acpiec_write_cmd(sc, EC_CMD_BE);
        acpiec_read_data(sc);
 }
@@ -202,6 +207,9 @@ acpiec_burst_enable(struct acpiec_softc 
 void
 acpiec_burst_disable(struct acpiec_softc *sc)
 {
+       if (!sc->sc_canburst)
+               return;
+
        if ((acpiec_status(sc) & EC_STAT_BURST) == EC_STAT_BURST)
                acpiec_write_cmd(sc, EC_CMD_BD);
 }
@@ -273,6 +281,7 @@ acpiec_attach(struct device *parent, str
 
        sc->sc_acpi = (struct acpi_softc *)parent;
        sc->sc_devnode = aa->aaa_node;
+       sc->sc_canburst = 1;
 
        if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "_STA", 0, NULL, &st))
                st = STA_PRESENT | STA_ENABLED | STA_DEV_OK;
@@ -293,6 +302,16 @@ acpiec_attach(struct device *parent, str
                printf("%s: Failed to register address space\n", DEVNAME(sc));
                return;
        }
+
+       /*
+        * Some Chromebooks using the Google EC do not support burst mode and
+        * cause us to spin forever waiting for the acknowledgment.  Don't use
+        * burst mode at all on these machines.
+        */
+       if (hw_vendor != NULL && hw_prod != NULL &&
+           strcmp(hw_vendor, "GOOGLE") == 0 &&
+           strcmp(hw_prod, "Samus") == 0)
+               sc->sc_canburst = 0;
 
        acpiec_get_events(sc);
 

Reply via email to