linux/drivers/acpi/processor_driver.c
<<
>>
Prefs
   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 __ref 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");
 853