コード例 #1
0
ファイル: bmutils.c プロジェクト: TitaniumBoy/lin
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);
}
コード例 #2
0
ファイル: ecmain.c プロジェクト: TitaniumBoy/lin
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);
}
コード例 #3
0
ファイル: pr.c プロジェクト: TKr/Wive-ng-rt8186
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);
}
コード例 #4
0
ファイル: bmutils.c プロジェクト: TitaniumBoy/lin
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);
}