From nobody Sun Feb 8 23:03:51 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B684347FCC; Thu, 18 Dec 2025 20:43:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766090606; cv=none; b=SrfJ8CmoS6EjSn/4FOu3j8es3bOD+HTIMxRcPhg//WtBjhMjTO0S1O7nzVIUJAKPudIt0W2kzGX2m1VLPELx3BG4DI8c9Pkrw+pHwGRBXCO2Z+5E++bJjZzNs+dX1agCKivw0zzGtMLZfF946jvWAWwTlPnmvoaXUcOQqKjTUXY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766090606; c=relaxed/simple; bh=KDcZ8uxDIOfUDbYNA2SDG8iz7II4Xv9fVwbhRoPoMBU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cHxPXh4ZvXMD2ixIcDDOMJoGJ2NqqEdmJy0XFeA/dmYgo7yyGg60Q1RqRVJU7o9WbfP73MNKqGwq7mif4PUraWN2W7roZfXfqO7Vy0OsxPZSntNHNW3Osk/eIr/4UyfgKcn/iE58LOAh4E4YlzoAuikYepl33BRsJCqmOzvf5RU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SIYmySr6; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="SIYmySr6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 173CBC4CEFB; Thu, 18 Dec 2025 20:43:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1766090606; bh=KDcZ8uxDIOfUDbYNA2SDG8iz7II4Xv9fVwbhRoPoMBU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SIYmySr6RbEK/8XhM6/xqK0PbdSqpbQncnmIEyFG+X0U5m1GTuDuzxzNHkafu0pFU 4VEyEnkIwU0HobFBImlti2jfyDPex+g6TOb4po46InvUcAKTsR6sbcSMLrqlidd091 Qke+wYf+DIxOBbpHP2DB6qKjFrT42YGm0Hs8mzNIdBBwGjJ2TjYosFgzk4Mttbt2UK tthazVML0qhXnZGSJBDG4VmVfCDFA7aMuabjaQeb1IEyNIWJGD0BWhaEboxHfZX8B2 BjcoPyIdbZ1ZQoYtGm+1FB8dFp/1iCUBoDsXYaZbQkLjV/oM2WZYoh98YYlTWkXDLe FFQmJJX3/qsNQ== From: "Rafael J. Wysocki" To: Linux ACPI Cc: LKML , Linux PCI , Bjorn Helgaas , Srinivas Pandruvada , Hans de Goede , Mario Limonciello Subject: [PATCH v1 3/8] ACPI: bus: Split _OSC evaluation out of acpi_run_osc() Date: Thu, 18 Dec 2025 21:36:08 +0100 Message-ID: <3407425.44csPzL39Z@rafael.j.wysocki> Organization: Linux Kernel Development In-Reply-To: <5049211.GXAFRqVoOG@rafael.j.wysocki> References: <5049211.GXAFRqVoOG@rafael.j.wysocki> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Rafael J. Wysocki Split a function for evaluating _OSL called acpi_eval_osc() out of acpi_run_osc() to facilitate subsequent changes and add some more parameters sanity checks to the latter. No intentional functional impact. Signed-off-by: Rafael J. Wysocki --- drivers/acpi/bus.c | 89 ++++++++++++++++++++++++++++++------------------= ----- 1 file changed, 52 insertions(+), 37 deletions(-) --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -195,52 +195,67 @@ static void acpi_dump_osc_data(acpi_hand OSC_INVALID_REVISION_ERROR | \ OSC_CAPABILITIES_MASK_ERROR) =20 -acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *cont= ext) +static int acpi_eval_osc(acpi_handle handle, guid_t *guid, int rev, + struct acpi_buffer *cap, + union acpi_object in_params[static 4], + struct acpi_buffer *output) { - acpi_status status; struct acpi_object_list input; - union acpi_object in_params[4]; union acpi_object *out_obj; + acpi_status status; + + in_params[0].type =3D ACPI_TYPE_BUFFER; + in_params[0].buffer.length =3D sizeof(*guid); + in_params[0].buffer.pointer =3D (u8 *)guid; + in_params[1].type =3D ACPI_TYPE_INTEGER; + in_params[1].integer.value =3D rev; + in_params[2].type =3D ACPI_TYPE_INTEGER; + in_params[2].integer.value =3D cap->length / sizeof(u32); + in_params[3].type =3D ACPI_TYPE_BUFFER; + in_params[3].buffer.length =3D cap->length; + in_params[3].buffer.pointer =3D cap->pointer; + input.pointer =3D in_params; + input.count =3D 4; + + output->length =3D ACPI_ALLOCATE_BUFFER; + output->pointer =3D NULL; + + status =3D acpi_evaluate_object(handle, "_OSC", &input, output); + if (ACPI_FAILURE(status) || !output->length) + return -ENODATA; + + out_obj =3D output->pointer; + if (out_obj->type !=3D ACPI_TYPE_BUFFER || + out_obj->buffer.length !=3D cap->length) { + acpi_handle_debug(handle, "Invalid _OSC return buffer\n"); + acpi_dump_osc_data(handle, guid, rev, cap); + ACPI_FREE(out_obj); + return -ENODATA; + } + + return 0; +} + +acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *cont= ext) +{ + union acpi_object in_params[4], *out_obj; + struct acpi_buffer output; + acpi_status status =3D AE_OK; guid_t guid; u32 errors; - struct acpi_buffer output =3D {ACPI_ALLOCATE_BUFFER, NULL}; + int ret; =20 - if (!context) + if (!context || !context->cap.pointer || + context->cap.length < 2 * sizeof(32) || + guid_parse(context->uuid_str, &guid)) + return AE_BAD_PARAMETER; + + ret =3D acpi_eval_osc(handle, &guid, context->rev, &context->cap, + in_params, &output); + if (ret) return AE_ERROR; - if (guid_parse(context->uuid_str, &guid)) - return AE_ERROR; - context->ret.length =3D ACPI_ALLOCATE_BUFFER; - context->ret.pointer =3D NULL; - - /* Setting up input parameters */ - input.count =3D 4; - input.pointer =3D in_params; - in_params[0].type =3D ACPI_TYPE_BUFFER; - in_params[0].buffer.length =3D 16; - in_params[0].buffer.pointer =3D (u8 *)&guid; - in_params[1].type =3D ACPI_TYPE_INTEGER; - in_params[1].integer.value =3D context->rev; - in_params[2].type =3D ACPI_TYPE_INTEGER; - in_params[2].integer.value =3D context->cap.length/sizeof(u32); - in_params[3].type =3D ACPI_TYPE_BUFFER; - in_params[3].buffer.length =3D context->cap.length; - in_params[3].buffer.pointer =3D context->cap.pointer; - - status =3D acpi_evaluate_object(handle, "_OSC", &input, &output); - if (ACPI_FAILURE(status)) - return status; - - if (!output.length) - return AE_NULL_OBJECT; =20 out_obj =3D output.pointer; - if (out_obj->type !=3D ACPI_TYPE_BUFFER - || out_obj->buffer.length !=3D context->cap.length) { - acpi_handle_debug(handle, "_OSC evaluation returned wrong type"); - acpi_dump_osc_data(handle, &guid, context->rev, &context->cap); - status =3D AE_TYPE; - goto out_kfree; - } /* Only take defined error bits into account. */ errors =3D *((u32 *)out_obj->buffer.pointer) & OSC_ERROR_MASK; /* If OSC_QUERY_ENABLE is set, ignore the "capabilities masked" bit. */