]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ACPI: property: Read buffer properties as integers
authorSakari Ailus <sakari.ailus@linux.intel.com>
Mon, 11 Jul 2022 11:26:06 +0000 (14:26 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 27 Jul 2022 19:16:32 +0000 (21:16 +0200)
Instead of adding a new property type, read buffer properties as integers.
Even though the internal representation in ACPI is different, the data
type is the same (byte) than on 8-bit integers.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/property.c

index 7e3d163a6b1f91b4ea6de16984ec57a5c7b92d1e..d26f630f2a7c21dba582c9fc015338eb49647414 100644 (file)
@@ -1033,6 +1033,10 @@ static int acpi_data_prop_read_single(const struct acpi_device_data *data,
                int ret = 0;                                            \
                                                                        \
                for (i = 0; i < __nval; i++) {                          \
+                       if (__items->type == ACPI_TYPE_BUFFER) {        \
+                               __val[i] = __items->buffer.pointer[i];  \
+                               continue;                               \
+                       }                                               \
                        if (__items[i].type != ACPI_TYPE_INTEGER) {     \
                                ret = -EPROTO;                          \
                                break;                                  \
@@ -1092,18 +1096,41 @@ static int acpi_data_prop_read(const struct acpi_device_data *data,
        }
 
        ret = acpi_data_get_property_array(data, propname, ACPI_TYPE_ANY, &obj);
+       if (ret && proptype >= DEV_PROP_U8 && proptype <= DEV_PROP_U64)
+               ret = acpi_data_get_property(data, propname, ACPI_TYPE_BUFFER,
+                                            &obj);
        if (ret)
                return ret;
 
-       if (!val)
+       if (!val) {
+               if (obj->type == ACPI_TYPE_BUFFER)
+                       return obj->buffer.length;
+
                return obj->package.count;
+       }
 
-       if (proptype != DEV_PROP_STRING && nval > obj->package.count)
-               return -EOVERFLOW;
+       switch (proptype) {
+       case DEV_PROP_STRING:
+               break;
+       case DEV_PROP_U8 ... DEV_PROP_U64:
+               if (obj->type == ACPI_TYPE_BUFFER) {
+                       if (nval > obj->buffer.length)
+                               return -EOVERFLOW;
+                       break;
+               }
+               fallthrough;
+       default:
+               if (nval > obj->package.count)
+                       return -EOVERFLOW;
+               break;
+       }
        if (nval == 0)
                return -EINVAL;
 
-       items = obj->package.elements;
+       if (obj->type != ACPI_TYPE_BUFFER)
+               items = obj->package.elements;
+       else
+               items = obj;
 
        switch (proptype) {
        case DEV_PROP_U8: