Browse Source

Pull c-states into release branch

Len Brown 19 years ago
parent
commit
f1b2ad5d2a
2 changed files with 17 additions and 19 deletions
  1. 16 19
      drivers/acpi/processor_idle.c
  2. 1 0
      include/acpi/processor.h

+ 16 - 19
drivers/acpi/processor_idle.c

@@ -3,7 +3,7 @@
  *
  *
  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
- *  Copyright (C) 2004       Dominik Brodowski <linux@brodo.de>
+ *  Copyright (C) 2004, 2005 Dominik Brodowski <linux@brodo.de>
  *  Copyright (C) 2004  Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  *  Copyright (C) 2004  Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
  *  			- Added processor hotplug support
  *  			- Added processor hotplug support
  *  Copyright (C) 2005  Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
  *  Copyright (C) 2005  Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
@@ -264,21 +264,15 @@ static void acpi_processor_idle(void)
 		u32 bm_status = 0;
 		u32 bm_status = 0;
 		unsigned long diff = jiffies - pr->power.bm_check_timestamp;
 		unsigned long diff = jiffies - pr->power.bm_check_timestamp;
 
 
-		if (diff > 32)
-			diff = 32;
+		if (diff > 31)
+			diff = 31;
 
 
-		while (diff) {
-			/* if we didn't get called, assume there was busmaster activity */
-			diff--;
-			if (diff)
-				pr->power.bm_activity |= 0x1;
-			pr->power.bm_activity <<= 1;
-		}
+		pr->power.bm_activity <<= diff;
 
 
 		acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS,
 		acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS,
 				  &bm_status, ACPI_MTX_DO_NOT_LOCK);
 				  &bm_status, ACPI_MTX_DO_NOT_LOCK);
 		if (bm_status) {
 		if (bm_status) {
-			pr->power.bm_activity++;
+			pr->power.bm_activity |= 0x1;
 			acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS,
 			acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS,
 					  1, ACPI_MTX_DO_NOT_LOCK);
 					  1, ACPI_MTX_DO_NOT_LOCK);
 		}
 		}
@@ -290,16 +284,16 @@ static void acpi_processor_idle(void)
 		else if (errata.piix4.bmisx) {
 		else if (errata.piix4.bmisx) {
 			if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01)
 			if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01)
 			    || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01))
 			    || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01))
-				pr->power.bm_activity++;
+				pr->power.bm_activity |= 0x1;
 		}
 		}
 
 
 		pr->power.bm_check_timestamp = jiffies;
 		pr->power.bm_check_timestamp = jiffies;
 
 
 		/*
 		/*
-		 * Apply bus mastering demotion policy.  Automatically demote
+		 * If bus mastering is or was active this jiffy, demote
 		 * to avoid a faulty transition.  Note that the processor
 		 * to avoid a faulty transition.  Note that the processor
 		 * won't enter a low-power state during this call (to this
 		 * won't enter a low-power state during this call (to this
-		 * funciton) but should upon the next.
+		 * function) but should upon the next.
 		 *
 		 *
 		 * TBD: A better policy might be to fallback to the demotion
 		 * TBD: A better policy might be to fallback to the demotion
 		 *      state (use it for this quantum only) istead of
 		 *      state (use it for this quantum only) istead of
@@ -307,7 +301,8 @@ static void acpi_processor_idle(void)
 		 *      qualification.  This may, however, introduce DMA
 		 *      qualification.  This may, however, introduce DMA
 		 *      issues (e.g. floppy DMA transfer overrun/underrun).
 		 *      issues (e.g. floppy DMA transfer overrun/underrun).
 		 */
 		 */
-		if (pr->power.bm_activity & cx->demotion.threshold.bm) {
+		if ((pr->power.bm_activity & 0x1) &&
+		    cx->demotion.threshold.bm) {
 			local_irq_enable();
 			local_irq_enable();
 			next_state = cx->demotion.state;
 			next_state = cx->demotion.state;
 			goto end;
 			goto end;
@@ -325,8 +320,6 @@ static void acpi_processor_idle(void)
 		cx = &pr->power.states[ACPI_STATE_C1];
 		cx = &pr->power.states[ACPI_STATE_C1];
 #endif
 #endif
 
 
-	cx->usage++;
-
 	/*
 	/*
 	 * Sleep:
 	 * Sleep:
 	 * ------
 	 * ------
@@ -435,6 +428,9 @@ static void acpi_processor_idle(void)
 		local_irq_enable();
 		local_irq_enable();
 		return;
 		return;
 	}
 	}
+	cx->usage++;
+	if ((cx->type != ACPI_STATE_C1) && (sleep_ticks > 0))
+		cx->time += sleep_ticks;
 
 
 	next_state = pr->power.state;
 	next_state = pr->power.state;
 
 
@@ -1058,9 +1054,10 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset)
 		else
 		else
 			seq_puts(seq, "demotion[--] ");
 			seq_puts(seq, "demotion[--] ");
 
 
-		seq_printf(seq, "latency[%03d] usage[%08d]\n",
+		seq_printf(seq, "latency[%03d] usage[%08d] duration[%020llu]\n",
 			   pr->power.states[i].latency,
 			   pr->power.states[i].latency,
-			   pr->power.states[i].usage);
+			   pr->power.states[i].usage,
+			   pr->power.states[i].time);
 	}
 	}
 
 
       end:
       end:

+ 1 - 0
include/acpi/processor.h

@@ -62,6 +62,7 @@ struct acpi_processor_cx {
 	u32 latency_ticks;
 	u32 latency_ticks;
 	u32 power;
 	u32 power;
 	u32 usage;
 	u32 usage;
+	u64 time;
 	struct acpi_processor_cx_policy promotion;
 	struct acpi_processor_cx_policy promotion;
 	struct acpi_processor_cx_policy demotion;
 	struct acpi_processor_cx_policy demotion;
 };
 };