summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica/acpivar.h
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2004-08-13 06:21:19 +0000
committernjl <njl@FreeBSD.org>2004-08-13 06:21:19 +0000
commitfb4dcf20ad349dbf4e35475056efd14d8be27d3e (patch)
tree320f50efd869c338c47ab4f732fe6c314bce5c08 /sys/dev/acpica/acpivar.h
parent616ce4ded84267136d3d87c1580e463382fa74b1 (diff)
downloadFreeBSD-src-fb4dcf20ad349dbf4e35475056efd14d8be27d3e.zip
FreeBSD-src-fb4dcf20ad349dbf4e35475056efd14d8be27d3e.tar.gz
MPSAFE locking
* Add and comment our locking primitives. The mutex primitives use a a static mutex and the serialization ones use a static sx lock. A global acpi_mutex is used for access to global resources (i.e., writes to the SMI_CMD register.) * Remove 4.x compat defines.
Diffstat (limited to 'sys/dev/acpica/acpivar.h')
-rw-r--r--sys/dev/acpica/acpivar.h61
1 files changed, 33 insertions, 28 deletions
diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h
index 2129217..53b33e4 100644
--- a/sys/dev/acpica/acpivar.h
+++ b/sys/dev/acpica/acpivar.h
@@ -32,18 +32,13 @@
#include "bus_if.h"
#include <sys/eventhandler.h>
#include <sys/sysctl.h>
-#if __FreeBSD_version >= 500000
#include <sys/lock.h>
#include <sys/mutex.h>
-#endif
+#include <sys/sx.h>
#include <machine/bus.h>
#include <machine/resource.h>
-#if __FreeBSD_version < 500000
-typedef vm_offset_t vm_paddr_t;
-#endif
-
struct acpi_softc {
device_t acpi_dev;
struct cdev *acpi_dev_t;
@@ -103,23 +98,40 @@ struct acpi_prw_data {
/* Flags for each device defined in the AML namespace. */
#define ACPI_FLAG_WAKE_ENABLED 0x1
-#if __FreeBSD_version < 500000
/*
- * In 4.x, ACPI is protected by splhigh().
+ * Entry points to ACPI from above are global functions defined in this
+ * file, sysctls, and I/O on the control device. Entry points from below
+ * are interrupts (the SCI), notifies, task queue threads, and the thermal
+ * zone polling thread.
+ *
+ * ACPI tables and global shared data are protected by a global lock
+ * (acpi_mutex).
+ *
+ * Each ACPI device can have its own driver-specific mutex for protecting
+ * shared access to local data. The ACPI_LOCK macros handle mutexes.
+ *
+ * Drivers that need to serialize access to functions (e.g., to route
+ * interrupts, get/set control paths, etc.) should use the sx lock macros
+ * (ACPI_SERIAL).
+ *
+ * ACPI-CA handles its own locking and should not be called with locks held.
+ *
+ * The most complicated path is:
+ * GPE -> EC runs _Qxx -> _Qxx reads EC space -> GPE
*/
-# define ACPI_LOCK s = splhigh()
-# define ACPI_UNLOCK splx(s)
-# define ACPI_ASSERTLOCK
-# define ACPI_MSLEEP(a, b, c, d, e) tsleep(a, c, d, e)
-# define ACPI_LOCK_DECL int s
-# define kthread_create(a, b, c, d, e, f) kthread_create(a, b, c, f)
-# define tc_init(a) init_timecounter(a)
-#else
-# define ACPI_LOCK
-# define ACPI_UNLOCK
-# define ACPI_ASSERTLOCK
-# define ACPI_LOCK_DECL
-#endif
+extern struct mtx acpi_mutex;
+#define ACPI_LOCK(sys) mtx_lock(&sys##_mutex)
+#define ACPI_UNLOCK(sys) mtx_unlock(&sys##_mutex)
+#define ACPI_LOCK_ASSERT(sys) mtx_assert(&sys##_mutex, MA_OWNED);
+#define ACPI_LOCK_DECL(sys, name) \
+ static struct mtx sys##_mutex; \
+ MTX_SYSINIT(sys##_mutex, &sys##_mutex, name, MTX_DEF)
+#define ACPI_SERIAL_BEGIN(sys) sx_xlock(&sys##_sxlock)
+#define ACPI_SERIAL_END(sys) sx_xunlock(&sys##_sxlock)
+#define ACPI_SERIAL_ASSERT(sys) sx_assert(&sys##_sxlock, SX_XLOCKED);
+#define ACPI_SERIAL_DECL(sys, name) \
+ static struct sx sys##_sxlock; \
+ SX_SYSINIT(sys##_sxlock, &sys##_sxlock, name)
/*
* ACPI CA does not define layers for non-ACPI CA drivers.
@@ -377,16 +389,9 @@ int acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *rid,
struct resource **dst);
ACPI_HANDLE acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj);
-#if __FreeBSD_version >= 500000
#ifndef ACPI_MAX_THREADS
#define ACPI_MAX_THREADS 3
#endif
-#if ACPI_MAX_THREADS > 0
-#define ACPI_USE_THREADS
-#endif
-#endif
-#ifdef ACPI_USE_THREADS
/* ACPI task kernel thread initialization. */
int acpi_task_thread_init(void);
-#endif
OpenPOWER on IntegriCloud