Merge tag 'acpi-5.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / drivers / acpi / sysfs.c
index a4b638b..cc2fe06 100644 (file)
@@ -415,19 +415,30 @@ static ssize_t acpi_data_show(struct file *filp, struct kobject *kobj,
                              loff_t offset, size_t count)
 {
        struct acpi_data_attr *data_attr;
-       void *base;
-       ssize_t rc;
+       void __iomem *base;
+       ssize_t size;
 
        data_attr = container_of(bin_attr, struct acpi_data_attr, attr);
+       size = data_attr->attr.size;
+
+       if (offset < 0)
+               return -EINVAL;
+
+       if (offset >= size)
+               return 0;
 
-       base = acpi_os_map_memory(data_attr->addr, data_attr->attr.size);
+       if (count > size - offset)
+               count = size - offset;
+
+       base = acpi_os_map_iomem(data_attr->addr, size);
        if (!base)
                return -ENOMEM;
-       rc = memory_read_from_buffer(buf, count, &offset, base,
-                                    data_attr->attr.size);
-       acpi_os_unmap_memory(base, data_attr->attr.size);
 
-       return rc;
+       memcpy_fromio(buf, base + offset, count);
+
+       acpi_os_unmap_iomem(base, size);
+
+       return count;
 }
 
 static int acpi_bert_data_init(void *th, struct acpi_data_attr *data_attr)