Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 887ede66 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branch 'pm-fixes' into fixes

* pm-fixes:
  cpufreq: acpi-cpufreq: Don't set policy->related_cpus from .init()
  cpufreq: stats: do cpufreq_cpu_put() corresponding to cpufreq_cpu_get()
  intel-pstate: Use #defines instead of hard-coded values.
  cpufreq / intel_pstate: Fix calculation of current frequency
  cpufreq / intel_pstate: Add function to check that all MSRs are valid
parents 8bb96604 aa77a527
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -44,6 +44,7 @@
#define SNB_C1_AUTO_UNDEMOTE		(1UL << 27)
#define SNB_C1_AUTO_UNDEMOTE		(1UL << 27)
#define SNB_C3_AUTO_UNDEMOTE		(1UL << 28)
#define SNB_C3_AUTO_UNDEMOTE		(1UL << 28)


#define MSR_PLATFORM_INFO		0x000000ce
#define MSR_MTRRcap			0x000000fe
#define MSR_MTRRcap			0x000000fe
#define MSR_IA32_BBL_CR_CTL		0x00000119
#define MSR_IA32_BBL_CR_CTL		0x00000119
#define MSR_IA32_BBL_CR_CTL3		0x0000011e
#define MSR_IA32_BBL_CR_CTL3		0x0000011e
+0 −2
Original line number Original line Diff line number Diff line
@@ -730,7 +730,6 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
	    policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) {
	    policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) {
		cpumask_copy(policy->cpus, perf->shared_cpu_map);
		cpumask_copy(policy->cpus, perf->shared_cpu_map);
	}
	}
	cpumask_copy(policy->related_cpus, perf->shared_cpu_map);


#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
	dmi_check_system(sw_any_bug_dmi_table);
	dmi_check_system(sw_any_bug_dmi_table);
@@ -742,7 +741,6 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
	if (check_amd_hwpstate_cpu(cpu) && !acpi_pstate_strict) {
	if (check_amd_hwpstate_cpu(cpu) && !acpi_pstate_strict) {
		cpumask_clear(policy->cpus);
		cpumask_clear(policy->cpus);
		cpumask_set_cpu(cpu, policy->cpus);
		cpumask_set_cpu(cpu, policy->cpus);
		cpumask_copy(policy->related_cpus, cpu_sibling_mask(cpu));
		policy->shared_type = CPUFREQ_SHARED_TYPE_HW;
		policy->shared_type = CPUFREQ_SHARED_TYPE_HW;
		pr_info_once(PFX "overriding BIOS provided _PSD data\n");
		pr_info_once(PFX "overriding BIOS provided _PSD data\n");
	}
	}
+8 −4
Original line number Original line Diff line number Diff line
@@ -180,14 +180,18 @@ static void cpufreq_stats_free_sysfs(unsigned int cpu)
{
{
	struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
	struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);


	if (!cpufreq_frequency_get_table(cpu))
	if (!policy)
		return;
		return;


	if (policy && !policy_is_shared(policy)) {
	if (!cpufreq_frequency_get_table(cpu))
		goto put_ref;

	if (!policy_is_shared(policy)) {
		pr_debug("%s: Free sysfs stat\n", __func__);
		pr_debug("%s: Free sysfs stat\n", __func__);
		sysfs_remove_group(&policy->kobj, &stats_attr_group);
		sysfs_remove_group(&policy->kobj, &stats_attr_group);
	}
	}
	if (policy)

put_ref:
	cpufreq_cpu_put(policy);
	cpufreq_cpu_put(policy);
}
}


+30 −4
Original line number Original line Diff line number Diff line
@@ -358,14 +358,14 @@ static void intel_pstate_sysfs_expose_params(void)
static int intel_pstate_min_pstate(void)
static int intel_pstate_min_pstate(void)
{
{
	u64 value;
	u64 value;
	rdmsrl(0xCE, value);
	rdmsrl(MSR_PLATFORM_INFO, value);
	return (value >> 40) & 0xFF;
	return (value >> 40) & 0xFF;
}
}


static int intel_pstate_max_pstate(void)
static int intel_pstate_max_pstate(void)
{
{
	u64 value;
	u64 value;
	rdmsrl(0xCE, value);
	rdmsrl(MSR_PLATFORM_INFO, value);
	return (value >> 8) & 0xFF;
	return (value >> 8) & 0xFF;
}
}


@@ -373,7 +373,7 @@ static int intel_pstate_turbo_pstate(void)
{
{
	u64 value;
	u64 value;
	int nont, ret;
	int nont, ret;
	rdmsrl(0x1AD, value);
	rdmsrl(MSR_NHM_TURBO_RATIO_LIMIT, value);
	nont = intel_pstate_max_pstate();
	nont = intel_pstate_max_pstate();
	ret = ((value) & 255);
	ret = ((value) & 255);
	if (ret <= nont)
	if (ret <= nont)
@@ -454,7 +454,7 @@ static inline void intel_pstate_calc_busy(struct cpudata *cpu,
					sample->idletime_us * 100,
					sample->idletime_us * 100,
					sample->duration_us);
					sample->duration_us);
	core_pct = div64_u64(sample->aperf * 100, sample->mperf);
	core_pct = div64_u64(sample->aperf * 100, sample->mperf);
	sample->freq = cpu->pstate.turbo_pstate * core_pct * 1000;
	sample->freq = cpu->pstate.max_pstate * core_pct * 1000;


	sample->core_pct_busy = div_s64((sample->pstate_pct_busy * core_pct),
	sample->core_pct_busy = div_s64((sample->pstate_pct_busy * core_pct),
					100);
					100);
@@ -752,6 +752,29 @@ static struct cpufreq_driver intel_pstate_driver = {


static int __initdata no_load;
static int __initdata no_load;


static int intel_pstate_msrs_not_valid(void)
{
	/* Check that all the msr's we are using are valid. */
	u64 aperf, mperf, tmp;

	rdmsrl(MSR_IA32_APERF, aperf);
	rdmsrl(MSR_IA32_MPERF, mperf);

	if (!intel_pstate_min_pstate() ||
		!intel_pstate_max_pstate() ||
		!intel_pstate_turbo_pstate())
		return -ENODEV;

	rdmsrl(MSR_IA32_APERF, tmp);
	if (!(tmp - aperf))
		return -ENODEV;

	rdmsrl(MSR_IA32_MPERF, tmp);
	if (!(tmp - mperf))
		return -ENODEV;

	return 0;
}
static int __init intel_pstate_init(void)
static int __init intel_pstate_init(void)
{
{
	int cpu, rc = 0;
	int cpu, rc = 0;
@@ -764,6 +787,9 @@ static int __init intel_pstate_init(void)
	if (!id)
	if (!id)
		return -ENODEV;
		return -ENODEV;


	if (intel_pstate_msrs_not_valid())
		return -ENODEV;

	pr_info("Intel P-state driver initializing.\n");
	pr_info("Intel P-state driver initializing.\n");


	all_cpu_data = vmalloc(sizeof(void *) * num_possible_cpus());
	all_cpu_data = vmalloc(sizeof(void *) * num_possible_cpus());