processor_idle.c 29 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4 5
/*
 * processor_idle - idle state submodule to the ACPI processor driver
 *
 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
6
 *  Copyright (C) 2004, 2005 Dominik Brodowski <linux@brodo.de>
Linus Torvalds's avatar
Linus Torvalds committed
7 8
 *  Copyright (C) 2004  Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
 *  			- Added processor hotplug support
9 10
 *  Copyright (C) 2005  Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
 *  			- Added support for C3 on SMP
Linus Torvalds's avatar
Linus Torvalds committed
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or (at
 *  your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cpufreq.h>
35
#include <linux/slab.h>
Linus Torvalds's avatar
Linus Torvalds committed
36 37 38
#include <linux/acpi.h>
#include <linux/dmi.h>
#include <linux/moduleparam.h>
Tim Schmielau's avatar
Tim Schmielau committed
39
#include <linux/sched.h>	/* need_resched() */
Mark Gross's avatar
Mark Gross committed
40
#include <linux/pm_qos_params.h>
41
#include <linux/clockchips.h>
42
#include <linux/cpuidle.h>
43
#include <linux/irqflags.h>
Linus Torvalds's avatar
Linus Torvalds committed
44

45 46 47 48 49 50 51 52 53 54
/*
 * Include the apic definitions for x86 to have the APIC timer related defines
 * available also for UP (on SMP it gets magically included via linux/smp.h).
 * asm/acpi.h is not an option, as it would require more include magic. Also
 * creating an empty asm-ia64/apic.h would just trade pest vs. cholera.
 */
#ifdef CONFIG_X86
#include <asm/apic.h>
#endif

Linus Torvalds's avatar
Linus Torvalds committed
55 56 57 58 59
#include <asm/io.h>
#include <asm/uaccess.h>

#include <acpi/acpi_bus.h>
#include <acpi/processor.h>
60
#include <asm/processor.h>
Linus Torvalds's avatar
Linus Torvalds committed
61

62 63
#define PREFIX "ACPI: "

Linus Torvalds's avatar
Linus Torvalds committed
64 65
#define ACPI_PROCESSOR_CLASS            "processor"
#define _COMPONENT              ACPI_PROCESSOR_COMPONENT
66
ACPI_MODULE_NAME("processor_idle");
67
#define PM_TIMER_TICK_NS		(1000000000ULL/PM_TIMER_FREQUENCY)
68 69 70
#define C2_OVERHEAD			1	/* 1us */
#define C3_OVERHEAD			1	/* 1us */
#define PM_TIMER_TICKS_TO_US(p)		(((p) * 1000)/(PM_TIMER_FREQUENCY/1000))
Linus Torvalds's avatar
Linus Torvalds committed
71

72 73
static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER;
module_param(max_cstate, uint, 0000);
74
static unsigned int nocst __read_mostly;
Linus Torvalds's avatar
Linus Torvalds committed
75
module_param(nocst, uint, 0000);
76 77
static int bm_check_disable __read_mostly;
module_param(bm_check_disable, uint, 0000);
Linus Torvalds's avatar
Linus Torvalds committed
78

79
static unsigned int latency_factor __read_mostly = 2;
80
module_param(latency_factor, uint, 0644);
Linus Torvalds's avatar
Linus Torvalds committed
81 82 83 84 85 86 87

/*
 * IBM ThinkPad R40e crashes mysteriously when going into C2 or C3.
 * For now disable this. Probably a bug somewhere else.
 *
 * To skip this limit, boot/load with a large max_cstate limit.
 */
88
static int set_max_cstate(const struct dmi_system_id *id)
Linus Torvalds's avatar
Linus Torvalds committed
89 90 91 92
{
	if (max_cstate > ACPI_PROCESSOR_MAX_POWER)
		return 0;

93
	printk(KERN_NOTICE PREFIX "%s detected - limiting to C%ld max_cstate."
Len Brown's avatar
Len Brown committed
94 95
	       " Override with \"processor.max_cstate=%d\"\n", id->ident,
	       (long)id->driver_data, ACPI_PROCESSOR_MAX_POWER + 1);
Linus Torvalds's avatar
Linus Torvalds committed
96

97
	max_cstate = (long)id->driver_data;
Linus Torvalds's avatar
Linus Torvalds committed
98 99 100 101

	return 0;
}

102 103 104
/* Actually this shouldn't be __cpuinitdata, would be better to fix the
   callers to only run once -AK */
static struct dmi_system_id __cpuinitdata processor_power_dmi_table[] = {
105 106 107
	{ set_max_cstate, "Clevo 5600D", {
	  DMI_MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),
	  DMI_MATCH(DMI_BIOS_VERSION,"SHE845M0.86C.0013.D.0302131307")},
Len Brown's avatar
Len Brown committed
108
	 (void *)2},
109 110 111 112 113 114 115 116
	{ set_max_cstate, "Pavilion zv5000", {
	  DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
	  DMI_MATCH(DMI_PRODUCT_NAME,"Pavilion zv5000 (DS502A#ABA)")},
	 (void *)1},
	{ set_max_cstate, "Asus L8400B", {
	  DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
	  DMI_MATCH(DMI_PRODUCT_NAME,"L8400B series Notebook PC")},
	 (void *)1},
Linus Torvalds's avatar
Linus Torvalds committed
117 118 119
	{},
};

120

121 122 123 124
/*
 * Callers should disable interrupts before the call and enable
 * interrupts after return.
 */
125 126 127 128 129 130 131 132
static void acpi_safe_halt(void)
{
	current_thread_info()->status &= ~TS_POLLING;
	/*
	 * TS_POLLING-cleared state must be visible before we
	 * test NEED_RESCHED:
	 */
	smp_mb();
133
	if (!need_resched()) {
134
		safe_halt();
135 136
		local_irq_disable();
	}
137 138 139
	current_thread_info()->status |= TS_POLLING;
}

