acpi-cpufreq.c 20.0 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 * acpi-cpufreq.c - ACPI Processor P-States Driver ($Revision: 1.4 $)
L
Linus Torvalds 已提交
3 4 5 6
 *
 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
 *  Copyright (C) 2002 - 2004 Dominik Brodowski <linux@brodo.de>
7
 *  Copyright (C) 2006       Denis Sadykov <denis.m.sadykov@intel.com>
L
Linus Torvalds 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *  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>
31 32
#include <linux/smp.h>
#include <linux/sched.h>
L
Linus Torvalds 已提交
33
#include <linux/cpufreq.h>
34
#include <linux/compiler.h>
35
#include <linux/dmi.h>
L
Linus Torvalds 已提交
36 37 38 39

#include <linux/acpi.h>
#include <acpi/processor.h>

40
#include <asm/io.h>
41
#include <asm/msr.h>
42 43 44 45 46
#include <asm/processor.h>
#include <asm/cpufeature.h>
#include <asm/delay.h>
#include <asm/uaccess.h>

L
Linus Torvalds 已提交
47 48 49 50 51 52
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "acpi-cpufreq", msg)

MODULE_AUTHOR("Paul Diefenbaugh, Dominik Brodowski");
MODULE_DESCRIPTION("ACPI Processor P-States Driver");
MODULE_LICENSE("GPL");

53 54 55 56 57 58 59
enum {
	UNDEFINED_CAPABLE = 0,
	SYSTEM_INTEL_MSR_CAPABLE,
	SYSTEM_IO_CAPABLE,
};

#define INTEL_MSR_RANGE		(0xffff)
60
#define CPUID_6_ECX_APERFMPERF_CAPABILITY	(0x1)
61

62
struct acpi_cpufreq_data {
63 64
	struct acpi_processor_performance *acpi_data;
	struct cpufreq_frequency_table *freq_table;
65
	unsigned int max_freq;
66 67
	unsigned int resume;
	unsigned int cpu_feature;
L
Linus Torvalds 已提交
68 69
};

70 71
static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data);

72 73
/* acpi_perf_data is a pointer to percpu data. */
static struct acpi_processor_performance *acpi_perf_data;
L
Linus Torvalds 已提交
74 75 76

static struct cpufreq_driver acpi_cpufreq_driver;

77 78
static unsigned int acpi_pstate_strict;

79 80
static int check_est_cpu(unsigned int cpuid)
{
81
	struct cpuinfo_x86 *cpu = &cpu_data(cpuid);
82 83

	if (cpu->x86_vendor != X86_VENDOR_INTEL ||
84
	    !cpu_has(cpu, X86_FEATURE_EST))
85 86 87 88 89 90
		return 0;

	return 1;
}

static unsigned extract_io(u32 value, struct acpi_cpufreq_data *data)
91
{
92 93
	struct acpi_processor_performance *perf;
	int i;
94 95 96

	perf = data->acpi_data;

97
	for (i=0; i<perf->state_count; i++) {
98 99 100 101 102 103
		if (value == perf->states[i].status)
			return data->freq_table[i].frequency;
	}
	return 0;
}

104 105 106
static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data)
{
	int i;
107
	struct acpi_processor_performance *perf;
108 109

	msr &= INTEL_MSR_RANGE;
110 111
	perf = data->acpi_data;

112
	for (i=0; data->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
113
		if (msr == perf->states[data->freq_table[i].index].status)
114 115 116 117 118 119 120 121
			return data->freq_table[i].frequency;
	}
	return data->freq_table[0].frequency;
}

static unsigned extract_freq(u32 val, struct acpi_cpufreq_data *data)
{
	switch (data->cpu_feature) {
122
	case SYSTEM_INTEL_MSR_CAPABLE:
123
		return extract_msr(val, data);
124
	case SYSTEM_IO_CAPABLE:
125
		return extract_io(val, data);
126
	default:
127 128 129 130 131 132 133 134
		return 0;
	}
}

