summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMarco Peereboom <marco@cvs.openbsd.org>2006-11-29 22:17:08 +0000
committerMarco Peereboom <marco@cvs.openbsd.org>2006-11-29 22:17:08 +0000
commit7ff74d3ee649de7a88b44536f8ec2f4a98a7ce84 (patch)
treede0eab12ebc737d990e0422372dd2a7d42ec9c16 /sys
parentf18d2ef6f1708a94da8f46ff8ab35ba8ad691ef8 (diff)
After a long debate at the hackathon it was decided that the acpi implementation
is not concurrent if the sensors thread goes away. This makes acpi completly lockless. help and ok dlg
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/acpi/acpiac.c16
-rw-r--r--sys/dev/acpi/acpibat.c21
-rw-r--r--sys/dev/acpi/acpidev.h3
-rw-r--r--sys/dev/acpi/acpiec.c32
-rw-r--r--sys/dev/acpi/acpitz.c17
-rw-r--r--sys/dev/acpi/dsdt.c13
6 files changed, 45 insertions, 57 deletions
diff --git a/sys/dev/acpi/acpiac.c b/sys/dev/acpi/acpiac.c
index dcfb9859941..afba3d363df 100644
--- a/sys/dev/acpi/acpiac.c
+++ b/sys/dev/acpi/acpiac.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpiac.c,v 1.9 2006/10/19 08:56:46 marco Exp $ */
+/* $OpenBSD: acpiac.c,v 1.10 2006/11/29 22:17:07 marco Exp $ */
/*
* Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
*
@@ -69,7 +69,8 @@ acpiac_attach(struct device *parent, struct device *self, void *aux)
sc->sc_acpi = (struct acpi_softc *)parent;
sc->sc_devnode = aa->aaa_node->child;
- aml_register_notify(sc->sc_devnode->parent, aa->aaa_dev, acpiac_notify, sc);
+ aml_register_notify(sc->sc_devnode->parent, aa->aaa_dev,
+ acpiac_notify, sc);
acpiac_getsta(sc);
@@ -89,12 +90,8 @@ acpiac_attach(struct device *parent, struct device *self, void *aux)
sc->sens[0].type = SENSOR_INDICATOR;
sensor_add(&sc->sens[0]);
sc->sens[0].value = sc->sc_ac_stat;
-
- if (sensor_task_register(sc, acpiac_refresh, 10))
- printf(", unable to register update task\n");
}
-/* XXX this is for debug only, remove later */
void
acpiac_refresh(void *arg)
{
@@ -110,12 +107,12 @@ acpiac_getsta(struct acpiac_softc *sc)
{
struct aml_value res;
- if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_STA", 0, NULL, NULL) != 0) {
+ if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_STA", 0, NULL, NULL)) {
dnprintf(10, "%s: no _STA\n",
DEVNAME(sc));
}
- if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_PSR", 0, NULL, &res) != 0) {
+ if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_PSR", 0, NULL, &res)) {
dnprintf(10, "%s: no _PSR\n",
DEVNAME(sc));
return (1);
@@ -136,10 +133,11 @@ acpiac_notify(struct aml_node *node, int notify_type, void *arg)
switch (notify_type) {
case 0x80:
- acpiac_getsta(sc);
+ acpiac_refresh(sc);
dnprintf(10, "A/C status: %d\n", sc->sc_ac_stat);
break;
}
+
return (0);
}
diff --git a/sys/dev/acpi/acpibat.c b/sys/dev/acpi/acpibat.c
index 4fb73597623..86273706158 100644
--- a/sys/dev/acpi/acpibat.c
+++ b/sys/dev/acpi/acpibat.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpibat.c,v 1.29 2006/10/19 18:02:19 marco Exp $ */
+/* $OpenBSD: acpibat.c,v 1.30 2006/11/29 22:17:07 marco Exp $ */
/*
* Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
*
@@ -19,7 +19,6 @@
#include <sys/proc.h>
#include <sys/systm.h>
#include <sys/device.h>
-#include <sys/rwlock.h>
#include <sys/malloc.h>
#include <sys/sensors.h>
@@ -73,8 +72,6 @@ acpibat_attach(struct device *parent, struct device *self, void *aux)
sc->sc_acpi = (struct acpi_softc *)parent;
sc->sc_devnode = aa->aaa_node->child;
- rw_init(&sc->sc_lock, "acpibat");
-
if (aml_evalname(sc->sc_acpi, sc->sc_devnode, "_STA", 0, NULL, &res))
dnprintf(10, "%s: no _STA\n",
DEVNAME(sc));
@@ -96,9 +93,6 @@ acpibat_attach(struct device *parent, struct device *self, void *aux)
sc->sc_bif.bif_type,
sc->sc_bif.bif_oem);
- if (sensor_task_register(sc, acpibat_refresh, 10))
- printf(", unable to register update task\n");
-
acpibat_monitor(sc);
}
@@ -108,7 +102,6 @@ acpibat_attach(struct device *parent, struct device *self, void *aux)
acpibat_notify, sc);
}
-/* XXX this is for debug only, remove later */
void
acpibat_monitor(struct acpibat_softc *sc)
{
@@ -183,8 +176,6 @@ acpibat_refresh(void *arg)
acpibat_getbif(sc);
acpibat_getbst(sc);
- rw_enter_write(&sc->sc_lock);
-
sc->sc_sens[0].value = sc->sc_bif.bif_last_capacity * 1000;
sc->sc_sens[1].value = sc->sc_bif.bif_warning * 1000;
sc->sc_sens[2].value = sc->sc_bif.bif_low * 1000;
@@ -206,8 +197,6 @@ acpibat_refresh(void *arg)
sc->sc_sens[5].value = sc->sc_bst.bst_rate;
sc->sc_sens[6].value = sc->sc_bst.bst_capacity * 1000;
sc->sc_sens[7].value = sc->sc_bst.bst_voltage * 1000;
-
- rw_exit_write(&sc->sc_lock);
}
int
@@ -236,8 +225,6 @@ acpibat_getbif(struct acpibat_softc *sc)
goto out;
}
- rw_enter_write(&sc->sc_lock);
-
memset(&sc->sc_bif, 0, sizeof sc->sc_bif);
sc->sc_bif.bif_power_unit = aml_val2int(res.v_package[0]);
sc->sc_bif.bif_capacity = aml_val2int(res.v_package[1]);
@@ -258,8 +245,6 @@ acpibat_getbif(struct acpibat_softc *sc)
strlcpy(sc->sc_bif.bif_oem, aml_strval(res.v_package[12]),
sizeof(sc->sc_bif.bif_oem));
- rw_exit_write(&sc->sc_lock);
-
dnprintf(60, "power_unit: %u capacity: %u last_cap: %u tech: %u "
"volt: %u warn: %u low: %u gran1: %u gran2: %d model: %s "
"serial: %s type: %s oem: %s\n",
@@ -303,16 +288,12 @@ acpibat_getbst(struct acpibat_softc *sc)
goto out;
}
- rw_enter_write(&sc->sc_lock);
-
sc->sc_bst.bst_state = aml_val2int(res.v_package[0]);
sc->sc_bst.bst_rate = aml_val2int(res.v_package[1]);
sc->sc_bst.bst_capacity = aml_val2int(res.v_package[2]);
sc->sc_bst.bst_voltage = aml_val2int(res.v_package[3]);
aml_freevalue(&res);
- rw_exit_write(&sc->sc_lock);
-
dnprintf(60, "state: %u rate: %u cap: %u volt: %u ",
sc->sc_bst.bst_state,
sc->sc_bst.bst_rate,
diff --git a/sys/dev/acpi/acpidev.h b/sys/dev/acpi/acpidev.h
index 7012f4ded51..4fff97272e4 100644
--- a/sys/dev/acpi/acpidev.h
+++ b/sys/dev/acpi/acpidev.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpidev.h,v 1.10 2006/10/19 08:56:46 marco Exp $ */
+/* $OpenBSD: acpidev.h,v 1.11 2006/11/29 22:17:07 marco Exp $ */
/*
* Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
* Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
@@ -270,7 +270,6 @@ struct acpibat_softc {
struct acpi_softc *sc_acpi;
struct aml_node *sc_devnode;
- struct rwlock sc_lock;
struct acpibat_bif sc_bif;
struct acpibat_bst sc_bst;
volatile int sc_bat_present;
diff --git a/sys/dev/acpi/acpiec.c b/sys/dev/acpi/acpiec.c
index 1e586e99273..859c5ee029f 100644
--- a/sys/dev/acpi/acpiec.c
+++ b/sys/dev/acpi/acpiec.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpiec.c,v 1.8 2006/11/25 16:25:53 jordan Exp $ */
+/* $OpenBSD: acpiec.c,v 1.9 2006/11/29 22:17:07 marco Exp $ */
/*
* Copyright (c) 2006 Can Erkin Acar <canacar@openbsd.org>
*
@@ -21,7 +21,6 @@
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/malloc.h>
-#include <sys/rwlock.h>
#include <machine/bus.h>
@@ -98,8 +97,8 @@ struct acpiec_softc {
struct aml_node *sc_devnode;
u_int32_t sc_gpe;
struct acpiec_event sc_events[ACPIEC_MAX_EVENTS];
- struct rwlock sc_lock;
int sc_locked;
+ int sc_handling_events;
};
@@ -207,7 +206,14 @@ acpiec_sci_event(struct acpiec_softc *sc)
evt = bus_space_read_1(sc->sc_data_bt, sc->sc_data_bh, 0);
dnprintf(10, "%s: sci_event: 0x%02x\n", DEVNAME(sc), (int) evt);
- aml_evalnode(sc->sc_acpi, sc->sc_events[evt].event, 0, NULL, NULL);
+
+ /* FIXME this call is recursive, this works around that */
+ if (sc->sc_handling_events == 0) {
+ sc->sc_handling_events = 1;
+ aml_evalnode(sc->sc_acpi, sc->sc_events[evt].event, 0, NULL,
+ NULL);
+ sc->sc_handling_events = 0;
+ }
}
u_int8_t
@@ -248,7 +254,12 @@ void
acpiec_read(struct acpiec_softc *sc, u_int8_t addr, int len, u_int8_t *buffer)
{
int reg;
- rw_enter_write(&sc->sc_lock);
+
+ /*
+ * this works because everything runs in the acpi thread context.
+ * at some point add a lock to deal with concurrency so that a
+ * transaction does not get interrupted.
+ */
sc->sc_locked = 1;
acpiec_burst_enable(sc);
@@ -258,14 +269,18 @@ acpiec_read(struct acpiec_softc *sc, u_int8_t addr, int len, u_int8_t *buffer)
buffer[reg] = acpiec_read_1(sc, addr + reg);
sc->sc_locked = 0;
- rw_exit_write(&sc->sc_lock);
}
void
acpiec_write(struct acpiec_softc *sc, u_int8_t addr, int len, u_int8_t *buffer)
{
int reg;
- rw_enter_write(&sc->sc_lock);
+
+ /*
+ * this works because everything runs in the acpi thread context.
+ * at some point add a lock to deal with concurrency so that a
+ * transaction does not get interrupted.
+ */
sc->sc_locked = 1;
acpiec_burst_enable(sc);
@@ -274,7 +289,6 @@ acpiec_write(struct acpiec_softc *sc, u_int8_t addr, int len, u_int8_t *buffer)
acpiec_write_1(sc, addr + reg, buffer[reg]);
sc->sc_locked = 0;
- rw_exit_write(&sc->sc_lock);
}
int
@@ -301,7 +315,6 @@ acpiec_attach(struct device *parent, struct device *self, void *aux)
sc->sc_acpi = (struct acpi_softc *)parent;
sc->sc_devnode = aa->aaa_node->child;
- rw_init(&sc->sc_lock, "acpi_ec");
sc->sc_locked = 0;
if (sc->sc_acpi->sc_ec != NULL) {
@@ -358,6 +371,7 @@ acpiec_gpehandler(struct acpi_softc *acpi_sc, int gpe, void *arg)
mask = (1L << (gpe & 7));
acpi_write_pmreg(acpi_sc, ACPIREG_GPE_STS, gpe>>3, mask);
acpi_write_pmreg(acpi_sc, ACPIREG_GPE_EN, gpe>>3, mask);
+
return (0);
}
diff --git a/sys/dev/acpi/acpitz.c b/sys/dev/acpi/acpitz.c
index 34358799eec..322ce2e4f51 100644
--- a/sys/dev/acpi/acpitz.c
+++ b/sys/dev/acpi/acpitz.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpitz.c,v 1.8 2006/11/02 04:58:20 marco Exp $ */
+/* $OpenBSD: acpitz.c,v 1.9 2006/11/29 22:17:07 marco Exp $ */
/*
* Copyright (c) 2006 Can Erkin Acar <canacar@openbsd.org>
* Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
@@ -21,7 +21,6 @@
#include <sys/signalvar.h>
#include <sys/systm.h>
#include <sys/device.h>
-#include <sys/rwlock.h>
#include <sys/malloc.h>
#include <machine/bus.h>
@@ -42,7 +41,6 @@ struct acpitz_softc {
struct acpi_softc *sc_acpi;
struct aml_node *sc_devnode;
- struct rwlock sc_lock;
int sc_tmp;
int sc_crt;
int sc_hot;
@@ -104,8 +102,6 @@ acpitz_attach(struct device *parent, struct device *self, void *aux)
sc->sc_acpi = (struct acpi_softc *)parent;
sc->sc_devnode = aa->aaa_node->child;
- rw_init(&sc->sc_lock, "acpitz");
-
memset(&res, 0, sizeof(res));
memset(&env, 0, sizeof(env));
@@ -144,9 +140,6 @@ acpitz_attach(struct device *parent, struct device *self, void *aux)
sensor_add(&sc->sc_sens);
sc->sc_sens.value = 0;
- if (sensor_task_register(sc, acpitz_refresh, 10))
- printf(", unable to register update task");
-
printf("\n");
}
@@ -302,11 +295,7 @@ acpitz_refresh(void *arg)
}
}
- rw_enter_write(&sc->sc_lock);
-
sc->sc_sens.value = sc->sc_tmp * 100000;
-
- rw_exit_write(&sc->sc_lock);
}
int
@@ -315,8 +304,6 @@ acpitz_getreading(struct acpitz_softc *sc, char *name)
struct aml_value res;
int rv = -1;
- rw_enter_write(&sc->sc_lock);
-
if (aml_evalname(sc->sc_acpi, sc->sc_devnode, name, 0, NULL, &res)) {
dnprintf(10, "%s: no %s\n", DEVNAME(sc), name);
goto out;
@@ -325,7 +312,7 @@ acpitz_getreading(struct acpitz_softc *sc, char *name)
rv = aml_val2int(&res);
out:
aml_freevalue(&res);
- rw_exit_write(&sc->sc_lock);
+
return (rv);
}
diff --git a/sys/dev/acpi/dsdt.c b/sys/dev/acpi/dsdt.c
index f461a681f58..feb26797a13 100644
--- a/sys/dev/acpi/dsdt.c
+++ b/sys/dev/acpi/dsdt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dsdt.c,v 1.66 2006/11/27 23:43:47 jordan Exp $ */
+/* $OpenBSD: dsdt.c,v 1.67 2006/11/29 22:17:07 marco Exp $ */
/*
* Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org>
*
@@ -420,6 +420,11 @@ acpi_stall(int us)
int
acpi_mutex_acquire(struct aml_value *val, int timeout)
{
+ /* XXX we currently do not have concurrency so assume mutex succeeds */
+ dnprintf(50, "acpi_mutex_acquire\n");
+
+ return (0);
+#if 0
struct acpi_mutex *mtx = val->v_mutex;
int rv = 0, ts, tries = 0;
@@ -449,11 +454,14 @@ acpi_mutex_acquire(struct aml_value *val, int timeout)
rw_exit_write(&mtx->amt_lock);
done:
return (rv);
+#endif
}
void
acpi_mutex_release(struct aml_value *val)
{
+ dnprintf(50, "acpi_mutex_release\n");
+#if 0
struct acpi_mutex *mtx = val->v_mutex;
/* sanity */
@@ -473,6 +481,7 @@ acpi_mutex_release(struct aml_value *val)
wakeup(mtx); /* wake all of them up */
done:
rw_exit_write(&mtx->amt_lock);
+#endif
}
/*
@@ -2220,6 +2229,7 @@ aml_parsenamed(struct aml_scope *scope, int opcode, struct aml_value *res)
_aml_setvalue(res, AML_OBJTYPE_EVENT, 0, NULL);
break;
case AMLOP_MUTEX:
+ /* XXX mutex is unused since we don't have concurrency */
_aml_setvalue(res, AML_OBJTYPE_MUTEX, 0, NULL);
res->v_mutex = (struct acpi_mutex *)acpi_os_malloc(
sizeof(struct acpi_mutex));
@@ -2664,7 +2674,6 @@ aml_parsemuxaction(struct aml_scope *scope, int opcode, struct aml_value *res)
/* Assert: tmparg is AML_OBJTYPE_MUTEX */
i1 = aml_parseint(scope, AMLOP_WORDPREFIX);
rv = acpi_mutex_acquire(tmparg->v_objref.ref, i1);
-
/* Return true if timed out */
aml_setvalue(scope, res, NULL, rv);
break;