140 141 142 143
#ifdef ARCH_APICTIMER_STOPS_ON_C3

/*
 * Some BIOS implementations switch to C3 in the published C2 state.
144 145 146
 * This seems to be a common problem on AMD boxen, but other vendors
 * are affected too. We pick the most conservative approach: we assume
 * that the local APIC stops in both C2 and C3.
147
 */
148
static void lapic_timer_check_state(int state, struct acpi_processor *pr,
149 150 151
				   struct acpi_processor_cx *cx)
{
	struct acpi_processor_power *pwr = &pr->power;
152
	u8 type = local_apic_timer_c2_ok ? ACPI_STATE_C3 : ACPI_STATE_C2;
153

154 155 156
	if (cpu_has(&cpu_data(pr->id), X86_FEATURE_ARAT))
		return;

157
	if (c1e_detected)
158 159
		type = ACPI_STATE_C1;

160 161 162 163 164 165 166
	/*
	 * Check, if one of the previous states already marked the lapic
	 * unstable
	 */
	if (pwr->timer_broadcast_on_state < state)
		return;

167
	if (cx->type >= type)
168
		pr->power.timer_broadcast_on_state = state;
169 170
}

171
static void __lapic_timer_propagate_broadcast(void *arg)
172
{
173
	struct acpi_processor *pr = (struct acpi_processor *) arg;
174 175 176 177 178 179 180 181
	unsigned long reason;

	reason = pr->power.timer_broadcast_on_state < INT_MAX ?
		CLOCK_EVT_NOTIFY_BROADCAST_ON : CLOCK_EVT_NOTIFY_BROADCAST_OFF;

	clockevents_notify(reason, &pr->id);
}

182 183 184 185 186 187
static void lapic_timer_propagate_broadcast(struct acpi_processor *pr)
{
	smp_call_function_single(pr->id, __lapic_timer_propagate_broadcast,
				 (void *)pr, 1);
}

188
/* Power(C) State timer broadcast control */
189
static void lapic_timer_state_broadcast(struct acpi_processor *pr,
190 191 192 193 194 195 196 197 198 199 200 201
				       struct acpi_processor_cx *cx,
				       int broadcast)
{
	int state = cx - pr->power.states;

	if (state >= pr->power.timer_broadcast_on_state) {
		unsigned long reason;

		reason = broadcast ?  CLOCK_EVT_NOTIFY_BROADCAST_ENTER :
			CLOCK_EVT_NOTIFY_BROADCAST_EXIT;
		clockevents_notify(reason, &pr->id);
	}
202 203 204 205
}

#else

206
static void lapic_timer_check_state(int state, struct acpi_processor *pr,
207
				   struct acpi_processor_cx *cstate) { }
208 209
static void lapic_timer_propagate_broadcast(struct acpi_processor *pr) { }
static void lapic_timer_state_broadcast(struct acpi_processor *pr,
210 211 212 213
				       struct acpi_processor_cx *cx,
				       int broadcast)
{
}
214 215 216

#endif

217 218 219 220
/*
 * Suspend / resume control
 */
static int acpi_idle_suspend;
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
static u32 saved_bm_rld;

static void acpi_idle_bm_rld_save(void)
{
	acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_RLD, &saved_bm_rld);
}
static void acpi_idle_bm_rld_restore(void)
{
	u32 resumed_bm_rld;

	acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_RLD, &resumed_bm_rld);

	if (resumed_bm_rld != saved_bm_rld)
		acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_RLD, saved_bm_rld);
}
236 237 238

int acpi_processor_suspend(struct acpi_device * device, pm_message_t state)
{
239 240 241 242
	if (acpi_idle_suspend == 1)
		return 0;

	acpi_idle_bm_rld_save();
243 244 245 246 247 248
	acpi_idle_suspend = 1;
	return 0;
}

int acpi_processor_resume(struct acpi_device * device)
{
249 250 251 252
	if (acpi_idle_suspend == 0)
		return 0;

	acpi_idle_bm_rld_restore();
253 254 255 256
	acpi_idle_suspend = 0;
	return 0;
}

257
#if defined(CONFIG_X86)
258
static void tsc_check_state(int state)
259 260 261
{
	switch (boot_cpu_data.x86_vendor) {
	case X86_VENDOR_AMD:
262
	case X86_VENDOR_INTEL:
263 264 265 266
		/*
		 * AMD Fam10h TSC will tick in all
		 * C/P/S0/S1 states when this bit is set.
		 */
267
		if (boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
268
			return;
269

270 271
		/*FALL THROUGH*/
	default:
272 273 274
		/* TSC could halt in idle, so notify users */
		if (state > ACPI_STATE_C1)
			mark_tsc_unstable("TSC halts in idle");
275 276
	}
}
277 278
#else
static void tsc_check_state(int state) { return; }
279 280
#endif

Len Brown's avatar
Len Brown committed
281
static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
Linus Torvalds's avatar
Linus Torvalds committed
282 283 284
{

	if (!pr)
285
		return -EINVAL;
Linus Torvalds's avatar
Linus Torvalds committed
286 287

	if (!pr->pblk)
288
		return -ENODEV;
Linus Torvalds's avatar
Linus Torvalds committed
289 290 291 292 293

	/* if info is obtained from pblk/fadt, type equals state */
	pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2;
	pr->power.states[ACPI_STATE_C3].type = ACPI_STATE_C3;

294 295 296
#ifndef CONFIG_HOTPLUG_CPU
	/*
	 * Check for P_LVL2_UP flag before entering C2 and above on
297
	 * an SMP system.
298
	 */
299
	if ((num_online_cpus() > 1) &&
300
	    !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
301
		return -ENODEV;
302 303
#endif

Linus Torvalds's avatar
Linus Torvalds committed
304 305 306 307 308
	/* determine C2 and C3 address from pblk */
	pr->power.states[ACPI_STATE_C2].address = pr->pblk + 4;
	pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5;

	/* determine latencies from FADT */
309 310
	pr->power.states[ACPI_STATE_C2].latency = acpi_gbl_FADT.C2latency;
	pr->power.states[ACPI_STATE_C3].latency = acpi_gbl_FADT.C3latency;
Linus Torvalds's avatar
Linus Torvalds committed
311

312 313 314 315 316 317 318 319 320 321 322
	/*
	 * FADT specified C2 latency must be less than or equal to
	 * 100 microseconds.
	 */
	if (acpi_gbl_FADT.C2latency > ACPI_PROCESSOR_MAX_C2_LATENCY) {
		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
			"C2 latency too large [%d]\n", acpi_gbl_FADT.C2latency));
		/* invalidate C2 */
		pr->power.states[ACPI_STATE_C2].address = 0;
	}

Len Brown's avatar
Len Brown committed
323 324 325 326 327 328 329 330 331 332 333
	/*
	 * FADT supplied C3 latency must be less than or equal to
	 * 1000 microseconds.
	 */
	if (acpi_gbl_FADT.C3latency > ACPI_PROCESSOR_MAX_C3_LATENCY) {
		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
			"C3 latency too large [%d]\n", acpi_gbl_FADT.C3latency));
		/* invalidate C3 */
		pr->power.states[ACPI_STATE_C3].address = 0;
	}

Linus Torvalds's avatar
Linus Torvalds committed
334 335 336 337 338
	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
			  "lvl2[0x%08x] lvl3[0x%08x]\n",
			  pr->power.states[ACPI_STATE_C2].address,
			  pr->power.states[ACPI_STATE_C3].address));

339
	return 0;
Linus Torvalds's avatar
Linus Torvalds committed
340 341
}

342
static int acpi_processor_get_power_info_default(struct acpi_processor *pr)
343
{
344 345 346 347 348
	if (!pr->power.states[ACPI_STATE_C1].valid) {
		/* set the first C-State to C1 */
		/* all processors need to support C1 */
		pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
		pr->power.states[ACPI_STATE_C1].valid = 1;
349
		pr->power.states[ACPI_STATE_C1].entry_method = ACPI_CSTATE_HALT;
350 351
	}
	/* the C0 state only exists as a filler in our array */
352
	pr->power.states[ACPI_STATE_C0].valid = 1;
353
	return 0;
354 355
}

