Linux Audio

Check our new training course

Loading...
v5.9
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * processor_driver.c - ACPI Processor Driver
  4 *
  5 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
  6 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
  7 *  Copyright (C) 2004       Dominik Brodowski <linux@brodo.de>
  8 *  Copyright (C) 2004  Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  9 *  			- Added processor hotplug support
 10 *  Copyright (C) 2013, Intel Corporation
 11 *                      Rafael J. Wysocki <rafael.j.wysocki@intel.com>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 12 */
 13
 14#include <linux/kernel.h>
 15#include <linux/module.h>
 16#include <linux/init.h>
 
 
 
 17#include <linux/cpufreq.h>
 18#include <linux/cpu.h>
 
 
 19#include <linux/cpuidle.h>
 20#include <linux/slab.h>
 21#include <linux/acpi.h>
 22
 
 
 
 
 
 
 
 
 
 
 
 23#include <acpi/processor.h>
 24
 25#include "internal.h"
 26
 
 
 
 
 
 27#define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80
 28#define ACPI_PROCESSOR_NOTIFY_POWER	0x81
 29#define ACPI_PROCESSOR_NOTIFY_THROTTLING	0x82
 30
 
 
 
 31#define _COMPONENT		ACPI_PROCESSOR_COMPONENT
 32ACPI_MODULE_NAME("processor_driver");
 33
 34MODULE_AUTHOR("Paul Diefenbaugh");
 35MODULE_DESCRIPTION("ACPI Processor Driver");
 36MODULE_LICENSE("GPL");
 37
 38static int acpi_processor_start(struct device *dev);
 39static int acpi_processor_stop(struct device *dev);
 
 
 
 
 40
 41static const struct acpi_device_id processor_device_ids[] = {
 42	{ACPI_PROCESSOR_OBJECT_HID, 0},
 43	{ACPI_PROCESSOR_DEVICE_HID, 0},
 44	{"", 0},
 45};
 46MODULE_DEVICE_TABLE(acpi, processor_device_ids);
 47
 48static struct device_driver acpi_processor_driver = {
 49	.name = "processor",
 50	.bus = &cpu_subsys,
 51	.acpi_match_table = processor_device_ids,
 52	.probe = acpi_processor_start,
 53	.remove = acpi_processor_stop,
 
 
 
 
 
 54};
 55
 56static void acpi_processor_notify(acpi_handle handle, u32 event, void *data)
 
 
 
 
 
 
 
 
 
 
 
 
 57{
 58	struct acpi_device *device = data;
 59	struct acpi_processor *pr;
 60	int saved;
 61
 62	if (device->handle != handle)
 63		return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 64
 65	pr = acpi_driver_data(device);
 66	if (!pr)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 67		return;
 68
 69	switch (event) {
 70	case ACPI_PROCESSOR_NOTIFY_PERFORMANCE:
 71		saved = pr->performance_platform_limit;
 72		acpi_processor_ppc_has_changed(pr, 1);
 73		if (saved == pr->performance_platform_limit)
 74			break;
 
 
 75		acpi_bus_generate_netlink_event(device->pnp.device_class,
 76						  dev_name(&device->dev), event,
 77						  pr->performance_platform_limit);
 78		break;
 79	case ACPI_PROCESSOR_NOTIFY_POWER:
 80		acpi_processor_power_state_has_changed(pr);
 
 81		acpi_bus_generate_netlink_event(device->pnp.device_class,
 82						  dev_name(&device->dev), event, 0);
 83		break;
 84	case ACPI_PROCESSOR_NOTIFY_THROTTLING:
 85		acpi_processor_tstate_has_changed(pr);
 
 86		acpi_bus_generate_netlink_event(device->pnp.device_class,
 87						  dev_name(&device->dev), event, 0);
 88		break;
 89	default:
 90		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 91				  "Unsupported event [0x%x]\n", event));
 92		break;
 93	}
 94
 95	return;
 96}
 97
 98static int __acpi_processor_start(struct acpi_device *device);
 99
100static int acpi_soft_cpu_online(unsigned int cpu)
101{
 
102	struct acpi_processor *pr = per_cpu(processors, cpu);
103	struct acpi_device *device;
104
105	if (!pr || acpi_bus_get_device(pr->handle, &device))
106		return 0;
107	/*
108	 * CPU got physically hotplugged and onlined for the first time:
109	 * Initialize missing things.
110	 */
111	if (pr->flags.need_hotplug_init) {
112		int ret;
113
114		pr_info("Will online and init hotplugged CPU: %d\n",
115			pr->id);
116		pr->flags.need_hotplug_init = 0;
117		ret = __acpi_processor_start(device);
118		WARN(ret, "Failed to start CPU: %d\n", pr->id);
119	} else {
120		/* Normal CPU soft online event. */
121		acpi_processor_ppc_has_changed(pr, 0);
122		acpi_processor_hotplug(pr);
123		acpi_processor_reevaluate_tstate(pr, false);
124		acpi_processor_tstate_has_changed(pr);
125	}
126	return 0;
 
 
 
 
127}
128
129static int acpi_soft_cpu_dead(unsigned int cpu)
130{
131	struct acpi_processor *pr = per_cpu(processors, cpu);
132	struct acpi_device *device;
133
134	if (!pr || acpi_bus_get_device(pr->handle, &device))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135		return 0;
 
136
137	acpi_processor_reevaluate_tstate(pr, true);
138	return 0;
139}
 
