From 6b768fa10e2b179065ecbdc755499e8962b6de81 Mon Sep 17 00:00:00 2001 From: Joshua Stein Date: Thu, 16 Feb 2017 18:02:23 +0000 Subject: On Apple hardware, claim an OSI of Darwin and no other OSes The DSDT on at MacBooks takes many different and beneficial code paths when the OS reports to be Darwin, but due to the way it checks OSI, we can't just add Darwin to the aml_valid_osi array since later checks for Windows variants will supersede the Darwin check. Fixes suspend and keeps Thunderbolt ports powered up after resume. One regression is that the acpibat driver no longer attaches and will require an ACPI Smart Battery driver, which is in the works. Adapted from a similar change in the Linux kernel from 2014. ok deraadt --- sys/dev/acpi/dsdt.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'sys/dev') diff --git a/sys/dev/acpi/dsdt.c b/sys/dev/acpi/dsdt.c index 16102230779..02a3e15ceac 100644 --- a/sys/dev/acpi/dsdt.c +++ b/sys/dev/acpi/dsdt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsdt.c,v 1.230 2017/01/14 11:32:00 kettenis Exp $ */ +/* $OpenBSD: dsdt.c,v 1.231 2017/02/16 18:02:22 jcs Exp $ */ /* * Copyright (c) 2005 Jordan Hargrave * @@ -106,6 +106,8 @@ void _aml_die(const char *fn, int line, const char *fmt, ...); void aml_notify_task(void *, int); void acpi_poll_notify_task(void *, int); +extern char *hw_vendor; + /* * @@@: Global variables */ @@ -1505,6 +1507,21 @@ aml_callosi(struct aml_scope *scope, struct aml_value *val) struct aml_value *fa; fa = aml_getstack(scope, AMLOP_ARG0); + + if (hw_vendor != NULL && + (strcmp(hw_vendor, "Apple Inc.") == 0 || + strcmp(hw_vendor, "Apple Computer, Inc.") == 0)) { + if (strcmp(fa->v_string, "Darwin") == 0) { + dnprintf(10,"osi: returning 1 for %s on %s hardware\n", + fa->v_string, hw_vendor); + result = 1; + } else + dnprintf(10,"osi: on %s hardware, but ignoring %s\n", + hw_vendor, fa->v_string); + + return aml_allocvalue(AML_OBJTYPE_INTEGER, result, NULL); + } + for (idx=0; !result && aml_valid_osi[idx] != NULL; idx++) { dnprintf(10,"osi: %s,%s\n", fa->v_string, aml_valid_osi[idx]); result = !strcmp(fa->v_string, aml_valid_osi[idx]); -- cgit v1.2.3