Len Brown's avatar
Len Brown committed
356
static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
Linus Torvalds's avatar
Linus Torvalds committed
357
{
Len Brown's avatar
Len Brown committed
358
	acpi_status status = 0;
Lin Ming's avatar
Lin Ming committed
359
	u64 count;
360
	int current_count;
Len Brown's avatar
Len Brown committed
361 362 363
	int i;
	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
	union acpi_object *cst;
Linus Torvalds's avatar
Linus Torvalds committed
364 365 366


	if (nocst)
367
		return -ENODEV;
Linus Torvalds's avatar
Linus Torvalds committed
368

369
	current_count = 0;
Linus Torvalds's avatar
Linus Torvalds committed
370 371 372 373

	status = acpi_evaluate_object(pr->handle, "_CST", NULL, &buffer);
	if (ACPI_FAILURE(status)) {
		ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No _CST, giving up\n"));
374
		return -ENODEV;
Len Brown's avatar
Len Brown committed
375
	}
Linus Torvalds's avatar
Linus Torvalds committed
376

377
	cst = buffer.pointer;
Linus Torvalds's avatar
Linus Torvalds committed
378 379 380

	/* There must be at least 2 elements */
	if (!cst || (cst->type != ACPI_TYPE_PACKAGE) || cst->package.count < 2) {
381
		printk(KERN_ERR PREFIX "not enough elements in _CST\n");
Linus Torvalds's avatar
Linus Torvalds committed
382 383 384 385 386 387 388 389
		status = -EFAULT;
		goto end;
	}

	count = cst->package.elements[0].integer.value;

	/* Validate number of power states. */
	if (count < 1 || count != cst->package.count - 1) {
390
		printk(KERN_ERR PREFIX "count given by _CST is not valid\n");
Linus Torvalds's avatar
Linus Torvalds committed
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
		status = -EFAULT;
		goto end;
	}

	/* Tell driver that at least _CST is supported. */
	pr->flags.has_cst = 1;

	for (i = 1; i <= count; i++) {
		union acpi_object *element;
		union acpi_object *obj;
		struct acpi_power_register *reg;
		struct acpi_processor_cx cx;

		memset(&cx, 0, sizeof(cx));

406
		element = &(cst->package.elements[i]);
Linus Torvalds's avatar
Linus Torvalds committed
407 408 409 410 411 412
		if (element->type != ACPI_TYPE_PACKAGE)
			continue;

		if (element->package.count != 4)
			continue;

413
		obj = &(element->package.elements[0]);
Linus Torvalds's avatar
Linus Torvalds committed
414 415 416 417

		if (obj->type != ACPI_TYPE_BUFFER)
			continue;

Len Brown's avatar
Len Brown committed
418
		reg = (struct acpi_power_register *)obj->buffer.pointer;
Linus Torvalds's avatar
Linus Torvalds committed
419 420

		if (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO &&
Len Brown's avatar
Len Brown committed
421
		    (reg->space_id != ACPI_ADR_SPACE_FIXED_HARDWARE))
Linus Torvalds's avatar
Linus Torvalds committed
422 423 424
			continue;

		/* There should be an easy way to extract an integer... */
425
		obj = &(element->package.elements[1]);
Linus Torvalds's avatar
Linus Torvalds committed
426 427 428 429
		if (obj->type != ACPI_TYPE_INTEGER)
			continue;

		cx.type = obj->integer.value;
430 431 432 433 434 435 436 437 438 439
		/*
		 * Some buggy BIOSes won't list C1 in _CST -
		 * Let acpi_processor_get_power_info_default() handle them later
		 */
		if (i == 1 && cx.type != ACPI_STATE_C1)
			current_count++;

		cx.address = reg->address;
		cx.index = current_count + 1;

440
		cx.entry_method = ACPI_CSTATE_SYSTEMIO;
441 442 443
		if (reg->space_id == ACPI_ADR_SPACE_FIXED_HARDWARE) {
			if (acpi_processor_ffh_cstate_probe
					(pr->id, &cx, reg) == 0) {
444 445
				cx.entry_method = ACPI_CSTATE_FFH;
			} else if (cx.type == ACPI_STATE_C1) {
446 447 448 449 450 451
				/*
				 * C1 is a special case where FIXED_HARDWARE
				 * can be handled in non-MWAIT way as well.
				 * In that case, save this _CST entry info.
				 * Otherwise, ignore this info and continue.
				 */
452
				cx.entry_method = ACPI_CSTATE_HALT;
453
				snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI HLT");
454
			} else {
455 456
				continue;
			}
457 458
			if (cx.type == ACPI_STATE_C1 &&
					(idle_halt || idle_nomwait)) {
459 460 461 462 463 464
				/*
				 * In most cases the C1 space_id obtained from
				 * _CST object is FIXED_HARDWARE access mode.
				 * But when the option of idle=halt is added,
				 * the entry_method type should be changed from
				 * CSTATE_FFH to CSTATE_HALT.
465 466 467
				 * When the option of idle=nomwait is added,
				 * the C1 entry_method type should be
				 * CSTATE_HALT.
468 469 470 471
				 */
				cx.entry_method = ACPI_CSTATE_HALT;
				snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI HLT");
			}
472 473 474
		} else {
			snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI IOPORT 0x%x",
				 cx.address);
475
		}
Linus Torvalds's avatar
Linus Torvalds committed
476

477 478 479
		if (cx.type == ACPI_STATE_C1) {
			cx.valid = 1;
		}
480

481
		obj = &(element->package.elements[2]);
Linus Torvalds's avatar
Linus Torvalds committed
482 483 484 485 486
		if (obj->type != ACPI_TYPE_INTEGER)
			continue;

		cx.latency = obj->integer.value;

487
		obj = &(element->package.elements[3]);
Linus Torvalds's avatar
Linus Torvalds committed
488 489 490 491 492
		if (obj->type != ACPI_TYPE_INTEGER)
			continue;

		cx.power = obj->integer.value;

493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
		current_count++;
		memcpy(&(pr->power.states[current_count]), &cx, sizeof(cx));

		/*
		 * We support total ACPI_PROCESSOR_MAX_POWER - 1
		 * (From 1 through ACPI_PROCESSOR_MAX_POWER - 1)
		 */
		if (current_count >= (ACPI_PROCESSOR_MAX_POWER - 1)) {
			printk(KERN_WARNING
			       "Limiting number of power states to max (%d)\n",
			       ACPI_PROCESSOR_MAX_POWER);
			printk(KERN_WARNING
			       "Please increase ACPI_PROCESSOR_MAX_POWER if needed.\n");
			break;
		}
Linus Torvalds's avatar
Linus Torvalds committed
508 509
	}

Len Brown's avatar
Len Brown committed
510
	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d power states\n",
511
			  current_count));
Linus Torvalds's avatar
Linus Torvalds committed
512 513

	/* Validate number of power states discovered */
514
	if (current_count < 2)
515
		status = -EFAULT;
Linus Torvalds's avatar
Linus Torvalds committed
516

Len Brown's avatar
Len Brown committed
517
      end:
518
	kfree(buffer.pointer);
Linus Torvalds's avatar
Linus Torvalds committed
519

520
	return status;
Linus Torvalds's avatar
Linus Torvalds committed
521 522
}

Len Brown's avatar
Len Brown committed
523 524
static void acpi_processor_power_verify_c3(struct acpi_processor *pr,
					   struct acpi_processor_cx *cx)
Linus Torvalds's avatar
Linus Torvalds committed
525
{
526 527
	static int bm_check_flag = -1;
	static int bm_control_flag = -1;
528

Linus Torvalds's avatar
Linus Torvalds committed
529 530

	if (!cx->address)
531
		return;
Linus Torvalds's avatar
Linus Torvalds committed
532 533 534 535 536 537 538 539 540 541

	/*
	 * PIIX4 Erratum #18: We don't support C3 when Type-F (fast)
	 * DMA transfers are used by any ISA device to avoid livelock.
	 * Note that we could disable Type-F DMA (as recommended by
	 * the erratum), but this is known to disrupt certain ISA
	 * devices thus we take the conservative approach.
	 */
	else if (errata.piix4.fdma) {
		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
Len Brown's avatar
Len Brown committed
542
				  "C3 not supported on PIIX4 with Type-F DMA\n"));
543
		return;
Linus Torvalds's avatar
Linus Torvalds committed
544 545
	}

546
	/* All the logic here assumes flags.bm_check is same across all CPUs */
