Commit 95272641 authored by Michal Wilczynski's avatar Michal Wilczynski Committed by Rafael J. Wysocki

ACPI: processor: Use _OSC to convey OSPM processor support information

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: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: default avatarMichal Wilczynski <michal.wilczynski@intel.com>
Reviewed-by: default avatarAndy 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: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 5ba30be7
...@@ -624,16 +624,33 @@ static acpi_status __init acpi_hwp_native_thermal_lvt_osc(acpi_handle handle, ...@@ -624,16 +624,33 @@ static acpi_status __init acpi_hwp_native_thermal_lvt_osc(acpi_handle handle,
return AE_OK; 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_status status;
acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, acpi_proc_quirk_mwait_check();
acpi_hwp_native_thermal_lvt_osc,
NULL, NULL, NULL); status = acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, ACPI_UINT32_MAX, acpi_processor_osc, NULL,
acpi_hwp_native_thermal_lvt_osc, NULL, 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 #endif
......
...@@ -1296,9 +1296,6 @@ static int __init acpi_bus_init(void) ...@@ -1296,9 +1296,6 @@ static int __init acpi_bus_init(void)
goto error1; goto error1;
} }
/* Set capability bits for _OSC under processor scope */
acpi_early_processor_osc();
/* /*
* _OSC method may exist in module level code, * _OSC method may exist in module level code,
* so it must be run after ACPI_FULL_INITIALIZATION * so it must be run after ACPI_FULL_INITIALIZATION
...@@ -1314,7 +1311,7 @@ static int __init acpi_bus_init(void) ...@@ -1314,7 +1311,7 @@ static int __init acpi_bus_init(void)
acpi_sysfs_init(); 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 * Maybe EC region is required at bus_scan/acpi_get_devices. So it
......
...@@ -152,18 +152,13 @@ int acpi_wakeup_device_init(void); ...@@ -152,18 +152,13 @@ int acpi_wakeup_device_init(void);
Processor Processor
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
#ifdef CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC #ifdef CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC
void acpi_early_processor_control_setup(void);
void acpi_early_processor_set_pdc(void); void acpi_early_processor_set_pdc(void);
void acpi_proc_quirk_mwait_check(void); void acpi_proc_quirk_mwait_check(void);
bool processor_physically_present(acpi_handle handle); bool processor_physically_present(acpi_handle handle);
#else #else
static inline void acpi_early_processor_set_pdc(void) {} static inline void acpi_early_processor_control_setup(void) {}
#endif
#ifdef CONFIG_X86
void acpi_early_processor_osc(void);
#else
static inline void acpi_early_processor_osc(void) {}
#endif #endif
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment