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_hotplug(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        if (!cpuidle_get_driver() || cpuidle_get_driver() == &acpi_idle_driver)
 507                acpi_processor_power_init(pr, device);
 508
 509        pr->cdev = thermal_cooling_device_register("Processor", device,
 510                                                &processor_cooling_ops);
 511        if (IS_ERR(pr->cdev)) {
 512                result = PTR_ERR(pr->cdev);
 513                goto err_power_exit;
 514        }
 515
 516        dev_dbg(&device->dev, "registered as cooling_device%d\n",
 517                 pr->cdev->id);
 518
 519        result = sysfs_create_link(&device->dev.kobj,
 520                                   &pr->cdev->device.kobj,
 521                                   "thermal_cooling");
 522        if (result) {
 523                printk(KERN_ERR PREFIX "Create sysfs link\n");
 524                goto err_thermal_unregister;
 525        }
 526        result = sysfs_create_link(&pr->cdev->device.kobj,
 527                                   &device->dev.kobj,
 528                                   "device");
 529        if (result) {
 530                printk(KERN_ERR PREFIX "Create sysfs link\n");
 531                goto err_remove_sysfs;
 532        }
 533
 534        return 0;
 535
 536err_remove_sysfs:
 537        sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
 538err_thermal_unregister:
 539        thermal_cooling_device_unregister(pr->cdev);
 540err_power_exit:
 541        acpi_processor_power_exit(pr, device);
 542err_free_cpumask:
 543        free_cpumask_var(pr->throttling.shared_cpu_map);
 544
 545        return result;
 546}
 547
 548static int acpi_processor_remove(struct acpi_device *device, int type)
 549{
 550        struct acpi_processor *pr = NULL;
 551
 552
 553        if (!device || !acpi_driver_data(device))
 554                return -EINVAL;
 555
 556        pr = acpi_driver_data(device);
 557
 558        if (pr->id >= nr_cpu_ids)
 559                goto free;
 560
 561        if (type == ACPI_BUS_REMOVAL_EJECT) {
 562                if (acpi_processor_handle_eject(pr))
 563                        return -EINVAL;
 564        }
 565
 566        acpi_processor_power_exit(pr, device);
 567
 568        sysfs_remove_link(&device->dev.kobj, "sysdev");
 569
 570        if (pr->cdev) {
 571                sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
 572                sysfs_remove_link(&pr->cdev->device.kobj, "device");
 573                thermal_cooling_device_unregister(pr->cdev);
 574                pr->cdev = NULL;
 575        }
 576
 577        per_cpu(processors, pr->id) = NULL;
 578        per_cpu(processor_device_array, pr->id) = NULL;
 579
 580free:
 581        free_cpumask_var(pr->throttling.shared_cpu_map);
 582        kfree(pr);
 583
 584        return 0;
 585}
 586
 587#ifdef CONFIG_ACPI_HOTPLUG_CPU
 588/****************************************************************************
 589 *      Acpi processor hotplug support                                      *
 590 ****************************************************************************/
 591
 592static int is_processor_present(acpi_handle handle)
 593{
 594        acpi_status status;
 595        unsigned long long sta = 0;
 596
 597
 598        status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
 599
 600        if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT))
 601                return 1;
 602
 603        /*
 604         * _STA is mandatory for a processor that supports hot plug
 605         */
 606        if (status == AE_NOT_FOUND)
 607                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 608                                "Processor does not support hot plug\n"));
 609        else
 610                ACPI_EXCEPTION((AE_INFO, status,
 611                                "Processor Device is not present"));
 612        return 0;
 613}
 614
 615static
 616int acpi_processor_device_add(acpi_handle handle, struct acpi_device **device)
 617{
 618        acpi_handle phandle;
 619        struct acpi_device *pdev;
 620
 621
 622        if (acpi_get_parent(handle, &phandle)) {
 623                return -ENODEV;
 624        }
 625
 626        if (acpi_bus_get_device(phandle, &pdev)) {
 627                return -ENODEV;
 628        }
 629
 630        if (acpi_bus_add(device, pdev, handle, ACPI_BUS_TYPE_PROCESSOR)) {
 631                return -ENODEV;
 632        }
 633
 634        return 0;
 635}
 636
 637static void acpi_processor_hotplug_notify(acpi_handle handle,
 638                                          u32 event, void *data)
 639{
 640        struct acpi_processor *pr;
 641        struct acpi_device *device = NULL;
 642        int result;
 643
 644
 645        switch (event) {
 646        case ACPI_NOTIFY_BUS_CHECK:
 647        case ACPI_NOTIFY_DEVICE_CHECK:
 648                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 649                "Processor driver received %s event\n",
 650                       (event == ACPI_NOTIFY_BUS_CHECK) ?
 651                       "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK"));
 652
 653                if (!is_processor_present(handle))
 654                        break;
 655
 656                if (acpi_bus_get_device(handle, &device)) {
 657                        result = acpi_processor_device_add(handle, &device);
 658                        if (result)
 659                                printk(KERN_ERR PREFIX
 660                                            "Unable to add the device\n");
 661                        break;
 662                }
 663                break;
 664        case ACPI_NOTIFY_EJECT_REQUEST:
 665                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 666                                  "received ACPI_NOTIFY_EJECT_REQUEST\n"));
 667
 668                if (acpi_bus_get_device(handle, &device)) {
 669                        printk(KERN_ERR PREFIX
 670                                    "Device don't exist, dropping EJECT\n");
 671                        break;
 672                }
 673                pr = acpi_driver_data(device);
 674                if (!pr) {
 675                        printk(KERN_ERR PREFIX
 676                                    "Driver data is NULL, dropping EJECT\n");
 677                        return;
 678                }
 679                break;
 680        default:
 681                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 682                                  "Unsupported event [0x%x]\n", event));
 683                break;
 684        }
 685
 686        return;
 687}
 688
 689static acpi_status
 690processor_walk_namespace_cb(acpi_handle handle,
 691                            u32 lvl, void *context, void **rv)
 692{
 693        acpi_status status;
 694        int *action = context;
 695        acpi_object_type type = 0;
 696
 697        status = acpi_get_type(handle, &type);
 698        if (ACPI_FAILURE(status))
 699                return (AE_OK);
 700
 701        if (type != ACPI_TYPE_PROCESSOR)
 702                return (AE_OK);
 703
 704        switch (*action) {
 705        case INSTALL_NOTIFY_HANDLER:
 706                acpi_install_notify_handler(handle,
 707                                            ACPI_SYSTEM_NOTIFY,
 708                                            acpi_processor_hotplug_notify,
 709                                            NULL);
 710                break;
 711        case UNINSTALL_NOTIFY_HANDLER:
 712                acpi_remove_notify_handler(handle,
 713                                           ACPI_SYSTEM_NOTIFY,
 714                                           acpi_processor_hotplug_notify);
 715                break;
 716        default:
 717                break;
 718        }
 719
 720        return (AE_OK);
 721}
 722
 723static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu)
 724{
 725
 726        if (!is_processor_present(handle)) {
 727                return AE_ERROR;
 728        }
 729
 730        if (acpi_map_lsapic(handle, p_cpu))
 731                return AE_ERROR;
 732
 733        if (arch_register_cpu(*p_cpu)) {
 734                acpi_unmap_lsapic(*p_cpu);
 735                return AE_ERROR;
 736        }
 737
 738        return AE_OK;
 739}
 740
 741static int acpi_processor_handle_eject(struct acpi_processor *pr)
 742{
 743        if (cpu_online(pr->id))
 744                cpu_down(pr->id);
 745
 746        arch_unregister_cpu(pr->id);
 747        acpi_unmap_lsapic(pr->id);
 748        return (0);
 749}
 750#else
 751static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu)
 752{
 753        return AE_ERROR;
 754}
 755static int acpi_processor_handle_eject(struct acpi_processor *pr)
 756{
 757        return (-EINVAL);
 758}
 759#endif
 760
 761static
 762void acpi_processor_install_hotplug_notify(void)
 763{
 764#ifdef CONFIG_ACPI_HOTPLUG_CPU
 765        int action = INSTALL_NOTIFY_HANDLER;
 766        acpi_walk_namespace(ACPI_TYPE_PROCESSOR,
 767                            ACPI_ROOT_OBJECT,
 768                            ACPI_UINT32_MAX,
 769                            processor_walk_namespace_cb, NULL, &action, NULL);
 770#endif
 771        register_hotcpu_notifier(&acpi_cpu_notifier);
 772}
 773
 774static
 775void acpi_processor_uninstall_hotplug_notify(void)
 776{
 777#ifdef CONFIG_ACPI_HOTPLUG_CPU
 778        int action = UNINSTALL_NOTIFY_HANDLER;
 779        acpi_walk_namespace(ACPI_TYPE_PROCESSOR,
 780                            ACPI_ROOT_OBJECT,
 781                            ACPI_UINT32_MAX,
 782                            processor_walk_namespace_cb, NULL, &action, NULL);
 783#endif
 784        unregister_hotcpu_notifier(&acpi_cpu_notifier);
 785}
 786
 787/*
 788 * We keep the driver loaded even when ACPI is not running.
 789 * This is needed for the powernow-k8 driver, that works even without
 790 * ACPI, but needs symbols from this driver
 791 */
 792
 793static int __init acpi_processor_init(void)
 794{
 795        int result = 0;
 796
 797        if (acpi_disabled)
 798                return 0;
 799
 800        memset(&errata, 0, sizeof(errata));
 801
 802        result = acpi_bus_register_driver(&acpi_processor_driver);
 803        if (result < 0)
 804                return result;
 805
 806        acpi_processor_install_hotplug_notify();
 807
 808        acpi_thermal_cpufreq_init();
 809
 810        acpi_processor_ppc_init();
 811
 812        acpi_processor_throttling_init();
 813
 814        return 0;
 815}
 816
 817static void __exit acpi_processor_exit(void)
 818{
 819        if (acpi_disabled)
 820                return;
 821
 822        acpi_processor_ppc_exit();
 823
 824        acpi_thermal_cpufreq_exit();
 825
 826        acpi_processor_uninstall_hotplug_notify();
 827
 828        acpi_bus_unregister_driver(&acpi_processor_driver);
 829
 830        cpuidle_unregister_driver(&acpi_idle_driver);
 831
 832        return;
 833}
 834
 835module_init(acpi_processor_init);
 836module_exit(acpi_processor_exit);
 837
 838MODULE_ALIAS("processor");
 839