summaryrefslogtreecommitdiff
path: root/drivers/acpi/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/utils.c')
-rw-r--r--drivers/acpi/utils.c120
1 files changed, 8 insertions, 112 deletions
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c
index 0347a37eb438..552248b0005b 100644
--- a/drivers/acpi/utils.c
+++ b/drivers/acpi/utils.c
@@ -30,6 +30,8 @@
#include <linux/types.h>
#include <linux/hardirq.h>
#include <linux/acpi.h>
+#include <acpi/acpi_bus.h>
+#include <acpi/acpi_drivers.h>
#include "internal.h"
@@ -119,7 +121,7 @@ acpi_extract_package(union acpi_object *package,
break;
default:
printk(KERN_WARNING PREFIX "Invalid package element"
- " [%d]: got number, expecting"
+ " [%d]: got number, expecing"
" [%c]\n",
i, format_string[i]);
return AE_BAD_DATA;
@@ -146,7 +148,7 @@ acpi_extract_package(union acpi_object *package,
default:
printk(KERN_WARNING PREFIX "Invalid package element"
" [%d] got string/buffer,"
- " expecting [%c]\n",
+ " expecing [%c]\n",
i, format_string[i]);
return AE_BAD_DATA;
break;
@@ -167,20 +169,11 @@ acpi_extract_package(union acpi_object *package,
/*
* Validate output buffer.
*/
- if (buffer->length == ACPI_ALLOCATE_BUFFER) {
- buffer->pointer = ACPI_ALLOCATE(size_required);
- if (!buffer->pointer)
- return AE_NO_MEMORY;
+ if (buffer->length < size_required) {
buffer->length = size_required;
- memset(buffer->pointer, 0, size_required);
- } else {
- if (buffer->length < size_required) {
- buffer->length = size_required;
- return AE_BUFFER_OVERFLOW;
- } else if (buffer->length != size_required ||
- !buffer->pointer) {
- return AE_BAD_PARAMETER;
- }
+ return AE_BUFFER_OVERFLOW;
+ } else if (buffer->length != size_required || !buffer->pointer) {
+ return AE_BAD_PARAMETER;
}
head = buffer->pointer;
@@ -572,100 +565,3 @@ acpi_status acpi_evaluate_lck(acpi_handle handle, int lock)
return status;
}
-
-/**
- * acpi_evaluate_dsm - evaluate device's _DSM method
- * @handle: ACPI device handle
- * @uuid: UUID of requested functions, should be 16 bytes
- * @rev: revision number of requested function
- * @func: requested function number
- * @argv4: the function specific parameter
- *
- * Evaluate device's _DSM method with specified UUID, revision id and
- * function number. Caller needs to free the returned object.
- *
- * Though ACPI defines the fourth parameter for _DSM should be a package,
- * some old BIOSes do expect a buffer or an integer etc.
- */
-union acpi_object *
-acpi_evaluate_dsm(acpi_handle handle, const u8 *uuid, int rev, int func,
- union acpi_object *argv4)
-{
- acpi_status ret;
- struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL};
- union acpi_object params[4];
- struct acpi_object_list input = {
- .count = 4,
- .pointer = params,
- };
-
- params[0].type = ACPI_TYPE_BUFFER;
- params[0].buffer.length = 16;
- params[0].buffer.pointer = (char *)uuid;
- params[1].type = ACPI_TYPE_INTEGER;
- params[1].integer.value = rev;
- params[2].type = ACPI_TYPE_INTEGER;
- params[2].integer.value = func;
- if (argv4) {
- params[3] = *argv4;
- } else {
- params[3].type = ACPI_TYPE_PACKAGE;
- params[3].package.count = 0;
- params[3].package.elements = NULL;
- }
-
- ret = acpi_evaluate_object(handle, "_DSM", &input, &buf);
- if (ACPI_SUCCESS(ret))
- return (union acpi_object *)buf.pointer;
-
- if (ret != AE_NOT_FOUND)
- acpi_handle_warn(handle,
- "failed to evaluate _DSM (0x%x)\n", ret);
-
- return NULL;
-}
-EXPORT_SYMBOL(acpi_evaluate_dsm);
-
-/**
- * acpi_check_dsm - check if _DSM method supports requested functions.
- * @handle: ACPI device handle
- * @uuid: UUID of requested functions, should be 16 bytes at least
- * @rev: revision number of requested functions
- * @funcs: bitmap of requested functions
- * @exclude: excluding special value, used to support i915 and nouveau
- *
- * Evaluate device's _DSM method to check whether it supports requested
- * functions. Currently only support 64 functions at maximum, should be
- * enough for now.
- */
-bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs)
-{
- int i;
- u64 mask = 0;
- union acpi_object *obj;
-
- if (funcs == 0)
- return false;
-
- obj = acpi_evaluate_dsm(handle, uuid, rev, 0, NULL);
- if (!obj)
- return false;
-
- /* For compatibility, old BIOSes may return an integer */
- if (obj->type == ACPI_TYPE_INTEGER)
- mask = obj->integer.value;
- else if (obj->type == ACPI_TYPE_BUFFER)
- for (i = 0; i < obj->buffer.length && i < 8; i++)
- mask |= (((u8)obj->buffer.pointer[i]) << (i * 8));
- ACPI_FREE(obj);
-
- /*
- * Bit 0 indicates whether there's support for any functions other than
- * function 0 for the specified UUID and revision.
- */
- if ((mask & 0x1) && (mask & funcs) == funcs)
- return true;
-
- return false;
-}
-EXPORT_SYMBOL(acpi_check_dsm);