140
141#ifdef CONFIG_ACPI_CPU_FREQ_PSS
142static int acpi_pss_perf_init(struct acpi_processor *pr,
143		struct acpi_device *device)
144{
145	int result = 0;
146
147	acpi_processor_ppc_has_changed(pr, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
 
 
 
149	acpi_processor_get_throttling_info(pr);
 
 
150
151	if (pr->flags.throttling)
152		pr->flags.limit = 1;
153
154	pr->cdev = thermal_cooling_device_register("Processor", device,
155						   &processor_cooling_ops);
156	if (IS_ERR(pr->cdev)) {
157		result = PTR_ERR(pr->cdev);
158		return result;
159	}
160
161	dev_dbg(&device->dev, "registered as cooling_device%d\n",
162		pr->cdev->id);
163
164	result = sysfs_create_link(&device->dev.kobj,
165				   &pr->cdev->device.kobj,
166				   "thermal_cooling");
167	if (result) {
168		dev_err(&device->dev,
169			"Failed to create sysfs link 'thermal_cooling'\n");
170		goto err_thermal_unregister;
171	}
172
173	result = sysfs_create_link(&pr->cdev->device.kobj,
174				   &device->dev.kobj,
175				   "device");
176	if (result) {
177		dev_err(&pr->cdev->device,
178			"Failed to create sysfs link 'device'\n");
179		goto err_remove_sysfs_thermal;
180	}
181
182	return 0;
183
184 err_remove_sysfs_thermal:
185	sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
186 err_thermal_unregister:
187	thermal_cooling_device_unregister(pr->cdev);
 
 
 
 
188
189	return result;
190}
191
192static void acpi_pss_perf_exit(struct acpi_processor *pr,
193		struct acpi_device *device)
194{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195	if (pr->cdev) {
196		sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
197		sysfs_remove_link(&pr->cdev->device.kobj, "device");
198		thermal_cooling_device_unregister(pr->cdev);
199		pr->cdev = NULL;
200	}
201}
202#else
203static inline int acpi_pss_perf_init(struct acpi_processor *pr,
204		struct acpi_device *device)
205{
 
 
 
206	return 0;
207}
208
209static inline void acpi_pss_perf_exit(struct acpi_processor *pr,
210		struct acpi_device *device) {}
211#endif /* CONFIG_ACPI_CPU_FREQ_PSS */
 
212
213static int __acpi_processor_start(struct acpi_device *device)
214{
215	struct acpi_processor *pr = acpi_driver_data(device);
216	acpi_status status;
217	int result = 0;
218
219	if (!pr)
220		return -ENODEV;
221
222	if (pr->flags.need_hotplug_init)
223		return 0;
224
225	result = acpi_cppc_processor_probe(pr);
226	if (result && !IS_ENABLED(CONFIG_ACPI_CPU_FREQ_PSS))
227		dev_dbg(&device->dev, "CPPC data invalid or not present\n");
228
229	if (!cpuidle_get_driver() || cpuidle_get_driver() == &acpi_idle_driver)
230		acpi_processor_power_init(pr);
231
232	result = acpi_pss_perf_init(pr, device);
233	if (result)
234		goto err_power_exit;
 
 
 
 
 
 
 
 
235
236	status = acpi_install_notify_handler(device->handle, ACPI_DEVICE_NOTIFY,
237					     acpi_processor_notify, device);
238	if (ACPI_SUCCESS(status))
239		return 0;
 
240
241	result = -ENODEV;
242	acpi_pss_perf_exit(pr, device);
243
244err_power_exit:
245	acpi_processor_power_exit(pr);
246	return result;
247}
248
249static int acpi_processor_start(struct device *dev)
250{
251	struct acpi_device *device = ACPI_COMPANION(dev);
252	int ret;
253
254	if (!device)
255		return -ENODEV;
 
256
257	/* Protect against concurrent CPU hotplug operations */
258	cpu_hotplug_disable();
259	ret = __acpi_processor_start(device);
260	cpu_hotplug_enable();
261	return ret;
262}
263
264static int acpi_processor_stop(struct device *dev)
 
265{
266	struct acpi_device *device = ACPI_COMPANION(dev);
267	struct acpi_processor *pr;
 
 
268
269	if (!device)
270		return 0;
271
272	acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY,
273				   acpi_processor_notify);
 
 
 
 
 
274
275	pr = acpi_driver_data(device);
276	if (!pr)
277		return 0;
278	acpi_processor_power_exit(pr);
279
280	acpi_pss_perf_exit(pr, device);
 
 
 
 
 
 
 
 
 
 
281
282	acpi_cppc_processor_exit(pr);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
284	return 0;
285}
286
287bool acpi_processor_cpufreq_init;
 
 
 
 
 
 
288
289static int acpi_processor_notifier(struct notifier_block *nb,
290				   unsigned long event, void *data)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
291{
292	struct cpufreq_policy *policy = data;
293
294	if (event == CPUFREQ_CREATE_POLICY) {
295		acpi_thermal_cpufreq_init(policy);
296		acpi_processor_ppc_init(policy);
297	} else if (event == CPUFREQ_REMOVE_POLICY) {
298		acpi_processor_ppc_exit(policy);
299		acpi_thermal_cpufreq_exit(policy);
300	}
301
302	return 0;
 
 
 
 
 
 
 
 
303}
304
305static struct notifier_block acpi_processor_notifier_block = {
306	.notifier_call = acpi_processor_notifier,
307};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
309/*
310 * We keep the driver loaded even when ACPI is not running.
311 * This is needed for the powernow-k8 driver, that works even without
312 * ACPI, but needs symbols from this driver
313 */
314static enum cpuhp_state hp_online;
315static int __init acpi_processor_driver_init(void)
316{
317	int result = 0;
318
319	if (acpi_disabled)
320		return 0;
321
322	result = driver_register(&acpi_processor_driver);
323	if (result < 0)
324		return result;
325
326	result = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
327					   "acpi/cpu-drv:online",
328					   acpi_soft_cpu_online, NULL);
329	if (result < 0)
330		goto err;
331	hp_online = result;
332	cpuhp_setup_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD, "acpi/cpu-drv:dead",
333				  NULL, acpi_soft_cpu_dead);
334
335	if (!cpufreq_register_notifier(&acpi_processor_notifier_block,
336				       CPUFREQ_POLICY_NOTIFIER)) {
337		acpi_processor_cpufreq_init = true;
338		acpi_processor_ignore_ppc_init();
339	}
340
 
 
 
 
 
 
 
 
 
 
341	acpi_processor_throttling_init();
 
