linux/drivers/acpi/processor_throttling.c
<<
>>
Prefs
   1/*
   2 * processor_throttling.c - Throttling submodule of the ACPI processor driver
   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 */
  28
  29#include <linux/kernel.h>
  30#include <linux/module.h>
  31#include <linux/init.h>
  32#include <linux/sched.h>
  33#include <linux/cpufreq.h>
  34#include <linux/proc_fs.h>
  35#include <linux/seq_file.h>
  36
  37#include <asm/io.h>
  38#include <asm/uaccess.h>
  39
  40#include <acpi/acpi_bus.h>
  41#include <acpi/acpi_drivers.h>
  42#include <acpi/processor.h>
  43
  44#define ACPI_PROCESSOR_CLASS            "processor"
  45#define _COMPONENT              ACPI_PROCESSOR_COMPONENT
  46ACPI_MODULE_NAME("processor_throttling");
  47
  48/* ignore_tpc:
  49 *  0 -> acpi processor driver doesn't ignore _TPC values
  50 *  1 -> acpi processor driver ignores _TPC values
  51 */
  52static int ignore_tpc;
  53module_param(ignore_tpc, int, 0644);
  54MODULE_PARM_DESC(ignore_tpc, "Disable broken BIOS _TPC throttling support");
  55
  56struct throttling_tstate {
  57        unsigned int cpu;               /* cpu nr */
  58        int target_state;               /* target T-state */
  59};
  60
  61#define THROTTLING_PRECHANGE       (1)
  62#define THROTTLING_POSTCHANGE      (2)
  63
  64static int acpi_processor_get_throttling(struct acpi_processor *pr);
  65int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
  66
  67static int acpi_processor_update_tsd_coord(void)
  68{
  69        int count, count_target;
  70        int retval = 0;
  71        unsigned int i, j;
  72        cpumask_var_t covered_cpus;
  73        struct acpi_processor *pr, *match_pr;
  74        struct acpi_tsd_package *pdomain, *match_pdomain;
  75        struct acpi_processor_throttling *pthrottling, *match_pthrottling;
  76
  77        if (!alloc_cpumask_var(&covered_cpus, GFP_KERNEL))
  78                return -ENOMEM;
  79
  80        /*
  81         * Now that we have _TSD data from all CPUs, lets setup T-state
  82         * coordination between all CPUs.
  83         */
  84        for_each_possible_cpu(i) {
  85                pr = per_cpu(processors, i);
  86                if (!pr)
  87                        continue;
  88
  89                /* Basic validity check for domain info */
  90                pthrottling = &(pr->throttling);
  91
  92                /*
  93                 * If tsd package for one cpu is invalid, the coordination
  94                 * among all CPUs is thought as invalid.
  95                 * Maybe it is ugly.
  96                 */
  97                if (!pthrottling->tsd_valid_flag) {
  98                        retval = -EINVAL;
  99                        break;
 100                }
 101        }
 102        if (retval)
 103                goto err_ret;
 104
 105        cpumask_clear(covered_cpus);
 106        for_each_possible_cpu(i) {
 107                pr = per_cpu(processors, i);
 108                if (!pr)
 109                        continue;
 110
 111                if (cpumask_test_cpu(i, covered_cpus))
 112                        continue;
 113                pthrottling = &pr->throttling;
 114
 115                pdomain = &(pthrottling->domain_info);
 116                cpumask_set_cpu(i, pthrottling->shared_cpu_map);
 117                cpumask_set_cpu(i, covered_cpus);
 118                /*
 119                 * If the number of processor in the TSD domain is 1, it is
 120                 * unnecessary to parse the coordination for this CPU.
 121                 */
 122                if (pdomain->num_processors <= 1)
 123                        continue;
 124
 125                /* Validate the Domain info */
 126                count_target = pdomain->num_processors;
 127                count = 1;
 128
 129                for_each_possible_cpu(j) {
 130                        if (i == j)
 131                                continue;
 132
 133                        match_pr = per_cpu(processors, j);
 134                        if (!match_pr)
 135                                continue;
 136
 137                        match_pthrottling = &(match_pr->throttling);
 138                        match_pdomain = &(match_pthrottling->domain_info);
 139                        if (match_pdomain->domain != pdomain->domain)
 140                                continue;
 141
 142                        /* Here i and j are in the same domain.
 143                         * If two TSD packages have the same domain, they
 144                         * should have the same num_porcessors and
 145                         * coordination type. Otherwise it will be regarded
 146                         * as illegal.
 147                         */
 148                        if (match_pdomain->num_processors != count_target) {
 149                                retval = -EINVAL;
 150                                goto err_ret;
 151                        }
 152
 153                        if (pdomain->coord_type != match_pdomain->coord_type) {
 154                                retval = -EINVAL;
 155                                goto err_ret;
 156                        }
 157
 158                        cpumask_set_cpu(j, covered_cpus);
 159                        cpumask_set_cpu(j, pthrottling->shared_cpu_map);
 160                        count++;
 161                }
 162                for_each_possible_cpu(j) {
 163                        if (i == j)
 164                                continue;
 165
 166                        match_pr = per_cpu(processors, j);
 167                        if (!match_pr)
 168                                continue;
 169
 170                        match_pthrottling = &(match_pr->throttling);
 171                        match_pdomain = &(match_pthrottling->domain_info);
 172                        if (match_pdomain->domain != pdomain->domain)
 173                                continue;
 174
 175                        /*
 176                         * If some CPUS have the same domain, they
 177                         * will have the same shared_cpu_map.
 178                         */
 179                        cpumask_copy(match_pthrottling->shared_cpu_map,
 180                                     pthrottling->shared_cpu_map);
 181                }
 182        }
 183
 184err_ret:
 185        free_cpumask_var(covered_cpus);
 186
 187        for_each_possible_cpu(i) {
 188                pr = per_cpu(processors, i);
 189                if (!pr)
 190                        continue;
 191
 192                /*
 193                 * Assume no coordination on any error parsing domain info.
 194                 * The coordination type will be forced as SW_ALL.
 195                 */
 196                if (retval) {
 197                        pthrottling = &(pr->throttling);
 198                        cpumask_clear(pthrottling->shared_cpu_map);
 199                        cpumask_set_cpu(i, pthrottling->shared_cpu_map);
 200                        pthrottling->shared_type = DOMAIN_COORD_TYPE_SW_ALL;
 201                }
 202        }
 203
 204        return retval;
 205}
 206
 207/*
 208 * Update the T-state coordination after the _TSD
 209 * data for all cpus is obtained.
 210 */
 211void acpi_processor_throttling_init(void)
 212{
 213        if (acpi_processor_update_tsd_coord())
 214                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 215                        "Assume no T-state coordination\n"));
 216
 217        return;
 218}
 219
 220static int acpi_processor_throttling_notifier(unsigned long event, void *data)
 221{
 222        struct throttling_tstate *p_tstate = data;
 223        struct acpi_processor *pr;
 224        unsigned int cpu ;
 225        int target_state;
 226        struct acpi_processor_limit *p_limit;
 227        struct acpi_processor_throttling *p_throttling;
 228
 229        cpu = p_tstate->cpu;
 230        pr = per_cpu(processors, cpu);
 231        if (!pr) {
 232                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Invalid pr pointer\n"));
 233                return 0;
 234        }
 235        if (!pr->flags.throttling) {
 236                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Throttling control is "
 237                                "unsupported on CPU %d\n", cpu));
 238                return 0;
 239        }
 240        target_state = p_tstate->target_state;
 241        p_throttling = &(pr->throttling);
 242        switch (event) {
 243        case THROTTLING_PRECHANGE:
 244                /*
 245                 * Prechange event is used to choose one proper t-state,
 246                 * which meets the limits of thermal, user and _TPC.
 247                 */
 248                p_limit = &pr->limit;
 249                if (p_limit->thermal.tx > target_state)
 250                        target_state = p_limit->thermal.tx;
 251                if (p_limit->user.tx > target_state)
 252                        target_state = p_limit->user.tx;
 253                if (pr->throttling_platform_limit > target_state)
 254                        target_state = pr->throttling_platform_limit;
 255                if (target_state >= p_throttling->state_count) {
 256                        printk(KERN_WARNING
 257                                "Exceed the limit of T-state \n");
 258                        target_state = p_throttling->state_count - 1;
 259                }
 260                p_tstate->target_state = target_state;
 261                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "PreChange Event:"
 262                                "target T-state of CPU %d is T%d\n",
 263                                cpu, target_state));
 264                break;
 265        case THROTTLING_POSTCHANGE:
 266                /*
 267                 * Postchange event is only used to update the
 268                 * T-state flag of acpi_processor_throttling.
 269                 */
 270                p_throttling->state = target_state;
 271                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "PostChange Event:"
 272                                "CPU %d is switched to T%d\n",
 273                                cpu, target_state));
 274                break;
 275        default:
 276                printk(KERN_WARNING
 277                        "Unsupported Throttling notifier event\n");
 278                break;
 279        }
 280
 281        return 0;
 282}
 283
 284/*
 285 * _TPC - Throttling Present Capabilities
 286 */
 287static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
 288{
 289        acpi_status status = 0;
 290        unsigned long long tpc = 0;
 291
 292        if (!pr)
 293                return -EINVAL;
 294
 295        if (ignore_tpc)
 296                goto end;
 297
 298        status = acpi_evaluate_integer(pr->handle, "_TPC", NULL, &tpc);
 299        if (ACPI_FAILURE(status)) {
 300                if (status != AE_NOT_FOUND) {
 301                        ACPI_EXCEPTION((AE_INFO, status, "Evaluating _TPC"));
 302                }
 303                return -ENODEV;
 304        }
 305
 306end:
 307        pr->throttling_platform_limit = (int)tpc;
 308        return 0;
 309}
 310
 311int acpi_processor_tstate_has_changed(struct acpi_processor *pr)
 312{
 313        int result = 0;
 314        int throttling_limit;
 315        int current_state;
 316        struct acpi_processor_limit *limit;
 317        int target_state;
 318
 319        if (ignore_tpc)
 320                return 0;
 321
 322        result = acpi_processor_get_platform_limit(pr);
 323        if (result) {
 324                /* Throttling Limit is unsupported */
 325                return result;
 326        }
 327
 328        throttling_limit = pr->throttling_platform_limit;
 329        if (throttling_limit >= pr->throttling.state_count) {
 330                /* Uncorrect Throttling Limit */
 331                return -EINVAL;
 332        }
 333
 334        current_state = pr->throttling.state;
 335        if (current_state > throttling_limit) {
 336                /*
 337                 * The current state can meet the requirement of
 338                 * _TPC limit. But it is reasonable that OSPM changes
 339                 * t-states from high to low for better performance.
 340                 * Of course the limit condition of thermal
 341                 * and user should be considered.
 342                 */
 343                limit = &pr->limit;
 344                target_state = throttling_limit;
 345                if (limit->thermal.tx > target_state)
 346                        target_state = limit->thermal.tx;
 347                if (limit->user.tx > target_state)
 348                        target_state = limit->user.tx;
 349        } else if (current_state == throttling_limit) {
 350                /*
 351                 * Unnecessary to change the throttling state
 352                 */
 353                return 0;
 354        } else {
 355                /*
 356                 * If the current state is lower than the limit of _TPC, it
 357                 * will be forced to switch to the throttling state defined
 358                 * by throttling_platfor_limit.
 359                 * Because the previous state meets with the limit condition
 360                 * of thermal and user, it is unnecessary to check it again.
 361                 */
 362                target_state = throttling_limit;
 363        }
 364        return acpi_processor_set_throttling(pr, target_state);
 365}
 366
 367/*
 368 * _PTC - Processor Throttling Control (and status) register location
 369 */
 370static int acpi_processor_get_throttling_control(struct acpi_processor *pr)
 371{
 372        int result = 0;
 373        acpi_status status = 0;
 374        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
 375        union acpi_object *ptc = NULL;
 376        union acpi_object obj = { 0 };
 377        struct acpi_processor_throttling *throttling;
 378
 379        status = acpi_evaluate_object(pr->handle, "_PTC", NULL, &buffer);
 380        if (ACPI_FAILURE(status)) {
 381                if (status != AE_NOT_FOUND) {
 382                        ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PTC"));
 383                }
 384                return -ENODEV;
 385        }
 386
 387        ptc = (union acpi_object *)buffer.pointer;
 388        if (!ptc || (ptc->type != ACPI_TYPE_PACKAGE)
 389            || (ptc->package.count != 2)) {
 390                printk(KERN_ERR PREFIX "Invalid _PTC data\n");
 391                result = -EFAULT;
 392                goto end;
 393        }
 394
 395        /*
 396         * control_register
 397         */
 398
 399        obj = ptc->package.elements[0];
 400
 401        if ((obj.type != ACPI_TYPE_BUFFER)
 402            || (obj.buffer.length < sizeof(struct acpi_ptc_register))
 403            || (obj.buffer.pointer == NULL)) {
 404                printk(KERN_ERR PREFIX
 405                       "Invalid _PTC data (control_register)\n");
 406                result = -EFAULT;
 407                goto end;
 408        }
 409        memcpy(&pr->throttling.control_register, obj.buffer.pointer,
 410               sizeof(struct acpi_ptc_register));
 411
 412        /*
 413         * status_register
 414         */
 415
 416        obj = ptc->package.elements[1];
 417
 418        if ((obj.type != ACPI_TYPE_BUFFER)
 419            || (obj.buffer.length < sizeof(struct acpi_ptc_register))
 420            || (obj.buffer.pointer == NULL)) {
 421                printk(KERN_ERR PREFIX "Invalid _PTC data (status_register)\n");
 422                result = -EFAULT;
 423                goto end;
 424        }
 425
 426        memcpy(&pr->throttling.status_register, obj.buffer.pointer,
 427               sizeof(struct acpi_ptc_register));
 428
 429        throttling = &pr->throttling;
 430
 431        if ((throttling->control_register.bit_width +
 432                throttling->control_register.bit_offset) > 32) {
 433                printk(KERN_ERR PREFIX "Invalid _PTC control register\n");
 434                result = -EFAULT;
 435                goto end;
 436        }
 437
 438        if ((throttling->status_register.bit_width +
 439                throttling->status_register.bit_offset) > 32) {
 440                printk(KERN_ERR PREFIX "Invalid _PTC status register\n");
 441                result = -EFAULT;
 442                goto end;
 443        }
 444
 445      end:
 446        kfree(buffer.pointer);
 447
 448        return result;
 449}
 450
 451/*
 452 * _TSS - Throttling Supported States
 453 */
 454static int acpi_processor_get_throttling_states(struct acpi_processor *pr)
 455{
 456        int result = 0;
 457        acpi_status status = AE_OK;
 458        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
 459        struct acpi_buffer format = { sizeof("NNNNN"), "NNNNN" };
 460        struct acpi_buffer state = { 0, NULL };
 461        union acpi_object *tss = NULL;
 462        int i;
 463
 464        status = acpi_evaluate_object(pr->handle, "_TSS", NULL, &buffer);
 465        if (ACPI_FAILURE(status)) {
 466                if (status != AE_NOT_FOUND) {
 467                        ACPI_EXCEPTION((AE_INFO, status, "Evaluating _TSS"));
 468                }
 469                return -ENODEV;
 470        }
 471
 472        tss = buffer.pointer;
 473        if (!tss || (tss->type != ACPI_TYPE_PACKAGE)) {
 474                printk(KERN_ERR PREFIX "Invalid _TSS data\n");
 475                result = -EFAULT;
 476                goto end;
 477        }
 478
 479        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d throttling states\n",
 480                          tss->package.count));
 481
 482        pr->throttling.state_count = tss->package.count;
 483        pr->throttling.states_tss =
 484            kmalloc(sizeof(struct acpi_processor_tx_tss) * tss->package.count,
 485                    GFP_KERNEL);
 486        if (!pr->throttling.states_tss) {
 487                result = -ENOMEM;
 488                goto end;
 489        }
 490
 491        for (i = 0; i < pr->throttling.state_count; i++) {
 492
 493                struct acpi_processor_tx_tss *tx =
 494                    (struct acpi_processor_tx_tss *)&(pr->throttling.
 495                                                      states_tss[i]);
 496
 497                state.length = sizeof(struct acpi_processor_tx_tss);
 498                state.pointer = tx;
 499
 500                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Extracting state %d\n", i));
 501
 502                status = acpi_extract_package(&(tss->package.elements[i]),
 503                                              &format, &state);
 504                if (ACPI_FAILURE(status)) {
 505                        ACPI_EXCEPTION((AE_INFO, status, "Invalid _TSS data"));
 506                        result = -EFAULT;
 507                        kfree(pr->throttling.states_tss);
 508                        goto end;
 509                }
 510
 511                if (!tx->freqpercentage) {
 512                        printk(KERN_ERR PREFIX
 513                               "Invalid _TSS data: freq is zero\n");
 514                        result = -EFAULT;
 515                        kfree(pr->throttling.states_tss);
 516                        goto end;
 517                }
 518        }
 519
 520      end:
 521        kfree(buffer.pointer);
 522
 523        return result;
 524}
 525
 526/*
 527 * _TSD - T-State Dependencies
 528 */
 529static int acpi_processor_get_tsd(struct acpi_processor *pr)
 530{
 531        int result = 0;
 532        acpi_status status = AE_OK;
 533        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
 534        struct acpi_buffer format = { sizeof("NNNNN"), "NNNNN" };
 535        struct acpi_buffer state = { 0, NULL };
 536        union acpi_object *tsd = NULL;
 537        struct acpi_tsd_package *pdomain;
 538        struct acpi_processor_throttling *pthrottling;
 539
 540        pthrottling = &pr->throttling;
 541        pthrottling->tsd_valid_flag = 0;
 542
 543        status = acpi_evaluate_object(pr->handle, "_TSD", NULL, &buffer);
 544        if (ACPI_FAILURE(status)) {
 545                if (status != AE_NOT_FOUND) {
 546                        ACPI_EXCEPTION((AE_INFO, status, "Evaluating _TSD"));
 547                }
 548                return -ENODEV;
 549        }
 550
 551        tsd = buffer.pointer;
 552        if (!tsd || (tsd->type != ACPI_TYPE_PACKAGE)) {
 553                printk(KERN_ERR PREFIX "Invalid _TSD data\n");
 554                result = -EFAULT;
 555                goto end;
 556        }
 557
 558        if (tsd->package.count != 1) {
 559                printk(KERN_ERR PREFIX "Invalid _TSD data\n");
 560                result = -EFAULT;
 561                goto end;
 562        }
 563
 564        pdomain = &(pr->throttling.domain_info);
 565
 566        state.length = sizeof(struct acpi_tsd_package);
 567        state.pointer = pdomain;
 568
 569        status = acpi_extract_package(&(tsd->package.elements[0]),
 570                                      &format, &state);
 571        if (ACPI_FAILURE(status)) {
 572                printk(KERN_ERR PREFIX "Invalid _TSD data\n");
 573                result = -EFAULT;
 574                goto end;
 575        }
 576
 577        if (pdomain->num_entries != ACPI_TSD_REV0_ENTRIES) {
 578                printk(KERN_ERR PREFIX "Unknown _TSD:num_entries\n");
 579                result = -EFAULT;
 580                goto end;
 581        }
 582
 583        if (pdomain->revision != ACPI_TSD_REV0_REVISION) {
 584                printk(KERN_ERR PREFIX "Unknown _TSD:revision\n");
 585                result = -EFAULT;
 586                goto end;
 587        }
 588
 589        pthrottling = &pr->throttling;
 590        pthrottling->tsd_valid_flag = 1;
 591        pthrottling->shared_type = pdomain->coord_type;
 592        cpumask_set_cpu(pr->id, pthrottling->shared_cpu_map);
 593        /*
 594         * If the coordination type is not defined in ACPI spec,
 595         * the tsd_valid_flag will be clear and coordination type
 596         * will be forecd as DOMAIN_COORD_TYPE_SW_ALL.
 597         */
 598        if (pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ALL &&
 599                pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ANY &&
 600                pdomain->coord_type != DOMAIN_COORD_TYPE_HW_ALL) {
 601                pthrottling->tsd_valid_flag = 0;
 602                pthrottling->shared_type = DOMAIN_COORD_TYPE_SW_ALL;
 603        }
 604
 605      end:
 606        kfree(buffer.pointer);
 607        return result;
 608}
 609
 610/* --------------------------------------------------------------------------
 611                              Throttling Control
 612   -------------------------------------------------------------------------- */
 613static int acpi_processor_get_throttling_fadt(struct acpi_processor *pr)
 614{
 615        int state = 0;
 616        u32 value = 0;
 617        u32 duty_mask = 0;
 618        u32 duty_value = 0;
 619
 620        if (!pr)
 621                return -EINVAL;
 622
 623        if (!pr->flags.throttling)
 624                return -ENODEV;
 625
 626        pr->throttling.state = 0;
 627
 628        duty_mask = pr->throttling.state_count - 1;
 629
 630        duty_mask <<= pr->throttling.duty_offset;
 631
 632        local_irq_disable();
 633
 634        value = inl(pr->throttling.address);
 635
 636        /*
 637         * Compute the current throttling state when throttling is enabled
 638         * (bit 4 is on).
 639         */
 640        if (value & 0x10) {
 641                duty_value = value & duty_mask;
 642                duty_value >>= pr->throttling.duty_offset;
 643
 644                if (duty_value)
 645                        state = pr->throttling.state_count - duty_value;
 646        }
 647
 648        pr->throttling.state = state;
 649
 650        local_irq_enable();
 651
 652        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 653                          "Throttling state is T%d (%d%% throttling applied)\n",
 654                          state, pr->throttling.states[state].performance));
 655
 656        return 0;
 657}
 658
 659#ifdef CONFIG_X86
 660static int acpi_throttling_rdmsr(struct acpi_processor *pr,
 661                                        acpi_integer * value)
 662{
 663        struct cpuinfo_x86 *c;
 664        u64 msr_high, msr_low;
 665        unsigned int cpu;
 666        u64 msr = 0;
 667        int ret = -1;
 668
 669        cpu = pr->id;
 670        c = &cpu_data(cpu);
 671
 672        if ((c->x86_vendor != X86_VENDOR_INTEL) ||
 673                !cpu_has(c, X86_FEATURE_ACPI)) {
 674                printk(KERN_ERR PREFIX
 675                        "HARDWARE addr space,NOT supported yet\n");
 676        } else {
 677                msr_low = 0;
 678                msr_high = 0;
 679                rdmsr_safe(MSR_IA32_THERM_CONTROL,
 680                        (u32 *)&msr_low , (u32 *) &msr_high);
 681                msr = (msr_high << 32) | msr_low;
 682                *value = (acpi_integer) msr;
 683                ret = 0;
 684        }
 685        return ret;
 686}
 687
 688static int acpi_throttling_wrmsr(struct acpi_processor *pr, acpi_integer value)
 689{
 690        struct cpuinfo_x86 *c;
 691        unsigned int cpu;
 692        int ret = -1;
 693        u64 msr;
 694
 695        cpu = pr->id;
 696        c = &cpu_data(cpu);
 697
 698        if ((c->x86_vendor != X86_VENDOR_INTEL) ||
 699                !cpu_has(c, X86_FEATURE_ACPI)) {
 700                printk(KERN_ERR PREFIX
 701                        "HARDWARE addr space,NOT supported yet\n");
 702        } else {
 703                msr = value;
 704                wrmsr_safe(MSR_IA32_THERM_CONTROL,
 705                        msr & 0xffffffff, msr >> 32);
 706                ret = 0;
 707        }
 708        return ret;
 709}
 710#else
 711static int acpi_throttling_rdmsr(struct acpi_processor *pr,
 712                                acpi_integer * value)
 713{
 714        printk(KERN_ERR PREFIX
 715                "HARDWARE addr space,NOT supported yet\n");
 716        return -1;
 717}
 718
 719static int acpi_throttling_wrmsr(struct acpi_processor *pr, acpi_integer value)
 720{
 721        printk(KERN_ERR PREFIX
 722                "HARDWARE addr space,NOT supported yet\n");
 723        return -1;
 724}
 725#endif
 726
 727static int acpi_read_throttling_status(struct acpi_processor *pr,
 728                                        acpi_integer *value)
 729{
 730        u32 bit_width, bit_offset;
 731        u64 ptc_value;
 732        u64 ptc_mask;
 733        struct acpi_processor_throttling *throttling;
 734        int ret = -1;
 735
 736        throttling = &pr->throttling;
 737        switch (throttling->status_register.space_id) {
 738        case ACPI_ADR_SPACE_SYSTEM_IO:
 739                ptc_value = 0;
 740                bit_width = throttling->status_register.bit_width;
 741                bit_offset = throttling->status_register.bit_offset;
 742
 743                acpi_os_read_port((acpi_io_address) throttling->status_register.
 744                                  address, (u32 *) &ptc_value,
 745                                  (u32) (bit_width + bit_offset));
 746                ptc_mask = (1 << bit_width) - 1;
 747                *value = (acpi_integer) ((ptc_value >> bit_offset) & ptc_mask);
 748                ret = 0;
 749                break;
 750        case ACPI_ADR_SPACE_FIXED_HARDWARE:
 751                ret = acpi_throttling_rdmsr(pr, value);
 752                break;
 753        default:
 754                printk(KERN_ERR PREFIX "Unknown addr space %d\n",
 755                       (u32) (throttling->status_register.space_id));
 756        }
 757        return ret;
 758}
 759
 760static int acpi_write_throttling_state(struct acpi_processor *pr,
 761                                acpi_integer value)
 762{
 763        u32 bit_width, bit_offset;
 764        u64 ptc_value;
 765        u64 ptc_mask;
 766        struct acpi_processor_throttling *throttling;
 767        int ret = -1;
 768
 769        throttling = &pr->throttling;
 770        switch (throttling->control_register.space_id) {
 771        case ACPI_ADR_SPACE_SYSTEM_IO:
 772                bit_width = throttling->control_register.bit_width;
 773                bit_offset = throttling->control_register.bit_offset;
 774                ptc_mask = (1 << bit_width) - 1;
 775                ptc_value = value & ptc_mask;
 776
 777                acpi_os_write_port((acpi_io_address) throttling->
 778                                        control_register.address,
 779                                        (u32) (ptc_value << bit_offset),
 780                                        (u32) (bit_width + bit_offset));
 781                ret = 0;
 782                break;
 783        case ACPI_ADR_SPACE_FIXED_HARDWARE:
 784                ret = acpi_throttling_wrmsr(pr, value);
 785                break;
 786        default:
 787                printk(KERN_ERR PREFIX "Unknown addr space %d\n",
 788                       (u32) (throttling->control_register.space_id));
 789        }
 790        return ret;
 791}
 792
 793static int acpi_get_throttling_state(struct acpi_processor *pr,
 794                                acpi_integer value)
 795{
 796        int i;
 797
 798        for (i = 0; i < pr->throttling.state_count; i++) {
 799                struct acpi_processor_tx_tss *tx =
 800                    (struct acpi_processor_tx_tss *)&(pr->throttling.
 801                                                      states_tss[i]);
 802                if (tx->control == value)
 803                        return i;
 804        }
 805        return -1;
 806}
 807
 808static int acpi_get_throttling_value(struct acpi_processor *pr,
 809                        int state, acpi_integer *value)
 810{
 811        int ret = -1;
 812
 813        if (state >= 0 && state <= pr->throttling.state_count) {
 814                struct acpi_processor_tx_tss *tx =
 815                    (struct acpi_processor_tx_tss *)&(pr->throttling.
 816                                                      states_tss[state]);
 817                *value = tx->control;
 818                ret = 0;
 819        }
 820        return ret;
 821}
 822
 823static int acpi_processor_get_throttling_ptc(struct acpi_processor *pr)
 824{
 825        int state = 0;
 826        int ret;
 827        acpi_integer value;
 828
 829        if (!pr)
 830                return -EINVAL;
 831
 832        if (!pr->flags.throttling)
 833                return -ENODEV;
 834
 835        pr->throttling.state = 0;
 836
 837        value = 0;
 838        ret = acpi_read_throttling_status(pr, &value);
 839        if (ret >= 0) {
 840                state = acpi_get_throttling_state(pr, value);
 841                if (state == -1) {
 842                        ACPI_WARNING((AE_INFO,
 843                                "Invalid throttling state, reset"));
 844                        state = 0;
 845                        ret = acpi_processor_set_throttling(pr, state);
 846                        if (ret)
 847                                return ret;
 848                }
 849                pr->throttling.state = state;
 850        }
 851
 852        return 0;
 853}
 854
 855static int acpi_processor_get_throttling(struct acpi_processor *pr)
 856{
 857        cpumask_var_t saved_mask;
 858        int ret;
 859
 860        if (!pr)
 861                return -EINVAL;
 862
 863        if (!pr->flags.throttling)
 864                return -ENODEV;
 865
 866        if (!alloc_cpumask_var(&saved_mask, GFP_KERNEL))
 867                return -ENOMEM;
 868
 869        /*
 870         * Migrate task to the cpu pointed by pr.
 871         */
 872        cpumask_copy(saved_mask, &current->cpus_allowed);
 873        /* FIXME: use work_on_cpu() */
 874        set_cpus_allowed_ptr(current, cpumask_of(pr->id));
 875        ret = pr->throttling.acpi_processor_get_throttling(pr);
 876        /* restore the previous state */
 877        set_cpus_allowed_ptr(current, saved_mask);
 878        free_cpumask_var(saved_mask);
 879
 880        return ret;
 881}
 882
 883static int acpi_processor_get_fadt_info(struct acpi_processor *pr)
 884{
 885        int i, step;
 886
 887        if (!pr->throttling.address) {
 888                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No throttling register\n"));
 889                return -EINVAL;
 890        } else if (!pr->throttling.duty_width) {
 891                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No throttling states\n"));
 892                return -EINVAL;
 893        }
 894        /* TBD: Support duty_cycle values that span bit 4. */
 895        else if ((pr->throttling.duty_offset + pr->throttling.duty_width) > 4) {
 896                printk(KERN_WARNING PREFIX "duty_cycle spans bit 4\n");
 897                return -EINVAL;
 898        }
 899
 900        pr->throttling.state_count = 1 << acpi_gbl_FADT.duty_width;
 901
 902        /*
 903         * Compute state values. Note that throttling displays a linear power
 904         * performance relationship (at 50% performance the CPU will consume
 905         * 50% power).  Values are in 1/10th of a percent to preserve accuracy.
 906         */
 907
 908        step = (1000 / pr->throttling.state_count);
 909
 910        for (i = 0; i < pr->throttling.state_count; i++) {
 911                pr->throttling.states[i].performance = 1000 - step * i;
 912                pr->throttling.states[i].power = 1000 - step * i;
 913        }
 914        return 0;
 915}
 916
 917static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr,
 918                                              int state)
 919{
 920        u32 value = 0;
 921        u32 duty_mask = 0;
 922        u32 duty_value = 0;
 923
 924        if (!pr)
 925                return -EINVAL;
 926
 927        if ((state < 0) || (state > (pr->throttling.state_count - 1)))
 928                return -EINVAL;
 929
 930        if (!pr->flags.throttling)
 931                return -ENODEV;
 932
 933        if (state == pr->throttling.state)
 934                return 0;
 935
 936        if (state < pr->throttling_platform_limit)
 937                return -EPERM;
 938        /*
 939         * Calculate the duty_value and duty_mask.
 940         */
 941        if (state) {
 942                duty_value = pr->throttling.state_count - state;
 943
 944                duty_value <<= pr->throttling.duty_offset;
 945
 946                /* Used to clear all duty_value bits */
 947                duty_mask = pr->throttling.state_count - 1;
 948
 949                duty_mask <<= acpi_gbl_FADT.duty_offset;
 950                duty_mask = ~duty_mask;
 951        }
 952
 953        local_irq_disable();
 954
 955        /*
 956         * Disable throttling by writing a 0 to bit 4.  Note that we must
 957         * turn it off before you can change the duty_value.
 958         */
 959        value = inl(pr->throttling.address);
 960        if (value & 0x10) {
 961                value &= 0xFFFFFFEF;
 962                outl(value, pr->throttling.address);
 963        }
 964
 965        /*
 966         * Write the new duty_value and then enable throttling.  Note
 967         * that a state value of 0 leaves throttling disabled.
 968         */
 969        if (state) {
 970                value &= duty_mask;
 971                value |= duty_value;
 972                outl(value, pr->throttling.address);
 973
 974                value |= 0x00000010;
 975                outl(value, pr->throttling.address);
 976        }
 977
 978        pr->throttling.state = state;
 979
 980        local_irq_enable();
 981
 982        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 983                          "Throttling state set to T%d (%d%%)\n", state,
 984                          (pr->throttling.states[state].performance ? pr->
 985                           throttling.states[state].performance / 10 : 0)));
 986
 987        return 0;
 988}
 989
 990static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr,
 991                                             int state)
 992{
 993        int ret;
 994        acpi_integer value;
 995
 996        if (!pr)
 997                return -EINVAL;
 998
 999        if ((state < 0) || (state > (pr->throttling.state_count - 1)))
1000                return -EINVAL;
1001
1002        if (!pr->flags.throttling)
1003                return -ENODEV;
1004
1005        if (state == pr->throttling.state)
1006                return 0;
1007
1008        if (state < pr->throttling_platform_limit)
1009                return -EPERM;
1010
1011        value = 0;
1012        ret = acpi_get_throttling_value(pr, state, &value);
1013        if (ret >= 0) {
1014                acpi_write_throttling_state(pr, value);
1015                pr->throttling.state = state;
1016        }
1017
1018        return 0;
1019}
1020
1021int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
1022{
1023        cpumask_var_t saved_mask;
1024        int ret = 0;
1025        unsigned int i;
1026        struct acpi_processor *match_pr;
1027        struct acpi_processor_throttling *p_throttling;
1028        struct throttling_tstate t_state;
1029        cpumask_var_t online_throttling_cpus;
1030
1031        if (!pr)
1032                return -EINVAL;
1033
1034        if (!pr->flags.throttling)
1035                return -ENODEV;
1036
1037        if ((state < 0) || (state > (pr->throttling.state_count - 1)))
1038                return -EINVAL;
1039
1040        if (!alloc_cpumask_var(&saved_mask, GFP_KERNEL))
1041                return -ENOMEM;
1042
1043        if (!alloc_cpumask_var(&online_throttling_cpus, GFP_KERNEL)) {
1044                free_cpumask_var(saved_mask);
1045                return -ENOMEM;
1046        }
1047
1048        cpumask_copy(saved_mask, &current->cpus_allowed);
1049        t_state.target_state = state;
1050        p_throttling = &(pr->throttling);
1051        cpumask_and(online_throttling_cpus, cpu_online_mask,
1052                    p_throttling->shared_cpu_map);
1053        /*
1054         * The throttling notifier will be called for every
1055         * affected cpu in order to get one proper T-state.
1056         * The notifier event is THROTTLING_PRECHANGE.
1057         */
1058        for_each_cpu(i, online_throttling_cpus) {
1059                t_state.cpu = i;
1060                acpi_processor_throttling_notifier(THROTTLING_PRECHANGE,
1061                                                        &t_state);
1062        }
1063        /*
1064         * The function of acpi_processor_set_throttling will be called
1065         * to switch T-state. If the coordination type is SW_ALL or HW_ALL,
1066         * it is necessary to call it for every affected cpu. Otherwise
1067         * it can be called only for the cpu pointed by pr.
1068         */
1069        if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) {
1070                /* FIXME: use work_on_cpu() */
1071                set_cpus_allowed_ptr(current, cpumask_of(pr->id));
1072                ret = p_throttling->acpi_processor_set_throttling(pr,
1073                                                t_state.target_state);
1074        } else {
1075                /*
1076                 * When the T-state coordination is SW_ALL or HW_ALL,
1077                 * it is necessary to set T-state for every affected
1078                 * cpus.
1079                 */
1080                for_each_cpu(i, online_throttling_cpus) {
1081                        match_pr = per_cpu(processors, i);
1082                        /*
1083                         * If the pointer is invalid, we will report the
1084                         * error message and continue.
1085                         */
1086                        if (!match_pr) {
1087                                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1088                                        "Invalid Pointer for CPU %d\n", i));
1089                                continue;
1090                        }
1091                        /*
1092                         * If the throttling control is unsupported on CPU i,
1093                         * we will report the error message and continue.
1094                         */
1095                        if (!match_pr->flags.throttling) {
1096                                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1097                                        "Throttling Controll is unsupported "
1098                                        "on CPU %d\n", i));
1099                                continue;
1100                        }
1101                        t_state.cpu = i;
1102                        /* FIXME: use work_on_cpu() */
1103                        set_cpus_allowed_ptr(current, cpumask_of(i));
1104                        ret = match_pr->throttling.
1105                                acpi_processor_set_throttling(
1106                                match_pr, t_state.target_state);
1107                }
1108        }
1109        /*
1110         * After the set_throttling is called, the
1111         * throttling notifier is called for every
1112         * affected cpu to update the T-states.
1113         * The notifier event is THROTTLING_POSTCHANGE
1114         */
1115        for_each_cpu(i, online_throttling_cpus) {
1116                t_state.cpu = i;
1117                acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE,
1118                                                        &t_state);
1119        }
1120        /* restore the previous state */
1121        /* FIXME: use work_on_cpu() */
1122        set_cpus_allowed_ptr(current, saved_mask);
1123        free_cpumask_var(online_throttling_cpus);
1124        free_cpumask_var(saved_mask);
1125        return ret;
1126}
1127
1128int acpi_processor_get_throttling_info(struct acpi_processor *pr)
1129{
1130        int result = 0;
1131        struct acpi_processor_throttling *pthrottling;
1132
1133        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1134                          "pblk_address[0x%08x] duty_offset[%d] duty_width[%d]\n",
1135                          pr->throttling.address,
1136                          pr->throttling.duty_offset,
1137                          pr->throttling.duty_width));
1138
1139        if (!pr)
1140                return -EINVAL;
1141
1142        /*
1143         * Evaluate _PTC, _TSS and _TPC
1144         * They must all be present or none of them can be used.
1145         */
1146        if (acpi_processor_get_throttling_control(pr) ||
1147                acpi_processor_get_throttling_states(pr) ||
1148                acpi_processor_get_platform_limit(pr))
1149        {
1150                pr->throttling.acpi_processor_get_throttling =
1151                    &acpi_processor_get_throttling_fadt;
1152                pr->throttling.acpi_processor_set_throttling =
1153                    &acpi_processor_set_throttling_fadt;
1154                if (acpi_processor_get_fadt_info(pr))
1155                        return 0;
1156        } else {
1157                pr->throttling.acpi_processor_get_throttling =
1158                    &acpi_processor_get_throttling_ptc;
1159                pr->throttling.acpi_processor_set_throttling =
1160                    &acpi_processor_set_throttling_ptc;
1161        }
1162
1163        /*
1164         * If TSD package for one CPU can't be parsed successfully, it means
1165         * that this CPU will have no coordination with other CPUs.
1166         */
1167        if (acpi_processor_get_tsd(pr)) {
1168                pthrottling = &pr->throttling;
1169                pthrottling->tsd_valid_flag = 0;
1170                cpumask_set_cpu(pr->id, pthrottling->shared_cpu_map);
1171                pthrottling->shared_type = DOMAIN_COORD_TYPE_SW_ALL;
1172        }
1173
1174        /*
1175         * PIIX4 Errata: We don't support throttling on the original PIIX4.
1176         * This shouldn't be an issue as few (if any) mobile systems ever
1177         * used this part.
1178         */
1179        if (errata.piix4.throttle) {
1180                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1181                                  "Throttling not supported on PIIX4 A- or B-step\n"));
1182                return 0;
1183        }
1184
1185        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d throttling states\n",
1186                          pr->throttling.state_count));
1187
1188        pr->flags.throttling = 1;
1189
1190        /*
1191         * Disable throttling (if enabled).  We'll let subsequent policy (e.g.
1192         * thermal) decide to lower performance if it so chooses, but for now
1193         * we'll crank up the speed.
1194         */
1195
1196        result = acpi_processor_get_throttling(pr);
1197        if (result)
1198                goto end;
1199
1200        if (pr->throttling.state) {
1201                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1202                                  "Disabling throttling (was T%d)\n",
1203                                  pr->throttling.state));
1204                result = acpi_processor_set_throttling(pr, 0);
1205                if (result)
1206                        goto end;
1207        }
1208
1209      end:
1210        if (result)
1211                pr->flags.throttling = 0;
1212
1213        return result;
1214}
1215
1216/* proc interface */
1217
1218static int acpi_processor_throttling_seq_show(struct seq_file *seq,
1219                                              void *offset)
1220{
1221        struct acpi_processor *pr = seq->private;
1222        int i = 0;
1223        int result = 0;
1224
1225        if (!pr)
1226                goto end;
1227
1228        if (!(pr->throttling.state_count > 0)) {
1229                seq_puts(seq, "<not supported>\n");
1230                goto end;
1231        }
1232
1233        result = acpi_processor_get_throttling(pr);
1234
1235        if (result) {
1236                seq_puts(seq,
1237                         "Could not determine current throttling state.\n");
1238                goto end;
1239        }
1240
1241        seq_printf(seq, "state count:             %d\n"
1242                   "active state:            T%d\n"
1243                   "state available: T%d to T%d\n",
1244                   pr->throttling.state_count, pr->throttling.state,
1245                   pr->throttling_platform_limit,
1246                   pr->throttling.state_count - 1);
1247
1248        seq_puts(seq, "states:\n");
1249        if (pr->throttling.acpi_processor_get_throttling ==
1250                        acpi_processor_get_throttling_fadt) {
1251                for (i = 0; i < pr->throttling.state_count; i++)
1252                        seq_printf(seq, "   %cT%d:                  %02d%%\n",
1253                                   (i == pr->throttling.state ? '*' : ' '), i,
1254                                   (pr->throttling.states[i].performance ? pr->
1255                                    throttling.states[i].performance / 10 : 0));
1256        } else {
1257                for (i = 0; i < pr->throttling.state_count; i++)
1258                        seq_printf(seq, "   %cT%d:                  %02d%%\n",
1259                                   (i == pr->throttling.state ? '*' : ' '), i,
1260                                   (int)pr->throttling.states_tss[i].
1261                                   freqpercentage);
1262        }
1263
1264      end:
1265        return 0;
1266}
1267
1268static int acpi_processor_throttling_open_fs(struct inode *inode,
1269                                             struct file *file)
1270{
1271        return single_open(file, acpi_processor_throttling_seq_show,
1272                           PDE(inode)->data);
1273}
1274
1275static ssize_t acpi_processor_write_throttling(struct file *file,
1276                                               const char __user * buffer,
1277                                               size_t count, loff_t * data)
1278{
1279        int result = 0;
1280        struct seq_file *m = file->private_data;
1281        struct acpi_processor *pr = m->private;
1282        char state_string[5] = "";
1283        char *charp = NULL;
1284        size_t state_val = 0;
1285        char tmpbuf[5] = "";
1286
1287        if (!pr || (count > sizeof(state_string) - 1))
1288                return -EINVAL;
1289
1290        if (copy_from_user(state_string, buffer, count))
1291                return -EFAULT;
1292
1293        state_string[count] = '\0';
1294        if ((count > 0) && (state_string[count-1] == '\n'))
1295                state_string[count-1] = '\0';
1296
1297        charp = state_string;
1298        if ((state_string[0] == 't') || (state_string[0] == 'T'))
1299                charp++;
1300
1301        state_val = simple_strtoul(charp, NULL, 0);
1302        if (state_val >= pr->throttling.state_count)
1303                return -EINVAL;
1304
1305        snprintf(tmpbuf, 5, "%zu", state_val);
1306
1307        if (strcmp(tmpbuf, charp) != 0)
1308                return -EINVAL;
1309
1310        result = acpi_processor_set_throttling(pr, state_val);
1311        if (result)
1312                return result;
1313
1314        return count;
1315}
1316
1317const struct file_operations acpi_processor_throttling_fops = {
1318        .owner = THIS_MODULE,
1319        .open = acpi_processor_throttling_open_fs,
1320        .read = seq_read,
1321        .write = acpi_processor_write_throttling,
1322        .llseek = seq_lseek,
1323        .release = single_release,
1324};
1325