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);