struct msr_addr {
	u32 reg;
};

135 136 137 138 139
struct io_addr {
	u16 port;
	u8 bit_width;
};

140 141 142 143 144
typedef union {
	struct msr_addr msr;
	struct io_addr io;
} drv_addr_union;

145
struct drv_cmd {
146
	unsigned int type;
147
	cpumask_t mask;
148
	drv_addr_union addr;
149 150 151 152
	u32 val;
};

static void do_drv_read(struct drv_cmd *cmd)
L
Linus Torvalds 已提交
153
{
154 155 156
	u32 h;

	switch (cmd->type) {
157
	case SYSTEM_INTEL_MSR_CAPABLE:
158 159
		rdmsr(cmd->addr.msr.reg, cmd->val, h);
		break;
160
	case SYSTEM_IO_CAPABLE:
161 162 163
		acpi_os_read_port((acpi_io_address)cmd->addr.io.port,
				&cmd->val,
				(u32)cmd->addr.io.bit_width);
164
		break;
165
	default:
166 167
		break;
	}
168
}
L
Linus Torvalds 已提交
169

170 171
static void do_drv_write(struct drv_cmd *cmd)
{
172
	u32 lo, hi;
173 174

	switch (cmd->type) {
175
	case SYSTEM_INTEL_MSR_CAPABLE:
176 177 178
		rdmsr(cmd->addr.msr.reg, lo, hi);
		lo = (lo & ~INTEL_MSR_RANGE) | (cmd->val & INTEL_MSR_RANGE);
		wrmsr(cmd->addr.msr.reg, lo, hi);
179
		break;
180
	case SYSTEM_IO_CAPABLE:
181 182 183
		acpi_os_write_port((acpi_io_address)cmd->addr.io.port,
				cmd->val,
				(u32)cmd->addr.io.bit_width);
184
		break;
185
	default:
186 187
		break;
	}
188
}
L
Linus Torvalds 已提交
189

190
static void drv_read(struct drv_cmd *cmd)
191
{
192
	cpumask_t saved_mask = current->cpus_allowed;
193 194
	cmd->val = 0;

195
	set_cpus_allowed_ptr(current, &cmd->mask);
196
	do_drv_read(cmd);
197
	set_cpus_allowed_ptr(current, &saved_mask);
198 199 200 201
}

static void drv_write(struct drv_cmd *cmd)
{
202 203
	cpumask_t saved_mask = current->cpus_allowed;
	unsigned int i;
204

205
	for_each_cpu_mask_nr(i, cmd->mask) {
206
		set_cpus_allowed_ptr(current, &cpumask_of_cpu(i));
207
		do_drv_write(cmd);
L
Linus Torvalds 已提交
208 209
	}

210
	set_cpus_allowed_ptr(current, &saved_mask);
211 212
	return;
}
L
Linus Torvalds 已提交
213

214
static u32 get_cur_val(const cpumask_t *mask)
215
{
216 217
	struct acpi_processor_performance *perf;
	struct drv_cmd cmd;
L
Linus Torvalds 已提交
218

219
	if (unlikely(cpus_empty(*mask)))
220
		return 0;
L
Linus Torvalds 已提交
221

222
	switch (per_cpu(drv_data, first_cpu(*mask))->cpu_feature) {
223 224 225 226 227 228
	case SYSTEM_INTEL_MSR_CAPABLE:
		cmd.type = SYSTEM_INTEL_MSR_CAPABLE;
		cmd.addr.msr.reg = MSR_IA32_PERF_STATUS;
		break;
	case SYSTEM_IO_CAPABLE:
		cmd.type = SYSTEM_IO_CAPABLE;
229
		perf = per_cpu(drv_data, first_cpu(*mask))->acpi_data;
230 231 232 233 234 235 236
		cmd.addr.io.port = perf->control_register.address;
		cmd.addr.io.bit_width = perf->control_register.bit_width;
		break;
	default:
		return 0;
	}

237
	cmd.mask = *mask;
L
Linus Torvalds 已提交
238

239
	drv_read(&cmd);
L
Linus Torvalds 已提交
240

241 242 243 244
	dprintk("get_cur_val = %u\n", cmd.val);

	return cmd.val;
}
L
Linus Torvalds 已提交
245

