3 * PROJECT: ReactOS ACPI bus driver
4 * FILE: acpi/ospm/acpienum.c
5 * PURPOSE: ACPI namespace enumerator
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * 01-05-2001 CSH Created
23 BM_DEVICE *device = NULL;
24 char *type_string = NULL;
30 device = &(node->device);
32 if (flags & BM_PRINT_PRESENT) {
33 if (!BM_DEVICE_PRESENT(device)) {
39 buffer.pointer = acpi_os_callocate(buffer.length);
40 if (!buffer.pointer) {
44 acpi_get_name(device->acpi_handle, ACPI_FULL_PATHNAME, &buffer);
46 switch(device->id.type) {
48 type_string = "System";
51 type_string = "Scope";
53 case BM_TYPE_PROCESSOR:
54 type_string = "Processor";
56 case BM_TYPE_THERMAL_ZONE:
57 type_string = "ThermalZone";
59 case BM_TYPE_POWER_RESOURCE:
60 type_string = "PowerResource";
62 case BM_TYPE_FIXED_BUTTON:
63 type_string = "Button";
66 type_string = "Device";
69 type_string = "Unknown";
73 if (!(flags & BM_PRINT_GROUP)) {
74 DbgPrint("+------------------------------------------------------------\n");
77 DbgPrint("%s[0x%02x] hid[%s] %s\n", type_string, device->handle, device->id.hid, buffer.pointer);
78 DbgPrint(" acpi_handle[0x%08x] flags[0x%02x] status[0x%02x]\n", device->acpi_handle, device->flags, device->status);
80 if (flags & BM_PRINT_IDENTIFICATION) {
81 DbgPrint(" identification: uid[%s] adr[0x%08x]\n", device->id.uid, device->id.adr);
84 if (flags & BM_PRINT_LINKAGE) {
85 DbgPrint(" linkage: this[%p] parent[%p] next[%p]\n", node, node->parent, node->next);
86 DbgPrint(" scope.head[%p] scope.tail[%p]\n", node->scope.head, node->scope.tail);
89 if (flags & BM_PRINT_POWER) {
90 DbgPrint(" power: state[D%d] flags[0x%08X]\n", device->power.state, device->power.flags);
91 DbgPrint(" S0[0x%02x] S1[0x%02x] S2[0x%02x]\n", device->power.dx_supported[0], device->power.dx_supported[1], device->power.dx_supported[2]);
92 DbgPrint(" S3[0x%02x] S4[0x%02x] S5[0x%02x]\n", device->power.dx_supported[3], device->power.dx_supported[4], device->power.dx_supported[5]);
95 if (!(flags & BM_PRINT_GROUP)) {
96 DbgPrint("+------------------------------------------------------------\n");
99 acpi_os_free(buffer.pointer);
106 ACPIEnumerateRootBusses(
107 PFDO_DEVICE_EXTENSION DeviceExtension)
109 BM_HANDLE_LIST HandleList;
110 PACPI_DEVICE AcpiDevice;
111 ACPI_STATUS AcpiStatus;
112 BM_HANDLE DeviceHandle;
113 BM_DEVICE_ID Criteria;
122 RtlZeroMemory(&Criteria, sizeof(BM_DEVICE_ID));
123 RtlMoveMemory(&Criteria.hid, PCI_ROOT_HID_STRING, sizeof(PCI_ROOT_HID_STRING));
125 AcpiStatus = bm_search(BM_HANDLE_ROOT, &Criteria, &HandleList);
127 if (ACPI_SUCCESS(AcpiStatus)) {
128 DPRINT("Got %d devices\n", HandleList.count);
130 for (i = 0; i < HandleList.count; i++) {
131 AcpiStatus = bm_get_node(HandleList.handles[i], 0, &Node);
132 if (ACPI_SUCCESS(AcpiStatus)) {
133 DPRINT("Got BM node information: (Node 0x%X)\n", Node);
134 bm_print1(Node, BM_PRINT_ALL - BM_PRINT_PRESENT);
136 for (j=0; j < 4*1000;j++)
137 KeStallExecutionProcessor(1000);
140 DPRINT("Could not get BM node\n");
143 AcpiDevice = (PACPI_DEVICE)ExAllocatePool(
144 NonPagedPool, sizeof(ACPI_DEVICE));
146 return STATUS_INSUFFICIENT_RESOURCES;
149 RtlZeroMemory(AcpiDevice, sizeof(ACPI_DEVICE));
151 AcpiDevice->Pdo = NULL;
152 AcpiDevice->BmHandle = HandleList.handles[i];
154 KeAcquireSpinLock(&DeviceExtension->DeviceListLock, &OldIrql);
155 InsertHeadList(&DeviceExtension->DeviceListHead,
156 &AcpiDevice->DeviceListEntry);
157 DeviceExtension->DeviceListCount++;
158 KeReleaseSpinLock(&DeviceExtension->DeviceListLock, OldIrql);
161 DPRINT("Got no devices (Status 0x%X)\n", AcpiStatus);
163 for (j=0; j < 4*10*1000;j++)
164 KeStallExecutionProcessor(1000);
166 return STATUS_SUCCESS;
171 ACPIEnumerateNamespace(
172 PFDO_DEVICE_EXTENSION DeviceExtension)
174 BM_HANDLE_LIST HandleList;
175 PACPI_DEVICE AcpiDevice;
176 ACPI_STATUS AcpiStatus;
177 BM_HANDLE DeviceHandle;
178 BM_DEVICE_ID Criteria;
185 RtlZeroMemory(&Criteria, sizeof(BM_DEVICE_ID));
187 DbgPrint("Listing ACPI namespace\n");
188 Criteria.type = BM_TYPE_ALL;
190 AcpiStatus = bm_search(BM_HANDLE_ROOT, &Criteria, &HandleList);
191 if (ACPI_SUCCESS(AcpiStatus)) {
192 DPRINT("Got %d devices\n", HandleList.count);
194 for (i = 0; i < HandleList.count; i++) {
195 AcpiStatus = bm_get_node(HandleList.handles[i], 0, &Node);
196 if (ACPI_SUCCESS(AcpiStatus)) {
197 DPRINT("Got BM node information: (Node 0x%X)\n", Node);
202 bm_print1(Node, BM_PRINT_ALL - BM_PRINT_PRESENT);
203 for (j=0; j < 4*1000;j++)
204 KeStallExecutionProcessor(1000);
208 DPRINT("Could not get BM node\n");
211 AcpiDevice = (PACPI_DEVICE)ExAllocatePool(
212 NonPagedPool, sizeof(ACPI_DEVICE));
214 return STATUS_INSUFFICIENT_RESOURCES;
217 RtlZeroMemory(AcpiDevice, sizeof(ACPI_DEVICE));
219 AcpiDevice->Pdo = NULL;
220 AcpiDevice->BmHandle = HandleList.handles[i];
222 KeAcquireSpinLock(&DeviceExtension->DeviceListLock, &OldIrql);
223 InsertHeadList(&DeviceExtension->DeviceListHead,
224 &AcpiDevice->DeviceListEntry);
225 DeviceExtension->DeviceListCount++;
226 KeReleaseSpinLock(&DeviceExtension->DeviceListLock, OldIrql);
229 DPRINT("Got no devices (Status 0x%X)\n", AcpiStatus);
232 return STATUS_SUCCESS;