diff options
-rw-r--r-- | drivers/acpi/Makefile | 1 | ||||
-rw-r--r-- | drivers/acpi/acpi_processor.c | 484 | ||||
-rw-r--r-- | drivers/acpi/glue.c | 6 | ||||
-rw-r--r-- | drivers/acpi/internal.h | 3 | ||||
-rw-r--r-- | drivers/acpi/processor_driver.c | 807 | ||||
-rw-r--r-- | drivers/acpi/scan.c | 1 | ||||
-rw-r--r-- | drivers/base/cpu.c | 11 | ||||
-rw-r--r-- | include/acpi/processor.h | 5 |
8 files changed, 587 insertions, 731 deletions
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile index ecb743bf05a5..93e49bde31ba 100644 --- a/drivers/acpi/Makefile +++ b/drivers/acpi/Makefile | |||
@@ -34,6 +34,7 @@ acpi-$(CONFIG_ACPI_SLEEP) += proc.o | |||
34 | acpi-y += bus.o glue.o | 34 | acpi-y += bus.o glue.o |
35 | acpi-y += scan.o | 35 | acpi-y += scan.o |
36 | acpi-y += resource.o | 36 | acpi-y += resource.o |
37 | acpi-y += acpi_processor.o | ||
37 | acpi-y += processor_core.o | 38 | acpi-y += processor_core.o |
38 | acpi-y += ec.o | 39 | acpi-y += ec.o |
39 | acpi-$(CONFIG_ACPI_DOCK) += dock.o | 40 | acpi-$(CONFIG_ACPI_DOCK) += dock.o |
diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c new file mode 100644 index 000000000000..587d2af4b323 --- /dev/null +++ b/drivers/acpi/acpi_processor.c | |||
@@ -0,0 +1,484 @@ | |||
1 | /* | ||
2 | * acpi_processor.c - ACPI processor enumeration support | ||
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 | * Copyright (C) 2013, Intel Corporation | ||
9 | * Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify it | ||
12 | * under the terms of the GNU General Public License version 2 as published | ||
13 | * by the Free Software Foundation. | ||
14 | */ | ||
15 | |||
16 | #include <linux/acpi.h> | ||
17 | #include <linux/device.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/pci.h> | ||
21 | |||
22 | #include <acpi/processor.h> | ||
23 | |||
24 | #include <asm/cpu.h> | ||
25 | |||
26 | #include "internal.h" | ||
27 | |||
28 | #define _COMPONENT ACPI_PROCESSOR_COMPONENT | ||
29 | |||
30 | ACPI_MODULE_NAME("processor"); | ||
31 | |||
32 | /* -------------------------------------------------------------------------- | ||
33 | Errata Handling | ||
34 | -------------------------------------------------------------------------- */ | ||
35 | |||
36 | struct acpi_processor_errata errata __read_mostly; | ||
37 | EXPORT_SYMBOL_GPL(errata); | ||
38 | |||
39 | static int acpi_processor_errata_piix4(struct pci_dev *dev) | ||
40 | { | ||
41 | u8 value1 = 0; | ||
42 | u8 value2 = 0; | ||
43 | |||
44 | |||
45 | if (!dev) | ||
46 | return -EINVAL; | ||
47 | |||
48 | /* | ||
49 | * Note that 'dev' references the PIIX4 ACPI Controller. | ||
50 | */ | ||
51 | |||
52 | switch (dev->revision) { | ||
53 | case 0: | ||
54 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 A-step\n")); | ||
55 | break; | ||
56 | case 1: | ||
57 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 B-step\n")); | ||
58 | break; | ||
59 | case 2: | ||
60 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4E\n")); | ||
61 | break; | ||
62 | case 3: | ||
63 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4M\n")); | ||
64 | break; | ||
65 | default: | ||
66 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unknown PIIX4\n")); | ||
67 | break; | ||
68 | } | ||
69 | |||
70 | switch (dev->revision) { | ||
71 | |||
72 | case 0: /* PIIX4 A-step */ | ||
73 | case 1: /* PIIX4 B-step */ | ||
74 | /* | ||
75 | * See specification changes #13 ("Manual Throttle Duty Cycle") | ||
76 | * and #14 ("Enabling and Disabling Manual Throttle"), plus | ||
77 | * erratum #5 ("STPCLK# Deassertion Time") from the January | ||
78 | * 2002 PIIX4 specification update. Applies to only older | ||
79 | * PIIX4 models. | ||
80 | */ | ||
81 | errata.piix4.throttle = 1; | ||
82 | |||
83 | case 2: /* PIIX4E */ | ||
84 | case 3: /* PIIX4M */ | ||
85 | /* | ||
86 | * See erratum #18 ("C3 Power State/BMIDE and Type-F DMA | ||
87 | * Livelock") from the January 2002 PIIX4 specification update. | ||
88 | * Applies to all PIIX4 models. | ||
89 | */ | ||
90 | |||
91 | /* | ||
92 | * BM-IDE | ||
93 | * ------ | ||
94 | * Find the PIIX4 IDE Controller and get the Bus Master IDE | ||
95 | * Status register address. We'll use this later to read | ||
96 | * each IDE controller's DMA status to make sure we catch all | ||
97 | * DMA activity. | ||
98 | */ | ||
99 | dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | ||
100 | PCI_DEVICE_ID_INTEL_82371AB, | ||
101 | PCI_ANY_ID, PCI_ANY_ID, NULL); | ||
102 | if (dev) { | ||
103 | errata.piix4.bmisx = pci_resource_start(dev, 4); | ||
104 | pci_dev_put(dev); | ||
105 | } | ||
106 | |||
107 | /* | ||
108 | * Type-F DMA | ||
109 | * ---------- | ||
110 | * Find the PIIX4 ISA Controller and read the Motherboard | ||
111 | * DMA controller's status to see if Type-F (Fast) DMA mode | ||
112 | * is enabled (bit 7) on either channel. Note that we'll | ||
113 | * disable C3 support if this is enabled, as some legacy | ||
114 | * devices won't operate well if fast DMA is disabled. | ||
115 | */ | ||
116 | dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | ||
117 | PCI_DEVICE_ID_INTEL_82371AB_0, | ||
118 | PCI_ANY_ID, PCI_ANY_ID, NULL); | ||
119 | if (dev) { | ||
120 | pci_read_config_byte(dev, 0x76, &value1); | ||
121 | pci_read_config_byte(dev, 0x77, &value2); | ||
122 | if ((value1 & 0x80) || (value2 & 0x80)) | ||
123 | errata.piix4.fdma = 1; | ||
124 | pci_dev_put(dev); | ||
125 | } | ||
126 | |||
127 | break; | ||
128 | } | ||
129 | |||
130 | if (errata.piix4.bmisx) | ||
131 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
132 | "Bus master activity detection (BM-IDE) erratum enabled\n")); | ||
133 | if (errata.piix4.fdma) | ||
134 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
135 | "Type-F DMA livelock erratum (C3 disabled)\n")); | ||
136 | |||
137 | return 0; | ||
138 | } | ||
139 | |||
140 | static int acpi_processor_errata(struct acpi_processor *pr) | ||
141 | { | ||
142 | int result = 0; | ||
143 | struct pci_dev *dev = NULL; | ||
144 | |||
145 | |||
146 | if (!pr) | ||
147 | return -EINVAL; | ||
148 | |||
149 | /* | ||
150 | * PIIX4 | ||
151 | */ | ||
152 | dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | ||
153 | PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID, | ||
154 | PCI_ANY_ID, NULL); | ||
155 | if (dev) { | ||
156 | result = acpi_processor_errata_piix4(dev); | ||
157 | pci_dev_put(dev); | ||
158 | } | ||
159 | |||
160 | return result; | ||
161 | } | ||
162 | |||
163 | /* -------------------------------------------------------------------------- | ||
164 | Initialization | ||
165 | -------------------------------------------------------------------------- */ | ||
166 | |||
167 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
168 | static int acpi_processor_hotadd_init(struct acpi_processor *pr) | ||
169 | { | ||
170 | unsigned long long sta; | ||
171 | acpi_status status; | ||
172 | int ret; | ||
173 | |||
174 | status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta); | ||
175 | if (ACPI_FAILURE(status) || !(sta & ACPI_STA_DEVICE_PRESENT)) | ||
176 | return -ENODEV; | ||
177 | |||
178 | ret = acpi_map_lsapic(pr->handle, &pr->id); | ||
179 | if (ret) | ||
180 | return ret; | ||
181 | |||
182 | ret = arch_register_cpu(pr->id); | ||
183 | if (ret) { | ||
184 | acpi_unmap_lsapic(pr->id); | ||
185 | return ret; | ||
186 | } | ||
187 | |||
188 | /* | ||
189 | * CPU got hot-added, but cpu_data is not initialized yet. Set a flag | ||
190 | * to delay cpu_idle/throttling initialization and do it when the CPU | ||
191 | * gets online for the first time. | ||
192 | */ | ||
193 | pr_info("CPU%d has been hot-added\n", pr->id); | ||
194 | pr->flags.need_hotplug_init = 1; | ||
195 | return 0; | ||
196 | } | ||
197 | #else | ||
198 | static inline int acpi_processor_hotadd_init(struct acpi_processor *pr) | ||
199 | { | ||
200 | return -ENODEV; | ||
201 | } | ||
202 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ | ||
203 | |||
204 | static int acpi_processor_get_info(struct acpi_device *device) | ||
205 | { | ||
206 | union acpi_object object = { 0 }; | ||
207 | struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; | ||
208 | struct acpi_processor *pr = acpi_driver_data(device); | ||
209 | int cpu_index, device_declaration = 0; | ||
210 | acpi_status status = AE_OK; | ||
211 | static int cpu0_initialized; | ||
212 | |||
213 | if (num_online_cpus() > 1) | ||
214 | errata.smp = TRUE; | ||
215 | |||
216 | acpi_processor_errata(pr); | ||
217 | |||
218 | /* | ||
219 | * Check to see if we have bus mastering arbitration control. This | ||
220 | * is required for proper C3 usage (to maintain cache coherency). | ||
221 | */ | ||
222 | if (acpi_gbl_FADT.pm2_control_block && acpi_gbl_FADT.pm2_control_length) { | ||
223 | pr->flags.bm_control = 1; | ||
224 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
225 | "Bus mastering arbitration control present\n")); | ||
226 | } else | ||
227 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
228 | "No bus mastering arbitration control\n")); | ||
229 | |||
230 | if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) { | ||
231 | /* Declared with "Processor" statement; match ProcessorID */ | ||
232 | status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer); | ||
233 | if (ACPI_FAILURE(status)) { | ||
234 | dev_err(&device->dev, | ||
235 | "Failed to evaluate processor object (0x%x)\n", | ||
236 | status); | ||
237 | return -ENODEV; | ||
238 | } | ||
239 | |||
240 | /* | ||
241 | * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP. | ||
242 | * >>> 'acpi_get_processor_id(acpi_id, &id)' in | ||
243 | * arch/xxx/acpi.c | ||
244 | */ | ||
245 | pr->acpi_id = object.processor.proc_id; | ||
246 | } else { | ||
247 | /* | ||
248 | * Declared with "Device" statement; match _UID. | ||
249 | * Note that we don't handle string _UIDs yet. | ||
250 | */ | ||
251 | unsigned long long value; | ||
252 | status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, | ||
253 | NULL, &value); | ||
254 | if (ACPI_FAILURE(status)) { | ||
255 | dev_err(&device->dev, | ||
256 | "Failed to evaluate processor _UID (0x%x)\n", | ||
257 | status); | ||
258 | return -ENODEV; | ||
259 | } | ||
260 | device_declaration = 1; | ||
261 | pr->acpi_id = value; | ||
262 | } | ||
263 | cpu_index = acpi_get_cpuid(pr->handle, device_declaration, pr->acpi_id); | ||
264 | |||
265 | /* Handle UP system running SMP kernel, with no LAPIC in MADT */ | ||
266 | if (!cpu0_initialized && (cpu_index == -1) && | ||
267 | (num_online_cpus() == 1)) { | ||
268 | cpu_index = 0; | ||
269 | } | ||
270 | |||
271 | cpu0_initialized = 1; | ||
272 | |||
273 | pr->id = cpu_index; | ||
274 | |||
275 | /* | ||
276 | * Extra Processor objects may be enumerated on MP systems with | ||
277 | * less than the max # of CPUs. They should be ignored _iff | ||
278 | * they are physically not present. | ||
279 | */ | ||
280 | if (pr->id == -1) { | ||
281 | int ret = acpi_processor_hotadd_init(pr); | ||
282 | if (ret) | ||
283 | return ret; | ||
284 | } | ||
285 | /* | ||
286 | * On some boxes several processors use the same processor bus id. | ||
287 | * But they are located in different scope. For example: | ||
288 | * \_SB.SCK0.CPU0 | ||
289 | * \_SB.SCK1.CPU0 | ||
290 | * Rename the processor device bus id. And the new bus id will be | ||
291 | * generated as the following format: | ||
292 | * CPU+CPU ID. | ||
293 | */ | ||
294 | sprintf(acpi_device_bid(device), "CPU%X", pr->id); | ||
295 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id, | ||
296 | pr->acpi_id)); | ||
297 | |||
298 | if (!object.processor.pblk_address) | ||
299 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n")); | ||
300 | else if (object.processor.pblk_length != 6) | ||
301 | dev_err(&device->dev, "Invalid PBLK length [%d]\n", | ||
302 | object.processor.pblk_length); | ||
303 | else { | ||
304 | pr->throttling.address = object.processor.pblk_address; | ||
305 | pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset; | ||
306 | pr->throttling.duty_width = acpi_gbl_FADT.duty_width; | ||
307 | |||
308 | pr->pblk = object.processor.pblk_address; | ||
309 | |||
310 | /* | ||
311 | * We don't care about error returns - we just try to mark | ||
312 | * these reserved so that nobody else is confused into thinking | ||
313 | * that this region might be unused.. | ||
314 | * | ||
315 | * (In particular, allocating the IO range for Cardbus) | ||
316 | */ | ||
317 | request_region(pr->throttling.address, 6, "ACPI CPU throttle"); | ||
318 | } | ||
319 | |||
320 | /* | ||
321 | * If ACPI describes a slot number for this CPU, we can use it to | ||
322 | * ensure we get the right value in the "physical id" field | ||
323 | * of /proc/cpuinfo | ||
324 | */ | ||
325 | status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer); | ||
326 | if (ACPI_SUCCESS(status)) | ||
327 | arch_fix_phys_package_id(pr->id, object.integer.value); | ||
328 | |||
329 | return 0; | ||
330 | } | ||
331 | |||
332 | /* | ||
333 | * Do not put anything in here which needs the core to be online. | ||
334 | * For example MSR access or setting up things which check for cpuinfo_x86 | ||
335 | * (cpu_data(cpu)) values, like CPU feature flags, family, model, etc. | ||
336 | * Such things have to be put in and set up by the processor driver's .probe(). | ||
337 | */ | ||
338 | static DEFINE_PER_CPU(void *, processor_device_array); | ||
339 | |||
340 | static int __cpuinit acpi_processor_add(struct acpi_device *device, | ||
341 | const struct acpi_device_id *id) | ||
342 | { | ||
343 | struct acpi_processor *pr; | ||
344 | struct device *dev; | ||
345 | int result = 0; | ||
346 | |||
347 | pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL); | ||
348 | if (!pr) | ||
349 | return -ENOMEM; | ||
350 | |||
351 | if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) { | ||
352 | result = -ENOMEM; | ||
353 | goto err_free_pr; | ||
354 | } | ||
355 | |||
356 | pr->handle = device->handle; | ||
357 | strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); | ||
358 | strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); | ||
359 | device->driver_data = pr; | ||
360 | |||
361 | result = acpi_processor_get_info(device); | ||
362 | if (result) /* Processor is not physically present or unavailable */ | ||
363 | return 0; | ||
364 | |||
365 | #ifdef CONFIG_SMP | ||
366 | if (pr->id >= setup_max_cpus && pr->id != 0) | ||
367 | return 0; | ||
368 | #endif | ||
369 | |||
370 | BUG_ON(pr->id >= nr_cpu_ids); | ||
371 | |||
372 | /* | ||
373 | * Buggy BIOS check. | ||
374 | * ACPI id of processors can be reported wrongly by the BIOS. | ||
375 | * Don't trust it blindly | ||
376 | */ | ||
377 | if (per_cpu(processor_device_array, pr->id) != NULL && | ||
378 | per_cpu(processor_device_array, pr->id) != device) { | ||
379 | dev_warn(&device->dev, | ||
380 | "BIOS reported wrong ACPI id %d for the processor\n", | ||
381 | pr->id); | ||
382 | /* Give up, but do not abort the namespace scan. */ | ||
383 | goto err; | ||
384 | } | ||
385 | /* | ||
386 | * processor_device_array is not cleared on errors to allow buggy BIOS | ||
387 | * checks. | ||
388 | */ | ||
389 | per_cpu(processor_device_array, pr->id) = device; | ||
390 | |||
391 | dev = get_cpu_device(pr->id); | ||
392 | ACPI_HANDLE_SET(dev, pr->handle); | ||
393 | result = acpi_bind_one(dev, NULL); | ||
394 | if (result) | ||
395 | goto err; | ||
396 | |||
397 | pr->dev = dev; | ||
398 | dev->offline = pr->flags.need_hotplug_init; | ||
399 | |||
400 | /* Trigger the processor driver's .probe() if present. */ | ||
401 | if (device_attach(dev) >= 0) | ||
402 | return 1; | ||
403 | |||
404 | dev_err(dev, "Processor driver could not be attached\n"); | ||
405 | acpi_unbind_one(dev); | ||
406 | |||
407 | err: | ||
408 | free_cpumask_var(pr->throttling.shared_cpu_map); | ||
409 | device->driver_data = NULL; | ||
410 | err_free_pr: | ||
411 | kfree(pr); | ||
412 | return result; | ||
413 | } | ||
414 | |||
415 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
416 | /* -------------------------------------------------------------------------- | ||
417 | Removal | ||
418 | -------------------------------------------------------------------------- */ | ||
419 | |||
420 | static void acpi_processor_remove(struct acpi_device *device) | ||
421 | { | ||
422 | struct acpi_processor *pr; | ||
423 | |||
424 | if (!device || !acpi_driver_data(device)) | ||
425 | return; | ||
426 | |||
427 | pr = acpi_driver_data(device); | ||
428 | if (pr->id >= nr_cpu_ids) | ||
429 | goto out; | ||
430 | |||
431 | /* | ||
432 | * The only reason why we ever get here is CPU hot-removal. The CPU is | ||
433 | * already offline and the ACPI device removal locking prevents it from | ||
434 | * being put back online at this point. | ||
435 | * | ||
436 | * Unbind the driver from the processor device and detach it from the | ||
437 | * ACPI companion object. | ||
438 | */ | ||
439 | device_release_driver(pr->dev); | ||
440 | acpi_unbind_one(pr->dev); | ||
441 | |||
442 | /* Clean up. */ | ||
443 | per_cpu(processor_device_array, pr->id) = NULL; | ||
444 | try_offline_node(cpu_to_node(pr->id)); | ||
445 | |||
446 | /* Remove the CPU. */ | ||
447 | get_online_cpus(); | ||
448 | arch_unregister_cpu(pr->id); | ||
449 | acpi_unmap_lsapic(pr->id); | ||
450 | put_online_cpus(); | ||
451 | |||
452 | out: | ||
453 | free_cpumask_var(pr->throttling.shared_cpu_map); | ||
454 | kfree(pr); | ||
455 | } | ||
456 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ | ||
457 | |||
458 | /* | ||
459 | * The following ACPI IDs are known to be suitable for representing as | ||
460 | * processor devices. | ||
461 | */ | ||
462 | static const struct acpi_device_id processor_device_ids[] = { | ||
463 | |||
464 | { ACPI_PROCESSOR_OBJECT_HID, }, | ||
465 | { ACPI_PROCESSOR_DEVICE_HID, }, | ||
466 | |||
467 | { } | ||
468 | }; | ||
469 | |||
470 | static struct acpi_scan_handler __refdata processor_handler = { | ||
471 | .ids = processor_device_ids, | ||
472 | .attach = acpi_processor_add, | ||
473 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
474 | .detach = acpi_processor_remove, | ||
475 | #endif | ||
476 | .hotplug = { | ||
477 | .enabled = true, | ||
478 | }, | ||
479 | }; | ||
480 | |||
481 | void __init acpi_processor_init(void) | ||
482 | { | ||
483 | acpi_scan_add_handler_with_hotplug(&processor_handler, "processor"); | ||
484 | } | ||
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 40a84cc6740c..9783f400d857 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
@@ -105,7 +105,7 @@ acpi_handle acpi_get_child(acpi_handle parent, u64 address) | |||
105 | } | 105 | } |
106 | EXPORT_SYMBOL(acpi_get_child); | 106 | EXPORT_SYMBOL(acpi_get_child); |
107 | 107 | ||
108 | static int acpi_bind_one(struct device *dev, acpi_handle handle) | 108 | int acpi_bind_one(struct device *dev, acpi_handle handle) |
109 | { | 109 | { |
110 | struct acpi_device *acpi_dev; | 110 | struct acpi_device *acpi_dev; |
111 | acpi_status status; | 111 | acpi_status status; |
@@ -188,8 +188,9 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
188 | kfree(physical_node); | 188 | kfree(physical_node); |
189 | goto err; | 189 | goto err; |
190 | } | 190 | } |
191 | EXPORT_SYMBOL_GPL(acpi_bind_one); | ||
191 | 192 | ||
192 | static int acpi_unbind_one(struct device *dev) | 193 | int acpi_unbind_one(struct device *dev) |
193 | { | 194 | { |
194 | struct acpi_device_physical_node *entry; | 195 | struct acpi_device_physical_node *entry; |
195 | struct acpi_device *acpi_dev; | 196 | struct acpi_device *acpi_dev; |
@@ -238,6 +239,7 @@ err: | |||
238 | dev_err(dev, "Oops, 'acpi_handle' corrupt\n"); | 239 | dev_err(dev, "Oops, 'acpi_handle' corrupt\n"); |
239 | return -EINVAL; | 240 | return -EINVAL; |
240 | } | 241 | } |
242 | EXPORT_SYMBOL_GPL(acpi_unbind_one); | ||
241 | 243 | ||
242 | static int acpi_platform_notify(struct device *dev) | 244 | static int acpi_platform_notify(struct device *dev) |
243 | { | 245 | { |
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h index 4548f0a114ce..bf792595132c 100644 --- a/drivers/acpi/internal.h +++ b/drivers/acpi/internal.h | |||
@@ -33,6 +33,7 @@ static inline void acpi_pci_slot_init(void) { } | |||
33 | void acpi_pci_root_init(void); | 33 | void acpi_pci_root_init(void); |
34 | void acpi_pci_link_init(void); | 34 | void acpi_pci_link_init(void); |
35 | void acpi_pci_root_hp_init(void); | 35 | void acpi_pci_root_hp_init(void); |
36 | void acpi_processor_init(void); | ||
36 | void acpi_platform_init(void); | 37 | void acpi_platform_init(void); |
37 | int acpi_sysfs_init(void); | 38 | int acpi_sysfs_init(void); |
38 | void acpi_csrt_init(void); | 39 | void acpi_csrt_init(void); |
@@ -79,6 +80,8 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, | |||
79 | int type, unsigned long long sta); | 80 | int type, unsigned long long sta); |
80 | void acpi_device_add_finalize(struct acpi_device *device); | 81 | void acpi_device_add_finalize(struct acpi_device *device); |
81 | void acpi_free_pnp_ids(struct acpi_device_pnp *pnp); | 82 | void acpi_free_pnp_ids(struct acpi_device_pnp *pnp); |
83 | int acpi_bind_one(struct device *dev, acpi_handle handle); | ||
84 | int acpi_unbind_one(struct device *dev); | ||
82 | 85 | ||
83 | /* -------------------------------------------------------------------------- | 86 | /* -------------------------------------------------------------------------- |
84 | Power Resource | 87 | Power Resource |
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index c266cdc11784..ac28f18823b3 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c | |||
@@ -1,11 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * acpi_processor.c - ACPI Processor Driver ($Revision: 71 $) | 2 | * processor_driver.c - ACPI Processor Driver |
3 | * | 3 | * |
4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> | 4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> |
5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> | 5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> |
6 | * Copyright (C) 2004 Dominik Brodowski <linux@brodo.de> | 6 | * Copyright (C) 2004 Dominik Brodowski <linux@brodo.de> |
7 | * Copyright (C) 2004 Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> | 7 | * Copyright (C) 2004 Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> |
8 | * - Added processor hotplug support | 8 | * - Added processor hotplug support |
9 | * Copyright (C) 2013, Intel Corporation | ||
10 | * Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||
9 | * | 11 | * |
10 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 12 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
11 | * | 13 | * |
@@ -24,52 +26,29 @@ | |||
24 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | 26 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
25 | * | 27 | * |
26 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 28 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
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 | */ | 29 | */ |
34 | 30 | ||
35 | #include <linux/kernel.h> | 31 | #include <linux/kernel.h> |
36 | #include <linux/module.h> | 32 | #include <linux/module.h> |
37 | #include <linux/init.h> | 33 | #include <linux/init.h> |
38 | #include <linux/types.h> | ||
39 | #include <linux/pci.h> | ||
40 | #include <linux/pm.h> | ||
41 | #include <linux/cpufreq.h> | 34 | #include <linux/cpufreq.h> |
42 | #include <linux/cpu.h> | 35 | #include <linux/cpu.h> |
43 | #include <linux/dmi.h> | ||
44 | #include <linux/moduleparam.h> | ||
45 | #include <linux/cpuidle.h> | 36 | #include <linux/cpuidle.h> |
46 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
47 | #include <linux/acpi.h> | 38 | #include <linux/acpi.h> |
48 | #include <linux/memory_hotplug.h> | 39 | |
49 | |||
50 | #include <asm/io.h> | ||
51 | #include <asm/cpu.h> | ||
52 | #include <asm/delay.h> | ||
53 | #include <asm/uaccess.h> | ||
54 | #include <asm/processor.h> | ||
55 | #include <asm/smp.h> | ||
56 | #include <asm/acpi.h> | ||
57 | |||
58 | #include <acpi/acpi_bus.h> | ||
59 | #include <acpi/acpi_drivers.h> | ||
60 | #include <acpi/processor.h> | 40 | #include <acpi/processor.h> |
61 | 41 | ||
42 | #include "internal.h" | ||
43 | |||
62 | #define PREFIX "ACPI: " | 44 | #define PREFIX "ACPI: " |
63 | 45 | ||
64 | #define ACPI_PROCESSOR_CLASS "processor" | ||
65 | #define ACPI_PROCESSOR_DEVICE_NAME "Processor" | ||
66 | #define ACPI_PROCESSOR_FILE_INFO "info" | 46 | #define ACPI_PROCESSOR_FILE_INFO "info" |
67 | #define ACPI_PROCESSOR_FILE_THROTTLING "throttling" | 47 | #define ACPI_PROCESSOR_FILE_THROTTLING "throttling" |
68 | #define ACPI_PROCESSOR_FILE_LIMIT "limit" | 48 | #define ACPI_PROCESSOR_FILE_LIMIT "limit" |
69 | #define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80 | 49 | #define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80 |
70 | #define ACPI_PROCESSOR_NOTIFY_POWER 0x81 | 50 | #define ACPI_PROCESSOR_NOTIFY_POWER 0x81 |
71 | #define ACPI_PROCESSOR_NOTIFY_THROTTLING 0x82 | 51 | #define ACPI_PROCESSOR_NOTIFY_THROTTLING 0x82 |
72 | #define ACPI_PROCESSOR_DEVICE_HID "ACPI0007" | ||
73 | 52 | ||
74 | #define ACPI_PROCESSOR_LIMIT_USER 0 | 53 | #define ACPI_PROCESSOR_LIMIT_USER 0 |
75 | #define ACPI_PROCESSOR_LIMIT_THERMAL 1 | 54 | #define ACPI_PROCESSOR_LIMIT_THERMAL 1 |
@@ -81,12 +60,8 @@ MODULE_AUTHOR("Paul Diefenbaugh"); | |||
81 | MODULE_DESCRIPTION("ACPI Processor Driver"); | 60 | MODULE_DESCRIPTION("ACPI Processor Driver"); |
82 | MODULE_LICENSE("GPL"); | 61 | MODULE_LICENSE("GPL"); |
83 | 62 | ||
84 | static int acpi_processor_add(struct acpi_device *device); | 63 | static int acpi_processor_start(struct device *dev); |
85 | static int acpi_processor_remove(struct acpi_device *device); | 64 | static int acpi_processor_stop(struct device *dev); |
86 | static void acpi_processor_notify(struct acpi_device *device, u32 event); | ||
87 | static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr); | ||
88 | static int acpi_processor_handle_eject(struct acpi_processor *pr); | ||
89 | static int acpi_processor_start(struct acpi_processor *pr); | ||
90 | 65 | ||
91 | static const struct acpi_device_id processor_device_ids[] = { | 66 | static const struct acpi_device_id processor_device_ids[] = { |
92 | {ACPI_PROCESSOR_OBJECT_HID, 0}, | 67 | {ACPI_PROCESSOR_OBJECT_HID, 0}, |
@@ -95,295 +70,27 @@ static const struct acpi_device_id processor_device_ids[] = { | |||
95 | }; | 70 | }; |
96 | MODULE_DEVICE_TABLE(acpi, processor_device_ids); | 71 | MODULE_DEVICE_TABLE(acpi, processor_device_ids); |
97 | 72 | ||
98 | static struct acpi_driver acpi_processor_driver = { | 73 | static struct device_driver acpi_processor_driver = { |
99 | .name = "processor", | 74 | .name = "processor", |
100 | .class = ACPI_PROCESSOR_CLASS, | 75 | .bus = &cpu_subsys, |
101 | .ids = processor_device_ids, | 76 | .acpi_match_table = processor_device_ids, |
102 | .ops = { | 77 | .probe = acpi_processor_start, |
103 | .add = acpi_processor_add, | 78 | .remove = acpi_processor_stop, |
104 | .remove = acpi_processor_remove, | ||
105 | .notify = acpi_processor_notify, | ||
106 | }, | ||
107 | }; | 79 | }; |
108 | 80 | ||
109 | #define INSTALL_NOTIFY_HANDLER 1 | ||
110 | #define UNINSTALL_NOTIFY_HANDLER 2 | ||
111 | |||
112 | DEFINE_PER_CPU(struct acpi_processor *, processors); | 81 | DEFINE_PER_CPU(struct acpi_processor *, processors); |
113 | EXPORT_PER_CPU_SYMBOL(processors); | 82 | EXPORT_PER_CPU_SYMBOL(processors); |
114 | 83 | ||
115 | struct acpi_processor_errata errata __read_mostly; | 84 | static void acpi_processor_notify(acpi_handle handle, u32 event, void *data) |
116 | |||
117 | /* -------------------------------------------------------------------------- | ||
118 | Errata Handling | ||
119 | -------------------------------------------------------------------------- */ | ||
120 | |||
121 | static int acpi_processor_errata_piix4(struct pci_dev *dev) | ||
122 | { | 85 | { |
123 | u8 value1 = 0; | 86 | struct acpi_device *device = data; |
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 | |||
222 | static 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 | |||
249 | static 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; | 87 | 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 | dev_err(&device->dev, | ||
284 | "Failed to evaluate processor object (0x%x)\n", | ||
285 | status); | ||
286 | return -ENODEV; | ||
287 | } | ||
288 | |||
289 | /* | ||
290 | * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP. | ||
291 | * >>> 'acpi_get_processor_id(acpi_id, &id)' in | ||
292 | * arch/xxx/acpi.c | ||
293 | */ | ||
294 | pr->acpi_id = object.processor.proc_id; | ||
295 | } else { | ||
296 | /* | ||
297 | * Declared with "Device" statement; match _UID. | ||
298 | * Note that we don't handle string _UIDs yet. | ||
299 | */ | ||
300 | unsigned long long value; | ||
301 | status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, | ||
302 | NULL, &value); | ||
303 | if (ACPI_FAILURE(status)) { | ||
304 | dev_err(&device->dev, | ||
305 | "Failed to evaluate processor _UID (0x%x)\n", | ||
306 | status); | ||
307 | return -ENODEV; | ||
308 | } | ||
309 | device_declaration = 1; | ||
310 | pr->acpi_id = value; | ||
311 | } | ||
312 | cpu_index = acpi_get_cpuid(pr->handle, device_declaration, pr->acpi_id); | ||
313 | |||
314 | /* Handle UP system running SMP kernel, with no LAPIC in MADT */ | ||
315 | if (!cpu0_initialized && (cpu_index == -1) && | ||
316 | (num_online_cpus() == 1)) { | ||
317 | cpu_index = 0; | ||
318 | } | ||
319 | |||
320 | cpu0_initialized = 1; | ||
321 | |||
322 | pr->id = cpu_index; | ||
323 | |||
324 | /* | ||
325 | * Extra Processor objects may be enumerated on MP systems with | ||
326 | * less than the max # of CPUs. They should be ignored _iff | ||
327 | * they are physically not present. | ||
328 | */ | ||
329 | if (pr->id == -1) { | ||
330 | if (ACPI_FAILURE(acpi_processor_hotadd_init(pr))) | ||
331 | return -ENODEV; | ||
332 | } | ||
333 | /* | ||
334 | * On some boxes several processors use the same processor bus id. | ||
335 | * But they are located in different scope. For example: | ||
336 | * \_SB.SCK0.CPU0 | ||
337 | * \_SB.SCK1.CPU0 | ||
338 | * Rename the processor device bus id. And the new bus id will be | ||
339 | * generated as the following format: | ||
340 | * CPU+CPU ID. | ||
341 | */ | ||
342 | sprintf(acpi_device_bid(device), "CPU%X", pr->id); | ||
343 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id, | ||
344 | pr->acpi_id)); | ||
345 | |||
346 | if (!object.processor.pblk_address) | ||
347 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n")); | ||
348 | else if (object.processor.pblk_length != 6) | ||
349 | dev_err(&device->dev, "Invalid PBLK length [%d]\n", | ||
350 | object.processor.pblk_length); | ||
351 | else { | ||
352 | pr->throttling.address = object.processor.pblk_address; | ||
353 | pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset; | ||
354 | pr->throttling.duty_width = acpi_gbl_FADT.duty_width; | ||
355 | |||
356 | pr->pblk = object.processor.pblk_address; | ||
357 | |||
358 | /* | ||
359 | * We don't care about error returns - we just try to mark | ||
360 | * these reserved so that nobody else is confused into thinking | ||
361 | * that this region might be unused.. | ||
362 | * | ||
363 | * (In particular, allocating the IO range for Cardbus) | ||
364 | */ | ||
365 | request_region(pr->throttling.address, 6, "ACPI CPU throttle"); | ||
366 | } | ||
367 | |||
368 | /* | ||
369 | * If ACPI describes a slot number for this CPU, we can use it | ||
370 | * ensure we get the right value in the "physical id" field | ||
371 | * of /proc/cpuinfo | ||
372 | */ | ||
373 | status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer); | ||
374 | if (ACPI_SUCCESS(status)) | ||
375 | arch_fix_phys_package_id(pr->id, object.integer.value); | ||
376 | |||
377 | return 0; | ||
378 | } | ||
379 | |||
380 | static DEFINE_PER_CPU(void *, processor_device_array); | ||
381 | |||
382 | static void acpi_processor_notify(struct acpi_device *device, u32 event) | ||
383 | { | ||
384 | struct acpi_processor *pr = acpi_driver_data(device); | ||
385 | int saved; | 88 | int saved; |
386 | 89 | ||
90 | if (device->handle != handle) | ||
91 | return; | ||
92 | |||
93 | pr = acpi_driver_data(device); | ||
387 | if (!pr) | 94 | if (!pr) |
388 | return; | 95 | return; |
389 | 96 | ||
@@ -420,55 +127,62 @@ static void acpi_processor_notify(struct acpi_device *device, u32 event) | |||
420 | return; | 127 | return; |
421 | } | 128 | } |
422 | 129 | ||
423 | static int acpi_cpu_soft_notify(struct notifier_block *nfb, | 130 | static __cpuinit int __acpi_processor_start(struct acpi_device *device); |
424 | unsigned long action, void *hcpu) | 131 | |
132 | static int __cpuinit acpi_cpu_soft_notify(struct notifier_block *nfb, | ||
133 | unsigned long action, void *hcpu) | ||
425 | { | 134 | { |
426 | unsigned int cpu = (unsigned long)hcpu; | 135 | unsigned int cpu = (unsigned long)hcpu; |
427 | struct acpi_processor *pr = per_cpu(processors, cpu); | 136 | struct acpi_processor *pr = per_cpu(processors, cpu); |
137 | struct acpi_device *device; | ||
428 | 138 | ||
429 | if (action == CPU_ONLINE && pr) { | 139 | if (!pr || acpi_bus_get_device(pr->handle, &device)) |
430 | /* CPU got physically hotplugged and onlined the first time: | 140 | return NOTIFY_DONE; |
431 | * Initialize missing things | 141 | |
142 | if (action == CPU_ONLINE) { | ||
143 | /* | ||
144 | * CPU got physically hotplugged and onlined for the first time: | ||
145 | * Initialize missing things. | ||
432 | */ | 146 | */ |
433 | if (pr->flags.need_hotplug_init) { | 147 | if (pr->flags.need_hotplug_init) { |
148 | int ret; | ||
149 | |||
434 | pr_info("Will online and init hotplugged CPU: %d\n", | 150 | pr_info("Will online and init hotplugged CPU: %d\n", |
435 | pr->id); | 151 | pr->id); |
436 | WARN(acpi_processor_start(pr), "Failed to start CPU:" | ||
437 | " %d\n", pr->id); | ||
438 | pr->flags.need_hotplug_init = 0; | 152 | pr->flags.need_hotplug_init = 0; |
439 | /* Normal CPU soft online event */ | 153 | ret = __acpi_processor_start(device); |
154 | WARN(ret, "Failed to start CPU: %d\n", pr->id); | ||
440 | } else { | 155 | } else { |
156 | /* Normal CPU soft online event. */ | ||
441 | acpi_processor_ppc_has_changed(pr, 0); | 157 | acpi_processor_ppc_has_changed(pr, 0); |
442 | acpi_processor_hotplug(pr); | 158 | acpi_processor_hotplug(pr); |
443 | acpi_processor_reevaluate_tstate(pr, action); | 159 | acpi_processor_reevaluate_tstate(pr, action); |
444 | acpi_processor_tstate_has_changed(pr); | 160 | acpi_processor_tstate_has_changed(pr); |
445 | } | 161 | } |
446 | } | 162 | } else if (action == CPU_DEAD) { |
447 | if (action == CPU_DEAD && pr) { | 163 | /* Invalidate flag.throttling after the CPU is offline. */ |
448 | /* invalidate the flag.throttling after one CPU is offline */ | ||
449 | acpi_processor_reevaluate_tstate(pr, action); | 164 | acpi_processor_reevaluate_tstate(pr, action); |
450 | } | 165 | } |
451 | return NOTIFY_OK; | 166 | return NOTIFY_OK; |
452 | } | 167 | } |
453 | 168 | ||
454 | static struct notifier_block acpi_cpu_notifier = | 169 | static struct notifier_block __refdata acpi_cpu_notifier = |
455 | { | 170 | { |
456 | .notifier_call = acpi_cpu_soft_notify, | 171 | .notifier_call = acpi_cpu_soft_notify, |
457 | }; | 172 | }; |
458 | 173 | ||
459 | /* | 174 | static __cpuinit int __acpi_processor_start(struct acpi_device *device) |
460 | * acpi_processor_start() is called by the cpu_hotplug_notifier func: | ||
461 | * acpi_cpu_soft_notify(). Getting it __cpuinit{data} is difficult, the | ||
462 | * root cause seem to be that acpi_processor_uninstall_hotplug_notify() | ||
463 | * is in the module_exit (__exit) func. Allowing acpi_processor_start() | ||
464 | * to not be in __cpuinit section, but being called from __cpuinit funcs | ||
465 | * via __ref looks like the right thing to do here. | ||
466 | */ | ||
467 | static __ref int acpi_processor_start(struct acpi_processor *pr) | ||
468 | { | 175 | { |
469 | struct acpi_device *device = per_cpu(processor_device_array, pr->id); | 176 | struct acpi_processor *pr = acpi_driver_data(device); |
177 | acpi_status status; | ||
470 | int result = 0; | 178 | int result = 0; |
471 | 179 | ||
180 | if (!pr) | ||
181 | return -ENODEV; | ||
182 | |||
183 | if (pr->flags.need_hotplug_init) | ||
184 | return 0; | ||
185 | |||
472 | #ifdef CONFIG_CPU_FREQ | 186 | #ifdef CONFIG_CPU_FREQ |
473 | acpi_processor_ppc_has_changed(pr, 0); | 187 | acpi_processor_ppc_has_changed(pr, 0); |
474 | acpi_processor_load_module(pr); | 188 | acpi_processor_load_module(pr); |
@@ -506,129 +220,48 @@ static __ref int acpi_processor_start(struct acpi_processor *pr) | |||
506 | goto err_remove_sysfs_thermal; | 220 | goto err_remove_sysfs_thermal; |
507 | } | 221 | } |
508 | 222 | ||
509 | return 0; | 223 | status = acpi_install_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, |
224 | acpi_processor_notify, device); | ||
225 | if (ACPI_SUCCESS(status)) | ||
226 | return 0; | ||
510 | 227 | ||
511 | err_remove_sysfs_thermal: | 228 | sysfs_remove_link(&pr->cdev->device.kobj, "device"); |
229 | err_remove_sysfs_thermal: | ||
512 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); | 230 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); |
513 | err_thermal_unregister: | 231 | err_thermal_unregister: |
514 | thermal_cooling_device_unregister(pr->cdev); | 232 | thermal_cooling_device_unregister(pr->cdev); |
515 | err_power_exit: | 233 | err_power_exit: |
516 | acpi_processor_power_exit(pr); | 234 | acpi_processor_power_exit(pr); |
517 | |||
518 | return result; | 235 | return result; |
519 | } | 236 | } |
520 | 237 | ||
521 | /* | 238 | static int __cpuinit acpi_processor_start(struct device *dev) |
522 | * Do not put anything in here which needs the core to be online. | ||
523 | * For example MSR access or setting up things which check for cpuinfo_x86 | ||
524 | * (cpu_data(cpu)) values, like CPU feature flags, family, model, etc. | ||
525 | * Such things have to be put in and set up above in acpi_processor_start() | ||
526 | */ | ||
527 | static int __cpuinit acpi_processor_add(struct acpi_device *device) | ||
528 | { | 239 | { |
529 | struct acpi_processor *pr = NULL; | 240 | struct acpi_device *device; |
530 | int result = 0; | ||
531 | struct device *dev; | ||
532 | |||
533 | pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL); | ||
534 | if (!pr) | ||
535 | return -ENOMEM; | ||
536 | 241 | ||
537 | if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) { | 242 | if (acpi_bus_get_device(ACPI_HANDLE(dev), &device)) |
538 | result = -ENOMEM; | 243 | return -ENODEV; |
539 | goto err_free_pr; | ||
540 | } | ||
541 | |||
542 | pr->handle = device->handle; | ||
543 | strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); | ||
544 | strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); | ||
545 | device->driver_data = pr; | ||
546 | |||
547 | result = acpi_processor_get_info(device); | ||
548 | if (result) { | ||
549 | /* Processor is physically not present */ | ||
550 | return 0; | ||
551 | } | ||
552 | |||
553 | #ifdef CONFIG_SMP | ||
554 | if (pr->id >= setup_max_cpus && pr->id != 0) | ||
555 | return 0; | ||
556 | #endif | ||
557 | |||
558 | BUG_ON(pr->id >= nr_cpu_ids); | ||
559 | |||
560 | /* | ||
561 | * Buggy BIOS check | ||
562 | * ACPI id of processors can be reported wrongly by the BIOS. | ||
563 | * Don't trust it blindly | ||
564 | */ | ||
565 | if (per_cpu(processor_device_array, pr->id) != NULL && | ||
566 | per_cpu(processor_device_array, pr->id) != device) { | ||
567 | dev_warn(&device->dev, | ||
568 | "BIOS reported wrong ACPI id %d for the processor\n", | ||
569 | pr->id); | ||
570 | result = -ENODEV; | ||
571 | goto err_free_cpumask; | ||
572 | } | ||
573 | per_cpu(processor_device_array, pr->id) = device; | ||
574 | |||
575 | per_cpu(processors, pr->id) = pr; | ||
576 | 244 | ||
577 | dev = get_cpu_device(pr->id); | 245 | return __acpi_processor_start(device); |
578 | if (sysfs_create_link(&device->dev.kobj, &dev->kobj, "sysdev")) { | ||
579 | result = -EFAULT; | ||
580 | goto err_clear_processor; | ||
581 | } | ||
582 | |||
583 | /* | ||
584 | * Do not start hotplugged CPUs now, but when they | ||
585 | * are onlined the first time | ||
586 | */ | ||
587 | if (pr->flags.need_hotplug_init) | ||
588 | return 0; | ||
589 | |||
590 | result = acpi_processor_start(pr); | ||
591 | if (result) | ||
592 | goto err_remove_sysfs; | ||
593 | |||
594 | return 0; | ||
595 | |||
596 | err_remove_sysfs: | ||
597 | sysfs_remove_link(&device->dev.kobj, "sysdev"); | ||
598 | err_clear_processor: | ||
599 | /* | ||
600 | * processor_device_array is not cleared to allow checks for buggy BIOS | ||
601 | */ | ||
602 | per_cpu(processors, pr->id) = NULL; | ||
603 | err_free_cpumask: | ||
604 | free_cpumask_var(pr->throttling.shared_cpu_map); | ||
605 | err_free_pr: | ||
606 | kfree(pr); | ||
607 | return result; | ||
608 | } | 246 | } |
609 | 247 | ||
610 | static int acpi_processor_remove(struct acpi_device *device) | 248 | static int acpi_processor_stop(struct device *dev) |
611 | { | 249 | { |
612 | struct acpi_processor *pr = NULL; | 250 | struct acpi_device *device; |
251 | struct acpi_processor *pr; | ||
613 | 252 | ||
253 | if (acpi_bus_get_device(ACPI_HANDLE(dev), &device)) | ||
254 | return 0; | ||
614 | 255 | ||
615 | if (!device || !acpi_driver_data(device)) | 256 | acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, |
616 | return -EINVAL; | 257 | acpi_processor_notify); |
617 | 258 | ||
618 | pr = acpi_driver_data(device); | 259 | pr = acpi_driver_data(device); |
619 | 260 | if (!pr) | |
620 | if (pr->id >= nr_cpu_ids) | 261 | return 0; |
621 | goto free; | ||
622 | |||
623 | if (device->removal_type == ACPI_BUS_REMOVAL_EJECT) { | ||
624 | if (acpi_processor_handle_eject(pr)) | ||
625 | return -EINVAL; | ||
626 | } | ||
627 | 262 | ||
628 | acpi_processor_power_exit(pr); | 263 | acpi_processor_power_exit(pr); |
629 | 264 | ||
630 | sysfs_remove_link(&device->dev.kobj, "sysdev"); | ||
631 | |||
632 | if (pr->cdev) { | 265 | if (pr->cdev) { |
633 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); | 266 | sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); |
634 | sysfs_remove_link(&pr->cdev->device.kobj, "device"); | 267 | sysfs_remove_link(&pr->cdev->device.kobj, "device"); |
@@ -637,331 +270,47 @@ static int acpi_processor_remove(struct acpi_device *device) | |||
637 | } | 270 | } |
638 | 271 | ||
639 | per_cpu(processors, pr->id) = NULL; | 272 | per_cpu(processors, pr->id) = NULL; |
640 | per_cpu(processor_device_array, pr->id) = NULL; | ||
641 | try_offline_node(cpu_to_node(pr->id)); | ||
642 | |||
643 | free: | ||
644 | free_cpumask_var(pr->throttling.shared_cpu_map); | ||
645 | kfree(pr); | ||
646 | |||
647 | return 0; | 273 | return 0; |
648 | } | 274 | } |
649 | 275 | ||
650 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
651 | /**************************************************************************** | ||
652 | * Acpi processor hotplug support * | ||
653 | ****************************************************************************/ | ||
654 | |||
655 | static int is_processor_present(acpi_handle handle) | ||
656 | { | ||
657 | acpi_status status; | ||
658 | unsigned long long sta = 0; | ||
659 | |||
660 | |||
661 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); | ||
662 | |||
663 | if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT)) | ||
664 | return 1; | ||
665 | |||
666 | /* | ||
667 | * _STA is mandatory for a processor that supports hot plug | ||
668 | */ | ||
669 | if (status == AE_NOT_FOUND) | ||
670 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
671 | "Processor does not support hot plug\n")); | ||
672 | else | ||
673 | ACPI_EXCEPTION((AE_INFO, status, | ||
674 | "Processor Device is not present")); | ||
675 | return 0; | ||
676 | } | ||
677 | |||
678 | static void acpi_processor_hotplug_notify(acpi_handle handle, | ||
679 | u32 event, void *data) | ||
680 | { | ||
681 | struct acpi_device *device = NULL; | ||
682 | struct acpi_eject_event *ej_event = NULL; | ||
683 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */ | ||
684 | acpi_status status; | ||
685 | int result; | ||
686 | |||
687 | acpi_scan_lock_acquire(); | ||
688 | |||
689 | switch (event) { | ||
690 | case ACPI_NOTIFY_BUS_CHECK: | ||
691 | case ACPI_NOTIFY_DEVICE_CHECK: | ||
692 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
693 | "Processor driver received %s event\n", | ||
694 | (event == ACPI_NOTIFY_BUS_CHECK) ? | ||
695 | "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK")); | ||
696 | |||
697 | if (!is_processor_present(handle)) | ||
698 | break; | ||
699 | |||
700 | if (!acpi_bus_get_device(handle, &device)) | ||
701 | break; | ||
702 | |||
703 | result = acpi_bus_scan(handle); | ||
704 | if (result) { | ||
705 | acpi_handle_err(handle, "Unable to add the device\n"); | ||
706 | break; | ||
707 | } | ||
708 | result = acpi_bus_get_device(handle, &device); | ||
709 | if (result) { | ||
710 | acpi_handle_err(handle, "Missing device object\n"); | ||
711 | break; | ||
712 | } | ||
713 | ost_code = ACPI_OST_SC_SUCCESS; | ||
714 | break; | ||
715 | |||
716 | case ACPI_NOTIFY_EJECT_REQUEST: | ||
717 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
718 | "received ACPI_NOTIFY_EJECT_REQUEST\n")); | ||
719 | |||
720 | if (acpi_bus_get_device(handle, &device)) { | ||
721 | acpi_handle_err(handle, | ||
722 | "Device don't exist, dropping EJECT\n"); | ||
723 | break; | ||
724 | } | ||
725 | if (!acpi_driver_data(device)) { | ||
726 | acpi_handle_err(handle, | ||
727 | "Driver data is NULL, dropping EJECT\n"); | ||
728 | break; | ||
729 | } | ||
730 | |||
731 | ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL); | ||
732 | if (!ej_event) { | ||
733 | acpi_handle_err(handle, "No memory, dropping EJECT\n"); | ||
734 | break; | ||
735 | } | ||
736 | |||
737 | get_device(&device->dev); | ||
738 | ej_event->device = device; | ||
739 | ej_event->event = ACPI_NOTIFY_EJECT_REQUEST; | ||
740 | /* The eject is carried out asynchronously. */ | ||
741 | status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, | ||
742 | ej_event); | ||
743 | if (ACPI_FAILURE(status)) { | ||
744 | put_device(&device->dev); | ||
745 | kfree(ej_event); | ||
746 | break; | ||
747 | } | ||
748 | goto out; | ||
749 | |||
750 | default: | ||
751 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
752 | "Unsupported event [0x%x]\n", event)); | ||
753 | |||
754 | /* non-hotplug event; possibly handled by other handler */ | ||
755 | goto out; | ||
756 | } | ||
757 | |||
758 | /* Inform firmware that the hotplug operation has completed */ | ||
759 | (void) acpi_evaluate_hotplug_ost(handle, event, ost_code, NULL); | ||
760 | |||
761 | out: | ||
762 | acpi_scan_lock_release(); | ||
763 | } | ||
764 | |||
765 | static acpi_status is_processor_device(acpi_handle handle) | ||
766 | { | ||
767 | struct acpi_device_info *info; | ||
768 | char *hid; | ||
769 | acpi_status status; | ||
770 | |||
771 | status = acpi_get_object_info(handle, &info); | ||
772 | if (ACPI_FAILURE(status)) | ||
773 | return status; | ||
774 | |||
775 | if (info->type == ACPI_TYPE_PROCESSOR) { | ||
776 | kfree(info); | ||
777 | return AE_OK; /* found a processor object */ | ||
778 | } | ||
779 | |||
780 | if (!(info->valid & ACPI_VALID_HID)) { | ||
781 | kfree(info); | ||
782 | return AE_ERROR; | ||
783 | } | ||
784 | |||
785 | hid = info->hardware_id.string; | ||
786 | if ((hid == NULL) || strcmp(hid, ACPI_PROCESSOR_DEVICE_HID)) { | ||
787 | kfree(info); | ||
788 | return AE_ERROR; | ||
789 | } | ||
790 | |||
791 | kfree(info); | ||
792 | return AE_OK; /* found a processor device object */ | ||
793 | } | ||
794 | |||
795 | static acpi_status | ||
796 | processor_walk_namespace_cb(acpi_handle handle, | ||
797 | u32 lvl, void *context, void **rv) | ||
798 | { | ||
799 | acpi_status status; | ||
800 | int *action = context; | ||
801 | |||
802 | status = is_processor_device(handle); | ||
803 | if (ACPI_FAILURE(status)) | ||
804 | return AE_OK; /* not a processor; continue to walk */ | ||
805 | |||
806 | switch (*action) { | ||
807 | case INSTALL_NOTIFY_HANDLER: | ||
808 | acpi_install_notify_handler(handle, | ||
809 | ACPI_SYSTEM_NOTIFY, | ||
810 | acpi_processor_hotplug_notify, | ||
811 | NULL); | ||
812 | break; | ||
813 | case UNINSTALL_NOTIFY_HANDLER: | ||
814 | acpi_remove_notify_handler(handle, | ||
815 | ACPI_SYSTEM_NOTIFY, | ||
816 | acpi_processor_hotplug_notify); | ||
817 | break; | ||
818 | default: | ||
819 | break; | ||
820 | } | ||
821 | |||
822 | /* found a processor; skip walking underneath */ | ||
823 | return AE_CTRL_DEPTH; | ||
824 | } | ||
825 | |||
826 | static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr) | ||
827 | { | ||
828 | acpi_handle handle = pr->handle; | ||
829 | |||
830 | if (!is_processor_present(handle)) { | ||
831 | return AE_ERROR; | ||
832 | } | ||
833 | |||
834 | if (acpi_map_lsapic(handle, &pr->id)) | ||
835 | return AE_ERROR; | ||
836 | |||
837 | if (arch_register_cpu(pr->id)) { | ||
838 | acpi_unmap_lsapic(pr->id); | ||
839 | return AE_ERROR; | ||
840 | } | ||
841 | |||
842 | /* CPU got hot-plugged, but cpu_data is not initialized yet | ||
843 | * Set flag to delay cpu_idle/throttling initialization | ||
844 | * in: | ||
845 | * acpi_processor_add() | ||
846 | * acpi_processor_get_info() | ||
847 | * and do it when the CPU gets online the first time | ||
848 | * TBD: Cleanup above functions and try to do this more elegant. | ||
849 | */ | ||
850 | pr_info("CPU %d got hotplugged\n", pr->id); | ||
851 | pr->flags.need_hotplug_init = 1; | ||
852 | |||
853 | return AE_OK; | ||
854 | } | ||
855 | |||
856 | static int acpi_processor_handle_eject(struct acpi_processor *pr) | ||
857 | { | ||
858 | if (cpu_online(pr->id)) | ||
859 | cpu_down(pr->id); | ||
860 | |||
861 | get_online_cpus(); | ||
862 | /* | ||
863 | * The cpu might become online again at this point. So we check whether | ||
864 | * the cpu has been onlined or not. If the cpu became online, it means | ||
865 | * that someone wants to use the cpu. So acpi_processor_handle_eject() | ||
866 | * returns -EAGAIN. | ||
867 | */ | ||
868 | if (unlikely(cpu_online(pr->id))) { | ||
869 | put_online_cpus(); | ||
870 | pr_warn("Failed to remove CPU %d, because other task " | ||
871 | "brought the CPU back online\n", pr->id); | ||
872 | return -EAGAIN; | ||
873 | } | ||
874 | arch_unregister_cpu(pr->id); | ||
875 | acpi_unmap_lsapic(pr->id); | ||
876 | put_online_cpus(); | ||
877 | return (0); | ||
878 | } | ||
879 | #else | ||
880 | static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr) | ||
881 | { | ||
882 | return AE_ERROR; | ||
883 | } | ||
884 | static int acpi_processor_handle_eject(struct acpi_processor *pr) | ||
885 | { | ||
886 | return (-EINVAL); | ||
887 | } | ||
888 | #endif | ||
889 | |||
890 | static | ||
891 | void acpi_processor_install_hotplug_notify(void) | ||
892 | { | ||
893 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
894 | int action = INSTALL_NOTIFY_HANDLER; | ||
895 | acpi_walk_namespace(ACPI_TYPE_ANY, | ||
896 | ACPI_ROOT_OBJECT, | ||
897 | ACPI_UINT32_MAX, | ||
898 | processor_walk_namespace_cb, NULL, &action, NULL); | ||
899 | #endif | ||
900 | register_hotcpu_notifier(&acpi_cpu_notifier); | ||
901 | } | ||
902 | |||
903 | static | ||
904 | void acpi_processor_uninstall_hotplug_notify(void) | ||
905 | { | ||
906 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
907 | int action = UNINSTALL_NOTIFY_HANDLER; | ||
908 | acpi_walk_namespace(ACPI_TYPE_ANY, | ||
909 | ACPI_ROOT_OBJECT, | ||
910 | ACPI_UINT32_MAX, | ||
911 | processor_walk_namespace_cb, NULL, &action, NULL); | ||
912 | #endif | ||
913 | unregister_hotcpu_notifier(&acpi_cpu_notifier); | ||
914 | } | ||
915 | |||
916 | /* | 276 | /* |
917 | * We keep the driver loaded even when ACPI is not running. | 277 | * We keep the driver loaded even when ACPI is not running. |
918 | * This is needed for the powernow-k8 driver, that works even without | 278 | * This is needed for the powernow-k8 driver, that works even without |
919 | * ACPI, but needs symbols from this driver | 279 | * ACPI, but needs symbols from this driver |
920 | */ | 280 | */ |
921 | 281 | ||
922 | static int __init acpi_processor_init(void) | 282 | static int __init acpi_processor_driver_init(void) |
923 | { | 283 | { |
924 | int result = 0; | 284 | int result = 0; |
925 | 285 | ||
926 | if (acpi_disabled) | 286 | if (acpi_disabled) |
927 | return 0; | 287 | return 0; |
928 | 288 | ||
929 | result = acpi_bus_register_driver(&acpi_processor_driver); | 289 | result = driver_register(&acpi_processor_driver); |
930 | if (result < 0) | 290 | if (result < 0) |
931 | return result; | 291 | return result; |
932 | 292 | ||
933 | acpi_processor_syscore_init(); | 293 | acpi_processor_syscore_init(); |
934 | 294 | register_hotcpu_notifier(&acpi_cpu_notifier); | |
935 | acpi_processor_install_hotplug_notify(); | ||
936 | |||
937 | acpi_thermal_cpufreq_init(); | 295 | acpi_thermal_cpufreq_init(); |
938 | |||
939 | acpi_processor_ppc_init(); | 296 | acpi_processor_ppc_init(); |
940 | |||
941 | acpi_processor_throttling_init(); | 297 | acpi_processor_throttling_init(); |
942 | |||
943 | return 0; | 298 | return 0; |
944 | } | 299 | } |
945 | 300 | ||
946 | static void __exit acpi_processor_exit(void) | 301 | static void __exit acpi_processor_driver_exit(void) |
947 | { | 302 | { |
948 | if (acpi_disabled) | 303 | if (acpi_disabled) |
949 | return; | 304 | return; |
950 | 305 | ||
951 | acpi_processor_ppc_exit(); | 306 | acpi_processor_ppc_exit(); |
952 | |||
953 | acpi_thermal_cpufreq_exit(); | 307 | acpi_thermal_cpufreq_exit(); |
954 | 308 | unregister_hotcpu_notifier(&acpi_cpu_notifier); | |
955 | acpi_processor_uninstall_hotplug_notify(); | ||
956 | |||
957 | acpi_processor_syscore_exit(); | 309 | acpi_processor_syscore_exit(); |
958 | 310 | driver_unregister(&acpi_processor_driver); | |
959 | acpi_bus_unregister_driver(&acpi_processor_driver); | ||
960 | |||
961 | return; | ||
962 | } | 311 | } |
963 | 312 | ||
964 | module_init(acpi_processor_init); | 313 | module_init(acpi_processor_driver_init); |
965 | module_exit(acpi_processor_exit); | 314 | module_exit(acpi_processor_driver_exit); |
966 | 315 | ||
967 | MODULE_ALIAS("processor"); | 316 | MODULE_ALIAS("processor"); |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 4fd392005ef1..ad82bb2a37e0 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -2124,6 +2124,7 @@ int __init acpi_scan_init(void) | |||
2124 | 2124 | ||
2125 | acpi_pci_root_init(); | 2125 | acpi_pci_root_init(); |
2126 | acpi_pci_link_init(); | 2126 | acpi_pci_link_init(); |
2127 | acpi_processor_init(); | ||
2127 | acpi_platform_init(); | 2128 | acpi_platform_init(); |
2128 | acpi_lpss_init(); | 2129 | acpi_lpss_init(); |
2129 | acpi_csrt_init(); | 2130 | acpi_csrt_init(); |
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 25c8768172e9..7431ba6fc2d4 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c | |||
@@ -13,11 +13,21 @@ | |||
13 | #include <linux/gfp.h> | 13 | #include <linux/gfp.h> |
14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
15 | #include <linux/percpu.h> | 15 | #include <linux/percpu.h> |
16 | #include <linux/acpi.h> | ||
16 | 17 | ||
17 | #include "base.h" | 18 | #include "base.h" |
18 | 19 | ||
19 | static DEFINE_PER_CPU(struct device *, cpu_sys_devices); | 20 | static DEFINE_PER_CPU(struct device *, cpu_sys_devices); |
20 | 21 | ||
22 | static int cpu_subsys_match(struct device *dev, struct device_driver *drv) | ||
23 | { | ||
24 | /* ACPI style match is the only one that may succeed. */ | ||
25 | if (acpi_driver_match_device(dev, drv)) | ||
26 | return 1; | ||
27 | |||
28 | return 0; | ||
29 | } | ||
30 | |||
21 | #ifdef CONFIG_HOTPLUG_CPU | 31 | #ifdef CONFIG_HOTPLUG_CPU |
22 | static void change_cpu_under_node(struct cpu *cpu, | 32 | static void change_cpu_under_node(struct cpu *cpu, |
23 | unsigned int from_nid, unsigned int to_nid) | 33 | unsigned int from_nid, unsigned int to_nid) |
@@ -98,6 +108,7 @@ static DEVICE_ATTR(release, S_IWUSR, NULL, cpu_release_store); | |||
98 | struct bus_type cpu_subsys = { | 108 | struct bus_type cpu_subsys = { |
99 | .name = "cpu", | 109 | .name = "cpu", |
100 | .dev_name = "cpu", | 110 | .dev_name = "cpu", |
111 | .match = cpu_subsys_match, | ||
101 | #ifdef CONFIG_HOTPLUG_CPU | 112 | #ifdef CONFIG_HOTPLUG_CPU |
102 | .online = cpu_subsys_online, | 113 | .online = cpu_subsys_online, |
103 | .offline = cpu_subsys_offline, | 114 | .offline = cpu_subsys_offline, |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index ea69367fdd3b..66096d06925e 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
@@ -6,6 +6,10 @@ | |||
6 | #include <linux/thermal.h> | 6 | #include <linux/thermal.h> |
7 | #include <asm/acpi.h> | 7 | #include <asm/acpi.h> |
8 | 8 | ||
9 | #define ACPI_PROCESSOR_CLASS "processor" | ||
10 | #define ACPI_PROCESSOR_DEVICE_NAME "Processor" | ||
11 | #define ACPI_PROCESSOR_DEVICE_HID "ACPI0007" | ||
12 | |||
9 | #define ACPI_PROCESSOR_BUSY_METRIC 10 | 13 | #define ACPI_PROCESSOR_BUSY_METRIC 10 |
10 | 14 | ||
11 | #define ACPI_PROCESSOR_MAX_POWER 8 | 15 | #define ACPI_PROCESSOR_MAX_POWER 8 |
@@ -207,6 +211,7 @@ struct acpi_processor { | |||
207 | struct acpi_processor_throttling throttling; | 211 | struct acpi_processor_throttling throttling; |
208 | struct acpi_processor_limit limit; | 212 | struct acpi_processor_limit limit; |
209 | struct thermal_cooling_device *cdev; | 213 | struct thermal_cooling_device *cdev; |
214 | struct device *dev; /* Processor device. */ | ||
210 | }; | 215 | }; |
211 | 216 | ||
212 | struct acpi_processor_errata { | 217 | struct acpi_processor_errata { |