246 247 248 249 250 251 252 253 254 255 256 257 258
/*
 * Return the measured active (C0) frequency on this CPU since last call
 * to this function.
 * Input: cpu number
 * Return: Average CPU frequency in terms of max frequency (zero on error)
 *
 * We use IA32_MPERF and IA32_APERF MSRs to get the measured performance
 * over a period of time, while CPU is in C0 state.
 * IA32_MPERF counts at the rate of max advertised frequency
 * IA32_APERF counts at the rate of actual CPU frequency
 * Only IA32_APERF/IA32_MPERF ratio is architecturally defined and
 * no meaning should be associated with absolute values of these MSRs.
 */
259 260
static unsigned int get_measured_perf(struct cpufreq_policy *policy,
				      unsigned int cpu)
261 262 263 264 265 266 267 268 269 270 271 272 273 274
{
	union {
		struct {
			u32 lo;
			u32 hi;
		} split;
		u64 whole;
	} aperf_cur, mperf_cur;

	cpumask_t saved_mask;
	unsigned int perf_percent;
	unsigned int retval;

	saved_mask = current->cpus_allowed;
275
	set_cpus_allowed_ptr(current, &cpumask_of_cpu(cpu));
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
	if (get_cpu() != cpu) {
		/* We were not able to run on requested processor */
		put_cpu();
		return 0;
	}

	rdmsr(MSR_IA32_APERF, aperf_cur.split.lo, aperf_cur.split.hi);
	rdmsr(MSR_IA32_MPERF, mperf_cur.split.lo, mperf_cur.split.hi);

	wrmsr(MSR_IA32_APERF, 0,0);
	wrmsr(MSR_IA32_MPERF, 0,0);

#ifdef __i386__
	/*
	 * We dont want to do 64 bit divide with 32 bit kernel
	 * Get an approximate value. Return failure in case we cannot get
	 * an approximate value.
	 */
	if (unlikely(aperf_cur.split.hi || mperf_cur.split.hi)) {
		int shift_count;
		u32 h;

		h = max_t(u32, aperf_cur.split.hi, mperf_cur.split.hi);
		shift_count = fls(h);

		aperf_cur.whole >>= shift_count;
		mperf_cur.whole >>= shift_count;
	}

	if (((unsigned long)(-1) / 100) < aperf_cur.split.lo) {
		int shift_count = 7;
		aperf_cur.split.lo >>= shift_count;
		mperf_cur.split.lo >>= shift_count;
	}

311
	if (aperf_cur.split.lo && mperf_cur.split.lo)
312
		perf_percent = (aperf_cur.split.lo * 100) / mperf_cur.split.lo;
313
	else
314 315 316 317 318 319 320 321 322
		perf_percent = 0;

#else
	if (unlikely(((unsigned long)(-1) / 100) < aperf_cur.whole)) {
		int shift_count = 7;
		aperf_cur.whole >>= shift_count;
		mperf_cur.whole >>= shift_count;
	}

323
	if (aperf_cur.whole && mperf_cur.whole)
324
		perf_percent = (aperf_cur.whole * 100) / mperf_cur.whole;
325
	else
326 327 328 329
		perf_percent = 0;

#endif

330
	retval = per_cpu(drv_data, policy->cpu)->max_freq * perf_percent / 100;
331 332

	put_cpu();
333
	set_cpus_allowed_ptr(current, &saved_mask);
334 335 336 337 338

	dprintk("cpu %d: performance percent %d\n", cpu, perf_percent);
	return retval;
}

