svn commit: r299977 - head/sys/dev/acpica/Osd

Jim Harris jim.harris at gmail.com
Tue May 17 15:44:56 UTC 2016


On Mon, May 16, 2016 at 2:33 PM, John Baldwin <jhb at freebsd.org> wrote:

> Author: jhb
> Date: Mon May 16 21:33:31 2016
> New Revision: 299977
> URL: https://svnweb.freebsd.org/changeset/base/299977
>
> Log:
>   Use polling spin loops for timeouts during early boot.
>
>   Some ACPI operations such as mutex acquires and event waits accept a
>   timeout.  The ACPI OSD layer implements these timeouts by using regular
>   sleep timeouts.  However, this doesn't work during early boot before
>   event timers are setup.  Instead, use polling combined with DELAY()
>   to spin.
>
>   This fixes booting on upcoming Intel systems with Kaby Lake processors.
>

Thanks!


>
>   Tested by:    "Jeffrey E Pieper" <jeffrey.e.pieper at intel.com>
>   Reviewed by:  jimharris
>   MFC after:    1 week
>
> Modified:
>   head/sys/dev/acpica/Osd/OsdSynch.c
>
> Modified: head/sys/dev/acpica/Osd/OsdSynch.c
>
> ==============================================================================
> --- head/sys/dev/acpica/Osd/OsdSynch.c  Mon May 16 20:26:30 2016
> (r299976)
> +++ head/sys/dev/acpica/Osd/OsdSynch.c  Mon May 16 21:33:31 2016
> (r299977)
> @@ -188,6 +188,23 @@ AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handl
>                 }
>                 break;
>         default:
> +               if (cold) {
> +                       /*
> +                        * Just spin polling the semaphore once a
> +                        * millisecond.
> +                        */
> +                       while (!ACPISEM_AVAIL(as, Units)) {
> +                               if (Timeout == 0) {
> +                                       status = AE_TIME;
> +                                       break;
> +                               }
> +                               Timeout--;
> +                               mtx_unlock(&as->as_lock);
> +                               DELAY(1000);
> +                               mtx_lock(&as->as_lock);
> +                       }
> +                       break;
> +               }
>                 tmo = timeout2hz(Timeout);
>                 while (!ACPISEM_AVAIL(as, Units)) {
>                         prevtick = ticks;
> @@ -381,6 +398,23 @@ AcpiOsAcquireMutex(ACPI_MUTEX Handle, UI
>                 }
>                 break;
>         default:
> +               if (cold) {
> +                       /*
> +                        * Just spin polling the mutex once a
> +                        * millisecond.
> +                        */
> +                       while (!ACPIMTX_AVAIL(am)) {
> +                               if (Timeout == 0) {
> +                                       status = AE_TIME;
> +                                       break;
> +                               }
> +                               Timeout--;
> +                               mtx_unlock(&am->am_lock);
> +                               DELAY(1000);
> +                               mtx_lock(&am->am_lock);
> +                       }
> +                       break;
> +               }
>                 tmo = timeout2hz(Timeout);
>                 while (!ACPIMTX_AVAIL(am)) {
>                         prevtick = ticks;
>
>


More information about the svn-src-head mailing list