diff options
Diffstat (limited to 'drivers/acpi/processor_idle.c')
-rw-r--r-- | drivers/acpi/processor_idle.c | 52 |
1 files changed, 23 insertions, 29 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 3f30af21574e..6c6751b1405b 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -160,7 +160,7 @@ static inline u32 ticks_elapsed(u32 t1, u32 t2) | |||
160 | { | 160 | { |
161 | if (t2 >= t1) | 161 | if (t2 >= t1) |
162 | return (t2 - t1); | 162 | return (t2 - t1); |
163 | else if (!acpi_fadt.tmr_val_ext) | 163 | else if (!(acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER)) |
164 | return (((0x00FFFFFF - t1) + t2) & 0x00FFFFFF); | 164 | return (((0x00FFFFFF - t1) + t2) & 0x00FFFFFF); |
165 | else | 165 | else |
166 | return ((0xFFFFFFFF - t1) + t2); | 166 | return ((0xFFFFFFFF - t1) + t2); |
@@ -187,8 +187,7 @@ acpi_processor_power_activate(struct acpi_processor *pr, | |||
187 | case ACPI_STATE_C3: | 187 | case ACPI_STATE_C3: |
188 | /* Disable bus master reload */ | 188 | /* Disable bus master reload */ |
189 | if (new->type != ACPI_STATE_C3 && pr->flags.bm_check) | 189 | if (new->type != ACPI_STATE_C3 && pr->flags.bm_check) |
190 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, | 190 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0); |
191 | ACPI_MTX_DO_NOT_LOCK); | ||
192 | break; | 191 | break; |
193 | } | 192 | } |
194 | } | 193 | } |
@@ -198,8 +197,7 @@ acpi_processor_power_activate(struct acpi_processor *pr, | |||
198 | case ACPI_STATE_C3: | 197 | case ACPI_STATE_C3: |
199 | /* Enable bus master reload */ | 198 | /* Enable bus master reload */ |
200 | if (old->type != ACPI_STATE_C3 && pr->flags.bm_check) | 199 | if (old->type != ACPI_STATE_C3 && pr->flags.bm_check) |
201 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1, | 200 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1); |
202 | ACPI_MTX_DO_NOT_LOCK); | ||
203 | break; | 201 | break; |
204 | } | 202 | } |
205 | 203 | ||
@@ -236,7 +234,7 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate) | |||
236 | /* Dummy wait op - must do something useless after P_LVL2 read | 234 | /* Dummy wait op - must do something useless after P_LVL2 read |
237 | because chipsets cannot guarantee that STPCLK# signal | 235 | because chipsets cannot guarantee that STPCLK# signal |
238 | gets asserted in time to freeze execution properly. */ | 236 | gets asserted in time to freeze execution properly. */ |
239 | unused = inl(acpi_fadt.xpm_tmr_blk.address); | 237 | unused = inl(acpi_gbl_FADT.xpm_timer_block.address); |
240 | } | 238 | } |
241 | } | 239 | } |
242 | 240 | ||
@@ -291,12 +289,10 @@ static void acpi_processor_idle(void) | |||
291 | 289 | ||
292 | pr->power.bm_activity <<= diff; | 290 | pr->power.bm_activity <<= diff; |
293 | 291 | ||
294 | acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, | 292 | acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status); |
295 | &bm_status, ACPI_MTX_DO_NOT_LOCK); | ||
296 | if (bm_status) { | 293 | if (bm_status) { |
297 | pr->power.bm_activity |= 0x1; | 294 | pr->power.bm_activity |= 0x1; |
298 | acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, | 295 | acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1); |
299 | 1, ACPI_MTX_DO_NOT_LOCK); | ||
300 | } | 296 | } |
301 | /* | 297 | /* |
302 | * PIIX4 Erratum #18: Note that BM_STS doesn't always reflect | 298 | * PIIX4 Erratum #18: Note that BM_STS doesn't always reflect |
@@ -338,7 +334,7 @@ static void acpi_processor_idle(void) | |||
338 | * detection phase, to work cleanly with logical CPU hotplug. | 334 | * detection phase, to work cleanly with logical CPU hotplug. |
339 | */ | 335 | */ |
340 | if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) && | 336 | if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) && |
341 | !pr->flags.has_cst && !acpi_fadt.plvl2_up) | 337 | !pr->flags.has_cst && !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED)) |
342 | cx = &pr->power.states[ACPI_STATE_C1]; | 338 | cx = &pr->power.states[ACPI_STATE_C1]; |
343 | #endif | 339 | #endif |
344 | 340 | ||
@@ -384,11 +380,11 @@ static void acpi_processor_idle(void) | |||
384 | 380 | ||
385 | case ACPI_STATE_C2: | 381 | case ACPI_STATE_C2: |
386 | /* Get start time (ticks) */ | 382 | /* Get start time (ticks) */ |
387 | t1 = inl(acpi_fadt.xpm_tmr_blk.address); | 383 | t1 = inl(acpi_gbl_FADT.xpm_timer_block.address); |
388 | /* Invoke C2 */ | 384 | /* Invoke C2 */ |
389 | acpi_cstate_enter(cx); | 385 | acpi_cstate_enter(cx); |
390 | /* Get end time (ticks) */ | 386 | /* Get end time (ticks) */ |
391 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); | 387 | t2 = inl(acpi_gbl_FADT.xpm_timer_block.address); |
392 | 388 | ||
393 | #ifdef CONFIG_GENERIC_TIME | 389 | #ifdef CONFIG_GENERIC_TIME |
394 | /* TSC halts in C2, so notify users */ | 390 | /* TSC halts in C2, so notify users */ |
@@ -411,8 +407,7 @@ static void acpi_processor_idle(void) | |||
411 | * All CPUs are trying to go to C3 | 407 | * All CPUs are trying to go to C3 |
412 | * Disable bus master arbitration | 408 | * Disable bus master arbitration |
413 | */ | 409 | */ |
414 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1, | 410 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1); |
415 | ACPI_MTX_DO_NOT_LOCK); | ||
416 | } | 411 | } |
417 | } else { | 412 | } else { |
418 | /* SMP with no shared cache... Invalidate cache */ | 413 | /* SMP with no shared cache... Invalidate cache */ |
@@ -420,16 +415,15 @@ static void acpi_processor_idle(void) | |||
420 | } | 415 | } |
421 | 416 | ||
422 | /* Get start time (ticks) */ | 417 | /* Get start time (ticks) */ |
423 | t1 = inl(acpi_fadt.xpm_tmr_blk.address); | 418 | t1 = inl(acpi_gbl_FADT.xpm_timer_block.address); |
424 | /* Invoke C3 */ | 419 | /* Invoke C3 */ |
425 | acpi_cstate_enter(cx); | 420 | acpi_cstate_enter(cx); |
426 | /* Get end time (ticks) */ | 421 | /* Get end time (ticks) */ |
427 | t2 = inl(acpi_fadt.xpm_tmr_blk.address); | 422 | t2 = inl(acpi_gbl_FADT.xpm_timer_block.address); |
428 | if (pr->flags.bm_check) { | 423 | if (pr->flags.bm_check) { |
429 | /* Enable bus master arbitration */ | 424 | /* Enable bus master arbitration */ |
430 | atomic_dec(&c3_cpu_count); | 425 | atomic_dec(&c3_cpu_count); |
431 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0, | 426 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0); |
432 | ACPI_MTX_DO_NOT_LOCK); | ||
433 | } | 427 | } |
434 | 428 | ||
435 | #ifdef CONFIG_GENERIC_TIME | 429 | #ifdef CONFIG_GENERIC_TIME |
@@ -457,7 +451,7 @@ static void acpi_processor_idle(void) | |||
457 | #ifdef CONFIG_HOTPLUG_CPU | 451 | #ifdef CONFIG_HOTPLUG_CPU |
458 | /* Don't do promotion/demotion */ | 452 | /* Don't do promotion/demotion */ |
459 | if ((cx->type == ACPI_STATE_C1) && (num_online_cpus() > 1) && | 453 | if ((cx->type == ACPI_STATE_C1) && (num_online_cpus() > 1) && |
460 | !pr->flags.has_cst && !acpi_fadt.plvl2_up) { | 454 | !pr->flags.has_cst && !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED)) { |
461 | next_state = cx; | 455 | next_state = cx; |
462 | goto end; | 456 | goto end; |
463 | } | 457 | } |
@@ -627,7 +621,8 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) | |||
627 | * Check for P_LVL2_UP flag before entering C2 and above on | 621 | * Check for P_LVL2_UP flag before entering C2 and above on |
628 | * an SMP system. | 622 | * an SMP system. |
629 | */ | 623 | */ |
630 | if ((num_online_cpus() > 1) && !acpi_fadt.plvl2_up) | 624 | if ((num_online_cpus() > 1) && |
625 | !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED)) | ||
631 | return -ENODEV; | 626 | return -ENODEV; |
632 | #endif | 627 | #endif |
633 | 628 | ||
@@ -636,8 +631,8 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) | |||
636 | pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5; | 631 | pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5; |
637 | 632 | ||
638 | /* determine latencies from FADT */ | 633 | /* determine latencies from FADT */ |
639 | pr->power.states[ACPI_STATE_C2].latency = acpi_fadt.plvl2_lat; | 634 | pr->power.states[ACPI_STATE_C2].latency = acpi_gbl_FADT.C2latency; |
640 | pr->power.states[ACPI_STATE_C3].latency = acpi_fadt.plvl3_lat; | 635 | pr->power.states[ACPI_STATE_C3].latency = acpi_gbl_FADT.C3latency; |
641 | 636 | ||
642 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 637 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
643 | "lvl2[0x%08x] lvl3[0x%08x]\n", | 638 | "lvl2[0x%08x] lvl3[0x%08x]\n", |
@@ -883,14 +878,13 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | |||
883 | * WBINVD should be set in fadt, for C3 state to be | 878 | * WBINVD should be set in fadt, for C3 state to be |
884 | * supported on when bm_check is not required. | 879 | * supported on when bm_check is not required. |
885 | */ | 880 | */ |
886 | if (acpi_fadt.wb_invd != 1) { | 881 | if (!(acpi_gbl_FADT.flags & ACPI_FADT_WBINVD)) { |
887 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 882 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
888 | "Cache invalidation should work properly" | 883 | "Cache invalidation should work properly" |
889 | " for C3 to be enabled on SMP systems\n")); | 884 | " for C3 to be enabled on SMP systems\n")); |
890 | return; | 885 | return; |
891 | } | 886 | } |
892 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, | 887 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0); |
893 | 0, ACPI_MTX_DO_NOT_LOCK); | ||
894 | } | 888 | } |
895 | 889 | ||
896 | /* | 890 | /* |
@@ -1096,7 +1090,7 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset) | |||
1096 | seq_printf(seq, "latency[%03d] usage[%08d] duration[%020llu]\n", | 1090 | seq_printf(seq, "latency[%03d] usage[%08d] duration[%020llu]\n", |
1097 | pr->power.states[i].latency, | 1091 | pr->power.states[i].latency, |
1098 | pr->power.states[i].usage, | 1092 | pr->power.states[i].usage, |
1099 | pr->power.states[i].time); | 1093 | (unsigned long long)pr->power.states[i].time); |
1100 | } | 1094 | } |
1101 | 1095 | ||
1102 | end: | 1096 | end: |
@@ -1164,9 +1158,9 @@ int __cpuinit acpi_processor_power_init(struct acpi_processor *pr, | |||
1164 | if (!pr) | 1158 | if (!pr) |
1165 | return -EINVAL; | 1159 | return -EINVAL; |
1166 | 1160 | ||
1167 | if (acpi_fadt.cst_cnt && !nocst) { | 1161 | if (acpi_gbl_FADT.cst_control && !nocst) { |
1168 | status = | 1162 | status = |
1169 | acpi_os_write_port(acpi_fadt.smi_cmd, acpi_fadt.cst_cnt, 8); | 1163 | acpi_os_write_port(acpi_gbl_FADT.smi_command, acpi_gbl_FADT.cst_control, 8); |
1170 | if (ACPI_FAILURE(status)) { | 1164 | if (ACPI_FAILURE(status)) { |
1171 | ACPI_EXCEPTION((AE_INFO, status, | 1165 | ACPI_EXCEPTION((AE_INFO, status, |
1172 | "Notifying BIOS of _CST ability failed")); | 1166 | "Notifying BIOS of _CST ability failed")); |