339 340
static unsigned int get_cur_freq_on_cpu(unsigned int cpu)
{
341
	struct acpi_cpufreq_data *data = per_cpu(drv_data, cpu);
342
	unsigned int freq;
343
	unsigned int cached_freq;
344 345 346 347

	dprintk("get_cur_freq_on_cpu (%d)\n", cpu);

	if (unlikely(data == NULL ||
348
		     data->acpi_data == NULL || data->freq_table == NULL)) {
349
		return 0;
L
Linus Torvalds 已提交
350 351
	}

352
	cached_freq = data->freq_table[data->acpi_data->state].frequency;
353
	freq = extract_freq(get_cur_val(&cpumask_of_cpu(cpu)), data);
354 355 356 357 358 359 360 361
	if (freq != cached_freq) {
		/*
		 * The dreaded BIOS frequency change behind our back.
		 * Force set the frequency on next target call.
		 */
		data->resume = 1;
	}

362
	dprintk("cur freq = %u\n", freq);
L
Linus Torvalds 已提交
363

364
	return freq;
L
Linus Torvalds 已提交
365 366
}

367
static unsigned int check_freqs(const cpumask_t *mask, unsigned int freq,
368
				struct acpi_cpufreq_data *data)
369
{
370 371
	unsigned int cur_freq;
	unsigned int i;
L
Linus Torvalds 已提交
372

373
	for (i=0; i<100; i++) {
374 375 376 377 378 379 380 381 382
		cur_freq = extract_freq(get_cur_val(mask), data);
		if (cur_freq == freq)
			return 1;
		udelay(10);
	}
	return 0;
}

static int acpi_cpufreq_target(struct cpufreq_policy *policy,
383
			       unsigned int target_freq, unsigned int relation)
L
Linus Torvalds 已提交
384
{
385
	struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
386 387 388 389
	struct acpi_processor_performance *perf;
	struct cpufreq_freqs freqs;
	cpumask_t online_policy_cpus;
	struct drv_cmd cmd;
390 391
	unsigned int next_state = 0; /* Index into freq_table */
	unsigned int next_perf_state = 0; /* Index into perf table */
392 393
	unsigned int i;
	int result = 0;
394 395 396 397

	dprintk("acpi_cpufreq_target %d (%d)\n", target_freq, policy->cpu);

	if (unlikely(data == NULL ||
398
	     data->acpi_data == NULL || data->freq_table == NULL)) {
399 400
		return -ENODEV;
	}
L
Linus Torvalds 已提交
401

402
	perf = data->acpi_data;
L
Linus Torvalds 已提交
403
	result = cpufreq_frequency_table_target(policy,
404 405 406
						data->freq_table,
						target_freq,
						relation, &next_state);
407
	if (unlikely(result))
408
		return -ENODEV;
409

410
#ifdef CONFIG_HOTPLUG_CPU
411 412
	/* cpufreq holds the hotplug lock, so we are safe from here on */
	cpus_and(online_policy_cpus, cpu_online_map, policy->cpus);
413 414 415
#else
	online_policy_cpus = policy->cpus;
#endif
L
Linus Torvalds 已提交
416

417
	next_perf_state = data->freq_table[next_state].index;
418
	if (perf->state == next_perf_state) {
419
		if (unlikely(data->resume)) {
420 421
			dprintk("Called after resume, resetting to P%d\n",
				next_perf_state);
422 423
			data->resume = 0;
		} else {
424 425
			dprintk("Already at target state (P%d)\n",
				next_perf_state);
426 427
			return 0;
		}
428 429
	}

430 431 432 433
	switch (data->cpu_feature) {
	case SYSTEM_INTEL_MSR_CAPABLE:
		cmd.type = SYSTEM_INTEL_MSR_CAPABLE;
		cmd.addr.msr.reg = MSR_IA32_PERF_CTL;
434
		cmd.val = (u32) perf->states[next_perf_state].control;
435 436 437 438 439 440 441 442 443 444
		break;
	case SYSTEM_IO_CAPABLE:
		cmd.type = SYSTEM_IO_CAPABLE;
		cmd.addr.io.port = perf->control_register.address;
		cmd.addr.io.bit_width = perf->control_register.bit_width;
		cmd.val = (u32) perf->states[next_perf_state].control;
		break;
	default:
		return -ENODEV;
	}
445

446
	cpus_clear(cmd.mask);
447

448 449 450 451
	if (policy->shared_type != CPUFREQ_SHARED_TYPE_ANY)
		cmd.mask = online_policy_cpus;
	else
		cpu_set(policy->cpu, cmd.mask);
452

453 454
	freqs.old = perf->states[perf->state].core_frequency * 1000;
	freqs.new = data->freq_table[next_state].frequency;
455
	for_each_cpu_mask_nr(i, cmd.mask) {
456 457
		freqs.cpu = i;
		cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
458
	}
L
Linus Torvalds 已提交
459

460
	drv_write(&cmd);
461

462
	if (acpi_pstate_strict) {
463
		if (!check_freqs(&cmd.mask, freqs.new, data)) {
464
			dprintk("acpi_cpufreq_target failed (%d)\n",
465
				policy->cpu);
466
			return -EAGAIN;
467 468 469
		}
	}

470
	for_each_cpu_mask_nr(i, cmd.mask) {
471 472 473 474 475 476
		freqs.cpu = i;
		cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
	}
	perf->state = next_perf_state;

	return result;
L
Linus Torvalds 已提交
477 478
}

