Commit 33ac02aa authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq

parents e0d7ff16 2bcad935
Loading
Loading
Loading
Loading
+17 −18
Original line number Diff line number Diff line
/*
 *   (c) 2003, 2004 Advanced Micro Devices, Inc.
 *   (c) 2003, 2004, 2005 Advanced Micro Devices, Inc.
 *  Your use of this code is subject to the terms and conditions of the
 *  GNU general public license version 2. See "COPYING" or
 *  http://www.gnu.org/licenses/gpl.html
@@ -44,7 +44,7 @@

#define PFX "powernow-k8: "
#define BFX PFX "BIOS error: "
#define VERSION "version 1.40.2"
#define VERSION "version 1.50.3"
#include "powernow-k8.h"

/* serialize freq changes  */
@@ -231,7 +231,7 @@ static int write_new_vid(struct powernow_k8_data *data, u32 vid)
/*
 * Reduce the vid by the max of step or reqvid.
 * Decreasing vid codes represent increasing voltages:
 * vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of 0x1f is off.
 * vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of VID_OFF is off.
 */
static int decrease_vid_code_by_step(struct powernow_k8_data *data, u32 reqvid, u32 step)
{
@@ -466,7 +466,7 @@ static int check_supported_cpu(unsigned int cpu)
	eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
	if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) ||
	    ((eax & CPUID_XFAM) != CPUID_XFAM_K8) ||
	    ((eax & CPUID_XMOD) > CPUID_XMOD_REV_E)) {
	    ((eax & CPUID_XMOD) > CPUID_XMOD_REV_F)) {
		printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax);
		goto out;
	}
@@ -695,6 +695,7 @@ static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned

	data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK;
	data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK;
	data->exttype = (data->acpi_data.states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK;
	data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK;
	data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK);
	data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK;