547
	if (bm_check_flag == -1) {
548 549 550
		/* Determine whether bm_check is needed based on CPU  */
		acpi_processor_power_init_bm_check(&(pr->flags), pr->id);
		bm_check_flag = pr->flags.bm_check;
551
		bm_control_flag = pr->flags.bm_control;
552 553
	} else {
		pr->flags.bm_check = bm_check_flag;
554
		pr->flags.bm_control = bm_control_flag;
555 556 557 558
	}

	if (pr->flags.bm_check) {
		if (!pr->flags.bm_control) {
559 560 561 562 563 564 565 566 567 568
			if (pr->flags.has_cst != 1) {
				/* bus mastering control is necessary */
				ACPI_DEBUG_PRINT((ACPI_DB_INFO,
					"C3 support requires BM control\n"));
				return;
			} else {
				/* Here we enter C3 without bus mastering */
				ACPI_DEBUG_PRINT((ACPI_DB_INFO,
					"C3 support without BM control\n"));
			}
569 570 571 572 573 574
		}
	} else {
		/*
		 * WBINVD should be set in fadt, for C3 state to be
		 * supported on when bm_check is not required.
		 */
575
		if (!(acpi_gbl_FADT.flags & ACPI_FADT_WBINVD)) {
576
			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
Len Brown's avatar
Len Brown committed
577 578
					  "Cache invalidation should work properly"
					  " for C3 to be enabled on SMP systems\n"));
579
			return;
580 581 582
		}
	}

Linus Torvalds's avatar
Linus Torvalds committed
583 584 585 586 587 588 589
	/*
	 * Otherwise we've met all of our C3 requirements.
	 * Normalize the C3 latency to expidite policy.  Enable
	 * checking of bus mastering status (bm_check) so we can
	 * use this in our C3 policy
	 */
	cx->valid = 1;
590 591

	cx->latency_ticks = cx->latency;
592 593 594 595 596 597 598 599
	/*
	 * On older chipsets, BM_RLD needs to be set
	 * in order for Bus Master activity to wake the
	 * system from C3.  Newer chipsets handle DMA
	 * during C3 automatically and BM_RLD is a NOP.
	 * In either case, the proper way to
	 * handle BM_RLD is to set it and leave it set.
	 */
600
	acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_RLD, 1);
Linus Torvalds's avatar
Linus Torvalds committed
601

602
	return;
Linus Torvalds's avatar
Linus Torvalds committed
603 604 605 606 607 608
}

static int acpi_processor_power_verify(struct acpi_processor *pr)
{
	unsigned int i;
	unsigned int working = 0;
609

610
	pr->power.timer_broadcast_on_state = INT_MAX;
611

612
	for (i = 1; i < ACPI_PROCESSOR_MAX_POWER && i <= max_cstate; i++) {
Linus Torvalds's avatar
Linus Torvalds committed
613 614 615 616 617 618 619 620
		struct acpi_processor_cx *cx = &pr->power.states[i];

		switch (cx->type) {
		case ACPI_STATE_C1:
			cx->valid = 1;
			break;

		case ACPI_STATE_C2:
621 622 623 624
			if (!cx->address)
				break;
			cx->valid = 1; 
			cx->latency_ticks = cx->latency; /* Normalize latency */
Linus Torvalds's avatar
Linus Torvalds committed
625 626 627 628 629 630
			break;

		case ACPI_STATE_C3:
			acpi_processor_power_verify_c3(pr, cx);
			break;
		}
631 632
		if (!cx->valid)
			continue;
Linus Torvalds's avatar
Linus Torvalds committed
633

634 635 636
		lapic_timer_check_state(i, pr, cx);
		tsc_check_state(cx->type);
		working++;
Linus Torvalds's avatar
Linus Torvalds committed
637
	}
638

639
	lapic_timer_propagate_broadcast(pr);
Linus Torvalds's avatar
Linus Torvalds committed
640 641 642 643

	return (working);
}

Len Brown's avatar
Len Brown committed
644
static int acpi_processor_get_power_info(struct acpi_processor *pr)
Linus Torvalds's avatar
Linus Torvalds committed
645 646 647 648 649 650 651 652
{
	unsigned int i;
	int result;


	/* NOTE: the idle thread may not be running while calling
	 * this function */

653 654 655
	/* Zero initialize all the C-states info. */
	memset(pr->power.states, 0, sizeof(pr->power.states));

Linus Torvalds's avatar
Linus Torvalds committed
656
	result = acpi_processor_get_power_info_cst(pr);
657
	if (result == -ENODEV)
658
		result = acpi_processor_get_power_info_fadt(pr);
659

660 661 662 663 664
	if (result)
		return result;

	acpi_processor_get_power_info_default(pr);

665
	pr->power.count = acpi_processor_power_verify(pr);
Linus Torvalds's avatar
Linus Torvalds committed
666 667 668 669 670 671

	/*
	 * if one state of type C2 or C3 is available, mark this
	 * CPU as being "idle manageable"
	 */
	for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
672
		if (pr->power.states[i].valid) {
Linus Torvalds's avatar
Linus Torvalds committed
673
			pr->power.count = i;
674 675
			if (pr->power.states[i].type >= ACPI_STATE_C2)
				pr->flags.power = 1;
676
		}
Linus Torvalds's avatar
Linus Torvalds committed
677 678
	}

679
	return 0;
Linus Torvalds's avatar
Linus Torvalds committed
680 681
}

682 683 684 685 686 687 688
/**
 * acpi_idle_bm_check - checks if bus master activity was detected
 */
