platform/x86: wmi: introduce helper to generate method names
Instead of "manually" constructing the ACPI method name and hard-coding sizes in WMI functions, introduce a helper method which generates the method name for an arbitrary WMI block. Furthermore, save the appropriate buffer size into a macro. Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com> Link: https://lore.kernel.org/r/20210904175450.156801-28-pobrn@protonmail.com Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
e7b2e33449
commit
57f2ce8921
@ -195,6 +195,22 @@ static acpi_status wmi_method_enable(struct wmi_block *wblock, bool enable)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define WMI_ACPI_METHOD_NAME_SIZE 5
|
||||||
|
|
||||||
|
static inline void get_acpi_method_name(const struct wmi_block *wblock,
|
||||||
|
const char method,
|
||||||
|
char buffer[static WMI_ACPI_METHOD_NAME_SIZE])
|
||||||
|
{
|
||||||
|
static_assert(ARRAY_SIZE(wblock->gblock.object_id) == 2);
|
||||||
|
static_assert(WMI_ACPI_METHOD_NAME_SIZE >= 5);
|
||||||
|
|
||||||
|
buffer[0] = 'W';
|
||||||
|
buffer[1] = method;
|
||||||
|
buffer[2] = wblock->gblock.object_id[0];
|
||||||
|
buffer[3] = wblock->gblock.object_id[1];
|
||||||
|
buffer[4] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exported WMI functions
|
* Exported WMI functions
|
||||||
*/
|
*/
|
||||||
@ -257,7 +273,7 @@ acpi_status wmidev_evaluate_method(struct wmi_device *wdev, u8 instance, u32 met
|
|||||||
acpi_handle handle;
|
acpi_handle handle;
|
||||||
struct acpi_object_list input;
|
struct acpi_object_list input;
|
||||||
union acpi_object params[3];
|
union acpi_object params[3];
|
||||||
char method[5] = "WM";
|
char method[WMI_ACPI_METHOD_NAME_SIZE];
|
||||||
|
|
||||||
wblock = container_of(wdev, struct wmi_block, dev);
|
wblock = container_of(wdev, struct wmi_block, dev);
|
||||||
block = &wblock->gblock;
|
block = &wblock->gblock;
|
||||||
@ -288,7 +304,7 @@ acpi_status wmidev_evaluate_method(struct wmi_device *wdev, u8 instance, u32 met
|
|||||||
params[2].buffer.pointer = in->pointer;
|
params[2].buffer.pointer = in->pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncat(method, block->object_id, 2);
|
get_acpi_method_name(wblock, 'M', method);
|
||||||
|
|
||||||
return acpi_evaluate_object(handle, method, &input, out);
|
return acpi_evaluate_object(handle, method, &input, out);
|
||||||
}
|
}
|
||||||
@ -302,8 +318,8 @@ static acpi_status __query_block(struct wmi_block *wblock, u8 instance,
|
|||||||
acpi_status status, wc_status = AE_ERROR;
|
acpi_status status, wc_status = AE_ERROR;
|
||||||
struct acpi_object_list input;
|
struct acpi_object_list input;
|
||||||
union acpi_object wq_params[1];
|
union acpi_object wq_params[1];
|
||||||
char method[5];
|
char wc_method[WMI_ACPI_METHOD_NAME_SIZE];
|
||||||
char wc_method[5] = "WC";
|
char method[WMI_ACPI_METHOD_NAME_SIZE];
|
||||||
|
|
||||||
if (!out)
|
if (!out)
|
||||||
return AE_BAD_PARAMETER;
|
return AE_BAD_PARAMETER;
|
||||||
@ -331,7 +347,7 @@ static acpi_status __query_block(struct wmi_block *wblock, u8 instance,
|
|||||||
* enable collection.
|
* enable collection.
|
||||||
*/
|
*/
|
||||||
if (block->flags & ACPI_WMI_EXPENSIVE) {
|
if (block->flags & ACPI_WMI_EXPENSIVE) {
|
||||||
strncat(wc_method, block->object_id, 2);
|
get_acpi_method_name(wblock, 'C', wc_method);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some GUIDs break the specification by declaring themselves
|
* Some GUIDs break the specification by declaring themselves
|
||||||
@ -341,9 +357,7 @@ static acpi_status __query_block(struct wmi_block *wblock, u8 instance,
|
|||||||
wc_status = acpi_execute_simple_method(handle, wc_method, 1);
|
wc_status = acpi_execute_simple_method(handle, wc_method, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(method, "WQ");
|
get_acpi_method_name(wblock, 'Q', method);
|
||||||
strncat(method, block->object_id, 2);
|
|
||||||
|
|
||||||
status = acpi_evaluate_object(handle, method, &input, out);
|
status = acpi_evaluate_object(handle, method, &input, out);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -415,7 +429,7 @@ acpi_status wmi_set_block(const char *guid_string, u8 instance,
|
|||||||
acpi_handle handle;
|
acpi_handle handle;
|
||||||
struct acpi_object_list input;
|
struct acpi_object_list input;
|
||||||
union acpi_object params[2];
|
union acpi_object params[2];
|
||||||
char method[5] = "WS";
|
char method[WMI_ACPI_METHOD_NAME_SIZE];
|
||||||
|
|
||||||
if (!guid_string || !in)
|
if (!guid_string || !in)
|
||||||
return AE_BAD_DATA;
|
return AE_BAD_DATA;
|
||||||
@ -446,7 +460,7 @@ acpi_status wmi_set_block(const char *guid_string, u8 instance,
|
|||||||
params[1].buffer.length = in->length;
|
params[1].buffer.length = in->length;
|
||||||
params[1].buffer.pointer = in->pointer;
|
params[1].buffer.pointer = in->pointer;
|
||||||
|
|
||||||
strncat(method, block->object_id, 2);
|
get_acpi_method_name(wblock, 'S', method);
|
||||||
|
|
||||||
return acpi_evaluate_object(handle, method, &input, NULL);
|
return acpi_evaluate_object(handle, method, &input, NULL);
|
||||||
}
|
}
|
||||||
@ -1040,7 +1054,7 @@ static int wmi_create_device(struct device *wmi_bus_dev,
|
|||||||
struct acpi_device *device)
|
struct acpi_device *device)
|
||||||
{
|
{
|
||||||
struct acpi_device_info *info;
|
struct acpi_device_info *info;
|
||||||
char method[5];
|
char method[WMI_ACPI_METHOD_NAME_SIZE];
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
if (wblock->gblock.flags & ACPI_WMI_EVENT) {
|
if (wblock->gblock.flags & ACPI_WMI_EVENT) {
|
||||||
@ -1059,8 +1073,7 @@ static int wmi_create_device(struct device *wmi_bus_dev,
|
|||||||
* required per the WMI documentation. If it is not present,
|
* required per the WMI documentation. If it is not present,
|
||||||
* we ignore this data block.
|
* we ignore this data block.
|
||||||
*/
|
*/
|
||||||
strcpy(method, "WQ");
|
get_acpi_method_name(wblock, 'Q', method);
|
||||||
strncat(method, wblock->gblock.object_id, 2);
|
|
||||||
result = get_subobj_info(device->handle, method, &info);
|
result = get_subobj_info(device->handle, method, &info);
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
@ -1087,8 +1100,7 @@ static int wmi_create_device(struct device *wmi_bus_dev,
|
|||||||
|
|
||||||
kfree(info);
|
kfree(info);
|
||||||
|
|
||||||
strcpy(method, "WS");
|
get_acpi_method_name(wblock, 'S', method);
|
||||||
strncat(method, wblock->gblock.object_id, 2);
|
|
||||||
result = get_subobj_info(device->handle, method, NULL);
|
result = get_subobj_info(device->handle, method, NULL);
|
||||||
|
|
||||||
if (result == 0)
|
if (result == 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user