ACPI 3.0 includes UUID-labelled vendor-defined resources (section 6.4.3.2),
so move the code that supports this from arch/ia64 into ACPI proper.
When the code was under arch/ia64, we used EFI GUID stuff, but this time I
defined acpi_uuid equivalents to avoid the need to depend on EFI.
Len, Tony, this touches both acpi and ia64. Let me know if this is
a problem.
This patch may be used under either the GPL or the BSD license.
Signed-off-by: Bjorn Helgaas <[EMAIL PROTECTED]>
===== arch/ia64/kernel/acpi-ext.c 1.5 vs edited =====
--- 1.5/arch/ia64/kernel/acpi-ext.c 2004-10-05 12:19:50 -06:00
+++ edited/arch/ia64/kernel/acpi-ext.c 2005-03-18 11:29:18 -07:00
@@ -12,89 +12,35 @@
#include <linux/module.h>
#include <linux/types.h>
#include <linux/acpi.h>
-#include <linux/efi.h>
#include <asm/acpi-ext.h>
-struct acpi_vendor_descriptor {
- u8 guid_id;
- efi_guid_t guid;
-};
-
-struct acpi_vendor_info {
- struct acpi_vendor_descriptor *descriptor;
- u8 *data;
- u32 length;
-};
-
-acpi_status
-acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
-{
- struct acpi_vendor_info *info = (struct acpi_vendor_info *) context;
- struct acpi_resource_vendor *vendor;
- struct acpi_vendor_descriptor *descriptor;
- u32 length;
-
- if (resource->id != ACPI_RSTYPE_VENDOR)
- return AE_OK;
-
- vendor = (struct acpi_resource_vendor *) &resource->data;
- descriptor = (struct acpi_vendor_descriptor *) vendor->reserved;
- if (vendor->length <= sizeof(*info->descriptor) ||
- descriptor->guid_id != info->descriptor->guid_id ||
- efi_guidcmp(descriptor->guid, info->descriptor->guid))
- return AE_OK;
-
- length = vendor->length - sizeof(struct acpi_vendor_descriptor);
- info->data = acpi_os_allocate(length);
- if (!info->data)
- return AE_NO_MEMORY;
-
- memcpy(info->data, vendor->reserved + sizeof(struct
acpi_vendor_descriptor), length);
- info->length = length;
- return AE_CTRL_TERMINATE;
-}
-
-acpi_status
-acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor *id,
- u8 **data, u32 *length)
-{
- struct acpi_vendor_info info;
-
- info.descriptor = id;
- info.data = NULL;
-
- acpi_walk_resources(obj, METHOD_NAME__CRS, acpi_vendor_resource_match,
&info);
- if (!info.data)
- return AE_NOT_FOUND;
-
- *data = info.data;
- *length = info.length;
- return AE_OK;
-}
-
struct acpi_vendor_descriptor hp_ccsr_descriptor = {
- .guid_id = 2,
- .guid = EFI_GUID(0x69e9adf9, 0x924f, 0xab5f, 0xf6, 0x4a, 0x24, 0xd2,
0x01, 0x37, 0x0e, 0xad)
+ .uuid_subtype = 2,
+ .uuid = ACPI_UUID(0x69e9adf9, 0x924f, 0xab5f, 0xf6, 0x4a, 0x24,
0xd2, 0x01, 0x37, 0x0e, 0xad)
};
acpi_status
hp_acpi_csr_space(acpi_handle obj, u64 *csr_base, u64 *csr_length)
{
- acpi_status status;
- u8 *data;
+ acpi_status status = AE_OK;
+ u8 *data = NULL;
u32 length;
- status = acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data,
&length);
+ status = acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data,
+ &length);
- if (ACPI_FAILURE(status) || length != 16)
- return AE_NOT_FOUND;
+ if (ACPI_FAILURE(status) || length != 16) {
+ status = AE_NOT_FOUND;
+ goto out;
+ }
memcpy(csr_base, data, sizeof(*csr_base));
memcpy(csr_length, data + 8, sizeof(*csr_length));
- acpi_os_free(data);
- return AE_OK;
+out:
+ acpi_os_free(data);
+ return status;
}
EXPORT_SYMBOL(hp_acpi_csr_space);
===== drivers/acpi/resources/rsxface.c 1.22 vs edited =====
--- 1.22/drivers/acpi/resources/rsxface.c 2005-01-20 22:17:54 -07:00
+++ edited/drivers/acpi/resources/rsxface.c 2005-03-18 12:24:34 -07:00
@@ -435,3 +435,90 @@
}
EXPORT_SYMBOL(acpi_resource_to_address64);
+static inline int
+acpi_uuidcmp (struct acpi_uuid left, struct acpi_uuid right)
+{
+ return memcmp(&left, &right, sizeof(left));
+}
+
+static acpi_status
+acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
+{
+ struct acpi_vendor_info *info = (struct acpi_vendor_info *) context;
+ struct acpi_resource_vendor *vendor;
+ struct acpi_vendor_descriptor *descriptor;
+ u32 length;
+
+ if (resource->id != ACPI_RSTYPE_VENDOR)
+ return AE_OK;
+
+ vendor = (struct acpi_resource_vendor *) &resource->data;
+ descriptor = (struct acpi_vendor_descriptor *) vendor->reserved;
+ if (vendor->length <= sizeof(*info->descriptor) ||
+ descriptor->uuid_subtype != info->descriptor->uuid_subtype ||
+ acpi_uuidcmp(descriptor->uuid, info->descriptor->uuid))
+ return AE_OK;
+
+ length = vendor->length - sizeof(struct acpi_vendor_descriptor);
+ info->data = acpi_os_allocate(length);
+ if (!info->data)
+ return AE_NO_MEMORY;
+
+ memcpy(info->data, vendor->reserved + sizeof(struct
acpi_vendor_descriptor), length);
+ info->length = length;
+ return AE_CTRL_TERMINATE;
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_find_vendor_resource
+ *
+ * PARAMETERS: device_handle - a handle to the device object for the
+ * device we are querying
+ * id - a pointer to the acpi_vendor_descriptor
+ * for the UUID-identified vendor-defined
+ * resource we want
+ * data - a pointer to a pointer where the address
+ * of the vendor data will be stored
+ * length - a pointer to an integer where the length
+ * of the vendor data will be stored
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function walks the current resources for the specified
+ * device and looks for a vendor-defined resource that matches
+ * the supplied UUID and subtype.
+ *
+ * If the desired resource is found, a buffer is allocated for
+ * the vendor-defined data (excluding the UUID and other headers),
+ * and the address and size of the buffer are returned in *data
+ * and *length. The caller is responsible for deallocating
+ * the buffer with acpi_os_free().
+ *
+ * If the function fails, AE_NOT_FOUND will be returned and
+ * the values of *data and *length are unchanged.
+ *
+
******************************************************************************/
+
+acpi_status
+acpi_find_vendor_resource(
+ acpi_handle device_handle,
+ struct acpi_vendor_descriptor *id,
+ u8 **data,
+ u32 *length)
+{
+ struct acpi_vendor_info info;
+
+ info.descriptor = id;
+ info.data = NULL;
+
+ acpi_walk_resources(device_handle, METHOD_NAME__CRS,
+ acpi_vendor_resource_match, &info);
+ if (!info.data)
+ return AE_NOT_FOUND;
+
+ *data = info.data;
+ *length = info.length;
+ return AE_OK;
+}
+EXPORT_SYMBOL(acpi_find_vendor_resource);
===== include/acpi/acpixf.h 1.31 vs edited =====
--- 1.31/include/acpi/acpixf.h 2005-01-20 22:17:55 -07:00
+++ edited/include/acpi/acpixf.h 2005-03-18 12:09:12 -07:00
@@ -425,10 +425,10 @@
acpi_status
acpi_walk_resources (
- acpi_handle device_handle,
- char *path,
+ acpi_handle device_handle,
+ char *path,
ACPI_WALK_RESOURCE_CALLBACK user_function,
- void *context);
+ void *context);
acpi_status
acpi_set_current_resources (
@@ -443,7 +443,14 @@
acpi_status
acpi_resource_to_address64 (
struct acpi_resource *resource,
- struct acpi_resource_address64 *out);
+ struct acpi_resource_address64 *out);
+
+acpi_status
+acpi_find_vendor_resource (
+ acpi_handle device_handle,
+ struct acpi_vendor_descriptor *id,
+ u8 **data,
+ u32 *length);
/*
* Hardware (ACPI device) interfaces
===== include/acpi/actypes.h 1.41 vs edited =====
--- 1.41/include/acpi/actypes.h 2005-01-20 22:17:55 -07:00
+++ edited/include/acpi/actypes.h 2005-03-18 11:23:21 -07:00
@@ -1045,6 +1045,16 @@
#define ACPI_PRODUCER (u8) 0x00
#define ACPI_CONSUMER (u8) 0x01
+struct acpi_uuid {
+ u8 b[16];
+};
+
+#define ACPI_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
+((struct acpi_uuid) \
+{{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
+ (b) & 0xff, ((b) >> 8) & 0xff, \
+ (c) & 0xff, ((c) >> 8) & 0xff, \
+ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }})
/*
* Structures used to describe device resources
@@ -1097,6 +1107,18 @@
{
u32 length;
u8 reserved[1];
+};
+
+struct acpi_vendor_descriptor
+{
+ u8 uuid_subtype;
+ struct acpi_uuid uuid;
+};
+
+struct acpi_vendor_info {
+ struct acpi_vendor_descriptor *descriptor;
+ u8 *data;
+ u32 length;
};
struct acpi_resource_end_tag
-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html