static int acpi_idle_bm_check(void)
{
	u32 bm_status = 0;

689 690 691
	if (bm_check_disable)
		return 0;

692
	acpi_read_bit_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
693
	if (bm_status)
694
		acpi_write_bit_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
	/*
	 * PIIX4 Erratum #18: Note that BM_STS doesn't always reflect
	 * the true state of bus mastering activity; forcing us to
	 * manually check the BMIDEA bit of each IDE channel.
	 */
	else if (errata.piix4.bmisx) {
		if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01)
		    || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01))
			bm_status = 1;
	}
	return bm_status;
}

/**
 * acpi_idle_do_entry - a helper function that does C2 and C3 type entry
 * @cx: cstate data
711 712
 *
 * Caller disables interrupt before call and enables interrupt after return.
713 714 715
 */
static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
{
716 717
	/* Don't trace irqs off for idle */
	stop_critical_timings();
718
	if (cx->entry_method == ACPI_CSTATE_FFH) {
719 720
		/* Call into architectural FFH based C-state */
		acpi_processor_ffh_cstate_enter(cx);
721 722
	} else if (cx->entry_method == ACPI_CSTATE_HALT) {
		acpi_safe_halt();
723 724 725 726 727 728
	} else {
		/* IO port based C-state */
		inb(cx->address);
		/* Dummy wait op - must do something useless after P_LVL2 read
		   because chipsets cannot guarantee that STPCLK# signal
		   gets asserted in time to freeze execution properly. */
729
		inl(acpi_gbl_FADT.xpm_timer_block.address);
730
	}
731
	start_critical_timings();
732 733 734 735 736 737 738 739 740 741 742 743
}

/**
 * acpi_idle_enter_c1 - enters an ACPI C1 state-type
 * @dev: the target CPU
 * @state: the state data
 *
 * This is equivalent to the HALT instruction.
 */
static int acpi_idle_enter_c1(struct cpuidle_device *dev,
			      struct cpuidle_state *state)
{
744 745
	ktime_t  kt1, kt2;
	s64 idle_time;
746 747
	struct acpi_processor *pr;
	struct acpi_processor_cx *cx = cpuidle_get_statedata(state);
748

749
	pr = __get_cpu_var(processors);
750 751 752 753

	if (unlikely(!pr))
		return 0;

754
	local_irq_disable();
755 756 757 758

	/* Do not access any ACPI IO ports in suspend path */
	if (acpi_idle_suspend) {
		local_irq_enable();
Shaohua Li's avatar
Shaohua Li committed
759
		cpu_relax();
760 761 762
		return 0;
	}

763
	lapic_timer_state_broadcast(pr, cx, 1);
764
	kt1 = ktime_get_real();
765
	acpi_idle_do_entry(cx);
766 767
	kt2 = ktime_get_real();
	idle_time =  ktime_to_us(ktime_sub(kt2, kt1));
768

769
	local_irq_enable();
770
	cx->usage++;
771
	lapic_timer_state_broadcast(pr, cx, 0);
772

773
	return idle_time;
774 775 776 777 778 779 780 781 782 783 784 785
}

/**
 * acpi_idle_enter_simple - enters an ACPI state without BM handling
 * @dev: the target CPU
 * @state: the state data
 */
static int acpi_idle_enter_simple(struct cpuidle_device *dev,
				  struct cpuidle_state *state)
{
	struct acpi_processor *pr;
	struct acpi_processor_cx *cx = cpuidle_get_statedata(state);
786
	ktime_t  kt1, kt2;
787
	s64 idle_time_ns;
788
	s64 idle_time;
789

790
	pr = __get_cpu_var(processors);
791 792 793 794

	if (unlikely(!pr))
		return 0;

795 796 797
	if (acpi_idle_suspend)
		return(acpi_idle_enter_c1(dev, state));

798
	local_irq_disable();
799

800 801 802 803 804 805 806
	if (cx->entry_method != ACPI_CSTATE_FFH) {
		current_thread_info()->status &= ~TS_POLLING;
		/*
		 * TS_POLLING-cleared state must be visible before we test
		 * NEED_RESCHED:
		 */
		smp_mb();
807

808 809 810 811 812
		if (unlikely(need_resched())) {
			current_thread_info()->status |= TS_POLLING;
			local_irq_enable();
			return 0;
		}
813 814
	}

815 816 817 818
	/*
	 * Must be done before busmaster disable as we might need to
	 * access HPET !
	 */
819
	lapic_timer_state_broadcast(pr, cx, 1);
820

821 822 823
	if (cx->type == ACPI_STATE_C3)
		ACPI_FLUSH_CPU_CACHE();

824
	kt1 = ktime_get_real();
825 826
	/* Tell the scheduler that we are going deep-idle: */
	sched_clock_idle_sleep_event();
827
	acpi_idle_do_entry(cx);
828
	kt2 = ktime_get_real();
829 830 831
	idle_time_ns = ktime_to_ns(ktime_sub(kt2, kt1));
	idle_time = idle_time_ns;
	do_div(idle_time, NSEC_PER_USEC);
832

833
	/* Tell the scheduler how much we idled: */
834
	sched_clock_idle_wakeup_event(idle_time_ns);
835 836

	local_irq_enable();
837 838
	if (cx->entry_method != ACPI_CSTATE_FFH)
		current_thread_info()->status |= TS_POLLING;
839 840 841

	cx->usage++;

842
	lapic_timer_state_broadcast(pr, cx, 0);
843
	cx->time += idle_time;
844
	return idle_time;
845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861
}

static int c3_cpu_count;
static DEFINE_SPINLOCK(c3_lock);

/**
 * acpi_idle_enter_bm - enters C3 with proper BM handling
 * @dev: the target CPU
 * @state: the state data
 *
 * If BM is detected, the deepest non-C3 idle state is entered instead.
 */
