On 09/02/17(Thu) 18:30, joshua stein wrote:
> When running on machines with a hw_vendor of "Apple Inc." or "Apple
> Computer, Inc.", only return 1 for an OSI check of "Darwin" and not
> the other Windows variants.
> 
> Code in the AML of the MacBookAir7,1 (most likely all Macs) does
> much different things when running on Darwin systems, but the AML
> that checks for Darwin does this:
> 
>             OSYS = 0x07DC
>             If (CondRefOf (\_OSI, Local0))
>             {
>                 If (_OSI ("Darwin"))
>                 {
>                     OSYS = 0x2710
>                 }
> 
>                 If (\_OSI ("Linux"))
>                 {
>                     OSYS = 0x03E8
>                 }
> 
>                 If (\_OSI ("Windows 2009"))
>                 {
>                     OSYS = 0x07D9
>                 }
>                 [...]
> 
> So we can't just add Darwin to aml_valid_osi.

I'm not sure to understand why we can't add Darwin, is it going to
break non Apple machines?

> Without this, my MacBook Air won't suspend properly (hangs calling
> _PTS) and a similar change in Linux from 2014 (commit
> 7bc5a2bad0b8d9d1ac9f7b8b33150e4ddf197334) notes that upon resume,
> the Thunderbolt ports won't be powered up without pretending to be
> Darwin.
> 
> I tested this with a Thunderbolt ethernet device and it works
> properly before and after suspend.  Hot-plugging the Thunderbolt
> ethernet device after boot no longer prints these messages:
> 
>     ppb5 at pci4 dev 0 function 0 vendor "Intel", unknown product 0x156b rev 
> 0x00
>     pci6 at ppb5 bus 6
>     ppb6 at pci6 dev 0 function 0 vendor "Intel", unknown product 0x156b rev 
> 0x00: not configured by system firmware
>     ppb7 at pci6 dev 3 function 0 vendor "Intel", unknown product 0x156b rev 
> 0x00: not configured by system firmware
>     ppb8 at pci6 dev 4 function 0 vendor "Intel", unknown product 0x156b rev 
> 0x00: not configured by system firmware
>     ppb9 at pci6 dev 5 function 0 vendor "Intel", unknown product 0x156b rev 
> 0x00: not configured by system firmware
>     ppb10 at pci6 dev 6 function 0 vendor "Intel", unknown product 0x156b rev 
> 0x00: not configured by system firmware

Diff looks sane to me.

> Index: sys/dev/acpi/dsdt.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/dsdt.c,v
> retrieving revision 1.230
> diff -u -p -u -p -r1.230 dsdt.c
> --- sys/dev/acpi/dsdt.c       14 Jan 2017 11:32:00 -0000      1.230
> +++ sys/dev/acpi/dsdt.c       10 Feb 2017 00:31:02 -0000
> @@ -106,6 +106,8 @@ void                      _aml_die(const char *fn, int 
> line
>  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, str
>       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]);
> 

Reply via email to