diff options
-rw-r--r-- | sys/dev/acpica/acpi.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c index 0342ab8..ac33447 100644 --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -125,6 +125,7 @@ static int acpi_isa_get_compatid(device_t dev, uint32_t *cids, int count); static int acpi_isa_pnp_probe(device_t bus, device_t child, struct isa_pnp_id *ids); static void acpi_probe_children(device_t bus); +static int acpi_probe_order(ACPI_HANDLE handle, int *order); static ACPI_STATUS acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status); static void acpi_shutdown_pre_sync(void *arg, int howto); @@ -1152,25 +1153,31 @@ acpi_probe_children(device_t bus) return_VOID; } +/* + * Determine the probe order for a given device and return non-zero if it + * should be attached immediately. + */ static int -acpi_probe_order(ACPI_HANDLE handle, int level, int *order) +acpi_probe_order(ACPI_HANDLE handle, int *order) { int ret; + /* + * 1. I/O port and memory system resource holders + * 2. Embedded controllers (to handle early accesses) + */ ret = 0; - /* IO port and memory system resource holders are first. */ if (acpi_MatchHid(handle, "PNP0C01") || acpi_MatchHid(handle, "PNP0C02")) { *order = 1; ret = 1; - } - - /* The embedded controller is needed to handle accesses early. */ - if (acpi_MatchHid(handle, "PNP0C09")) { + } else if (acpi_MatchHid(handle, "PNP0C09")) { *order = 2; ret = 1; } - *order = (level + 1) * 10; + /* Always probe/attach immediately if we're debugging. */ + ACPI_DEBUG_EXEC(ret = 1); + return (ret); } @@ -1203,11 +1210,14 @@ acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status) /* * Create a placeholder device for this node. Sort the placeholder - * so that the probe/attach passes will run breadth-first. + * so that the probe/attach passes will run breadth-first. Orders + * less than 10 are reserved for special objects (i.e., system + * resources). Larger values are used for all other devices. */ ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "scanning '%s'\n", acpi_name(handle))); - probe_now = acpi_probe_order(handle, level, &order); + order = (level + 1) * 10; + probe_now = acpi_probe_order(handle, &order); child = BUS_ADD_CHILD(bus, order, NULL, -1); if (child == NULL) break; |