479
static int acpi_cpufreq_verify(struct cpufreq_policy *policy)
L
Linus Torvalds 已提交
480
{
481
	struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
L
Linus Torvalds 已提交
482 483 484

	dprintk("acpi_cpufreq_verify\n");

485
	return cpufreq_frequency_table_verify(policy, data->freq_table);
L
Linus Torvalds 已提交
486 487 488
}

static unsigned long
489
acpi_cpufreq_guess_freq(struct acpi_cpufreq_data *data, unsigned int cpu)
L
Linus Torvalds 已提交
490
{
491
	struct acpi_processor_performance *perf = data->acpi_data;
492

L
Linus Torvalds 已提交
493 494 495 496
	if (cpu_khz) {
		/* search the closest match to cpu_khz */
		unsigned int i;
		unsigned long freq;
497
		unsigned long freqn = perf->states[0].core_frequency * 1000;
L
Linus Torvalds 已提交
498

499
		for (i=0; i<(perf->state_count-1); i++) {
L
Linus Torvalds 已提交
500
			freq = freqn;
501
			freqn = perf->states[i+1].core_frequency * 1000;
L
Linus Torvalds 已提交
502
			if ((2 * cpu_khz) > (freqn + freq)) {
503
				perf->state = i;
504
				return freq;
L
Linus Torvalds 已提交
505 506
			}
		}
507
		perf->state = perf->state_count-1;
508
		return freqn;
509
	} else {
L
Linus Torvalds 已提交
510
		/* assume CPU is at P0... */
511 512 513
		perf->state = 0;
		return perf->states[0].core_frequency * 1000;
	}
L
Linus Torvalds 已提交
514 515
}

516 517 518 519 520 521 522 523
/*
 * acpi_cpufreq_early_init - initialize ACPI P-States library
 *
 * Initialize the ACPI P-States library (drivers/acpi/processor_perflib.c)
 * in order to determine correct frequency and voltage pairings. We can
 * do _PDC and _PSD and find out the processor dependency for the
 * actual init that will happen later...
 */
524
static int __init acpi_cpufreq_early_init(void)
525 526 527
{
	dprintk("acpi_cpufreq_early_init\n");

528 529 530 531
	acpi_perf_data = alloc_percpu(struct acpi_processor_performance);
	if (!acpi_perf_data) {
		dprintk("Memory allocation error for acpi_perf_data.\n");
		return -ENOMEM;
532 533 534
	}

	/* Do initialization in ACPI core */
535 536
	acpi_processor_preregister_performance(acpi_perf_data);
	return 0;
537 538
}