static int acpi_idle_enter_bm(struct cpuidle_device *dev,
			      struct cpuidle_state *state)
{
	struct acpi_processor *pr;
	struct acpi_processor_cx *cx = cpuidle_get_statedata(state);
862
	ktime_t  kt1, kt2;
863
	s64 idle_time_ns;
864 865
	s64 idle_time;

866

867
	pr = __get_cpu_var(processors);
868 869 870 871

	if (unlikely(!pr))
		return 0;

872 873 874
	if (acpi_idle_suspend)
		return(acpi_idle_enter_c1(dev, state));

875
	if (!cx->bm_sts_skip && acpi_idle_bm_check()) {
876
		if (dev->safe_state) {
877
			dev->last_state = dev->safe_state;
878 879
			return dev->safe_state->enter(dev, dev->safe_state);
		} else {
880
			local_irq_disable();
881
			acpi_safe_halt();
882
			local_irq_enable();
883 884 885 886
			return 0;
		}
	}

887
	local_irq_disable();
888

889 890 891 892 893 894 895
	if (cx->entry_method != ACPI_CSTATE_FFH) {
		current_thread_info()->status &= ~TS_POLLING;
		/*
		 * TS_POLLING-cleared state must be visible before we test
		 * NEED_RESCHED:
		 */
		smp_mb();
896

897 898 899 900 901
		if (unlikely(need_resched())) {
			current_thread_info()->status |= TS_POLLING;
			local_irq_enable();
			return 0;
		}
902 903
	}

904 905
	acpi_unlazy_tlb(smp_processor_id());

906 907
	/* Tell the scheduler that we are going deep-idle: */
	sched_clock_idle_sleep_event();
908 909 910 911
	/*
	 * Must be done before busmaster disable as we might need to
	 * access HPET !
	 */
912
	lapic_timer_state_broadcast(pr, cx, 1);
913

914
	kt1 = ktime_get_real();
915 916 917 918 919 920 921 922 923 924 925
	/*
	 * disable bus master
	 * bm_check implies we need ARB_DIS
	 * !bm_check implies we need cache flush
	 * bm_control implies whether we can do ARB_DIS
	 *
	 * That leaves a case where bm_check is set and bm_control is
	 * not set. In that case we cannot do much, we enter C3
	 * without doing anything.
	 */
	if (pr->flags.bm_check && pr->flags.bm_control) {
926 927 928 929
		spin_lock(&c3_lock);
		c3_cpu_count++;
		/* Disable bus master arbitration when all CPUs are in C3 */
		if (c3_cpu_count == num_online_cpus())
930
			acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 1);
931
		spin_unlock(&c3_lock);
932 933 934
	} else if (!pr->flags.bm_check) {
		ACPI_FLUSH_CPU_CACHE();
	}
935

936
	acpi_idle_do_entry(cx);
937

938 939
	/* Re-enable bus master arbitration */
	if (pr->flags.bm_check && pr->flags.bm_control) {
940
		spin_lock(&c3_lock);
941
		acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 0);
942 943 944
		c3_cpu_count--;
		spin_unlock(&c3_lock);
	}
945
	kt2 = ktime_get_real();
946
	idle_time_ns = ktime_to_ns(ktime_sub(kt2, kt1));
947 948
	idle_time = idle_time_ns;
	do_div(idle_time, NSEC_PER_USEC);
949

950
	/* Tell the scheduler how much we idled: */
951
	sched_clock_idle_wakeup_event(idle_time_ns);
952 953

	local_irq_enable();
954 955
	if (cx->entry_method != ACPI_CSTATE_FFH)
		current_thread_info()->status |= TS_POLLING;
956 957 958

	cx->usage++;

959
	lapic_timer_state_broadcast(pr, cx, 0);
960
	cx->time += idle_time;
961
	return idle_time;
962 963 964 965 966 967 968 969 970 971 972 973 974
}

struct cpuidle_driver acpi_idle_driver = {
	.name =		"acpi_idle",
	.owner =	THIS_MODULE,
};

/**
 * acpi_processor_setup_cpuidle - prepares and configures CPUIDLE
 * @pr: the ACPI processor
 */
static int acpi_processor_setup_cpuidle(struct acpi_processor *pr)
{
975
	int i, count = CPUIDLE_DRIVER_STATE_START;
976 977 978 979 980 981 982 983 984 985 986
	struct acpi_processor_cx *cx;
	struct cpuidle_state *state;
	struct cpuidle_device *dev = &pr->power.dev;

	if (!pr->flags.power_setup_done)
		return -EINVAL;

	if (pr->flags.power == 0) {
		return -EINVAL;
	}

987
	dev->cpu = pr->id;
988 989 990 991 992
	for (i = 0; i < CPUIDLE_STATE_MAX; i++) {
		dev->states[i].name[0] = '\0';
		dev->states[i].desc[0] = '\0';
	}

993 994 995
	if (max_cstate == 0)
		max_cstate = 1;

996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
	for (i = 1; i < ACPI_PROCESSOR_MAX_POWER && i <= max_cstate; i++) {
		cx = &pr->power.states[i];
		state = &dev->states[count];

		if (!cx->valid)
			continue;

#ifdef CONFIG_HOTPLUG_CPU
		if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) &&
		    !pr->flags.has_cst &&
		    !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
			continue;
1008
#endif
1009 1010 1011
		cpuidle_set_statedata(state, cx);

		snprintf(state->name, CPUIDLE_NAME_LEN, "C%d", i);
1012
		strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN);
1013
		state->exit_latency = cx->latency;
1014
		state->target_residency = cx->latency * latency_factor;
