diff options
| author | Len Brown <len.brown@intel.com> | 2004-12-21 13:53:22 -0500 |
|---|---|---|
| committer | Len Brown <lenb@dhcppc3.> | 2004-12-21 13:53:22 -0500 |
| commit | 5ff2feab75da810a25cc08ded568fc5456f53a03 (patch) | |
| tree | 718374a665aed18e3eb70b9c06f2880edf86880d | |
| parent | 94d29f7c594cdc701619a6b658fc853c88aa03f7 (diff) | |
[ACPI] Differentiate between C-States and C-state type.
http://bugzilla.kernel.org/show_bug.cgi?id=1958
Signed-off-by: Bruno Ducrot <ducrot@poupinou.org>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.de>
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/acpi/processor_idle.c | 59 | ||||
| -rw-r--r-- | include/acpi/processor.h | 1 |
2 files changed, 43 insertions, 17 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 10e2ab967bfd..8ec01bdcb586 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c @@ -99,25 +99,32 @@ acpi_processor_power_activate ( struct acpi_processor *pr, int state) { + struct acpi_processor_cx *old, *new; + if (!pr) return; - pr->power.states[pr->power.state].promotion.count = 0; - pr->power.states[pr->power.state].demotion.count = 0; + old = &pr->power.states[pr->power.state]; + new = &pr->power.states[state]; + + old->promotion.count = 0; + new->demotion.count = 0; /* Cleanup from old state. */ - switch (pr->power.state) { + switch (old->type) { case ACPI_STATE_C3: /* Disable bus master reload */ - acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, ACPI_MTX_DO_NOT_LOCK); + if (new->type != ACPI_STATE_C3) + acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, ACPI_MTX_DO_NOT_LOCK); break; } /* Prepare to use new state. */ - switch (state) { + switch (new->type) { case ACPI_STATE_C3: /* Enable bus master reload */ - acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1, ACPI_MTX_DO_NOT_LOCK); + if (old->type != ACPI_STATE_C3) + acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1, ACPI_MTX_DO_NOT_LOCK); break; } @@ -210,7 +217,7 @@ void acpi_processor_idle (void) * ------ * Invoke the current Cx state to put the processor to sleep. */ - switch (pr->power.state) { + switch (cx->type) { case ACPI_STATE_C1: /* @@ -234,7 +241,7 @@ void acpi_processor_idle (void) /* Get start time (ticks) */ t1 = inl(acpi_fadt.xpm_tmr_blk.address); /* Invoke C2 */ - inb(pr->power.states[ACPI_STATE_C2].address); + inb(cx->address); /* Dummy op - must do something useless after P_LVL2 read */ t2 = inl(acpi_fadt.xpm_tmr_blk.address); /* Get end time (ticks) */ @@ -251,7 +258,7 @@ void acpi_processor_idle (void) /* Get start time (ticks) */ t1 = inl(acpi_fadt.xpm_tmr_blk.address); /* Invoke C3 */ - inb(pr->power.states[ACPI_STATE_C3].address); + inb(cx->address); /* Dummy op - must do something useless after P_LVL3 read */ t2 = inl(acpi_fadt.xpm_tmr_blk.address); /* Get end time (ticks) */ @@ -448,6 +455,7 @@ int acpi_processor_get_power_info ( * TBD: What about PROC_C1? */ pr->power.states[ACPI_STATE_C1].valid = 1; + pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1; /* * C2 @@ -481,6 +489,7 @@ int acpi_processor_get_power_info ( */ else { pr->power.states[ACPI_STATE_C2].valid = 1; + pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2; pr->power.states[ACPI_STATE_C2].latency_ticks = US_TO_PM_TIMER_TICKS(acpi_fadt.plvl2_lat); } @@ -539,6 +548,7 @@ int acpi_processor_get_power_info ( */ else { pr->power.states[ACPI_STATE_C3].valid = 1; + pr->power.states[ACPI_STATE_C3].type = ACPI_STATE_C3; pr->power.states[ACPI_STATE_C3].latency_ticks = US_TO_PM_TIMER_TICKS(acpi_fadt.plvl3_lat); pr->flags.bm_check = 1; @@ -582,9 +592,9 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset) if (!pr) goto end; - seq_printf(seq, "active state: C%d\n" - "default state: C%d\n" - "max_cstate: C%d\n" + seq_printf(seq, "active state: %d\n" + "default state: %d\n" + "max_cstate: %d\n" "bus master activity: %08x\n", pr->power.state, pr->power.default_state, @@ -594,7 +604,7 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset) seq_puts(seq, "states:\n"); for (i = 1; i < ACPI_C_STATE_COUNT; i++) { - seq_printf(seq, " %cC%d: ", + seq_printf(seq, " %c%d: ", (i == pr->power.state?'*':' '), i); if (!pr->power.states[i].valid) { @@ -602,17 +612,32 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset) continue; } + switch (pr->power.states[i].type) { + case ACPI_STATE_C1: + seq_printf(seq, "type[C1] "); + break; + case ACPI_STATE_C2: + seq_printf(seq, "type[C2] "); + break; + case ACPI_STATE_C3: + seq_printf(seq, "type[C3] "); + break; + default: + seq_printf(seq, "type[--] "); + break; + } + if (pr->power.states[i].promotion.state) - seq_printf(seq, "promotion[C%d] ", + seq_printf(seq, "promotion[%d] ", pr->power.states[i].promotion.state); else - seq_puts(seq, "promotion[--] "); + seq_puts(seq, "promotion[-] "); if (pr->power.states[i].demotion.state) - seq_printf(seq, "demotion[C%d] ", + seq_printf(seq, "demotion[%d] ", pr->power.states[i].demotion.state); else - seq_puts(seq, "demotion[--] "); + seq_puts(seq, "demotion[-] "); seq_printf(seq, "latency[%03d] usage[%08d]\n", pr->power.states[i].latency, diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 11d622c7cb4f..8911b3015d70 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h @@ -29,6 +29,7 @@ struct acpi_processor_cx_policy { struct acpi_processor_cx { u8 valid; + u8 type; u32 address; u32 latency; u32 latency_ticks; |