342	return 0;
343err:
344	driver_unregister(&acpi_processor_driver);
 
 
345	return result;
346}
347
348static void __exit acpi_processor_driver_exit(void)
349{
350	if (acpi_disabled)
351		return;
352
353	if (acpi_processor_cpufreq_init) {
354		cpufreq_unregister_notifier(&acpi_processor_notifier_block,
355					    CPUFREQ_POLICY_NOTIFIER);
356		acpi_processor_cpufreq_init = false;
357	}
358
359	cpuhp_remove_state_nocalls(hp_online);
360	cpuhp_remove_state_nocalls(CPUHP_ACPI_CPUDRV_DEAD);
361	driver_unregister(&acpi_processor_driver);
 
 
362}
363
364module_init(acpi_processor_driver_init);
365module_exit(acpi_processor_driver_exit);
366
367MODULE_ALIAS("processor");
v3.1
 
  1/*
  2 * acpi_processor.c - ACPI Processor Driver ($Revision: 71 $)
  3 *
  4 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
  5 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
  6 *  Copyright (C) 2004       Dominik Brodowski <linux@brodo.de>
  7 *  Copyright (C) 2004  Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  8 *  			- Added processor hotplug support
  9 *
 10 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 11 *
 12 *  This program is free software; you can redistribute it and/or modify
 13 *  it under the terms of the GNU General Public License as published by
 14 *  the Free Software Foundation; either version 2 of the License, or (at
 15 *  your option) any later version.
 16 *
 17 *  This program is distributed in the hope that it will be useful, but
 18 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 19 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 20 *  General Public License for more details.
 21 *
 22 *  You should have received a copy of the GNU General Public License along
 23 *  with this program; if not, write to the Free Software Foundation, Inc.,
 24 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 25 *
 26 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 27 *  TBD:
 28 *	1. Make # power states dynamic.
 29 *	2. Support duty_cycle values that span bit 4.
 30 *	3. Optimize by having scheduler determine business instead of
 31 *	   having us try to calculate it here.
 32 *	4. Need C1 timing -- must modify kernel (IRQ handler) to get this.
 33 */
 34
 35#include <linux/kernel.h>
 36#include <linux/module.h>
 37#include <linux/init.h>
 38#include <linux/types.h>
 39#include <linux/pci.h>
 40#include <linux/pm.h>
 41#include <linux/cpufreq.h>
 42#include <linux/cpu.h>
 43#include <linux/dmi.h>
 44#include <linux/moduleparam.h>
 45#include <linux/cpuidle.h>
 46#include <linux/slab.h>
 
 47
 48#include <asm/io.h>
 49#include <asm/system.h>
 50#include <asm/cpu.h>
 51#include <asm/delay.h>
 52#include <asm/uaccess.h>
 53#include <asm/processor.h>
 54#include <asm/smp.h>
 55#include <asm/acpi.h>
 56
 57#include <acpi/acpi_bus.h>
 58#include <acpi/acpi_drivers.h>
 59#include <acpi/processor.h>
 60
 61#define PREFIX "ACPI: "
 62
 63#define ACPI_PROCESSOR_CLASS		"processor"
 64#define ACPI_PROCESSOR_DEVICE_NAME	"Processor"
 65#define ACPI_PROCESSOR_FILE_INFO	"info"
 66#define ACPI_PROCESSOR_FILE_THROTTLING	"throttling"
 67#define ACPI_PROCESSOR_FILE_LIMIT	"limit"
 68#define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80
 69#define ACPI_PROCESSOR_NOTIFY_POWER	0x81
 70#define ACPI_PROCESSOR_NOTIFY_THROTTLING	0x82
 71
 72#define ACPI_PROCESSOR_LIMIT_USER	0
 73#define ACPI_PROCESSOR_LIMIT_THERMAL	1
 74
 75#define _COMPONENT		ACPI_PROCESSOR_COMPONENT
 76ACPI_MODULE_NAME("processor_driver");
 77
 78MODULE_AUTHOR("Paul Diefenbaugh");
 79MODULE_DESCRIPTION("ACPI Processor Driver");
 80MODULE_LICENSE("GPL");
 81
 82static int acpi_processor_add(struct acpi_device *device);
 83static int acpi_processor_remove(struct acpi_device *device, int type);
 84static void acpi_processor_notify(struct acpi_device *device, u32 event);
 85static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu);
 86static int acpi_processor_handle_eject(struct acpi_processor *pr);
 87
 88
 89static const struct acpi_device_id processor_device_ids[] = {
 90	{ACPI_PROCESSOR_OBJECT_HID, 0},
 91	{"ACPI0007", 0},
 92	{"", 0},
 93};
 94MODULE_DEVICE_TABLE(acpi, processor_device_ids);
 95
 96static struct acpi_driver acpi_processor_driver = {
 97	.name = "processor",
 98	.class = ACPI_PROCESSOR_CLASS,
 99	.ids = processor_device_ids,
100	.ops = {
101		.add = acpi_processor_add,
102		.remove = acpi_processor_remove,
103		.suspend = acpi_processor_suspend,
104		.resume = acpi_processor_resume,
105		.notify = acpi_processor_notify,
106		},
107};
108
109#define INSTALL_NOTIFY_HANDLER		1
110#define UNINSTALL_NOTIFY_HANDLER	2
111
112DEFINE_PER_CPU(struct acpi_processor *, processors);
113EXPORT_PER_CPU_SYMBOL(processors);
114
115struct acpi_processor_errata errata __read_mostly;
116
117/* --------------------------------------------------------------------------
118                                Errata Handling
119   -------------------------------------------------------------------------- */
120
121static int acpi_processor_errata_piix4(struct pci_dev *dev)
122{
123	u8 value1 = 0;
124	u8 value2 = 0;
 
125
126
127	if (!dev)
128		return -EINVAL;
129
130	/*
131	 * Note that 'dev' references the PIIX4 ACPI Controller.
132	 */
133
134	switch (dev->revision) {
135	case 0:
136		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 A-step\n"));
137		break;
138	case 1:
139		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 B-step\n"));
140		break;
141	case 2:
142		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4E\n"));
143		break;
144	case 3:
145		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4M\n"));
146		break;
147	default:
148		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unknown PIIX4\n"));
149		break;
150	}
151
152	switch (dev->revision) {
153
154	case 0:		/* PIIX4 A-step */
155	case 1:		/* PIIX4 B-step */
156		/*
157		 * See specification changes #13 ("Manual Throttle Duty Cycle")
158		 * and #14 ("Enabling and Disabling Manual Throttle"), plus
159		 * erratum #5 ("STPCLK# Deassertion Time") from the January
160		 * 2002 PIIX4 specification update.  Applies to only older
161		 * PIIX4 models.
162		 */
163		errata.piix4.throttle = 1;
164
165	case 2:		/* PIIX4E */
166	case 3:		/* PIIX4M */
167		/*
168		 * See erratum #18 ("C3 Power State/BMIDE and Type-F DMA
169		 * Livelock") from the January 2002 PIIX4 specification update.
170		 * Applies to all PIIX4 models.
171		 */
172
173		/*
174		 * BM-IDE
175		 * ------
176		 * Find the PIIX4 IDE Controller and get the Bus Master IDE
177		 * Status register address.  We'll use this later to read
178		 * each IDE controller's DMA status to make sure we catch all
179		 * DMA activity.
180		 */
181		dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
182				     PCI_DEVICE_ID_INTEL_82371AB,
183				     PCI_ANY_ID, PCI_ANY_ID, NULL);
184		if (dev) {
185			errata.piix4.bmisx = pci_resource_start(dev, 4);
186			pci_dev_put(dev);
187		}
188
189		/*
190		 * Type-F DMA
191		 * ----------
192		 * Find the PIIX4 ISA Controller and read the Motherboard
193		 * DMA controller's status to see if Type-F (Fast) DMA mode
194		 * is enabled (bit 7) on either channel.  Note that we'll
195		 * disable C3 support if this is enabled, as some legacy
196		 * devices won't operate well if fast DMA is disabled.
197		 */
198		dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
199				     PCI_DEVICE_ID_INTEL_82371AB_0,
200				     PCI_ANY_ID, PCI_ANY_ID, NULL);
201		if (dev) {
202			pci_read_config_byte(dev, 0x76, &value1);
203			pci_read_config_byte(dev, 0x77, &value2);
204			if ((value1 & 0x80) || (value2 & 0x80))
205				errata.piix4.fdma = 1;
206			pci_dev_put(dev);
207		}
208
209		break;
210	}
211
212	if (errata.piix4.bmisx)
213		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
214				  "Bus master activity detection (BM-IDE) erratum enabled\n"));
215	if (errata.piix4.fdma)
216		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
217				  "Type-F DMA livelock erratum (C3 disabled)\n"));
218
219	return 0;
220}
221
222static int acpi_processor_errata(struct acpi_processor *pr)
223{
224	int result = 0;
225	struct pci_dev *dev = NULL;
226
227
228	if (!pr)
229		return -EINVAL;
230
231	/*
232	 * PIIX4
233	 */
234	dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
235			     PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID,
236			     PCI_ANY_ID, NULL);
237	if (dev) {
238		result = acpi_processor_errata_piix4(dev);
239		pci_dev_put(dev);
240	}
241
242	return result;
243}
244
245/* --------------------------------------------------------------------------
246                                 Driver Interface
247   -------------------------------------------------------------------------- */
248
249static int acpi_processor_get_info(struct acpi_device *device)
250{
251	acpi_status status = 0;
252	union acpi_object object = { 0 };
253	struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
254	struct acpi_processor *pr;
255	int cpu_index, device_declaration = 0;
256	static int cpu0_initialized;
257
258	pr = acpi_driver_data(device);
259	if (!pr)
260		return -EINVAL;
261
262	if (num_online_cpus() > 1)
263		errata.smp = TRUE;
264
265	acpi_processor_errata(pr);
266
267	/*
268	 * Check to see if we have bus mastering arbitration control.  This
269	 * is required for proper C3 usage (to maintain cache coherency).
270	 */
271	if (acpi_gbl_FADT.pm2_control_block && acpi_gbl_FADT.pm2_control_length) {
272		pr->flags.bm_control = 1;
273		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
274				  "Bus mastering arbitration control present\n"));
275	} else
276		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
277				  "No bus mastering arbitration control\n"));
278
279	if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) {
280		/* Declared with "Processor" statement; match ProcessorID */
281		status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer);
282		if (ACPI_FAILURE(status)) {
283			printk(KERN_ERR PREFIX "Evaluating processor object\n");
284			return -ENODEV;
285		}
286
287		/*
288		 * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP.
289		 *      >>> 'acpi_get_processor_id(acpi_id, &id)' in
290		 *      arch/xxx/acpi.c
291		 */
292		pr->acpi_id = object.processor.proc_id;
293	} else {
294		/*
295		 * Declared with "Device" statement; match _UID.
296		 * Note that we don't handle string _UIDs yet.
297		 */
298		unsigned long long value;
299		status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID,
300						NULL, &value);
301		if (ACPI_FAILURE(status)) {
302			printk(KERN_ERR PREFIX
303			    "Evaluating processor _UID [%#x]\n", status);
304			return -ENODEV;
305		}
306		device_declaration = 1;
307		pr->acpi_id = value;
308	}
309	cpu_index = acpi_get_cpuid(pr->handle, device_declaration, pr->acpi_id);
310
311	/* Handle UP system running SMP kernel, with no LAPIC in MADT */
312	if (!cpu0_initialized && (cpu_index == -1) &&
313	    (num_online_cpus() == 1)) {
314		cpu_index = 0;
315	}
316
317	cpu0_initialized = 1;
318
319	pr->id = cpu_index;
320
321	/*
322	 *  Extra Processor objects may be enumerated on MP systems with
323	 *  less than the max # of CPUs. They should be ignored _iff
324	 *  they are physically not present.
325	 */
326	if (pr->id == -1) {
327		if (ACPI_FAILURE
328		    (acpi_processor_hotadd_init(pr->handle, &pr->id))) {
329			return -ENODEV;
330		}
331	}
332	/*
333	 * On some boxes several processors use the same processor bus id.
334	 * But they are located in different scope. For example:
335	 * \_SB.SCK0.CPU0
336	 * \_SB.SCK1.CPU0
337	 * Rename the processor device bus id. And the new bus id will be
338	 * generated as the following format:
339	 * CPU+CPU ID.
340	 */
341	sprintf(acpi_device_bid(device), "CPU%X", pr->id);
342	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id,
343			  pr->acpi_id));
344
345	if (!object.processor.pblk_address)
346		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n"));
347	else if (object.processor.pblk_length != 6)
348		printk(KERN_ERR PREFIX "Invalid PBLK length [%d]\n",
349			    object.processor.pblk_length);
350	else {
351		pr->throttling.address = object.processor.pblk_address;
352		pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset;
353		pr->throttling.duty_width = acpi_gbl_FADT.duty_width;
354
355		pr->pblk = object.processor.pblk_address;
356
357		/*
358		 * We don't care about error returns - we just try to mark
359		 * these reserved so that nobody else is confused into thinking
360		 * that this region might be unused..
361		 *
362		 * (In particular, allocating the IO range for Cardbus)
363		 */
364		request_region(pr->throttling.address, 6, "ACPI CPU throttle");
365	}
366
367	/*
368	 * If ACPI describes a slot number for this CPU, we can use it
369	 * ensure we get the right value in the "physical id" field
370	 * of /proc/cpuinfo
371	 */
372	status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer);
373	if (ACPI_SUCCESS(status))
374		arch_fix_phys_package_id(pr->id, object.integer.value);
375
376	return 0;
377}
378
379static DEFINE_PER_CPU(void *, processor_device_array);
380
381static void acpi_processor_notify(struct acpi_device *device, u32 event)
382{
383	struct acpi_processor *pr = acpi_driver_data(device);
384	int saved;
385
386	if (!pr)
387		return;
388
389	switch (event) {
390	case ACPI_PROCESSOR_NOTIFY_PERFORMANCE:
391		saved = pr->performance_platform_limit;
392		acpi_processor_ppc_has_changed(pr, 1);
393		if (saved == pr->performance_platform_limit)
394			break;
395		acpi_bus_generate_proc_event(device, event,
396					pr->performance_platform_limit);
397		acpi_bus_generate_netlink_event(device->pnp.device_class,
398						  dev_name(&device->dev), event,
399						  pr->performance_platform_limit);
400		break;
401	case ACPI_PROCESSOR_NOTIFY_POWER:
402		acpi_processor_cst_has_changed(pr);
403		acpi_bus_generate_proc_event(device, event, 0);
404		acpi_bus_generate_netlink_event(device->pnp.device_class,
405						  dev_name(&device->dev), event, 0);
406		break;
407	case ACPI_PROCESSOR_NOTIFY_THROTTLING:
408		acpi_processor_tstate_has_changed(pr);
409		acpi_bus_generate_proc_event(device, event, 0);
410		acpi_bus_generate_netlink_event(device->pnp.device_class,
411						  dev_name(&device->dev), event, 0);
 
412	default:
413		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
414				  "Unsupported event [0x%x]\n", event));
415		break;
416	}
417
418	return;
419}
420
421static int acpi_cpu_soft_notify(struct notifier_block *nfb,
422		unsigned long action, void *hcpu)
 