1015 1016 1017 1018 1019

		state->flags = 0;
		switch (cx->type) {
			case ACPI_STATE_C1:
			state->flags |= CPUIDLE_FLAG_SHALLOW;
1020 1021 1022
			if (cx->entry_method == ACPI_CSTATE_FFH)
				state->flags |= CPUIDLE_FLAG_TIME_VALID;

1023
			state->enter = acpi_idle_enter_c1;
1024
			dev->safe_state = state;
1025 1026 1027 1028 1029 1030
			break;

			case ACPI_STATE_C2:
			state->flags |= CPUIDLE_FLAG_BALANCED;
			state->flags |= CPUIDLE_FLAG_TIME_VALID;
			state->enter = acpi_idle_enter_simple;
1031
			dev->safe_state = state;
1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
			break;

			case ACPI_STATE_C3:
			state->flags |= CPUIDLE_FLAG_DEEP;
			state->flags |= CPUIDLE_FLAG_TIME_VALID;
			state->flags |= CPUIDLE_FLAG_CHECK_BM;
			state->enter = pr->flags.bm_check ?
					acpi_idle_enter_bm :
					acpi_idle_enter_simple;
			break;
		}

		count++;
1045 1046
		if (count == CPUIDLE_STATE_MAX)
			break;
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
	}

	dev->state_count = count;

	if (!count)
		return -EINVAL;

	return 0;
}

int acpi_processor_cst_has_changed(struct acpi_processor *pr)
{
1059
	int ret = 0;
1060

1061 1062 1063
	if (boot_option_idle_override)
		return 0;

1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076
	if (!pr)
		return -EINVAL;

	if (nocst) {
		return -ENODEV;
	}

	if (!pr->flags.power_setup_done)
		return -ENODEV;

	cpuidle_pause_and_lock();
	cpuidle_disable_device(&pr->power.dev);
	acpi_processor_get_power_info(pr);
1077 1078 1079 1080
	if (pr->flags.power) {
		acpi_processor_setup_cpuidle(pr);
		ret = cpuidle_enable_device(&pr->power.dev);
	}
1081 1082 1083 1084 1085
	cpuidle_resume_and_unlock();

	return ret;
}

1086
int __cpuinit acpi_processor_power_init(struct acpi_processor *pr,
Len Brown's avatar
Len Brown committed
1087
			      struct acpi_device *device)
Linus Torvalds's avatar
Linus Torvalds committed
1088
{
Len Brown's avatar
Len Brown committed
1089
	acpi_status status = 0;
1090
	static int first_run;
Linus Torvalds's avatar
Linus Torvalds committed
1091

1092 1093
	if (boot_option_idle_override)
		return 0;
Linus Torvalds's avatar
Linus Torvalds committed
1094 1095

	if (!first_run) {
1096 1097 1098 1099 1100 1101 1102 1103 1104
		if (idle_halt) {
			/*
			 * When the boot option of "idle=halt" is added, halt
			 * is used for CPU IDLE.
			 * In such case C2/C3 is meaningless. So the max_cstate
			 * is set to one.
			 */
			max_cstate = 1;
		}
Linus Torvalds's avatar
Linus Torvalds committed
1105
		dmi_check_system(processor_power_dmi_table);
1106
		max_cstate = acpi_processor_cstate_check(max_cstate);
Linus Torvalds's avatar
Linus Torvalds committed
1107
		if (max_cstate < ACPI_C_STATES_MAX)
Len Brown's avatar
Len Brown committed
1108 1109 1110
			printk(KERN_NOTICE
			       "ACPI: processor limited to max C-state %d\n",
			       max_cstate);
Linus Torvalds's avatar
Linus Torvalds committed
1111 1112 1113
		first_run++;
	}

1114
	if (!pr)
1115
		return -EINVAL;
1116

1117
	if (acpi_gbl_FADT.cst_control && !nocst) {
Len Brown's avatar
Len Brown committed
1118
		status =
1119
		    acpi_os_write_port(acpi_gbl_FADT.smi_command, acpi_gbl_FADT.cst_control, 8);
Linus Torvalds's avatar
Linus Torvalds committed
1120
		if (ACPI_FAILURE(status)) {
1121 1122
			ACPI_EXCEPTION((AE_INFO, status,
					"Notifying BIOS of _CST ability failed"));
Linus Torvalds's avatar
Linus Torvalds committed
1123 1124 1125 1126
		}
	}

	acpi_processor_get_power_info(pr);
1127
	pr->flags.power_setup_done = 1;
Linus Torvalds's avatar
Linus Torvalds committed
1128 1129 1130 1131 1132 1133

	/*
	 * Install the idle handler if processor power management is supported.
	 * Note that we use previously set idle handler will be used on
	 * platforms that only support C1.
	 */
1134
	if (pr->flags.power) {
1135 1136 1137
		acpi_processor_setup_cpuidle(pr);
		if (cpuidle_register_device(&pr->power.dev))
			return -EIO;
Linus Torvalds's avatar
Linus Torvalds committed
1138
	}
1139
	return 0;
Linus Torvalds's avatar
Linus Torvalds committed
1140 1141
}

Len Brown's avatar
Len Brown committed
1142 1143
int acpi_processor_power_exit(struct acpi_processor *pr,
			      struct acpi_device *device)
Linus Torvalds's avatar
Linus Torvalds committed
1144
{
1145 1146 1147
	if (boot_option_idle_override)
		return 0;

1148
	cpuidle_unregister_device(&pr->power.dev);
Linus Torvalds's avatar
Linus Torvalds committed
1149 1150
	pr->flags.power_setup_done = 0;

1151
	return 0;
Linus Torvalds's avatar
Linus Torvalds committed
1152
}