diff options
author | Thorsten Leemhuis <fedora@leemhuis.info> | 2020-05-29 19:50:14 +0200 |
---|---|---|
committer | Thorsten Leemhuis <fedora@leemhuis.info> | 2020-05-29 19:50:14 +0200 |
commit | 59adb3dc6384af48c3b97589c8d887c87689e0e4 (patch) | |
tree | c0fb7c5ecc5260b57173619973336989e0b8a256 /0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch | |
parent | d48a756e71e269ecef24682ba38b6b49ed2a6abe (diff) | |
parent | 42bbfcc428758569177d4e644fddfb5ed46c57a5 (diff) | |
download | kernel-5.7.0-0.rc7.20200529gitb0c3ba31be3e.1.vanilla.1.fc32.tar.gz kernel-5.7.0-0.rc7.20200529gitb0c3ba31be3e.1.vanilla.1.fc32.tar.xz kernel-5.7.0-0.rc7.20200529gitb0c3ba31be3e.1.vanilla.1.fc32.zip |
Merge remote-tracking branch 'origin/master' into rawhide-user-thl-vanilla-fedorakernel-5.7.0-0.rc7.20200529gitb0c3ba31be3e.1.vanilla.1.fc32
Diffstat (limited to '0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch')
-rw-r--r-- | 0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch b/0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch new file mode 100644 index 000000000..743e38804 --- /dev/null +++ b/0001-platform-x86-sony-laptop-SNC-calls-should-handle-BUF.patch @@ -0,0 +1,116 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mattia Dongili <malattia@linux.it> +Date: Fri, 8 May 2020 09:14:04 +0900 +Subject: [PATCH] platform/x86: sony-laptop: SNC calls should handle BUFFER + types + +After commit 6d232b29cfce ("ACPICA: Dispatcher: always generate buffer +objects for ASL create_field() operator") ACPICA creates buffers even +when new fields are small enough to fit into an integer. +Many SNC calls counted on the old behaviour. +Since sony-laptop already handles the INTEGER/BUFFER case in +sony_nc_buffer_call, switch sony_nc_int_call to use its more generic +function instead. + +Fixes: 6d232b29cfce ("ACPICA: Dispatcher: always generate buffer objects for ASL create_field() operator") +Reported-by: Dominik Mierzejewski <dominik@greysector.net> +Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=207491 +Reported-by: William Bader <williambader@hotmail.com> +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1830150 +Signed-off-by: Mattia Dongili <malattia@linux.it> +Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> +Upstream Status: linux-platform-drivers-x86/for-next +(cherry picked from commit 47828d22539f76c8c9dcf2a55f18ea3a8039d8ef) +--- + drivers/platform/x86/sony-laptop.c | 53 +++++++++++++----------------- + 1 file changed, 23 insertions(+), 30 deletions(-) + +diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c +index 51309f7ceede..6932cd11e660 100644 +--- a/drivers/platform/x86/sony-laptop.c ++++ b/drivers/platform/x86/sony-laptop.c +@@ -757,33 +757,6 @@ static union acpi_object *__call_snc_method(acpi_handle handle, char *method, + return result; + } + +-static int sony_nc_int_call(acpi_handle handle, char *name, int *value, +- int *result) +-{ +- union acpi_object *object = NULL; +- if (value) { +- u64 v = *value; +- object = __call_snc_method(handle, name, &v); +- } else +- object = __call_snc_method(handle, name, NULL); +- +- if (!object) +- return -EINVAL; +- +- if (object->type != ACPI_TYPE_INTEGER) { +- pr_warn("Invalid acpi_object: expected 0x%x got 0x%x\n", +- ACPI_TYPE_INTEGER, object->type); +- kfree(object); +- return -EINVAL; +- } +- +- if (result) +- *result = object->integer.value; +- +- kfree(object); +- return 0; +-} +- + #define MIN(a, b) (a > b ? b : a) + static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value, + void *buffer, size_t buflen) +@@ -795,17 +768,20 @@ static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value, + if (!object) + return -EINVAL; + +- if (object->type == ACPI_TYPE_BUFFER) { ++ if (!buffer) { ++ /* do nothing */ ++ } else if (object->type == ACPI_TYPE_BUFFER) { + len = MIN(buflen, object->buffer.length); ++ memset(buffer, 0, buflen); + memcpy(buffer, object->buffer.pointer, len); + + } else if (object->type == ACPI_TYPE_INTEGER) { + len = MIN(buflen, sizeof(object->integer.value)); ++ memset(buffer, 0, buflen); + memcpy(buffer, &object->integer.value, len); + + } else { +- pr_warn("Invalid acpi_object: expected 0x%x got 0x%x\n", +- ACPI_TYPE_BUFFER, object->type); ++ pr_warn("Unexpected acpi_object: 0x%x\n", object->type); + ret = -EINVAL; + } + +@@ -813,6 +789,23 @@ static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value, + return ret; + } + ++static int sony_nc_int_call(acpi_handle handle, char *name, int *value, int ++ *result) ++{ ++ int ret; ++ ++ if (value) { ++ u64 v = *value; ++ ++ ret = sony_nc_buffer_call(handle, name, &v, result, ++ sizeof(*result)); ++ } else { ++ ret = sony_nc_buffer_call(handle, name, NULL, result, ++ sizeof(*result)); ++ } ++ return ret; ++} ++ + struct sony_nc_handles { + u16 cap[0x10]; + struct device_attribute devattr; +-- +2.26.2 + |