platform/chrome: chromeos_acpi: print hex string for ACPI_TYPE_BUFFER
authorTzung-Bi Shih <tzungbi@kernel.org>
Thu, 3 Aug 2023 01:12:45 +0000 (09:12 +0800)
committerTzung-Bi Shih <tzungbi@kernel.org>
Thu, 10 Aug 2023 03:10:56 +0000 (11:10 +0800)
`element->buffer.pointer` should be binary blob.  `%s` doesn't work
perfect for them.

Print hex string for ACPI_TYPE_BUFFER.  Also update the documentation
to reflect this.

Fixes: 0a4cad9c11ad ("platform/chrome: Add ChromeOS ACPI device driver")
Cc: stable@vger.kernel.org
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20230803011245.3773756-1-tzungbi@kernel.org
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
Documentation/ABI/testing/sysfs-driver-chromeos-acpi
drivers/platform/chrome/chromeos_acpi.c

index 22082f9a7922bac092ce3244670831b9713ce55b..d46b1c85840d77df37f44747424312131a6707c8 100644 (file)
@@ -149,4 +149,4 @@ KernelVersion:      5.19
 Description:
                Returns the verified boot data block shared between the
                firmware verification step and the kernel verification step
-               (binary).
+               (hex dump).
index 1cc01d893adabb4499563dc56ff4f4684b608940..e6e6dcfc74d1d1bc3fb438ae0cb9593b9f86332f 100644 (file)
@@ -90,7 +90,36 @@ static int chromeos_acpi_handle_package(struct device *dev, union acpi_object *o
        case ACPI_TYPE_STRING:
                return sysfs_emit(buf, "%s\n", element->string.pointer);
        case ACPI_TYPE_BUFFER:
-               return sysfs_emit(buf, "%s\n", element->buffer.pointer);
+               {
+                       int i, r, at, room_left;
+                       const int byte_per_line = 16;
+
+                       at = 0;
+                       room_left = PAGE_SIZE - 1;
+                       for (i = 0; i < element->buffer.length && room_left; i += byte_per_line) {
+                               r = hex_dump_to_buffer(element->buffer.pointer + i,
+                                                      element->buffer.length - i,
+                                                      byte_per_line, 1, buf + at, room_left,
+                                                      false);
+                               if (r > room_left)
+                                       goto truncating;
+                               at += r;
+                               room_left -= r;
+
+                               r = sysfs_emit_at(buf, at, "\n");
+                               if (!r)
+                                       goto truncating;
+                               at += r;
+                               room_left -= r;
+                       }
+
+                       buf[at] = 0;
+                       return at;
+truncating:
+                       dev_info_once(dev, "truncating sysfs content for %s\n", name);
+                       sysfs_emit_at(buf, PAGE_SIZE - 4, "..\n");
+                       return PAGE_SIZE - 1;
+               }
        default:
                dev_err(dev, "element type %d not supported\n", element->type);
                return -EINVAL;