diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-07-03 13:49:45 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-07-03 13:49:45 -0400 |
| commit | 026477c1141b67e98e3bd8bdedb7d4b88a3ecd09 (patch) | |
| tree | 2624a44924c625c367f3cebf937853b9da2de282 /drivers/acpi/processor_idle.c | |
| parent | 9f2fa466383ce100b90fe52cb4489d7a26bf72a9 (diff) | |
| parent | 29454dde27d8e340bb1987bad9aa504af7081eba (diff) | |
Merge branch 'master' of /home/trondmy/kernel/linux-2.6/
Diffstat (limited to 'drivers/acpi/processor_idle.c')
| -rw-r--r-- | drivers/acpi/processor_idle.c | 129 |
1 files changed, 58 insertions, 71 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 8a74bf3efd8e..e439eb77d283 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> | 4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> |
| 5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> | 5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> |
| 6 | * Copyright (C) 2004 Dominik Brodowski <linux@brodo.de> | 6 | * Copyright (C) 2004, 2005 Dominik Brodowski <linux@brodo.de> |
| 7 | * Copyright (C) 2004 Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> | 7 | * Copyright (C) 2004 Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> |
| 8 | * - Added processor hotplug support | 8 | * - Added processor hotplug support |
| 9 | * Copyright (C) 2005 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> | 9 | * Copyright (C) 2005 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> |
| @@ -99,6 +99,9 @@ static int set_max_cstate(struct dmi_system_id *id) | |||
| 99 | static struct dmi_system_id __cpuinitdata processor_power_dmi_table[] = { | 99 | static struct dmi_system_id __cpuinitdata processor_power_dmi_table[] = { |
| 100 | { set_max_cstate, "IBM ThinkPad R40e", { | 100 | { set_max_cstate, "IBM ThinkPad R40e", { |
| 101 | DMI_MATCH(DMI_BIOS_VENDOR,"IBM"), | 101 | DMI_MATCH(DMI_BIOS_VENDOR,"IBM"), |
| 102 | DMI_MATCH(DMI_BIOS_VERSION,"1SET70WW")}, (void *)1}, | ||
| 103 | { set_max_cstate, "IBM ThinkPad R40e", { | ||
| 104 | DMI_MATCH(DMI_BIOS_VENDOR,"IBM"), | ||
| 102 | DMI_MATCH(DMI_BIOS_VERSION,"1SET60WW")}, (void *)1}, | 105 | DMI_MATCH(DMI_BIOS_VERSION,"1SET60WW")}, (void *)1}, |
| 103 | { set_max_cstate, "IBM ThinkPad R40e", { | 106 | { set_max_cstate, "IBM ThinkPad R40e", { |
| 104 | DMI_MATCH(DMI_BIOS_VENDOR,"IBM"), | 107 | DMI_MATCH(DMI_BIOS_VENDOR,"IBM"), |
| @@ -261,21 +264,15 @@ static void acpi_processor_idle(void) | |||
| 261 | u32 bm_status = 0; | 264 | u32 bm_status = 0; |
| 262 | unsigned long diff = jiffies - pr->power.bm_check_timestamp; | 265 | unsigned long diff = jiffies - pr->power.bm_check_timestamp; |
| 263 | 266 | ||
| 264 | if (diff > 32) | 267 | if (diff > 31) |
| 265 | diff = 32; | 268 | diff = 31; |
| 266 | 269 | ||
| 267 | while (diff) { | 270 | pr->power.bm_activity <<= diff; |
| 268 | /* if we didn't get called, assume there was busmaster activity */ | ||
| 269 | diff--; | ||
| 270 | if (diff) | ||
| 271 | pr->power.bm_activity |= 0x1; | ||
| 272 | pr->power.bm_activity <<= 1; | ||
| 273 | } | ||
| 274 | 271 | ||
| 275 | acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, | 272 | acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, |
| 276 | &bm_status, ACPI_MTX_DO_NOT_LOCK); | 273 | &bm_status, ACPI_MTX_DO_NOT_LOCK); |
| 277 | if (bm_status) { | 274 | if (bm_status) { |
| 278 | pr->power.bm_activity++; | 275 | pr->power.bm_activity |= 0x1; |
| 279 | acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, | 276 | acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, |
| 280 | 1, ACPI_MTX_DO_NOT_LOCK); | 277 | 1, ACPI_MTX_DO_NOT_LOCK); |
| 281 | } | 278 | } |
| @@ -287,16 +284,16 @@ static void acpi_processor_idle(void) | |||
| 287 | else if (errata.piix4.bmisx) { | 284 | else if (errata.piix4.bmisx) { |
| 288 | if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01) | 285 | if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01) |
| 289 | || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01)) | 286 | || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01)) |
| 290 | pr->power.bm_activity++; | 287 | pr->power.bm_activity |= 0x1; |
| 291 | } | 288 | } |
| 292 | 289 | ||
| 293 | pr->power.bm_check_timestamp = jiffies; | 290 | pr->power.bm_check_timestamp = jiffies; |
| 294 | 291 | ||
| 295 | /* | 292 | /* |
| 296 | * Apply bus mastering demotion policy. Automatically demote | 293 | * If bus mastering is or was active this jiffy, demote |
| 297 | * to avoid a faulty transition. Note that the processor | 294 | * to avoid a faulty transition. Note that the processor |
| 298 | * won't enter a low-power state during this call (to this | 295 | * won't enter a low-power state during this call (to this |
| 299 | * funciton) but should upon the next. | 296 | * function) but should upon the next. |
| 300 | * | 297 | * |
| 301 | * TBD: A better policy might be to fallback to the demotion | 298 | * TBD: A better policy might be to fallback to the demotion |
| 302 | * state (use it for this quantum only) istead of | 299 | * state (use it for this quantum only) istead of |
| @@ -304,7 +301,8 @@ static void acpi_processor_idle(void) | |||
| 304 | * qualification. This may, however, introduce DMA | 301 | * qualification. This may, however, introduce DMA |
| 305 | * issues (e.g. floppy DMA transfer overrun/underrun). | 302 | * issues (e.g. floppy DMA transfer overrun/underrun). |
| 306 | */ | 303 | */ |
| 307 | if (pr->power.bm_activity & cx->demotion.threshold.bm) { | 304 | if ((pr->power.bm_activity & 0x1) && |
| 305 | cx->demotion.threshold.bm) { | ||
| 308 | local_irq_enable(); | 306 | local_irq_enable(); |
| 309 | next_state = cx->demotion.state; | 307 | next_state = cx->demotion.state; |
| 310 | goto end; | 308 | goto end; |
| @@ -322,8 +320,6 @@ static void acpi_processor_idle(void) | |||
| 322 | cx = &pr->power.states[ACPI_STATE_C1]; | 320 | cx = &pr->power.states[ACPI_STATE_C1]; |
| 323 | #endif | 321 | #endif |
| 324 | 322 | ||
| 325 | cx->usage++; | ||
| 326 | |||
| 327 | /* | 323 | /* |
| 328 | * Sleep: | 324 | * Sleep: |
| 329 | * ------ | 325 | * ------ |
| @@ -365,7 +361,9 @@ static void acpi_processor_idle(void) | |||
| 365 | t1 = inl(acpi_fadt.xpm_tmr_blk.address); | 361 | t1 = inl(acpi_fadt.xpm_tmr_blk.address); |
| 366 | /* Invoke C2 */ | 362 | /* Invoke C2 */ |
| 367 | inb(cx->address); | 363 | inb(cx->address); |
| 368 | /* Dummy op - must do something useless after P_LVL2 read */ | 364 | /* Dummy wait op - must do something useless after P_LVL2 read |
| 365 | because chipsets cannot guarantee that STPCLK# signal | ||
| 366 | gets asserted in time to freeze execution properly. */ | ||
| 369 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); | 367 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); |
| 370 | /* Get end time (ticks) */ | 368 | /* Get end time (ticks) */ |
| 371 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); | 369 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); |
| @@ -403,7 +401,7 @@ static void acpi_processor_idle(void) | |||
| 403 | t1 = inl(acpi_fadt.xpm_tmr_blk.address); | 401 | t1 = inl(acpi_fadt.xpm_tmr_blk.address); |
| 404 | /* Invoke C3 */ | 402 | /* Invoke C3 */ |
| 405 | inb(cx->address); | 403 | inb(cx->address); |
| 406 | /* Dummy op - must do something useless after P_LVL3 read */ | 404 | /* Dummy wait op (see above) */ |
| 407 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); | 405 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); |
| 408 | /* Get end time (ticks) */ | 406 | /* Get end time (ticks) */ |
| 409 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); | 407 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); |
| @@ -430,6 +428,9 @@ static void acpi_processor_idle(void) | |||
| 430 | local_irq_enable(); | 428 | local_irq_enable(); |
| 431 | return; | 429 | return; |
| 432 | } | 430 | } |
| 431 | cx->usage++; | ||
| 432 | if ((cx->type != ACPI_STATE_C1) && (sleep_ticks > 0)) | ||
| 433 | cx->time += sleep_ticks; | ||
| 433 | 434 | ||
| 434 | next_state = pr->power.state; | 435 | next_state = pr->power.state; |
| 435 | 436 | ||
| @@ -517,10 +518,9 @@ static int acpi_processor_set_power_policy(struct acpi_processor *pr) | |||
| 517 | struct acpi_processor_cx *higher = NULL; | 518 | struct acpi_processor_cx *higher = NULL; |
| 518 | struct acpi_processor_cx *cx; | 519 | struct acpi_processor_cx *cx; |
| 519 | 520 | ||
| 520 | ACPI_FUNCTION_TRACE("acpi_processor_set_power_policy"); | ||
| 521 | 521 | ||
| 522 | if (!pr) | 522 | if (!pr) |
| 523 | return_VALUE(-EINVAL); | 523 | return -EINVAL; |
| 524 | 524 | ||
| 525 | /* | 525 | /* |
| 526 | * This function sets the default Cx state policy (OS idle handler). | 526 | * This function sets the default Cx state policy (OS idle handler). |
| @@ -544,7 +544,7 @@ static int acpi_processor_set_power_policy(struct acpi_processor *pr) | |||
| 544 | } | 544 | } |
| 545 | 545 | ||
| 546 | if (!state_is_set) | 546 | if (!state_is_set) |
| 547 | return_VALUE(-ENODEV); | 547 | return -ENODEV; |
| 548 | 548 | ||
| 549 | /* demotion */ | 549 | /* demotion */ |
| 550 | for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) { | 550 | for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) { |
| @@ -583,18 +583,17 @@ static int acpi_processor_set_power_policy(struct acpi_processor *pr) | |||
| 583 | higher = cx; | 583 | higher = cx; |
| 584 | } | 584 | } |
| 585 | 585 | ||
| 586 | return_VALUE(0); | 586 | return 0; |
| 587 | } | 587 | } |
| 588 | 588 | ||
| 589 | static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) | 589 | static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) |
| 590 | { | 590 | { |
| 591 | ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_fadt"); | ||
| 592 | 591 | ||
| 593 | if (!pr) | 592 | if (!pr) |
| 594 | return_VALUE(-EINVAL); | 593 | return -EINVAL; |
| 595 | 594 | ||
| 596 | if (!pr->pblk) | 595 | if (!pr->pblk) |
| 597 | return_VALUE(-ENODEV); | 596 | return -ENODEV; |
| 598 | 597 | ||
| 599 | /* if info is obtained from pblk/fadt, type equals state */ | 598 | /* if info is obtained from pblk/fadt, type equals state */ |
| 600 | pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2; | 599 | pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2; |
| @@ -606,7 +605,7 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) | |||
| 606 | * an SMP system. | 605 | * an SMP system. |
| 607 | */ | 606 | */ |
| 608 | if ((num_online_cpus() > 1) && !acpi_fadt.plvl2_up) | 607 | if ((num_online_cpus() > 1) && !acpi_fadt.plvl2_up) |
| 609 | return_VALUE(-ENODEV); | 608 | return -ENODEV; |
| 610 | #endif | 609 | #endif |
| 611 | 610 | ||
| 612 | /* determine C2 and C3 address from pblk */ | 611 | /* determine C2 and C3 address from pblk */ |
| @@ -622,12 +621,11 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) | |||
| 622 | pr->power.states[ACPI_STATE_C2].address, | 621 | pr->power.states[ACPI_STATE_C2].address, |
| 623 | pr->power.states[ACPI_STATE_C3].address)); | 622 | pr->power.states[ACPI_STATE_C3].address)); |
| 624 | 623 | ||
| 625 | return_VALUE(0); | 624 | return 0; |
| 626 | } | 625 | } |
| 627 | 626 | ||
| 628 | static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr) | 627 | static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr) |
| 629 | { | 628 | { |
| 630 | ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_default_c1"); | ||
| 631 | 629 | ||
| 632 | /* Zero initialize all the C-states info. */ | 630 | /* Zero initialize all the C-states info. */ |
| 633 | memset(pr->power.states, 0, sizeof(pr->power.states)); | 631 | memset(pr->power.states, 0, sizeof(pr->power.states)); |
| @@ -640,7 +638,7 @@ static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr) | |||
| 640 | pr->power.states[ACPI_STATE_C0].valid = 1; | 638 | pr->power.states[ACPI_STATE_C0].valid = 1; |
| 641 | pr->power.states[ACPI_STATE_C1].valid = 1; | 639 | pr->power.states[ACPI_STATE_C1].valid = 1; |
| 642 | 640 | ||
| 643 | return_VALUE(0); | 641 | return 0; |
| 644 | } | 642 | } |
| 645 | 643 | ||
| 646 | static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) | 644 | static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) |
| @@ -652,10 +650,9 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) | |||
| 652 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 650 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 653 | union acpi_object *cst; | 651 | union acpi_object *cst; |
| 654 | 652 | ||
| 655 | ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_cst"); | ||
| 656 | 653 | ||
| 657 | if (nocst) | 654 | if (nocst) |
| 658 | return_VALUE(-ENODEV); | 655 | return -ENODEV; |
| 659 | 656 | ||
| 660 | current_count = 1; | 657 | current_count = 1; |
| 661 | 658 | ||
| @@ -667,15 +664,14 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) | |||
| 667 | status = acpi_evaluate_object(pr->handle, "_CST", NULL, &buffer); | 664 | status = acpi_evaluate_object(pr->handle, "_CST", NULL, &buffer); |
| 668 | if (ACPI_FAILURE(status)) { | 665 | if (ACPI_FAILURE(status)) { |
| 669 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No _CST, giving up\n")); | 666 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No _CST, giving up\n")); |
| 670 | return_VALUE(-ENODEV); | 667 | return -ENODEV; |
| 671 | } | 668 | } |
| 672 | 669 | ||
| 673 | cst = (union acpi_object *)buffer.pointer; | 670 | cst = (union acpi_object *)buffer.pointer; |
| 674 | 671 | ||
| 675 | /* There must be at least 2 elements */ | 672 | /* There must be at least 2 elements */ |
| 676 | if (!cst || (cst->type != ACPI_TYPE_PACKAGE) || cst->package.count < 2) { | 673 | if (!cst || (cst->type != ACPI_TYPE_PACKAGE) || cst->package.count < 2) { |
| 677 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 674 | printk(KERN_ERR PREFIX "not enough elements in _CST\n"); |
| 678 | "not enough elements in _CST\n")); | ||
| 679 | status = -EFAULT; | 675 | status = -EFAULT; |
| 680 | goto end; | 676 | goto end; |
| 681 | } | 677 | } |
| @@ -684,8 +680,7 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) | |||
| 684 | 680 | ||
| 685 | /* Validate number of power states. */ | 681 | /* Validate number of power states. */ |
| 686 | if (count < 1 || count != cst->package.count - 1) { | 682 | if (count < 1 || count != cst->package.count - 1) { |
| 687 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 683 | printk(KERN_ERR PREFIX "count given by _CST is not valid\n"); |
| 688 | "count given by _CST is not valid\n")); | ||
| 689 | status = -EFAULT; | 684 | status = -EFAULT; |
| 690 | goto end; | 685 | goto end; |
| 691 | } | 686 | } |
| @@ -775,15 +770,14 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr) | |||
| 775 | end: | 770 | end: |
| 776 | acpi_os_free(buffer.pointer); | 771 | acpi_os_free(buffer.pointer); |
| 777 | 772 | ||
| 778 | return_VALUE(status); | 773 | return status; |
| 779 | } | 774 | } |
| 780 | 775 | ||
| 781 | static void acpi_processor_power_verify_c2(struct acpi_processor_cx *cx) | 776 | static void acpi_processor_power_verify_c2(struct acpi_processor_cx *cx) |
| 782 | { | 777 | { |
| 783 | ACPI_FUNCTION_TRACE("acpi_processor_get_power_verify_c2"); | ||
| 784 | 778 | ||
| 785 | if (!cx->address) | 779 | if (!cx->address) |
| 786 | return_VOID; | 780 | return; |
| 787 | 781 | ||
| 788 | /* | 782 | /* |
| 789 | * C2 latency must be less than or equal to 100 | 783 | * C2 latency must be less than or equal to 100 |
| @@ -792,7 +786,7 @@ static void acpi_processor_power_verify_c2(struct acpi_processor_cx *cx) | |||
| 792 | else if (cx->latency > ACPI_PROCESSOR_MAX_C2_LATENCY) { | 786 | else if (cx->latency > ACPI_PROCESSOR_MAX_C2_LATENCY) { |
| 793 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 787 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 794 | "latency too large [%d]\n", cx->latency)); | 788 | "latency too large [%d]\n", cx->latency)); |
| 795 | return_VOID; | 789 | return; |
| 796 | } | 790 | } |
| 797 | 791 | ||
| 798 | /* | 792 | /* |
| @@ -802,7 +796,7 @@ static void acpi_processor_power_verify_c2(struct acpi_processor_cx *cx) | |||
| 802 | cx->valid = 1; | 796 | cx->valid = 1; |
| 803 | cx->latency_ticks = US_TO_PM_TIMER_TICKS(cx->latency); | 797 | cx->latency_ticks = US_TO_PM_TIMER_TICKS(cx->latency); |
| 804 | 798 | ||
| 805 | return_VOID; | 799 | return; |
| 806 | } | 800 | } |
| 807 | 801 | ||
| 808 | static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | 802 | static void acpi_processor_power_verify_c3(struct acpi_processor *pr, |
| @@ -810,10 +804,9 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | |||
| 810 | { | 804 | { |
| 811 | static int bm_check_flag; | 805 | static int bm_check_flag; |
| 812 | 806 | ||
| 813 | ACPI_FUNCTION_TRACE("acpi_processor_get_power_verify_c3"); | ||
| 814 | 807 | ||
| 815 | if (!cx->address) | 808 | if (!cx->address) |
| 816 | return_VOID; | 809 | return; |
| 817 | 810 | ||
| 818 | /* | 811 | /* |
| 819 | * C3 latency must be less than or equal to 1000 | 812 | * C3 latency must be less than or equal to 1000 |
| @@ -822,7 +815,7 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | |||
| 822 | else if (cx->latency > ACPI_PROCESSOR_MAX_C3_LATENCY) { | 815 | else if (cx->latency > ACPI_PROCESSOR_MAX_C3_LATENCY) { |
| 823 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 816 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 824 | "latency too large [%d]\n", cx->latency)); | 817 | "latency too large [%d]\n", cx->latency)); |
| 825 | return_VOID; | 818 | return; |
| 826 | } | 819 | } |
| 827 | 820 | ||
| 828 | /* | 821 | /* |
| @@ -835,7 +828,7 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | |||
| 835 | else if (errata.piix4.fdma) { | 828 | else if (errata.piix4.fdma) { |
| 836 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 829 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 837 | "C3 not supported on PIIX4 with Type-F DMA\n")); | 830 | "C3 not supported on PIIX4 with Type-F DMA\n")); |
| 838 | return_VOID; | 831 | return; |
| 839 | } | 832 | } |
| 840 | 833 | ||
| 841 | /* All the logic here assumes flags.bm_check is same across all CPUs */ | 834 | /* All the logic here assumes flags.bm_check is same across all CPUs */ |
| @@ -852,7 +845,7 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | |||
| 852 | if (!pr->flags.bm_control) { | 845 | if (!pr->flags.bm_control) { |
| 853 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 846 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 854 | "C3 support requires bus mastering control\n")); | 847 | "C3 support requires bus mastering control\n")); |
| 855 | return_VOID; | 848 | return; |
| 856 | } | 849 | } |
| 857 | } else { | 850 | } else { |
| 858 | /* | 851 | /* |
| @@ -863,7 +856,7 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | |||
| 863 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 856 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 864 | "Cache invalidation should work properly" | 857 | "Cache invalidation should work properly" |
| 865 | " for C3 to be enabled on SMP systems\n")); | 858 | " for C3 to be enabled on SMP systems\n")); |
| 866 | return_VOID; | 859 | return; |
| 867 | } | 860 | } |
| 868 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, | 861 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, |
| 869 | 0, ACPI_MTX_DO_NOT_LOCK); | 862 | 0, ACPI_MTX_DO_NOT_LOCK); |
| @@ -878,7 +871,7 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | |||
| 878 | cx->valid = 1; | 871 | cx->valid = 1; |
| 879 | cx->latency_ticks = US_TO_PM_TIMER_TICKS(cx->latency); | 872 | cx->latency_ticks = US_TO_PM_TIMER_TICKS(cx->latency); |
| 880 | 873 | ||
| 881 | return_VOID; | 874 | return; |
| 882 | } | 875 | } |
| 883 | 876 | ||
| 884 | static int acpi_processor_power_verify(struct acpi_processor *pr) | 877 | static int acpi_processor_power_verify(struct acpi_processor *pr) |
| @@ -937,7 +930,6 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr) | |||
| 937 | unsigned int i; | 930 | unsigned int i; |
| 938 | int result; | 931 | int result; |
| 939 | 932 | ||
| 940 | ACPI_FUNCTION_TRACE("acpi_processor_get_power_info"); | ||
| 941 | 933 | ||
| 942 | /* NOTE: the idle thread may not be running while calling | 934 | /* NOTE: the idle thread may not be running while calling |
| 943 | * this function */ | 935 | * this function */ |
| @@ -960,7 +952,7 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr) | |||
| 960 | */ | 952 | */ |
| 961 | result = acpi_processor_set_power_policy(pr); | 953 | result = acpi_processor_set_power_policy(pr); |
| 962 | if (result) | 954 | if (result) |
| 963 | return_VALUE(result); | 955 | return result; |
| 964 | 956 | ||
| 965 | /* | 957 | /* |
| 966 | * if one state of type C2 or C3 is available, mark this | 958 | * if one state of type C2 or C3 is available, mark this |
| @@ -974,24 +966,23 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr) | |||
| 974 | } | 966 | } |
| 975 | } | 967 | } |
| 976 | 968 | ||
| 977 | return_VALUE(0); | 969 | return 0; |
| 978 | } | 970 | } |
| 979 | 971 | ||
| 980 | int acpi_processor_cst_has_changed(struct acpi_processor *pr) | 972 | int acpi_processor_cst_has_changed(struct acpi_processor *pr) |
| 981 | { | 973 | { |
| 982 | int result = 0; | 974 | int result = 0; |
| 983 | 975 | ||
| 984 | ACPI_FUNCTION_TRACE("acpi_processor_cst_has_changed"); | ||
| 985 | 976 | ||
| 986 | if (!pr) | 977 | if (!pr) |
| 987 | return_VALUE(-EINVAL); | 978 | return -EINVAL; |
| 988 | 979 | ||
| 989 | if (nocst) { | 980 | if (nocst) { |
| 990 | return_VALUE(-ENODEV); | 981 | return -ENODEV; |
| 991 | } | 982 | } |
| 992 | 983 | ||
| 993 | if (!pr->flags.power_setup_done) | 984 | if (!pr->flags.power_setup_done) |
| 994 | return_VALUE(-ENODEV); | 985 | return -ENODEV; |
| 995 | 986 | ||
| 996 | /* Fall back to the default idle loop */ | 987 | /* Fall back to the default idle loop */ |
| 997 | pm_idle = pm_idle_save; | 988 | pm_idle = pm_idle_save; |
| @@ -1002,7 +993,7 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr) | |||
| 1002 | if ((pr->flags.power == 1) && (pr->flags.power_setup_done)) | 993 | if ((pr->flags.power == 1) && (pr->flags.power_setup_done)) |
| 1003 | pm_idle = acpi_processor_idle; | 994 | pm_idle = acpi_processor_idle; |
| 1004 | 995 | ||
| 1005 | return_VALUE(result); | 996 | return result; |
| 1006 | } | 997 | } |
| 1007 | 998 | ||
| 1008 | /* proc interface */ | 999 | /* proc interface */ |
| @@ -1012,7 +1003,6 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset) | |||
| 1012 | struct acpi_processor *pr = (struct acpi_processor *)seq->private; | 1003 | struct acpi_processor *pr = (struct acpi_processor *)seq->private; |
| 1013 | unsigned int i; | 1004 | unsigned int i; |
| 1014 | 1005 | ||
| 1015 | ACPI_FUNCTION_TRACE("acpi_processor_power_seq_show"); | ||
| 1016 | 1006 | ||
| 1017 | if (!pr) | 1007 | if (!pr) |
| 1018 | goto end; | 1008 | goto end; |
| @@ -1064,13 +1054,14 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset) | |||
| 1064 | else | 1054 | else |
| 1065 | seq_puts(seq, "demotion[--] "); | 1055 | seq_puts(seq, "demotion[--] "); |
| 1066 | 1056 | ||
| 1067 | seq_printf(seq, "latency[%03d] usage[%08d]\n", | 1057 | seq_printf(seq, "latency[%03d] usage[%08d] duration[%020llu]\n", |
| 1068 | pr->power.states[i].latency, | 1058 | pr->power.states[i].latency, |
| 1069 | pr->power.states[i].usage); | 1059 | pr->power.states[i].usage, |
| 1060 | pr->power.states[i].time); | ||
| 1070 | } | 1061 | } |
| 1071 | 1062 | ||
| 1072 | end: | 1063 | end: |
| 1073 | return_VALUE(0); | 1064 | return 0; |
| 1074 | } | 1065 | } |
| 1075 | 1066 | ||
| 1076 | static int acpi_processor_power_open_fs(struct inode *inode, struct file *file) | 1067 | static int acpi_processor_power_open_fs(struct inode *inode, struct file *file) |
| @@ -1094,7 +1085,6 @@ int acpi_processor_power_init(struct acpi_processor *pr, | |||
| 1094 | struct proc_dir_entry *entry = NULL; | 1085 | struct proc_dir_entry *entry = NULL; |
| 1095 | unsigned int i; | 1086 | unsigned int i; |
| 1096 | 1087 | ||
| 1097 | ACPI_FUNCTION_TRACE("acpi_processor_power_init"); | ||
| 1098 | 1088 | ||
| 1099 | if (!first_run) { | 1089 | if (!first_run) { |
| 1100 | dmi_check_system(processor_power_dmi_table); | 1090 | dmi_check_system(processor_power_dmi_table); |
| @@ -1106,14 +1096,14 @@ int acpi_processor_power_init(struct acpi_processor *pr, | |||
| 1106 | } | 1096 | } |
| 1107 | 1097 | ||
| 1108 | if (!pr) | 1098 | if (!pr) |
| 1109 | return_VALUE(-EINVAL); | 1099 | return -EINVAL; |
| 1110 | 1100 | ||
| 1111 | if (acpi_fadt.cst_cnt && !nocst) { | 1101 | if (acpi_fadt.cst_cnt && !nocst) { |
| 1112 | status = | 1102 | status = |
| 1113 | acpi_os_write_port(acpi_fadt.smi_cmd, acpi_fadt.cst_cnt, 8); | 1103 | acpi_os_write_port(acpi_fadt.smi_cmd, acpi_fadt.cst_cnt, 8); |
| 1114 | if (ACPI_FAILURE(status)) { | 1104 | if (ACPI_FAILURE(status)) { |
| 1115 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 1105 | ACPI_EXCEPTION((AE_INFO, status, |
| 1116 | "Notifying BIOS of _CST ability failed\n")); | 1106 | "Notifying BIOS of _CST ability failed")); |
| 1117 | } | 1107 | } |
| 1118 | } | 1108 | } |
| 1119 | 1109 | ||
| @@ -1142,9 +1132,7 @@ int acpi_processor_power_init(struct acpi_processor *pr, | |||
| 1142 | entry = create_proc_entry(ACPI_PROCESSOR_FILE_POWER, | 1132 | entry = create_proc_entry(ACPI_PROCESSOR_FILE_POWER, |
| 1143 | S_IRUGO, acpi_device_dir(device)); | 1133 | S_IRUGO, acpi_device_dir(device)); |
| 1144 | if (!entry) | 1134 | if (!entry) |
| 1145 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 1135 | return -EIO; |
| 1146 | "Unable to create '%s' fs entry\n", | ||
| 1147 | ACPI_PROCESSOR_FILE_POWER)); | ||
| 1148 | else { | 1136 | else { |
| 1149 | entry->proc_fops = &acpi_processor_power_fops; | 1137 | entry->proc_fops = &acpi_processor_power_fops; |
| 1150 | entry->data = acpi_driver_data(device); | 1138 | entry->data = acpi_driver_data(device); |
| @@ -1153,13 +1141,12 @@ int acpi_processor_power_init(struct acpi_processor *pr, | |||
| 1153 | 1141 | ||
| 1154 | pr->flags.power_setup_done = 1; | 1142 | pr->flags.power_setup_done = 1; |
| 1155 | 1143 | ||
| 1156 | return_VALUE(0); | 1144 | return 0; |
| 1157 | } | 1145 | } |
| 1158 | 1146 | ||
| 1159 | int acpi_processor_power_exit(struct acpi_processor *pr, | 1147 | int acpi_processor_power_exit(struct acpi_processor *pr, |
| 1160 | struct acpi_device *device) | 1148 | struct acpi_device *device) |
| 1161 | { | 1149 | { |
| 1162 | ACPI_FUNCTION_TRACE("acpi_processor_power_exit"); | ||
| 1163 | 1150 | ||
| 1164 | pr->flags.power_setup_done = 0; | 1151 | pr->flags.power_setup_done = 0; |
| 1165 | 1152 | ||
| @@ -1179,5 +1166,5 @@ int acpi_processor_power_exit(struct acpi_processor *pr, | |||
| 1179 | cpu_idle_wait(); | 1166 | cpu_idle_wait(); |
| 1180 | } | 1167 | } |
| 1181 | 1168 | ||
| 1182 | return_VALUE(0); | 1169 | return 0; |
| 1183 | } | 1170 | } |
