mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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: 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>
This commit is contained in:
		
							parent
							
								
									5ba30be7fd
								
							
						
					
					
						commit
						9527264133
					
				
					 3 changed files with 29 additions and 20 deletions
				
			
		| 
						 | 
					@ -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)
 | 
				
			||||||
		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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	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);
 | 
				
			||||||
                                  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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* --------------------------------------------------------------------------
 | 
					/* --------------------------------------------------------------------------
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue