linux/drivers/acpi/processor_core.c History
<<
>>
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/proc_fs.h>
  44#include <linux/seq_file.h>
  45#include <linux/dmi.h>
  46#include <linux/moduleparam.h>
  47#include <linux/cpuidle.h>
  48
  49#include <asm/io.h>
  50#include <asm/system.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>
  61
  62#define PREFIX "ACPI: "
  63
  64#define ACPI_PROCESSOR_CLASS            "processor"
  65#define ACPI_PROCESSOR_DEVICE_NAME      "Processor"
  66#define ACPI_PROCESSOR_FILE_INFO        "info"
  67#define ACPI_PROCESSOR_FILE_THROTTLING  "throttling"
  68#define ACPI_PROCESSOR_FILE_LIMIT       "limit"
  69#define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80
  70#define ACPI_PROCESSOR_NOTIFY_POWER     0x81
  71#define ACPI_PROCESSOR_NOTIFY_THROTTLING        0x82
  72
  73#define ACPI_PROCESSOR_LIMIT_USER       0
  74#define ACPI_PROCESSOR_LIMIT_THERMAL    1
  75
  76#define _COMPONENT              ACPI_PROCESSOR_COMPONENT
  77ACPI_MODULE_NAME("processor_core");
  78
  79MODULE_AUTHOR("Paul Diefenbaugh");
  80MODULE_DESCRIPTION("ACPI Processor Driver");
  81MODULE_LICENSE("GPL");
  82
  83static int acpi_processor_add(struct acpi_device *device);
  84static int acpi_processor_remove(struct acpi_device *device, int type);
  85#ifdef CONFIG_ACPI_PROCFS
  86static int acpi_processor_info_open_fs(struct inode *inode, struct file *file);
  87#endif
  88static void acpi_processor_notify(struct acpi_device *device, u32 event);
  89static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu);
  90static int acpi_processor_handle_eject(struct acpi_processor *pr);
  91
  92
  93static const struct acpi_device_id processor_device_ids[] = {
  94        {ACPI_PROCESSOR_OBJECT_HID, 0},
  95        {"ACPI0007", 0},
  96        {"", 0},
  97};
  98MODULE_DEVICE_TABLE(acpi, processor_device_ids);
  99
 100static struct acpi_driver acpi_processor_driver = {
 101        .name = "processor",
 102        .class = ACPI_PROCESSOR_CLASS,
 103        .ids = processor_device_ids,
 104        .ops = {
 105                .add = acpi_processor_add,
 106                .remove = acpi_processor_remove,
 107                .suspend = acpi_processor_suspend,
 108                .resume = acpi_processor_resume,
 109                .notify = acpi_processor_notify,
 110                },
 111};
 112
 113#define INSTALL_NOTIFY_HANDLER          1
 114#define UNINSTALL_NOTIFY_HANDLER        2
 115#ifdef CONFIG_ACPI_PROCFS
 116static const struct file_operations acpi_processor_info_fops = {
 117        .owner = THIS_MODULE,
 118        .open = acpi_processor_info_open_fs,
 119        .read = seq_read,
 120        .llseek = seq_lseek,
 121        .release = single_release,
 122};
 123#endif
 124
 125DEFINE_PER_CPU(struct acpi_processor *, processors);
 126struct acpi_processor_errata errata __read_mostly;
 127
 128/* --------------------------------------------------------------------------
 129                                Errata Handling
 130   -------------------------------------------------------------------------- */
 131
 132static int acpi_processor_errata_piix4(struct pci_dev *dev)
 133{
 134        u8 value1 = 0;
 135        u8 value2 = 0;
 136
 137
 138        if (!dev)
 139                return -EINVAL;
 140
 141        /*
 142         * Note that 'dev' references the PIIX4 ACPI Controller.
 143         */
 144
 145        switch (dev->revision) {
 146        case 0:
 147                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 A-step\n"));
 148                break;
 149        case 1:
 150                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 B-step\n"));
 151                break;
 152        case 2:
 153                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4E\n"));
 154                break;
 155        case 3:
 156                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4M\n"));
 157                break;
 158        default:
 159                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unknown PIIX4\n"));
 160                break;
 161        }
 162
 163        switch (dev->revision) {
 164
 165        case 0:         /* PIIX4 A-step */
 166        case 1:         /* PIIX4 B-step */
 167                /*
 168                 * See specification changes #13 ("Manual Throttle Duty Cycle")
 169                 * and #14 ("Enabling and Disabling Manual Throttle"), plus
 170                 * erratum #5 ("STPCLK# Deassertion Time") from the January
 171                 * 2002 PIIX4 specification update.  Applies to only older
 172                 * PIIX4 models.
 173                 */
 174                errata.piix4.throttle = 1;
 175
 176        case 2:         /* PIIX4E */
 177        case 3:         /* PIIX4M */
 178                /*
 179                 * See erratum #18 ("C3 Power State/BMIDE and Type-F DMA
 180                 * Livelock") from the January 2002 PIIX4 specification update.
 181                 * Applies to all PIIX4 models.
 182                 */
 183
 184                /*
 185                 * BM-IDE
 186                 * ------
 187                 * Find the PIIX4 IDE Controller and get the Bus Master IDE
 188                 * Status register address.  We'll use this later to read
 189                 * each IDE controller's DMA status to make sure we catch all
 190                 * DMA activity.
 191                 */
 192                dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
 193                                     PCI_DEVICE_ID_INTEL_82371AB,
 194                                     PCI_ANY_ID, PCI_ANY_ID, NULL);
 195                if (dev) {
 196                        errata.piix4.bmisx = pci_resource_start(dev, 4);
 197                        pci_dev_put(dev);
 198                }
 199
 200                /*
 201                 * Type-F DMA
 202                 * ----------
 203                 * Find the PIIX4 ISA Controller and read the Motherboard
 204                 * DMA controller's status to see if Type-F (Fast) DMA mode
 205                 * is enabled (bit 7) on either channel.  Note that we'll
 206                 * disable C3 support if this is enabled, as some legacy
 207                 * devices won't operate well if fast DMA is disabled.
 208                 */
 209                dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
 210                                     PCI_DEVICE_ID_INTEL_82371AB_0,
 211                                     PCI_ANY_ID, PCI_ANY_ID, NULL);
 212                if (dev) {
 213                        pci_read_config_byte(dev, 0x76, &value1);
 214                        pci_read_config_byte(dev, 0x77, &value2);
 215                        if ((value1 & 0x80) || (value2 & 0x80))
 216                                errata.piix4.fdma = 1;
 217                        pci_dev_put(dev);
 218                }
 219
 220                break;
 221        }
 222
 223        if (errata.piix4.bmisx)
 224                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 225                                  "Bus master activity detection (BM-IDE) erratum enabled\n"));
 226        if (errata.piix4.fdma)
 227                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 228                                  "Type-F DMA livelock erratum (C3 disabled)\n"));
 229
 230        return 0;
 231}
 232
 233static int acpi_processor_errata(struct acpi_processor *pr)
 234{
 235        int result = 0;
 236        struct pci_dev *dev = NULL;
 237
 238
 239        if (!pr)
 240                return -EINVAL;
 241
 242        /*
 243         * PIIX4
 244         */
 245        dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
 246                             PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID,
 247                             PCI_ANY_ID, NULL);
 248        if (dev) {
 249                result = acpi_processor_errata_piix4(dev);
 250                pci_dev_put(dev);
 251        }
 252
 253        return result;
 254}
 255
 256/* --------------------------------------------------------------------------
 257                              FS Interface (/proc)
 258   -------------------------------------------------------------------------- */
 259
 260#ifdef CONFIG_ACPI_PROCFS
 261static struct proc_dir_entry *acpi_processor_dir = NULL;
 262
 263static int acpi_processor_info_seq_show(struct seq_file *seq, void *offset)
 264{
 265        struct acpi_processor *pr = seq->private;
 266
 267
 268        if (!pr)
 269                goto end;
 270
 271        seq_printf(seq, "processor id:            %d\n"
 272                   "acpi id:                 %d\n"
 273                   "bus mastering control:   %s\n"
 274                   "power management:        %s\n"
 275                   "throttling control:      %s\n"
 276                   "limit interface:         %s\n",
 277                   pr->id,
 278                   pr->acpi_id,
 279                   pr->flags.bm_control ? "yes" : "no",
 280                   pr->flags.power ? "yes" : "no",
 281                   pr->flags.throttling ? "yes" : "no",
 282                   pr->flags.limit ? "yes" : "no");
 283
 284      end:
 285        return 0;
 286}
 287
 288static int acpi_processor_info_open_fs(struct inode *inode, struct file *file)
 289{
 290        return single_open(file, acpi_processor_info_seq_show,
 291                           PDE(inode)->data);
 292}
 293
 294static int __cpuinit acpi_processor_add_fs(struct acpi_device *device)
 295{
 296        struct proc_dir_entry *entry = NULL;
 297
 298
 299        if (!acpi_device_dir(device)) {
 300                acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
 301                                                     acpi_processor_dir);
 302                if (!acpi_device_dir(device))
 303                        return -ENODEV;
 304        }
 305
 306        /* 'info' [R] */
 307        entry = proc_create_data(ACPI_PROCESSOR_FILE_INFO,
 308                                 S_IRUGO, acpi_device_dir(device),
 309                                 &acpi_processor_info_fops,
 310                                 acpi_driver_data(device));
 311        if (!entry)
 312                return -EIO;
 313
 314        /* 'throttling' [R/W] */
 315        entry = proc_create_data(ACPI_PROCESSOR_FILE_THROTTLING,
 316                                 S_IFREG | S_IRUGO | S_IWUSR,
 317                                 acpi_device_dir(device),
 318                                 &acpi_processor_throttling_fops,
 319                                 acpi_driver_data(device));
 320        if (!entry)
 321                return -EIO;
 322
 323        /* 'limit' [R/W] */
 324        entry = proc_create_data(ACPI_PROCESSOR_FILE_LIMIT,
 325                                 S_IFREG | S_IRUGO | S_IWUSR,
 326                                 acpi_device_dir(device),
 327                                 &acpi_processor_limit_fops,
 328                                 acpi_driver_data(device));
 329        if (!entry)
 330                return -EIO;
 331        return 0;
 332}
 333static int acpi_processor_remove_fs(struct acpi_device *device)
 334{
 335
 336        if (acpi_device_dir(device)) {
 337                remove_proc_entry(ACPI_PROCESSOR_FILE_INFO,
 338                                  acpi_device_dir(device));
 339                remove_proc_entry(ACPI_PROCESSOR_FILE_THROTTLING,
 340                                  acpi_device_dir(device));
 341                remove_proc_entry(ACPI_PROCESSOR_FILE_LIMIT,
 342                                  acpi_device_dir(device));
 343                remove_proc_entry(acpi_device_bid(device), acpi_processor_dir);
 344                acpi_device_dir(device) = NULL;
 345        }
 346
 347        return 0;
 348}
 349#else
 350static inline int acpi_processor_add_fs(struct acpi_device *device)
 351{
 352        return 0;
 353}
 354static inline int acpi_processor_remove_fs(struct acpi_device *device)
 355{
 356        return 0;
 357}
 358#endif
 359
 360/* Use the acpiid in MADT to map cpus in case of SMP */
 361
 362#ifndef CONFIG_SMP
 363static int get_cpu_id(acpi_handle handle, int type, u32 acpi_id) { return -1; }
 364#else
 365
 366static struct acpi_table_madt *madt;
 367
 368static int map_lapic_id(struct acpi_subtable_header *entry,
 369                 u32 acpi_id, int *apic_id)
 370{
 371        struct acpi_madt_local_apic *lapic =
 372                (struct acpi_madt_local_apic *)entry;
 373        if ((lapic->lapic_flags & ACPI_MADT_ENABLED) &&
 374            lapic->processor_id == acpi_id) {
 375                *apic_id = lapic->id;
 376                return 1;
 377        }
 378        return 0;
 379}
 380
 381static int map_x2apic_id(struct acpi_subtable_header *entry,
 382                         int device_declaration, u32 acpi_id, int *apic_id)
 383{
 384        struct acpi_madt_local_x2apic *apic =
 385                (struct acpi_madt_local_x2apic *)entry;
 386        u32 tmp = apic->local_apic_id;
 387
 388        /* Only check enabled APICs*/
 389        if (!(apic->lapic_flags & ACPI_MADT_ENABLED))
 390                return 0;
 391
 392        /* Device statement declaration type */
 393        if (device_declaration) {
 394                if (apic->uid == acpi_id)
 395                        goto found;
 396        }
 397
 398        return 0;
 399found:
 400        *apic_id = tmp;
 401        return 1;
 402}
 403
 404static int map_lsapic_id(struct acpi_subtable_header *entry,
 405                int device_declaration, u32 acpi_id, int *apic_id)
 406{
 407        struct acpi_madt_local_sapic *lsapic =
 408                (struct acpi_madt_local_sapic *)entry;
 409        u32 tmp = (lsapic->id << 8) | lsapic->eid;
 410
 411        /* Only check enabled APICs*/
 412        if (!(lsapic->lapic_flags & ACPI_MADT_ENABLED))
 413                return 0;
 414
 415        /* Device statement declaration type */
 416        if (device_declaration) {
 417                if (entry->length < 16)
 418                        printk(KERN_ERR PREFIX
 419                            "Invalid LSAPIC with Device type processor (SAPIC ID %#x)\n",
 420                            tmp);
 421                else if (lsapic->uid == acpi_id)
 422                        goto found;
 423        /* Processor statement declaration type */
 424        } else if (lsapic->processor_id == acpi_id)
 425                goto found;
 426
 427        return 0;
 428found:
 429        *apic_id = tmp;
 430        return 1;
 431}
 432
 433static int map_madt_entry(int type, u32 acpi_id)
 434{
 435        unsigned long madt_end, entry;
 436        int apic_id = -1;
 437
 438        if (!madt)
 439                return apic_id;
 440
 441        entry = (unsigned long)madt;
 442        madt_end = entry + madt->header.length;
 443
 444        /* Parse all entries looking for a match. */
 445
 446        entry += sizeof(struct acpi_table_madt);
 447        while (entry + sizeof(struct acpi_subtable_header) < madt_end) {
 448                struct acpi_subtable_header *header =
 449                        (struct acpi_subtable_header *)entry;
 450                if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) {
 451                        if (map_lapic_id(header, acpi_id, &apic_id))
 452                                break;
 453                } else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) {
 454                        if (map_x2apic_id(header, type, acpi_id, &apic_id))
 455                                break;
 456                } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) {
 457                        if (map_lsapic_id(header, type, acpi_id, &apic_id))
 458                                break;
 459                }
 460                entry += header->length;
 461        }
 462        return apic_id;
 463}
 464
 465static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id)
 466{
 467        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
 468        union acpi_object *obj;
 469        struct acpi_subtable_header *header;
 470        int apic_id = -1;
 471
 472        if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer)))
 473                goto exit;
 474
 475        if (!buffer.length || !buffer.pointer)
 476                goto exit;
 477
 478        obj = buffer.pointer;
 479        if (obj->type != ACPI_TYPE_BUFFER ||
 480            obj->buffer.length < sizeof(struct acpi_subtable_header)) {
 481                goto exit;
 482        }
 483
 484        header = (struct acpi_subtable_header *)obj->buffer.pointer;
 485        if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) {
 486                map_lapic_id(header, acpi_id, &apic_id);
 487        } else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) {
 488                map_lsapic_id(header, type, acpi_id, &apic_id);
 489        }
 490
 491exit:
 492        if (buffer.pointer)
 493                kfree(buffer.pointer);
 494        return apic_id;
 495}
 496
 497static int get_cpu_id(acpi_handle handle, int type, u32 acpi_id)
 498{
 499        int i;
 500        int apic_id = -1;
 501
 502        apic_id = map_mat_entry(handle, type, acpi_id);
 503        if (apic_id == -1)
 504                apic_id = map_madt_entry(type, acpi_id);
 505        if (apic_id == -1)
 506                return apic_id;
 507
 508        for_each_possible_cpu(i) {
 509                if (cpu_physical_id(i) == apic_id)
 510                        return i;
 511        }
 512        return -1;
 513}
 514#endif
 515
 516/* --------------------------------------------------------------------------
 517                                 Driver Interface
 518   -------------------------------------------------------------------------- */
 519
 520static int acpi_processor_get_info(struct acpi_device *device)
 521{
 522        acpi_status status = 0;
 523        union acpi_object object = { 0 };
 524        struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
 525        struct acpi_processor *pr;
 526        int cpu_index, device_declaration = 0;
 527        static int cpu0_initialized;
 528
 529        pr = acpi_driver_data(device);
 530        if (!pr)
 531                return -EINVAL;
 532
 533        if (num_online_cpus() > 1)
 534                errata.smp = TRUE;
 535
 536        acpi_processor_errata(pr);
 537
 538        /*
 539         * Check to see if we have bus mastering arbitration control.  This
 540         * is required for proper C3 usage (to maintain cache coherency).
 541         */
 542        if (acpi_gbl_FADT.pm2_control_block && acpi_gbl_FADT.pm2_control_length) {
 543                pr->flags.bm_control = 1;
 544                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 545                                  "Bus mastering arbitration control present\n"));
 546        } else
 547                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 548                                  "No bus mastering arbitration control\n"));
 549
 550        if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) {
 551                /* Declared with "Processor" statement; match ProcessorID */
 552                status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer);
 553                if (ACPI_FAILURE(status)) {
 554                        printk(KERN_ERR PREFIX "Evaluating processor object\n");
 555                        return -ENODEV;
 556                }
 557
 558                /*
 559                 * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP.
 560                 *      >>> 'acpi_get_processor_id(acpi_id, &id)' in
 561                 *      arch/xxx/acpi.c
 562                 */
 563                pr->acpi_id = object.processor.proc_id;
 564        } else {
 565                /*
 566                 * Declared with "Device" statement; match _UID.
 567                 * Note that we don't handle string _UIDs yet.
 568                 */
 569                unsigned long long value;
 570                status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID,
 571                                                NULL, &value);
 572                if (ACPI_FAILURE(status)) {
 573                        printk(KERN_ERR PREFIX
 574                            "Evaluating processor _UID [%#x]\n", status);
 575                        return -ENODEV;
 576                }
 577                device_declaration = 1;
 578                pr->acpi_id = value;
 579        }
 580        cpu_index = get_cpu_id(pr->handle, device_declaration, pr->acpi_id);
 581
 582        /* Handle UP system running SMP kernel, with no LAPIC in MADT */
 583        if (!cpu0_initialized && (cpu_index == -1) &&
 584            (num_online_cpus() == 1)) {
 585                cpu_index = 0;
 586        }
 587
 588        cpu0_initialized = 1;
 589
 590        pr->id = cpu_index;
 591
 592        /*
 593         *  Extra Processor objects may be enumerated on MP systems with
 594         *  less than the max # of CPUs. They should be ignored _iff
 595         *  they are physically not present.
 596         */
 597        if (pr->id == -1) {
 598                if (ACPI_FAILURE
 599                    (acpi_processor_hotadd_init(pr->handle, &pr->id))) {
 600                        return -ENODEV;
 601                }
 602        }
 603        /*
 604         * On some boxes several processors use the same processor bus id.
 605         * But they are located in different scope. For example:
 606         * \_SB.SCK0.CPU0
 607         * \_SB.SCK1.CPU0
 608         * Rename the processor device bus id. And the new bus id will be
 609         * generated as the following format:
 610         * CPU+CPU ID.
 611         */
 612        sprintf(acpi_device_bid(device), "CPU%X", pr->id);
 613        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id,
 614                          pr->acpi_id));
 615
 616        if (!object.processor.pblk_address)
 617                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n"));
 618        else if (object.processor.pblk_length != 6)
 619                printk(KERN_ERR PREFIX "Invalid PBLK length [%d]\n",
 620                            object.processor.pblk_length);
 621        else {
 622                pr->throttling.address = object.processor.pblk_address;
 623                pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset;
 624                pr->throttling.duty_width = acpi_gbl_FADT.duty_width;
 625
 626                pr->pblk = object.processor.pblk_address;
 627
 628                /*
 629                 * We don't care about error returns - we just try to mark
 630                 * these reserved so that nobody else is confused into thinking
 631                 * that this region might be unused..
 632                 *
 633                 * (In particular, allocating the IO range for Cardbus)
 634                 */
 635                request_region(pr->throttling.address, 6, "ACPI CPU throttle");
 636        }
 637
 638        /*
 639         * If ACPI describes a slot number for this CPU, we can use it
 640         * ensure we get the right value in the "physical id" field
 641         * of /proc/cpuinfo
 642         */
 643        status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer);
 644        if (ACPI_SUCCESS(status))
 645                arch_fix_phys_package_id(pr->id, object.integer.value);
 646
 647        return 0;
 648}
 649
 650static DEFINE_PER_CPU(void *, processor_device_array);
 651
 652static void acpi_processor_notify(struct acpi_device *device, u32 event)
 653{
 654        struct acpi_processor *pr = acpi_driver_data(device);
 655        int saved;
 656
 657        if (!pr)
 658                return;
 659
 660        switch (event) {
 661        case ACPI_PROCESSOR_NOTIFY_PERFORMANCE:
 662                saved = pr->performance_platform_limit;
 663                acpi_processor_ppc_has_changed(pr, 1);
 664                if (saved == pr->performance_platform_limit)
 665                        break;
 666                acpi_bus_generate_proc_event(device, event,
 667                                        pr->performance_platform_limit);
 668                acpi_bus_generate_netlink_event(device->pnp.device_class,
 669                                                  dev_name(&device->dev), event,
 670                                                  pr->performance_platform_limit);
 671                break;
 672        case ACPI_PROCESSOR_NOTIFY_POWER:
 673                acpi_processor_cst_has_changed(pr);
 674                acpi_bus_generate_proc_event(device, event, 0);
 675                acpi_bus_generate_netlink_event(device->pnp.device_class,
 676                                                  dev_name(&device->dev), event, 0);
 677                break;
 678        case ACPI_PROCESSOR_NOTIFY_THROTTLING:
 679                acpi_processor_tstate_has_changed(pr);
 680                acpi_bus_generate_proc_event(device, event, 0);
 681                acpi_bus_generate_netlink_event(device->pnp.device_class,
 682                                                  dev_name(&device->dev), event, 0);
 683        default:
 684                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 685                                  "Unsupported event [0x%x]\n", event));
 686                break;
 687        }
 688
 689        return;
 690}
 691
 692static int acpi_cpu_soft_notify(struct notifier_block *nfb,
 693                unsigned long action, void *hcpu)
 694{
 695        unsigned int cpu = (unsigned long)hcpu;
 696        struct acpi_processor *pr = per_cpu(processors, cpu);
 697
 698        if (action == CPU_ONLINE && pr) {
 699                acpi_processor_ppc_has_changed(pr, 0);
 700                acpi_processor_cst_has_changed(pr);
 701                acpi_processor_tstate_has_changed(pr);
 702        }
 703        return NOTIFY_OK;
 704}
 705
 706static struct notifier_block acpi_cpu_notifier =
 707{
 708            .notifier_call = acpi_cpu_soft_notify,
 709};
 710
 711static int __cpuinit acpi_processor_add(struct acpi_device *device)
 712{
 713        struct acpi_processor *pr = NULL;
 714        int result = 0;
 715        struct sys_device *sysdev;
 716
 717        pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL);
 718        if (!pr)
 719                return -ENOMEM;
 720
 721        if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) {
 722                kfree(pr);
 723                return -ENOMEM;
 724        }
 725
 726        pr->handle = device->handle;
 727        strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME);
 728        strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS);
 729        device->driver_data = pr;
 730
 731        result = acpi_processor_get_info(device);
 732        if (result) {
 733                /* Processor is physically not present */
 734                return 0;
 735        }
 736
 737        BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0));
 738
 739        /*
 740         * Buggy BIOS check
 741         * ACPI id of processors can be reported wrongly by the BIOS.
 742         * Don't trust it blindly
 743         */
 744        if (per_cpu(processor_device_array, pr->id) != NULL &&
 745            per_cpu(processor_device_array, pr->id) != device) {
 746                printk(KERN_WARNING "BIOS reported wrong ACPI id "
 747                        "for the processor\n");
 748                result = -ENODEV;
 749                goto err_free_cpumask;
 750        }
 751        per_cpu(processor_device_array, pr->id) = device;
 752
 753        per_cpu(processors, pr->id) = pr;
 754
 755        result = acpi_processor_add_fs(device);
 756        if (result)
 757                goto err_free_cpumask;
 758
 759        sysdev = get_cpu_sysdev(pr->id);
 760        if (sysfs_create_link(&device->dev.kobj, &sysdev->kobj, "sysdev")) {
 761                result = -EFAULT;
 762                goto err_remove_fs;
 763        }
 764
 765        /* _PDC call should be done before doing anything else (if reqd.). */
 766        acpi_processor_set_pdc(pr->handle);
 767
 768#ifdef CONFIG_CPU_FREQ
 769        acpi_processor_ppc_has_changed(pr, 0);
 770#endif
 771        acpi_processor_get_throttling_info(pr);
 772        acpi_processor_get_limit_info(pr);
 773
 774
 775        acpi_processor_power_init(pr, device);
 776
 777        pr->cdev = thermal_cooling_device_register("Processor", device,
 778                                                &processor_cooling_ops);
 779        if (IS_ERR(pr->cdev)) {
 780                result = PTR_ERR(pr->cdev);
 781                goto err_power_exit;
 782        }
 783
 784        dev_dbg(&device->dev, "registered as cooling_device%d\n",
 785                 pr->cdev->id);
 786
 787        result = sysfs_create_link(&device->dev.kobj,
 788                                   &pr->cdev->device.kobj,
 789                                   "thermal_cooling");
 790        if (result) {
 791                printk(KERN_ERR PREFIX "Create sysfs link\n");
 792                goto err_thermal_unregister;
 793        }
 794        result = sysfs_create_link(&pr->cdev->device.kobj,
 795                                   &device->dev.kobj,
 796                                   "device");
 797        if (result) {
 798                printk(KERN_ERR PREFIX "Create sysfs link\n");
 799                goto err_remove_sysfs;
 800        }
 801
 802        return 0;
 803
 804err_remove_sysfs:
 805        sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
 806err_thermal_unregister:
 807        thermal_cooling_device_unregister(pr->cdev);
 808err_power_exit:
 809        acpi_processor_power_exit(pr, device);
 810err_remove_fs:
 811        acpi_processor_remove_fs(device);
 812err_free_cpumask:
 813        free_cpumask_var(pr->throttling.shared_cpu_map);
 814
 815        return result;
 816}
 817
 818static int acpi_processor_remove(struct acpi_device *device, int type)
 819{
 820        struct acpi_processor *pr = NULL;
 821
 822
 823        if (!device || !acpi_driver_data(device))
 824                return -EINVAL;
 825
 826        pr = acpi_driver_data(device);
 827
 828        if (pr->id >= nr_cpu_ids)
 829                goto free;
 830
 831        if (type == ACPI_BUS_REMOVAL_EJECT) {
 832                if (acpi_processor_handle_eject(pr))
 833                        return -EINVAL;
 834        }
 835
 836        acpi_processor_power_exit(pr, device);
 837
 838        sysfs_remove_link(&device->dev.kobj, "sysdev");
 839
 840        acpi_processor_remove_fs(device);
 841
 842        if (pr->cdev) {
 843                sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
 844                sysfs_remove_link(&pr->cdev->device.kobj, "device");
 845                thermal_cooling_device_unregister(pr->cdev);
 846                pr->cdev = NULL;
 847        }
 848
 849        per_cpu(processors, pr->id) = NULL;
 850        per_cpu(processor_device_array, pr->id) = NULL;
 851
 852free:
 853        free_cpumask_var(pr->throttling.shared_cpu_map);
 854        kfree(pr);
 855
 856        return 0;
 857}
 858
 859#ifdef CONFIG_ACPI_HOTPLUG_CPU
 860/****************************************************************************
 861 *      Acpi processor hotplug support                                      *
 862 ****************************************************************************/
 863
 864static int is_processor_present(acpi_handle handle)
 865{
 866        acpi_status status;
 867        unsigned long long sta = 0;
 868
 869
 870        status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
 871
 872        if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT))
 873                return 1;
 874
 875        /*
 876         * _STA is mandatory for a processor that supports hot plug
 877         */
 878        if (status == AE_NOT_FOUND)
 879                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 880                                "Processor does not support hot plug\n"));
 881        else
 882                ACPI_EXCEPTION((AE_INFO, status,
 883                                "Processor Device is not present"));
 884        return 0;
 885}
 886
 887static
 888int acpi_processor_device_add(acpi_handle handle, struct acpi_device **device)
 889{
 890        acpi_handle phandle;
 891        struct acpi_device *pdev;
 892
 893
 894        if (acpi_get_parent(handle, &phandle)) {
 895                return -ENODEV;
 896        }
 897
 898        if (acpi_bus_get_device(phandle, &pdev)) {
 899                return -ENODEV;
 900        }
 901
 902        if (acpi_bus_add(device, pdev, handle, ACPI_BUS_TYPE_PROCESSOR)) {
 903                return -ENODEV;
 904        }
 905
 906        return 0;
 907}
 908
 909static void __ref acpi_processor_hotplug_notify(acpi_handle handle,
 910                                                u32 event, void *data)
 911{
 912        struct acpi_processor *pr;
 913        struct acpi_device *device = NULL;
 914        int result;
 915
 916
 917        switch (event) {
 918        case ACPI_NOTIFY_BUS_CHECK:
 919        case ACPI_NOTIFY_DEVICE_CHECK:
 920                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 921                "Processor driver received %s event\n",
 922                       (event == ACPI_NOTIFY_BUS_CHECK) ?
 923                       "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK"));
 924
 925                if (!is_processor_present(handle))
 926                        break;
 927
 928                if (acpi_bus_get_device(handle, &device)) {
 929                        result = acpi_processor_device_add(handle, &device);
 930                        if (result)
 931                                printk(KERN_ERR PREFIX
 932                                            "Unable to add the device\n");
 933                        break;
 934                }
 935                break;
 936        case ACPI_NOTIFY_EJECT_REQUEST:
 937                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 938                                  "received ACPI_NOTIFY_EJECT_REQUEST\n"));
 939
 940                if (acpi_bus_get_device(handle, &device)) {
 941                        printk(KERN_ERR PREFIX
 942                                    "Device don't exist, dropping EJECT\n");
 943                        break;
 944                }
 945                pr = acpi_driver_data(device);
 946                if (!pr) {
 947                        printk(KERN_ERR PREFIX
 948                                    "Driver data is NULL, dropping EJECT\n");
 949                        return;
 950                }
 951                break;
 952        default:
 953                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 954                                  "Unsupported event [0x%x]\n", event));
 955                break;
 956        }
 957
 958        return;
 959}
 960
 961static acpi_status
 962processor_walk_namespace_cb(acpi_handle handle,
 963                            u32 lvl, void *context, void **rv)
 964{
 965        acpi_status status;
 966        int *action = context;
 967        acpi_object_type type = 0;
 968
 969        status = acpi_get_type(handle, &type);
 970        if (ACPI_FAILURE(status))
 971                return (AE_OK);
 972
 973        if (type != ACPI_TYPE_PROCESSOR)
 974                return (AE_OK);
 975
 976        switch (*action) {
 977        case INSTALL_NOTIFY_HANDLER:
 978                acpi_install_notify_handler(handle,
 979                                            ACPI_SYSTEM_NOTIFY,
 980                                            acpi_processor_hotplug_notify,
 981                                            NULL);
 982                break;
 983        case UNINSTALL_NOTIFY_HANDLER:
 984                acpi_remove_notify_handler(handle,
 985                                           ACPI_SYSTEM_NOTIFY,
 986                                           acpi_processor_hotplug_notify);
 987                break;
 988        default:
 989                break;
 990        }
 991
 992        return (AE_OK);
 993}
 994
 995static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu)
 996{
 997
 998        if (!is_processor_present(handle)) {
 999                return AE_ERROR;
1000        }
1001
1002        if (acpi_map_lsapic(handle, p_cpu))
1003                return AE_ERROR;
1004
1005        if (arch_register_cpu(*p_cpu)) {
1006                acpi_unmap_lsapic(*p_cpu);
1007                return AE_ERROR;
1008        }
1009
1010        return AE_OK;
1011}
1012
1013static int acpi_processor_handle_eject(struct acpi_processor *pr)
1014{
1015        if (cpu_online(pr->id))
1016                cpu_down(pr->id);
1017
1018        arch_unregister_cpu(pr->id);
1019        acpi_unmap_lsapic(pr->id);
1020        return (0);
1021}
1022#else
1023static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu)
1024{
1025        return AE_ERROR;
1026}
1027static int acpi_processor_handle_eject(struct acpi_processor *pr)
1028{
1029        return (-EINVAL);
1030}
1031#endif
1032
1033static
1034void acpi_processor_install_hotplug_notify(void)
1035{
1036#ifdef CONFIG_ACPI_HOTPLUG_CPU
1037        int action = INSTALL_NOTIFY_HANDLER;
1038        acpi_walk_namespace(ACPI_TYPE_PROCESSOR,
1039                            ACPI_ROOT_OBJECT,
1040                            ACPI_UINT32_MAX,
1041                            processor_walk_namespace_cb, NULL, &action, NULL);
1042#endif
1043        register_hotcpu_notifier(&acpi_cpu_notifier);
1044}
1045
1046static
1047void acpi_processor_uninstall_hotplug_notify(void)
1048{
1049#ifdef CONFIG_ACPI_HOTPLUG_CPU
1050        int action = UNINSTALL_NOTIFY_HANDLER;
1051        acpi_walk_namespace(ACPI_TYPE_PROCESSOR,
1052                            ACPI_ROOT_OBJECT,
1053                            ACPI_UINT32_MAX,
1054                            processor_walk_namespace_cb, NULL, &action, NULL);
1055#endif
1056        unregister_hotcpu_notifier(&acpi_cpu_notifier);
1057}
1058
1059/*
1060 * We keep the driver loaded even when ACPI is not running.
1061 * This is needed for the powernow-k8 driver, that works even without
1062 * ACPI, but needs symbols from this driver
1063 */
1064
1065static int __init acpi_processor_init(void)
1066{
1067        int result = 0;
1068
1069        if (acpi_disabled)
1070                return 0;
1071
1072        memset(&errata, 0, sizeof(errata));
1073
1074#ifdef CONFIG_SMP
1075        if (ACPI_FAILURE(acpi_get_table(ACPI_SIG_MADT, 0,
1076                                (struct acpi_table_header **)&madt)))
1077                madt = NULL;
1078#endif
1079#ifdef CONFIG_ACPI_PROCFS
1080        acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir);
1081        if (!acpi_processor_dir)
1082                return -ENOMEM;
1083#endif
1084        result = cpuidle_register_driver(&acpi_idle_driver);
1085        if (result < 0)
1086                goto out_proc;
1087
1088        result = acpi_bus_register_driver(&acpi_processor_driver);
1089        if (result < 0)
1090                goto out_cpuidle;
1091
1092        acpi_processor_install_hotplug_notify();
1093
1094        acpi_thermal_cpufreq_init();
1095
1096        acpi_processor_ppc_init();
1097
1098        acpi_processor_throttling_init();
1099
1100        return 0;
1101
1102out_cpuidle:
1103        cpuidle_unregister_driver(&acpi_idle_driver);
1104
1105out_proc:
1106#ifdef CONFIG_ACPI_PROCFS
1107        remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir);
1108#endif
1109
1110        return result;
1111}
1112
1113static void __exit acpi_processor_exit(void)
1114{
1115        if (acpi_disabled)
1116                return;
1117
1118        acpi_processor_ppc_exit();
1119
1120        acpi_thermal_cpufreq_exit();
1121
1122        acpi_processor_uninstall_hotplug_notify();
1123
1124        acpi_bus_unregister_driver(&acpi_processor_driver);
1125
1126        cpuidle_unregister_driver(&acpi_idle_driver);
1127
1128#ifdef CONFIG_ACPI_PROCFS
1129        remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir);
1130#endif
1131
1132        return;
1133}
1134
1135module_init(acpi_processor_init);
1136module_exit(acpi_processor_exit);
1137
1138EXPORT_SYMBOL(acpi_processor_set_thermal_limit);
1139
1140MODULE_ALIAS("processor");
1141
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.