Skip to content
Permalink
Browse files

aml_find_node: perform callback on matched direct-child nodes before

recursing into child devices looking for matches.

This ensures that when walking nodes with acpi_inidev, a method like
\_SB_.PCI0._INI will be executed before \_SB_.PCI0.I2C1.TPL1._INI.

This matches how ACPICA walks nodes and a commonly-used DSDT
template assumes that \OSYS has been initialized in \_SB_.PCI0._INI
before being used by other device _INI methods.

This should also help to execute \_INI and \_SB_._INI first, if
present, which ACPICA does explicitly.

Tested in snaps, ok deraadt
  • Loading branch information...
jcs committed Jul 31, 2019
1 parent becffb2 commit 72b62a385ef06e5e564effbed778867805aff390
Showing with 7 additions and 4 deletions.
  1. +7 −4 sys/dev/acpi/dsdt.c
@@ -1,4 +1,4 @@
/* $OpenBSD: dsdt.c,v 1.245 2019/07/31 15:47:49 jcs Exp $ */
/* $OpenBSD: dsdt.c,v 1.246 2019/07/31 15:58:00 jcs Exp $ */
/*
* Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org>
*
@@ -1263,19 +1263,22 @@ aml_find_node(struct aml_node *node, const char *name,
struct aml_node *child;
const char *nn;

/* match child of this node first before recursing */
SIMPLEQ_FOREACH(child, &node->son, sib) {
nn = child->name;
if (nn != NULL) {
if (*nn == AMLOP_ROOTCHAR) nn++;
while (*nn == AMLOP_PARENTPREFIX) nn++;
if (strcmp(name, nn) == 0) {
/* Only recurse if cbproc() wants us to */
if (cbproc(child, arg) == 0)
continue;
if (cbproc(child, arg) != 0)
return;
}
}
aml_find_node(child, name, cbproc, arg);
}

SIMPLEQ_FOREACH(child, &node->son, sib)
aml_find_node(child, name, cbproc, arg);
}

/*

0 comments on commit 72b62a3

Please sign in to comment.
You can’t perform that action at this time.