ACPI: processor: Use _OSC to convey OSPM processor support information
authorMichal Wilczynski <michal.wilczynski@intel.com>
Mon, 10 Jul 2023 14:03:36 +0000 (17:03 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 17 Jul 2023 12:47:18 +0000 (14:47 +0200)
Change acpi_early_processor_osc() to return a value in case of a
failure and make it static.

Also make it run acpi_processor_osc() for every processor object or
processor device found in the ACPI Namespace (previously, its only purpose
was to work around platform firmware defects on Skylake systems).

Introduce a new function called acpi_early_processor_control_setup() that
will invoke acpi_early_processor_osc() first in order to convey the OS
processor support information to the platform firmware and if that fails,
it will fall back to using _PDC.

Suggested-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Michal Wilczynski <michal.wilczynski@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
[ rjw: Subject and changelog edits, change function return value to bool,
  add missing 'static', change messages ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpi_processor.c
drivers/acpi/bus.c
drivers/acpi/internal.h

index 163bd3d..8f4d70a 100644 (file)
@@ -624,16 +624,33 @@ static acpi_status __init acpi_hwp_native_thermal_lvt_osc(acpi_handle handle,
        return AE_OK;
 }
 
-void __init acpi_early_processor_osc(void)
+static bool __init acpi_early_processor_osc(void)
 {
-       if (boot_cpu_has(X86_FEATURE_HWP)) {
-               acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
-                                   ACPI_UINT32_MAX,
-                                   acpi_hwp_native_thermal_lvt_osc,
-                                   NULL, NULL, NULL);
-               acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID,
-                                acpi_hwp_native_thermal_lvt_osc,
-                                NULL, NULL);
+       acpi_status status;
+
+       acpi_proc_quirk_mwait_check();
+
+       status = acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
+                                    ACPI_UINT32_MAX, acpi_processor_osc, NULL,
+                                    NULL, NULL);
+       if (ACPI_FAILURE(status))
+               return false;
+
+       status = acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, acpi_processor_osc,
+                                 NULL, NULL);
+       if (ACPI_FAILURE(status))
+               return false;
+
+       return true;
+}
+
+void __init acpi_early_processor_control_setup(void)
+{
+       if (acpi_early_processor_osc()) {
+               pr_info("_OSC evaluated successfully\n");
+       } else {
+               pr_info("_OSC evaluation failed, trying _PDC\n");
+               acpi_early_processor_set_pdc();
        }
 }
 #endif
index 2fc2b43..a39f2f3 100644 (file)
@@ -1296,9 +1296,6 @@ static int __init acpi_bus_init(void)
                goto error1;
        }
 
-       /* Set capability bits for _OSC under processor scope */
-       acpi_early_processor_osc();
-
        /*
         * _OSC method may exist in module level code,
         * so it must be run after ACPI_FULL_INITIALIZATION
@@ -1314,7 +1311,7 @@ static int __init acpi_bus_init(void)
 
        acpi_sysfs_init();
 
-       acpi_early_processor_set_pdc();
+       acpi_early_processor_control_setup();
 
        /*
         * Maybe EC region is required at bus_scan/acpi_get_devices. So it
index ed2599a..ced8224 100644 (file)
@@ -152,18 +152,13 @@ int acpi_wakeup_device_init(void);
                                   Processor
    -------------------------------------------------------------------------- */
 #ifdef CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC
+void acpi_early_processor_control_setup(void);
 void acpi_early_processor_set_pdc(void);
 
 void acpi_proc_quirk_mwait_check(void);
 bool processor_physically_present(acpi_handle handle);
 #else
-static inline void acpi_early_processor_set_pdc(void) {}
-#endif
-
-#ifdef CONFIG_X86
-void acpi_early_processor_osc(void);
-#else
-static inline void acpi_early_processor_osc(void) {}
+static inline void acpi_early_processor_control_setup(void) {}
 #endif
 
 /* --------------------------------------------------------------------------