539
#ifdef CONFIG_SMP
540 541 542 543 544 545 546 547
/*
 * Some BIOSes do SW_ANY coordination internally, either set it up in hw
 * or do it in BIOS firmware and won't inform about it to OS. If not
 * detected, this has a side effect of making CPU run at a different speed
 * than OS intended it to run at. Detect it and handle it cleanly.
 */
static int bios_with_sw_any_bug;

548
static int sw_any_bug_found(const struct dmi_system_id *d)
549 550 551 552 553
{
	bios_with_sw_any_bug = 1;
	return 0;
}

554
static const struct dmi_system_id sw_any_bug_dmi_table[] = {
555 556 557 558 559 560 561 562 563 564 565
	{
		.callback = sw_any_bug_found,
		.ident = "Supermicro Server X6DLP",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"),
			DMI_MATCH(DMI_BIOS_VERSION, "080010"),
			DMI_MATCH(DMI_PRODUCT_NAME, "X6DLP"),
		},
	},
	{ }
};
566
#endif
567

568
static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
L
Linus Torvalds 已提交
569
{
570 571 572 573 574
	unsigned int i;
	unsigned int valid_states = 0;
	unsigned int cpu = policy->cpu;
	struct acpi_cpufreq_data *data;
	unsigned int result = 0;
575
	struct cpuinfo_x86 *c = &cpu_data(policy->cpu);
576
	struct acpi_processor_performance *perf;
L
Linus Torvalds 已提交
577 578 579

	dprintk("acpi_cpufreq_cpu_init\n");

580
	data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL);
L
Linus Torvalds 已提交
581
	if (!data)
582
		return -ENOMEM;
L
Linus Torvalds 已提交
583

584
	data->acpi_data = percpu_ptr(acpi_perf_data, cpu);
585
	per_cpu(drv_data, cpu) = data;
L
Linus Torvalds 已提交
586

587
	if (cpu_has(c, X86_FEATURE_CONSTANT_TSC))
588
		acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS;
L
Linus Torvalds 已提交
589

590
	result = acpi_processor_register_performance(data->acpi_data, cpu);
L
Linus Torvalds 已提交
591 592 593
	if (result)
		goto err_free;

594 595
	perf = data->acpi_data;
	policy->shared_type = perf->shared_type;
596

597
	/*
598
	 * Will let policy->cpus know about dependency only when software
599 600 601
	 * coordination is required.
	 */
	if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL ||
602
	    policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) {
603
		policy->cpus = perf->shared_cpu_map;
604
	}
605
	policy->related_cpus = perf->shared_cpu_map;
606 607 608 609 610

#ifdef CONFIG_SMP
	dmi_check_system(sw_any_bug_dmi_table);
	if (bios_with_sw_any_bug && cpus_weight(policy->cpus) == 1) {
		policy->shared_type = CPUFREQ_SHARED_TYPE_ALL;
611
		policy->cpus = per_cpu(cpu_core_map, cpu);
612 613
	}
#endif
614

L
Linus Torvalds 已提交
615
	/* capability check */
616
	if (perf->state_count <= 1) {
L
Linus Torvalds 已提交
617 618 619 620
		dprintk("No P-States\n");
		result = -ENODEV;
		goto err_unreg;
	}
621

