summaryrefslogtreecommitdiff
path: root/drivers/platform
diff options
context:
space:
mode:
authorArmin Wolf <W_Armin@gmx.de>2026-06-10 22:34:47 +0200
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>2026-06-12 16:01:46 +0300
commit6f918e3d95c9b0b4e6a6881692a9b5f9bf0f36b0 (patch)
treea32e3bdcfc119c5db7e8ce9148a7242193950e3f /drivers/platform
parent1719340487e63da13f2ac25e488c72737a545772 (diff)
downloadlinux-next-6f918e3d95c9b0b4e6a6881692a9b5f9bf0f36b0.tar.gz
linux-next-6f918e3d95c9b0b4e6a6881692a9b5f9bf0f36b0.zip
platform/x86: dell-smbios-wmi: Use new buffer-based WMI API
Use the new buffer-based WMI API to also support ACPI firmware implementations that do not use ACPI buffers for returning the results of a SMBIOS call. Signed-off-by: Armin Wolf <W_Armin@gmx.de> Link: https://patch.msgid.link/20260610203453.816254-4-W_Armin@gmx.de Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/dell/dell-smbios-wmi.c40
1 files changed, 17 insertions, 23 deletions
diff --git a/drivers/platform/x86/dell/dell-smbios-wmi.c b/drivers/platform/x86/dell/dell-smbios-wmi.c
index a7dca8c59d60..64d0871b706e 100644
--- a/drivers/platform/x86/dell/dell-smbios-wmi.c
+++ b/drivers/platform/x86/dell/dell-smbios-wmi.c
@@ -50,38 +50,32 @@ static inline struct wmi_smbios_priv *get_first_smbios_priv(void)
static int run_smbios_call(struct wmi_device *wdev)
{
- struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
- struct wmi_smbios_priv *priv;
- struct acpi_buffer input;
- union acpi_object *obj;
- acpi_status status;
-
- priv = dev_get_drvdata(&wdev->dev);
- input.length = priv->req_buf_size - sizeof(u64);
- input.pointer = &priv->buf->std;
+ struct wmi_smbios_priv *priv = dev_get_drvdata(&wdev->dev);
+ const struct wmi_buffer input = {
+ .length = priv->req_buf_size - sizeof(u64),
+ .data = &priv->buf->std,
+ };
+ struct wmi_buffer output;
+ int ret;
dev_dbg(&wdev->dev, "evaluating: %u/%u [%x,%x,%x,%x]\n",
priv->buf->std.cmd_class, priv->buf->std.cmd_select,
priv->buf->std.input[0], priv->buf->std.input[1],
priv->buf->std.input[2], priv->buf->std.input[3]);
- status = wmidev_evaluate_method(wdev, 0, 1, &input, &output);
- if (ACPI_FAILURE(status))
- return -EIO;
- obj = (union acpi_object *)output.pointer;
- if (obj->type != ACPI_TYPE_BUFFER) {
- dev_dbg(&wdev->dev, "received type: %d\n", obj->type);
- if (obj->type == ACPI_TYPE_INTEGER)
- dev_dbg(&wdev->dev, "SMBIOS call failed: %llu\n",
- obj->integer.value);
- kfree(output.pointer);
- return -EIO;
- }
- memcpy(input.pointer, obj->buffer.pointer, obj->buffer.length);
+ /*
+ * The output buffer returned by the WMI method should have at least the size
+ * of the input buffer.
+ */
+ ret = wmidev_invoke_method(wdev, 0, 1, &input, &output, input.length);
+ if (ret < 0)
+ return ret;
+
+ memcpy(input.data, output.data, input.length);
+ kfree(output.data);
dev_dbg(&wdev->dev, "result: [%08x,%08x,%08x,%08x]\n",
priv->buf->std.output[0], priv->buf->std.output[1],
priv->buf->std.output[2], priv->buf->std.output[3]);
- kfree(output.pointer);
return 0;
}