diff options
-rw-r--r-- | drivers/acpi/processor_idle.c | 35 | ||||
-rw-r--r-- | include/acpi/processor.h | 1 |
2 files changed, 17 insertions, 19 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 2278b21b5eb8..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> |
@@ -264,21 +264,15 @@ static void acpi_processor_idle(void) | |||
264 | u32 bm_status = 0; | 264 | u32 bm_status = 0; |
265 | unsigned long diff = jiffies - pr->power.bm_check_timestamp; | 265 | unsigned long diff = jiffies - pr->power.bm_check_timestamp; |
266 | 266 | ||
267 | if (diff > 32) | 267 | if (diff > 31) |
268 | diff = 32; | 268 | diff = 31; |
269 | 269 | ||
270 | while (diff) { | 270 | pr->power.bm_activity <<= diff; |
271 | /* if we didn't get called, assume there was busmaster activity */ | ||
272 | diff--; | ||
273 | if (diff) | ||
274 | pr->power.bm_activity |= 0x1; | ||
275 | pr->power.bm_activity <<= 1; | ||
276 | } | ||
277 | 271 | ||
278 | acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, | 272 | acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, |
279 | &bm_status, ACPI_MTX_DO_NOT_LOCK); | 273 | &bm_status, ACPI_MTX_DO_NOT_LOCK); |
280 | if (bm_status) { | 274 | if (bm_status) { |
281 | pr->power.bm_activity++; | 275 | pr->power.bm_activity |= 0x1; |
282 | acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, | 276 | acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, |
283 | 1, ACPI_MTX_DO_NOT_LOCK); | 277 | 1, ACPI_MTX_DO_NOT_LOCK); |
284 | } | 278 | } |
@@ -290,16 +284,16 @@ static void acpi_processor_idle(void) | |||
290 | else if (errata.piix4.bmisx) { | 284 | else if (errata.piix4.bmisx) { |
291 | if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01) | 285 | if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01) |
292 | || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01)) | 286 | || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01)) |
293 | pr->power.bm_activity++; | 287 | pr->power.bm_activity |= 0x1; |
294 | } | 288 | } |
295 | 289 | ||
296 | pr->power.bm_check_timestamp = jiffies; | 290 | pr->power.bm_check_timestamp = jiffies; |
297 | 291 | ||
298 | /* | 292 | /* |
299 | * Apply bus mastering demotion policy. Automatically demote | 293 | * If bus mastering is or was active this jiffy, demote |
300 | * to avoid a faulty transition. Note that the processor | 294 | * to avoid a faulty transition. Note that the processor |
301 | * 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 |
302 | * funciton) but should upon the next. | 296 | * function) but should upon the next. |
303 | * | 297 | * |
304 | * TBD: A better policy might be to fallback to the demotion | 298 | * TBD: A better policy might be to fallback to the demotion |
305 | * state (use it for this quantum only) istead of | 299 | * state (use it for this quantum only) istead of |
@@ -307,7 +301,8 @@ static void acpi_processor_idle(void) | |||
307 | * qualification. This may, however, introduce DMA | 301 | * qualification. This may, however, introduce DMA |
308 | * issues (e.g. floppy DMA transfer overrun/underrun). | 302 | * issues (e.g. floppy DMA transfer overrun/underrun). |
309 | */ | 303 | */ |
310 | if (pr->power.bm_activity & cx->demotion.threshold.bm) { | 304 | if ((pr->power.bm_activity & 0x1) && |
305 | cx->demotion.threshold.bm) { | ||
311 | local_irq_enable(); | 306 | local_irq_enable(); |
312 | next_state = cx->demotion.state; | 307 | next_state = cx->demotion.state; |
313 | goto end; | 308 | goto end; |
@@ -325,8 +320,6 @@ static void acpi_processor_idle(void) | |||
325 | cx = &pr->power.states[ACPI_STATE_C1]; | 320 | cx = &pr->power.states[ACPI_STATE_C1]; |
326 | #endif | 321 | #endif |
327 | 322 | ||
328 | cx->usage++; | ||
329 | |||
330 | /* | 323 | /* |
331 | * Sleep: | 324 | * Sleep: |
332 | * ------ | 325 | * ------ |
@@ -435,6 +428,9 @@ static void acpi_processor_idle(void) | |||
435 | local_irq_enable(); | 428 | local_irq_enable(); |
436 | return; | 429 | return; |
437 | } | 430 | } |
431 | cx->usage++; | ||
432 | if ((cx->type != ACPI_STATE_C1) && (sleep_ticks > 0)) | ||
433 | cx->time += sleep_ticks; | ||
438 | 434 | ||
439 | next_state = pr->power.state; | 435 | next_state = pr->power.state; |
440 | 436 | ||
@@ -1058,9 +1054,10 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset) | |||
1058 | else | 1054 | else |
1059 | seq_puts(seq, "demotion[--] "); | 1055 | seq_puts(seq, "demotion[--] "); |
1060 | 1056 | ||
1061 | seq_printf(seq, "latency[%03d] usage[%08d]\n", | 1057 | seq_printf(seq, "latency[%03d] usage[%08d] duration[%020llu]\n", |
1062 | pr->power.states[i].latency, | 1058 | pr->power.states[i].latency, |
1063 | pr->power.states[i].usage); | 1059 | pr->power.states[i].usage, |
1060 | pr->power.states[i].time); | ||
1064 | } | 1061 | } |
1065 | 1062 | ||
1066 | end: | 1063 | end: |
diff --git a/include/acpi/processor.h b/include/acpi/processor.h index 77371b3cdc44..9dd5b75961f8 100644 --- a/include/acpi/processor.h +++ b/include/acpi/processor.h | |||
@@ -62,6 +62,7 @@ struct acpi_processor_cx { | |||
62 | u32 latency_ticks; | 62 | u32 latency_ticks; |
63 | u32 power; | 63 | u32 power; |
64 | u32 usage; | 64 | u32 usage; |
65 | u64 time; | ||
65 | struct acpi_processor_cx_policy promotion; | 66 | struct acpi_processor_cx_policy promotion; |
66 | struct acpi_processor_cx_policy demotion; | 67 | struct acpi_processor_cx_policy demotion; |
67 | }; | 68 | }; |