622 623 624 625 626 627
	if (perf->control_register.space_id != perf->status_register.space_id) {
		result = -ENODEV;
		goto err_unreg;
	}

	switch (perf->control_register.space_id) {
628
	case ACPI_ADR_SPACE_SYSTEM_IO:
629
		dprintk("SYSTEM IO addr space\n");
630 631
		data->cpu_feature = SYSTEM_IO_CAPABLE;
		break;
632
	case ACPI_ADR_SPACE_FIXED_HARDWARE:
633 634 635 636 637 638
		dprintk("HARDWARE addr space\n");
		if (!check_est_cpu(cpu)) {
			result = -ENODEV;
			goto err_unreg;
		}
		data->cpu_feature = SYSTEM_INTEL_MSR_CAPABLE;
639
		break;
640
	default:
641
		dprintk("Unknown addr space %d\n",
642
			(u32) (perf->control_register.space_id));
L
Linus Torvalds 已提交
643 644 645 646
		result = -ENODEV;
		goto err_unreg;
	}

647 648
	data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) *
		    (perf->state_count+1), GFP_KERNEL);
L
Linus Torvalds 已提交
649 650 651 652 653 654 655
	if (!data->freq_table) {
		result = -ENOMEM;
		goto err_unreg;
	}

	/* detect transition latency */
	policy->cpuinfo.transition_latency = 0;
656
	for (i=0; i<perf->state_count; i++) {
657 658 659 660
		if ((perf->states[i].transition_latency * 1000) >
		    policy->cpuinfo.transition_latency)
			policy->cpuinfo.transition_latency =
			    perf->states[i].transition_latency * 1000;
L
Linus Torvalds 已提交
661 662
	}

663
	data->max_freq = perf->states[0].core_frequency * 1000;
L
Linus Torvalds 已提交
664
	/* table init */
665
	for (i=0; i<perf->state_count; i++) {
666 667
		if (i>0 && perf->states[i].core_frequency >=
		    data->freq_table[valid_states-1].frequency / 1000)
668 669 670 671
			continue;

		data->freq_table[valid_states].index = i;
		data->freq_table[valid_states].frequency =
672
		    perf->states[i].core_frequency * 1000;
673
		valid_states++;
L
Linus Torvalds 已提交
674
	}
675
	data->freq_table[valid_states].frequency = CPUFREQ_TABLE_END;
676
	perf->state = 0;
L
Linus Torvalds 已提交
677 678

	result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table);
679
	if (result)
L
Linus Torvalds 已提交
680 681
		goto err_freqfree;

682
	switch (perf->control_register.space_id) {
683
	case ACPI_ADR_SPACE_SYSTEM_IO:
684 685 686
		/* Current speed is unknown and not detectable by IO port */
		policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
		break;
687
	case ACPI_ADR_SPACE_FIXED_HARDWARE:
688
		acpi_cpufreq_driver.get = get_cur_freq_on_cpu;
689
		policy->cur = get_cur_freq_on_cpu(cpu);
690
		break;
691
	default:
692 693 694
		break;
	}

L
Linus Torvalds 已提交
695 696 697
	/* notify BIOS that we exist */
	acpi_processor_notify_smm(THIS_MODULE);

698 699 700 701
	/* Check for APERF/MPERF support in hardware */
	if (c->x86_vendor == X86_VENDOR_INTEL && c->cpuid_level >= 6) {
		unsigned int ecx;
		ecx = cpuid_ecx(6);
702
		if (ecx & CPUID_6_ECX_APERFMPERF_CAPABILITY)
703 704 705
			acpi_cpufreq_driver.getavg = get_measured_perf;
	}

706
	dprintk("CPU%u - ACPI performance management activated.\n", cpu);
707
	for (i = 0; i < perf->state_count; i++)
L
Linus Torvalds 已提交
708
		dprintk("     %cP%d: %d MHz, %d mW, %d uS\n",
709
			(i == perf->state ? '*' : ' '), i,
710 711 712
			(u32) perf->states[i].core_frequency,
			(u32) perf->states[i].power,
			(u32) perf->states[i].transition_latency);
L
Linus Torvalds 已提交
713 714

	cpufreq_frequency_table_get_attr(data->freq_table, policy->cpu);
715

