acpi_status bm_get_node ( BM_HANDLE device_handle, acpi_handle acpi_handle, BM_NODE **node) { acpi_status status = AE_OK; FUNCTION_TRACE("bm_get_node"); if (!node) { return_ACPI_STATUS(AE_BAD_PARAMETER); } /* busmgr failed to init, but we're being called by subordinate drivers */ if (node_list.count < 1) { return_ACPI_STATUS(AE_NOT_FOUND); } /* * If no device handle, resolve acpi handle to device handle. */ if (!device_handle && acpi_handle) { status = bm_get_handle(acpi_handle, &device_handle); if (ACPI_FAILURE(status)) return_ACPI_STATUS(status); } /* * Valid device handle? */ if (device_handle > BM_HANDLES_MAX) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid node handle [%02x] detected.\n", device_handle)); return_ACPI_STATUS(AE_ERROR); } *node = node_list.nodes[device_handle]; /* * Valid node? */ if (!(*node)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid (NULL) node entry [%02x] detected.\n", device_handle)); return_ACPI_STATUS(AE_NULL_ENTRY); } return_ACPI_STATUS(AE_OK); }
acpi_status bm_evaluate_reference_list ( acpi_handle handle, acpi_string pathname, BM_HANDLE_LIST *reference_list) { acpi_status status = AE_OK; acpi_object *package = NULL; acpi_object *element = NULL; acpi_handle reference_handle = NULL; acpi_buffer buffer; u32 i = 0; FUNCTION_TRACE("bm_evaluate_reference_list"); if (!reference_list) { return_ACPI_STATUS(AE_BAD_PARAMETER); } MEMSET(&buffer, 0, sizeof(acpi_buffer)); /* * Evaluate Object: * ---------------- */ status = bm_evaluate_object(handle, pathname, NULL, &buffer); if (ACPI_FAILURE(status)) { goto end; } /* * Validate Package: * ----------------- */ status = bm_cast_buffer(&buffer, (void**)&package, sizeof(acpi_object)); if (ACPI_FAILURE(status)) { DEBUG_EVAL_ERROR(ACPI_LV_WARN, handle, pathname, status); goto end; } if (package->type != ACPI_TYPE_PACKAGE) { status = AE_BAD_DATA; DEBUG_EVAL_ERROR(ACPI_LV_WARN, handle, pathname, status); goto end; } if (package->package.count > BM_HANDLES_MAX) { package->package.count = BM_HANDLES_MAX; } /* * Parse Package Data: * ------------------- */ for (i = 0; i < package->package.count; i++) { element = &(package->package.elements[i]); if (!element || (element->type != ACPI_TYPE_STRING)) { status = AE_BAD_DATA; ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid element in package (not a device reference).\n")); DEBUG_EVAL_ERROR (ACPI_LV_WARN, handle, pathname, status); break; } /* * Resolve reference string (e.g. "\_PR_.CPU_") to an * acpi_handle. */ status = acpi_get_handle(handle, element->string.pointer, &reference_handle); if (ACPI_FAILURE(status)) { status = AE_BAD_DATA; ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Unable to resolve device reference [%s].\n", element->string.pointer)); DEBUG_EVAL_ERROR (ACPI_LV_WARN, handle, pathname, status); break; } /* * Resolve acpi_handle to BM_HANDLE. */ status = bm_get_handle(reference_handle, &(reference_list->handles[i])); if (ACPI_FAILURE(status)) { status = AE_BAD_DATA; ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Unable to resolve device reference for [%p].\n", reference_handle)); DEBUG_EVAL_ERROR (ACPI_LV_WARN, handle, pathname, status); break; } ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resolved reference [%s]->[%p]->[%02x]\n", element->string.pointer, reference_handle, reference_list->handles[i])); (reference_list->count)++; } end: acpi_os_free(buffer.pointer); return_ACPI_STATUS(status); }