423{
424	unsigned int cpu = (unsigned long)hcpu;
425	struct acpi_processor *pr = per_cpu(processors, cpu);
 
 
 
 
 
 
 
 
 
 
426
427	if (action == CPU_ONLINE && pr) {
 
 
 
 
 
 
428		acpi_processor_ppc_has_changed(pr, 0);
429		acpi_processor_cst_has_changed(pr);
430		acpi_processor_reevaluate_tstate(pr, action);
431		acpi_processor_tstate_has_changed(pr);
432	}
433	if (action == CPU_DEAD && pr) {
434		/* invalidate the flag.throttling after one CPU is offline */
435		acpi_processor_reevaluate_tstate(pr, action);
436	}
437	return NOTIFY_OK;
438}
439
440static struct notifier_block acpi_cpu_notifier =
441{
442	    .notifier_call = acpi_cpu_soft_notify,
443};
444
445static int __cpuinit acpi_processor_add(struct acpi_device *device)
446{
447	struct acpi_processor *pr = NULL;
448	int result = 0;
449	struct sys_device *sysdev;
450
451	pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL);
452	if (!pr)
453		return -ENOMEM;
454
455	if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) {
456		kfree(pr);
457		return -ENOMEM;
458	}
459
460	pr->handle = device->handle;
461	strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME);
462	strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS);
463	device->driver_data = pr;
464
465	result = acpi_processor_get_info(device);
466	if (result) {
467		/* Processor is physically not present */
468		return 0;
469	}
470
471#ifdef CONFIG_SMP
472	if (pr->id >= setup_max_cpus && pr->id != 0)
473		return 0;
474#endif
475
476	BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0));
 
 
 
 
477
478	/*
479	 * Buggy BIOS check
480	 * ACPI id of processors can be reported wrongly by the BIOS.
481	 * Don't trust it blindly
482	 */
483	if (per_cpu(processor_device_array, pr->id) != NULL &&
484	    per_cpu(processor_device_array, pr->id) != device) {
485		printk(KERN_WARNING "BIOS reported wrong ACPI id "
486			"for the processor\n");
487		result = -ENODEV;
488		goto err_free_cpumask;
489	}
490	per_cpu(processor_device_array, pr->id) = device;
491
492	per_cpu(processors, pr->id) = pr;
493
494	sysdev = get_cpu_sysdev(pr->id);
495	if (sysfs_create_link(&device->dev.kobj, &sysdev->kobj, "sysdev")) {
496		result = -EFAULT;
497		goto err_free_cpumask;
498	}
499
500#ifdef CONFIG_CPU_FREQ
501	acpi_processor_ppc_has_changed(pr, 0);
502#endif
503	acpi_processor_get_throttling_info(pr);
504	acpi_processor_get_limit_info(pr);
505
506
507	if (cpuidle_get_driver() == &acpi_idle_driver)
508		acpi_processor_power_init(pr, device);
509
510	pr->cdev = thermal_cooling_device_register("Processor", device,
511						&processor_cooling_ops);
512	if (IS_ERR(pr->cdev)) {
513		result = PTR_ERR(pr->cdev);
514		goto err_power_exit;
515	}
516
517	dev_dbg(&device->dev, "registered as cooling_device%d\n",
518		 pr->cdev->id);
519
520	result = sysfs_create_link(&device->dev.kobj,
521				   &pr->cdev->device.kobj,
522				   "thermal_cooling");
523	if (result) {
524		printk(KERN_ERR PREFIX "Create sysfs link\n");
 
525		goto err_thermal_unregister;
526	}
 