716 717 718 719 720
	/*
	 * the first call to ->target() should result in us actually
	 * writing something to the appropriate registers.
	 */
	data->resume = 1;
721

722
	return result;
L
Linus Torvalds 已提交
723

724
err_freqfree:
L
Linus Torvalds 已提交
725
	kfree(data->freq_table);
726
err_unreg:
727
	acpi_processor_unregister_performance(perf, cpu);
728
err_free:
L
Linus Torvalds 已提交
729
	kfree(data);
730
	per_cpu(drv_data, cpu) = NULL;
L
Linus Torvalds 已提交
731

732
	return result;
L
Linus Torvalds 已提交
733 734
}

735
static int acpi_cpufreq_cpu_exit(struct cpufreq_policy *policy)
L
Linus Torvalds 已提交
736
{
737
	struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
L
Linus Torvalds 已提交
738 739 740 741 742

	dprintk("acpi_cpufreq_cpu_exit\n");

	if (data) {
		cpufreq_frequency_table_put_attr(policy->cpu);
743
		per_cpu(drv_data, policy->cpu) = NULL;
744 745
		acpi_processor_unregister_performance(data->acpi_data,
						      policy->cpu);
L
Linus Torvalds 已提交
746 747 748
		kfree(data);
	}

749
	return 0;
L
Linus Torvalds 已提交
750 751
}

752
static int acpi_cpufreq_resume(struct cpufreq_policy *policy)
L
Linus Torvalds 已提交
753
{
754
	struct acpi_cpufreq_data *data = per_cpu(drv_data, policy->cpu);
L
Linus Torvalds 已提交
755 756 757 758 759

	dprintk("acpi_cpufreq_resume\n");

	data->resume = 1;

760
	return 0;
L
Linus Torvalds 已提交
761 762
}

763
static struct freq_attr *acpi_cpufreq_attr[] = {
L
Linus Torvalds 已提交
764 765 766 767 768
	&cpufreq_freq_attr_scaling_available_freqs,
	NULL,
};

static struct cpufreq_driver acpi_cpufreq_driver = {
769 770 771 772 773 774 775 776
	.verify = acpi_cpufreq_verify,
	.target = acpi_cpufreq_target,
	.init = acpi_cpufreq_cpu_init,
	.exit = acpi_cpufreq_cpu_exit,
	.resume = acpi_cpufreq_resume,
	.name = "acpi-cpufreq",
	.owner = THIS_MODULE,
	.attr = acpi_cpufreq_attr,
L
Linus Torvalds 已提交
777 778
};

779
static int __init acpi_cpufreq_init(void)
L
Linus Torvalds 已提交
780
{
781 782
	int ret;

783 784 785
	if (acpi_disabled)
		return 0;

L
Linus Torvalds 已提交
786 787
	dprintk("acpi_cpufreq_init\n");

788 789 790
	ret = acpi_cpufreq_early_init();
	if (ret)
		return ret;
791

792 793 794 795 796
	ret = cpufreq_register_driver(&acpi_cpufreq_driver);
	if (ret)
		free_percpu(acpi_perf_data);

	return ret;
L
Linus Torvalds 已提交
797 798
}

799
static void __exit acpi_cpufreq_exit(void)
L
Linus Torvalds 已提交
800 801 802 803 804
{
	dprintk("acpi_cpufreq_exit\n");

	cpufreq_unregister_driver(&acpi_cpufreq_driver);

805
	free_percpu(acpi_perf_data);
L
Linus Torvalds 已提交
806 807
}

808
module_param(acpi_pstate_strict, uint, 0644);
809
MODULE_PARM_DESC(acpi_pstate_strict,
810 811
	"value 0 or non-zero. non-zero -> strict ACPI checks are "
	"performed during frequency changes.");
L
Linus Torvalds 已提交
812 813 814 815 816

late_initcall(acpi_cpufreq_init);
module_exit(acpi_cpufreq_exit);

MODULE_ALIAS("acpi");