]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ACPI: bus: Avoid using CPPC if not supported by firmware
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 16 Mar 2022 12:39:03 +0000 (13:39 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2024 13:10:44 +0000 (15:10 +0200)
[ Upstream commit c42fa24b44751c62c86e98430ef915c0609a2ab8 ]

If the platform firmware indicates that it does not support CPPC by
clearing the OSC_SB_CPC_SUPPORT and OSC_SB_CPCV2_SUPPORT bits in the
platform _OSC capabilities mask, avoid attempting to evaluate _CPC
which may fail in that case.

Because the OSC_SB_CPC_SUPPORT and OSC_SB_CPCV2_SUPPORT bits are only
added to the supported platform capabilities mask on x86, when
X86_FEATURE_HWP is supported, allow _CPC to be evaluated regardless
in the other cases.

Link: https://lore.kernel.org/linux-acpi/CAJZ5v0i=ecAksq0TV+iLVObm-=fUfdqPABzzkgm9K6KxO1ZCcg@mail.gmail.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: Mario Limonciello <mario.limonciello@amd.com>
Acked-by: Huang Rui <ray.huang@amd.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Stable-dep-of: 60949b7b8054 ("ACPI: CPPC: Fix MASK_VAL() usage")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/acpi/bus.c
drivers/acpi/cppc_acpi.c
include/linux/acpi.h

index 7774b603a79627f1e2ba06eae39a4a9c3cc41756..9bc5bc5bc359b2efbfc035c0f0b4a3264c371fcc 100644 (file)
@@ -283,6 +283,8 @@ EXPORT_SYMBOL_GPL(osc_pc_lpi_support_confirmed);
 bool osc_sb_native_usb4_support_confirmed;
 EXPORT_SYMBOL_GPL(osc_sb_native_usb4_support_confirmed);
 
+bool osc_sb_cppc_not_supported;
+
 static u8 sb_uuid_str[] = "0811B06E-4A27-44F9-8D60-3CBBC22E7B48";
 static void acpi_bus_osc_negotiate_platform_control(void)
 {
@@ -338,6 +340,12 @@ static void acpi_bus_osc_negotiate_platform_control(void)
                return;
        }
 
+#ifdef CONFIG_X86
+       if (boot_cpu_has(X86_FEATURE_HWP))
+               osc_sb_cppc_not_supported = !(capbuf_ret[OSC_SUPPORT_DWORD] &
+                               (OSC_SB_CPC_SUPPORT | OSC_SB_CPCV2_SUPPORT));
+#endif
+
        /*
         * Now run _OSC again with query flag clear and with the caps
         * supported by both the OS and the platform.
index 6dcce036adb9c39d32e0401db88b3367667298fd..02cec9eba937f5f7d87ebc7e9841ac7d5c84a46a 100644 (file)
@@ -673,6 +673,9 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
        acpi_status status;
        int ret = -EFAULT;
 
+       if (osc_sb_cppc_not_supported)
+               return -ENODEV;
+
        /* Parse the ACPI _CPC table for this CPU. */
        status = acpi_evaluate_object_typed(handle, "_CPC", NULL, &output,
                        ACPI_TYPE_PACKAGE);
index a23a5aea9c817798f4ca1f6d23b8a5c062bd18da..42f58a54dff0930e1dc02362dfd34b5626b6c367 100644 (file)
@@ -561,6 +561,7 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context);
 extern bool osc_sb_apei_support_acked;
 extern bool osc_pc_lpi_support_confirmed;
 extern bool osc_sb_native_usb4_support_confirmed;
+extern bool osc_sb_cppc_not_supported;
 
 /* USB4 Capabilities */
 #define OSC_USB_USB3_TUNNELING                 0x00000001