527	result = sysfs_create_link(&pr->cdev->device.kobj,
528				   &device->dev.kobj,
529				   "device");
530	if (result) {
531		printk(KERN_ERR PREFIX "Create sysfs link\n");
532		goto err_remove_sysfs;
 
533	}
534
535	return 0;
536
537err_remove_sysfs:
538	sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
539err_thermal_unregister:
540	thermal_cooling_device_unregister(pr->cdev);
541err_power_exit:
542	acpi_processor_power_exit(pr, device);
543err_free_cpumask:
544	free_cpumask_var(pr->throttling.shared_cpu_map);
545
546	return result;
547}
548
549static int acpi_processor_remove(struct acpi_device *device, int type)
 
550{
551	struct acpi_processor *pr = NULL;
552
553
554	if (!device || !acpi_driver_data(device))
555		return -EINVAL;
556
557	pr = acpi_driver_data(device);
558
559	if (pr->id >= nr_cpu_ids)
560		goto free;
561
562	if (type == ACPI_BUS_REMOVAL_EJECT) {
563		if (acpi_processor_handle_eject(pr))
564			return -EINVAL;
565	}
566
567	acpi_processor_power_exit(pr, device);
568
569	sysfs_remove_link(&device->dev.kobj, "sysdev");
570
571	if (pr->cdev) {
572		sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
573		sysfs_remove_link(&pr->cdev->device.kobj, "device");
574		thermal_cooling_device_unregister(pr->cdev);
575		pr->cdev = NULL;
576	}
577
578	per_cpu(processors, pr->id) = NULL;
579	per_cpu(processor_device_array, pr->id) = NULL;
580
581free:
582	free_cpumask_var(pr->throttling.shared_cpu_map);
583	kfree(pr);
584
585	return 0;
586}
587
588#ifdef CONFIG_ACPI_HOTPLUG_CPU
589/****************************************************************************
590 * 	Acpi processor hotplug support 				       	    *
591 ****************************************************************************/
592
593static int is_processor_present(acpi_handle handle)
594{
 
595	acpi_status status;
596	unsigned long long sta = 0;
 
 
 
597
 
 
598
599	status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
 
 
600
601	if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT))
602		return 1;
603
604	/*
605	 * _STA is mandatory for a processor that supports hot plug
606	 */
607	if (status == AE_NOT_FOUND)
608		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
609				"Processor does not support hot plug\n"));
610	else
611		ACPI_EXCEPTION((AE_INFO, status,
612				"Processor Device is not present"));
613	return 0;
614}
615
616static
617int acpi_processor_device_add(acpi_handle handle, struct acpi_device **device)
618{
619	acpi_handle phandle;
620	struct acpi_device *pdev;
621
 
 
622
623	if (acpi_get_parent(handle, &phandle)) {
624		return -ENODEV;
625	}
 
626
627	if (acpi_bus_get_device(phandle, &pdev)) {
628		return -ENODEV;
629	}
 
630
631	if (acpi_bus_add(device, pdev, handle, ACPI_BUS_TYPE_PROCESSOR)) {
632		return -ENODEV;
633	}
634
635	return 0;
 
 
 
 
636}
637
638static void acpi_processor_hotplug_notify(acpi_handle handle,
639					  u32 event, void *data)
640{
 
641	struct acpi_processor *pr;
642	struct acpi_device *device = NULL;
643	int result;
644
 
 
645
646	switch (event) {
647	case ACPI_NOTIFY_BUS_CHECK:
648	case ACPI_NOTIFY_DEVICE_CHECK:
649		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
650		"Processor driver received %s event\n",
651		       (event == ACPI_NOTIFY_BUS_CHECK) ?
652		       "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK"));
653
654		if (!is_processor_present(handle))
655			break;
 
 
656
657		if (acpi_bus_get_device(handle, &device)) {
658			result = acpi_processor_device_add(handle, &device);
659			if (result)
660				printk(KERN_ERR PREFIX
661					    "Unable to add the device\n");
662			break;
663		}
664		break;
665	case ACPI_NOTIFY_EJECT_REQUEST:
666		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
667				  "received ACPI_NOTIFY_EJECT_REQUEST\n"));
668
669		if (acpi_bus_get_device(handle, &device)) {
670			printk(KERN_ERR PREFIX
671				    "Device don't exist, dropping EJECT\n");
672			break;
673		}
674		pr = acpi_driver_data(device);
675		if (!pr) {
676			printk(KERN_ERR PREFIX
677				    "Driver data is NULL, dropping EJECT\n");
678			return;
679		}
680		break;
681	default:
682		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
683				  "Unsupported event [0x%x]\n", event));
684		break;
685	}
686
687	return;
688}
689
690static acpi_status
691processor_walk_namespace_cb(acpi_handle handle,
692			    u32 lvl, void *context, void **rv)
693{
694	acpi_status status;
695	int *action = context;
696	acpi_object_type type = 0;
697
698	status = acpi_get_type(handle, &type);
699	if (ACPI_FAILURE(status))
700		return (AE_OK);
701
702	if (type != ACPI_TYPE_PROCESSOR)
703		return (AE_OK);
704
705	switch (*action) {
706	case INSTALL_NOTIFY_HANDLER:
707		acpi_install_notify_handler(handle,
708					    ACPI_SYSTEM_NOTIFY,
709					    acpi_processor_hotplug_notify,
710					    NULL);
711		break;
712	case UNINSTALL_NOTIFY_HANDLER:
713		acpi_remove_notify_handler(handle,
714					   ACPI_SYSTEM_NOTIFY,
715					   acpi_processor_hotplug_notify);
716		break;
717	default:
718		break;
719	}
720
721	return (AE_OK);
722}
723
724static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu)
725{
 
726
727	if (!is_processor_present(handle)) {
728		return AE_ERROR;
 
 
 
 
729	}
730
731	if (acpi_map_lsapic(handle, p_cpu))
732		return AE_ERROR;
733
734	if (arch_register_cpu(*p_cpu)) {
735		acpi_unmap_lsapic(*p_cpu);
736		return AE_ERROR;
737	}
738
739	return AE_OK;
740}
741
742static int acpi_processor_handle_eject(struct acpi_processor *pr)
743{
744	if (cpu_online(pr->id))
745		cpu_down(pr->id);
746
747	arch_unregister_cpu(pr->id);
748	acpi_unmap_lsapic(pr->id);
749	return (0);
750}
751#else
752static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu)
753{
754	return AE_ERROR;
755}
756static int acpi_processor_handle_eject(struct acpi_processor *pr)
757{
758	return (-EINVAL);
759}
760#endif
761
762static
763void acpi_processor_install_hotplug_notify(void)
764{
765#ifdef CONFIG_ACPI_HOTPLUG_CPU
766	int action = INSTALL_NOTIFY_HANDLER;
767	acpi_walk_namespace(ACPI_TYPE_PROCESSOR,
768			    ACPI_ROOT_OBJECT,
769			    ACPI_UINT32_MAX,
770			    processor_walk_namespace_cb, NULL, &action, NULL);
771#endif
772	register_hotcpu_notifier(&acpi_cpu_notifier);
773}
774
775static
776void acpi_processor_uninstall_hotplug_notify(void)
777{
778#ifdef CONFIG_ACPI_HOTPLUG_CPU
779	int action = UNINSTALL_NOTIFY_HANDLER;
780	acpi_walk_namespace(ACPI_TYPE_PROCESSOR,
781			    ACPI_ROOT_OBJECT,
782			    ACPI_UINT32_MAX,
783			    processor_walk_namespace_cb, NULL, &action, NULL);
784#endif
785	unregister_hotcpu_notifier(&acpi_cpu_notifier);
786}
787
788/*
789 * We keep the driver loaded even when ACPI is not running.
790 * This is needed for the powernow-k8 driver, that works even without
791 * ACPI, but needs symbols from this driver
792 */
793
794static int __init acpi_processor_init(void)
795{
796	int result = 0;
797
798	if (acpi_disabled)
799		return 0;
800
801	memset(&errata, 0, sizeof(errata));
 
 
802
803	if (!cpuidle_register_driver(&acpi_idle_driver)) {
804		printk(KERN_DEBUG "ACPI: %s registered with cpuidle\n",
805			acpi_idle_driver.name);
806	} else {
807		printk(KERN_DEBUG "ACPI: acpi_idle yielding to %s\n",
808			cpuidle_get_driver()->name);
 
 
 
 
 
 
 
809	}
810
811	result = acpi_bus_register_driver(&acpi_processor_driver);
812	if (result < 0)
813		goto out_cpuidle;
814
815	acpi_processor_install_hotplug_notify();
816
817	acpi_thermal_cpufreq_init();
818
819	acpi_processor_ppc_init();
820
821	acpi_processor_throttling_init();
822
823	return 0;
824
825out_cpuidle:
826	cpuidle_unregister_driver(&acpi_idle_driver);
827
828	return result;
829}
830
831static void __exit acpi_processor_exit(void)
832{
833	if (acpi_disabled)
834		return;
835
836	acpi_processor_ppc_exit();
837
838	acpi_thermal_cpufreq_exit();
839
840	acpi_processor_uninstall_hotplug_notify();
841
842	acpi_bus_unregister_driver(&acpi_processor_driver);
843
844	cpuidle_unregister_driver(&acpi_idle_driver);
845
846	return;
847}
848
849module_init(acpi_processor_init);
850module_exit(acpi_processor_exit);
851
852MODULE_ALIAS("processor");