This diff creates a common aml_dereference function, please test on as many
systems as possible and send dmesg
Index: acpiprt.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpiprt.c,v
retrieving revision 1.43
diff -u -p -b -r1.43 acpiprt.c
--- acpiprt.c 3 Aug 2010 22:54:12 -0000 1.43
+++ acpiprt.c 22 Apr 2011 18:28:57 -0000
@@ -237,25 +237,10 @@ acpiprt_prt_add(struct acpiprt_softc *sc
return;
}
- pp = v->v_package[2];
- if (pp->type == AML_OBJTYPE_STRING) {
- node = aml_searchrel(sc->sc_devnode, pp->v_string);
- if (node == NULL) {
+ pp = aml_dereference(sc->sc_devnode, v->v_package[2]);
+ if (pp == NULL) {
printf("Invalid device\n");
return;
- }
- pp = node->value;
- }
- if (pp->type == AML_OBJTYPE_NAMEREF) {
- node = aml_searchrel(sc->sc_devnode, pp->v_nameref);
- if (node == NULL) {
- printf("Invalid device\n");
- return;
- }
- pp = node->value;
- }
- if (pp->type == AML_OBJTYPE_OBJREF) {
- pp = pp->v_objref.ref;
}
if (pp->type == AML_OBJTYPE_DEVICE) {
node = pp->node;
Index: acpitz.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpitz.c,v
retrieving revision 1.42
diff -u -p -b -r1.42 acpitz.c
--- acpitz.c 7 Apr 2011 20:16:19 -0000 1.42
+++ acpitz.c 22 Apr 2011 18:28:57 -0000
@@ -239,7 +239,6 @@ acpitz_attach(struct device *parent, str
int
acpitz_setfan(struct acpitz_softc *sc, int i, char *method)
{
- struct aml_node *node;
struct aml_value res1, *ref;
char name[8];
int rv = 1, x, y;
@@ -267,20 +266,12 @@ acpitz_setfan(struct acpitz_softc *sc, i
continue;
}
for (y = 0; y < res1.length; y++) {
- ref = res1.v_package[y];
- if (ref->type == AML_OBJTYPE_STRING) {
- node = aml_searchrel(sc->sc_devnode,
- ref->v_string);
- if (node == NULL) {
+ ref = aml_dereference(sc->sc_devnode,
res1.v_package[y]);
+ if (ref == NULL) {
printf("%s: %s[%d.%d] _PRO"
" not a valid device\n",
DEVNAME(sc), name, x, y);
continue;
- }
- ref = node->value;
- }
- if (ref->type == AML_OBJTYPE_OBJREF) {
- ref = ref->v_objref.ref;
}
if (ref->type != AML_OBJTYPE_DEVICE &&
ref->type != AML_OBJTYPE_POWERRSRC) {
Index: dsdt.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/dsdt.c,v
retrieving revision 1.185
diff -u -p -b -r1.185 dsdt.c
--- dsdt.c 22 Apr 2011 18:22:01 -0000 1.185
+++ dsdt.c 22 Apr 2011 18:28:59 -0000
@@ -1810,6 +1810,27 @@ aml_findscope(struct aml_scope *scope, i
}
struct aml_value *
+aml_dereference(struct aml_node *node, struct aml_value *val)
+{
+ printf("deref: %s %x\n", aml_nodename(node), val->type);
+ if (val->type == AML_OBJTYPE_STRING) {
+ node = aml_searchrel(node, val->v_string);
+ if (node == NULL)
+ return NULL;
+ val = node->value;
+ }
+ if (val->type == AML_OBJTYPE_NAMEREF) {
+ node = aml_searchrel(node, val->v_string);
+ if (node == NULL)
+ return NULL;
+ val = node->value;
+ }
+ while (val->type == AML_OBJTYPE_OBJREF)
+ val = val->v_objref.ref;
+ return val;
+}
+
+struct aml_value *
aml_getstack(struct aml_scope *scope, int opcode)
{
struct aml_value *sp;
Index: dsdt.h
===================================================================
RCS file: /cvs/src/sys/dev/acpi/dsdt.h,v
retrieving revision 1.58
diff -u -p -b -r1.58 dsdt.h
--- dsdt.h 18 Apr 2011 00:40:26 -0000 1.58
+++ dsdt.h 22 Apr 2011 18:28:59 -0000
@@ -46,6 +46,7 @@ int64_t aml_val2int(struct aml_value *
struct aml_node *aml_searchname(struct aml_node *, const void
*);
struct aml_node *aml_searchrel(struct aml_node *, const void *);
+struct aml_value *aml_dereference(struct aml_node *, struct aml_value *);
struct aml_value *aml_getstack(struct aml_scope *, int);
struct aml_value *aml_allocvalue(int, int64_t, const void *);
void aml_freevalue(struct aml_value *);