ACPI package: Factor out acpi_PkgRawGas()
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 7 Jul 2009 01:41:04 +0000 (09:41 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 8 Jul 2009 10:50:45 +0000 (18:50 +0800)
It saves the ACPI_GENERIC_ADDRESS in the specified memory location.

sys/dev/acpica5/acpi_package.c
sys/dev/acpica5/acpivar.h

index 310dba7..1b12384 100644 (file)
@@ -104,16 +104,12 @@ acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *rid,
        struct resource **dst, u_int flags)
 {
     ACPI_GENERIC_ADDRESS gas;
-    ACPI_OBJECT                *obj;
+    int error;
 
-    obj = &res->Package.Elements[idx];
-    if (obj == NULL || obj->Type != ACPI_TYPE_BUFFER ||
-       obj->Buffer.Length < sizeof(ACPI_GENERIC_ADDRESS) + 3) {
+    error = acpi_PkgRawGas(res, idx, &gas);
+    if (error)
+       return (error);
 
-       return (EINVAL);
-    }
-
-    memcpy(&gas, obj->Buffer.Pointer + 3, sizeof(gas));
     *dst = acpi_bus_alloc_gas(dev, rid, &gas, flags);
     if (*dst == NULL)
        return (ENXIO);
@@ -121,6 +117,20 @@ acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *rid,
     return (0);
 }
 
+int
+acpi_PkgRawGas(ACPI_OBJECT *res, int idx, ACPI_GENERIC_ADDRESS *gas)
+{
+    ACPI_OBJECT                *obj;
+
+    obj = &res->Package.Elements[idx];
+    if (obj == NULL || obj->Type != ACPI_TYPE_BUFFER ||
+       obj->Buffer.Length < sizeof(ACPI_GENERIC_ADDRESS) + 3)
+       return (EINVAL);
+
+    memcpy(gas, obj->Buffer.Pointer + 3, sizeof(*gas));
+    return (0);
+}
+
 ACPI_HANDLE
 acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj)
 {
index 422a55f..caba74c 100644 (file)
@@ -372,6 +372,8 @@ int         acpi_PkgInt32(ACPI_OBJECT *res, int idx, uint32_t *dst);
 int            acpi_PkgStr(ACPI_OBJECT *res, int idx, void *dst, size_t size);
 int            acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *rid,
                            struct resource **dst, u_int flags);
+int            acpi_PkgRawGas(ACPI_OBJECT *res, int idx,
+                              ACPI_GENERIC_ADDRESS *gas);
 ACPI_HANDLE    acpi_GetReference(ACPI_HANDLE scope, ACPI_OBJECT *obj);
 
 /* ACPI task kernel thread initialization. */