From owner-freebsd-acpi@FreeBSD.ORG Sun Sep 30 20:10:26 2007 Return-Path: Delivered-To: acpi@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C593716A418 for ; Sun, 30 Sep 2007 20:10:26 +0000 (UTC) (envelope-from nate@root.org) Received: from root.org (root.org [67.118.192.226]) by mx1.freebsd.org (Postfix) with ESMTP id 9B0C913C49D for ; Sun, 30 Sep 2007 20:10:26 +0000 (UTC) (envelope-from nate@root.org) Received: (qmail 38370 invoked from network); 30 Sep 2007 20:10:27 -0000 Received: from ppp-71-139-1-224.dsl.snfc21.pacbell.net (HELO ?10.0.0.15?) (nate-mail@71.139.1.224) by root.org with ESMTPA; 30 Sep 2007 20:10:27 -0000 Message-ID: <470002B5.6030002@root.org> Date: Sun, 30 Sep 2007 13:10:29 -0700 From: Nate Lawson User-Agent: Thunderbird 2.0.0.6 (Windows/20070728) MIME-Version: 1.0 To: current@FreeBSD.org, acpi@freebsd.org X-Enigmail-Version: 0.95.3 Content-Type: multipart/mixed; boundary="------------010009080907080806050809" Cc: Subject: patch: change in acpi taskq behavior X-BeenThere: freebsd-acpi@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: ACPI and power management development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 30 Sep 2007 20:10:26 -0000 This is a multi-part message in MIME format. --------------010009080907080806050809 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Attached is a patch (one for 6, one for 7) that shouldn't break anything for most people and may fix some battery status issues for others. It changes how we run tasks during boot. It seems some hardware expects synchronous access but our taskq is not running until after interrupts are enabled. This patch bounces calls through a wrapper that executes the callback directly if we're not booted yet. Please let me know if it breaks anything for you. Thanks, Nate --------------010009080907080806050809 Content-Type: text/x-patch; name="taskq6a.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="taskq6a.diff" Index: sys/dev/acpica/acpi_acad.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_acad.c,v retrieving revision 1.33.2.2 diff -u -r1.33.2.2 acpi_acad.c --- sys/dev/acpica/acpi_acad.c 5 Nov 2005 23:48:38 -0000 1.33.2.2 +++ sys/dev/acpica/acpi_acad.c 30 Sep 2007 19:24:23 -0000 @@ -181,7 +181,7 @@ */ AcpiInstallNotifyHandler(handle, ACPI_ALL_NOTIFY, acpi_acad_notify_handler, dev); - AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_acad_init_acline, dev); + acpi_queue_task(OSD_PRIORITY_LO, acpi_acad_init_acline, dev); return (0); } Index: sys/dev/acpica/acpi_cmbat.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_cmbat.c,v retrieving revision 1.39.2.5 diff -u -r1.39.2.5 acpi_cmbat.c --- sys/dev/acpica/acpi_cmbat.c 11 Jun 2006 20:50:08 -0000 1.39.2.5 +++ sys/dev/acpica/acpi_cmbat.c 30 Sep 2007 19:25:16 -0000 @@ -149,7 +149,7 @@ AcpiInstallNotifyHandler(handle, ACPI_ALL_NOTIFY, acpi_cmbat_notify_handler, dev); - AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_cmbat_init_battery, dev); + acpi_queue_task(OSD_PRIORITY_LO, acpi_cmbat_init_battery, dev); return (0); } Index: sys/dev/acpica/acpi_cpu.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_cpu.c,v retrieving revision 1.57.2.3 diff -u -r1.57.2.3 acpi_cpu.c --- sys/dev/acpica/acpi_cpu.c 11 Jun 2007 18:54:09 -0000 1.57.2.3 +++ sys/dev/acpica/acpi_cpu.c 30 Sep 2007 19:25:26 -0000 @@ -313,7 +313,7 @@ CTLFLAG_RD, 0, "node for CPU children"); /* Queue post cpu-probing task handler */ - AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_cpu_startup, NULL); + acpi_queue_task(OSD_PRIORITY_LO, acpi_cpu_startup, NULL); } /* Index: sys/dev/acpica/acpi_dock.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_dock.c,v retrieving revision 1.5.2.1 diff -u -r1.5.2.1 acpi_dock.c --- sys/dev/acpica/acpi_dock.c 23 Mar 2007 19:45:52 -0000 1.5.2.1 +++ sys/dev/acpica/acpi_dock.c 30 Sep 2007 19:25:31 -0000 @@ -238,7 +238,7 @@ goto out; } - AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_dock_attach_later, dev); + acpi_queue_task(OSD_PRIORITY_LO, acpi_dock_attach_later, dev); out: return (AE_OK); Index: sys/dev/acpica/acpi_perf.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_perf.c,v retrieving revision 1.21.2.4 diff -u -r1.21.2.4 acpi_perf.c --- sys/dev/acpica/acpi_perf.c 23 Jan 2007 07:21:23 -0000 1.21.2.4 +++ sys/dev/acpica/acpi_perf.c 30 Sep 2007 19:25:56 -0000 @@ -221,7 +221,7 @@ sc->px_curr_state = CPUFREQ_VAL_UNKNOWN; if (acpi_perf_evaluate(dev) != 0) return (ENXIO); - AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_px_startup, NULL); + acpi_queue_task(OSD_PRIORITY_LO, acpi_px_startup, NULL); if (!sc->info_only) cpufreq_register(dev); Index: sys/dev/acpica/acpivar.h =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpivar.h,v retrieving revision 1.95.2.6 diff -u -r1.95.2.6 acpivar.h --- sys/dev/acpica/acpivar.h 17 Jun 2007 17:28:41 -0000 1.95.2.6 +++ sys/dev/acpica/acpivar.h 30 Sep 2007 19:29:59 -0000 @@ -390,6 +415,8 @@ int acpi_sleep_machdep(struct acpi_softc *sc, int state); int acpi_table_quirks(int *quirks); int acpi_machdep_quirks(int *quirks); +ACPI_STATUS acpi_queue_task(UINT32 Priority, + ACPI_OSD_EXEC_CALLBACK Function, void *Context); /* Battery Abstraction. */ struct acpi_battinfo; Index: sys/dev/acpica/Osd/OsdSchedule.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/Osd/OsdSchedule.c,v retrieving revision 1.32.2.6 diff -u -r1.32.2.6 OsdSchedule.c --- sys/dev/acpica/Osd/OsdSchedule.c 6 Jul 2006 08:32:49 -0000 1.32.2.6 +++ sys/dev/acpica/Osd/OsdSchedule.c 30 Sep 2007 19:23:24 -0000 @@ -83,11 +83,33 @@ } /* + * If we're up and running, queue the task for our taskq. It will run + * shortly. If we're booting and we had queued it, it would not actually run + * until interrupts are enabled later in boot. So in that case, run it + * directly instead. If a driver really wants the task delayed until boot, + * they can use acpi_queue_task() below. + */ +ACPI_STATUS +AcpiOsQueueForExecution(UINT32 Priority, ACPI_OSD_EXEC_CALLBACK Function, + void *Context) +{ + ACPI_STATUS status; + + if (!(cold || rebooting)) + status = acpi_queue_task(Priority, Function, Context); + else { + Function(Context); + status = AE_OK; + } + return (status); +} + +/* * This function may be called in interrupt context, i.e. when a GPE fires. * We allocate and queue a task for one of our taskqueue threads to process. */ ACPI_STATUS -AcpiOsQueueForExecution(UINT32 Priority, ACPI_OSD_EXEC_CALLBACK Function, +acpi_queue_task(UINT32 Priority, ACPI_OSD_EXEC_CALLBACK Function, void *Context) { struct acpi_task_ctx *at; --------------010009080907080806050809 Content-Type: text/x-patch; name="taskq7a.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="taskq7a.diff" Index: sys/dev/acpica/acpi_acad.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_acad.c,v retrieving revision 1.38 diff -u -r1.38 acpi_acad.c --- sys/dev/acpica/acpi_acad.c 22 Mar 2007 18:16:40 -0000 1.38 +++ sys/dev/acpica/acpi_acad.c 30 Sep 2007 19:42:09 -0000 @@ -181,7 +181,7 @@ */ AcpiInstallNotifyHandler(handle, ACPI_ALL_NOTIFY, acpi_acad_notify_handler, dev); - AcpiOsExecute(OSL_NOTIFY_HANDLER, acpi_acad_init_acline, dev); + acpi_queue_task(OSL_NOTIFY_HANDLER, acpi_acad_init_acline, dev); return (0); } Index: sys/dev/acpica/acpi_cmbat.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_cmbat.c,v retrieving revision 1.46 diff -u -r1.46 acpi_cmbat.c --- sys/dev/acpica/acpi_cmbat.c 22 Mar 2007 18:16:40 -0000 1.46 +++ sys/dev/acpica/acpi_cmbat.c 30 Sep 2007 19:42:26 -0000 @@ -149,7 +149,7 @@ AcpiInstallNotifyHandler(handle, ACPI_ALL_NOTIFY, acpi_cmbat_notify_handler, dev); - AcpiOsExecute(OSL_NOTIFY_HANDLER, acpi_cmbat_init_battery, dev); + acpi_queue_task(OSL_NOTIFY_HANDLER, acpi_cmbat_init_battery, dev); return (0); } Index: sys/dev/acpica/acpi_cpu.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_cpu.c,v retrieving revision 1.67 diff -u -r1.67 acpi_cpu.c --- sys/dev/acpica/acpi_cpu.c 30 Aug 2007 21:18:42 -0000 1.67 +++ sys/dev/acpica/acpi_cpu.c 30 Sep 2007 19:42:31 -0000 @@ -318,7 +318,7 @@ CTLFLAG_RD, 0, "node for CPU children"); /* Queue post cpu-probing task handler */ - AcpiOsExecute(OSL_NOTIFY_HANDLER, acpi_cpu_startup, NULL); + acpi_queue_task(OSL_NOTIFY_HANDLER, acpi_cpu_startup, NULL); } /* Index: sys/dev/acpica/acpi_dock.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_dock.c,v retrieving revision 1.6 diff -u -r1.6 acpi_dock.c --- sys/dev/acpica/acpi_dock.c 31 May 2007 08:49:51 -0000 1.6 +++ sys/dev/acpica/acpi_dock.c 30 Sep 2007 19:42:34 -0000 @@ -233,7 +233,7 @@ goto out; } - AcpiOsExecute(OSL_NOTIFY_HANDLER, acpi_dock_attach_later, dev); + acpi_queue_task(OSL_NOTIFY_HANDLER, acpi_dock_attach_later, dev); out: return (AE_OK); Index: sys/dev/acpica/acpi_perf.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_perf.c,v retrieving revision 1.26 diff -u -r1.26 acpi_perf.c --- sys/dev/acpica/acpi_perf.c 22 Mar 2007 18:16:40 -0000 1.26 +++ sys/dev/acpica/acpi_perf.c 30 Sep 2007 19:42:38 -0000 @@ -221,7 +221,7 @@ sc->px_curr_state = CPUFREQ_VAL_UNKNOWN; if (acpi_perf_evaluate(dev) != 0) return (ENXIO); - AcpiOsExecute(OSL_NOTIFY_HANDLER, acpi_px_startup, NULL); + acpi_queue_task(OSL_NOTIFY_HANDLER, acpi_px_startup, NULL); if (!sc->info_only) cpufreq_register(dev); Index: sys/dev/acpica/acpivar.h =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpivar.h,v retrieving revision 1.107 diff -u -r1.107 acpivar.h --- sys/dev/acpica/acpivar.h 21 Jun 2007 22:50:37 -0000 1.107 +++ sys/dev/acpica/acpivar.h 30 Sep 2007 19:43:42 -0000 @@ -417,6 +417,8 @@ int acpi_sleep_machdep(struct acpi_softc *sc, int state); int acpi_table_quirks(int *quirks); int acpi_machdep_quirks(int *quirks); +ACPI_STATUS acpi_queue_task(ACPI_EXECUTE_TYPE Type, + ACPI_OSD_EXEC_CALLBACK Function, void *Context); /* Battery Abstraction. */ struct acpi_battinfo; Index: sys/dev/acpica/Osd/OsdSchedule.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/Osd/OsdSchedule.c,v retrieving revision 1.39 diff -u -r1.39 OsdSchedule.c --- sys/dev/acpica/Osd/OsdSchedule.c 22 Mar 2007 18:16:41 -0000 1.39 +++ sys/dev/acpica/Osd/OsdSchedule.c 30 Sep 2007 19:40:59 -0000 @@ -83,11 +83,33 @@ } /* + * If we're up and running, queue the task for our taskq. It will run + * shortly. If we're booting and we had queued it, it would not actually run + * until interrupts are enabled later in boot. So in that case, run it + * directly instead. If a driver really wants the task delayed until boot, + * they can use acpi_queue_task() below. + */ +ACPI_STATUS +AcpiOsExecute(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function, + void *Context) +{ + ACPI_STATUS status; + + if (!(cold || rebooting)) + status = acpi_queue_task(Type, Function, Context); + else { + Function(Context); + status = AE_OK; + } + return (status); +} + +/* * This function may be called in interrupt context, i.e. when a GPE fires. * We allocate and queue a task for one of our taskqueue threads to process. */ ACPI_STATUS -AcpiOsExecute(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function, +acpi_queue_task(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function, void *Context) { struct acpi_task_ctx *at; --------------010009080907080806050809--