svn commit: r286994 - head/sys/x86/acpica

Adrian Chadd adrian.chadd at gmail.com
Fri Aug 21 15:22:52 UTC 2015


Think we could do the same for the Asus zenbooks?


-a


On 21 August 2015 at 08:13, Konstantin Belousov <kib at freebsd.org> wrote:
> Author: kib
> Date: Fri Aug 21 15:13:25 2015
> New Revision: 286994
> URL: https://svnweb.freebsd.org/changeset/base/286994
>
> Log:
>   Automatically disable x2APIC mode on SandyBridge Lenovo machines.  I
>   believe that the bug only affects mobile CPUs, at least I did not see
>   other reports, but it is impossible to detect it in madt_setup_local().
>
>   While there, reduce duplication in the information strings printed
>   when x2APIC is auto-disabled, and do not print the line when user
>   manually override the setting.
>
>   Tested and reviewed by:         royger (previous version)
>   Sponsored by: The FreeBSD Foundation
>
> Modified:
>   head/sys/x86/acpica/madt.c
>
> Modified: head/sys/x86/acpica/madt.c
> ==============================================================================
> --- head/sys/x86/acpica/madt.c  Fri Aug 21 14:28:14 2015        (r286993)
> +++ head/sys/x86/acpica/madt.c  Fri Aug 21 15:13:25 2015        (r286994)
> @@ -132,20 +132,27 @@ madt_setup_local(void)
>  {
>         ACPI_TABLE_DMAR *dmartbl;
>         vm_paddr_t dmartbl_physaddr;
> +       const char *reason;
> +       char *hw_vendor;
>         u_int p[4];
>
>         madt = pmap_mapbios(madt_physaddr, madt_length);
>         if ((cpu_feature2 & CPUID2_X2APIC) != 0) {
>                 x2apic_mode = 1;
> +               reason = NULL;
> +
> +               /*
> +                * Automatically detect several configurations where
> +                * x2APIC mode is known to cause troubles.  User can
> +                * override the setting with hw.x2apic_enable tunable.
> +                */
>                 dmartbl_physaddr = acpi_find_table(ACPI_SIG_DMAR);
>                 if (dmartbl_physaddr != 0) {
>                         dmartbl = acpi_map_table(dmartbl_physaddr,
>                             ACPI_SIG_DMAR);
>                         if ((dmartbl->Flags & ACPI_DMAR_X2APIC_OPT_OUT) != 0) {
>                                 x2apic_mode = 0;
> -                               if (bootverbose)
> -                                       printf(
> -               "x2APIC available but disabled by DMAR table\n");
> +                               reason = "by DMAR table";
>                         }
>                         acpi_unmap_table(dmartbl);
>                 }
> @@ -154,14 +161,34 @@ madt_setup_local(void)
>                         if ((p[0] & VMW_VCPUINFO_VCPU_RESERVED) != 0 ||
>                             (p[0] & VMW_VCPUINFO_LEGACY_X2APIC) == 0) {
>                                 x2apic_mode = 0;
> -                               if (bootverbose)
> -                                       printf(
> -       "x2APIC available but disabled inside VMWare without intr redirection\n");
> +               reason = "inside VMWare without intr redirection";
>                         }
>                 } else if (vm_guest == VM_GUEST_XEN) {
>                         x2apic_mode = 0;
> +                       reason = "due to running under XEN";
> +               } else if (vm_guest == VM_GUEST_NO) {
> +                       hw_vendor = kern_getenv("smbios.planar.maker");
> +                       /*
> +                        * It seems that some Lenovo SandyBridge-based
> +                        * notebook BIOSes have a bug which prevents
> +                        * booting AP in x2APIC mode.  Since the only
> +                        * way to detect mobile CPU is to check
> +                        * northbridge pci id, which cannot be done
> +                        * that early, disable x2APIC for all Lenovo
> +                        * SandyBridge machines.
> +                        */
> +                       if (hw_vendor != NULL &&
> +                           !strcmp(hw_vendor, "LENOVO") &&
> +                           CPUID_TO_FAMILY(cpu_id) == 0x6 &&
> +                           CPUID_TO_MODEL(cpu_id) == 0x2a) {
> +                               x2apic_mode = 0;
> +               reason = "for a suspected Lenovo SandyBridge BIOS bug";
> +                       }
> +                       freeenv(hw_vendor);
>                 }
>                 TUNABLE_INT_FETCH("hw.x2apic_enable", &x2apic_mode);
> +               if (!x2apic_mode && reason != NULL && bootverbose)
> +                       printf("x2APIC available but disabled %s\n", reason);
>         }
>
>         lapic_init(madt->Address);
>


More information about the svn-src-head mailing list