acpi_status bm_evaluate_simple_integer ( acpi_handle handle, acpi_string pathname, u32 *data) { acpi_status status = AE_OK; acpi_object *element = NULL; acpi_buffer buffer; FUNCTION_TRACE("bm_evaluate_simple_integer"); if (!data) { 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)) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "failed to evaluate object (%s)\n", acpi_format_exception(status))); goto end; } /* * Validate Data: * -------------- */ status = bm_cast_buffer(&buffer, (void**)&element, sizeof(acpi_object)); if (ACPI_FAILURE(status)) { DEBUG_EVAL_ERROR(ACPI_LV_WARN, handle, pathname, status); goto end; } if (element->type != ACPI_TYPE_INTEGER) { status = AE_BAD_DATA; DEBUG_EVAL_ERROR(ACPI_LV_WARN, handle, pathname, status); goto end; } *data = element->integer.value; end: acpi_os_free(buffer.pointer); return_ACPI_STATUS(status); }
acpi_status ec_request ( BM_REQUEST *request, void *context) { acpi_status status = AE_OK; EC_REQUEST *ec_request = NULL; EC_CONTEXT *ec = NULL; FUNCTION_TRACE("ec_request"); /* * Must have a valid request structure and context. */ if (!request || !context) return_ACPI_STATUS(AE_BAD_PARAMETER); /* * buffer must contain a valid EC_REQUEST structure. */ status = bm_cast_buffer(&(request->buffer), (void**)&ec_request, sizeof(EC_REQUEST)); if (ACPI_FAILURE(status)) return_ACPI_STATUS(status); /* * context contains information specific to this EC. */ ec = (EC_CONTEXT*)context; /* * Perform the Transaction. */ status = ec_transaction(ec, ec_request); return_ACPI_STATUS(status); }
acpi_status pr_request ( BM_REQUEST *request, void *context) { acpi_status status = AE_OK; PR_CONTEXT *processor = NULL; FUNCTION_TRACE("pr_request"); /* * Must have a valid request structure and context. */ if (!request || !context) { return_ACPI_STATUS(AE_BAD_PARAMETER); } processor = (PR_CONTEXT*)context; /* * Handle request: * --------------- */ switch (request->command) { case PR_COMMAND_GET_POWER_INFO: status = bm_copy_to_buffer(&(request->buffer), &(processor->power), sizeof(PR_POWER)); break; case PR_COMMAND_SET_POWER_INFO: { PR_POWER *power_info = NULL; u32 i = 0; status = bm_cast_buffer(&(request->buffer), (void**)&power_info, sizeof(PR_POWER)); if (ACPI_SUCCESS(status)) { for (i=0; i<processor->power.state_count; i++) { MEMCPY(&(processor->power.state[i].promotion), &(power_info->state[i].promotion), sizeof(PR_CX_POLICY_VALUES)); MEMCPY(&(processor->power.state[i].demotion), &(power_info->state[i].demotion), sizeof(PR_CX_POLICY_VALUES)); } } } break; case PR_COMMAND_GET_PERF_INFO: status = bm_copy_to_buffer(&(request->buffer), &(processor->performance), sizeof(PR_PERFORMANCE)); break; case PR_COMMAND_GET_PERF_STATE: status = bm_copy_to_buffer(&(request->buffer), &(processor->performance.active_state), sizeof(u32)); break; case PR_COMMAND_SET_PERF_LIMIT: { u32 *limit = NULL; status = bm_cast_buffer(&(request->buffer), (void**)&limit, sizeof(u32)); if (ACPI_SUCCESS(status)) { status = pr_perf_set_limit(processor, *limit); } } break; default: status = AE_SUPPORT; break; } request->status = status; return_ACPI_STATUS(status); }
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); }