@@ -734,8 +735,13 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
	}

	for (i = 0; i < data->acpi_data.state_count; i++) {
	    	if (data->exttype) {
		    	u32 fid = data->acpi_data.states[i].status & FID_MASK;
			u32 vid = (data->acpi_data.states[i].status >> VID_SHIFT) & VID_MASK;
		} else {
		    	u32 fid = data->acpi_data.states[i].control & FID_MASK;
			u32 vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK;
		}

		dprintk("   %d : fid 0x%x, vid 0x%x\n", i, fid, vid);

@@ -752,7 +758,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
		}

		/* verify voltage is OK - BIOSs are using "off" to indicate invalid */
		if (vid == 0x1f) {
		if (vid == VID_OFF) {
			dprintk("invalid vid %u, ignoring\n", vid);
			powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
			continue;
@@ -929,15 +935,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi

	down(&fidvid_sem);

	for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
		/* make sure the sibling is initialized */
		if (!powernow_data[i]) {
                        ret = 0;
                        up(&fidvid_sem);
                        goto err_out;
                }
	}

	powernow_k8_acpi_pst_values(data, newstate);

	if (transition_frequency(data, newstate)) {
@@ -977,7 +974,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
{
	struct powernow_k8_data *data;
	cpumask_t oldmask = CPU_MASK_ALL;
	int rc;
	int rc, i;

	if (!check_supported_cpu(pol->cpu))
		return -ENODEV;
@@ -1063,7 +1060,9 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
	printk("cpu_init done, current fid 0x%x, vid 0x%x\n",
	       data->currfid, data->currvid);

	powernow_data[pol->cpu] = data;
	for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
		powernow_data[i] = data;
	}

	return 0;

+19 −13
Original line number Diff line number Diff line
/*
 *  (c) 2003, 2004 Advanced Micro Devices, Inc.
 *  (c) 2003, 2004, 2005 Advanced Micro Devices, Inc.
 *  Your use of this code is subject to the terms and conditions of the
 *  GNU general public license version 2. See "COPYING" or
 *  http://www.gnu.org/licenses/gpl.html
@@ -19,6 +19,7 @@ struct powernow_k8_data {
	u32 vidmvs;  /* usable value calculated from mvs */
	u32 vstable; /* voltage stabilization time, units 20 us */
	u32 plllock; /* pll lock time, units 1 us */
        u32 exttype; /* extended interface = 1 */

	/* keep track of the current fid / vid */
	u32 currvid, currfid;
@@ -41,7 +42,7 @@ struct powernow_k8_data {
#define CPUID_XFAM			0x0ff00000	/* extended family */
#define CPUID_XFAM_K8			0
#define CPUID_XMOD			0x000f0000	/* extended model */
#define CPUID_XMOD_REV_E		0x00020000
#define CPUID_XMOD_REV_F		0x00040000
#define CPUID_USE_XFAM_XMOD		0x00000f00
#define CPUID_GET_MAX_CAPABILITIES	0x80000000
#define CPUID_FREQ_VOLT_CAPABILITIES	0x80000007
@@ -57,8 +58,8 @@ struct powernow_k8_data {

/* Field definitions within the FID VID Low Control MSR : */
#define MSR_C_LO_INIT_FID_VID     0x00010000
#define MSR_C_LO_NEW_VID          0x00001f00
#define MSR_C_LO_NEW_FID          0x0000002f
#define MSR_C_LO_NEW_VID          0x00003f00
#define MSR_C_LO_NEW_FID          0x0000003f
#define MSR_C_LO_VID_SHIFT        8

/* Field definitions within the FID VID High Control MSR : */
@@ -66,15 +67,16 @@ struct powernow_k8_data {

/* Field definitions within the FID VID Low Status MSR : */
#define MSR_S_LO_CHANGE_PENDING   0x80000000   /* cleared when completed */
#define MSR_S_LO_MAX_RAMP_VID     0x1f000000
#define MSR_S_LO_MAX_RAMP_VID     0x3f000000
#define MSR_S_LO_MAX_FID          0x003f0000
#define MSR_S_LO_START_FID        0x00003f00
#define MSR_S_LO_CURRENT_FID      0x0000003f

/* Field definitions within the FID VID High Status MSR : */
#define MSR_S_HI_MAX_WORKING_VID  0x001f0000
#define MSR_S_HI_START_VID        0x00001f00
#define MSR_S_HI_CURRENT_VID      0x0000001f
#define MSR_S_HI_MIN_WORKING_VID  0x3f000000
#define MSR_S_HI_MAX_WORKING_VID  0x003f0000
#define MSR_S_HI_START_VID        0x00003f00
#define MSR_S_HI_CURRENT_VID      0x0000003f
#define MSR_C_HI_STP_GNT_BENIGN	  0x00000001

/*
@@ -99,13 +101,15 @@ struct powernow_k8_data {
#define MIN_FREQ_RESOLUTION  200 /* fids jump by 2 matching freq jumps by 200 */

#define MAX_FID 0x2a	/* Spec only gives FID values as far as 5 GHz */
#define LEAST_VID 0x1e	/* Lowest (numerically highest) useful vid value */
#define LEAST_VID 0x3e	/* Lowest (numerically highest) useful vid value */

#define MIN_FREQ 800	/* Min and max freqs, per spec */
#define MAX_FREQ 5000

#define INVALID_FID_MASK 0xffffffc1  /* not a valid fid if these bits are set */
#define INVALID_VID_MASK 0xffffffe0  /* not a valid vid if these bits are set */
#define INVALID_VID_MASK 0xffffffc0  /* not a valid vid if these bits are set */

#define VID_OFF 0x3f

#define STOP_GRANT_5NS 1 /* min poss memory access latency for voltage change */

@@ -121,12 +125,14 @@ struct powernow_k8_data {
                                                                                                    
#define IRT_SHIFT      30
#define RVO_SHIFT      28
#define EXT_TYPE_SHIFT 27
#define PLL_L_SHIFT    20
#define MVS_SHIFT      18
#define VST_SHIFT      11
#define VID_SHIFT       6
#define IRT_MASK        3
#define RVO_MASK        3
#define EXT_TYPE_MASK   1
#define PLL_L_MASK   0x7f
#define MVS_MASK        3
#define VST_MASK     0x7f
+2 −2
Original line number Diff line number Diff line
@@ -1130,7 +1130,7 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
			  unsigned int target_freq,
			  unsigned int relation)
{
	unsigned int ret;
	int ret;

	policy = cpufreq_cpu_get(policy->cpu);
	if (!policy)
@@ -1151,7 +1151,7 @@ EXPORT_SYMBOL_GPL(cpufreq_driver_target);

static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
{
	int ret = -EINVAL;
	int ret;

	if (!try_module_get(policy->governor->owner))
		return -EINVAL;